Ë
    8ûÝjÞH  ã                   óš  — d Z ddlZddl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
mZmZ ddlmZmZ ddlmZmZmZmZ dd	d
ddddddddde	ddgZdedefd„Z G d„ dej2                  «      Z G d„ dej2                  «      Z ej8                   e«       dk\  d«       G d„ d ej2                  «      «       Zed!k(  r ej>                  «        yy)"zÁCagedCodexRunner: Argv-Komposition, Bypass-/Kaefig-Pflicht, auth-Staging, NO_USER_BUS (ohne Bus),
und - falls der User-Bus erreichbar ist - echter systemd-Scope-Lauf (gegen python3, NIE codex).é    N)ÚPath)ÚISO_EXEC_PATH)ÚCagedCodexRunnerÚwrapper_is_tools_cage)ÚRunSpecÚUnsafeCommandError)ÚFAKE_CODEX_CAGEÚhome_project_probe_dirÚlandlock_abiÚuser_bus_reachableú/usr/bin/systemd-runú--userú--scopeú--quietú--unitú{unit}ú-pzRuntimeMaxSec=120ú/usr/bin/envú-iú/usr/bin/python3ú-Iú{cfg}ú--ÚpidÚreturnc                 óÞ   — 	 t        d| › d�dd¬«      5 }|j                  «       j                  dd«      d   j                  «       d   d	v cd d d «       S # 1 sw Y   y xY w# t        $ r Y y
w xY w)Nz/proc/z/statÚrúutf-8©Úencodingú)é   r   )ÚZÚXT)ÚopenÚreadÚrsplitÚsplitÚFileNotFoundError)r   Úfhs     ú8/home/aria/aria-v3-dev/python/tests/test_caged_runner.pyÚprocess_goner,      sv   € ðÜ�F˜3˜%˜uÐ% s°WÔ=ð 	HÀØ—7‘7“9×#Ñ# C¨Ó+¨AÑ.×4Ñ4Ó6°qÑ9¸ZÐG÷	H÷ 	Hò 	Hûäò Ùðús.   ‚A  ”6AÁ
	A  ÁAÁA  ÁA  Á 	A,Á+A,c                   óh   — e Zd Zd„ Zd„ Zdd„Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zy)Ú	CagedUnitc                 ó<  — t        j                  «       | _        t        | j                  j                  «      | _        | j
                  dz  | _        | j                  j                  «        | j
                  dz  | _        | j                  j                  dd¬«       y )NÚworkú	auth.jsonú{"token":"x"}r   r   )
ÚtempfileÚTemporaryDirectoryÚ_tmpr   ÚnameÚrootr0   ÚmkdirÚauthÚ
write_text©Úselfs    r+   ÚsetUpzCagedUnit.setUp   sk   € Ü×/Ñ/Ó1ˆŒ	Ü˜Ÿ™Ÿ™Ó(ˆŒ	Ø—I‘I Ñ&ˆŒ	Ø�	‰	�‰ÔØ—I‘I Ñ+ˆŒ	Ø�	‰	×Ñ˜_°wÐÕ?ó    c                 ó8   — | j                   j                  «        y ©N©r5   Úcleanupr;   s    r+   ÚtearDownzCagedUnit.tearDown%   ó   € Ø�	‰	×ÑÕr>   c                 ó”   — t        | j                  f|t        | j                  «      t        | j                  «      t        «       dœ|¤ŽS )N)ÚprofileÚ	auth_fileÚ	home_rootÚsecret_files)r   r0   Ústrr9   r7   Úset)r<   rF   Úkws      r+   ÚrunnerzCagedUnit.runner(   sA   € Ü §	¡	ð T°7ÄcÈ$Ï)É)ÃnÜ*-¨d¯i©i«.ÄsÃuñTØPRñTð 	Tr>   c                 ó¸   — | j                  d¬«      j                  t        t        t        dgz   «      di d«      «      }| j                  |j                  d«       y )Nú
/bin/false)Úsystemctl_pathú/usr/bin/truer>   é
   ÚNO_USER_BUS)rM   Úrunr   ÚtupleÚCAGEÚassertEqualÚ
