Ë
    ÛJêj­-  ã                  ód  — d Z ddlmZ ddlZddlmc mZ ddl	Z	ddl
Z
ddlZddlmZ ddlmZ ddlZddlmZ ddlmZ ddlmZmZ dd	lmZmZmZmZmZmZ dd
lm Z  ddl!m"Z"m#Z# ddl$m%Z% ddl&m'Z'm(Z(m)Z)m*Z*  G d„ d«      Z+dd„Z,dd„Z- G d„ de
j\                  «      Z/dd„Z0dd„Z1dd„Z2dd„Z3dd„Z4y)a}  Integration tests for the egress gate on the real execution path.

These cover ``AuthorizedExecutionService.execute()`` consulting
``EgressGate.authorize()`` before the provider runs
(``src/cyberbrain26/execution_plane/secure_gateway.py``). That path had
no integration test: ``tests/test_egress_gate.py`` covers the gate in
isolation, but not its position in the execution chain.
é    )ÚannotationsN)ÚPath)ÚAny)ÚSQLiteDatabase)ÚBubblewrapExecutionProvider)ÚAuthorizedExecutionServiceÚExecutionRefused)ÚAuditEventTypeÚAuditLogÚ
AuditQueryÚ
EgressGateÚEgressPolicyÚSecurityError)ÚApprovalManager)ÚAgentIdentityÚ
TrustLevel)ÚPermissionGateway)ÚPolicyDecisionÚPolicyEngineÚ
PolicyModeÚ
PolicyRulec                  óR   — e Zd ZdZd	d„Zed
d„«       Zddddœ	 	 	 	 	 	 	 	 	 	 	 dd„Zy)Ú_OrderingStubProviderzãLocal provider stub that records when it was called.

    It also counts the ``model_egress`` audit rows at the moment it
    runs, which proves the egress decision was recorded *before* the
    provider executed anything.
    c                ó.   — || _         g | _        d | _        y )N)ÚauditÚcallsÚegress_rows_at_call_time)Úselfr   s     úD/home/oem/CyberBrain26-unified/tests/test_egress_gate_integration.pyÚ__init__z_OrderingStubProvider.__init__5   s   € ØˆŒ
Ø+-ˆŒ
Ø48ˆÕ%ó    c                 ó   — y)Nz
pilot-stub© ©r   s    r   Úprovider_namez#_OrderingStubProvider.provider_name:   s   € àr!   é   NF)Útimeout_secondsÚ	workspaceÚallow_networkc             ƒ  ó  K  — | j                   j                  ||dœ«       t        | j                  j	                  t        t        j                  ¬«      «      D �cg c]  }|j                  dk(  r|‘Œ c}«      | _	        dddddœS c c}w ­w)N)ÚcodeÚlanguage©Ú
event_typeÚmodel_egressr   Ú F)Úreturn_codeÚstdoutÚstderrÚ	timed_out)
r   ÚappendÚlenr   Úqueryr   r
   ÚDATA_ACCESSÚactionr   )r   r+   r,   r'   r(   r)   Úevents          r   Úexecutez_OrderingStubProvider.execute>   s€   è ø€ ð 	�
‰
×Ñ 4°XÑ>Ô?Ü(+ð "ŸZ™Z×-Ñ-¬jÄN×D^ÑD^Ô._Ó`öàØ—<‘< >Ò1ò òó)
ˆÔ%ð  !¨B¸"È5ÑQÐQùòùs   ‚ABÁBÁ3B)r   r   ÚreturnÚNone)r<   Ústr)r+   r>   r,   r>   r'   Úintr(   z
str | Noner)   Úboolr<   zdict[str, Any])Ú__name__Ú
__module__Ú__qualname__Ú__doc__r    Úpropertyr%   r;   r#   r!   r   r   r   -   sq   „ ñó9ð
 òó ðð  "Ø $Ø#ñRàðRð ðRð
 ðRð ðRð ðRð 
ôRr!   r   c                 ó>   — t        ddt        j                  dh¬«      S )Nzexecution-agentÚcoderÚpython©Úagent_idÚroleÚtrust_levelÚscopes)r   r   ÚTRUSTEDr#   r!   r   Ú	_identityrO   R   s#   € ÜØ"ØÜ×&Ñ&Øˆzô	ð r!   c                ó˜   — | j                  t        t        j                  ¬«      «      D �cg c]  }|j                  dk(  r|‘Œ c}S c c}w )Nr-   r/   )r7   r   r
   r8   r9   )r   r:   s     r   Ú_egress_eventsrQ   [   sD   € ð —[‘[¤´~×7QÑ7QÔ!RÓSöàØ�<‰<˜>Ò)ò 	òð ùò s   ¬Ac                  ó4   ‡ — e Zd ZdZdˆ fd„Zdd„Zdd„Zˆ xZS )Ú	_ApproverzGApprove the ``execute_python`` request the service raises in SAFE mode.c                óf   •— t         ‰| �  d¬«       || _        t        j                  «       | _        y )NT)Údaemon)Úsuperr    Úapproval_managerÚ	threadingÚEventÚ_stop_event)r   rW   Ú	__class__s     €r   r    z_Approver.__init__f   s*   ø€ Ü‰Ñ ÐÔ%Ø 0ˆÔÜ$Ÿ?™?Ó,ˆÕr!   c                óD  — | j                   j                  «       s†| j                  j                  «       D ]8  }|j                  dk(  sŒ| j                  j                  |j                  d«       Œ: t        j                  d«       | j                   j                  «       sŒ…y y )NÚexecute_pythonz
