
    Xj.=                       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dlmZ  ed      Z ed      Zed	z  Zed
z  Zedz  Zej,                   eedd      z  Z G d de      Ze G 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Z$d)dZ%d*dZ&d+dZ'd,dZ(d-dZ)d.dZ*e+d k(  r e, e*             y)/zGOne-shot descriptor-bound permission inventory and bounded mode repair.    )annotationsN)	dataclass)Path)Anyz)/home/cube/.hermes/profiles/dualcoachtestz[/home/cube/projects/richard/traning coach/.omo/evidence/task26/reset-controller-st_01a0054dzschema-contract.jsonz$live-scope-permission-inventory.jsonz/live-scope-batch-permission-repair-receipt.json
O_NOFOLLOWc                      e Zd Zy)RepairErrorN)__name__
__module____qualname__     L.omo/evidence/task26/reset-controller-st_01a0054d/batch_permission_repair.pyr	   r	      s    r   r	   c                  J    e Zd ZU ded<   ded<   ded<   ded<   ded<   ded	<   y
)Heldstrpathintfdos.stat_resultbeforekindcontent_sha256original_modeN)r
   r   r   __annotations__r   r   r   r   r      s#    
IG
Ir   r   c                V    t        j                  | ddd      dz   j                         S )NT),:)	sort_keys
separatorsensure_ascii
)jsondumpsencodevalues    r   	canonicalr(   &   s'    JJuRVWZ^^ffhhr   c                H    t        j                  |       j                         S N)hashlibsha256	hexdigest)raws    r   shar/   *   s    >>#((**r   c                    | j                   | j                  | j                  | j                  | j                  | j
                  | j                  | j                  fS r*   )st_devst_inost_uidst_gidst_nlinkst_sizest_mtime_nsst_modeinfos    r   identityr;   .   s@    KKdkk4;;t||dll, ,r   c                    | j                   | j                  | j                  | j                  | j                  | j
                  | j                  fS r*   )r1   r2   r3   r4   r5   r6   r7   r9   s    r   	invariantr=   3   s:    KKdkk4;;t|| r   c           	         | j                   | j                  | j                  | j                  t	        t        j                  | j                        d      | j                  | j                  | j                  dS )N04o)devinodeuidgidmodenlinksizemtime_ns)r1   r2   r3   r4   formatstatS_IMODEr8   r5   r6   r7   r9   s    r   
stat_valuerK   8   sV    ;;T[[QUQ\Q\4<<5u=LLd.>.>@ @r   c                @   | j                         s| j                         rt        d| j                         t	        |      }t        j                  d| j                        \  }}	 t        j                  |d       d}|t        |      k  r+|t        j                  |||d        z  }|t        |      k  r+t        j                  |       t        j                  |       d}t        j                  ||        t        j                  | j                  t        j                   t        j"                  z  t$        z        }	 t        j                  |       t        j                  |       	 |dk\  rt        j                  |       	 t        j&                  |       t+        |      S # t        j                  |       w xY w# t(        $ r Y t+        |      S w xY w# |dk\  rt        j                  |       	 t        j&                  |       w # t(        $ r Y w w xY wxY w)Nzreceipt already exists: z.batch-permission-)prefixdir  r   )exists
is_symlinkr	   namer(   tempfilemkstempparentosfchmodlenwritefsyncclosereplaceopenO_RDONLYO_DIRECTORYFLAGSunlinkFileNotFoundErrorr/   )r   r'   r.   r   	temporaryoffsetrV   s          r   atomic_writerf   >   s   {{})4TYYK@AA
E
C$$,@dkkRMB	
		"es3xbhhr3vw<00F s3x




9d#bkkBNN&BU&JK	HHVHHV7HHRL	IIi  s8O HHV ! 	s8O		 7HHRL	IIi   		sb   )AG :BG F) G 	G )G  G 	GGH8HH	HHHHc                R   |j                  d      }t        j                  |       }	 |d d D ]  }t        j                  |t        j                  t        j
                  z  t        z  |      }t        j                  |      }t        j                  |j                        r!|j                  t        j                         k7  r#t        j                  |       t        d|       t        j                  |       |} ||d   fS # t        $ r t        j                  |        w xY w)N/rP   dir_fdzunsafe path component: )splitrW   dupr^   r_   r`   ra   fstatrI   S_ISDIRr8   r3   getuidr\   r	   	Exception)root_fdrelativepartsr   partnxtr:   s          r   open_parentrv   [   s    NN3E	B#2JD''$bnn <u DRPC88C=D<<-		1K!$;H:"FGGHHRLB  59} 
