
    nSj                        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-agentP   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/ice/.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IIOO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    WW--c2tS'6RR
4|++CL&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%LLM9 9 9 9    LMMMr   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8IN//11	 y*b99  H
 OO1,??@@@OO0>>???n)84G $WY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     5g6FGG"6+GLL 	0 	0KD%%%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++       FN$F   <    6>#=   2   < 15	1 1 1 1 1 1.  r   