test-ownerg{®Gáz”?)	rZ   Úis_setrW   Úlist_pendingr9   ÚapproveÚ
request_idÚtimeÚsleep)r   Úrequests     r   Úrunz_Approver.runk   s   € Ø×"Ñ"×)Ñ)Ô+Ø×0Ñ0×=Ñ=Ó?ò T�Ø—>‘>Ð%5Ó5Ø×)Ñ)×1Ñ1°'×2DÑ2DÀlÕSðTô �J‰J�tÔð	 ×"Ñ"×)Ñ)×+r!   c                ó\   — | j                   j                  «        | j                  d¬«       y )Né   )Útimeout)rZ   ÚsetÚjoinr$   s    r   Ústopz_Approver.stopr   s"   € Ø×Ñ×ÑÔØ�	‰	˜!ˆ	Õr!   )rW   r   r<   r=   ©r<   r=   )rA   rB   rC   rD   r    re   rk   Ú__classcell__)r[   s   @r   rS   rS   c   s   ø„ ÙQõ-ó
÷r!   rS   c              ƒ  ó„  K  — t        t        | dz  «      ¬«      }t        t        t        j
                  ¬«      «      }t        |«      }t        |||¬«      }d}|j                  j                  t        ddt        j                  d¬	«      «       |j                  t        «       |d