s   CD  D&c                    t        | |      \  }}	 	 t        j                  ||d      t        j                  |       S # t        $ r Y t        j                  |       y w xY w# t        j                  |       w xY w)NFrj   follow_symlinks)rv   rW   rI   r\   rc   )rq   rr   rV   rS   s       r   	path_statrz   m   si    w1LFD	774F 	 ! 	
	 	s!   ? 	A A# A  A# #A:c                   |dk(  rt        j                  | dt         j                         t        j                         }t        j
                  | d      x}r*|j                  |       t        j
                  | d      x}r*|j                         S t        t        j                  |             }t        dj                  d |D                    S )Nfiler          c              3  F   K   | ]  }t        j                  |        y wr*   )rW   fsencode).0rS   s     r   	<genexpr>zhash_fd.<locals>.<genexpr>   s     >"++d+s   !)rW   lseekSEEK_SETr+   r,   readupdater-   sortedlistdirr/   join)r   r   r'   chunknamess        r   hash_fdr   x   s    v~
Q$ wwr;//e/LL wwr;//e/  2::b>"Euzz>>>??r   c                ~   t        j                  | dt         j                         g }t        j                  | d      x}r*|j	                  |       t        j                  | d      x}r*	 t        j                  dj                  |            S # t        t
        j                  f$ r}t        d|       |d }~ww xY w)Nr   r}   r   zinvalid JSON: )rW   r   r   r   appendr#   loadsr   UnicodeDecodeErrorJSONDecodeErrorr	   )r   rr   chunksr   excs        r   read_json_fdr      s    HHRBKK F772{+
+%
+e 772{+
+%
+@zz#((6*++ 4 45 @N8*56C?@s   +#B B<(B77B<c                T   t        | |      \  }}	 t        j                  ||d      }t        j                  |j                        rt        d|       t        j                  |j                        r0t        j                  |t        j                  t        z  |      }d}nnt        j                  |j                        rAt        j                  |t        j                  t        j                  z  t        z  |      }d}nt        d|       t        j                  |       	 t        j                  |      }	|	j                  |k7  rt        d|       |	j                  t        j                          k7  rt        d	|       |dk(  r|	j"                  d
k7  rt        d|       |dk(  r0t        j$                  |	j                        dz  rt        d|       t'        ||      }
t        j                  |      }t)        | |      }|.t+        |	      t+        |      k7  st+        |      t+        |      k7  rt        d|       |j-                  t/        |||	||
t        j$                  |	j                                     d}|dk(  rE|d   j0                  }t3        t        j4                  |            D ]  }t7        | | d| ||        |dk\  rt        j                  |       y y # t        j                  |       w xY w# |dk\  rt        j                  |       w w xY w)NFrx   zsymlink in approved scope: ri   r|   	directoryz&unsupported object in approved scope: zdevice/path escape: zwrong owner:    zhardlinked file: I   z#executable file in approved scope: z)concurrent/path change during inventory: rP   rh   r   )rv   rW   rI   S_ISLNKr8   r	   S_ISREGr^   r_   ra   rn   r`   r\   rm   r1   r3   ro   r5   rJ   r   rz   r;   r   r   r   r   r   	hold_path)rq   rr   deviceheldrV   rS   r:   r   r   r   content
after_read
path_afterdirectory_fdchilds                  r   r   r      s   w1LFDwwtFEB<<% ;H:FGG<<%r{{U26BBD\\$,,'r{{R^^;eCFSBD FxjQRR
"==F" 4XJ?@@==BIIK'hZ8996>foo2 1(<==6>dll6>>:UB CH:NOO"d#XXb\
w1
&!1Xj5I!IXV`MaemnxeyMy I(TUUD2vtWdll6>>>Z[\;8;;L

< 89'hZq#8&$G : 7HHRL / 	. 7HHRL s   DK0 )F+L
 0L
L'c                   |d   }d}| D ]  }|j                   dk7  s|j                  j                  d      s/|j                  |vrt        d|j                         t	        |j
                  |j                        }||j                     }|j                  d      dk(  r(t        |t              st        d|j                         t        |t              r*t        |j                  d	g             j                  |      st        d
|j                         d|v r/|j                  d      |d   k7  rt        d|j                         |j                  j                  d      sb|j                  d      }t        |d         }t        |t              st        d      |D ]R  }	t        |	t              r6|	j                  d      |vs#|	j                  d      s|	j                  d      sIt        d       t        |      }  |S )Njson_schemasr   r|   z.jsonzunknown JSON schema: typeobjectzwrong JSON root: required_keyszincomplete JSON schema: schema_valueschemazunknown schema value: z*telegram-customer-bootstrap-v1/ledger.jsonsessionsbootstrap_terminal_statesz bootstrap sessions is not a liststaterole_claimsrecovery_attemptsz/bootstrap ledger contains nonterminal authority)r   r   endswithr	   r   r   get
isinstancedictsetissubsetlistrY   )
r   contractschemasbootstrap_countitemr'   ruler   terminalsessions
             r   validate_schemar      s   ~&GO99dii&8&8&A99G# 5dii[ABBTWWdii0tyy!88Fx'
5$0G 1$))=>>%&c$((?B2O.P.Y.YZ_.` 8DEET!eii&9T.=Q&Q 6tyykBCC99JKyy,H8$?@AHh-!"DEE#"7D1W[[5IQY5Y";;}5EX9Y%&WXX $ "(mO- . r   c                h  
 t        |d         }t        j                  dt        j                  t        j                  z  t
        z  |       }	 t        t        j                  |            }t        j                  |       t        |d         }|D ch c]<  }|j                  d      s|j                  dd      d   j                  dd      d   > }}|d	   }|D ]C  }	d|	 |	|v s|	|v rt        fd
