+
    jHàjh<  ã                  óª  € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	t
^ RIHtHtHtHt ^ RIt^ RIHtHtHtHtHtHtHt RtRtRR/tR	tR
 R ltR R ltR R lt ! R R] 4      t!R R lt"R R lt#R R lt$R R lt%R R lt&RR/R R llt'R2R  R! llt(R"R#R$RR%RR&R/R' R( llt)R) R* lt*R+]/R, R- llt+ ! R. R/4      t, ! R0 R1]4      t-R# )3a:  Helpers shared by the bundled dashboard-auth providers.

Each provider module keeps its own ``logger`` / ``LAST_SKIP_REASON`` (the gate reads
those by module) and its ``register(ctx)``; the config/env resolution, skip/register
bookkeeping, PKCE login start, token-endpoint exchange and JWT verification live here.
)ÚannotationsN)ÚAnyÚCallableÚDictÚOptional)ÚDashboardAuthProviderÚInvalidCodeErrorÚ
LoginStartÚProviderErrorÚRefreshExpiredErrorÚSessionÚclassify_jwks_lookup_errori,  g      $@ÚAcceptúapplication/jsong      N@c               ó(   € V ^8„  d   QhRRRRRRRR/# )é   Úloggerúlogging.LoggerÚtagÚstrÚpathÚreturnÚdict© )Úformats   "ÚC/home/ubuntu/.hermes/hermes-agent/plugins/dashboard_auth/_shared.pyÚ__annotate__r   '   s(   € ÷ 8ñ 8 ð 8°Sð 8Àð 8Èñ 8ó    c                óÆ   €  ^ RI HpHp V! 4       pT! T.TO5RR/ p\        T\        4      '       d   T# / #   \         d   pT P	                  RY4       / u Rp?# Rp?ii ; i)u¡   The ``config.yaml`` block at ``path`` as a dict, or ``{}`` â€” robust to load_config()
raising (fresh install, malformed YAML), absent keys, or a non-dict value.)Úcfg_getÚload_configzC%s: load_config() raised %s; falling back to env-only configurationNÚdefault)Úhermes_cli.configr   r    Ú	ExceptionÚdebugÚ
isinstancer   )r   r   r   r   r    ÚcfgÚexcÚsections   &&*     r   Úload_config_sectionr)   '   se   € ðß:á‹mˆñ �cÐ/˜DÒ/¨$Ñ/€GÜ  ¬$×/Ò/ˆ7Ð7°RÐ7øô	 ô Ø�‰ÐZÐ\_ÔeØ�	ûðús   ‚7 ·A ÁAÁA ÁA c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úenv_namer   Ú	cfg_valuer   r   r   )r   s   "r   r   r   5   s&   € ÷ Pñ P ð P°ð P¸ñ Pr   c                ó´   € \         P                  P                  V R4      P                  4       ;'       g$    \	        T;'       g    R4      P                  4       # )z†Env-wins-over-config; an empty env value is treated as unset so a
provisioned-but-blank secret can't shadow a valid config.yaml entry.Ú )ÚosÚenvironÚgetÚstripr   )r+   r,   s   &&r   Úresolve_env_or_cfgr3   5   s>   € ô �:‰:�>‰>˜( BÓ'×-Ñ-Ó/×OÐO´3°y·°ÀBÓ3G×3MÑ3MÓ3OÐOr   c               ó    € V ^8„  d   QhRRRR/# )r   Úrawr   r   Úfloatr   )r   s   "r   r   r   ;   s   € ÷ ñ �cð ˜eñ r   c                óî   € V f   \         # \        V 4      P                  4       pV'       g   \         #  \        V4      p\
        P                  ! T4      '       d   T^ 8  d   R# T#   \         d     R# i ; i)u¾  Seconds of clock-skew tolerance for JWT time claims, fail-closed.