error_code)r<   r   s     r+   Útest_no_user_bus_is_fail_closedz)CagedUnit.test_no_user_bus_is_fail_closed,   sM   € à�K‰K |ˆKÓ4×8Ñ8Ü”Eœ$ /Ð!2Ñ2Ó3°S¸"¸bÓAóCˆà×Ñ˜Ÿ™ }Õ5r>   c                 ó   — ddl m} | j                  t        «      5  | j	                  d |d¬«      ¬«       d d d «       | j	                  d |d¬«      ¬«       | j	                  d	 |d¬«      ¬«       y # 1 sw Y   Œ>xY w)
Nr   )ÚResourceLimitsÚtoolsl        )Úaddress_space_bytes)rF   Úresource_limitsé,  )Úcpu_secondsÚtext)Úaria_router.runnerr[   ÚassertRaisesÚ
ValueErrorrM   )r<   r[   s     r+   Ú.test_tools_profile_rejects_address_space_limitz8CagedUnit.test_tools_profile_rejects_address_space_limit2   sn   € Ý5Ø×ÑœzÓ*ñ 	lØ�K‰K ¹Ð\iÔ9jˆKÔk÷	là�‰˜G±^ÐPSÔ5TˆÔUØ�‰˜F±NÐWdÔ4eˆÕf÷	lð 	lús   œA4Á4A=c                 óV  — | j                  dd¬«      }t        t        t        dgz   «      di dd¬«      }| j	                  |j                  |«      j                  d	«       t        t        t        dgz   «      di d«      }| j	                  |j                  |«      j                  d
«       y )Nr\   rO   )rF   rP   rQ   s   promptrR   ))z01-a.txts   data)ÚfilesÚATTACHMENTS_UNSUPPORTEDrS   )rM   r   rU   rV   rW   rT   rX   )r<   rT   ÚspecÚspec2s       r+   Útest_files_fail_closedz CagedUnit.test_files_fail_closed9   s�   € à�k‰k '¸,ˆkÓGˆÜ”uœT _Ð$5Ñ5Ó6¸	À2ÀrØ5ô7ˆà×Ñ˜Ÿ™ ›×1Ñ1Ð3LÔMäœœd oÐ%6Ñ6Ó7¸ÀBÈÓKˆØ×Ñ˜Ÿ™ ›×2Ñ2°MÕBr>   c                 ó  — | j                  d¬«      }| j                  t        «      5 }|j                  t	        t
        ddgz   «      «       d d d «       | j                  j                  j                  d«       y # 1 sw Y   Œ0xY w)Nr\   ©rF   z/home/aria/.local/bin/claudeÚexecÚCODEX_BIN_IS_CLAUDE)	rM   rc   r   Ú_codex_bin_ofrU   rV   rW   Ú	exceptionÚcode)r<   rT   Úcs      r+   Útest_codex_bin_claude_refusedz'CagedUnit.test_codex_bin_claude_refusedC   su   € Ø�k‰k 'ˆkÓ*ˆØ×ÑÔ1Ó2ð 	V°aØ×Ñœe¤DÐ,JÈFÐ+SÑ$SÓTÔU÷	Và×Ñ˜Ÿ™×)Ñ)Ð+@ÕA÷	Vð 	Vús   ¨$A;Á;Bc           	      óŠ  — | j                  «       }dd lmc m} t	        | j
                  dz  «      }|j                  ||dz   |dz   |dz   |dz   |dz   «      }|j                  t        t        dgz   «      |d	d
«      }| j                  d
|«       | j                  d	|«       | j                  d|«       | j                  d|«       y )Nr   Úrrú/wsú/homeú/codex-homeú/authdirú/tmprQ   ú/tmp/x.jsonzaria-codex-u1r   r   )rM   Úaria_router.isolation.profilesÚ	isolationÚprofilesrJ   r7   ÚRunDirsÚ_compose_argvrU   rV   ÚassertInÚassertNotIn)r<   rT   ÚPrv   ÚdirsÚargvs         r+   Ú*test_compose_argv_substitutes_placeholdersz4CagedUnit.test_compose_argv_substitutes_placeholdersI   s·   € Ø�k‰k‹mˆß2Ð2Ü�—‘˜TÑ!Ó"ˆØ�y‰y˜˜R %™Z¨¨g©°r¸MÑ7IÈ2ÐPZÉ?Ð\^ÐagÑ\gÓhˆØ× Ñ ¤¤t¨Ð.?Ñ'?Ó!@À$ÈÐWfÓgˆØ�‰�o tÔ,Ø�‰�m TÔ*Ø×Ñ˜ 4Ô(Ø×Ñ˜ $Õ'r>   c           	      ó0  — | j                  d¬«      }dd lmc m} t	        | j
                  dz  «      }|j                  ||dz   |dz   |dz   |dz   |d	z   «      }| j                  t        «      5  |j                  d
|dd«       d d d «       y # 1 sw Y   y xY w)Nr\   rm   r   rv   rw   rx   ry   rz   r{   )r   r   r   ú/usr/bin/codexz-szdanger-full-accessr|   Úu1)
rM   r}   r~   r   rJ   r7   r€   rc   r   r�   )r<   rT   r„   rv   r…   s        r+   Ú+test_tools_profile_requires_cage_in_composez5CagedUnit.test_tools_profile_requires_cage_in_composeT   s˜   € Ø�k‰k 'ˆkÓ*ˆß2Ð2Ü�—‘˜TÑ!Ó"ˆØ�y‰y˜˜R %™Z¨¨g©°r¸MÑ7IÈ2ÐPZÉ?Ð\^ÐagÑ\gÓhˆà×ÑÔ1Ó2ñ 	9Ø×ÑÐhØ" M°4ô9÷	9÷ 	9ñ 	9ús   Á.BÂBc                 ó¦  — | j                  «       }|j                  «       }	 |j                  |«       t        j                  |j
                  «      j                  dz  }| j                  |d«       | j                  t        j                  j                  |j                  «      «       | j                  t        j                  j                  |j                  «      t        j                  j                  |j
                  «      «       dd l} |j                  |j                  d¬«       y # dd l} |j                  |j                  d¬«       w xY w)Néÿ  é   r   T©Úignore_errors)rM   Ú_make_run_dirsÚ_stage_authÚosÚstatÚ	auth_copyÚst_moderW   Ú
