fix(protocols): 修复第三方协议授权码密码验证后解密展示并优化交互提示
Some checks are pending
Security Checks / security (push) Waiting to run

This commit is contained in:
smail 2026-09-13 04:24:19 +08:00
parent f285b5c904
commit fcb64a34bd
4 changed files with 31 additions and 5 deletions

View File

@ -164,12 +164,18 @@ func LoadSecurityContext(ctx *context.Context) {
func credentialRuntime() *credentials.Service {
if service := currentSecurityRuntime().credentials; service != nil {
if service.VaultRoot() == "" && config.ROOT_PATH != "" {
service.SetVaultRoot(config.ROOT_PATH)
}
return service
}
if db.Instance == nil {
return nil
}
service, _ := credentials.NewService(db.Instance)
if service != nil && config.ROOT_PATH != "" {
service.SetVaultRoot(config.ROOT_PATH)
}
return service
}

View File

@ -32,6 +32,7 @@ type ProtocolCredentialStatus struct {
Protocol string `json:"protocol"`
Enabled bool `json:"enabled"`
Configured bool `json:"configured"`
CanReveal bool `json:"can_reveal"`
CreatedAt *time.Time `json:"created_at,omitempty"`
UpdatedAt *time.Time `json:"updated_at,omitempty"`
LastUsedAt *time.Time `json:"last_used_at,omitempty"`
@ -75,6 +76,7 @@ func (s *Service) ListProtocolCredentials(userID int) ([]ProtocolCredentialStatu
updatedAt := item.UpdatedAt
status.Enabled = item.Enabled
status.Configured = item.CodeHash != "" && item.RevokedAt == nil
status.CanReveal = item.CodeCiphertext != "" && item.RevokedAt == nil
status.CreatedAt = &createdAt
status.UpdatedAt = &updatedAt
status.LastUsedAt = item.LastUsedAt
@ -255,11 +257,12 @@ func (s *Service) RevealProtocolCodes(userID int) (map[string]string, error) {
if userID <= 0 {
return nil, ErrInvalidUser
}
if s.vaultRoot == "" {
return make(map[string]string), nil
}
s.mu.Lock()
defer s.mu.Unlock()
vaultRoot := s.vaultRoot
if vaultRoot == "" {
return make(map[string]string), nil
}
var items []models.ProtocolCredential
if err := s.engine.Where("user_id = ? AND enabled = ? AND revoked_at IS NULL", userID, true).Find(&items); err != nil {
return nil, fmt.Errorf("load protocol credentials for reveal: %w", err)
@ -269,7 +272,7 @@ func (s *Service) RevealProtocolCodes(userID int) (map[string]string, error) {
if item.CodeCiphertext == "" || item.CodeHash == "" {
continue
}
plain, err := credential.Decrypt(s.vaultRoot, item.CodeCiphertext)
plain, err := credential.Decrypt(vaultRoot, item.CodeCiphertext)
if err != nil {
continue
}

View File

@ -221,7 +221,12 @@ export function usePage() {
Object.assign(revealedCodes, codes)
codesRevealed.value = true
closeVerifyDialog()
notify('安全验证通过,授权码已解密显示', 'success')
const count = Object.keys(codes).length
if (count > 0) {
notify(`安全验证通过,已解密显示 ${count} 个协议授权码`, 'success')
} else {
notify('安全验证通过,当前授权码未保留加密密文,可点击重新生成', 'warning')
}
} catch (error) {
notify(error?.message || '验证失败,请检查密码是否正确')
} finally {

View File

@ -70,6 +70,18 @@
复制
</el-button>
</template>
<template v-else-if="codesRevealed && !revealedCodes[item.protocol]">
<span class="unconfigured-tip">旧版授权码未保留密文,请点击重新生成</span>
<el-button
type="primary"
link
size="small"
class="copy-btn"
@click="generateProtocolCode(item)"
>
重新生成
</el-button>
</template>
<template v-else>
<span class="masked-code">••••••••••••••••</span>
<el-button