
    ~jT2                       U d Z ddlmZ ddlZddl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Zded<   d	Zded
<   dddZded<    ej$                  d      Zded<   dZded<   d!dZd"dZd#dZd$dZd%dZd%dZd&dZd'dZ	 	 	 	 	 	 	 	 d(dZddd	 	 	 	 	 	 	 	 	 d)dZd*dZd+dZ e!d k(  r e" e              y),zISeal and verify the minimal immutable candidate for workspace quarantine.    )annotationsN)Path)Finalz(task26-workspace-quarantine-candidate-v1r   _SCHEMAz3dualcoach-workspace-quarantine-candidate-binding-v1_BINDING_SCHEMAz3gateway/platforms/rehearsal_workspace_quarantine.pyzhermes_cli/rehearsal_reset.py)z0gateway.platforms.rehearsal_workspace_quarantinezhermes_cli.rehearsal_reset_MODULE_MEMBERSzD(?i)(bot[_-]?token|api[_-]?key|authorization:\\s*bearer|sk-[a-z0-9])_FORBIDDEN_SECRET_PATTERNzBhermes-dualcoach-rehearsal-reset = hermes_cli.rehearsal_reset:main_ENTRY_POINTc                R    t        j                  | ddd      j                  d      S )NT),:)	sort_keys
separatorsensure_asciiutf-8)jsondumpsencodevalues    =.omo/senpi-task/task26/seal_workspace_quarantine_candidate.py
_canonicalr      s$    ::et
QUV]]^eff    c                H    t        j                  |       j                         S N)hashlibsha256	hexdigestr   s    r   _sha256r      s    >>% **,,r   c                4    t        | j                               S r   )r   
read_bytes)paths    r   _sha256_filer#   "   s    4??$%%r   c                H    | j                  |       | j                  d       y )N   )write_byteschmod)r"   r   s     r   _write_sealedr(   &   s    UJJur   c                    | j                         }| j                         s2| j                         r"t        j                  |j
                        dk7  rt        | d      y )N@   is not sealed)lstat
is_symlinkis_dirstatS_IMODEst_modeAssertionErrorr"   labelinfos      r   _assert_private_directoryr6   +   sK    ::<Ddll1Ku1Twn566 2Ur   c                    | j                         }| j                         sA| j                         r1|j                  dk7  s"t	        j
                  |j                        dk7  rt        | d      y )N   r%   r+   )r,   r-   is_filest_nlinkr/   r0   r1   r2   r3   s      r   _assert_sealed_filer;   1   s[    ::<D$--12DUYUaUaHbfkHkwn566 Ilr   c           	        t        j                  |       5 }t        |j                               }t        t        j                               |z
  }|rt        dt        |             |j                  d      j                  d      }t        |j                         vrt        d      t        j                         D ci c]  \  }}||j                  |       }}}t        d |j                         D              rt        d      |j                         D ci c]  \  }}|t        |       }	}}d d d        t        t        t         	d            }
t         |
|	d|	fS c c}}w c c}}w # 1 sw Y   <xY w)	Nzwheel lacks cleanup module(s): .hermes_agent-0.17.0.dist-info/entry_points.txtr   z*wheel lacks the canonical cleanup launcherc              3  d   K   | ](  }t         j                  |j                  d              * yw)r   N)r	   searchdecode).0sources     r   	<genexpr>z&_binding_from_wheel.<locals>.<genexpr>A   s(     nVmF(//g0FGVms   .0z6wheel closure contains a forbidden secret-shaped tokenschemamodules)rE   candidate_digestrF   )zipfileZipFilesetnamelistr   valuesr2   sortedreadr@   r
   
splitlinesitemsanyr   r   r   )wheelarchivenamesmissingentry_pointsmodulemembermodule_sourcesrB   rF   digests              r   _binding_from_wheelr[   7   sR   		7G$$&'o,,./%7 #B6'?BS!TUU||$TU\\]de|6688 !MNNM\MbMbMdeMd>66&',,v"66MdenVdVkVkVmnn !YZZAOAUAUAWXAW~vv676?*AWX 
  Z?w OPQF%6gVX___ f Y 
 	s+   B+E2E&AE2E,4E2&E22E;c           	     |   t        j                  | j                  d            t        j                  |j                  d            }t        t              rt        |t              st        d      h d}t        fd|D              rt        d      d   d   k7  rt        d	      |j                  d
      d
   k7  s|j                  d      d   k7  rt        d      t        |j                  d      t              st        d      d
   d   d   d   |d   t        |       t        |      dS )Nr   encodingz(preflight quarantine evidence is invalid>   event_idreceipt_sha256pre_tree_digestrG   post_tree_digestc              3  ^   K   | ]$  }t        j                  |      t                & y wr   )
