From e224576303ff00a479ee3154160906452a93392a Mon Sep 17 00:00:00 2001 From: Haitao Pan Date: Wed, 5 Nov 2025 22:25:15 +0800 Subject: [PATCH] remove: remove internal/auth/mfa_service.go MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit • Deleted unused mfa_service.go file • Fixed import in api/api.go for auth package • Build verified and working 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- account/api/api.go | 1 + account/internal/auth/mfa_service.go | 80 ---------------------------- 2 files changed, 1 insertion(+), 80 deletions(-) delete mode 100644 account/internal/auth/mfa_service.go diff --git a/account/api/api.go b/account/api/api.go index f2c71bf..745e723 100644 --- a/account/api/api.go +++ b/account/api/api.go @@ -21,6 +21,7 @@ import ( "github.com/pquerna/otp/totp" "golang.org/x/crypto/bcrypt" + "xcontrol/account/internal/auth" "xcontrol/account/internal/service" "xcontrol/account/internal/store" ) diff --git a/account/internal/auth/mfa_service.go b/account/internal/auth/mfa_service.go deleted file mode 100644 index 99e028d..0000000 --- a/account/internal/auth/mfa_service.go +++ /dev/null @@ -1,80 +0,0 @@ -package auth - -import ( - "crypto/rand" - "encoding/base32" - "fmt" - "time" - - "github.com/pquerna/otp" - "github.com/pquerna/otp/totp" -) - -// MFAService handles Multi-Factor Authentication -type MFAService struct { - issuer string -} - -// NewMFAService creates a new MFA service instance -func NewMFAService(issuer string) *MFAService { - return &MFAService{ - issuer: issuer, - } -} - -// GenerateSecret generates a new TOTP secret -func (s *MFAService) GenerateSecret() (string, error) { - secret := make([]byte, 20) - if _, err := rand.Read(secret); err != nil { - return "", fmt.Errorf("failed to generate secret: %w", err) - } - return base32.StdEncoding.EncodeToString(secret), nil -} - -// GenerateQRCode generates a QR code for TOTP setup -func (s *MFAService) GenerateQRCode(accountName, secret string) (string, error) { - key, err := otp.NewKey(totp.KeyURI(accountName, s.issuer, secret, otp.AlgorithmSHA1, 6, 30)) - if err != nil { - return "", fmt.Errorf("failed to generate TOTP key URI: %w", err) - } - return key.QRCode(), nil -} - -// ValidateTOTP validates a TOTP code against a secret -func (s *MFAService) ValidateTOTP(secret, code string) (bool, error) { - valid, err := totp.ValidateCustom(code, secret, time.Now(), totp.ValidateOpts{ - Period: 30, - Skew: 1, - Digits: otp.DigitsSix, - Algorithm: otp.AlgorithmSHA1, - }) - if err != nil { - return false, fmt.Errorf("failed to validate TOTP: %w", err) - } - return valid, nil -} - -// GenerateBackupCodes generates backup codes for MFA -func (s *MFAService) GenerateBackupCodes(count int) ([]string, error) { - codes := make([]string, count) - for i := 0; i < count; i++ { - code := make([]byte, 4) - if _, err := rand.Read(code); err != nil { - return nil, fmt.Errorf("failed to generate backup code: %w", err) - } - codes[i] = fmt.Sprintf("%08X", code) - } - return codes, nil -} - -// ValidateBackupCode validates a backup code -func (s *MFAService) ValidateBackupCode(providedCode string, storedCodes []string) (bool, error) { - for i, storedCode := range storedCodes { - if providedCode == storedCode { - // Remove used backup code - storedCodes = append(storedCodes[:i], storedCodes[i+1:]...) - return true, nil - } - } - return false, nil -}