+
    „WÝj¼  ã                  ór  € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	H
t
Ht ^ RIHt ]P                  ! ]4      t]! RR04      tR^PRR	/tR
 R ltR R lt ! R R]P,                  P.                  4      t ! R R]P,                  P2                  4      tR R ltRR/R R lltRRRR/R R llt. ROtR# )z>Security policy for credential-bearing stdlib urllib requests.)ÚannotationsN)ÚCallableÚIterable)ÚAnyÚacceptz
user-agentÚhttpÚhttpsi»  c               ó    € V ^8„  d   QhRRRR/# )é   ÚurlÚstrÚreturnztuple[str, str, int | None]© )Úformats   "ÚNC:\Users\johnn\AppData\Local\hermes\hermes-agent\hermes_cli\urllib_security.pyÚ__annotate__r      s   € ÷ yñ y�Cð yÐ7ñ yó    c                ó>  € \         P                  P                  V 4      pVP                  ;'       g    RP	                  4       pVP
                  pY!P                  ;'       g    RP	                  4       P                  R4      Ve   V3# \        P                  V4      3# )z>Return a normalized (scheme, hostname, effective port) origin.Ú Ú.)
ÚurllibÚparseÚurlparseÚschemeÚlowerÚportÚhostnameÚrstripÚ_DEFAULT_PORTSÚget)r   Úparsedr   r   s   &   r   Ú
url_originr!      s€   € ä�\‰\×"Ñ" 3Ó'€FØ�m‰m×!Ð!˜r×(Ñ(Ó*€Fð �;‰;€DØ—O‘O×)Ð) r×0Ñ0Ó2×9Ñ9¸#Ó>ÈÒHXÀÐxÐxÔ^l×^pÑ^pÐqwÓ^xÐxÐxr   c               ó    € V ^8„  d   QhRRRR/# )r
   Úkeepzfrozenset[str]r   ÚNoner   )r   s   "r   r   r      s   € ÷ (ñ ( .ð (°Tñ (r   c                óš   € \        V P                  4       4       F-  w  r#VP                  4       V9  g   K  V P                  V4       K/  	  R# )zFDrop every header on *request* whose lowercased name is not in *keep*.N)ÚlistÚheader_itemsr   Úremove_header)Úrequestr#   ÚnameÚ_values   &&  r   Ú_strip_headersr,      s8   € ä˜W×1Ñ1Ó3Ö4‰ˆØ�:‰:‹<˜tÖ#Ø×!Ñ! $Ö'ó 5r   c                  ó@   a € ] tR t^&tRtR]/R R lltV 3R ltRtV ;t	# )ÚSafeCredentialRedirectHandlerzAPreserve request headers only while redirects stay on one origin.Úcross_origin_safe_headersc               ó$   € V ^8„  d   QhRRRRRR/# )r
   Úoriginal_urlr   r/   zIterable[str]r   r$   r   )r   s   "r   r   Ú*SafeCredentialRedirectHandler.__annotate__)   s)   € ÷ mñ mØðmØ?Lðmà	ñmr   c               	óT   € \        V4      V n        \        R  V 4       4      V n        R# )c              3  óT   "  € T F  p\        V4      P                  4       x € K   	  R # 5i©N)r   r   )Ú.0r*   s   & r   Ú	<genexpr>Ú9SafeCredentialRedirectHandler.__init__.<locals>.<genexpr>-   s    é € Ð3lÑRkÈ$´C¸³I·O±O×4EÐ4EÓRkùs   ‚&(N)r!   Ú_original_originÚ	frozensetÚ_cross_origin_safe_headers)Úselfr1   r/   s   &&$r   Ú__init__Ú&SafeCredentialRedirectHandler.__init__)   s%   € ô !+¨<Ó 8ˆÔÜ*3Ñ3lÑRkÓ3lÓ*lˆÖ'r   c                	óä   <€ \         SV `  WW4WV4      pVf   R # \        \        P                  P                  VP                  V4      4      V P                  8w  d   \        WpP                  4       V# r5   )
