Ë
    âß²jJ  ã                  óX  — U d Z ddlm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  ej                  e«      Z ej                   «       Zi Zded<   i Zd	ed
<   ddd„Zdd„Zdd„Zddœdd„Zddœdd„Zddœ	 	 	 	 	 dd„Zddœ	 	 	 	 	 	 	 	 	 dd„Zddœd d„Zd!d„Zd!d„Zd"d„Zd#d„Z d$d„Z!y)%züModule-level registry for DashboardAuthProvider instances. Plugins call ``register_provider``
via the plugin context hook at startup; the auth gate iterates ``list_providers()`` and uses
``get_provider`` to dispatch on the session's ``provider`` field.é    )ÚannotationsN)ÚListÚOptional)Úhermes_home_key)ÚDashboardAuthProviderÚassert_protocol_complianceú dict[str, DashboardAuthProvider]Ú
_providersz+dict[str, dict[str, DashboardAuthProvider]]Ú_scoped_providersc                ó†   — t        t        «      }|j                  t        j	                  | xs
 t        «       i «      «       |S ©N)Údictr
   Úupdater   Úgetr   )ÚscopeÚ	providerss     úG/home/ubuntu/.hermes/hermes-agent/hermes_cli/dashboard_auth/registry.pyÚ_mergedr      s6   € Ü”ZÓ €IØ×ÑÔ&×*Ñ*¨5Ò+E´OÓ4EÀrÓJÔKØÐó    c               ón   — | €t         S |rt        j                  | i «      S t        j                  | i «      S )z<Global map for ``scope is None``, else that scope's overlay.)r
   r   Ú
setdefaultr   )r   Úcreates     r   Ú_targetr      s8   € à€}ÜÐÙ6<Ô×'Ñ'¨¨rÓ2ÐbÔBS×BWÑBWÐX]Ð_aÓBbÐbr   c                ó\   — t         j                  d| |j                  |j                  «       y )Nz$dashboard-auth: registered %s%r (%s))Ú_logÚinfoÚnameÚdisplay_name)ÚkindÚproviders     r   Ú_log_registeredr!       s   € Ü‡I�IÐ4°d¸H¿M¹MÈ8×K`ÑK`Õar   ©r   c               ó  — t        t        | «      «       t        5  t        |d¬«      }|€|n
t	        |«      }| j
                  |v rt        d| j
                  ›�«      ‚| || j
                  <   ddd«       t        d| «       y# 1 sw Y   ŒxY w)zORaises ``TypeError`` on protocol violation, ``ValueError`` on a duplicate name.T©r   Nz,dashboard-auth provider already registered: z	provider )r   ÚtypeÚ_lockr   r   r   Ú
ValueErrorr!   )r    r   ÚtargetÚ	effectives       r   Úregister_providerr*   $   s   € äœt H›~Ô.Ü	ñ )Ü˜ tÔ,ˆØ#˜m‘F´¸³ˆ	Ø�=‰=˜IÑ%ÜÐKÈHÏMÉMÐK\Ð]Ó^Ð^Ø (ˆˆx�}‰}Ñ÷)ô �K Õ*÷)ð )ús   ›ABÂBc               ón   — t         5  t        |«      j                  | «      cddd«       S # 1 sw Y   yxY w)z@Return the registered provider for ``name``, or None if unknown.N)r&   r   r   ©r   r   s     r   Úget_providerr-   0   s,   € ä	ñ (Ü�u‹~×!Ñ! $Ó'÷(÷ (ò (ús   ‡+«4c               ór   — t         5  t        |d¬«      j                  | «      cd d d «       S # 1 sw Y   y xY w)NFr$   )r&   r   r   r,   s     r   Úsnapshot_registrationr/   6   s/   € ä	ñ 6Ü�u UÔ+×/Ñ/°Ó5÷6÷ 6ò 6ús   ‡-­6c               óö   — t         5  t        |d¬«      }|j                  | «      |ur
	 ddd«       y|€|j                  | d«       n||| <   |�|st        j                  |d«       ddd«       y# 1 sw Y   yxY w)zBRestore a host-owned provider registration if it is still current.Tr$   NF)r&   r   r   Úpopr   )r   ÚcurrentÚpreviousr   r(   s        r   Úrestore_registrationr4   <   s‚   € ô 
