§
    øžyj”  ã                  óô   — d Z ddlmZ ddlZddlZddlZddlmZm	Z	 ddl
mZ  eddh¦  «        Zdd	d
œZdd„Z G d„ dej        j        ¦  «        Z G d„ dej        j        ¦  «        Zd d„Zddœd!d„Zg d¢ZdS )"z>Security policy for credential-bearing stdlib urllib requests.é    )ÚannotationsN)ÚCallableÚIterable)ÚAnyÚacceptz
user-agentéP   i»  )ÚhttpÚhttpsÚurlÚstrÚreturnútuple[str, str, int | None]c                ó  — t           j                             | ¦  «        }|j        pd                     ¦   «         }|j        }||j        pd                     ¦   «                              d¦  «        |�|nt           	                    |¦  «        fS )z>Return a normalized (scheme, hostname, effective port) origin.Ú ú.)
ÚurllibÚparseÚurlparseÚschemeÚlowerÚportÚhostnameÚrstripÚ_DEFAULT_PORTSÚget)r   Úparsedr   r   s       ú@/home/ragecks/.hermes/hermes-agent/hermes_cli/urllib_security.pyÚ
url_originr      sƒ   € åŒ\×"Ò" 3Ñ'Ô'€FØŒmÐ!˜r×(Ò(Ñ*Ô*€Fð Œ;€DàØ	ŒÐ	˜B×%Ò%Ñ'Ô'×.Ò.¨sÑ3Ô3ØÐ ˆˆ¥n×&8Ò&8¸Ñ&@Ô&@ðð ó    c                  ó0   ‡ — e Zd ZdZedœdd	„Zˆ fd
„Zˆ xZS )ÚSafeCredentialRedirectHandlerzAPreserve request headers only while redirects stay on one origin.)Úcross_origin_safe_headersÚoriginal_urlr   r"   úIterable[str]r   ÚNonec               ój   — t          |¦  «        | _        t          d„ |D ¦   «         ¦  «        | _        d S )Nc              3  óX   K  — | ]%}t          |¦  «                             ¦   «         V — Œ&d S ©N)r   r   )Ú.0Únames     r   ú	<genexpr>z9SafeCredentialRedirectHandler.__init__.<locals>.<genexpr>)   sC   è è € ð 4
ð 4
Ø"&�C�‰IŒI�OŠOÑÔð4
ð 4
ð 4
ð 4
ð 4
ð 4
r   )r   Ú_original_originÚ	frozensetÚ_cross_origin_safe_headers)Úselfr#   r"   s      r   Ú__init__z&SafeCredentialRedirectHandler.__init__"   sH   € õ !+¨<Ñ 8Ô 8ˆÔÝ*3ð 4
ð 4
Ø*Cð4
ñ 4
ô 4
ñ +
ô +
ˆÔ'Ð'Ð'r   c                ó„  •— t          ¦   «                              ||||||¦  «        }|€d S t          j                             |j        |¦  «        }t          |¦  «        | j        k    rWt          | 	                    ¦   «         ¦  «        D ]5\  }	}
|	 
                    ¦   «         | j        vr|                     |	¦  «         Œ6|S r(   )ÚsuperÚredirect_requestr   r   ÚurljoinÚfull_urlr   r,   ÚlistÚheader_itemsr   r.   Úremove_header)r/   ÚreqÚfpÚcodeÚmsgÚheadersÚnewurlÚ