assertTrueÚpathÚislinkÚcodex_home_auth_linkÚrealpathÚshutilÚrmtreer7   )r<   rT   r…   Úmoderœ   s        r+   Ú test_stage_auth_readonly_defaultz*CagedUnit.test_stage_auth_readonly_default^   så   € Ø�k‰k‹mˆØ×!Ñ!Ó#ˆð	9Ø�O‰O˜DÔ!Ü—7‘7˜4Ÿ>™>Ó*×2Ñ2°UÑ:ˆDØ×Ñ˜T 5Ô)Ø�O‰OœBŸG™GŸN™N¨4×+DÑ+DÓEÔFØ×ÑœRŸW™W×-Ñ-¨d×.GÑ.GÓHÌ"Ï'É'×JZÑJZÐ[_×[iÑ[iÓJjÔkãØˆF�M‰M˜$Ÿ)™)°4Ö8øó ØˆF�M‰M˜$Ÿ)™)°4Ö8ús   ¢C'D, Ä,$Ec                 óv  — | j                  d¬«      }|j                  «       }	 |j                  |«       | j                  t	        j
                  |j                  «      j                  dz  d«       dd l} |j                  |j                  d¬«       y # dd l} |j                  |j                  d¬«       w xY w)NT)Úcodex_auth_writabler�   i€  r   r�   )rM   r‘   r’   rW   r“   r”   r•   r–   rœ   r�   r7   )r<   rT   r…   rœ   s       r+   Ú%test_stage_auth_writable_when_enabledz/CagedUnit.test_stage_auth_writable_when_enabledk   s‹   € Ø�k‰k¨dˆkÓ3ˆØ×!Ñ!Ó#ˆð	9Ø�O‰O˜DÔ!Ø×ÑœRŸW™W T§^¡^Ó4×<Ñ<¸uÑDÀeÔLãØˆF�M‰M˜$Ÿ)™)°4Ö8øó ØˆF�M‰M˜$Ÿ)™)°4Ö8ús   ¤AB Â$B8c                 óŽ   — | j                  t        t        t        dgz   «      «      «       | j	                  t        d«      «       y )Nr‰   )r   r   r   r‰   )r—   r   rU   rV   ÚassertFalser;   s    r+   Ú$test_wrapper_is_tools_cage_detectionz.CagedUnit.test_wrapper_is_tools_cage_detectionu   s7   € Ø�‰Ô-¬e´DÐ<LÐ;MÑ4MÓ.NÓOÔPØ×ÑÔ.Ð/]Ó^Õ_r>   c                 óÞ  — ddddddddt         d	d
dg}ddddddt         d	d
g	}| j                  t        |«      «       | j                  t        |«      «       | j                  t        dddddddt         dd	d
g«      «       | j                  t        ddddddddt         dd	d
g«      «       | j                  t        dddddddt         dd	d
g«      «       | j                  t        g d¢«      «       y )Nr   r   r   r   r   r   z-cÚPAYLOADr   r‰   rn   z/bin/shÚxr   r   z--evilÚpython3)r   r   r   r   r   r   r   z/tmp/evil.pyr   r   r‰   )r   r¤   r   )r<   Úevil_pyÚevil_shs      r+   Ú&test_wrapper_structural_rejects_bypassz0CagedUnit.test_wrapper_structural_rejects_bypassy   s:  € à)¨8°YÀÐPTØ% t¨Y¼ÀtÐM]Ð_eðgˆà)¨8°YÀ	È4ÐQTÜ  $Ð(8ð:ˆà×ÑÔ.¨wÓ7Ô8Ø×ÑÔ.¨wÓ7Ô8à×ÑÔ.Ø# Y°¸.È$ÐPbØ”= '¨4Ð1AðCóDô 	Eð 	×ÑÔ.Ø# X¨y¸(ÀNÐTXØ ¤}°g¸tÐEUðWóXô 	Yð 	×ÑÔ.Ø# X¨y¸.È$ÐPYØ”= '¨4Ð1AðCóDô 	Eð 	×ÑÔ.òDóEõ 	Fr>   c           	      ó˜   — | j                  t        t        t        ddgz   «      «      «       g d¢}| j                  t        |«      «       y )Nr‰   rn   )r   r   r   r   r   Úur   zMemoryMax=2Gr   zCPUQuota=200%r   r   r   r   z;/home/aria/aria-v3/python/aria_router/isolation/iso_exec.pyz/x/cfg.jsonr   r‰   )r—   r   rU   rV   )r<   Úprods     r+   Ú%test_wrapper_structural_accepts_validz/CagedUnit.test_wrapper_structural_accepts_valid’   s?   € à�‰Ô-¬e´DÐ<LÈfÐ;UÑ4UÓ.VÓWÔXò(ˆð 	�‰Ô-¨dÓ3Õ4r>   c                 ó¤  — dd l mc m} t        | j                  dz  «      }dD ]|  }t
        j                  j                  ||«      }t        j                  t
        j                  j                  |«      d¬«       t        |d«      5 }|j                  d«       d d d «       Œ~ t
        j                  j                  |d«      t
        j                  j                  |d	«      t
        j                  j                  |d