Unset â†’ :data:`DEFAULT_TOKEN_LEEWAY_SECONDS` (60s â€” the zero-leeway default
made any issuer-ahead clock skew fail, #47815). An explicit value must be a
finite, non-negative number: unparseable / negative / NaN / inf fall back to
``0.0`` so a typo can only ever *lose* tolerance, never widen the window.
``0`` is honoured (strict pre-fix behaviour for operators who want it).
g        )ÚDEFAULT_TOKEN_LEEWAY_SECONDSr   r2   r6   Ú
ValueErrorÚmathÚisfinite)r5   ÚtextÚvalues   &  r   Úparse_leewayr>   ;   si   € ð ‚{Ü+Ð+Üˆs‹8�>‰>Ó€DßÜ+Ð+ðÜ�d“ˆô �=Š=˜×Ò 5¨1¤9ÙØ€Løô	 ô Úðús   ³A% Á%A4Á3A4c                  ó6   a € ] tR t^TtRtRR V 3R llltRtV ;t# )ÚSkipRegistrationz•Raised by a provider's settings resolver to decline registration; ``reason`` is
the operator-facing text stored in the module's ``LAST_SKIP_REASON``.c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úreasonr   Úlevelr   ÚNoner   )r   s   "r   r   ÚSkipRegistration.__annotate__X   s!   € ÷ 0ñ 0˜sð 0¨3ð 0¸Tñ 0r   c                	óB   <€ \         SV `  V4       WuV n        V n        R # ©N)ÚsuperÚ__init__rB   rC   )ÚselfrB   rC   Ú	__class__s   &&&€r   rI   ÚSkipRegistration.__init__X   s   ø€ Ü‰Ñ˜Ô Ø"(ÐˆŒ�T–Zr   )rC   rB   )r$   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__rI   Ú__static_attributes__Ú__classcell__)rK   s   @r   r@   r@   T   s   ø† ñM÷0÷ 0ð 0r   r@   c          
     ó,   € V ^8„  d   QhRRRRRRRRR	R
/# )r   r   r   r   r   Úprovider_clsÚtypeÚsettingszCallable[[], dict]r   ztuple[Optional[dict], str]r   )r   s   "r   r   r   ]   s4   € ÷ ñ ØðØ&)ðØ9=ðØI[ðàñr   c                ód  €  V! 4       pV! R/ VB pT P                  T4       TR3#   \          d?   p\        YP                  4      ! RY'P                  4       RTP                  3u Rp?# Rp?i\        \
        3 d2   pTP                   RT 2p	TP                  RY)4       RT	3u Rp?# Rp?ii ; i)aF  Build ``provider_cls(**settings())`` and register it on ``ctx``.

Returns ``(kwargs, "")`` on success, ``(None, skip_reason)`` when ``settings`` raised
``SkipRegistration`` (logged at its level) or construction raised ``ValueError`` /
``ProviderError`` (logged as a warning). Callers store the reason in ``LAST_SKIP_REASON``.
z%s: %sNz construction failed: r.   r   )	r@   ÚgetattrrC   rB   r9   r
   rM   ÚwarningÚ register_dashboard_auth_provider)