isinstancegetstr)rA   keyreceipts     r   rC   z$_preflight_record.<locals>.<genexpr>T   s'     
M<LSz'++c*C00<Ls   *-z'preflight quarantine receipt is invalidra   rb   z)preflight quarantine tree digest mismatchr_   rG   z%preflight quarantine index is invalidindex_entry_sha256r`   )r_   rG   tree_digestr`   ri   receipt_file_sha256index_file_sha256)
r   loads	read_textrd   dictr2   rQ   re   rf   r#   )receipt_path
index_pathindexrequired_receiptrh   s       @r   _preflight_recordrt   H   s?   jj///ABGJJz++W+=>Egt$Jud,CGHH 
M<L
MMFGG !W-?%@@HIIyy
 33uyyAS7TX_`rXs7sDEEeii 45s;DEEJ'#$6712!"23#$89+L9)*5 r   c                0   t        |       dz   }|j                         }| d   }t        |t              sJ t        | d   dt        |      |t        |      t        t        |            dd|d|j                   t        |      t        |      t        dd	S )
N   
rF   rG   cleanup-binding.jsonr   rF   r   legacy_reset_import_countz
artifacts/)r"   r   bytesentry_point)rE   rG   candidate_binding_pathcandidate_binding_sha256rF   active_closurepreflight_workspace_quarantinerR   )
r   r!   rd   ro   r   r   rM   namelenr
   )bindingrR   	preflightbinding_byteswheel_bytesmodule_hashess         r   _candidate_manifestr   g   s    
 w'%/M""$KI&MmT***#$67"8$+M$: m,j78)*

 +4 -k*%'	
 r   preflight_receiptpreflight_indexc               2   | j                         } | j                         s| j                         st        d      |d u |d u k7  rt        d      t	        |       \  }}||t        ||      nd }t        || |      }t        |d         }|d| z  }	|	j                         s|	j                         rt        d|	       |j                  ddd       |	j                  d	       |	d
z  }
|
j                  d	       |
| j                  z  }t        j                  | |       |j                  d       t        |	dz  t!        |      dz          t        |	dz  t!        |      dz          |
j                  d       |	j                  d       t#        |	       |	S )Nzwheel is not a regular filez5preflight receipt and index must be supplied togetherrG   z&task26-workspace-quarantine-candidate-zcandidate already exists: i  T)modeparentsexist_ok)r   	artifactsr%   rw   rv   candidate-manifest.jsonr*   )resolver-   r9   r2   r[   rt   r   rf   existsFileExistsErrormkdirr   shutilcopyfiler'   r(   r   verify)rR   output_parentr   r   r   _modulesr   manifestrZ   rootr   copied_wheels               r   sealr      s    MMOE:;;T!$'>?TUU+E2GX (_-H 	+_= 
 #7E9=H+,-FCF8LLD{{}) :4&ABBUD4@JJEJ{"IOOOuzz)L
OOE<(u$//G1Du1LM$22Jx4H54PQOOEJJu
4LKr   c           	     	   | j                         } t        | d       | dz  }t        |d       | dz  | dz  h}| dz  }| dz  }t        |d       t        |d       t        j                  |j                  d	            }t        j                  |j                  d	            }t        |t              rt        |t              st        d
      t        |      h dk7  s|j                  d      t        k7  rt        d      |j                  d      }t        |t              rt        |      t        t              k7  rt        d      t        t        t        |d            }|j                  d      |k7  rt        d      |j                  d      t        k7  s|j                  d      |k7  rt        d      |j                  d      dk7  rt        d      |j                  d      t        |j!                               k7  rt        d      |j                  d      |k7  rt        d      |j                  d      }	t        |	t              r$|	t#        |      t        t        |            ddk7  rt        d      |j                  d      }
|
Vt        |
t              rt        |
      h dk7  rt        d      t%        d  |
j'                         D              st        d      |j                  d!      }t        |t              rt        |      h d"k7  rt        d#      | t)        |d$         z  }|j+                  |       t        |d%       |d&   t-        |      k7  s |d'   |j/                         j0                  k7  rt        d(      |d)   t2        k7  rt        d*      t5        j6                  |      5 }t        j'                         D ]d  \  }}|j9                  |      }||   t        |      k7  rt        d+|       t:        j=                  |j?                  d            s[t        d,       t2        |j9                  d-      j?                  d      jA                         vrt        d.      	 d d d        | jC                  d/      D ch c]  }|jE                         s| }}||k7  rt        d0      d1d2|t-        |      t-        |      t-        |      tG        t              d3S # 1 sw Y   zxY wc c}w )4Nzcandidate rootr   zcandidate artifactsr   rw   zcandidate manifestzcandidate bindingr   r]   zcandidate metadata is invalid>   rE   rF   rG   rE   z#candidate binding schema is invalidrF   z%candidate binding modules are invalidrD   rG   z#candidate binding digest is invalidz$candidate manifest digest is invalidr|   z!candidate binding path is invalidr}   z!candidate binding hash is invalidz#candidate module binding is invalidr~   r   rx   z#candidate active closure is invalidr   >   r_   rj   r`   rG   rl   ri   rk   z'candidate preflight evidence is invalidc              3  n   K   | ]-  \  }}|d k7  st        |t              xr t        |      dk(   / yw)r_   @   N)rd   rf   r   )rA   rg   r   s      r   rC   zverify.<locals>.<genexpr>   s8     xQb:3fimwfw:eS)>c%jB.>>Qbs   5%5rR   >   r"   rz   r   r{   z#candidate wheel metadata is invalidr"   zcandidate wheelr   rz   z!candidate wheel digest is invalidr{   z candidate entry point is invalidz%candidate module differs from wheel: z:candidate closure contains a forbidden secret-shaped tokenr=   z&candidate wheel entry point is invalid*zcandidate inventory is invalidz5task26-workspace-quarantine-candidate-verification-v1PASS)rE   statusrG   candidate_manifest_sha256r}   wheel_sha256module_count)$r   r6   r;   r   rm   rn   rd   ro   r2   rJ   re   r   r   r   r   r   r!   rM   allrP   rf   addr#   r/   st_sizer
   rH   rI   rN   r	   r?   r@   rO   rglobr9   r   )r   r   expected_filesmanifest_pathbinding_pathr   r   rF   rZ   closurer   
