fix: count initial HeroSMS free reuse success

- 合并 PR #209 的核心改动:HeroSMS 白嫖复用号码首次成功后立即计入 successfulUses/maxUses,并补充对应回归断言。
- 本地补充修复:无,本地审查未发现需要额外修补的冲突或逻辑问题。
- 影响范围:background/phone-verification-flow.js、tests/phone-verification-flow.test.js
This commit is contained in:
QLHazyCoder
2026-05-07 02:39:54 +08:00
committed by GitHub
2 changed files with 51 additions and 0 deletions
+49
View File
@@ -4759,6 +4759,54 @@
);
}
async function markFreeReusableActivationAfterInitialSuccess(state, activation) {
const normalizedActivation = normalizeActivation(activation);
if (
!normalizedActivation
|| normalizedActivation.provider !== PHONE_SMS_PROVIDER_HERO
|| isFreeAutoReuseActivation(normalizedActivation)
) {
return;
}
const latestState = {
...(state || {}),
...(typeof getState === 'function' ? await getState() : {}),
};
const savedActivation = normalizeFreeReusablePhoneActivation(
latestState[FREE_REUSABLE_PHONE_ACTIVATION_STATE_KEY]
);
if (
!savedActivation
|| !(
isSameActivation(savedActivation, normalizedActivation)
|| phoneNumbersMatch(savedActivation.phoneNumber, normalizedActivation.phoneNumber)
)
) {
return;
}
const maxUses = Math.max(1, Math.floor(Number(savedActivation.maxUses) || DEFAULT_PHONE_NUMBER_MAX_USES));
const successfulUses = Math.min(maxUses, Math.max(1, normalizeUseCount(savedActivation.successfulUses)));
if (successfulUses >= maxUses) {
await clearFreeReusableActivation();
await addLog(
`步骤 9:白嫖复用手机号 ${savedActivation.phoneNumber} 已达到 ${successfulUses}/${maxUses} 次,已清除本地记录。`,
'info'
);
return;
}
if (successfulUses !== savedActivation.successfulUses || savedActivation.maxUses !== maxUses) {
await persistFreeReusableActivation({
...savedActivation,
source: 'free-manual-reuse',
successfulUses,
maxUses,
});
}
}
async function waitForPhoneCodeOrRotateNumber(tabId, state, activation) {
const normalizedActivation = normalizeActivation(activation);
if (!normalizedActivation) {
@@ -6050,6 +6098,7 @@
`步骤 9:已跳过 HeroSMS 完成状态,保留 ${activation.phoneNumber} 供白嫖复用。`,
'info'
);
await markFreeReusableActivationAfterInitialSuccess(latestSuccessState, activation);
} else {
await completePhoneActivation(latestSuccessState, activation);
}
+2
View File
@@ -4227,6 +4227,8 @@ test('phone verification helper preserves newly saved free-reuse activation afte
assert.equal(currentState.freeReusablePhoneActivation.activationId, 'new-free-success');
assert.equal(currentState.freeReusablePhoneActivation.phoneNumber, '66950007777');
assert.equal(currentState.freeReusablePhoneActivation.source, 'free-manual-reuse');
assert.equal(currentState.freeReusablePhoneActivation.successfulUses, 1);
assert.equal(currentState.freeReusablePhoneActivation.maxUses, 3);
assert.equal(
requests.some((requestUrl) => (
requestUrl.searchParams.get('action') === 'setStatus'