|D              r|j                         7t        d        |D 
cg c]  }
t        | |
      |
 }}
g }t        t        |      d       D ](  
t        
fd|D              r|j                  
       * t        |      S # t        j                  |       w xY wc c}w c c}
w )Napproved_clear_scopesdatari   protected_data_rootsdata/rh   r   r   dynamic_clear_patternsc              3  J   K   | ]  }t        j                  |        y wr*   )fnmatchfnmatchcase)r   patternrr   s     r   r   z#effective_scopes.<locals>.<genexpr>   s     NX'w""8W5Xs    #zunknown data authority root: c                (    | j                  d      | fS )Nrh   )countr&   s    r   <lambda>z"effective_scopes.<locals>.<lambda>   s    S9I58Qr   keyc              3  T   K   | ]  }|k(  xs j                  |d z          ! yw)rh   N)
startswith)r   rV   scopes     r   r   z#effective_scopes.<locals>.<genexpr>   s/     YSX5F?De&6&6v|&DDSXs   %()r   rW   r^   r_   r`   ra   r   r   r\   r   r   rk   anyr   r	   rz   )rq   r   scopesdata_fdchildren	protectedr   approved_toppatternsr   r   presentouterrr   s             `  @r   effective_scopesr      s   (234FggfbkkBNN:UB7SG"**W-.
H345IGMjvtQUQ`Q`ahQiDJJsA&q)//Q7:vLj01H5'?I,!6NXNNMM(#9(DEE  #)R&Igu,E,Qu&GREG*QRYSXYYLL S %=# 	j Ss$   F F*,*F*)F/;F/F'c           	     N   g }|D ]  }t        j                  |j                        }t        | |j                        }|j                  |v r|j
                  dk(  rdndn|j                  }|t        |      t        |j                        k7  st        |      t        |j                        k7  s|j                  |j                  |j                  f|j                  |j                  |j                  fk7  sOt        j                  |j                        |k7  s-t        |j                  |j
                        |j                  k7  r |rdnd}	t!        |	 d|j                         |j#                  |j                  |j
                  |j                  t%        |      d        |S )Nr|   rO     zpost-repairz
