
    { j                    r   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mZm	Z	 ddl
mZ ddlmZmZmZ ddlmZmZ ddlmZmZ d	Zd
ed<   ej0                  ej2                  z  ej4                  z  ej6                  z  Zd
ed<    edd       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%y) z>Strict proof and revalidation for one torn-tail repair target.    )annotationsN)	dataclassreplace)Final)CustomerIdentityDigestWeeklyOperationsCorruptioncustomer_storage_digest)HistoryValidationvalidate_history_bytes)customer_data_namecustomer_lock_namez.nutricoach-weekly-operations-repair-binding-v1r   REPAIR_SCHEMA_FILE_FLAGST)frozenslotsc                     e Zd ZU ded<   ded<   ded<   ded<   ded<   ded	<   ded
<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   edd       Zedd       Zy)WeeklyOperationsRepairBindingstrschema_versionr   customer_identity_digestr	   intdata_device
data_inode	data_mode
data_owner
data_linkslock_device
lock_inode	lock_mode
lock_owner
lock_links	lock_sizelock_digestvalid_prefix_offsetvalid_prefix_digesttorn_tail_lengthtorn_tail_digest	file_sizefile_digestbinding_digestc                2    | j                   | j                  fS N)r   r   selfs    /home/cube/projects/richard/traning coach/task-12-independent-verification-r9/build/hermes-full/dualcoach/profile/checkin_cli/weekly_operations_repair.pydata_identityz+WeeklyOperationsRepairBinding.data_identity-       00    c                2    | j                   | j                  fS r,   )r   r   r-   s    r/   lock_identityz+WeeklyOperationsRepairBinding.lock_identity1   r1   r2   N)returnztuple[int, int])__name__
__module____qualname____annotations__propertyr0   r4    r2   r/   r   r      s    44  ONOOONOONN1 1 1 1r2   r   c                    | j                   D ci c]  }|dk7  s	|t        | |       }}t        j                  |dd      j	                         S c c}w )Nr*   T),:)	sort_keys
separators)__dataclass_fields__getattrjsondumpsencode)bindingfieldvalues      r/   _binding_payloadrI   6   sU    9@9U9Us9UY^brYrUGGU++9UEs::et
CJJLL ts
   
AAc                   t        j                  | j                        xrD t        j                  | j                        |k(  xr  | j                  |k(  xr | j
                  |k(  S r,   )statS_ISREGst_modeS_IMODEst_uidst_nlink)infomodeownerlinkss       r/   
_safe_filerU   ;   sd    <<%  A$,,t||*D*L  AQUQ\Q\`eQe  Ajnjwjw  |A  kA  Ar2   c                   t        j                  t        |             j                         }| j                  | j
                  cxk(  xr dk(  nc xr\ | j                  | j                  cxk(  xr t        j                         k(  nc xr$ | j                  | j                  cxk(  xr dk(  nc }| j                  t        k7  sw| j                  |k7  sh| j                  t        | j                         k7  sF| j"                  dk  s7| j$                  dk  s(| j&                  | j"                  | j$                  z   k7  s|st)        d      y )N     r   zrepair binding is invalid)hashlibsha256rI   	hexdigestr   r   r   r    osgeteuidr   r!   r   r   r*   r	   r   r$   r&   r(   r   )rF   expectedsafes      r/   validate_repair_bindingr`   ?   s   ~~.w78BBDH 1 1:U:  jw?Q?QU\UgUg?wkmkukukw?w  j  }D  }O  }O  SZ  Se  Se  }j  ij  }jD.'2H2HH2TX_XwXw  |S  T[  Tt  Tt  |u  Yu  y@  yT  yT  XY  yY  ]d  ]u  ]u  yz  ]z  ~E  ~O  ~O  SZ  Sn  Sn  qx  qI  qI  SI  ~I  QU()DEE QUr2   c                   	 t        j                  |t        |       }	 t        j
                  |      }t        j                  || d      }t        |dt        j                         d      r1|j                  |j                  f|j                  |j                  fk7  rt	        d      g }t        j                  |d	      x}r*|j                  |       t        j                  |d	      x}r*|d
j                  |      ft        j                  |       S # t        $ r}t	        d      |d }~ww xY w# t        j                  |       w xY w)Ndir_fdz$repair data file is absent or unsafeFrc   follow_symlinksrW   rX   rR   rS   rT   z#repair data file identity is unsafe   r2   r\   openr   OSErrorr   fstatrK   rU   r]   st_devst_inoreadappendjoinclose	customersname
descriptorerrorrQ   namedchunkschunks           r/   _read_existingrz   F   s'   \WWT;yA

xx
#YF$U"**,aHT[[Z^ZeZeLfkpkwkwy~  zF  zF  kG  MG,-RSS wwz511e1MM%  wwz511e1SXXf%%
  \()OPV[[\ 	)   D CD2 -D2 	D/D**D/2E	c                   	 t        j                  |t        |       }	 t        j
                  |      }t        j                  || d      }t        |dt        j                         d      r1|j                  |j                  f|j                  |j                  fk7  rt	        d      g }t        j                  |d	      x}r*|j                  |       t        j                  |d	      x}r*|d