d¬«      ƒ d{  –—† }|d   }d}||k(  }	|	slt        j                   d|	fd||f«      t        j"                  |«      t        j"                  |«      dœz  }
dd|
iz  }t%        t        j&                  |«      «      ‚dx}x}	}|j(                  }|s�t        j*                  d«      dz   dt-        j.                  «       v st        j0                  |«      rt        j"                  |«      ndt        j"                  |«      dœz  }t%        t        j&                  |«      «      ‚d}|j2                  }d}||k(  }|s­t        j                   d|fd||f«      dt-        j.                  «       v st        j0                  |«      rt        j"                  |«      ndt        j"                  |«      t        j"                  |«      dœz  }dd|iz  }t%        t        j&                  |«      «      ‚dx}x}}t5        |«      }t7        |«      }	d}|	|k(  }|söt        j                   d|fd|	|f«      dt-        j.                  «       v st        j0                  t6        «      rt        j"                  t6        «      ndd t-        j.                  «       v st        j0                  |«      rt        j"                  |«      nd t        j"                  |	«      t        j"                  |«      d!œz  }d"d#|iz  }t%        t        j&                  |«      «      ‚dx}	x}}|d   }|j8                  }d$}||k(  }|s­t        j                   d|fd%||f«      d&t-        j.                  «       v st        j0                  |«      rt        j"                  |«      nd&t        j"                  |«      t        j"                  |«      dœz  }dd|iz  }t%        t        j&                  |«      «      ‚dx}x}}|j:                  }d'}||k(  }|s­t        j                   d|fd(||f«      d&t-        j.                  «       v st        j0                  |«      rt        j"                  |«      nd&t        j"                  |«      t        j"                  |«      dœz  }dd|iz  }t%        t        j&                  |«      «      ‚dx}x}}|j<                  d)   }t>        j@                  }|jB                  } |«       } ||«      }|jD                  } |«       }||k(  }	|	�sZt        j                   d|	fd*||f«      t        j"                  |«      d+t-        j.                  «       v st        j0                  t>        «      rt        j"                  t>        «      nd+t        j"                  |«      d,t-        j.                  «       v st        j0                  |«      rt        j"                  |«      nd,t        j"                  |«      t        j"                  |«      t        j"                  |«      t        j"                  |«      t        j"                  |«      d-œ	z  }d.d/|iz  }t%        t        j&                  |«      «      ‚dx}x}	x}x}x}x}x}}d0}|j<                  }tG        |«      }||v}	|	�s
t        j                   d1|	fd2||f«      t        j"                  |«      d3t-        j.                  «       v st        j0                  tF        «      rt        j"                  tF        «      nd3d&t-        j.                  «       v st        j0                  |«      rt        j"                  |«      nd&t        j"                  |«      t        j"                  |«      d4œz  }d5d6|iz  }t%        t        j&                  |«      «      ‚dx}x}	x}}y7 �ŒŽ­w)7zFThe egress decision is recorded before the provider runs, as a digest.úegress.sqlite3©Údatabase©Úmode©Ú	audit_logz!print('unique-payload-marker-42')Úallow_execute_pythonr]   ú'Test: explicit allow for execute_python©ÚnameÚaction_patternÚdecisionÚdescriptionrH   zegress-task©Útask_idNr1   r   ©ú==©z%(py1)s == %(py4)s©Úpy1Úpy4úassert %(py6)sÚpy6zprovider must have runz+
>assert %(py2)s
{%(py2)s = %(py0)s.calls
}Úprovider©Úpy0Úpy2é   ©z@%(py2)s
{%(py2)s = %(py0)s.egress_rows_at_call_time
} == %(py5)s©r‰   rŠ   Úpy5úassert %(py7)sÚpy7©z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sr6   Úevents©r‰   rƒ   Úpy3r†   úassert %(py8)sÚpy8Úallowed©z.%(py2)s
{%(py2)s = %(py0)s.result
} == %(py5)sr:   Úlocal©z6%(py2)s
{%(py2)s = %(py0)s.network_action
} == %(py5)sÚpayload_sha256©z½%(py1)s == %(py16)s
{%(py16)s = %(py14)s
{%(py14)s = %(py12)s
{%(py12)s = %(py5)s
{%(py5)s = %(py3)s.sha256
}(%(py10)s
{%(py10)s = %(py8)s
{%(py8)s = %(py6)s.encode
}()
})
}.hexdigest
}()
}Úhashlibr+   ©	rƒ   r”   rŽ   r†   r–   Úpy10Úpy12Úpy14Úpy16úassert %(py18)sÚpy18zunique-payload-marker-42©únot in©zR%(py1)s not in %(py8)s
{%(py8)s = %(py3)s(%(py6)s
{%(py6)s = %(py4)s.metadata
})
}r>   ©rƒ   r”   r„   r†   r–   úassert %(py10)srŸ   )$r   r   r   r   r   ÚFULLr   r   Úpolicy_engineÚadd_ruler   r   ÚALLOWr;   rO   Ú
@pytest_arÚ_call_reprcompareÚ	_safereprÚAssertionErrorÚ_format_explanationr   Ú_format_assertmsgÚ@py_builtinsÚlocalsÚ_should_repr_global_namer   rQ   r6   ÚresultÚnetwork_actionÚmetadatar�   Úsha256ÚencodeÚ	hexdigestr>   )Útmp_pathr   Úgatewayr‡   Úservicer+   r·   Ú@py_assert0Ú@py_assert3Ú@py_assert2Ú@py_format5Ú@py_format7Ú@py_assert1Ú@py_format3Ú@py_assert4Ú@py_format6Ú@py_format8r’   Ú@py_assert5Ú@py_format9r:   Ú@py_assert7Ú@py_assert9Ú@py_assert11Ú@py_assert13Ú@py_assert15Ú@py_format17Ú@py_format19Ú@py_format11s                                r   Ú>test_execute_records_local_egress_decision_before_running_coderÔ   w   sÝ  è ø€ äœn¨XÐ8HÑ-HÓIÔJ€EÜ¤´*·/±/Ô BÓC€GÜ$ UÓ+€HÜ(¨°7ÀeÔL€Gà.€DØ×Ñ×"Ñ"ÜØ'Ø+Ü#×)Ñ)ØAô		
ôð —?‘?¤9£;°°hÈ�?ÓV×V€Fà�-Ñ Ð% AÐ%Ð  AÑ%×%×%Õ%Ð  A×%×%Ó%Ð ×%×%Ò% A×%×%×%×%×%×%Ó%Ø�>‰>Ð3‰>×3Ö3Ð3×3×3×3×3×3Ó3ˆ8×3×3Ó3ˆ8×3×3Ô3ˆ>×3×3×3×3×3Ð3à×,Ñ,Ð1°Ð1Ð,°Ñ1×1×1Õ1Ð,°×1×1×1×1×1Ñ1ˆ8×1×1Ó1ˆ8×1×1Ô1Ð,×1×1Ò1°×1×1×1×1×1×1Ó1ä˜EÓ"€FÜˆv‹;Ð˜!Ðˆ;˜!Ñ××Õˆ;˜!×××××ÑŒ3××ÓŒ3×××××Òˆv××Óˆv××Ôˆ;××Ò˜!××××××ÓØ�1‰I€EØ�<‰<Ð$˜9Ð$ˆ<˜9Ñ$×$×$Õ$ˆ<˜9×$×$×$×$×$Ñ$ˆ5×$×$Ó$ˆ5×$×$Ô$ˆ<×$×$Ò$˜9×$×$×$×$×$×$Ó$Ø×ÑÐ* 7Ð*Ð 7Ñ*×*×*Õ*Ð 7×*×*×*×*×*Ñ*ˆ5×*×*Ó*ˆ5×*×*Ô*Ð×*×*Ò* 7×*×*×*×*×*×*Ó*Ø�>‰>Ð*Ñ+ÐX¬w¯~©~ÐX¸d¿k¹kÐX¹k»mÐX©~¸mÓ/LÐXÐ/L×/VÑ/VÐXÑ/VÓ/XÐXÐ+Ð/XÑX×X×XÖXÐ+Ð/X×X×XÓXÐ+×X×X×X×X×XÐX¬w×X×XÓX¬w×X×XÔX¨~×X×X×X×X×XÐX¸d×X×XÓX¸d×X×XÔX¸k×X×XÒX¸m×X×XÒXÐ/L×X×XÒXÐ/V×X×XÒXÐ/X×X×X×X×X×X×X×XÕXà%Ð@°·±Ð@¬S°Ó-@Ð@Ð%Ð-@Ð@×@×@Ö@Ð%Ð-@×@×@Ó@Ð%×@×@×@×@×@Ð@¬S×@×@Ó@¬S×@×@×@×@×@Ò@°×@×@Ó@°×@×@Ô@°×@×@Ò@Ð-@×@×@×@×@×@×@Ö@ð Wûs   ‚B-a Â/`=Â0^a c              ƒ  óP  K  — t        t        | dz  «      ¬«      }t        t        t        j
                  ¬«      «      }t        |«      }t        |||¬«      }t        ddt        j                  t        «       ¬«      }t        j                  t        d¬	«      5  |j                  |d
