From 25d3796bae76f88583a7d2b1f816aa96c921f22c Mon Sep 17 00:00:00 2001 From: smail Date: Wed, 30 Sep 2026 05:08:44 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=87=AD=E6=8D=AE=E6=81=A2?= =?UTF-8?q?=E5=A4=8D=E5=8F=96=E6=B6=88=E7=AD=89=E5=BE=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 让凭据根目录读取遵循调用上下文,避免恢复码生成在凭据锁竞争时绕过取消信号并长时间阻塞。 --- backend/services/credentials/service.go | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/backend/services/credentials/service.go b/backend/services/credentials/service.go index 05b336a..582922c 100644 --- a/backend/services/credentials/service.go +++ b/backend/services/credentials/service.go @@ -54,12 +54,19 @@ func (s *Service) SetVaultRoot(root string) { } func (s *Service) VaultRoot() string { + root, _ := s.VaultRootContext(context.Background()) + return root +} + +func (s *Service) VaultRootContext(ctx context.Context) (string, error) { if s == nil { - return "" + return "", ErrUnavailable + } + if err := s.mu.LockContext(ctx); err != nil { + return "", err } - s.mu.Lock() defer s.mu.Unlock() - return s.vaultRoot + return s.vaultRoot, nil } func NewService(engine *xorm.Engine) (*Service, error) { @@ -180,7 +187,10 @@ func (s *Service) generateRecoveryCodes(ctx context.Context, userID int, count i }() codes = make([]string, 0, count) items := make([]models.RecoveryCode, 0, count) - vaultRoot := s.VaultRoot() + vaultRoot, err := s.VaultRootContext(ctx) + if err != nil { + return nil, err + } for i := 0; i < count; i++ { if err := ctx.Err(); err != nil { return nil, err