| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- /**
- * Auth isolation fire drill — two projects must not see each other's users.
- *
- * bun scripts/isolation-fire-drill.mjs
- *
- * Requires local/engine Doltgres (same env as other proofs).
- */
- process.env.BRIVEN_AUTH_CORE_ENABLED = 'true';
- process.env.BRIVEN_ENV = process.env.BRIVEN_ENV ?? 'development';
- process.env.BRIVEN_ENGINE_DATABASE_URL =
- process.env.BRIVEN_ENGINE_DATABASE_URL ??
- 'postgres://postgres:devpass@127.0.0.1:5434/briven_engine?sslmode=disable';
- process.env.BRIVEN_DATA_PLANE_URL =
- process.env.BRIVEN_DATA_PLANE_URL ??
- 'postgres://postgres:devpass@127.0.0.1:5434/postgres?sslmode=disable';
- const { ensureBrivenEngineDatabase } = await import(
- '../src/services/auth-core/ensure-db.ts'
- );
- const { initAuthCoreSdk } = await import('../src/services/auth-core/engine.ts');
- const { signUpEmailPassword } = await import(
- '../src/services/auth-core/emailpassword.ts'
- );
- const { listBrivenEngineUsers, getBrivenEngineUser } = await import(
- '../src/services/auth-core/users.ts'
- );
- const { projectIdToTenantId } = await import(
- '../src/services/auth-core/project-map.ts'
- );
- function fail(m, x) {
- console.error('FAIL', m, x ?? '');
- process.exit(1);
- }
- console.log('=== Isolation fire drill ===');
- if (!(await ensureBrivenEngineDatabase()).ok) fail('db');
- if (!(await initAuthCoreSdk())) fail('sdk');
- const a = `p_iso_a_${Date.now().toString(36)}`;
- const b = `p_iso_b_${Date.now().toString(36)}`;
- const emailA = `a_${Date.now()}@iso.test`;
- const emailB = `b_${Date.now()}@iso.test`;
- const ua = await signUpEmailPassword({
- email: emailA,
- password: 'IsoA!9999xx',
- projectId: a,
- });
- const ub = await signUpEmailPassword({
- email: emailB,
- password: 'IsoB!9999xx',
- projectId: b,
- });
- if (ua.status !== 'OK' || ub.status !== 'OK') fail('signup', { ua, ub });
- const listA = await listBrivenEngineUsers({
- tenantId: projectIdToTenantId(a),
- limit: 50,
- });
- const listB = await listBrivenEngineUsers({
- tenantId: projectIdToTenantId(b),
- limit: 50,
- });
- const idsA = new Set(listA.users.map((u) => u.id));
- const idsB = new Set(listB.users.map((u) => u.id));
- if (idsA.has(ub.user.id)) fail('project A list contains B user');
- if (idsB.has(ua.user.id)) fail('project B list contains A user');
- if (!idsA.has(ua.user.id)) fail('project A missing own user');
- if (!idsB.has(ub.user.id)) fail('project B missing own user');
- // Cross-tenant get by id without tenant should still resolve user, but
- // tenant-scoped get must miss.
- const cross = await getBrivenEngineUser(ua.user.id, {
- tenantId: projectIdToTenantId(b),
- });
- if (cross) fail('B tenant can read A user by id', cross);
- console.log('ok project A users', listA.users.length);
- console.log('ok project B users', listB.users.length);
- console.log('=== Isolation fire drill PASSED ===');
- process.exit(0);
|