安全码显示六十秒后自动隐藏
Some checks are pending
Security Checks / security (push) Waiting to run

This commit is contained in:
smail 2026-10-06 00:50:19 +08:00
parent 435595f061
commit fe3e330577
5 changed files with 17 additions and 2 deletions

View File

@ -0,0 +1 @@
export const RECOVERY_CODE_DISPLAY_MS = 60 * 1000

View File

@ -12,6 +12,7 @@ import {
import { useGlobalStatusStore } from '@/stores/useGlobalStatusStore'
import { normalizeCreationOptions, serializeCredential, webAuthnSupported } from '@/utils/webauthn'
import { downloadRecoveryCodes } from '@/utils/recoveryCodeDownload'
import { RECOVERY_CODE_DISPLAY_MS } from '@/utils/recoveryCodeDisplay'
export function usePage() {
const globalStatus = useGlobalStatusStore()
@ -270,7 +271,7 @@ export function usePage() {
const scheduleRecoveryCodeHide = () => {
clearTimeout(recoveryCodeHideTimer)
recoveryCodeHideTimer = setTimeout(clearRecoveryCodes, 60000)
recoveryCodeHideTimer = setTimeout(clearRecoveryCodes, RECOVERY_CODE_DISPLAY_MS)
}
const revealRecoveryCodes = async () => {

View File

@ -7,6 +7,7 @@ import {
isRecentAuthenticationCancelled,
requestWithRecentAuthentication,
} from '@/utils/recentAuthentication'
import { RECOVERY_CODE_DISPLAY_MS } from '@/utils/recoveryCodeDisplay'
export const recoveryCodeDialogProps = {
modelValue: {
@ -52,7 +53,7 @@ export function useRecoveryCodeDialog(props, emit) {
const scheduleHide = () => {
clearTimeout(hideTimer)
hideTimer = setTimeout(clearCodes, 60000)
hideTimer = setTimeout(clearCodes, RECOVERY_CODE_DISPLAY_MS)
}
const isCurrentView = (version, userID) => (

View File

@ -1,6 +1,17 @@
import assert from 'node:assert/strict'
import test from 'node:test'
import { readFileSync } from 'node:fs'
import { downloadRecoveryCodes } from '../../frontend/src/utils/recoveryCodeDownload.js'
import { RECOVERY_CODE_DISPLAY_MS } from '../../frontend/src/utils/recoveryCodeDisplay.js'
const securitySettingsSource = readFileSync(new URL('../../frontend/src/views/components/SecuritySettings/SecuritySettings.js', import.meta.url), 'utf8')
const securitySettingsTemplate = readFileSync(new URL('../../frontend/src/views/components/SecuritySettings/SecuritySettings.vue', import.meta.url), 'utf8')
test('security codes use a shared 60-second display timeout', () => {
assert.equal(RECOVERY_CODE_DISPLAY_MS, 60000)
assert.match(securitySettingsSource, /setTimeout\(clearRecoveryCodes, RECOVERY_CODE_DISPLAY_MS\)/)
assert.match(securitySettingsTemplate, /one-time-tip/)
})
function createDocumentFixture() {
const anchors = []

View File

@ -70,6 +70,7 @@ test('用户安全信息使用独立弹窗并调用固定管理接口', () => {
const recoverySource = read('RecoveryCodeDialog/RecoveryCodeDialog.js')
assert.match(recoverySource, /\/api\/v1\/user\/security\/recovery-codes\/generate/)
assert.match(recoverySource, /shown_once|codes/)
assert.match(recoverySource, /setTimeout\(clearCodes, RECOVERY_CODE_DISPLAY_MS\)/)
const externalSource = read('UserExternalEmailDialog/UserExternalEmailDialog.js')
assert.match(externalSource, /\/api\/v1\/user\/security\/external-email\/change/)
assert.match(externalSource, /\/api\/v1\/user\/security\/external-email\/verify/)