Ë
    ÜÝj##  ã                  ó¤  — 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mZmZ ddlmZ ddlmZmZmZ ddlmZ dd	lmZmZ dd
lmZ dZdZdZdZdZdZ  ejB                  d«      Z" ejB                  d«      Z# G d„ de$«      Z% G d„ de%«      Z& G d„ d«      Z' ed¬«       G d„ d«      «       Z(d!d„Z) G d„ d«      Z* G d„ d «      Z+y)"uß  Authentifizierte Autorisierung: HMAC-SHA256-Clearance.

Abgrenzung (bewusst getrennt benannt):
- INTEGRITÃ„T (context.py): "Ist der Kontext unverÃ¤ndert?" -> SHA-256-Digest.
- AUTORISIERUNG (hier): "Hat die Policy-Instanz genau DIESEN Auftrag fÃ¼r
  DIESES Backend freigegeben?" -> HMAC Ã¼ber job_id, Backend, Datenschutz-
  klasse, Kontext-Digest, Absender, Chat, Ausstellungs-/Ablaufzeit, Nonce.
  Nur wer den SchlÃ¼ssel besitzt, kann eine gÃ¼ltige Clearance ausstellen.
- Die Absenderauthentifizierung (Transport-IdentitÃ¤t + Allowlist) liegt im
  Gateway (gateway.Gateway._authenticate); sie ist Voraussetzung dafÃ¼r,
  dass Ã¼berhaupt eine Clearance ausgestellt wird.

SchlÃ¼ssel: Datei, Pfad aus der Konfiguration. Fehlt sie, ist sie zu kurz,
nicht regulÃ¤r oder fÃ¼r Gruppe/Andere lesbar -> KEY_UNAVAILABLE (fail-closed).
Je Backend wird ein eigener SchlÃ¼ssel abgeleitet; so kann z. B. das
Telegram-Plugin spÃ¤ter nur Claude-Clearances prÃ¼fen, aber keine
Codex-Clearances erzeugen.
é    )ÚannotationsN)ÚasdictÚ	dataclassÚreplace)ÚPath)ÚAnyÚCallableÚMappingé   )Úcanonical_json)ÚPrivacyMatrixÚPrivacyTier)Ú
NonceStores   aria-v3/clearance/v1
s   aria-v3/clearance-key/v1/é    i   iX  z^[0-9a-f]{64}$z^[0-9a-f]{32}$c                  ó    ‡ — e Zd Zdˆ fd„Zˆ xZS )ÚAuthorizationErrorc                ó2   •— t         ‰| �  |«       || _        y ©N)ÚsuperÚ__init__Úcode)Úselfr   Ú	__class__s     €ú:/home/aria/aria-v3-dev/python/aria_router/authorization.pyr   zAuthorizationError.__init__/   s   ø€ Ü‰Ñ˜ÔØˆ�	ó    )r   Ústr)Ú__name__Ú
__module__Ú__qualname__r   Ú__classcell__)r   s   @r   r   r   .   s   ø„ ÷ñ r   r   c                  ó   — e Zd Zy)ÚKeyUnavailableErrorN)r   r   r   © r   r   r"   r"   4   s   „ Ør   r"   c                  ó0   — e Zd ZdZdd„Zdd„Zd	d„Zd
d„Zy)ÚClearanceKeyringuI   Liest den HauptschlÃ¼ssel bei jeder Verwendung neu (Entzug wirkt sofort).c                ó$   — t        |«      | _        y r   )r   Úkey_file)r   r'   s     r   r   zClearanceKeyring.__init__;   s   € Ü˜X›ˆ�r   c                óú  — 	 t        j                  | j                  t         j                  t         j                  z  t         j
                  z  «      }	 t        j                  |«      }t        j                  |j                  «      st        d«      ‚|j                  t        j                  «       k7  rt        d«      ‚|j                  dz  rt        d«      ‚t        j                  |t        dz   «      }t        j                   |«       t#        |«      t$        k  rt        d«      ‚t#        |«      t        kD  rt        d«      ‚|S # t        $ r}t        d«      |‚d }~ww xY w# t        j                   |«       w xY w)	NÚKEY_UNAVAILABLEÚKEY_NOT_REGULAR_FILEÚKEY_WRONG_OWNERé?   ÚKEY_PERMISSIONS_TOO_OPENr   ÚKEY_TOO_SHORTÚKEY_TOO_LONG)ÚosÚopenr'   ÚO_RDONLYÚ
