收口HostBridge方法白名单门禁

移动壳配置检查拒绝共享契约外HostBridge method分发

桌面壳配置检查校验Rust method白名单与共享契约一致

更新原生壳方案和共享决策记录
This commit is contained in:
2026-06-18 13:30:19 +08:00
parent 71b18002d4
commit 7bb76ffb37
4 changed files with 52 additions and 0 deletions
@@ -133,6 +133,17 @@ function extractStringConstExport(source, exportName) {
return match[1];
}
function extractMobileBridgeHandledMethods(source) {
const match = source.match(
/async function handleRequest\(request: HostBridgeRequest\)[^{]*\{[\s\S]*?switch \(request\.method\) \{([\s\S]*?)\n \}/,
);
if (!match) {
throw new Error('unable to read mobile shell HostBridge handler methods');
}
return [...match[1].matchAll(/case '([^']+)':/g)].map((entry) => entry[1]);
}
function assertNoBlockedMobileChannelDependencies(packageJson, packageLabel) {
const dependencySections = [
'dependencies',
@@ -260,6 +271,11 @@ const sharedCapabilities = extractStringArrayExport(
sharedContractSource,
'HOST_BRIDGE_CAPABILITIES',
);
const sharedMethods = extractStringArrayExport(
sharedContractSource,
'HOST_BRIDGE_METHODS',
);
const handledMobileMethods = extractMobileBridgeHandledMethods(bridgeSource);
const mobileCapabilities = extractStringArrayExport(
bridgeSource,
'MOBILE_HOST_CAPABILITIES',
@@ -271,6 +287,15 @@ const iosMobileCapabilities = extractStringArrayExport(
const mobileCapabilitySet = new Set(mobileCapabilities);
const iosMobileCapabilitySet = new Set(iosMobileCapabilities);
const sdkBackedCapabilities = ['auth.requestLogin', 'payment.request'];
const unknownHandledMobileMethods = handledMobileMethods.filter(
(method) => !sharedMethods.includes(method),
);
if (unknownHandledMobileMethods.length > 0) {
throw new Error(
`mobile shell handles unknown HostBridge methods: ${unknownHandledMobileMethods.join(', ')}`,
);
}
const unknownMobileCapabilities = mobileCapabilities.filter(
(capability) => !sharedCapabilities.includes(capability),
);