ÚsuperÚredirect_requestr!   r   r   ÚurljoinÚfull_urlr9   r,   r;   )	r<   ÚreqÚfpÚcodeÚmsgÚheadersÚnewurlÚ
redirectedÚ	__class__s	   &&&&&&& €r   rA   Ú.SafeCredentialRedirectHandler.redirect_request/   s]   ø€ ä‘WÑ-¨c°tÀ'ÓRˆ
ØÒÙô ”f—l‘l×*Ñ*¨3¯<©<¸Ó@ÓAÀT×EZÑEZÔZÜ˜:×'FÑ'FÔGØÐr   )r;   r9   )
Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú_CROSS_ORIGIN_SAFE_HEADERSr=   rA   Ú__static_attributes__Ú__classcell__)rK   s   @r   r.   r.   &   s   ø† ÙKðmØOi÷m÷
ó 
r   r.   c                  óJ   € ] tR t^<tRt]! R4      tR R ltR R lt]t	]t
RtR# )	Ú_CrossOriginRequestSanitizerz:Strip headers after installed request processors have run.Úinfc               ó    € V ^8„  d   QhRRRR/# )r
   r1   r   r   r$   r   )r   s   "r   r   Ú)_CrossOriginRequestSanitizer.__annotate__E   s   € ÷ 9ñ 9 Sð 9¨Tñ 9r   c                	ó&   € \        V4      V n        R # r5   )r!   r9   )r<   r1   s   &&r   r=   Ú%_CrossOriginRequestSanitizer.__init__E   s   € Ü *¨<Ó 8ˆÖr   c               ó   € V ^8„  d   QhRR/# )r
   r)   úurllib.request.Requestr   )r   s   "r   r   rY   H   s   € ÷ ñ Ð!7ñ r   c                	ón   € \        VP                  4      V P                  8w  d   \        V\        4       V# r5   )r!   rC   r9   r,   rR   )r<   r)   s   &&r   Ú	_sanitizeÚ&_CrossOriginRequestSanitizer._sanitizeH   s+   € Ü�g×&Ñ&Ó'¨4×+@Ñ+@Ô@Ü˜7Ô$>Ô?Øˆr   )r9   N)rM   rN   rO   rP   rQ   ÚfloatÚhandler_orderr=   r_   Úhttp_requestÚhttps_requestrS   r   r   r   rV   rV   <   s&   † ÙDñ ˜%“L€Mõ9õð
 €LØ„Mr   rV   c               ó   € V ^8„  d   QhRR/# )r
   r   zssl.SSLContext | Noner   )r   s   "r   r   r   Q   s   € ÷ 
ñ 
Ð!6ñ 
r   c                 ó    € ^ RI Hp  V ! 4        R# )uï   TLS context for Hermes-owned urllib openers.

None means "use urllib's default", which â€” with the OS trust store
installed process-wide â€” already verifies against the platform's
certificates. There is nothing to resolve here any more.
©Úinstall_truststoreN)Úagent.ssl_verifyrh   rg   s    r   Ú_resolved_https_contextrj   Q   s   € õ 4áÔÙr   Ússl_contextc               ó   € V ^8„  d   QhRR/# )r
   r1   r   r   )r   s   "r   r   r   ^   s   € ÷ ñ °sñ r   c               óT  € \        \        P                  RR4      pVfN   \        4       p\        P                  P                  ! Vf   . M \        P                  P                  VR7      .!  p\        \        P                  RR4      pVRJ;'       d    VRJp\        VRR4       Uu. uF`  p\        V\        P                  P                  4      '       d   K/  V'       d   \        Wd4      '       d   KJ  \        P                  ! V4      NKb  	  ppV'       d   VP                  V! VR7      4       VP                  \        V 4      4       VP                  \        V 4      4       \        P                  P                  ! V!  p\        \        VRR4      4      Vn        . Vn        V# u upi )a“  Clone the installed opener's handlers, replacing redirect policy only.

