Files
memind/scripts/verify-portal-access-policy.mjs
T
john fde6503bdf
Memind CI / Test, build, and release guards (push) Has been cancelled
feat(mindspace): add SEO/GEO delivery, page template catalog, and admin hooks
Enable optional SEO/GEO injection and discovery routes for confirmed public pages while keeping private pages noindex. Add premium page template skills, portal catalog API, template shop UI, and Baidu push gated by memind_adm config.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-10 08:06:12 +08:00

98 lines
3.8 KiB
JavaScript

import { isLegacyPageDataApiPath } from '../page-data-routes.mjs';
import { isPageDataPublicPath } from '../page-data-public-service.mjs';
import {
assessPortalAccessMigrationReadiness,
PORTAL_STATIC_ACCESS_RULES,
resolvePortalAccessEnforcementConfig,
} from '../server/portal-access-policy.mjs';
const routeSamples = [
{ path: '/status', method: 'GET' },
{ path: '/runtime/status', method: 'GET' },
{ path: '/config/blocked-words', method: 'GET' },
{ path: '/robots.txt', method: 'GET' },
{ path: '/sitemap.xml', method: 'GET' },
{ path: '/llms.txt', method: 'GET' },
{ path: '/internal/agent/jobs/job-1/claim', method: 'POST' },
{ path: '/internal/deep-search/llm', method: 'POST' },
{ path: '/agent/mindspace_page_patch', method: 'POST' },
{ path: '/internal/image-make/runtime-config', method: 'GET' },
{ path: '/mindspace/v1/assets/asset-1/download', method: 'GET' },
{ path: '/plaza/v1/feed', method: 'GET' },
{ path: '/plaza/v1/categories', method: 'GET' },
{ path: '/plaza/v1/seo/sitemap', method: 'GET' },
{ path: '/plaza/v1/posts/post-1', method: 'GET' },
{ path: '/plaza/v1/posts/post-1/comments', method: 'GET' },
{ path: '/plaza/v1/users/alice', method: 'GET' },
{ path: '/plaza/v1/users/alice/posts', method: 'GET' },
{ path: '/plaza/v1/events', method: 'POST' },
{ path: '/plaza/v1/posts/post-1/reports', method: 'POST' },
{ path: '/public/pages/page-1/data/signups', method: 'GET' },
{ path: '/public/pages/page-1/data/signups/rows', method: 'POST' },
{ path: '/page-data/signups', method: 'GET' },
{ path: '/mindspace/v1/pages', method: 'GET' },
];
const predicates = {
isPageDataPublicPath,
isLegacyPageDataApiPath,
};
const knownMismatchPolicyGroups = [
'plaza-optional-user',
'page-data-public',
'legacy-page-data',
];
const staticRuleIds = PORTAL_STATIC_ACCESS_RULES.map((rule) => rule.id);
if (new Set(staticRuleIds).size !== staticRuleIds.length) {
throw new Error('Portal access policy contains duplicate static rule ids');
}
if (resolvePortalAccessEnforcementConfig({}).enabled) {
throw new Error('Portal access enforcement must default to disabled');
}
try {
resolvePortalAccessEnforcementConfig({
MEMIND_PORTAL_ACCESS_POLICY_ENFORCEMENT_ENABLED: '1',
MEMIND_PORTAL_ACCESS_POLICY_ENFORCE_GROUPS: 'all',
});
throw new Error('Portal access enforcement unexpectedly accepted all');
} catch (error) {
if (!String(error?.message ?? error).includes('Unknown Portal access enforcement group')) {
throw error;
}
}
const noMultiUserReport = assessPortalAccessMigrationReadiness(routeSamples, {
...predicates,
multiUserEnabled: false,
knownMismatchPolicyGroups,
});
const multiUserReport = assessPortalAccessMigrationReadiness(routeSamples, {
...predicates,
multiUserEnabled: true,
});
if (!noMultiUserReport.contractReady) {
throw new Error(
`Portal access policy has ${noMultiUserReport.unexpectedMismatches.length} unexpected no-auth/legacy mismatch(es)`,
);
}
if (!multiUserReport.safeForBehaviorSwitch) {
throw new Error(
`Portal access policy has ${multiUserReport.knownMismatches.length + multiUserReport.unexpectedMismatches.length} multi-user mismatch(es)`,
);
}
console.log(
[
'portal access policy compatibility ok',
`samples=${routeSamples.length}`,
`static_rules=${staticRuleIds.length}`,
`known_no_auth_mismatches=${noMultiUserReport.knownMismatches.length}`,
`unexpected_no_auth_mismatches=${noMultiUserReport.unexpectedMismatches.length}`,
`multi_user_mismatches=${multiUserReport.knownMismatches.length + multiUserReport.unexpectedMismatches.length}`,
`contract_ready=${noMultiUserReport.contractReady && multiUserReport.contractReady}`,
`behavior_switch_ready=${noMultiUserReport.safeForBehaviorSwitch && multiUserReport.safeForBehaviorSwitch}`,
].join(' '),
);