O_NOFOLLOWÚ	O_CLOEXECÚOSErrorr"   ÚfstatÚstatÚS_ISREGÚst_modeÚst_uidÚgeteuidÚreadÚMAX_KEY_BYTESÚcloseÚlenÚMIN_KEY_BYTES)r   ÚfdÚexcÚinfoÚdatas        r   Ú_load_masterzClearanceKeyring._load_master>   s  € ð	BÜ—‘˜Ÿ™¬¯©´b·m±mÑ(CÄbÇlÁlÑ(RÓSˆBð
	Ü—8‘8˜B“<ˆDÜ—<‘< §¡Ô-Ü)Ð*@ÓAÐAØ�{‰{œbŸj™j›lÒ*Ü)Ð*;Ó<Ð<Ø�|‰|˜eÒ#Ü)Ð*DÓEÐEÜ—7‘7˜2œ}¨qÑ0Ó1ˆDä�H‰H�RŒLÜˆt‹9”}Ò$Ü% oÓ6Ð6Üˆt‹9”}Ò$Ü% nÓ5Ð5Øˆøô# ò 	BÜ%Ð&7Ó8¸cÐAûð	Bûô �H‰H�R�Lús%   ‚AE ÁB"E# Å	E ÅEÅE Å#E:c                óD   — 	 | j                  «        y# t        $ r Y yw xY w)NFT)rE   r"   ©r   s    r   Ú	availablezClearanceKeyring.availableT   s,   € ð	Ø×ÑÔð øô #ò 	Ùð	ús   ‚ “	žc                óî   — t        |t        «      r|st        d«      ‚| j                  «       }t	        j
                  |t        |j                  d«      z   t        j                  «      j                  «       S )NÚINVALID_BACKENDzutf-8)Ú
