Skip to content

Commit bdae40e

Browse files
committed
test: trust runtime storage policy only
1 parent 08947d3 commit bdae40e

2 files changed

Lines changed: 13 additions & 25 deletions

File tree

tests/codex-rescue-qualification.test.mjs

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -188,20 +188,16 @@ test('qualifies distinct canonical linked worktree execution while hooks remain
188188
await mkdir(windowsDirectories.at(-1), { recursive: true });
189189
await mkdir(windowsDirectories[2], { recursive: true });
190190
await Promise.all(windowsDirectories.map((path) => chmod(path, 0o755)));
191-
const windowsInput = workspaceBoundContinuationFixture(originWorkspace, executionWorkspace); windowsInput.installedDataRoot = windowsDataRoot;
192-
for (const bytes of JSON.parse(windowsInput.jobRecordBytesJson)) {
191+
const installedInput = workspaceBoundContinuationFixture(originWorkspace, executionWorkspace); installedInput.installedDataRoot = windowsDataRoot;
192+
for (const bytes of JSON.parse(installedInput.jobRecordBytesJson)) {
193193
const job = JSON.parse(bytes); await writeFile(join(windowsDirectories.at(-1), `${job.id}.json`), bytes);
194194
}
195195
const snapshotStorage = async () => Promise.all(windowsDirectories.map(async (path) => {
196196
const metadata = await stat(path); return { path, entries: (await readdir(path)).sort(), mode: metadata.mode, mtimeMs: metadata.mtimeMs, ctimeMs: metadata.ctimeMs };
197197
}));
198198
const windowsBefore = await snapshotStorage(); const platformBefore = process.platform;
199-
windowsInput.installedStoragePermissionModel = 'windows';
200-
await qualifyCodexRescuePreparedContinuationEvidence(windowsInput);
201-
assert.equal(process.platform, platformBefore);
202-
assert.deepEqual(await snapshotStorage(), windowsBefore);
203-
windowsInput.installedStoragePermissionModel = 'posix';
204-
await assert.rejects(qualifyCodexRescuePreparedContinuationEvidence(windowsInput), CodexRescueEvidenceMismatchError);
199+
if (process.platform === 'win32') await qualifyCodexRescuePreparedContinuationEvidence(installedInput);
200+
else await assert.rejects(qualifyCodexRescuePreparedContinuationEvidence(installedInput), CodexRescueEvidenceMismatchError);
205201
assert.equal(process.platform, platformBefore);
206202
assert.deepEqual(await snapshotStorage(), windowsBefore);
207203

tests/helpers/codex-rescue-qualification.mjs

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -191,10 +191,8 @@ export async function qualifyCodexRescuePreparedContinuationEvidence(input, opti
191191
|| preBinding.operationId !== binding.operationId || preBinding.anchorJobId !== binding.anchorJobId) mismatch('continuation-binding-identity', 'Raw Rescue binding identity is invalid.');
192192
if (preBinding.state !== 'active' || preBinding.currentJobId !== preBinding.anchorJobId
193193
|| binding.currentJobId === preBinding.currentJobId) mismatch('continuation-current-job-stale', 'Raw current job binding does not prove the exact pre-reservation CAS transition.');
194-
const installedStoragePermissionModel = boundedString(input.installedDataRoot)
195-
? qualificationStoragePermissionModel(input.installedStoragePermissionModel) : undefined;
196-
if (workspaceAuthority.checked) await validateContinuationArtifactLocations(input, { ...workspaceAuthority, route: workspaceAuthority.route }, installedStoragePermissionModel);
197-
const jobs = await parseRawJobsWithProduction(jobBytes, expected, input.installedDataRoot, installedStoragePermissionModel);
194+
if (workspaceAuthority.checked) await validateContinuationArtifactLocations(input, { ...workspaceAuthority, route: workspaceAuthority.route });
195+
const jobs = await parseRawJobsWithProduction(jobBytes, expected, input.installedDataRoot);
198196
if (jobs.length !== 2 || new Set(jobs.map((job) => job?.id)).size !== jobs.length) mismatch('continuation-job-identity', 'Raw job evidence contains extra or duplicate identities.');
199197
const anchor = jobs.find((job) => job?.id === binding.anchorJobId); const current = jobs.find((job) => job?.id === binding.currentJobId);
200198
if (!current) mismatch('continuation-current-job-stale', 'Raw current job evidence is absent.');
@@ -1206,13 +1204,13 @@ function assertGlobalCallOwnership(...rollouts) {
12061204
}
12071205
}
12081206

1209-
async function parseRawJobsWithProduction(jobBytes, expected, installedDataRoot, permissionModel) {
1207+
async function parseRawJobsWithProduction(jobBytes, expected, installedDataRoot) {
12101208
if (!Array.isArray(jobBytes) || jobBytes.length !== 2) mismatch('continuation-job-identity', 'Exactly two raw persisted job files are required.');
12111209
if (jobBytes.some((bytes) => typeof bytes !== 'string' || !bytes.endsWith('\n'))) mismatch('continuation-job-record', 'Raw persisted job file bytes are invalid.');
12121210
const routed = jobBytes.map((bytes) => { let value; try { value = JSON.parse(bytes); } catch { mismatch('continuation-job-record', 'Raw persisted job bytes are malformed.'); } if (!/^[a-f0-9]{64}$/u.test(value?.id)) mismatch('continuation-job-record', 'Raw persisted job identity is invalid.'); return { bytes, id: value.id, value }; });
12131211
const suppliedRoot = typeof installedDataRoot === 'string' && installedDataRoot.length > 0 ? installedDataRoot : undefined;
12141212
if (suppliedRoot !== undefined) {
1215-
const installedStorage = await resolveReadonlyQualificationStorage(suppliedRoot, expected.workspace, permissionModel).catch(() => mismatch('continuation-job-record', 'Observed installed job storage is unsafe or absent.'));
1213+
const installedStorage = await resolveReadonlyQualificationStorage(suppliedRoot, expected.workspace).catch(() => mismatch('continuation-job-record', 'Observed installed job storage is unsafe or absent.'));
12161214
const installedJobs = join(installedStorage.directory, 'jobs');
12171215
for (const { bytes, id, value } of routed) {
12181216
if (await readFile(join(installedJobs, `${id}.json`), 'utf8').catch(() => null) !== bytes) mismatch('continuation-job-record', 'Observed installed job bytes do not match their persisted source files.');
@@ -1341,7 +1339,7 @@ async function validateContinuationWorkspaceBinding(input, expected, active) {
13411339
return { originWorkspace, executionWorkspace, generationId: active.generationId, route, checked: true };
13421340
}
13431341

1344-
async function validateContinuationArtifactLocations(input, evidence, permissionModel) {
1342+
async function validateContinuationArtifactLocations(input, evidence) {
13451343
if (typeof input.artifactLocationsJson !== 'string' || Buffer.byteLength(input.artifactLocationsJson) > MAX_ROLLOUT_BYTES) {
13461344
mismatch('continuation-artifact-location', 'Workspace-bound artifact locations are absent or oversized.');
13471345
}
@@ -1357,8 +1355,8 @@ async function validateContinuationArtifactLocations(input, evidence, permission
13571355
if (boundedString(input.installedDataRoot)) {
13581356
let originStorage; let executionStorage;
13591357
try { [originStorage, executionStorage] = await Promise.all([
1360-
resolveReadonlyQualificationStorage(input.installedDataRoot, evidence.originWorkspace, permissionModel),
1361-
resolveReadonlyQualificationStorage(input.installedDataRoot, evidence.executionWorkspace, permissionModel),
1358+
resolveReadonlyQualificationStorage(input.installedDataRoot, evidence.originWorkspace),
1359+
resolveReadonlyQualificationStorage(input.installedDataRoot, evidence.executionWorkspace),
13621360
]); } catch { mismatch('continuation-artifact-location', 'Workspace-bound artifact storage could not be resolved canonically.'); }
13631361
if (originStorage.workspacePath !== evidence.originWorkspace || executionStorage.workspacePath !== evidence.executionWorkspace) {
13641362
mismatch('continuation-artifact-location', 'Workspace-bound artifact storage resolved to another workspace.');
@@ -1404,19 +1402,13 @@ async function validateContinuationArtifactLocations(input, evidence, permission
14041402
if (remaining.length !== 0) mismatch('continuation-artifact-location', 'Workspace-bound artifact evidence contains an unaccounted duplicate or substitute.');
14051403
}
14061404

1407-
function qualificationStoragePermissionModel(value) {
1408-
if (value === undefined) return process.platform === 'win32' ? 'windows' : 'posix';
1409-
if (value === 'windows' || value === 'posix') return value;
1410-
mismatch('continuation-artifact-location', 'Installed storage permission model is invalid.');
1411-
}
1412-
1413-
async function resolveReadonlyQualificationStorage(dataRoot, workspace, permissionModel) {
1405+
async function resolveReadonlyQualificationStorage(dataRoot, workspace) {
14141406
const workspacePath = await realpath(resolve(workspace)); const dataRootPath = await realpath(resolve(dataRoot));
14151407
const workspaceKey = createHash('sha256').update(workspacePath).digest('hex');
14161408
const workspacesDirectory = join(dataRootPath, 'workspaces'); const directory = join(workspacesDirectory, workspaceKey);
14171409
for (const path of [dataRootPath, workspacesDirectory, directory]) {
14181410
const stats = await lstat(path);
1419-
if (!stats.isDirectory() || stats.isSymbolicLink() || (permissionModel === 'posix' && (stats.mode & 0o077) !== 0) || await realpath(path) !== path) {
1411+
if (!stats.isDirectory() || stats.isSymbolicLink() || (process.platform !== 'win32' && (stats.mode & 0o077) !== 0) || await realpath(path) !== path) {
14201412
throw new Error('unsafe qualification storage');
14211413
}
14221414
}

0 commit comments

Comments
 (0)