@@ -16,6 +16,7 @@ import {
1616 resetHardenedStateForTests ,
1717 setIcaclsRunnerForTests ,
1818 setPlatformForTests ,
19+ hardenSecretDir ,
1920} from "../src/lib/windows-secret-acl" ;
2021
2122const previousHome = process . env . OPENCODEX_HOME ;
@@ -204,7 +205,11 @@ describe("management and data-plane credential separation", () => {
204205 headers : { "x-opencodex-api-key" : "ocx_admin_unhardened" } ,
205206 } ) ;
206207 expect ( management . status ) . toBe ( 503 ) ;
207- expect ( await management . json ( ) ) . toEqual ( { error : "management API unavailable" } ) ;
208+ const body = await management . json ( ) as { error ?: string ; hint ?: string ; reason ?: string } ;
209+ expect ( body . error ) . toBe ( "management API unavailable" ) ;
210+ expect ( body . hint ) . toContain ( "OPENCODEX_ADMIN_AUTH_TOKEN" ) ;
211+ expect ( typeof body . reason ) . toBe ( "string" ) ;
212+ expect ( body . reason ! . length ) . toBeGreaterThan ( 0 ) ;
208213 } finally {
209214 await server . stop ( true ) ;
210215 }
@@ -436,4 +441,99 @@ describe("management and data-plane credential separation", () => {
436441 await server . stop ( true ) ;
437442 }
438443 } ) ;
444+
445+ test ( "directory ACL timeout keeps management unavailable and names OPENCODEX_ADMIN_AUTH_TOKEN" , async ( ) => {
446+ delete process . env . OPENCODEX_ADMIN_AUTH_TOKEN ;
447+ saveConfig ( remoteConfig ( ) ) ;
448+ const adminToken = `ocx_admin_${ "d" . repeat ( 43 ) } ` ;
449+ writeFileSync ( join ( testHome , "admin-api-token" ) , `${ adminToken } \n` , { mode : 0o600 } ) ;
450+ process . env . USERNAME ??= "tester" ;
451+ setPlatformForTests ( "win32" ) ;
452+ setIcaclsRunnerForTests ( args => {
453+ const target = args [ 0 ] ?? "" ;
454+ if ( target . endsWith ( "admin-api-token" ) ) {
455+ return { success : true , exitCode : 0 , timedOut : false , stdout : "" } ;
456+ }
457+ return { success : false , exitCode : null , timedOut : true , stdout : "" } ;
458+ } ) ;
459+ resetHardenedStateForTests ( ) ;
460+ const state = initializeManagementAuthState ( remoteConfig ( ) ) ;
461+ expect ( state . available ) . toBe ( false ) ;
462+ if ( state . available ) return ;
463+ expect ( state . reason ) . toContain ( "OPENCODEX_ADMIN_AUTH_TOKEN" ) ;
464+
465+ const server = startServer ( 0 ) ;
466+ try {
467+ const settings = await fetch ( new URL ( "/api/settings" , server . url ) , {
468+ headers : { "x-opencodex-api-key" : adminToken } ,
469+ } ) ;
470+ expect ( settings . status ) . toBe ( 503 ) ;
471+ const body = await settings . json ( ) as { error ?: string ; hint ?: string ; reason ?: string } ;
472+ expect ( body . error ) . toBe ( "management API unavailable" ) ;
473+ expect ( body . hint ) . toContain ( "OPENCODEX_ADMIN_AUTH_TOKEN" ) ;
474+ expect ( body . reason ) . toContain ( "OPENCODEX_ADMIN_AUTH_TOKEN" ) ;
475+ expect ( ( await fetch ( new URL ( "/healthz" , server . url ) ) ) . status ) . toBe ( 200 ) ;
476+ } finally {
477+ await server . stop ( true ) ;
478+ }
479+ } ) ;
480+
481+ test ( "required management harden retries after a soft loadConfig directory timeout" , async ( ) => {
482+ delete process . env . OPENCODEX_ADMIN_AUTH_TOKEN ;
483+ saveConfig ( remoteConfig ( ) ) ;
484+ const adminToken = `ocx_admin_${ "f" . repeat ( 43 ) } ` ;
485+ writeFileSync ( join ( testHome , "admin-api-token" ) , `${ adminToken } \n` , { mode : 0o600 } ) ;
486+ process . env . USERNAME ??= "tester" ;
487+ setPlatformForTests ( "win32" ) ;
488+
489+ let softPhase = true ;
490+ let requiredPhaseCalls = 0 ;
491+ setIcaclsRunnerForTests ( args => {
492+ const target = args [ 0 ] ?? "" ;
493+ if ( target . endsWith ( "admin-api-token" ) ) {
494+ return { success : true , exitCode : 0 , timedOut : false , stdout : "" } ;
495+ }
496+ if ( softPhase ) {
497+ return { success : false , exitCode : null , timedOut : true , stdout : "" } ;
498+ }
499+ requiredPhaseCalls += 1 ;
500+ return { success : true , exitCode : 0 , timedOut : false , stdout : "" } ;
501+ } ) ;
502+ resetHardenedStateForTests ( ) ;
503+
504+ const soft = hardenSecretDir ( testHome , { required : false } ) ;
505+ expect ( soft . ok ) . toBe ( false ) ;
506+ expect ( soft . diagnostics ) . toMatch ( / t i m e d o u t | b u d g e t e x h a u s t e d | p r e v i o u s a t t e m p t / i) ;
507+
508+ softPhase = false ;
509+ const state = initializeManagementAuthState ( remoteConfig ( ) ) ;
510+ expect ( state . available ) . toBe ( true ) ;
511+ if ( ! state . available ) return ;
512+ expect ( state . source ) . toBe ( "file" ) ;
513+ expect ( requiredPhaseCalls ) . toBeGreaterThan ( 0 ) ;
514+ } ) ;
515+
516+ test ( "OPENCODEX_ADMIN_AUTH_TOKEN bypasses file-backed ACL hardening" , async ( ) => {
517+ process . env . OPENCODEX_ADMIN_AUTH_TOKEN = "env-admin-secret" ;
518+ saveConfig ( remoteConfig ( ) ) ;
519+ process . env . USERNAME ??= "tester" ;
520+ setPlatformForTests ( "win32" ) ;
521+ setIcaclsRunnerForTests ( ( ) => ( { success : false , exitCode : null , timedOut : true , stdout : "" } ) ) ;
522+ resetHardenedStateForTests ( ) ;
523+
524+ const state = initializeManagementAuthState ( remoteConfig ( ) ) ;
525+ expect ( state . available ) . toBe ( true ) ;
526+ if ( ! state . available ) return ;
527+ expect ( state . source ) . toBe ( "environment" ) ;
528+
529+ const server = startServer ( 0 ) ;
530+ try {
531+ const management = await fetch ( new URL ( "/api/config" , server . url ) , {
532+ headers : { "x-opencodex-api-key" : "env-admin-secret" } ,
533+ } ) ;
534+ expect ( management . status ) . toBe ( 200 ) ;
535+ } finally {
536+ await server . stop ( true ) ;
537+ }
538+ } ) ;
439539} ) ;
0 commit comments