isinstancer   r   rE   ÚhmacÚnewÚ	KEY_LABELÚencodeÚhashlibÚsha256Údigest)r   ÚbackendÚmasters      r   Úkey_forzClearanceKeyring.key_for[   sV   € Ü˜'¤3Ô'©wÜ$Ð%6Ó7Ð7Ø×"Ñ"Ó$ˆÜ�x‰x˜¤	¨G¯N©N¸7Ó,CÑ CÄWÇ^Á^ÓT×[Ñ[Ó]Ð]r   N)r'   r   ©ÚreturnÚbytes)rW   Úbool)rS   r   rW   rX   )r   r   r   Ú__doc__r   rE   rH   rU   r#   r   r   r%   r%   8   s   „ ÙSó'óó,ô^r   r%   T)Úfrozenc                  ó¢   — 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Zded<   dd„Zdd„Zedd„«       Zy)Ú	ClearanceÚintÚvr   Újob_idrS   ÚprivacyÚcontext_digestÚ	sender_idÚchat_idÚ	issued_atÚ
expires_atÚnonceÚ Úmacc                ó^   — t        | «      }|j                  d«       t        t        |«      z   S )Nri   )r   ÚpopÚCLEARANCE_DOMAINr   )r   Úfieldss     r   Úsigning_payloadzClearance.signing_payloadp   s'   € Ü˜“ˆØ�
‰
�5ÔÜ¤.°Ó"8Ñ8Ð8r   c                ó   — t        | «      S r   )r   rG   s    r   Úto_dictzClearance.to_dictu   s   € Ü�d‹|Ðr   c                ó~  — t         t        t        t        t        t        t        t         t         t        t        dœ}t        |t        «      rt	        |«      t	        |«      k7  rt        d«      ‚|j                  «       D ]   \  }}t        ||   «      |usŒt        d«      ‚  | di |D �ci c]  }|||   “Œ
 c}¤ŽS c c}w )N)r_   r`   rS   ra   rb   rc   rd   re   rf   rg   ri   ÚMALFORMED_CLEARANCEr#   )r^   r   rK   r
   Úsetr   ÚitemsÚtype)ÚclsrD   ÚexpectedÚkeyÚkindÚks         r   Ú	from_dictzClearance.from_dictx   s¨   € ä¬¼ÌÜ&)¼ÌÜ!$´CÄ#ÌcñSˆô ˜$¤Ô(¬C°«I¼¸X»Ò,FÜ$Ð%:Ó;Ð;Ø!Ÿ™Ó)ò 	@‰IˆC�Ü�D˜‘I‹ dÒ*Ü(Ð)>Ó?Ð?ð	@ñ Ñ4¨(Ö3 Q�a˜˜a™‘jÒ3Ñ4Ð4ùÒ3s   Â(B:NrV   )rW   Údict)rD   zMapping[str, Any]rW   z'Clearance')	r   r   r   Ú__annotations__ri   rn   rp   Úclassmethodr{   r#   r   r   r]   r]   b   s\   … à
ƒFØƒKØƒLØƒLØÓØƒNØƒLØƒNØƒOØƒJØ€CˆƒMó9ó
ð ò	5ó ñ	5r   r]   c                ó„   — t        j                  | |j                  «       t        j                  «      j                  «       S r   )rL   rM   rn   rP   rQ   Ú	hexdigest)rx   Ú	clearances     r   Ú_signr‚   …   s+   € Ü�8‰8�C˜×2Ñ2Ó4´g·n±nÓE×OÑOÓQÐQr   c                  óN   — e Zd ZdZdej                  dœ	 	 	 dd„Z	 	 	 	 	 	 dd„Zy)	ÚClearanceIssueruE   Stellt Clearances nur fÃ¼r Kombinationen aus, die die Matrix erlaubt.éx   )Úttl_secondsÚclockc               óª   — t        |«      t        usd|cxk  rt        k  st        d«      ‚ t        d«      ‚|| _        || _        || _        || _        y )Nr   ÚINVALID_TTL)ru   r^   ÚMAX_TTL_SECONDSÚ
ValueErrorÚ_keyringÚ_matrixÚ_ttlÚ_clock)r   ÚkeyringÚmatrixr†   r‡   s        r   r   zClearanceIssuer.__init__Œ   sS   € ä�Ó¤CÑ'¨q°KÔ/RÄ?Ò/RÜ˜]Ó+Ð+ð 0SÜ˜]Ó+Ð+ØˆŒØˆŒØˆŒ	Øˆ�r   c               óL  — t        |t        «      st        d«      ‚| j                  j	                  ||«      st        d«      ‚t        |t
        «      rt        j                  |«      st        d«      ‚|||fD ]  }t        |t
        «      r|rŒt        d«      ‚ t        | j                  «       «      }t        t        |||j                  |||||| j                  z   t        j                  d«      ¬«
      }	t!        |	t#        | j$                  j'                  |«      |	«      ¬«      S )NÚINVALID_PRIVACYÚPRIVACY_NOT_PERMITTEDÚINVALID_CONTEXT_DIGESTÚINVALID_SUBJECTé   )
r_   r`   rS   ra   rb   rc   rd   re   rf   rg   )ri   )rK   r   r   r�   Úpermitsr   Ú_HEX64Úmatchr^   r�   r]   ÚCLEARANCE_VERSIONÚvaluerŽ   ÚsecretsÚ	token_hexr   r‚   rŒ   rU   )
r   r`   rS   ra   rb   rc   rd   rœ   ÚnowÚunsigneds
             r   ÚissuezClearanceIssuer.issue•   sö   € ä˜'¤;Ô/Ü$Ð%6Ó7Ð7Ø�|‰|×#Ñ# G¨WÔ5Ü$Ð%<Ó=Ð=Ü˜.¬#Ô.´f·l±lÀ>Ô6RÜ$Ð%=Ó>Ð>Ø˜i¨Ð1ò 	<ˆEÜ˜e¤SÔ)²Ü(Ð):Ó;Ð;ð	<ô �$—+‘+“-Ó ˆÜÜ¨¸ÈÏÉØ)°YÈØ c¨D¯I©I¡o¼W×=NÑ=NÈrÓ=Rô
ˆô
 �x¤U¨4¯=©=×+@Ñ+@ÀÓ+IÈ8Ó%TÔUÐUr   N)r�   r%   r‘   r   r†   r^   r‡   úCallable[[], float])r`   r   rS   r   ra   r   rb   r   rc   r   rd   r   rW   r]   )r   r   r   rZ   Útimer   r¡   r#   r   r   r„   r„   ‰   sF   „ ÙOð %(ÀdÇiÁiñØ!ðØ0CóðVØðVØ'*ðVØ/8ôVr   r„   c                  óX   — e Zd ZdZedej
                  dœ	 	 	 	 	 dd„Z	 	 	 	 	 	 	 	 dd„Zy)	ÚClearanceVerifieruM   PrÃ¼ft vor JEDER Adapter-AusfÃ¼hrung (siehe adapter_contract.BackendAdapter).é   )Úmax_ttl_secondsÚmax_clock_skew_secondsr‡   c               óf   — || _         || _        || _        || _        || _        || _        || _        y r   )rŒ   r�   Ú_noncesÚ
classifierÚ_max_ttlÚ_skewr�   )r   r�   r‘   Únonce_storer«   r§   r¨   r‡   s           r   r   zClearanceVerifier.__init__¬   s5   € ð  ˆŒØˆŒØ"ˆŒØ$ˆŒØ'ˆŒØ+ˆŒ
Øˆ�r   c               ó   — |€t        d«      ‚t        |t        «      rt        j	                  |«      }t        |t        «      st        d«      ‚|j
                  t        k7  rt        d«      ‚|j                  |k7  rt        d«      ‚t        | j                  j                  |«      |«      }t        j                  ||j                  «      st        d«      ‚| j                  «       }	|j                  |j                   z
  }
