
    j)                    h   d Z ddl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
mZ ddlmZmZmZmZ ddlmZmZ  G d	 d
e      ZdZdZ eh d      Z eh d      Z edh      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)zMTyped customer projections for explicitly supported shared authority ledgers.    )annotationsN)StrEnum)Path)Any)	canonicaldigest_bytessafe_relativewrite_private)CleanupBlockedErrorCleanupIntegrityErrorc                      e Zd ZdZdZy)SharedLedgerProjectionzEClosed set of shared authorities with customer-safe projection logic.z)data/owner-actions/draft-generations.jsonN)__name__
__module____qualname____doc__DRAFT_GENERATIONS     t/home/cube/projects/richard/.worktrees/nutricoach-v140-impl/dualcoach/profile/checkin_cli/customer_cleanup_shared.pyr   r      s    OCr   r   zdraft-generations-customer-v1z0customer-cleanup-draft-generations-projection-v1>   actorerrorstateattempt
created_at
generation
updated_atcustomer_keymax_attemptsrecord_digestdraft_revisionschema_versionidempotency_keyauthority_digestcheckin_event_idcheckin_revisionpredecessor_digestlineage_parent_tokenmodel_contract_versiondelivery_provider_receiptprovider_contract_versionlineage_predecessor_digestgeneration_provider_receipt"delivery_provider_contract_version>	   heldapproved	delivered
generatingsent_auditeddraft_createddelivery_pendinggeneration_failedgeneration_pendingr3   c                   t        t        | |d            }t        j                  t        j                  z  t        j
                  z  t        j                  z  }d}d}	 t        j                  ||      }|j                  d d D ]1  }t        j                  |||      }t        j                  |       |}3 t        j                  |j                  t        j                  t        j                  z  t        j
                  z  |      }t        j                  |      }t        j                  |j                        }	t        j                  |j                        r|j                   dk7  rt#        d      |j$                  t        j&                         k7  s|	dz  rt#        d      g }
t        j(                  |d      x}r*|
j+                  |       t        j(                  |d      x}r*t        j                  |      }|j,                  |j.                  |j0                  |j2                  f}|j,                  |j.                  |j0                  |j2                  f}||k7  rt#        d	      d
j5                  |
      |f|dk\  rt        j                  |       |dk\  rt        j                  |       S S # t6        $ r}t#        d|        |d }~ww xY w# |dk\  rt        j                  |       |dk\  rt        j                  |       w w xY w)N )dir_fd   z0shared ledger must be a regular no-hardlink file?   z shared ledger must be owner-onlyi   z shared ledger changed while readr   r   z)shared ledger cannot be securely opened: )r   r	   osO_RDONLY	O_CLOEXEC
O_NOFOLLOWO_DIRECTORYopenpartsclosenamefstatstatS_IMODEst_modeS_ISREGst_nlinkr   st_uidgeteuidreadappendst_devst_inost_sizest_mtime_nsjoinOSError)pathrootrelativedirectory_flags
descriptor	directorypartchildbeforemodechunkschunkafterbefore_identityafter_identityexcs                   r   _secure_readrg   (   sh   M$b12HkkBLL02==@2>>QOJI  GGD/2	NN3B'DGGD/)DEHHYI ( WWMMKK",,&6


 *%||FNN+||FNN+v!/C'(Z[[==BJJL(D5L'(JKK wwz;77e7MM%  wwz;77e7$!==&--I[I[\,,emmUEVEVWn,'(JKKxx' ?HHZ >HHY   a#&OPTv$VW]``a ?HHZ >HHY s,   FJ5 ,BJ5 5	K>KKK 7Lc                    	 t        j                  |       }t        |      t        urt	        d      i }|j                         D ]  \  }}t        |      t        us|rt        |      t        us|st	        d      g }d }|D ]  }t        |      t        ust        |      t        k7  rt	        d      |j                  d      }	t        |	      t        us	|	r||	|k7  rt	        d      |j                  d      dk7  rt	        d      t        |j                  d            t        urt	        d      |	}|j                  |        |||<    |S # t        t         j                  f$ r}t	        d      |d }~ww xY w)	Nz*draft-generations shared ledger is invalidz1draft-generations shared ledger schema is invalidz:draft-generations customer binding is missing or ambiguousr   r"   znutrition-draft-generation-v1r   z0draft-generations shared ledger state is invalid)jsonloadsUnicodeDecodeErrorJSONDecodeErrorr   typedictitemsstrlistset_RECORD_KEYSgetrP   )
payloaddocumentrf   parsedtokenhistoryrowsbindingrowcustomers
             r   _parse_draft_generationsr~   P   sq   [::g& H~T!#$WXX.0F"..*w;c!$w-t2KSZ'([\\%'"CCy$CL(@+,hiiww~.HH~S(W=PU]ahUh+,hiiww'(,KK+,_``CGGG$%S0+,^__GKK  u# +$ M/  4 45 [#$PQWZZ[s   E E=,E88E=c           
        t        |       }t        |j                               D ci c]  \  }}|d   d   |k(  r|| }}}|j                         D cg c]  }|D ]  }t	        t        |              }}}t        t        ||d      dz   }dx}	x}