When ``ssl_context`` is provided, the cloned HTTPS handler is replaced with
one bound to that context so per-provider TLS settings (``ssl_ca_cert`` /
``ssl_verify``) apply to this request. When it is None, Hermes-owned
openers verify against the OS trust store; an application-installed
opener's TLS policy is preserved unchanged.
Ú_openerN)ÚcontextÚHTTPSHandlerÚhandlersÚ
addheadersr   )Úgetattrr   r)   rj   Úbuild_openerrp   Ú
isinstanceÚHTTPRedirectHandlerÚcopyÚappendr.   rV   r&   Ú_hermes_initial_addheadersrr   )	r1   rk   Ú	installedro   Ú_https_handler_clsÚreplace_httpsÚhandlerrq   Úsecureds	   &$       r   Ú$_secure_opener_from_installed_policyr   ^   sS  € ô œŸ™¨	°4Ó8€IØÒÜ)Ó+ˆÜ—N‘N×/Ò/¸º±"ÌfÏnÉn×NiÑNiÐryÐNiÓNzÐM{Ñ}ˆ	ä ¤§¡°ÀÓFÐØ tÐ+×NÐNÐ0BÈ$Ð0N€Mô ˜y¨*°bÔ9óá9ˆGÜ˜'¤6§>¡>×#EÑ#E×Fô 	÷ ¤:¨g×#Jô 	Œ�	Š	�'ÖÙ9ð ð ÷ Ø�‰Ñ*°;Ô?Ô@Ø‡O�OÔ1°,Ó?Ô@Ø‡O�OÔ0°Ó>Ô?Ü�n‰n×)Ò)¨8Ñ4€Gô *.¬g°iÀÈrÓ.RÓ)S€GÔ&Ø€GÔØ€Nùòs   Â',F%ÃF%Ã F%Ã3F%Úopener_factoryc               ó$   € V ^8„  d   QhRRRRRR/# )r
   r)   r]   Útimeoutra   r€   zCallable[..., Any] | Noner   )r   s   "r   r   r   €   s(   € ÷ 1ñ 1Ø#ð1ð ð1ð .ñ	1r   c               ó  € VfY   \        V P                  VR7      p\        VRR4       F/  w  rVV P                  V4      '       d   K  V P	                  WV4       K1  	  MV! \        V P                  4      4      pVP                  WR7      # )a’  Open a request without forwarding credentials across origins.

The default preserves an application-installed opener's proxy, TLS,
cookies, custom protocol handlers, and instrumentation while replacing its
redirect handler. ``opener_factory`` is an explicit test seam; security is
never disabled based on global ``urlopen`` identity.

``ssl_context`` (an ``ssl.SSLContext``) overrides the HTTPS handler's TLS
policy for this request only. It is used to honor a custom provider's
``ssl_ca_cert`` / ``ssl_verify`` on the ``/models`` discovery path, which
otherwise falls back to the process-wide platform trust store
(``agent.ssl_verify.install_truststore``).
)rk   ry   )r‚   r   )r   rC   rs   Ú
has_headerÚ
add_headerr.   Úopen)r)   r‚   r€   rk   Úopenerr*   Úvalues   &$$$   r   Úopen_credentialed_urlr‰   €   s|   € ð( ÒÜ5°g×6FÑ6FÐT_Ô`ˆÜ" 6Ð+GÈÖL‰KˆDØ×%Ñ% d×+Ô+Ø×"Ñ" 4Ö/ò Mñ  Ô =¸g×>NÑ>NÓ OÓPˆØ�;‰;�wˆ;Ó0Ð0r   )r.   r‰   r!   )rQ   Ú
__future__r   rw   ÚloggingÚsslÚurllib.parser   Úurllib.requestÚcollections.abcr   r   Útypingr   Ú	getLoggerrM   Úloggerr:   rR   r   r!   r,   r)   rv   r.   ÚBaseHandlerrV   rj   r   r‰   Ú__all__r   r   r   Ú<module>r•      sº   ðÙ Då "ã Û Û 
Û Û ß .Ý à	×	Ò	˜8Ó	$€ñ '¨°,Ð'?Ó@Ð Ø˜"˜g sÐ+€õyõ(ô F§N¡N×$FÑ$Fô ô, 6§>¡>×#=Ñ#=ô õ*
ðÈ4÷ ðD1ð 15ð	1ð
 ÷1ò< S‚r   