redirectedÚresolved_urlr*   Ú_valueÚ	__class__s              €r   r3   z.SafeCredentialRedirectHandler.redirect_request-   s¸   ø€ å‘W”W×-Ò-¨c°2°t¸SÀ'È6ÑRÔRˆ
ØÐØ�4å”|×+Ò+¨C¬L¸&ÑAÔAˆÝ�lÑ#Ô# tÔ'<Ò<Ð<õ !% Z×%<Ò%<Ñ%>Ô%>Ñ ?Ô ?ð 3ð 3‘��fØ—:’:‘<”< tÔ'FÐFÐFØ×,Ò,¨TÑ2Ô2Ð2øØÐr   )r#   r   r"   r$   r   r%   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú_CROSS_ORIGIN_SAFE_HEADERSr0   r3   Ú__classcell__)rB   s   @r   r!   r!      sb   ø€ € € € € ØKÐKð 4Nð		
ð 	
ð 	
ð 	
ð 	
ð 	
ðð ð ð ð ð ð ð ð r   r!   c                  ó@   — e Zd ZdZ ed¦  «        Zdd„Zdd
„ZeZeZ	dS )Ú_CrossOriginRequestSanitizerz:Strip headers after installed request processors have run.Úinfr#   r   r   r%   c                ó.   — t          |¦  «        | _        d S r(   )r   r,   )r/   r#   s     r   r0   z%_CrossOriginRequestSanitizer.__init__H   s   € Ý *¨<Ñ 8Ô 8ˆÔÐÐr   Úrequestúurllib.request.Requestc                óî   — t          |j        ¦  «        | j        k    rWt          |                     ¦   «         ¦  «        D ]5\  }}|                     ¦   «         t          vr|                     |¦  «         Œ6|S r(   )r   r5   r,   r6   r7   r   rG   r8   )r/   rM   r*   rA   s       r   Ú	_sanitizez&_CrossOriginRequestSanitizer._sanitizeK   sp   € Ý�gÔ&Ñ'Ô'¨4Ô+@Ò@Ð@Ý $ W×%9Ò%9Ñ%;Ô%;Ñ <Ô <ð 0ð 0‘��fØ—:’:‘<”<Õ'AÐAÐAØ×)Ò)¨$Ñ/Ô/Ð/øØˆr   N)r#   r   r   r%   )rM   rN   )
rC   rD   rE   rF   ÚfloatÚhandler_orderr0   rP   Úhttp_requestÚhttps_request© r   r   rJ   rJ   =   sW   € € € € € ØDÐDð �E˜%‘L”L€Mð9ð 9ð 9ð 9ðð ð ð ð €LØ€M€M€Mr   rJ   r#   c                óÈ  — t          t          j        dd¦  «        }|€t          j                             ¦   «         }d„ t          |dd¦  «        D ¦   «         }|                     t          | ¦  «        ¦  «         |                     t          | ¦  «        ¦  «         t          j        j        |Ž }t          |dt          t          |dd¦  «        ¦  «        ¦  «         g |_	        |S )zFClone the installed opener's handlers, replacing redirect policy only.Ú_openerNc                ót   — g | ]5}t          |t          j        j        ¦  «        °!t	          j        |¦  «        ‘Œ6S rU   )Ú
isinstancer   rM   ÚHTTPRedirectHandlerÚcopy)r)   Úhandlers     r   ú
<listcomp>z8_secure_opener_from_installed_policy.<locals>.<listcomp>\   sG   € ð ð ð àÝ˜'¥6¤>Ô#EÑFÔFðÝŒ	�'ÑÔðð ð r   ÚhandlersrU   Ú_hermes_initial_addheadersÚ
addheaders)
Úgetattrr   rM   Úbuild_openerÚappendr!   rJ   Úsetattrr6   r`   )r#   Ú	installedr^   Úsecureds       r   Ú$_secure_opener_from_installed_policyrg   V   sß   € å�œ¨	°4Ñ8Ô8€IØÐÝ”N×/Ò/Ñ1Ô1ˆ	ðð å˜y¨*°bÑ9Ô9ðñ ô €Hð
 ‡O‚OÕ1°,Ñ?Ô?Ñ@Ô@Ð@Ø‡O‚OÕ0°Ñ>Ô>Ñ?Ô?Ð?ÝŒnÔ)¨8Ð4€Gõ ØØ$Ý�W�Y ¨bÑ1Ô1Ñ2Ô2ñô ð ð
 €GÔØ€Nr   )Úopener_factoryrM   rN   ÚtimeoutrQ   rh   úCallable[..., Any] | Nonec               ó  — |€Wt          | j        ¦  «        }t          |dd¦  «        D ]0\  }}|                      |¦  «        s|                      ||¦  «         Œ1n |t          | j        ¦  «        ¦  «        }|                     | |¬¦  «        S )ab  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.
    Nr_   rU   )ri   )rg   r5   ra   Ú
has_headerÚ
add_headerr!   Úopen)rM   ri   rh   Úopenerr*   Úvalues         r   Úopen_credentialed_urlrq   p   sŸ   € ð ÐÝ5°gÔ6FÑGÔGˆÝ" 6Ð+GÈÑLÔLð 	0ð 	0‰KˆD�%Ø×%Ò% dÑ+Ô+ð 0Ø×"Ò" 4¨Ñ/Ô/Ð/øð	0ð  �Õ =¸gÔ>NÑ OÔ OÑPÔPˆØ�;Š;�w¨ˆ;Ñ0Ô0Ð0r   )r!   rq   r   )r   r   r   r   )r#   r   )rM   rN   ri   rQ   rh   rj   )rF   Ú
__future__r   r[   Úurllib.parser   Úurllib.requestÚcollections.abcr   r   Útypingr   r-   rG   r   r   rM   rZ   r!   ÚBaseHandlerrJ   rg   rq   Ú__all__rU   r   r   ú<module>ry      sJ  ðØ DÐ Dà "Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ø Ð Ð Ð Ø .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ø Ð Ð Ð Ð Ð ð '˜Y¨°,Ð'?Ñ@Ô@Ð Ø sÐ+Ð+€ðð ð ð ðð ð ð ð  F¤NÔ$Fñ ô ð ð<ð ð ð ð  6¤>Ô#=ñ ô ð ð2ð ð ð ð< 15ð	1ð 1ð 1ð 1ð 1ð 1ð.ð ð €€€r   