@@ -475,4 +475,73 @@ describe("management and data-plane credential separation", () => {
475475 await server . stop ( true ) ;
476476 }
477477 } ) ;
478+
479+ test ( "directory ACL timeout without opt-in keeps management unavailable even when the token file hardens" , async ( ) => {
480+ delete process . env . OPENCODEX_ADMIN_AUTH_TOKEN ;
481+ delete process . env . OPENCODEX_ALLOW_UNVERIFIED_ADMIN_TOKEN_ACL ;
482+ saveConfig ( remoteConfig ( ) ) ;
483+ const adminToken = `ocx_admin_${ "d" . repeat ( 43 ) } ` ;
484+ writeFileSync ( join ( testHome , "admin-api-token" ) , `${ adminToken } \n` , { mode : 0o600 } ) ;
485+ process . env . USERNAME ??= "tester" ;
486+ setPlatformForTests ( "win32" ) ;
487+ setIcaclsRunnerForTests ( args => {
488+ const target = args [ 0 ] ?? "" ;
489+ // Directory harden times out; token-file harden succeeds.
490+ if ( target . endsWith ( "admin-api-token" ) ) {
491+ return { success : true , exitCode : 0 , timedOut : false , stdout : "" } ;
492+ }
493+ return { success : false , exitCode : null , timedOut : true , stdout : "" } ;
494+ } ) ;
495+ // Drop any directory cache left by saveConfig so this case actually re-hardens.
496+ resetHardenedStateForTests ( ) ;
497+ const state = initializeManagementAuthState ( remoteConfig ( ) ) ;
498+ expect ( state . available ) . toBe ( false ) ;
499+ expect ( managementAuthAclUnverified ( ) ) . toBe ( false ) ;
500+
501+ const server = startServer ( 0 ) ;
502+ try {
503+ const settings = await fetch ( new URL ( "/api/settings" , server . url ) , {
504+ headers : { "x-opencodex-api-key" : adminToken } ,
505+ } ) ;
506+ expect ( settings . status ) . toBe ( 503 ) ;
507+ expect ( ( await fetch ( new URL ( "/healthz" , server . url ) ) ) . status ) . toBe ( 200 ) ;
508+ } finally {
509+ await server . stop ( true ) ;
510+ }
511+ } ) ;
512+
513+ test ( "directory ACL timeout with opt-in surfaces aclUnverified when the token file hardens" , async ( ) => {
514+ delete process . env . OPENCODEX_ADMIN_AUTH_TOKEN ;
515+ process . env . OPENCODEX_ALLOW_UNVERIFIED_ADMIN_TOKEN_ACL = "1" ;
516+ saveConfig ( remoteConfig ( ) ) ;
517+ const adminToken = `ocx_admin_${ "e" . repeat ( 43 ) } ` ;
518+ writeFileSync ( join ( testHome , "admin-api-token" ) , `${ adminToken } \n` , { mode : 0o600 } ) ;
519+ process . env . USERNAME ??= "tester" ;
520+ setPlatformForTests ( "win32" ) ;
521+ setIcaclsRunnerForTests ( args => {
522+ const target = args [ 0 ] ?? "" ;
523+ if ( target . endsWith ( "admin-api-token" ) ) {
524+ return { success : true , exitCode : 0 , timedOut : false , stdout : "" } ;
525+ }
526+ return { success : false , exitCode : null , timedOut : true , stdout : "" } ;
527+ } ) ;
528+ resetHardenedStateForTests ( ) ;
529+ const state = initializeManagementAuthState ( remoteConfig ( ) ) ;
530+ expect ( state . available ) . toBe ( true ) ;
531+ if ( ! state . available ) return ;
532+ expect ( state . aclUnverified ) . toBe ( true ) ;
533+ expect ( managementAuthAclUnverified ( ) ) . toBe ( true ) ;
534+
535+ const server = startServer ( 0 ) ;
536+ try {
537+ const settings = await fetch ( new URL ( "/api/settings" , server . url ) , {
538+ headers : { "x-opencodex-api-key" : adminToken } ,
539+ } ) ;
540+ expect ( settings . status ) . toBe ( 200 ) ;
541+ const body = await settings . json ( ) as { managementAuthAclUnverified ?: boolean } ;
542+ expect ( body . managementAuthAclUnverified ) . toBe ( true ) ;
543+ } finally {
544+ await server . stop ( true ) ;
545+ }
546+ } ) ;
478547} ) ;
0 commit comments