pre-repairz  concurrent/invariant mismatch: r   r   r   stats)rW   rm   r   rz   r   r   r   r=   r   r1   r2   r8   rI   rJ   r   r   r	   r   rK   )
rq   r   repairedpostrowsr   currentpath_currentexpected_modephases
             r   verify_heldr      sM   !#D((477# $))4EIYYRZEZ$))v"55`d`r`r Ig$6)DKK:P$P\*i.DDNNGNNGOOD '')<)<l>R>RST<<0MA477DII.$2E2EE%)M|E'G		{STTTYY		TM`M`(13 	4  Kr   c                    t         t        fD ]:  } | j                         s| j                         s$t	        d| j
                          t        j                         }t        j                  |      }|j                  d      dk7  rt	        d      t        j                  t        t        j                  t        j                  z  t         z        }g }g }	 t        j"                  |      }|j$                  t        j&                         k7  s"t)        j*                  |j,                        dk7  rt	        d      t/        ||      }|D ]  }t1        |||j2                  |        |j5                  d        t7        |d	         }	|D 
ch c]  }
|
j8                  d
k(  s|
j:                    }}
t=        |	|z
        x}rt	        d|       t?        ||      }|D 
cg c]@  }
|
j8                  d
k(  r|
j@                  dz  s|
j8                  dk(  r|
j@                  dz  r|
B }}
ddtB        jD                  jG                  tB        jH                  jJ                        jM                         jO                  dd      tQ        t              tS        |      ||d   D cg c]  }d| 	 c}tU        |      ||D 
cg c]:  }
|
j:                  |
j8                  |
jV                  tY        |
jZ                        d< c}
|D 
cg c]B  }
|
j:                  |
j8                  t]        |
j@                  d      |
j8                  d
k(  rdnddD c}
g d}t_        t         |      }|D 
ch c]  }
|
j:                   }}
ta        ||t7               d       	 |D ]c  }
t        jb                  |
jd                  |
j8                  d
k(  rdnd       t        jf                  |
jd                         |ji                  |
       e t=        |D 
ch c]   }
|
j:                  jk                  d      d   " c}
      }|D ]u  }|s|n=t        j                  |t        j                  t        j                  z  t         z  |       }	 t        jf                  |       ||k7  sat        jl                  |       w ta        |||d!      }|D ci c]  }|d"   |
 }}d#dtB        jD                  jG                  tB        jH                  jJ                        jM                         jO                  dd      |tS        |      tU        |      ||D 
