diff --git a/background/steps/fetch-login-code.js b/background/steps/fetch-login-code.js index 8bf53c4..7baad00 100644 --- a/background/steps/fetch-login-code.js +++ b/background/steps/fetch-login-code.js @@ -9,6 +9,7 @@ chrome, CLOUDFLARE_TEMP_EMAIL_PROVIDER, confirmCustomVerificationStepBypass, + ensureMail2925MailboxSession, ensureStep8VerificationPageReady, getOAuthFlowRemainingMs, getOAuthFlowStepTimeoutMs, @@ -57,6 +58,20 @@ return String(value || '').trim().toLowerCase(); } + function getExpectedMail2925MailboxEmail(state = {}) { + if (Boolean(state?.mail2925UseAccountPool)) { + const currentAccountId = String(state?.currentMail2925AccountId || '').trim(); + const accounts = Array.isArray(state?.mail2925Accounts) ? state.mail2925Accounts : []; + const currentAccount = accounts.find((account) => String(account?.id || '') === currentAccountId) || null; + const accountEmail = String(currentAccount?.email || '').trim().toLowerCase(); + if (accountEmail) { + return accountEmail; + } + } + + return String(state?.mail2925BaseEmail || '').trim().toLowerCase(); + } + async function focusOrOpenMailTab(mail) { const alive = await isTabAlive(mail.source); if (alive) { @@ -134,7 +149,17 @@ await addLog(`步骤 8:正在通过 ${mail.label} 轮询验证码...`); } else { await addLog(`步骤 8:正在打开${mail.label}...`); - await focusOrOpenMailTab(mail); + if (mail.provider === '2925' && typeof ensureMail2925MailboxSession === 'function') { + await ensureMail2925MailboxSession({ + accountId: state.currentMail2925AccountId || null, + forceRelogin: false, + allowLoginWhenOnLoginPage: Boolean(state?.mail2925UseAccountPool), + expectedMailboxEmail: getExpectedMail2925MailboxEmail(state), + actionLabel: 'Step 8: ensure 2925 mailbox session', + }); + } else { + await focusOrOpenMailTab(mail); + } if (mail.provider === '2925') { await addLog(`步骤 8:将直接使用当前已登录的 ${mail.label} 轮询验证码。`, 'info'); } diff --git a/tests/background-step7-recovery.test.js b/tests/background-step7-recovery.test.js index 0462f6d..21678e0 100644 --- a/tests/background-step7-recovery.test.js +++ b/tests/background-step7-recovery.test.js @@ -92,6 +92,7 @@ test('step 8 submits login verification directly without replaying step 7', asyn test('step 8 uses a fixed 10-minute lookback window and disables resend interval for 2925 mailbox polling', async () => { let capturedOptions = null; let ensureCalls = 0; + let ensureOptions = null; const tabUpdates = []; const tabReuses = []; const realDateNow = Date.now; @@ -108,8 +109,9 @@ test('step 8 uses a fixed 10-minute lookback window and disables resend interval }, CLOUDFLARE_TEMP_EMAIL_PROVIDER: 'cloudflare-temp-email', confirmCustomVerificationStepBypass: async () => {}, - ensureMail2925MailboxSession: async () => { + ensureMail2925MailboxSession: async (options) => { ensureCalls += 1; + ensureOptions = options; }, ensureStep8VerificationPageReady: async () => ({ state: 'verification_page' }), rerunStep7ForStep8Recovery: async () => {}, @@ -122,7 +124,15 @@ test('step 8 uses a fixed 10-minute lookback window and disables resend interval url: 'https://2925.com', navigateOnReuse: false, }), - getState: async () => ({ email: 'user@example.com', password: 'secret' }), + getState: async () => ({ + email: 'user@example.com', + password: 'secret', + mail2925UseAccountPool: true, + currentMail2925AccountId: 'acc-1', + mail2925Accounts: [ + { id: 'acc-1', email: 'pool-user@2925.com' }, + ], + }), getTabId: async (sourceName) => (sourceName === 'signup-page' ? 1 : 2), HOTMAIL_PROVIDER: 'hotmail-api', isTabAlive: async () => true, @@ -148,16 +158,26 @@ test('step 8 uses a fixed 10-minute lookback window and disables resend interval password: 'secret', oauthUrl: 'https://oauth.example/latest', mail2925UseAccountPool: true, + currentMail2925AccountId: 'acc-1', + mail2925Accounts: [ + { id: 'acc-1', email: 'pool-user@2925.com' }, + ], }); } finally { Date.now = realDateNow; } - assert.equal(ensureCalls, 0); + assert.equal(ensureCalls, 1); + assert.deepStrictEqual(ensureOptions, { + accountId: 'acc-1', + forceRelogin: false, + allowLoginWhenOnLoginPage: true, + expectedMailboxEmail: 'pool-user@2925.com', + actionLabel: 'Step 8: ensure 2925 mailbox session', + }); assert.deepStrictEqual(tabReuses, []); assert.deepStrictEqual(tabUpdates, [ { tabId: 1, payload: { active: true } }, - { tabId: 2, payload: { active: true } }, ]); assert.equal(capturedOptions.filterAfterTimestamp, 300000); assert.equal(capturedOptions.resendIntervalMs, 0);