ñ 	/Ü˜ tÔ,ˆØ�:‰:�dÓ 7Ñ*Ø÷	/ð 	/ð ÐØ�J‰J�t˜TÕ"à#ˆF�4‰LØÐ¡VÜ×!Ñ! %¨Ô.÷	/ð ÷	/ð ús   ‡"A/²4A/Á/A8c                ó~   — t         5  t        t        | «      j                  «       «      cddd«       S # 1 sw Y   yxY w)z0All registered providers, in registration order.N)r&   Úlistr   Úvaluesr"   s    r   Úlist_providersr8   M   s/   € ä	ñ -Ü”G˜E“N×)Ñ)Ó+Ó,÷-÷ -ò -ús   ‡"3³<c                 óX   — t        «       D � cg c]  } t        | dd«      sŒ| ‘Œ c} S c c} w )zíProviders with ``supports_token`` True, in registration order. The ``token_auth`` seam
    consults only these, so OAuth/password-only providers are never asked to ``verify_token``;
    empty => a token-authable route fails closed (401).Úsupports_tokenF©r8   Úgetattr©Úps    r   Úlist_token_providersr?   S   s'   € ô &Ó'ÖO�!¬7°1Ð6FÈÕ+NŠAÒOÐOùÒOó   �' 'c                 óX   — t        «       D � cg c]  } t        | dd«      sŒ| ‘Œ c} S c c} w )z›Providers with ``supports_session`` True (interactive cookie sessions); the login page,
    /auth/login and the gate's verify/refresh loops use only these.Úsupports_sessionTr;   r=   s    r   Úlist_session_providersrC   Z   s'   € ô &Ó'ÖP�!¬7°1Ð6HÈ$Õ+OŠAÒPÐPùÒPr@   c                ó    — t        t        | «      «       t        5  | t        | j                  <   ddd«       t        d| «       y# 1 sw Y   ŒxY w)a/  Register a host-owned provider in the process-global slot (upsert). The registry is shared
    across every profile one dashboard process serves, so these outlive any per-home plugin
    manager: always targets ``_providers`` (never a per-home overlay) and *replaces* a same-name
    entry instead of raising, so a forced plugin re-discovery (e.g. after a password change)
    rotates the provider in place. Pairs with ``unregister_global_provider``.

    Pairs with ``unregister_global_provider`` for teardown of the exact object still current (#91701).
    Nzglobal provider )r   r%   r&   r
   r   r!   )r    s    r   Úregister_global_providerrE   `   sA   € ô œt H›~Ô.Ü	ñ -Ø$,Œ
�8—=‘=Ñ!÷-äÐ&¨Õ1÷-ð -ús   ›AÁAc                óª   — t         5  t        j                  | «      |u r t        j                  | d«       	 ddd«       y	 ddd«       y# 1 sw Y   yxY w)z‘Remove a global registration if ``provider`` is still current (a stale handle whose
    provider was already replaced never clears the live one).NTF)r&   r
   r   r1   )r   r    s     r   Úunregister_global_providerrG   o   sP   € ô 
ñ Ü�>‰>˜$Ó 8Ñ+Ü�N‰N˜4 Ô&Ø÷ð Ø+÷ð ÷	ð ús   ‡/A	Á	Ac                 óŠ   — t         5  t        j                  «        t        j                  «        ddd«       y# 1 sw Y   yxY w)z"Test-only: drop all registrations.N)r&   r
   Úclearr   © r   r   Úclear_providersrK   y   s2   € ä	ñ "Ü×ÑÔÜ×ÑÔ!÷"÷ "ñ "ús	   ‡)9¹Ar   )r   úOptional[str]Úreturnr	   )r   rL   r   ÚboolrM   r	   )r   Ústrr    r   rM   ÚNone)r    r   r   rL   rM   rP   )r   rO   r   rL   rM   úOptional[DashboardAuthProvider])
r   rO   r2   r   r3   rQ   r   rL   rM   rN   )r   rL   rM   úList[DashboardAuthProvider])rM   rR   )r    r   rM   rP   )r   rO   r    r   rM   rN   )rM   rP   )"Ú__doc__Ú
__future__r   ÚloggingÚ	threadingÚtypingr   r   Úhermes_constantsr   Úhermes_cli.dashboard_auth.baser   r   Ú	getLoggerÚ__name__r   ÚLockr&   r
   Ú__annotations__r   r   r   r!   r*   r-   r/   r4   r8   r?   rC   rE   rG   rK   rJ   r   r   ú<module>r^      sö   ðòEõ #ã Û ß !å ,ß \à€w×Ñ˜Ó"€Øˆ	�‰Ó€Ø/1€
Ð,Ó 1ØACÐ Ð>Ó Côócóbð RVõ 	+ð 7;õ (ð *.ñ6Ø
ð6Ø&ð6Ø2Qó6ð #ñØ
ðØ-ðØ9Xðàðà'+óð" .2õ -óPóQó2óô"r   