dd¬«      ƒ d{  –—†  ddd«       |j                   }g }||k(  }|s­t#        j$                  d|fd||f«      dt'        j(                  «       v st#        j*                  |«      rt#        j,                  |«      ndt#        j,                  |«      t#        j,                  |«      dœz  }	dd|	iz  }
t/        t#        j0                  |
«      «      ‚dx}x}}t3        |«      }g }||k(  }|söt#        j$                  d|fd||f«      dt'        j(                  «       v st#        j*                  t2        «      rt#        j,                  t2        «      nddt'        j(                  «       v st#        j*                  |«      rt#        j,                  |«      ndt#        j,                  |«      t#        j,                  |«      dœz  }dd|iz  }t/        t#        j0                  |«      «      ‚dx}x}}y7 �Œæ# 1 sw Y   �ŒæxY w­w)zGA request refused by the permission gate never reaches the egress gate.ro   rp   rr   rt   zunscoped-agentrG   rI   zlacks required scope©Úmatchúprint('never')rH   zegress-refusedr}   Nr   ©z-%(py2)s
{%(py2)s = %(py0)s.calls
} == %(py5)sr‡   r�   r�   r�   r‘   rQ   r   r“   r•   r–   )r   r   r   r   r   rª   r   r   r   r   rN   ri   ÚpytestÚraisesr   r;   r   r®   r¯   r´   rµ   r¶   r°   r±   r²   rQ   )r½   r   r¾   r‡   r¿   ÚunscopedrÅ   rÇ   rÁ   rÈ   rÉ   rÂ   rÊ   rÄ   rË   s                  r   Ú2test_no_egress_record_when_permission_gate_refusesrÝ   ˜   s®  è ø€ äœn¨XÐ8HÑ-HÓIÔJ€EÜ¤´*·/±/Ô BÓC€GÜ$ UÓ+€HÜ(¨°7ÀeÔL€GäØ!¨¼Z×=OÑ=OÔX[ÓX]ô€Hô 
�‰”}Ð,BÔ	Cñ ^Ø�o‰o˜hÐ(8¸(ÐL\ˆoÓ]×]Ð]÷^ð �>‰>Ð˜RÐˆ>˜RÑ××Õˆ>˜R×××××Ñˆ8××Óˆ8××Ôˆ>××Ò˜R××××××ÓÜ˜%Ó Ð& BÐ&Ð  BÑ&×&×&Õ&Ð  B×&×&×&×&×&Ñ&Œ>×&×&Ó&Œ>×&×&×&×&×&Ò&˜%×&×&Ó&˜%×&×&Ô&Ð ×&×&Ò& B×&×&×&×&×&×&Ô&ð 	^ù÷^ñ ^üs1   ‚BJ&ÂJÂ0JÂ1JÂ5G!J&ÊJÊJ#ÊJ&c           	   ƒ  óÞ	  K  — t        t        | dz  «      ¬«      }t        t        | dz  «      ¬«      }t        t	        t
        j                  ¬«      «      }t        |«      }t        ||||¬«      }t        |«      }|j                  «        	 |j                  t        «       ddd¬	«      ƒ d
{  –—† }|j                  «        |d   }d}	||	k(  }
|
slt        j                  d|
fd||	f«      t        j                   |«      t        j                   |	«      dœz  }dd|iz  }t#        t        j$                  |«      «      ‚d
x}x}
}	|j&                  }|syddt)        j*                  «       v st        j,                  |«      rt        j                   |«      ndt        j                   |«      dœz  }t#        t        j$                  |«      «      ‚d
}|j.                  }d}||k(  }	|	s­t        j                  d|	fd||f«      dt)        j*                  «       v st        j,                  |«      rt        j                   |«      ndt        j                   |«      t        j                   |«      dœz  }dd|iz  }t#        t        j$                  |«      «      ‚d
x}x}	}t1        |«      }	t3        |	«      }d}||k(  }|�sSt        j                  d|fd||f«      dt)        j*                  «       v st        j,                  t2        «      rt        j                   t2        «      nddt)        j*                  «       v st        j,                  t0        «      rt        j                   t0        «      nddt)        j*                  «       v st        j,                  |«      rt        j                   |«      ndt        j                   |	«      t        j                   |«      t        j                   |«      dœz  }dd |iz  }t#        t        j$                  |«      «      ‚d
x}	x}x}}|j5                  t7        t8        j:                  ¬!«      «      D �cg c]  }|j<                  d"k(  r|‘Œ }}|s{t        j>                  d#«      d$z   d%d&t)        j*                  «       v st        j,                  |«      rt        j                   |«      nd&iz  }t#        t        j$                  |«      «      ‚y
7 �Œ$# |j                  «        w xY wc c}w ­w)'zASAFE mode: identity, policy, approval, egress, then the provider.ro   rp   zapprovals.sqlite3rr   )rW   ru   zprint('safe-mode')rH   zegress-safer}   Nr1   r   r   r�   r‚   r…   r†   z)assert %(py2)s
{%(py2)s = %(py0)s.calls
}r‡   rˆ   r‹   rŒ   r�   r�   r�   )zN%(py6)s
{%(py6)s = %(py0)s(%(py4)s
{%(py4)s = %(py1)s(%(py2)s)
})
} == %(py9)sr6   rQ   r   )r‰   rƒ   rŠ   r„   r†   Úpy9zassert %(py11)sÚpy11r-   r]   z;expected the human approval to be recorded before executionz
>assert %(py0)sr‰   Úgranted) r   r   r   r   r   r   ÚSAFEr   r   rS   Ústartr;   rO   rk   r®   r¯   r°   r±   r²   r   r´   rµ   r¶   r   rQ   r6   r7   r   r
   ÚAPPROVAL_GRANTEDr9   r³   )r½   r   rW   r¾   r‡   r¿   Úapproverr·   rÀ   rÁ   rÂ   rÃ   rÄ   rÅ   rÆ   rÇ   rÈ   rÉ   rÊ   Ú@py_assert8rÌ   Ú@py_format10Ú@py_format12r:   rá   Ú@py_format1s                             r   ÚBtest_safe_mode_full_chain_identity_policy_approval_egress_providerrê   ©   s  è ø€ äœn¨XÐ8HÑ-HÓIÔJ€EÜ&´¸xÐJ]Ñ?]Ó0^Ô_ÐÜ¤´*·/±/Ô BÓC€GÜ$ UÓ+€HÜ(ØØØ)Øô	€Gô Ð)Ó*€HØ‡N�NÔðØ—‘Ü‹KÐ-¨xÀð 'ó 
