
    `gj                       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y)z>Security policy for credential-bearing stdlib urllib requests.    )annotationsN)CallableIterable)Anyacceptz
user-agentP   i  )httphttpsc                $   t         j                  j                  |       }|j                  xs dj	                         }|j
                  }||j                  xs dj	                         j                  d      ||fS t        j                  |      fS )z>Return a normalized (scheme, hostname, effective port) origin. .)
urllibparseurlparseschemelowerporthostnamerstrip_DEFAULT_PORTSget)urlparsedr   r   s       M/root/.hermes/venv/lib/python3.12/site-packages/hermes_cli/urllib_security.py
url_originr      s    \\""3'Fmm!r((*F ;;D		B%%'..s3   '5&8&8&@     c                  :     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_headersc               R    t        |      | _        t        d |D              | _        y )Nc              3  N   K   | ]  }t        |      j                           y wN)strr   ).0names     r   	<genexpr>z9SafeCredentialRedirectHandler.__init__.<locals>.<genexpr>)   s       4
"&CIOO4
s   #%)r   _original_origin	frozenset_cross_origin_safe_headers)selforiginal_urlr   s      r   __init__z&SafeCredentialRedirectHandler.__init__"   s+     !+< 8*3 4
*C4
 +
'r   c                X   t         |   ||||||      }|y t        j                  j	                  |j
                  |      }t        |      | j                  k7  rOt        |j                               D ]3  \  }	}
|	j                         | j                  vs#|j                  |	       5 |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   r/   z.SafeCredentialRedirectHandler.redirect_request-   s    W-c2tS'6R
||++CLL&Al#t'<'<< !%Z%<%<%> ? 3f::<t'F'FF,,T23 r   )r+   r#   r   zIterable[str]returnNone)__name__
__module____qualname____doc___CROSS_ORIGIN_SAFE_HEADERSr,   r/   __classcell__)r>   s   @r   r   r      s7    K 4N		
	
 $1		

 
	
 r   r   c                  8    e Zd ZdZ ed      ZddZddZeZeZ	y)_CrossOriginRequestSanitizerz:Strip headers after installed request processors have run.infc                $    t        |      | _        y r"   )r   r'   )r*   r+   s     r   r,   z%_CrossOriginRequestSanitizer.__init__H   s     *< 8r   c                    t        |j                        | j                  k7  rIt        |j	                               D ]-  \  }}|j                         t        vs|j                  |       / |S r"   )r   r1   r'   r2   r3   r   rE   r4   )r*   requestr%   r=   s       r   	_sanitizez&_CrossOriginRequestSanitizer._sanitizeK   s`    g&&'4+@+@@ $W%9%9%; < 0f::<'AA))$/0 r   N)r+   r#   r?   r@   )rL   urllib.request.Request)
rA   rB   rC   rD   floathandler_orderr,   rM   http_requesthttps_request r   r   rH   rH   =   s&    D %LM9 LMr   rH   c                   t        t        j                  dd      }|t        j                  j                         }t        |dd      D cg c];  }t	        |t        j                  j
                        st        j                  |      = }}|j                  t        |              |j                  t        |              t        j                  j                  | }t        |dt        t        |dd                   g |_        |S c c}w )zFClone the installed opener's handlers, replacing redirect policy only._openerNhandlersrS   _hermes_initial_addheaders
addheaders)getattrr   rL   build_opener
isinstanceHTTPRedirectHandlercopyappendr   rH   setattrr2   rX   )r+   	installedhandlerrV   secureds        r   $_secure_opener_from_installed_policyrc   V   s    	48INN//1	 y*b9'6>>#E#EF 			'H 
 OO1,?@OO0>?nn))84G $WYb12
 GN#s   A D)opener_factoryc                   |Ot        | j                        }t        |dd      D ])  \  }}| j                  |      r| j	                  ||       + n |t        | j                              }|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.
    rW   rS   )timeout)rc   r1   rY   
has_header
add_headerr   open)rL   rf   rd   openerr%   values         r   open_credentialed_urlrl   p   s     5g6F6FG"6+GL 	0KD%%%d+""4/	0   =g>N>N OP;;w;00r   )r   rl   r   )r   r#   r?   ztuple[str, str, int | None])r+   r#   )rL   rN   rf   rO   rd   zCallable[..., Any] | None)rD   
__future__r   r]   urllib.parser   urllib.requestcollections.abcr   r   typingr   r(   rE   r   r   rL   r\   r   BaseHandlerrH   rc   rl   __all__rS   r   r   <module>rt      s    D "    .  ','?@ s+FNN$F$F <6>>#=#= 2< 15	1#1 1 .	1.r   