«      }}}t        | j                  dt        | j                  «      |d ||d|g¬«	      }	t        | j                  dz  «      }
|j                  |
|
dz   |
dz   |
dz   |
dz   |
dz   «      }|	j!                  |d«      }d„ }d„ }| j#                   ||t
        j                  j                  |d«      «      «       | j#                   ||t
        j                  j                  |d«      «      «       | j%                  t
        j                  j                  |d«      t'        |d   «      «       | j#                   ||t
        j                  j                  |d«      «      «       | j)                   ||t
        j                  j                  |ddd«      «      «       | j)                   ||t
        j                  j                  |d«      «      «       t        | j                  dt        | j                  «      |d ||d|g¬«	      }|j!                  |d«      }| j%                  t
        j                  j                  |d«      t'        |d   «      «       | j)                   ||t
        j                  j                  |d«      «      «       | j#                   ||t
        j                  j                  |ddd«      «      «       y # 1 sw Y   �Œ«xY w) Nr   Úhome)ú.bashrczstate/budget.jsonzv3repo/code.pyú
normal.txtzproj/main.pyzproj/.git/hooks/pre-commitT)Úexist_okÚwzx
ÚstateÚv3repoÚprojr\   )rF   rG   rH   rI   Ú	state_dirÚ	repo_rootÚprotect_startupÚwrite_allowlistrv   rw   rx   ry   rz   r{   rQ   c                 ó€   ‡— ‰t        | d   «      t        | d   «      z  v ryt        ˆfd„| d   | d   z   D «       «       S )NÚfile_rwÚfile_roFc              3   óp   •K  — | ]-  }‰|k(  xs" ‰j                  |t        j                  z   «      –— Œ/ y ­wr@   ©Ú
startswithr“   Úsep©Ú.0ÚdÚps     €r+   ú	<genexpr>z[CagedUnit.test_build_cfg_threads_state_repo_and_startup.<locals>.blocked.<locals>.<genexpr>°   s.   øè ø€ ÒYÀ!˜1 ™6Ò= Q§\¡\°!´b·f±f±*Ó%=Ó=ÑYùó   ƒ36ÚrwÚro©rK   Úany©rs   rÈ   s    `r+   ÚblockedzHCagedUnit.test_build_cfg_threads_state_repo_and_startup.<locals>.blocked­   sI   ø€ Ø”C˜˜)™Ó%¬¨A¨i©LÓ(9Ñ9Ñ9ØÜÓYÀqÈÁwÐQRÐSWÑQXÑGXÔYÓYÐYÐYr>   c                 óV   ‡— ‰t        | d   «      v xs t        ˆfd„| d   D «       «      S )Nr¿   c              3   óp   •K  — | ]-  }‰|k(  xs" ‰j                  |t        j                  z   «      –— Œ/ y ­wr@   rÂ   rÅ   s     €r+   rÉ   z\CagedUnit.test_build_cfg_threads_state_repo_and_startup.<locals>.writable.<locals>.<genexpr>³   s/   øè ø€ Ò0eÐXY°°a±Ò1S¸1¿<¹<ÈÌBÏFÉFÉ
Ó;SÓ1SÑ0eùrÊ   rË   rÍ   rÏ   s    `r+   ÚwritablezICagedUnit.test_build_cfg_threads_state_repo_and_startup.<locals>.writable²   s.   ø€ Øœ˜A˜i™LÓ)Ð)Òe¬SÓ0eÐ]^Ð_cÑ]dÔ0eÓ-eÐer>   zbudget.jsonzcode.pyr³   rÀ   zmain.pyz.gitÚhooksz
pre-commitr´   F)r}   r~   r   rJ   r7   r“   r˜   ÚjoinÚmakedirsÚdirnamer%   Úwriter   r0   r9   r€   Ú
_build_cfgr—   r‚   rK   r¤   )r<   r„   ÚHÚrelÚfullr*   r·   Úrepor¹   rT   rv   r…   ÚcfgrÐ   rÓ   Úrun_offÚcfg_offs                    r+   Ú-test_build_cfg_threads_state_repo_and_startupz7CagedUnit.test_build_cfg_threads_state_repo_and_startup›   sí  € ç2Ð2Ü�—	‘	˜FÑ"Ó#ˆðBò 	 ˆCä—7‘7—<‘<  3Ó'ˆDÜ�K‰KœŸ™Ÿ™¨Ó-¸Õ=Ü�d˜C“ð   BØ—‘˜”÷ ð  ð		 ô ŸG™GŸL™L¨¨GÓ4´b·g±g·l±lÀ1ÀhÓ6OÔQS×QXÑQX×Q]ÑQ]Ð^_ÐagÓQh�TˆtˆÜ˜tŸy™y°'ÄSÈÏÉÃ^Ð_`Ø,0¸EÈTÐcgØ04¨vô7ˆô �—‘˜TÑ!Ó"ˆØ�y‰y˜˜R %™Z¨¨g©°r¸MÑ7IÈ2ÐPZÉ?Ð\^ÐagÑ\gÓhˆØ�n‰n˜T ?Ó3ˆò	Zò
	fà�‰™ ¤R§W¡W§\¡\°%¸Ó%GÓHÔIØ�‰™ ¤R§W¡W§\¡\°$¸	Ó%BÓCÔDØ�‰”b—g‘g—l‘l 1 iÓ0´#°c¸)±nÓ2EÔFØ�‰™ ¤b§g¡g§l¡l°4¸Ó&CÓDÔEØ×Ñ™ #¤r§w¡w§|¡|°D¸&À'È<Ó'XÓYÔZØ×Ñ™ #¤r§w¡w§|¡|°A°|Ó'DÓEÔFô # 4§9¡9°gÌÈTÏYÉYËÐcdØ04ÀÐQUÐglØ48°6ô;ˆð ×$Ñ$ T¨?Ó;ˆØ�‰”b—g‘g—l‘l 1 iÓ0´#°g¸iÑ6HÓ2IÔJØ×Ñ™ '¬2¯7©7¯<©<¸¸9Ó+EÓFÔGØ�‰™ ¬"¯'©'¯,©,°t¸VÀWÈlÓ*[Ó\Õ]÷? ñ  ús   ÂOÏO	N)ra   )Ú__name__Ú