÷ 
ˆð 	�‰Œà�-Ñ Ð% AÐ%Ð  AÑ%×%×%Õ%Ð  A×%×%Ó%Ð ×%×%Ò% A×%×%×%×%×%×%Ó%Ø�>‰>Ð‰>××××Õˆ8××Óˆ8××Ôˆ>×××××ÐØ×,Ñ,Ð1°Ð1Ð,°Ñ1×1×1Õ1Ð,°×1×1×1×1×1Ñ1ˆ8×1×1Ó1ˆ8×1×1Ô1Ð,×1×1Ò1°×1×1×1×1×1×1Ó1Ü˜eÓ$Ð*Œ3Ð$Ó%Ð*¨Ð*Ð%¨Ñ*×*×*Ö*Ð%¨×*×*×*×*×*Ñ*Œ3×*×*Ó*Œ3×*×*×*×*×*Ò*Œ~×*×*Ó*Œ~×*×*×*×*×*Ò*˜e×*×*Ó*˜e×*×*Ô*Ð$×*×*Ò*Ð%×*×*Ò*¨×*×*×*×*×*×*Õ*ð —[‘[¤´~×7VÑ7VÔ!WÓXöàØ�<‰<Ð+Ò+ò 	ð€Gð ñ
 ×QÖQÐQ×Q×Q×Q×Q×QÔQˆ7×Q×QÓQˆ7×Q×Q×Q×Q×Qˆ7ð
úð 	�‰�üòùs>   ‚B	S-Â S Â,SÂ-S Â1NS-Ð8S(ÑB S-ÓS ÓS%Ó%S-c              ƒ  ó  K  — t        t        | dz  «      ¬«      }t        t        t        j
                  ¬«      «      }t        |«      }t        |||¬«      }t        t        «       |d¬«      |_
        |j                  j                  t        ddt        j                  d	¬
