| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234 |
- const test = require('node:test');
- const assert = require('node:assert/strict');
- const fs = require('node:fs');
- const source = fs.readFileSync('background/verification-flow.js', 'utf8');
- const globalScope = {};
- const api = new Function('self', `${source}; return self.MultiPageBackgroundVerificationFlow;`)(globalScope);
- test('verification flow extends 2925 polling window', () => {
- const helpers = api.createVerificationFlowHelpers({
- addLog: async () => {},
- chrome: { tabs: { update: async () => {} } },
- CLOUDFLARE_TEMP_EMAIL_PROVIDER: 'cloudflare-temp-email',
- completeStepFromBackground: async () => {},
- confirmCustomVerificationStepBypassRequest: async () => ({ confirmed: true }),
- getHotmailVerificationPollConfig: () => ({}),
- getHotmailVerificationRequestTimestamp: () => 0,
- getState: async () => ({}),
- getTabId: async () => 1,
- HOTMAIL_PROVIDER: 'hotmail-api',
- isStopError: () => false,
- LUCKMAIL_PROVIDER: 'luckmail-api',
- MAIL_2925_VERIFICATION_INTERVAL_MS: 15000,
- MAIL_2925_VERIFICATION_MAX_ATTEMPTS: 15,
- pollCloudflareTempEmailVerificationCode: async () => ({}),
- pollHotmailVerificationCode: async () => ({}),
- pollLuckmailVerificationCode: async () => ({}),
- sendToContentScript: async () => ({}),
- sendToMailContentScriptResilient: async () => ({}),
- setState: async () => {},
- setStepStatus: async () => {},
- sleepWithStop: async () => {},
- throwIfStopped: () => {},
- VERIFICATION_POLL_MAX_ROUNDS: 5,
- });
- const step4Payload = helpers.getVerificationPollPayload(4, { email: 'user@example.com', mailProvider: '2925' });
- const step7Payload = helpers.getVerificationPollPayload(7, { email: 'user@example.com', mailProvider: '2925' });
- assert.equal(step4Payload.maxAttempts, 15);
- assert.equal(step4Payload.intervalMs, 15000);
- assert.equal(step7Payload.maxAttempts, 15);
- assert.equal(step7Payload.intervalMs, 15000);
- });
- test('verification flow runs beforeSubmit hook before filling the code', async () => {
- const events = [];
- const helpers = api.createVerificationFlowHelpers({
- addLog: async () => {},
- chrome: {
- tabs: {
- update: async () => {},
- },
- },
- CLOUDFLARE_TEMP_EMAIL_PROVIDER: 'cloudflare-temp-email',
- completeStepFromBackground: async (_step, payload) => {
- events.push(['complete', payload.code]);
- },
- confirmCustomVerificationStepBypassRequest: async () => ({ confirmed: true }),
- getHotmailVerificationPollConfig: () => ({}),
- getHotmailVerificationRequestTimestamp: () => 0,
- getState: async () => ({}),
- getTabId: async () => 1,
- HOTMAIL_PROVIDER: 'hotmail-api',
- isStopError: () => false,
- LUCKMAIL_PROVIDER: 'luckmail-api',
- MAIL_2925_VERIFICATION_INTERVAL_MS: 15000,
- MAIL_2925_VERIFICATION_MAX_ATTEMPTS: 15,
- pollCloudflareTempEmailVerificationCode: async () => ({}),
- pollHotmailVerificationCode: async () => ({}),
- pollLuckmailVerificationCode: async () => ({}),
- sendToContentScript: async (_source, message) => {
- if (message.type === 'FILL_CODE') {
- events.push(['submit', message.payload.code]);
- return {};
- }
- return {};
- },
- sendToMailContentScriptResilient: async () => ({
- code: '654321',
- emailTimestamp: 123,
- }),
- setState: async (payload) => {
- events.push(['state', payload.lastLoginCode || payload.lastSignupCode]);
- },
- setStepStatus: async () => {},
- sleepWithStop: async () => {},
- throwIfStopped: () => {},
- VERIFICATION_POLL_MAX_ROUNDS: 5,
- });
- await helpers.resolveVerificationStep(
- 7,
- { email: 'user@example.com', lastLoginCode: null },
- { provider: 'qq', label: 'QQ 邮箱' },
- {
- beforeSubmit: async (result) => {
- events.push(['beforeSubmit', result.code]);
- },
- }
- );
- assert.deepStrictEqual(events, [
- ['beforeSubmit', '654321'],
- ['submit', '654321'],
- ['state', '654321'],
- ['complete', '654321'],
- ]);
- });
- test('verification flow keeps Hotmail request timestamp filtering on the first poll', async () => {
- const pollPayloads = [];
- const helpers = api.createVerificationFlowHelpers({
- addLog: async () => {},
- chrome: { tabs: { update: async () => {} } },
- CLOUDFLARE_TEMP_EMAIL_PROVIDER: 'cloudflare-temp-email',
- completeStepFromBackground: async () => {},
- confirmCustomVerificationStepBypassRequest: async () => ({ confirmed: true }),
- getHotmailVerificationPollConfig: () => ({}),
- getHotmailVerificationRequestTimestamp: () => 87654,
- getState: async () => ({}),
- getTabId: async () => 1,
- HOTMAIL_PROVIDER: 'hotmail-api',
- isStopError: () => false,
- LUCKMAIL_PROVIDER: 'luckmail-api',
- MAIL_2925_VERIFICATION_INTERVAL_MS: 15000,
- MAIL_2925_VERIFICATION_MAX_ATTEMPTS: 15,
- pollCloudflareTempEmailVerificationCode: async () => ({}),
- pollHotmailVerificationCode: async (_step, _state, payload) => {
- pollPayloads.push(payload);
- return { code: '654321', emailTimestamp: 123 };
- },
- pollLuckmailVerificationCode: async () => ({}),
- sendToContentScript: async (_source, message) => {
- if (message.type === 'FILL_CODE') {
- return {};
- }
- return {};
- },
- sendToMailContentScriptResilient: async () => ({}),
- setState: async () => {},
- setStepStatus: async () => {},
- sleepWithStop: async () => {},
- throwIfStopped: () => {},
- VERIFICATION_POLL_MAX_ROUNDS: 5,
- });
- await helpers.resolveVerificationStep(
- 7,
- {
- email: 'user@example.com',
- loginVerificationRequestedAt: 100000,
- lastLoginCode: null,
- },
- { provider: 'hotmail-api', label: 'Hotmail' },
- {}
- );
- assert.equal(pollPayloads.length, 1);
- assert.equal(pollPayloads[0].filterAfterTimestamp, 87654);
- });
- test('verification flow refreshes Hotmail signup filter timestamp after step 4 resend', async () => {
- const pollPayloads = [];
- const realDateNow = Date.now;
- Date.now = () => 200000;
- let submitCount = 0;
- const helpers = api.createVerificationFlowHelpers({
- addLog: async () => {},
- chrome: { tabs: { update: async () => {} } },
- CLOUDFLARE_TEMP_EMAIL_PROVIDER: 'cloudflare-temp-email',
- completeStepFromBackground: async () => {},
- confirmCustomVerificationStepBypassRequest: async () => ({ confirmed: true }),
- getHotmailVerificationPollConfig: () => ({}),
- getHotmailVerificationRequestTimestamp: (_step, state) => Math.max(0, Number(state.signupVerificationRequestedAt || 0) - 15000),
- getState: async () => ({}),
- getTabId: async () => 1,
- HOTMAIL_PROVIDER: 'hotmail-api',
- isStopError: () => false,
- LUCKMAIL_PROVIDER: 'luckmail-api',
- MAIL_2925_VERIFICATION_INTERVAL_MS: 15000,
- MAIL_2925_VERIFICATION_MAX_ATTEMPTS: 15,
- pollCloudflareTempEmailVerificationCode: async () => ({}),
- pollHotmailVerificationCode: async (_step, _state, payload) => {
- pollPayloads.push(payload);
- return {
- code: pollPayloads.length === 1 ? '111111' : '222222',
- emailTimestamp: pollPayloads.length,
- };
- },
- pollLuckmailVerificationCode: async () => ({}),
- sendToContentScript: async (_source, message) => {
- if (message.type === 'FILL_CODE') {
- submitCount += 1;
- return submitCount === 1
- ? { invalidCode: true, errorText: '旧验证码' }
- : {};
- }
- if (message.type === 'RESEND_VERIFICATION_CODE') {
- return {};
- }
- return {};
- },
- sendToMailContentScriptResilient: async () => ({}),
- setState: async () => {},
- setStepStatus: async () => {},
- sleepWithStop: async () => {},
- throwIfStopped: () => {},
- VERIFICATION_POLL_MAX_ROUNDS: 5,
- });
- try {
- await helpers.resolveVerificationStep(
- 4,
- {
- email: 'user@example.com',
- signupVerificationRequestedAt: 100000,
- lastSignupCode: null,
- },
- { provider: 'hotmail-api', label: 'Hotmail' },
- {}
- );
- } finally {
- Date.now = realDateNow;
- }
- assert.equal(pollPayloads.length, 2);
- assert.equal(pollPayloads[0].filterAfterTimestamp, 85000);
- assert.equal(pollPayloads[1].filterAfterTimestamp, 185000);
- });
|