__module__Ú__qualname__r=   rC   rM   rY   re   rk   rt   r‡   r‹   rŸ   r¢   r¥   r¬   r°   rá   © r>   r+   r.   r.      sU   „ ò@òóTò6ògòCòBò	(ò9ò9ò9ò`òFò25ó'^r>   r.   c                   ó@   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zy
)ÚReadLastHardeningzYReview #7: Scope-Stop vor dem Lesen + rennfreies _read_last (O_NOFOLLOW/fstat/Pfadcheck).c                 ó  — t        j                  «       | _        t        | j                  j                  «      | _        | j
                  dz  | _        | j                  j                  dd¬«       | j
                  dz  j                  «        y )Nr1   z{}r   r   r¶   )	r3   r4   r5   r   r6   r7   r9   r:   r8   r;   s    r+   r=   zReadLastHardening.setUpÈ   sa   € Ü×/Ñ/Ó1ˆŒ	Ü˜Ÿ™Ÿ™Ó(ˆŒ	Ø—I‘I Ñ+ˆŒ	Ø�	‰	×Ñ˜T¨GÐÔ4Ø	�‰�S‰×ÑÕ!r>   c                 ó8   — | j                   j                  «        y r@   rA   r;   s    r+   rC   zReadLastHardening.tearDownÏ   rD   r>   c           
      ó  ‡‡— dd l mc m} ddlmŠ  G ˆˆfd„dt
        «      } || j                  dz  dt        | j                  «      t        | j                  «      t        «       t        | j                  «      d¬«      S )	Nr   )Ú	RunResultc                   ó:   •— e Zd Zˆfd„Zd„ Zˆfd„Zd„ Zˆ ˆfd„Zy)ú&ReadLastHardening._runner.<locals>.Recc                 ó(   •— ‰j                  d«       y )NÚstop©Úappend)r<   r®   Úorders     €r+   Ú
stop_scopez1ReadLastHardening._runner.<locals>.Rec.stop_scope×   s   ø€ Ø—‘˜VÕ$r>   c                  ó   — y r@   rå   )r<   r®   s     r+   Úreset_scopez2ReadLastHardening._runner.<locals>.Rec.reset_scopeÚ   s   € Ør>   c                 ó(   •— ‰j                  d«       y)Nr&   r>   rð   )r<   r…   Úlimitrò   s      €r+   Ú
_read_lastz1ReadLastHardening._runner.<locals>.Rec._read_lastÝ   s   ø€ Ø—‘˜VÔ$Ør>   c                  ó   — y)NTrå   r;   s    r+   Úbus_reachablez4ReadLastHardening._runner.<locals>.Rec.bus_reachableá   s   € Ør>   c                 ó0  •— 	 |j                  «        |j                  d¬«       |j                  |j                  |j
                  fD ]  }	 |j                  «        Œ ‰j                  d«        ‰ddd¬«      S # t        $ r Y Œ`w xY w# t        $ r Y ŒLw xY w)Né   )ÚtimeoutÚ	superviseTr   r>   )Ú	exit_codeÚstdout)ÚkillÚwaitÚ	ExceptionÚstdinr   ÚstderrÚcloserñ   )r<   Úprocri   ÚstartedÚstreamrë   rò   s        €€r+   Ú
_supervisez1ReadLastHardening._runner.<locals>.Rec._superviseä   s•   ø€ ðØ—I‘I”KØ—I‘I a�IÔ(ð  $Ÿz™z¨4¯;©;¸¿¹ÐDò �FðØŸ™�ðð
 —‘˜[Ô)Ù  °¸3Ô?Ð?øô !ò Ùðûô
 %ò Ùðús#   ƒ"A: ÁB	Á:	BÂBÂ		BÂBN)râ   rã   rä   ró   rõ   rø   rú   r
  )rë   rò   s   €€r+   ÚRecrí   Ö   s   ø„ ô%òôòö@r>   r  r¶   r\   F)rF   rG   rH   rI   r»   r¼   )