Úctxr   r   rU   rW   ÚkwargsÚproviderÚskipr'   rB   s
   &&&&&     r   Úregister_providerr`   ]   s«   € ð	Ù“ˆÙÑ) &Ñ)ˆð ×(Ñ(¨Ô2Ø�2ˆ:Ðøô ô !Ü�Ÿ
™
Ô# H¨c·;±;Ô?Ø�T—[‘[Ð Õ ûÜœÐ&ô Ø ×)Ñ)Ð*Ð*@ÀÀÐFˆØ�‰�x Ô-Ø�Vˆ|Õûðús2   ‚& ¦B/±3A*Á$B/Á*B/Á=B/Á>&B*Â$B/Â*B/c               ó    € V ^8„  d   QhRRRR/# )r   r5   Úbytesr   r   r   )r   s   "r   r   r   v   s   € ÷ ?ñ ?�uð ? ñ ?r   c                óh   € \         P                  ! V 4      P                  R4      P                  4       # )u6   Base64url-encode without ``=`` padding (RFC 7636 Â§4).ó   =)Úbase64Úurlsafe_b64encodeÚrstripÚdecode)r5   s   &r   Úb64url_no_padri   v   s'   € ä×#Ò# CÓ(×/Ñ/°Ó5×<Ñ<Ó>Ð>r   c               ó    € V ^8„  d   QhRRRR/# )r   Úredirect_urir   r   rD   r   )r   s   "r   r   r   {   s   € ÷ gñ g¨ð g°ñ gr   c                ó  € \         P                  P                  V 4      pVP                  R9  d   \	        RV : 24      hVP
                  '       d"   VP
                  P                  R4      '       g   \	        RV : 24      hR# )zÒFast-fail obviously-broken redirect_uris before bouncing to the IDP (whose allowlist
is authoritative). Any ``http://`` host is allowed so dashboards behind TLS-terminating
proxies / on LAN IPs aren't rejected.z"redirect_uri must be http(s), got z/auth/callbackz6redirect_uri path must end with '/auth/callback', got N)ÚhttpsÚhttp)ÚurllibÚparseÚurlparseÚschemer
   r   Úendswith)rk   Úparseds   & r   Úvalidate_redirect_uriru   {   sr   € ô �\‰\×"Ñ" <Ó0€FØ‡}�}Ð-Ô-ÜÐ@ÀÑ@PÐQÓRÐRØ�;�;ˆ;˜fŸk™k×2Ñ2Ð3C×DÒDÜÐTÐUaÑTdÐeÓfÐfñ Er   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )r   Úauthorize_urlr   Ú	client_idÚscoperk   r   r	   r   )r   s   "r   r   r   †   s8   € ÷ [ñ [ Cð [°sð [À3ð [ÐVYð [Ð^hñ [r   c               ó€  € \        \        P                  ! ^@4      4      p\        \        P                  ! ^ 4      4      pRRRVRVRVRVR\        \        P                  ! VP                  R4      4      P                  4       4      R	R
/p\        V  R\        P                  P                  V4       2RRV RV 2/R7      # )u   Build the authorization-code + PKCE (S256) redirect and cookie payload. Callers
validate ``redirect_uri`` first. The auth-route layer expects
``cookie_payload["hermes_session_pkce"]`` as a flat ``state=â€¦;verifier=â€¦`` string
(it prepends ``provider=``).Úresponse_typeÚcoderx   rk   ry   ÚstateÚcode_challengeÚasciiÚcode_challenge_methodÚS256Ú?Úhermes_session_pkcezstate=z
;verifier=)Úredirect_urlÚcookie_payload)ri   ÚsecretsÚtoken_bytesÚhashlibÚsha256ÚencodeÚdigestr	   ro   rp   Ú	urlencode)rw   rx   ry   rk   Úcode_verifierr}   Úparamss   &$$$   r   Úpkce_login_startr�   †   s¾   € ô
 "¤'×"5Ò"5°bÓ"9Ó:€MÜœ'×-Ò-¨bÓ1Ó2€Eà˜ ¨i¸ÈÐW^Ð`eÐgnÐpuØœ-¬¯ª°}×7KÑ7KÈGÓ7TÓ(U×(\Ñ(\Ó(^Ó_Ø ð)€Fô Ø%� a¬¯©×(>Ñ(>¸vÓ(FÐ'GÐHØ-°¸°w¸jÈÈÐ/XÐYô[ð [r   c               ó    € V ^8„  d   QhRRRR/# )r   Úresponsezhttpx.Responser   údict[str, Any]r   )r   s   "r   r   r   –   s   € ÷ 2ñ 2˜nð 2°ñ 2r   c                óä   € V P                   P                  RR4      P                  R4      '       g   / #  V P                  4       p\        T\        4      '       d   T# / #   \         d    / u # i ; i)zOJSON object body, or ``{}`` for non-JSON content-type / parse error / non-dict.zcontent-typer.   r   )Úheadersr1   Ú
startswithÚjsonr9   r%   r   )r‘   Úbodys   & r   Úparse_json_bodyr˜   –   sk   € à×Ñ×Ñ °Ó3×>Ñ>Ð?Q×RÒRØˆ	ðØ�}‰}‹ˆô ˜d¤D×)Ò)ˆ4Ð1¨rÐ1øô ô ØŠ	ðús   µA ÁA/Á.A/r”   c               ó<   € V ^8„  d   QhRRRRRRRRR	RR
RRRRRRR/	# )r   Úurlr   Údatazdict[str, str]r”   zOptional[dict[str, str]]Úbad_request_excztype[Exception]ÚidpÚendpointÚ	token_keyÚmissing_msgr   ztuple[str, dict[str, Any]]r   )r   s   "r   r   r   ¡   sT   € ÷ ñ Ø	ðØ"ðØ0HðØbqðà	ðàðà(+ðà:=ðàB\ñr   c               óÎ  €  \         P                  ! Y/ \        CT;'       g    / C\        R7      pTP                  R8X  d)   \        T4      P                  RR4      p
T! T RT
 24      hTP                  ^È8w  d0   \        T RTP                   R	TP                  R
,          : 24      h\        T4      pTP                  T4      pT'       d   \        T\        4      '       g   \        T4      h\        TP                  RR4      4      P                  4       pT'       d   TR8w  d   \        RT: 24      hYË3#   \         P                   d   p	\        T RT	 24      T	hRp	?	ii ; i)uÌ  POST a token grant and return ``(token, payload)``.

A 400 (OAuth-shaped error envelope) raises ``bad_request_exc`` â€” ``InvalidCodeError``
for the auth-code path, ``RefreshExpiredError`` for refresh â€” so the middleware's
distinct handling is preserved. Any other non-200, transport failure, missing
``token_key`` or non-bearer ``token_type`` raises ``ProviderError``. Redirects are
deliberately NOT followed: the body carries an auth code / refresh token.
)r›   r”   Útimeoutz unreachable: Ni�  ÚerrorÚinvalid_requestz rejected token request: z
 returned z: :NéÈ   NÚ
