- Introduced a new function to collect invalid status code entries from the status code mapping. - Updated the EditChannelModal to display an error message if invalid status codes are detected. - Enhanced localization files to include new error messages for invalid status codes in multiple languages. - Removed unused styles from the RiskAcknowledgementModal for cleaner UI.
133 lines
3.5 KiB
JavaScript
133 lines
3.5 KiB
JavaScript
const NON_REDIRECTABLE_STATUS_CODES = new Set([504, 524]);
|
|
|
|
export const STATUS_CODE_RISK_I18N_KEYS = {
|
|
title: '高危操作确认',
|
|
detailTitle: '检测到以下高危状态码重定向规则',
|
|
inputPrompt: '操作确认',
|
|
confirmButton: '我确认开启高危重试',
|
|
markdown: '高危状态码重试风险告知与免责声明Markdown',
|
|
confirmText: '高危状态码重试风险确认输入文本',
|
|
inputPlaceholder: '高危状态码重试风险输入框占位文案',
|
|
mismatchText: '高危状态码重试风险输入不匹配提示',
|
|
};
|
|
|
|
export const STATUS_CODE_RISK_CHECKLIST_KEYS = [
|
|
'高危状态码重试风险确认项1',
|
|
'高危状态码重试风险确认项2',
|
|
'高危状态码重试风险确认项3',
|
|
'高危状态码重试风险确认项4',
|
|
];
|
|
|
|
function parseStatusCodeKey(rawKey) {
|
|
if (typeof rawKey !== 'string') {
|
|
return null;
|
|
}
|
|
const normalized = rawKey.trim();
|
|
if (!/^[1-5]\d{2}$/.test(normalized)) {
|
|
return null;
|
|
}
|
|
return Number.parseInt(normalized, 10);
|
|
}
|
|
|
|
function parseStatusCodeMappingTarget(rawValue) {
|
|
if (typeof rawValue === 'number' && Number.isInteger(rawValue)) {
|
|
return rawValue >= 100 && rawValue <= 599 ? rawValue : null;
|
|
}
|
|
if (typeof rawValue === 'string') {
|
|
const normalized = rawValue.trim();
|
|
if (!/^[1-5]\d{2}$/.test(normalized)) {
|
|
return null;
|
|
}
|
|
const code = Number.parseInt(normalized, 10);
|
|
return code >= 100 && code <= 599 ? code : null;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
export function collectInvalidStatusCodeEntries(statusCodeMappingStr) {
|
|
if (
|
|
typeof statusCodeMappingStr !== 'string' ||
|
|
statusCodeMappingStr.trim() === ''
|
|
) {
|
|
return [];
|
|
}
|
|
|
|
let parsed;
|
|
try {
|
|
parsed = JSON.parse(statusCodeMappingStr);
|
|
} catch {
|
|
return [];
|
|
}
|
|
|
|
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
return [];
|
|
}
|
|
|
|
const invalid = [];
|
|
for (const [rawKey, rawValue] of Object.entries(parsed)) {
|
|
const fromCode = parseStatusCodeKey(rawKey);
|
|
const toCode = parseStatusCodeMappingTarget(rawValue);
|
|
if (fromCode === null || toCode === null) {
|
|
invalid.push(`${rawKey} → ${rawValue}`);
|
|
}
|
|
}
|
|
|
|
return invalid;
|
|
}
|
|
|
|
export function collectDisallowedStatusCodeRedirects(statusCodeMappingStr) {
|
|
if (
|
|
typeof statusCodeMappingStr !== 'string' ||
|
|
statusCodeMappingStr.trim() === ''
|
|
) {
|
|
return [];
|
|
}
|
|
|
|
let parsed;
|
|
try {
|
|
parsed = JSON.parse(statusCodeMappingStr);
|
|
} catch (error) {
|
|
return [];
|
|
}
|
|
|
|
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
return [];
|
|
}
|
|
|
|
const riskyMappings = [];
|
|
Object.entries(parsed).forEach(([rawFrom, rawTo]) => {
|
|
const fromCode = parseStatusCodeKey(rawFrom);
|
|
const toCode = parseStatusCodeMappingTarget(rawTo);
|
|
if (fromCode === null || toCode === null) {
|
|
return;
|
|
}
|
|
if (!NON_REDIRECTABLE_STATUS_CODES.has(fromCode)) {
|
|
return;
|
|
}
|
|
if (fromCode === toCode) {
|
|
return;
|
|
}
|
|
riskyMappings.push(`${fromCode} -> ${toCode}`);
|
|
});
|
|
|
|
return Array.from(new Set(riskyMappings)).sort();
|
|
}
|
|
|
|
export function collectNewDisallowedStatusCodeRedirects(
|
|
originalStatusCodeMappingStr,
|
|
currentStatusCodeMappingStr,
|
|
) {
|
|
const currentRisky = collectDisallowedStatusCodeRedirects(
|
|
currentStatusCodeMappingStr,
|
|
);
|
|
if (currentRisky.length === 0) {
|
|
return [];
|
|
}
|
|
|
|
const originalRiskySet = new Set(
|
|
collectDisallowedStatusCodeRedirects(originalStatusCodeMappingStr),
|
|
);
|
|
|
|
return currentRisky.filter((mapping) => !originalRiskySet.has(mapping));
|
|
}
|