|
dk  s|
| j"                  kD  rt        d«      ‚|j                   |	| j$                  z   kD  rt        d«      ‚|	|j                  k\  rt        d	«      ‚|j&                  |k7  rt        d
«      ‚|j(                  |k7  s|j*                  |k7  rt        d«      ‚t        j                  |j,                  |«      st        d«      ‚|j.                  |j0                  k7  rt        d«      ‚| j2                  j5                  ||«      st        d«      ‚t6        j9                  |j:                  «      st        d«      ‚| j<                  j?                  |j:                  |j                  |	«      st        d«      ‚|S )NÚMISSING_CLEARANCEÚINVALID_CLEARANCEÚUNSUPPORTED_CLEARANCE_VERSIONÚBACKEND_MISMATCHÚINVALID_SIGNATUREr   ÚINVALID_LIFETIMEÚNOT_YET_VALIDÚEXPIREDÚJOB_MISMATCHÚSUBJECT_MISMATCHÚCONTEXT_DIGEST_MISMATCHÚPRIVACY_MISMATCHr”   rr   ÚREPLAY) r   rK   r
   r]   r{   r_   r›   rS   r‚   rŒ   rU   rL   Úcompare_digestri   r�   rf   re   r¬   r­   r`   rc   rd   rb   ra   rœ   r�   r˜   Ú_HEX32rš   rg   rª   Úconsume)r   r�   rS   r`   rb   ra   rc   rd   Úexpected_macrŸ   Úlifetimes              r   ÚverifyzClearanceVerifier.verify·   s  € àÐÜ$Ð%8Ó9Ð9Ü�i¤Ô)Ü!×+Ñ+¨IÓ6ˆIÜ˜)¤YÔ/Ü$Ð%8Ó9Ð9Ø�;‰;Ô+Ò+Ü$Ð%DÓEÐEØ×Ñ Ò'Ü$Ð%7Ó8Ð8Ü˜TŸ]™]×2Ñ2°7Ó;¸YÓGˆÜ×"Ñ" <°·±Ô?Ü$Ð%8Ó9Ð9à�k‰k‹mˆØ×'Ñ'¨)×*=Ñ*=Ñ=ˆØ�qŠ=˜H t§}¡}Ò4Ü$Ð%7Ó8Ð8Ø×Ñ  t§z¡zÑ!1Ò1Ü$ _Ó5Ð5Ø�)×&Ñ&Ò&Ü$ YÓ/Ð/Ø×Ñ˜vÒ%Ü$ ^Ó4Ð4Ø×Ñ )Ò+¨y×/@Ñ/@ÀGÒ/KÜ$Ð%7Ó8Ð8Ü×"Ñ" 9×#;Ñ#;¸^ÔLÜ$Ð%>Ó?Ð?Ø×Ñ §¡Ò-Ü$Ð%7Ó8Ð8Ø�|‰|×#Ñ# G¨WÔ5Ü$Ð%<Ó=Ð=Ü�|‰|˜IŸO™OÔ,Ü$Ð%:Ó;Ð;Ø�|‰|×#Ñ# I§O¡O°Y×5IÑ5IÈ3ÔOÜ$ XÓ.Ð.ØÐr   N)r�   r%   r‘   r   r®   r   r§   r^   r¨   r^   r‡   r¢   )rS   r   r`   r   rb   r   ra   r   rc   r   rd   r   rW   r]   )r   r   r   rZ   rŠ   r£   r   rÂ   r#   r   r   r¥   r¥   ©   sV   „ ÙWð 8GØ/0ÈtÏyÉyñ	Ø14ð	à),ð	à9Ló	ð&Ø#ð&Ø03ð&Ø>Að&ØFOô&r   r¥   )rx   rX   r�   r]   rW   r   ),rZ   Ú
__future__r   rP   rL   r0   Úrer�   r7   r£   Údataclassesr   r   r   Úpathlibr   Útypingr   r	   r
   Úcontextr   Úcorer   r   Ústater   r›   rl   rN   r@   r=   rŠ   Úcompiler™   r¾   r‹   r   r"   r%   r]   r‚   r„   r¥   r#   r   r   ú<module>rÌ      sà   ðñõ$ #ã Û Û 	Û 	Û Û Û ß 2Ñ 2Ý ß )Ñ )å #ß ,Ý àÐ Ø,Ð Ø(€	Ø€Ø€Ø€Ø	ˆ�‰Ð%Ó	&€Ø	ˆ�‰Ð%Ó	&€ô˜ô ô	Ð,ô 	÷'^ñ '^ñT �$Ô÷5ð 5ó ð5óDR÷Vñ V÷@4ò 4r   