token_typer.   Úbearerzunexpected token_type=)ÚhttpxÚpostÚJSON_HEADERSÚTOKEN_ENDPOINT_TIMEOUT_SECÚRequestErrorr
   Ústatus_coder˜   r1   r<   r%   r   Úlower)rš   r›   r”   rœ   r�   rž   rŸ   r    r‘   r'   Ú
error_codeÚpayloadÚtokenr¦   s   &&$$$$$$      r   Úexchange_tokenr²   ¡   sO  € ðGÜ—:’:˜cÐ6Y¼Ð6YÈ'Ï-È-ÐUWÐ6YÔc}Ô~ˆð ×Ñ˜sÔ"Ü$ XÓ.×2Ñ2°7Ð<MÓNˆ
Ù  Ð%>¸z¸lÐKÓLÐLØ×Ñ˜sÔ"Ü˜x˜j¨
°8×3GÑ3GÐ2HÈÈ8Ï=É=ÐY]ÕK^ÑJaÐbÓcÐcÜ˜hÓ'€GØ�K‰K˜	Ó"€Eßœ
 5¬#×.Ò.Ü˜KÓ(Ð(Ü�W—[‘[ ¨rÓ2Ó3×9Ñ9Ó;€Jß�j HÔ,ÜÐ4°Z±NÐCÓDÐDØˆ>Ðøô ×Ñô GÜ˜x˜j¨°s°eÐ<Ó=À3ÐFûðGús   ‚ D9 £D9 Ä9E$ÅEÅE$r.   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r°   r’   Úfallbackr   r   r   )r   s   "r   r   r   ¿   s!   € ÷ :ñ : ð :¸#ð :Àsñ :r   c                óh   € V P                  R4      p\        V\        4      '       d   V'       d   V# T# )zˆThe token response's refresh token, or ``fallback`` when absent/non-string