x}}h d}|j                         D ]5  }|d   d   }|t        v r|dz  }||v r|
dz  }
#|t        v r|	dz  }	1|dz  }7 |||	|
||fS c c}}w c c}}w )	Nr   r   )r"   r   	histories   
>   r1   r2   r5   r7   r:   r   r<   )	r~   sortedro   valuesr   r   _PROJECTION_SCHEMA_TERMINAL_STATES_KNOWN_STATES)ru   r   ledgerrx   ry   selectedr|   record_digests
projectionactivependingunknownterminalpending_statesr   s                  r   _projectr   m   sM    &g.F %V\\^44NE71:n%5 	w4    ((GC 	Ys^$ 	%(  
 ,$  
	J
 -.-F-W-wZN??$G$$$MHn$qLGm#aKFqLG % ~vwII7
s   C-"C3c                   t               }g }|D ]  }t        |      t        us||v rt        d      |j	                  |       |j
                  }| |z  }t        ||       \  }}	t        ||      \  }
}}}}}|j                  |t        |      t        |      |	j                  |	j                  t        j                  |	j                        t         t        |      |t        |
      d| d        |S )Nz$unsupported shared ledger projectionprojections/)source_relative_pathsource_sha256source_sizesource_devicesource_inodesource_modeselector_versionselected_record_countordered_record_digestsprojection_sha256projection_archive_path)rr   rm   r   r   addvaluerg   r   rP   r   lenrQ   rR   rH   rI   rJ   	_SELECTOR)rX   r   	requestedseenbindings	authorityrY   rW   ru   infor   r   _s                r   prepare_shared_projectionsr      s     ),D(*H		?"88I<M'(NOO??h$T4019'<1P.
NAq!Q$,)'2w<![[ KK<<5 )%(%8&4!-j!9)5hZ'@
 	 * Or   c               4   j                  d      t        j                  j                  k7  rt	        d      | t        d         z  }t        ||       \  }}t        ||      \  }}}	}
}}t        |      t        |      |j                  |j                  t        j                  |j                        t        t        |      |t        |      dd    d
}t!        fd|j#                         D              rt	        d      |r|	s|
s|rt%        d      |S )Nr   z0unsupported shared ledger projection in manifestr   )
r   r   r   r   r   r   r   r   r   r   c              3  L   K   | ]  \  }}j                  |      |k7    y w)Nrt   ).0keyr   r{   s      r   	<genexpr>z_recompute.<locals>.<genexpr>   s&     
H7Ge7;;su$7Gs   !$z/shared ledger changed after cleanup preparationz4pending or unknown customer authority blocks cleanup)rt   r   r   r   r   rp   rg   r   r   r   rQ   rR   rH   rI   rJ   r   anyro   r   )rX   r   r{   require_terminalrW   ru   r   r   digestsr   r   r   r   expecteds     `           r   
_recomputer      s    {{)*.D.V.V.\.\\#$VWW#g4566D t,MGT7?7V4J'1%g.7|||DLL1%!$W"))*5%1':P2Q1R#SH 
Hx~~7G
HH#$UVVVw'!"XYYr   c                    |D ]?  }t        | ||d      }|t        |d         z  }t        |||j                                 A y )NTr   r   )	exclusive)r   rp   r
   exists)rX   archiver   r   r{   r   destinations          r   copy_shared_projectionsr      sK     lGdS
G,E$F GGk:[=O=O=Q9QR r   c                :   |D ]  }t        | |d      }|t        |d         z  }t        ||      \  }}||k7  st        |      |j	                  d      k7  rt        d      	 t        j                  |      }	|	d   }
|	j	                  d      t        k7  sH|	j	                  d      k7  s4t        |
      t        us#t        fd	|
j                         D              st        d
       y # t        t        t        j                  f$ r}t        d      |d }~ww xY w)NFr   r   r   z)shared ledger archive verification failedr   r"   r   c              3  T   K   | ]  }|D ]  }|j                  d       k7    ! yw)r   Nr   )r   ry   r|   r   s      r   r   z,verify_shared_projections.<locals>.<genexpr>   s4      1G"C '<7" 81s   %(z9shared ledger archive contains foreign customer authority)r   rp   rg   r   rt   r   ri   rj   KeyError	TypeErrorrl   r   rm   rn   r   r   )rX   r   r   r   r{   r   rW   archivedr   	projectedr   rf   s     `         r   verify_shared_projectionsr      s    dL'ERW%>?@@"41!x<#9W[[I\=]#]'(STT	^

8,I!+.I MM*+/AA}}^,<Id* (//1  ((cdd+  )T%9%9: 	^'(STZ]]	^s   $C++D	DDc                    | t         j                  j                  z  }|j                         s|j	                         syt        ||       \  }}t        ||      \  }}}}}}||||fS )N)r   r   r   r   )r   r   r   r   
is_symlinkrg   r   )	rX   r   rW   ru   r   r   r   r   r   s	            r   shared_authority_countsr      sf    (::@@@D;;=!2dD)JGQ/7/N,Aq&'7H7GX--r   )rW   r   rX   r   returnztuple[bytes, os.stat_result])ru   bytesr   zdict[str, list[dict[str, Any]]])ru   r   r   rp   r   z+tuple[bytes, list[str], int, int, int, int])rX   r   r   rp   r   z"tuple[SharedLedgerProjection, ...]r   list[dict[str, object]])
rX   r   r   rp   r{   zdict[str, object]r   boolr   r   )
rX   r   r   r   r   rp   r   r   r   None)rX   r   r   rp   r   ztuple[int, int, int, int])#r   
__future__r   ri   r>   rH   enumr   pathlibr   typingr   checkin_cli.customer_cleanup_fsr   r   r	   r
   #checkin_cli.customer_cleanup_modelsr   r   r   r   r   	frozensetrs   r   r   rg   r~   r   r   r   r   r   r   r   r   r   <module>r      sa   S "  	     a a ZDW D ,	G       n-. % P:JJ"%J0JD
!.P:
 
  >S
SS-0S<SS	Se
ee-0e<Se	e6.r   