From 80cf65775ada4ce7c0f1c6c3ab93d5bb561518ad Mon Sep 17 00:00:00 2001 From: Randall Winkhart Date: Thu, 13 Nov 2025 21:14:51 -0500 Subject: [PATCH] Fix panic on error in clip.TOTPCopier() when not run as a goroutine --- clip/totp.go | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/clip/totp.go b/clip/totp.go index ae83968..9f9ec84 100644 --- a/clip/totp.go +++ b/clip/totp.go @@ -32,6 +32,13 @@ func GenTOTP(secret string, time time.Time, forSteam bool) (string, error) { // Set oneTime to -1 for a one-time (non-continuous) TOTP copy. // For oneTime mode, this function can be used normally (not as a goroutine). func TOTPCopier(secret string, oneTime int, errorChan chan<- error, done <-chan bool) error { + var writeErrorChan func(err error) + if errorChan != nil { + writeErrorChan = func(err error) { errorChan <- err } + } else { + writeErrorChan = func(err error) {} + } + var forSteam bool if strings.HasPrefix(secret, "steam@") { secret = secret[6:] @@ -42,16 +49,16 @@ func TOTPCopier(secret string, oneTime int, errorChan chan<- error, done <-chan currentTime := time.Now() token, err := GenTOTP(secret, currentTime, forSteam) if err != nil { - errorChan <- err + writeErrorChan(err) return err // return for when not used as goroutine; should exit on error regardless } err = CopyString(true, token) if err != nil { - errorChan <- err + writeErrorChan(err) return err // return for when not used as goroutine; should exit on error regardless } if oneTime != -1 { - errorChan <- nil + writeErrorChan(err) time.Sleep(time.Duration(30-(currentTime.Second()%30)) * time.Second) } else { return nil @@ -60,7 +67,7 @@ func TOTPCopier(secret string, oneTime int, errorChan chan<- error, done <-chan // exit after sleep if indicated (will not update clipboard again) select { case <-done: - errorChan <- nil + writeErrorChan(nil) return nil default: }