(the session then behaves as access-token-only until expiry).Úrefresh_token)r1   r%   r   )r°   r´   Úrts   && r   Úrefresh_token_fromr¸   ¿   s+   € ð 
�‰�_Ó	%€BÜ˜B¤×$Ò$¯ˆ2Ð9°Ð9r   Úlabelr±   ÚemailÚdisplay_nameÚorg_idc               ó<   € V ^8„  d   QhRRRRRRRRRRRRR	RR
RRR/	# )r   r^   r   Úclaimsr’   Úaccess_tokenr¶   r¹   rº   r»   r¼   r   r   r   )r   s   "r   r   r   Æ   sT   € ÷ 
-ñ 
-Øð
-Ø)ð
-Ø<?ð
-ØPSð
-àð
-à!$ð
-à9<ð
-àKNð
-àX_ñ
-r   c               óê   € \        VP                  RR4      4      pV'       g   \        V R24      h\        Y…YgT \	        VR,          4      Y#\        VP                  R4      ;'       g    R4      R7	      # )z=Map verified JWT claims onto a Session; ``sub`` is mandatory.Úsubr.   z missing 'sub' (user_id) claimÚexpÚiss)	Úuser_idrº   r»   r¼   r^   Ú
expires_atr¿   r¶   Úissuer)r   r1   r
   r   Úint)	r^   r¾   r¿   r¶   r¹   rº   r»   r¼   rÄ   s	   &&$$$$$$ r   Úsession_from_claimsrÈ   Æ   sk   € ô �&—*‘*˜U BÓ'Ó(€GßÜ˜u˜gÐ%CÐDÓEÐEÜØ°<ÐYaÜ�v˜e•}Ó%°LÜ�6—:‘:˜eÓ$×*Ð*¨Ó+ô-ð -r   c               ó    € V ^8„  d   QhRRRR/# )r   Újwks_urlr   r   r   r   )r   s   "r   r   r   Õ   s   € ÷ Qñ Q˜sð Q sñ Qr   c           	     ó6   € ^ RI Hp V! V R\        RRRR/R7      # )zƒPyJWKClient with explicit Accept/User-Agent (some WAFs block the library default).
Imported lazily so plugin discovery stays cheap.)ÚPyJWKClientTr   r   z
User-AgentzHermesAgent/1.0)Ú
cache_keysÚlifespanr”   )ÚjwtrÌ   ÚJWKS_CACHE_SECONDS)rÊ   rÌ   s   & r   Úmake_jwks_clientrÑ   Õ   s,   € õ  áØ˜TÔ,>ØÐ-¨|Ð=NÐOôQð Qr   Úleewayc               ó8   € V ^8„  d   QhRRRRRRRRRRR	RR
RRR/# )r   r±   r   Újwks_clientr   Ú
algorithmsz	list[str]ÚaudiencerÆ   r¹   rÒ   r6   r   r’   r   )r   s   "r   r   r   ß   sX   € ÷ 3Uñ 3UØð3UØ ð3UØ1:ð3UØFIð3UØSVð3UØ_bð3Uàð3Uð ñ3Ur   c               ó¤  € ^ RI p VP                  V 4      p TP	                  YP
                  Y#YFR. RO/R7      #   \         d   p	\        T	4      T	hRp	?	ii ; i  TP                   d   p	\        T RT	 24      T	hRp	?	iTP                   d   p	\        T RT	 24      T	hRp	?	iTP                   d   p	\        T RT	 24      T	hRp	?	iTP                   dv   p	R	p
 TP	                  T R
RRR/R7      pRTP                  R4      : RTP                  R4      : RT: RT: R2	p
M  \         d     Mi ; i\        T RT	 T
 24      T	hRp	?	ii ; i)uä  Verify ``token`` against ``jwks_client`` with pinned ``aud``/``iss``.

``leeway`` is seconds of clock-skew tolerance on the time claims (default
60 â€” the previous zero-leeway made any issuer-ahead skew fail login, #47815).

Unreachable JWKS â†’ ``ProviderError`` (503); a bearer that is not one of our JWTs
(opaque peer key, foreign kid) â†’ ``InvalidCodeError`` (None / next provider); folding
both into 503 broke peer-key bearers. Expiry and not-yet-valid (``iat``/``nbf`` in
the future beyond the leeway â€” a *token* failure, not a transport failure) raise
``InvalidCodeError`` (verify_session maps it to None); any other claim failure raises
``ProviderError`` with the unverified iss/aud appended so operators can spot config
drift.
NÚrequireÚaudrÃ   )rÕ   rÖ   rÆ   rÒ   Úoptionsz
 expired: z signature invalid: z not yet valid: r.   Úverify_signatureFÚ