cg c]T  }
|
j:                  |
j8                  |
jV                  tY        |
jZ                        ||
j:                     d$   d!d!d!d!d!d!d!d%d&V c}
d'ddg d(}t_        t        |      }tw        t        jx                  dtU        |      tU        |      t=        |      ||d)d!*             	 |D ]!  }
t        jl                  |
jd                         # t        jl                  |       yc c}
w c c}
w c c}w c c}
w c c}
w c c}
w c c}
w # ||k7  rt        jl                  |       w w xY w# tn        $ r tq        |      D ]  }
ts        ||
j:                        }||j2                  |jt                  f|
jZ                  j2                  |
jZ                  jt                  fk(  sbt        jb                  |
jd                  |
j@                         t        jf                  |
jd                          t        jf                  |        w xY wc c}w c c}
w # |D ]!  }
t        jl                  |
jd                         # t        jl                  |       w xY w)+Nz!one-shot receipt already exists: r   z task26-profile-reset-contract-v1zunknown contractr   zunsafe profile rootc                    | j                   S r*   )r   )r   s    r   r   zmain.<locals>.<lambda>  s    499r   r   required_current_scopesr|   zmissing required authority: ir   i?z)task26-live-scope-permission-inventory-v1PASSz+00:00Zr   r   r   r?   06000700)r   r   before_mode
after_mode)r   statusrecorded_at_utcprofilecontract_sha256approved_scopesexcluded_protected_rootsentry_countbootstrap_session_countentries
repair_setfatal_violationsF)r   rO   rh   r   ri   Tr   z,task26-live-scope-batch-permission-repair-v1r   )content_hash_unchangedsize_unchangedinode_dev_unchangeduid_gid_unchangedmtime_unchangedname_unchangeddescriptor_path_match)r   r   r   r   afterproofzSall changed modes roll back through retained descriptors before receipt on mismatch)r   r   r   inventory_receipt_sha256r   repair_countr   repairsrollback_boundaryprotected_paths_touchedbytes_changedremaining_permission_violations)r   inventory_entriesr  repair_pathsr  repair_receipt_sha256)r   )=INVENTORY_RECEIPTREPAIR_RECEIPTrQ   rR   r	   rS   CONTRACT_PATH
read_bytesr#   r   r   rW   r^   PROFILEr_   r`   ra   rm   r3   ro   rI   rJ   r8   r   r   r1   sortr   r   r   r   r   r   dtdatetimenowtimezoneutc	isoformatr]   r   r/   rY   r   rK   r   rH   rf   r   rX   r   r[   r   
rpartitionr\   rp   reversedrz   r2   printr$   )receiptcontract_rawr   rq   r   changed	root_infor   r   requiredr   filesmissingr   repairrS   	inventoryinventory_shar  parent_pathsparent_pathrV   	post_rowsr   rowchanged_post	aggregatereceipt_shas                               r   mainr-    s   %~6>>w113 A',,PQQ 7 !++-Lzz,'H||H!CC,--gggr{{R^^;eCDGDGPHHW%	ryy{*dll9;L;L.MQV.V344!'84Egui&6&6= 		,	-x 9:;'+CtttyyF/BtCX-..7. <WIFGG)$9#' Q4499&4+=+=+Fii;.43E3E3N 4 Q BV!{{r{{?IIKSST\^ab7|L8I^dDLMcDd(eDdD5Dd(et9GKMGKt "&DIIQUQdQd",T[["9;GKM bhiagY] %)IItyy+1$2D2De+L48II4G&VUagi !#
	 %%6	B.45fd		f5GT35u5			$''DII,?5UK!t$  "F"SFD499#7#7#<Q#?F"STL+(3bkk\^\j\jNjmrNrIP:R)HHV$((  , $GT<dKI 5>>ISFS(I>DPV!{{r{{?IIKSST\^ab(5#lJ[KO %+, %+D "&DIIQUQdQd#-dkk#:\RVR[R[E\]dEe=AUY:>UY6:d<@#BC %+, "w'(1/1
	  #>9=djjFT\_`f\g*0*>\i3>@KOQ 	R DHHTWW 
O DQ )fMi 6 #T (( )  	 )#GTYY7&GNNGNN+KPTP[P[PbPbdhdododvdvOw+wIIdggt'9'9:HHTWW%	 *
 HHW	 ?," DHHTWW 
s   B3] 
X$X$-0] AX)"A8] X.&] 7?X36] <AX8] X=0] 
A1Y' ;%Y AY' /YY' 
&Y' 0] 4]A2] 3A]A] $] Y' Y$$Y' '/\?A\?A"\??] =^	__main__)r'   r   returnbytes)r.   r0  r/  r   )r:   r   r/  ztuple[int, ...])r:   r   r/  zdict[str, int | str])r   r   r'   dict[str, Any]r/  r   )rq   r   rr   r   r/  ztuple[int, str])rq   r   rr   r   r/  zos.stat_result | None)r   r   r   r   r/  r   )r   r   rr   r   r/  r   )
rq   r   rr   r   r   r   r   
list[Held]r/  None)r   r2  r   r1  r/  r   )rq   r   r   r1  r/  z	list[str])
rq   r   r   r2  r   zset[str]r   boolr/  zlist[dict[str, Any]])r/  r   )-__doc__
__future__r   r  r  r   r+   r#   rW   rI   rT   dataclassesr   pathlibr   typingr   r  EVIDENCEr  r  r  	O_CLOEXECgetattrra   RuntimeErrorr	   r   r(   r/   r;   r=   rK   rf   rv   rz   r   r   r   r   r   r   r-  r
   
SystemExitr   r   r   <module>r?     s   M "     	   !  
:
;mn11EE MM
wr<33	, 	   i+,

@:$@@'T:4&[| z
TV
 r   