j                  |      ft        j                  |       S # t        $ r}t	        d      |d }~ww xY w# t        j                  |       w xY w)Nrb   z%repair requires an existing safe lockFrd   rW   rX   rf   zrepair lock identity is unsaferg   r2   rh   rr   s           r/   
_read_lockr}   X   s'   ]WWT;yA

xx
#YF$U"**,aHT[[Z^ZeZeLfkpkwkwy~  zF  zF  kG  MG,-MNN wwz511e1MM%  wwz511e1SXXf%%
  ]()PQW\\] 	r{   c                T   t        |      }t        | t        |            \  }}t        |||d      }|j                  dk  s|j                  |j
                  k\  rt        d      t        | t        |            \  }}|d|j                   }||j                  d }	t        t        |||j                  |j                  t        j                  |j                        |j                   |j"                  |j                  |j                  t        j                  |j                        |j                   |j"                  t%        |      t'        j(                  |      j+                         |j                  t'        j(                  |      j+                         t%        |	      t'        j(                  |	      j+                         t%        |      t'        j(                  |      j+                         d      }
t-        |
t'        j(                  t/        |
            j+                               S )z=Issue a binding only for one positive, unambiguous torn tail.Texpected_customerallow_torn_tailr   z+repair target is not one positive torn tailN )r*   )r	   rz   r   r   complete_endsizer   r}   r   r   r   rl   rm   rK   rN   rM   rO   rP   lenrY   rZ   r[   r   rI   )rs   customer_identitystorage_digest	data_infopayload	validated	lock_infolock_payloadprefixtailprovisionals              r/   inspect_repair_targetr   j   s   ,->?N'	3EFW3XYIw&wRcuyzI"i&<&<	&N()VWW(4FGX4YZI|-y--.F9))+,D/Y&&'Y&&'L|$..0v((*D	t&&(Gw))+
-K0 ;w~~>N{>[/\/f/f/hiir2   c                    t        |        t        || j                  | j                  | j                        rm|j
                  |j                  f| j                  k7  sHt        |      | j                  k7  s0t        j                  |      j                         | j                  k7  rt        d      t        || j                   | j"                  d      }|d|j$                   }||j$                  d }|j$                  | j&                  k7  sxt        |      | j(                  k7  s`t        j                  |      j                         | j*                  k7  s0t        j                  |      j                         | j,                  k7  rt        d      |S )zERevalidate exact file identity, content, prefix, and tail under lock.rf   z$repair target changed after issuanceTr   Nz2repair offsets or torn tail changed after issuance)r`   rU   r   r   r   rl   rm   r0   r   r(   rY   rZ   r[   r)   r   r   r	   r   r   r$   r&   r%   r'   )rF   rQ   r   r   r   r   s         r/   validate_bound_repair_payloadr      s   G$d!2!2':L:LT[TfTfglplwlwy}  zE  zE  lF  JQ  J_  J_  l_  cf  gn  co  sz  sD  sD  cD  HO  HV  HV  W^  H_  Hi  Hi  Hk  ov  oB  oB  HB()OPP&w0O0Ocj  dD  dD  VZ  [I-y--.F9))+,D!<!<<D	WMeMe@eipiwiwx~i  jJ  jJ  jL  PW  Pk  Pk  jk  ov  o}  o}  ~B  oC  oM  oM  oO  SZ  Sk  Sk  ok()]^^r2   c                d   t        |        t        || j                  | j                  | j                        rm|j
                  |j                  f| j                  k7  sHt        |      | j                  k7  s0t        j                  |      j                         | j                  k7  rt        d      y )Nrf   z"repair lock changed after issuance)r`   rU   r   r    r!   rl   rm   r4   r   r"   rY   rZ   r[   r#   r   )rF   rQ   r   s      r/   validate_bound_repair_lockr      s    G$d!2!2':L:LT[TfTfglplwlwy}  zE  zE  lF  JQ  J_  J_  l_  cf  gn  co  sz  sD  sD  cD  HO  HV  HV  W^  H_  Hi  Hi  Hk  ov  oB  oB  HB()MNN HBr2   )rF   r   r5   bytes)
rQ   os.stat_resultrR   r   rS   r   rT   r   r5   bool)rF   r   r5   None)rs   r   rt   r   r5   ztuple[os.stat_result, bytes])rs   r   r   r   r5   r   )rF   r   rQ   r   r   r   r5   r
   )rF   r   rQ   r   r   r   r5   r   )&__doc__
__future__r   rY   rC   r\   rK   dataclassesr   r   typingr   checkin_cli.weekly_operationsr   r   r	   %checkin_cli.weekly_operations_historyr
   r   $checkin_cli.weekly_operations_layoutr   r   r   r9   O_RDONLY
O_NOFOLLOW	O_CLOEXEC
O_NONBLOCKr   r   rI   rU   r`   rz   r}   r   r   r   r;   r2   r/   <module>r      s    D "   	  *  u u [ WGu G[[2==02<<?"--OU O $d#1 1 $1BM
AF$$"jJ
Or2   