verify_exp)rÚ   z [token iss=z aud=z; expected iss=Ú]z verification failed: )rÂ   ÚiatrÙ   rÃ   rÁ   )rÏ   Úget_signing_key_from_jwtr#   r   rh   ÚkeyÚExpiredSignatureErrorr   ÚInvalidSignatureErrorÚImmatureSignatureErrorÚInvalidTokenErrorr1   r
   )r±   rÔ   rÕ   rÖ   rÆ   r¹   rÒ   rÏ   Úsigning_keyr'   ÚdetailsÚ
unverifieds   &&$$$$$     r   Ú
verify_jwtrè   ß   s   € ó" ð7Ø!×:Ñ:¸5ÓAˆð
UØ�z‰zØ—?‘?¨zÐU[ØÒ CÐDð ó Fð 	Føô ô 7ô )¨Ó-°3Ð6ûð7ûð ×$Ñ$ô CÜ % ¨
°3°%Ð8Ó9¸sÐBûØ×$Ñ$ô Mô  % Ð(<¸S¸EÐBÓCÈÐLûØ×%Ñ%ô Iô  % Ð(8¸¸Ð>Ó?ÀSÐHûØ× Ñ ô Uð ˆð	ØŸ™ EÐ4FÈÈ|Ð]bÐ3c˜ÓdˆJà˜zŸ~™~¨eÓ4Ñ7°u¸Z¿^¹^ÈEÓ=RÑ<Uð V Ø &™z¨¨x©l¸!ð=ñ øô ô 	Ùð	úä˜u˜gÐ%;¸C¸5ÀÀ	ÐJÓKÐQTÐTûðUús‡   †; ˜"A »AÁAÁAÁEÁ+A<Á<EÂEÂB!Â!EÂ4EÂ5CÃEÃEÃE
ÃAD&Ä%E
Ä&D4Ä1E
Ä3D4Ä4E
Å
Ec                  óP   € ] tR tRt$ RtRtR]R&   RtR]R&   R R ltR	 R
 lt	Rt
R# )ÚNonInteractiveMixini  zÚOAuth-redirect stubs for providers without a browser login flow (password / service
credential). ``_NOT_INTERACTIVE`` is the operator-facing reason; ``_NO_START_LOGIN``
optionally overrides the ``start_login`` message.r.   r   Ú_NOT_INTERACTIVEÚ_NO_START_LOGINc               ó    € V ^8„  d   QhRRRR/# )r   rk   r   r   r	   r   )r   s   "r   r   Ú NonInteractiveMixin.__annotate__  s   € ÷ Qñ Q¨3ð Q°:ñ Qr   c               	óT   € \        V P                  ;'       g    V P                  4      hrG   )ÚNotImplementedErrorrì   rë   )rJ   rk   s   &$r   Ústart_loginÚNonInteractiveMixin.start_login  s!   € Ü! $×"6Ñ"6×"OÐ"O¸$×:OÑ:OÓPÐPr   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# ©r   r|   r   r}   r�   rk   r   r   r   )r   s   "r   r   rî   "  s1   € ÷ 9ñ 9 cð 9°#ð 9Àcð 9ÐY\ð 9Ðahñ 9r   c               	ó,   € \        V P                  4      hrG   )rð   rë   ©rJ   r|   r}   r�   rk   s   &$$$$r   Úcomplete_loginÚ"NonInteractiveMixin.complete_login"  s   € Ü! $×"7Ñ"7Ó8Ð8r   r   N)rM   rN   rO   rP   rQ   rë   Ú__annotations__rì   rñ   r÷   rR   r   r   r   rê   rê     s.   ‡ ñ9ð Ð�cÓØ€O�SÓõQ÷9ñ 9r   rê   c                  óh   € ] tR tRt$ RtRtR]R&   RtR]R&   R	 R
 ltR R lt	R R lt