«      «       t!        j"                  t$        d¬«      5  |j'                  t)        «       ddd¬«      ƒ d{  –—†  ddd«       |j*                  }g }||k(  }|s­t-        j.                  d|fd||f«      dt1        j2                  «       v st-        j4                  |«      rt-        j6                  |«      ndt-        j6                  |«      t-        j6                  |«      dœz  }dd|iz  }	t9        t-        j:                  |	«      «      ‚dx}x}}t=        |«      }
t?        |
«      }d}||k(  }|söt-        j.                  d|fd||f«      dt1        j2                  «       v st-        j4                  t>        «      rt-        j6                  t>        «      nddt1        j2                  «       v st-        j4                  |
«      rt-        j6                  |
«      ndt-        j6                  |«      t-        j6                  |«      dœz  }dd|iz  }t9        t-        j:                  |«      «      ‚dx}x}}|
d   }|j@                  }d }||k(  }|s€t-        j.                  d|fd!||f«      t-        j6                  |«      t-        j6                  |«      t-        j6                  |«      d"œz  }dd|iz  }t9        t-        j:                  |«      «      ‚dx}x}x}}y7 �Œ“# 1 sw Y   �Œ“xY w­w)#aÿ  A denied egress decision stops the execution before the provider runs.

    ``AuthorizedExecutionService.__init__`` builds its own
    ``EgressPolicy(local_provider_ids={provider_name})``
    (``secure_gateway.py``), so on this path the gate cannot be denied
    by configuration today. The gate is therefore replaced here with one
    whose allowlists are empty, to prove the gate sits on the real path
    and fails closed. That limitation is reported to the owner, not
    silently changed in this test.
    ro   rp   rr   rt   T)ru   Úbase_decisionrv   r]   rw   rx   zegress deniedrÖ   rØ   rH   zegress-deniedr}   Nr   rÙ   r‡   r�   r�   r�   r‹   r‘   r6   r’   r“   r•   r–   r   Údenied©z.%(py3)s
{%(py3)s = %(py1)s.result
} == %(py6)s©rƒ   r”   r†   )!r   r   r   r   r   rª   r   r   r   r   Úegress_gater«   r¬   r   r   r­   rÚ   rÛ   r	   r;   rO   r   r®   r¯   r´   rµ   r¶   r°   r±   r²   rQ   r6   r·   )r½   r   r¾   r‡   r¿   rÅ   rÇ   rÁ   rÈ   rÉ   r’   rÂ   rÊ   rÄ   rË   rÀ   s                   r   Ú=test_egress_denial_refuses_execution_and_never_calls_providerrñ   É   sC  è ø€ ô œn¨XÐ8HÑ-HÓIÔJ€EÜ¤´*·/±/Ô BÓC€GÜ$ UÓ+€HÜ(¨°7ÀeÔL€GÜ$¤\£^¸uÐTXÔY€GÔØ×Ñ×"Ñ"ÜØ'Ø+Ü#×)Ñ)ØAô		
ôô 
�‰Ô'¨Ô	?ñ `Ø�o‰oœi›kÐ+;¸XÈˆoÓ_×_Ð_÷`ð �>‰>Ð˜RÐˆ>˜RÑ××Õˆ>˜R×××××Ñˆ8××Óˆ8××Ôˆ>××Ò˜R××××××ÓÜ˜EÓ"€FÜˆv‹;Ð˜!Ðˆ;˜!Ñ××Õˆ;˜!×××××ÑŒ3××ÓŒ3×××××Òˆv××Óˆv××Ôˆ;××Ò˜!××××××ÓØ�!‰9Ð'ˆ9×ÑÐ'˜xÐ'Ð˜xÑ'×'×'Õ'Ð˜x×'×'Ó'ˆ9×'×'Ò'Ð×'×'Ò'˜x×'×'×'×'×'×'Ö'ð 	`ù÷`ñ `üs1   ‚CNÃ!M:Ã$M7Ã%M:Ã)JNÍ7M:Í:NÍ?Nc              ƒ  ó   K  — t        t        | dz  «      ¬«      }t        t        t        j
                  ¬«      «      }t        |¬«      }t        |||dd¬«      }d}|j                  j                  t        d	d
t        j                  d¬«      «       |j                  t        «       |dd¬«      ƒ d{  –—† }|d   }d}	||	k(  }
|
slt        j                   d|
fd||	f«      t        j"                  |«      t        j"                  |	«      dœz  }dd|iz  }t%        t        j&                  |«      «      ‚dx}x}
}	|d   }|j(                  }
 |
«       }d}||k(  }|s”t        j                   d|fd||f«      t        j"                  |«      t        j"                  |
«      t        j"                  |«      t        j"                  |«      dœz  }dd|iz  }t%        t        j&                  |«      «      ‚dx}x}
x}x}}|d   }d}	||	k(  }
|
slt        j                   d|
fd||	f«      t        j"                  |«      t        j"                  |	«      dœz  }dd|iz  }t%        t        j&                  |«      «      ‚dx}x}
}	|d    }d!}	||	u }
|
slt        j                   d"|
fd#||	f«      t        j"                  |«      t        j"                  |	«      dœz  }dd|iz  }t%        t        j&                  |«      «      ‚dx}x}
}	t+        |«      }t-        |«      }
d$}|
|k(  }|söt        j                   d|fd%|
|f«      d&t/        j0                  «       v st        j2                  t,        «      rt        j"                  t,        «      nd&d't/        j0                  «       v st        j2                  |«      rt        j"                  |«      nd't        j"                  |
«      t        j"                  |«      d(œz  }d)d*|iz  }t%        t        j&                  |«      «      ‚dx}
x}}|d   }|j4                  }d+}||k(  }	|	s­t        j                   d|	fd,||f«      d-t/        j0                  «       v st        j2                  |«      rt        j"                  |«      nd-t        j"                  |«      t        j"                  |«      d.œz  }d/d0|iz  }t%        t        j&                  |«      «      ‚dx}x}	}|j6                  }d1}||k(  }	|	s­t        j                   d|	fd2||f«      d-t/        j0                  «       v st        j2                  |«      rt        j"                  |«      nd-t        j"                  |«      t        j"                  |«      d.œz  }d/d0|iz  }t%        t        j&                  |«      «      ‚dx}x}	}|j8                  }d3}||k(  }	|	s­t        j                   d|	fd4||f«      d-t/        j0                  «       v st        j2                  |«      rt        j"                  |«      nd-t        j"                  |«      t        j"                  |«      d.œz  }d/d0|iz  }t%        t        j&                  |«      «      ‚dx}x}	}|j:                  d5   }t<        j>                  }|j@                  } |«       } ||«      }|jB                  } |«       }||k(  }
|
�sZt        j                   d|
fd6||f«      t        j"                  |«      d7t/        j0                  «       v st        j2                  t<        «      rt        j"                  t<        «      nd7t        j"                  |«      d8t/        j0                  «       v st        j2                  |«      rt        j"                  |«      nd8t        j"                  |«      t        j"                  |«      t        j"                  |«      t        j"                  |«      t        j"                  |«      d9œ	z  }d:d;|iz  }t%        t        j&                  |«      «      ‚dx}x}
x}x}x}x}x}}d}|j:                  }tE        |«      }||v}
|
�s
t        j                   d<|
fd=||f«      t        j"                  |«      d>t/        j0                  «       v st        j2                  tD        «      rt        j"                  tD        «      nd>d-t/        j0                  «       v st        j2                  |«      rt        j"                  |«      nd-t        j"                  |«      t        j"                  |«      d?œz  }dd|iz  }t%        t        j&                  |«      «      ‚dx}x}
x}}|j:                  d@   }dAg}	||	k(  }
|
slt        j                   d|
fd||	f«      t        j"                  |«      t        j"                  |	«      dœz  }dd|iz  }t%        t        j&                  |«      «      ‚dx}x}
}	|jG                  tI        tJ        jL                  ¬B«      «      D �cg c]  }|j4                  d
k(  r|‘Œ }}|D �cg c]  }|j6                  ‘Œ } }dC}|| v }
|
s™t        j                   dD|
fdE|| f«      t        j"                  |«      dFt/        j0                  «       v st        j2                  | «      rt        j"                  | «      ndFdGœz  }!dHdI|!iz  }t%        t        j&                  |«      «      ‚dx}}
d1}|| v }
|
s™t        j                   dD|
fdE|| f«      t        j"                  |«      dFt/        j0                  «       v st        j2                  | «      rt        j"                  | «      ndFdGœz  }!dHdI|!iz  }t%        t        j&                  |«      «      ‚dx}}
|jG                  tI        tJ        jN                  d¬J«      «      D �cg c]  }|‘Œ }"}t-        |"«      }
d$}|
|k(  }|söt        j                   d|fd%|
|f«      d&t/        j0                  «       v st        j2                  t,        «      rt        j"                  t,        «      nd&dKt/        j0                  «       v st        j2                  |"«      rt        j"                  |"«      ndKt        j"                  |
«      t        j"                  |«      d(œz  }d)d*|iz  }t%        t        j&                  |«      «      ‚dx}
x}}|"d   }|j6                  }
dL}|
|k(  }|s€t        j                   d|fdM|
|f«      t        j"                  |«      t        j"                  |
«      t        j"                  |«      dNœz  }d)d*|iz  }t%        t        j&                  |«      «      ‚dx}x}
x}}|jG                  tI        tJ        jP                  d¬J«      «      }#t-        |#«      }
d}|
|k(  }|söt        j                   d|fd%|
|f«      d&t/        j0                  «       v st        j2                  t,        «      rt        j"                  t,        «      nd&dOt/        j0                  «       v st        j2                  |#«      rt        j"                  |#«      ndOt        j"                  |
«      t        j"                  |«      d(œz  }d)d*|iz  }t%        t        j&                  |«      «      ‚dx}
x}}|jG                  tI        tJ        jR                  d¬J«      «      }$t-        |$«      }
d}|
|k(  }|söt        j                   d|fd%|
|f«      d&t/        j0                  «       v st        j2                  t,        «      rt        j"                  t,        «      nd&dPt/        j0                  «       v st        j2                  |$«      rt        j"                  |$«      ndPt        j"                  |
«      t        j"                  |«      d(œz  }d)d*|iz  }t%        t        j&                  |«      «      ‚dx}
x}}y7 �Œ=c c}w c c}w c c}w ­w)Qua   Real E2E path: identity â†’ policy â†’ approval â†’ egress gate â†’ bubblewrap sandbox â†’ audit.ro   rp   rr   )Úworkspaces_rootgš™™™™™¹?g{®Gáz„?)ru   Úapproval_timeout_secondsÚapproval_poll_intervalzprint('sandbox-egress-test-42')rv   r]   rw   rx   rH   zegress-sandbox-e2er}   Nr1   r   r   r�   r‚   r…   r†   r2   zsandbox-egress-test-42)zD%(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py1)s.strip
}()
} == %(py8)s)rƒ   r”   rŽ   r–   r©   rŸ   r‡   Ú
bubblewrapr4   F)Úis)z%(py1)s is %(py4)sr‹   r‘   r6   r’   r“   r•   r–   r/   )z.%(py2)s
{%(py2)s = %(py0)s.action
} == %(py5)sr:   r�   r�   r�   r—   r˜   r™   rš   r›   rœ   r�   r+   rž   r£   r¤   r¥   r§   r>   r¨   ÚclassificationsÚpublicr-   Úscope_check_passed)Úin)z%(py1)s in %(py3)sÚresults)rƒ   r”   zassert %(py5)srŽ   )r.   r~   Úresults_eventsÚ	succeededrî   rï   Útask_approvalsÚtask_pending)*r   r   r   r   r   rª   r   r   r«   r¬   r   r   r­   r;   rO   r®   r¯   r°   r±   r²   ÚstriprQ   r6   r´   rµ   r¶   r9   r·   r¸   r¹   r�   rº   r»   r¼   r>   r7   r   r
   ÚPERMISSION_CHECKÚTOOL_RESULTrä   ÚAPPROVAL_REQUIRED)%r½   Úsandbox_workspaces_rootr   r¾   r‡   r¿   r+   r·   rÀ   rÁ   rÂ   rÃ   rÄ   rÇ   rÌ   Ú@py_assert6rË   rÓ   r’   rÊ   r:   rÅ   rÈ   rÉ   rÍ   rÎ   rÏ   rÐ   rÑ   rÒ   ÚeÚscope_checksrü   Ú@py_format4rý   rÿ   r   s%                                        r   Ú<test_execute_records_bubblewrap_egress_and_sandbox_executionr
  ë   sÔ	  è ø€ äœn¨XÐ8HÑ-HÓIÔJ€EÜ¤´*·/±/Ô BÓC€GÜ*Ð;RÔS€HÜ(ØØØØ!$Ø#ô€Gð -€DØ×Ñ×"Ñ"ÜØ'Ø+Ü#×)Ñ)ØAô		
ôð —?‘?Ü‹ØØØ$ð	 #ó ÷ €Fð �-Ñ Ð% AÐ%Ð  AÑ%×%×%Õ%Ð  A×%×%Ó%Ð ×%×%Ò% A×%×%×%×%×%×%Ó%Ø�(ÑÐ?Ð×!Ñ!Ð?Ñ!Ó#Ð?Ð'?Ð?Ð#Ð'?Ñ?×?×?Õ?Ð#Ð'?×?×?Ó?Ð×?×?Ò?Ð!×?×?Ò?Ð#×?×?Ò?Ð'?×?×?×?×?×?×?×?Ø�*ÑÐ- Ð-Ð Ñ-×-×-Õ-Ð ×-×-Ó-Ð×-×-Ò- ×-×-×-×-×-×-Ó-Ø�+ÑÐ' %Ð'Ð %Ð'×'×'Õ'Ð %×'×'Ó'Ð×'×'Ò' %×'×'×'×'×'×'Ó'ô ˜EÓ"€FÜˆv‹;Ð˜!Ðˆ;˜!Ñ××Õˆ;˜!×××××ÑŒ3××ÓŒ3×××××Òˆv××Óˆv××Ôˆ;××Ò˜!××××××ÓØ�1‰I€EØ�<‰<Ð)˜>Ð)ˆ<˜>Ñ)×)×)Õ)ˆ<˜>×)×)×)×)×)Ñ)ˆ5×)×)Ó)ˆ5×)×)Ô)ˆ<×)×)Ò)˜>×)×)×)×)×)×)Ó)Ø�<‰<Ð$˜9Ð$ˆ<˜9Ñ$×$×$Õ$ˆ<˜9×$×$×$×$×$Ñ$ˆ5×$×$Ó$ˆ5×$×$Ô$ˆ<×$×$Ò$˜9×$×$×$×$×$×$Ó$Ø×ÑÐ* 7Ð*Ð 7Ñ*×*×*Õ*Ð 7×*×*×*×*×*Ñ*ˆ5×*×*Ó*ˆ5×*×*Ô*Ð×*×*Ò* 7×*×*×*×*×*×*Ó*Ø�>‰>Ð*Ñ+ÐX¬w¯~©~ÐX¸d¿k¹kÐX¹k»mÐX©~¸mÓ/LÐXÐ/L×/VÑ/VÐXÑ/VÓ/XÐXÐ+Ð/XÑX×X×XÖXÐ+Ð/X×X×XÓXÐ+×X×X×X×X×XÐX¬w×X×XÓX¬w×X×XÔX¨~×X×X×X×X×XÐX¸d×X×XÓX¸d×X×XÔX¸k×X×XÒX¸m×X×XÒXÐ/L×X×XÒXÐ/V×X×XÒXÐ/X×X×X×X×X×X×X×XÕXà#Ð>¨u¯~©~Ð>¬3¨~Ó+>Ð>Ð#Ð+>Ð>×>×>Ö>Ð#Ð+>×>×>Ó>Ð#×>×>×>×>×>Ð>¬3×>×>Ó>¬3×>×>×>×>×>Ò>¨u×>×>Ó>¨u×>×>Ô>¨~×>×>Ò>Ð+>×>×>×>×>×>×>Õ>Ø�>‰>Ð+Ñ,Ð:°°
Ð:Ð,°
Ñ:×:×:Õ:Ð,°
×:×:Ó:Ð,×:×:Ò:°
×:×:×:×:×:×:Ó:ð —;‘;œz´^×5TÑ5TÔUÓVöØØ�8‰8Ð'Ò'ò 	
ð€Lð ð ".Ö.˜Aˆq�x‹xÐ.€GÐ.ØÐ*Ð 7Ð*×*×*Õ*Ð 7×*×*Ó*Ð×*×*×*×*×*Ð* 7×*×*Ó* 7×*×*×*×*×*×*Ó*ØÐˆ9˜Ð××Õˆ9˜××Óˆ9×××××Ð˜××Ó˜××××××Óð —;‘;œz´^×5OÑ5OÐYmÔnÓoöØŠð€Nð ô ˆ~ÓÐ# !Ð#Ð !Ñ#×#×#Õ#Ð !×#×#×#×#×#Ñ#Œ3×#×#Ó#Œ3×#×#×#×#×#Ò#ˆ~×#×#Ó#ˆ~×#×#Ô#Ð×#×#Ò# !×#×#×#×#×#×#Ó#Ø˜!ÑÐ2Ð×#Ñ#Ð2 {Ð2Ð# {Ñ2×2×2Õ2Ð# {×2×2Ó2Ð×2×2Ò2Ð#×2×2Ò2 {×2×2×2×2×2×2Õ2ð —[‘[Üœn×=Ñ=ÐG[Ô\ó€Nô ˆ~ÓÐ# !Ð#Ð !Ñ#×#×#Õ#Ð !×#×#×#×#×#Ñ#Œ3×#×#Ó#Œ3×#×#×#×#×#Ò#ˆ~×#×#Ó#ˆ~×#×#Ô#Ð×#×#Ò# !×#×#×#×#×#×#Ó#Ø—;‘;Üœn×>Ñ>ÐH\Ô]ó€Lô ˆ|ÓÐ! Ð!Ð Ñ!×!×!Õ!Ð ×!×!×!×!×!Ñ!Œ3×!×!Ó!Œ3×!×!×!×!×!Ò!ˆ|×!×!Ó!ˆ|×!×!Ô!Ð×!×!Ò! ×!×!×!×!×!×!Ô!ðeûò4ùò /ùò
ùsE   ‚B0A@Â2/Â3e!A@è2è,A@è27éE8A@î=	<ïP*A@ÿ2A@)r<   r   )r   r   r<   z	list[Any]rl   )r  r   r<   r=   )5rD   Ú
__future__r   Úbuiltinsr´   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter®   r�   rX   rb   Úpathlibr   Útypingr   rÚ   Úcyberbrain26.data_planer   Ú0cyberbrain26.execution_plane.bubblewrap_providerr   Ú+cyberbrain26.execution_plane.secure_gatewayr   r	   Úcyberbrain26.security_planer
   r   r   r   r   r   Ú$cyberbrain26.security_plane.approvalr   Ú$cyberbrain26.security_plane.identityr   r   Ú&cyberbrain26.security_plane.permissionr   Ú"cyberbrain26.security_plane.policyr   r   r   r   r   rO   rQ   ÚThreadrS   rÔ   rÝ   rê   rñ   r
  r#   r!   r   ú<module>r     s˜   ðñõ #ç  „ ƒÛ Û Ý Ý ã å 2Ý X÷÷÷ õ Aß JÝ D÷ó ÷"Rñ "RóJóô�	× Ñ ô ó(AóB'ó"Ró@(ôDH"r!   