diff --git a/goatherd.go b/goatherd.go index a098c38272e2ae76538e6e49c9da989a1101b6dc..88da4ae71d44cd7906a2f48132c59f2332d8ce39 100644 --- a/goatherd.go +++ b/goatherd.go @@ -318,7 +318,7 @@ func checkHOTP(hotp *twofactor.HOTP, remote string, name string, offer string) ( debugf("[%v] autoresync in progress: %v", remote, s) if uint64(time.Now().Unix()-s.Time) <= cfg.AutoresyncTime { if s.Num >= cfg.AutoresyncRepeat && s.Counter-hotp.Counter() < cfg.AutoresyncLookahead { - // if the user had a sufficient number of successful tries that were not within + // if the user had a sufficient number of consecutive tries that were not within // standard lookahead range but within cfg.AutoresyncLookahead within cfg.AutoresyncTime seconds, // temporarily increase lookahead to authenticate and resync. debugf("[%v] autoresync conditions: increasing lookahead to ", cfg.AutoresyncLookahead) @@ -374,49 +374,50 @@ func checkHOTP(hotp *twofactor.HOTP, remote string, name string, offer string) ( // transaction, retrying if it fails. func checkOffer(remote string, name string, offer string) (bool, error) { for { - debugf("[%v] begin transaction", remote) - tx, err := db.Begin() - errPanic(err) + inner := func(tx *sql.Tx) (bool, error) { + debugf("[%v] looking up data for %v", remote, name) + hotp, err := getOTP(tx, name) + if err != nil { + return false, err + } - ok := false + ok, err := checkHOTP(hotp, remote, name, offer) + if err != nil { + return false, err + } - debugf("[%v] looking up data for %v", remote, name) - hotp, err := getOTP(tx, name) - if transactionFailed(err) { - goto retry - } else if err == sql.ErrNoRows { - _ = tx.Rollback() - return false, err - } - errPanic(err) + if ok { + debugf("[%v] ok, set new count", remote) + err := setCount(tx, name, hotp.Counter()) + if err != nil { + return false, err + } + } - ok, err = checkHOTP(hotp, remote, name, offer) - if transactionFailed(err) { - goto retry + debugf("[%v] commiting", remote) + err = tx.Commit() + if err != nil { + return false, err + } + return ok, nil } + + debugf("[%v] begin transaction", remote) + tx, err := db.Begin() errPanic(err) - if ok { - debugf("[%v] ok, set new count", remote) - err := setCount(tx, name, hotp.Counter()) - if transactionFailed(err) { - goto retry + ok, err := inner(tx) + if err != nil { + debugf("[%v] retry %v", remote, err) + _ = tx.Rollback() + if err == sql.ErrNoRows { + return false, nil + } else if transactionFailed(err) { + continue } errPanic(err) } - - debugf("[%v] commiting", remote) - err = tx.Commit() - if transactionFailed(err) { - goto retry - } - errPanic(err) - return ok, nil - - retry: - debugf("[%v] retry", remote) - _ = tx.Rollback() } }