r}   r~   r   rb   rë   r   r7   rJ   r9   rK   )r<   rò   r„   r  rë   s    `  @r+   Ú_runnerzReadLastHardening._runnerÒ   s\   ù€ ß2Ð2Ý0÷	@Ô"ô 	@ñ8 �4—9‘9˜s‘?¨G¼sÀ4Ç9Á9»~Ü  §¡›^¼#»%Ì3ÈtÏyÉyË>Ø#(ô*ð 	*r>   c                 ó6  — g }| j                  |«      }|j                  t        t        t        dgz   «      di d«      «       | j                  d|«       | j                  d|«       | j                  |j                  d«      |j                  d«      d|› �«       y )Nz	/bin/truer>   rR   r&   rï   z(Scope muss VOR dem Lesen gestoppt sein: )r  rT   r   rU   rV   r‚   Ú
assertLessÚindex)r<   rò   r   s      r+   Útest_scope_stopped_before_readz0ReadLastHardening.test_scope_stopped_before_readö   s�   € ØˆØ�L‰L˜ÓˆØ	�‰Œg”eœD K =Ñ0Ó1°3¸¸BÓ?Ô@Ø�‰�f˜eÔ$Ø�‰�f˜eÔ$Ø�‰˜Ÿ™ FÓ+¨U¯[©[¸Ó-@ØBÀ5À'ÐJõ	Lr>   c                 óˆ  — dd l mc m} t        | j                  dz  dt        | j                  «      t        | j                  «      t        «       d¬«      }| j                  dz  }|j                  «        |j                  t        | j                  dz  «      t        |«      dddd«      } ||«       |j                  |d	«      S )
Nr   r¶   r\   F)rF   rG   rH   rI   r¼   Úwsrv   Ú i   )r}   r~   r   r   r7   rJ   r9   rK   r8   r€   rø   )r<   Úmaker„   rT   r  r…   s         r+   Ú_readzReadLastHardening._readÿ   s”   € ß2Ð2Ü˜tŸy™y¨3™¸Ì3ÈtÏyÉyË>Ü),¨T¯Y©Y«ÄcÃeÐ]bôdˆà�Y‰Y˜ÑˆØ
�‰Œ
Ø�y‰yœ˜TŸY™Y¨Ñ-Ó.´°B³¸¸RÀÀRÓHˆÙˆRŒØ�~‰~˜d DÓ)Ð)r>   c                 óH   — | j                  | j                  d„ «      d«       y )Nc                 ó*   — | dz  j                  d«      S )Núlast.txtÚHELLO)r:   ©r  s    r+   ú<lambda>z?ReadLastHardening.test_reads_regular_last_txt.<locals>.<lambda>
  s   € °°Z±×/KÑ/KÈGÓ/T€ r>   ó   HELLO©rW   r  r;   s    r+   Útest_reads_regular_last_txtz-ReadLastHardening.test_reads_regular_last_txt	  s   € Ø×Ñ˜Ÿ™Ñ$TÓUÐW_Õ`r>   c                 óŽ   ‡— | j                   dz  Š‰j                  d«       | j                  | j                  ˆfd„«      d«       y )Nz
secret.txtÚ	TOPSECRETc                 ó6   •— t        j                  ‰| dz  «      S ©Nr  )r“   Úsymlink)r  Úsecrets    €r+   r  zBReadLastHardening.test_symlink_last_txt_rejected.<locals>.<lambda>  s   ø€ ¬r¯z©z¸&À"ÀzÁ/Ó/R€ r>   r>   )r7   r:   rW   r  )r<   r$  s    @r+   Útest_symlink_last_txt_rejectedz0ReadLastHardening.test_symlink_last_txt_rejected  s:   ø€ Ø—‘˜\Ñ)ˆØ×Ñ˜+Ô&Ø×Ñ˜Ÿ™Ó$RÓSÐUXÕYr>   c                 óH   — | j                  | j                  d„ «      d«       y )Nc                 ó2   — t        j                  | dz  «      S r"  )r“   Úmkfifor  s    r+   r  z?ReadLastHardening.test_fifo_last_txt_rejected.<locals>.<lambda>  s   € ¬r¯y©y¸¸j¹Ó/I€ r>   r>   r  r;   s    r+   Útest_fifo_last_txt_rejectedz-ReadLastHardening.test_fifo_last_txt_rejected  s   € Ø×Ñ˜Ÿ™Ñ$IÓJÈCÕPr>   N)râ   rã   rä   Ú__doc__r=   rC   r  r  r  r  r%  r)  rå   r>   r+   rç   rç   Å   s2   „ Ùcò"òò"*òHLò*òaòZó
Qr>   rç   é   zLandlock ABI < 4c                   ó6   — e Zd ZdZd„ Zd„ Zd	d„Zd„ Zd„ Zd„ Z	y)
ÚCagedIntegrationz§Echter systemd --user --scope. Braucht den User-Bus; ohne Bus wird NICHT still
    uebersprungen, sondern mit klarer Meldung auf die Voraussetzung geprueft (gezaehlt).c                 ór  — t        «       s| j                  d«       t        j                  «       | _        t        | j                  j                  «      | _        | j                  dz  | _        | j                  j                  «        | j                  dz  | _
        | j                  j                  dd¬«       y )NzuVORAUSSETZUNG FEHLT: systemd --user Bus nicht erreichbar (XDG_RUNTIME_DIR/DBUS). Caged-Integration kann nicht laufen.r0   r1   r2   r   r   )r   ÚskipTestr3   r4   r5   r   r6   r7   r0   r8   r9   r:   r;   s    r+   r=   zCagedIntegration.setUp  s„   € Ü!Ô#Ø�M‰Mð Yô Zä×/Ñ/Ó1ˆŒ	Ü˜Ÿ™Ÿ™Ó(ˆŒ	Ø—I‘I Ñ&ˆŒ	Ø�	‰	�‰ÔØ—I‘I Ñ+ˆŒ	Ø�	‰	×Ñ˜_°wÐÕ?r>   c                 ó8   — | j                   j                  «        y r@   rA   r;   s    r+   rC   zCagedIntegration.tearDown%  rD   r>   c           
      ó˜   — t        | j                  dt        | j                  «      dt	        «       t        | j
                  «      d|¬«      S )Nr\   z
