@@ -10510,25 +10510,30 @@ mod tests {
1051010510 }
1051110511
1051210512 #[ tokio:: test]
10513- async fn rejects_escalated_permissions_when_policy_not_on_request ( ) {
10513+ async fn rejects_additional_permissions_when_policy_not_on_request ( ) {
1051410514 use crate :: exec:: ExecParams ;
10515+ use crate :: features:: Feature ;
1051510516 use crate :: protocol:: AskForApproval ;
1051610517 use crate :: protocol:: SandboxPolicy ;
1051710518 use crate :: sandboxing:: SandboxPermissions ;
1051810519 use crate :: turn_diff_tracker:: TurnDiffTracker ;
1051910520 use std:: collections:: HashMap ;
1052010521
10521- let ( session, mut turn_context_raw) = make_session_and_context ( ) . await ;
10522+ let ( mut session, mut turn_context_raw) = make_session_and_context ( ) . await ;
1052210523 // Ensure policy is NOT OnRequest so the early rejection path triggers
1052310524 turn_context_raw
1052410525 . approval_policy
1052510526 . set ( AskForApproval :: OnFailure )
1052610527 . expect ( "test setup should allow updating approval policy" ) ;
10528+ session
10529+ . features
10530+ . enable ( Feature :: RequestPermissions )
10531+ . expect ( "test setup should allow enabling request permissions" ) ;
1052710532 let session = Arc :: new ( session) ;
1052810533 let mut turn_context = Arc :: new ( turn_context_raw) ;
1052910534
1053010535 let timeout_ms = 1000 ;
10531- let sandbox_permissions = SandboxPermissions :: RequireEscalated ;
10536+ let sandbox_permissions = SandboxPermissions :: WithAdditionalPermissions ;
1053210537 let params = ExecParams {
1053310538 command : if cfg ! ( windows) {
1053410539 vec ! [
@@ -10596,8 +10601,8 @@ mod tests {
1059610601 } ;
1059710602
1059810603 let expected = format ! (
10599- "approval policy is {policy:?}; reject command — you should not ask for escalated permissions if the approval policy is {policy:?} " ,
10600- policy = turn_context. approval_policy. value( )
10604+ "approval policy is {policy:?}; reject command — you cannot request additional permissions unless the approval policy is OnRequest " ,
10605+ policy = turn_context. approval_policy. value( ) ,
1060110606 ) ;
1060210607
1060310608 pretty_assertions:: assert_eq!( output, expected) ;
@@ -10656,7 +10661,7 @@ mod tests {
1065610661 assert ! ( exec_output. output. contains( "hi" ) ) ;
1065710662 }
1065810663 #[ tokio:: test]
10659- async fn unified_exec_rejects_escalated_permissions_when_policy_not_on_request ( ) {
10664+ async fn unified_exec_rejects_additional_permissions_when_policy_not_on_request ( ) {
1066010665 use crate :: protocol:: AskForApproval ;
1066110666 use crate :: sandboxing:: SandboxPermissions ;
1066210667 use crate :: turn_diff_tracker:: TurnDiffTracker ;
@@ -10670,6 +10675,52 @@ mod tests {
1067010675 let turn_context = Arc :: new ( turn_context_raw) ;
1067110676 let tracker = Arc :: new ( tokio:: sync:: Mutex :: new ( TurnDiffTracker :: new ( ) ) ) ;
1067210677
10678+ let handler = UnifiedExecHandler ;
10679+ let resp = handler
10680+ . handle ( ToolInvocation {
10681+ session : Arc :: clone ( & session) ,
10682+ turn : Arc :: clone ( & turn_context) ,
10683+ tracker : Arc :: clone ( & tracker) ,
10684+ call_id : "exec-call" . to_string ( ) ,
10685+ tool_name : "exec_command" . to_string ( ) ,
10686+ payload : ToolPayload :: Function {
10687+ arguments : serde_json:: json!( {
10688+ "cmd" : "echo hi" ,
10689+ "sandbox_permissions" : SandboxPermissions :: WithAdditionalPermissions ,
10690+ "justification" : "need additional sandbox permissions" ,
10691+ } )
10692+ . to_string ( ) ,
10693+ } ,
10694+ } )
10695+ . await ;
10696+
10697+ let Err ( FunctionCallError :: RespondToModel ( output) ) = resp else {
10698+ panic ! ( "expected error result" ) ;
10699+ } ;
10700+
10701+ let expected = format ! (
10702+ "approval policy is {policy:?}; reject command — you cannot ask for additional sandbox permissions if the approval policy is {policy:?}" ,
10703+ policy = turn_context. approval_policy. value( )
10704+ ) ;
10705+
10706+ pretty_assertions:: assert_eq!( output, expected) ;
10707+ }
10708+
10709+ #[ tokio:: test]
10710+ async fn unified_exec_rejects_escalated_permissions_when_policy_is_never ( ) {
10711+ use crate :: protocol:: AskForApproval ;
10712+ use crate :: sandboxing:: SandboxPermissions ;
10713+ use crate :: turn_diff_tracker:: TurnDiffTracker ;
10714+
10715+ let ( session, mut turn_context_raw) = make_session_and_context ( ) . await ;
10716+ turn_context_raw
10717+ . approval_policy
10718+ . set ( AskForApproval :: Never )
10719+ . expect ( "test setup should allow updating approval policy" ) ;
10720+ let session = Arc :: new ( session) ;
10721+ let turn_context = Arc :: new ( turn_context_raw) ;
10722+ let tracker = Arc :: new ( tokio:: sync:: Mutex :: new ( TurnDiffTracker :: new ( ) ) ) ;
10723+
1067310724 let handler = UnifiedExecHandler ;
1067410725 let resp = handler
1067510726 . handle ( ToolInvocation {
@@ -10682,7 +10733,7 @@ mod tests {
1068210733 arguments : serde_json:: json!( {
1068310734 "cmd" : "echo hi" ,
1068410735 "sandbox_permissions" : SandboxPermissions :: RequireEscalated ,
10685- "justification" : "need unsandboxed execution " ,
10736+ "justification" : "need escalated permissions " ,
1068610737 } )
1068710738 . to_string ( ) ,
1068810739 } ,
@@ -10694,7 +10745,7 @@ mod tests {
1069410745 } ;
1069510746
1069610747 let expected = format ! (
10697- "approval policy is {policy:?}; reject command — you cannot ask for escalated permissions if the approval policy is {policy:?}" ,
10748+ "approval policy is {policy:?}; reject command — you should not ask for escalated permissions if the approval policy is {policy:?}" ,
1069810749 policy = turn_context. approval_policy. value( )
1069910750 ) ;
1070010751
0 commit comments