R R ltRtR# )ÚJwtOAuthProvideri&  a  Authorization-code + PKCE provider whose session token is a JWT we verify ourselves
(nous: Portal access token; self-hosted: OIDC ID token). Subclasses set ``_client_id`` and
implement: ``_jwks_uri() -> str``; ``_claims_for(token) -> claims`` (raises
``InvalidCodeError`` on expiry/foreign token, ``ProviderError`` otherwise);
``_grant(data, *, bad_request_exc, headers=None, previous_refresh_token="") -> Session``;
``_refresh_request(refresh_token) -> (form_data, extra_headers)``;
``_session(token, refresh_token, claims) -> Session``.Nr   Ú_jwks_clientr.   r   Ú
_client_idc               ó   € V ^8„  d   QhRR/# )r   r   r   r   )r   s   "r   r   ÚJwtOAuthProvider.__annotate__2  s   € ÷ !ñ ! #ñ !r   c                	ór   € V P                   f   \        V P                  4       4      V n         V P                   # rG   )rü   rÑ   Ú	_jwks_uri)rJ   s   &r   Ú_get_jwks_clientÚ!JwtOAuthProvider._get_jwks_client2  s.   € Ø×ÑÒ$Ü 0°·±Ó1AÓ BˆDÔØ× Ñ Ð r   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# rô   r   )r   s   "r   r   rÿ   7  s1   € ÷ .ñ . cð .°#ð .Àcð .ÐY\ð .Ðahñ .r   c               	óX   € V P                  R RRVRVRV P                  RV/\        R7      # )Ú
grant_typeÚauthorization_coder|   rk   rx   r�   )rœ   )Ú_grantrý   r   rö   s   &$$$$r   r÷   ÚJwtOAuthProvider.complete_login7  s<   € à�{‰{ØÐ/°¸¸~È|Ø˜$Ÿ/™/¨?¸MðKä,ð ó .ð 	.r   c               ó    € V ^8„  d   QhRRRR/# )r   r¶   r   r   r   r   )r   s   "r   r   rÿ   >  s   € ÷ nñ n°ð n¸ñ nr   c               	ó~   € V'       g   \        R 4      hV P                  V4      w  r#V P                  W#\         VR7      # )z#no refresh token present in session)r”   rœ   Úprevious_refresh_token)r   Ú_refresh_requestr  )rJ   r¶   r›   r”   s   &$  r   Úrefresh_sessionÚ JwtOAuthProvider.refresh_session>  sD   € ßÜ%Ð&KÓLÐLØ×-Ñ-¨mÓ<‰ˆØ�{‰{ØÔ3FÐ_lð ó nð 	nr   c               ó    € V ^8„  d   QhRRRR/# )r   r¿   r   r   zOptional[Session]r   )r   s   "r   r   rÿ   E  s   € ÷ 7ñ 7¨cð 7Ð6Gñ 7r   c               	óp   €  V P                  V4      pT P                  TRT4      #   \         d     R # i ; i)Nr.   )Ú_claims_forr   Ú_session)rJ   r¿   r¾   s   &$ r   Úverify_sessionÚJwtOAuthProvider.verify_sessionE  s@   € ð	Ø×%Ñ% lÓ3ˆFð �}‰}˜\¨2¨vÓ6Ð6øô  ô 	Úð	ús   ‚& ¦5´5)rü   )rM   rN   rO   rP   rQ   rü   rù   rý   r  r÷   r  r  rR   r   r   r   rû   rû   &  s7   ‡ ñ>ð €L�#ÓØ€J�Óõ!õ
.õn÷7ñ 7r   rû   )r.   ).rQ   Ú
__future__r   re   rˆ   Úloggingr:   r/   r†   Úurllib.parsero   Útypingr   r   r   r   r¨   Úhermes_cli.dashboard_authr   r   r	   r
   r   r   r   rÐ   r«   rª   r8   r)   r3   r>   r#   r@   r`   ri   ru   r�   r˜   r²   r¸   rÈ   rÑ   rè   rê   rû   r   r   r   Ú<module>r     sø   ðñõ #ã Û Û Û Û 	Û Û ß 0Ó 0ã ÷ ÷  ñ  ð
 Ð Ø!Ð ØÐ,Ð-€ð  $Ð õ
8õPõô20�yô 0õõ2?õ
gõ[õ 2ðØKO÷÷<:ð
-àð
-à')ð
-à?Að
-àQS÷
-õQð3Uà0÷3U÷p9ñ 9ô&7Ð,ö &7r   