/home/ariaF)rF   rG   rH   rI   r»   r¼   r½   )r   r0   rJ   r9   rK   r7   )r<   r½   s     r+   rM   zCagedIntegration.runner(  s<   € ô   §	¡	°7ÄcÈ$Ï)É)ÃnØ*6ÄSÃUÜ*-¨d¯i©i«.È%Ø0?ôAð 	Ar>   c           	      ó®  — t        t        ddt        ddgz   «      }| j                  «       j	                  t        |di d«      «      }| j                  |j                  d|j                  › d|j                  j                  d	¬
«      d d › �«       | j                  |j                  j                  «       d«       | j                  d|j                  «       y )Nr   r   Úokr  r>   é<   zerr=z stderr=Úreplace)Úerrorsr_   r  s   turn.completed)rU   rV   r	   rM   rT   r   r—   r3  rX   Ústderr_tailÚdecoderW   ÚartifactÚstripr‚   r   )r<   r†   r   s      r+   Útest_real_scope_runs_fake_codexz0CagedIntegration.test_real_scope_runs_fake_codex4  s®   € Ü”TÐ/°´ÈÈgÐVÑVÓWˆØ�K‰K‹M×Ñœg d¨C°°RÓ8Ó9ˆØ�‰˜Ÿ™  Q§\¡\ N°(¸1¿=¹=×;OÑ;OÐW`Ð;OÓ;aÐbfÐcfÐ;gÐ:hÐiÔjØ×Ñ˜Ÿ™×)Ñ)Ó+¨XÔ6Ø�‰Ð'¨¯©Õ2r>   c           	      ón  ‡
‡— dd l Šdd l}t        «       }| j                  t        j
                  |d«       t        j                  d|¬«      \  }Š
t        j                  |«       t        t        ddt        dd‰
gz   «      }ˆ
ˆfd	„}|j                  |¬
«      }|j                  «        | j                  |g¬«      j!                  t#        |di d«      «      }|j%                  d«       | j'                  |j(                  d«       t+        j,                  «       dz   }t/        t1        ‰
«      j3                  «       «      }	t5        |	«      sOt+        j,                  «       |k  r8t+        j6                  d«       t5        |	«      st+        j,                  «       |k  rŒ8| j9                  t5        |	«      d|	› d�«       y )Nr   Tú.ariaprobe_pid_©ÚprefixÚdirr   r   ÚsleepÚ30c                  óš  •— t        j                  «       dz   } t        j                  «       | k  r@	 t        t        ‰«      j	                  «       «      dkD  rn	 t        j                  «       | k  rŒ@t        j                  t        j                  «       ‰j                  «       y # t
        t        f$ r t        j                  d«       Y Œqw xY w)Né   r   gš™™™™™©?)ÚtimeÚ	monotonicÚintr   Ú	read_textÚOSErrorrd   rA  r“   r  ÚgetpidÚSIGTERM)ÚdeadlineÚpidfileÚsignals    €€r+   Ú	send_termzKCagedIntegration.test_sigterm_stops_scope_and_grandchild.<locals>.send_termE  s—   ø€ Ü—~‘~Ó'¨!Ñ+ˆHÜ—.‘.Ó" XÒ-ð%Üœ4 ›=×2Ñ2Ó4Ó5¸Ò9Øð :ô —.‘.Ó" XÓ-ô �G‰G”B—I‘I“K §¡Õ0øô  ¤Ð,ò %Ü—J‘J˜tÖ$ð%ús   ±%B# Â#$C
Ã	C
)Útarget©r½   r>   é   rR   ÚBRIDGE_TERMINATEDrD  çš™™™™™¹?úEnkelprozess z0 laeuft noch (Scope nach SIGTERM nicht gestoppt))rN  Ú	threadingr
   Ú
addCleanuprœ   r�   r3   Úmkstempr“   r  rU   rV   r	   ÚThreadÚstartrM   rT   r   rÕ   rW   rX   rE  rF  rG  r   rH  r,   rA  r—   )r<   rV  Ú	probe_dirÚfdr†   rO  Útr   rL  r   rM  rN  s             @@r+   Ú'test_sigterm_stops_scope_and_grandchildz8CagedIntegration.test_sigterm_stops_scope_and_grandchild;  sP  ù€ ãÛÜ*Ó,ˆ	Ø�‰œŸ™ y°$Ô7Ü×&Ñ&Ð.?ÀYÔO‰ˆˆGÜ
�‰�ŒÜ”TÐ/°´ÈÐQUÐW^Ð_Ñ_Ó`ˆõ	1ð ×Ñ IÐÓ.ˆØ	�‰Œ	Ø�K‰K¨¨ˆKÓ4×8Ñ8¼ÀÀsÈBÐPRÓ9SÓTˆØ	�‰ˆrŒ
Ø×Ñ˜Ÿ™Ð':Ô;Ü—>‘>Ó# aÑ'ˆÜ”$�w“-×)Ñ)Ó+Ó,ˆÜ˜sÔ#¬¯©Ó(8¸8Ò(CÜ�J‰J�sŒOô ˜sÔ#¬¯©Ó(8¸8Ó(Cà�‰œ SÓ)¨]¸3¸%Ð?oÐ+pÕqr>   c           	      ó>  — t        «       }| j                  t        j                  |d«       t	        j
                  d|¬«      \  }}t        j                  |«       t        t        ddt        dd|gz   «      }t        j                  «       }| j                  |g¬«      j                  t        |d	i d