wheel_info
wheel_pathrS   rW   rX   rB   r"   actual_filess                      r   r   r      s   <<>Dd$45{"Ii)>?66?U8UVN44M00L';<&9:zz-1171CDHjj///ABGh%Z-F<==
7|@@GKKPXDY]lDlBCCkk)$Ggt$GO8L(LDEEZ?w OPQF{{%&&0BCC||H(HLL9K,LPV,VCDD||,-1GG@AA||./7<;R;R;T3UU@AA||I')BCCll+,Gw%gj12)*
 
 BCC=>I)T*c)n A
 /
 !!JKKxQZQ`Q`Qbxx !JKKg&Jj$'3z?>h+hBCCJv.//Jz"
$56(|J77:g;NR\RaRaRcRkRk;k@AA- L0?@@		$-335NFF\\&)Fv'&/1$'LVH%UVV(//g0FG$%abb 6 w||,\]ddelmxxzz !IJJ { 
% &*ZZ_G_TD_LG~%=>>I"%1-%@$0$>$Z0O,  
%	$ Hs    9A/S.)AS.S:&S:.S7c            	        t        j                         } | j                  dt               | j                  dt        t        t              j                         j                  d   dz  dz         | j                  dt               | j                  d	t               | j                  d
t               | j                         }	 |j                  t        |j                        }no|j                  Rt        |j                  |j                  |j                  |j                        }i t        |      dt        |      i}n| j                  d       t+        t-        j.                  d             y# t         t"        t$        t&        j(                  f$ r6}t+        t-        j.                  dt        |      dd             Y d }~yd }~ww xY w)Nz--wheel)typez--output-parent   evidencetask26)r   defaultz--verifyz--preflight-receiptz--preflight-indexr   candidate_rootz&one of --wheel or --verify is requiredFAIL)r   errorT)r   r8   r   )argparseArgumentParseradd_argumentr   __file__r   r   
parse_argsr   rR   r   r   r   r   rf   r   r2   r   OSErrorrH   
BadZipFileprintr   r   )parserargsresultr   excs        r   mainr     s   $$&F
	-
X&&(003j@8K  
 
.
-D9
+$7D;;"DKK(FZZ#

"""&"8"8 $ 4 4	D CtB&6D	BFLLAB 
$**Vt
,-	 OWg6H6HI djjFSX>$OPs   BE: :#G,GG__main__)r   objectreturnrz   )r   rz   r   rf   )r"   r   r   rf   )r"   r   r   rz   r   None)r"   r   r4   rf   r   r   )rR   r   r   z(tuple[dict[str, object], dict[str, str]])rp   r   rq   r   r   dict[str, object])r   r   rR   r   r   zdict[str, object] | Noner   r   )
rR   r   r   r   r   Path | Noner   r   r   r   )r   r   r   r   )r   int)#__doc__
__future__r   r   r   r   r   rer/   rH   pathlibr   typingr   r   __annotations__r   r   compiler	   r
   r   r   r#   r(   r6   r;   r[   rt   r   r   r   r   __name__
SystemExit r   r   <module>r      s*   O "     	    ; ;N N8m"A  $.2::.u#v 5 vZe Zg-&
77`"> ( 	D &*#'### #	#
 !# 
#LTn@ z
TV
 r   