«      «      }| j!                  |j"                  d«       | j%                  t        j                  «       |z
  d«       t        j                  «       dz   }d }t        j                  «       |k  r$	 t'        t)        |«      j+                  «       «      }	 | j3                  |d«       t5        |«      sOt        j                  «       |k  r8t        j0                  d«       t5        |«      st        j                  «       |k  rŒ8| j7                  t5        |«      d|› d�«       y # t,        t.        f$ r t        j0                  d«       Y nw xY wt        j                  «       |k  rŒòŒÏ)NTr=  r>  r   r   rA  rB  rQ  r>   é   ÚTIMEOUTé   rD  rT  z!Enkel-PID wurde nicht geschriebenrU  z" laeuft noch (Scope nicht gekillt))r
   rW  rœ   r�   r3   rX  r“   r  rU   rV   r	   rE  rF  rM   rT   r   rW   rX   r  rG  r   rH  rI  rd   rA  ÚassertIsNotNoner,   r—   )	r<   r[  r\  rM  r†   r  r   rL  r   s	            r+   Ú'test_timeout_kills_scope_and_grandchildz8CagedIntegration.test_timeout_kills_scope_and_grandchildZ  s¤  € ô +Ó,ˆ	Ø�‰œŸ™ y°$Ô7Ü×&Ñ&Ð.?ÀYÔO‰ˆˆGÜ
�‰�ŒÜ”TÐ/°´ÈÐQUÐW^Ð_Ñ_Ó`ˆÜ—.‘.Ó"ˆØ�K‰K¨¨ˆKÓ4×8Ñ8¼ÀÀsÈBÐPQÓ9RÓSˆØ×Ñ˜Ÿ™ yÔ1Ø�‰œŸ™Ó(¨7Ñ2°BÔ7ä—>‘>Ó# aÑ'ˆØˆÜ�n‰nÓ Ò)ð Üœ$˜w›-×1Ñ1Ó3Ó4�Øð 	×Ñ˜SÐ"EÔFÜ˜sÔ#¬¯©Ó(8¸8Ò(CÜ�J‰J�sŒOô ˜sÔ#¬¯©Ó(8¸8Ó(Cà�‰œ SÓ)¨]¸3¸%Ð?aÐ+bÕcøô œZÐ(ò  Ü—
‘
˜3–ð úô	 �n‰nÓ Ó)øs   Ä-"G Ç$HÈHN)rå   )
râ   rã   rä   r*  r=   rC   rM   r;  r^  rd  rå   r>   r+   r-  r-    s*   „ ñ\ò	@òó
Aò3òró>dr>   r-  Ú__main__) r*  r“   rœ   r3   rE  ÚunittestÚpathlibr   Úaria_router.isolationr   Ú"aria_router.isolation.caged_runnerr   r   rb   r   r   Útests.iso_helpersr	   r
   r   r   rV   rG  Úboolr,   ÚTestCaser.   rç   Ú
skipUnlessr-  râ   Úmainrå   r>   r+   ú<module>ro     sð   ðñcã 	Û Û Û Û Ý å /ß Vß :ß gÓ gà ¨)°YÀÈ(ØÐ! >°4Ð9KÈTØ�w ð&€ð
�cð ˜dó ôf^�×!Ñ!ô f^ôRMQ˜×)Ñ)ô MQð` €×Ñ‘\“^ qÑ(Ð*<Ó=ô\d�x×(Ñ(ó \dó >ð\dð~ ˆzÒØ€H‡M�M…Oð r>   