
    @OOfL$                    d   d dl mZ d dlZd dlZd dlmZ d dlmZ d dlmZ d dl	m
Z
 d dlZd dlZd dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZ dZ G d d      Zd dZd!dZd"dZd#d$dZd%dZ G d de      Z  G d de       Z! G d de       Z" G d de       Z# G d de       Z$y)&    )annotationsN)ABC)abstractmethod)MutableMapping)Optional)
connection)ctx)
exceptions)http)status_codes)
mode_specs)modes	mitmproxyc                  P    e Zd ZU dZded<   ddZd Zd ZddZddZ	dd	Z
dd
Zy)	ProxyAuthNzValidator | None	validatorc                6    t        j                         | _        y N)weakrefWeakKeyDictionaryauthenticated)selfs    [/var/www/premiumrankchecker/venv/lib/python3.12/site-packages/mitmproxy/addons/proxyauth.py__init__zProxyAuth.__init__   s    %%' 	 	`    c                B    |j                  dt        t           d d       y )N	proxyauthaD  
            Require proxy authentication. Format:
            "username:pass",
            "any" to accept any user/pass combination,
            "@path" to use an Apache htpasswd file,
            or "ldap[s]:url_server_ldap[:port]:dn_auth:password:dn_subtree[?search_filter_key=...]" for LDAP authentication.
            )
add_optionr   str)r   loaders     r   loadzProxyAuth.load!   s"    SM		
r   c                   d|v rt         j                  j                  }|r|dk(  rt               | _        y |j                  d      rt        |      | _        y t         j                  j                  j                  d      rt        |      | _        y dt         j                  j                  v rt        |      | _        y t        j                  d      d | _        y y )Nr   any@ldap:z Invalid proxyauth specification.)r	   optionsr   	AcceptAllr   
startswithHtpasswdLdap
SingleUserr
   OptionsError)r   updatedauths      r   	configurezProxyAuth.configure/   s    '!;;((D5=%.[DN__S)%-d^DN[[**55f=%)$ZDNCKK111%/%5DN$112TUU!% "r   c                    | j                   r^| j                  |j                  |j                        r7d|_        |j                  |j                  f| j                  |j
                  <   y y y NT)r   usernamepasswordvalidr   client_conn)r   datas     r   socks5_authzProxyAuth.socks5_auth@   sP    >>dnnT]]DMMJDJ37==$--3ODt//0 K>r   c                    | j                   r9| j                  |      r'|j                  d   | j                  |j                  <   y y y Nr   )r   authenticate_httpmetadatar   r6   r   fs     r   http_connectzProxyAuth.http_connectE   s:    >>d44Q701

;0GDq}}- 8>r   c                    | j                   rQ|j                  | j                  v r'| j                  |j                     |j                  d<   y | j	                  |       y y r:   )r   r6   r   r<   r;   r=   s     r   requestheaderszProxyAuth.requestheadersJ   sK    >>}} 2 22*.*<*<Q]]*K

;'&&q) r   c                |   | j                   sJ d}d}d}t        |      }t        |      }	 |j                  j                  j                  |d      }t        |      \  }}}| j                  ||      }|r)||f|j                  d<   |j                  j                  |= yt        |      |_
        y# t        $ r Y Gw xY w)a  
        Authenticate an HTTP request, returns if authentication was successful.

        If valid credentials are found, the matching authentication header is removed.
        In no or invalid credentials are found, flow.response is set to an error page.
        NF r   T)r   is_http_proxyhttp_auth_headerrequestheadersgetparse_http_basic_auth	Exceptionr<   make_auth_required_responseresponse)	r   r>   r3   r4   is_validis_proxyauth_header
auth_valueschemes	            r   r;   zProxyAuth.authenticate_httpR   s     ~~~ #&x0	**..{B?J)>z)J&FHh~~h9H '/&:AJJ{#		!!+.4X>AJ  		s   AB/ /	B;:B;)returnNone)r7   zmodes.Socks5AuthDatarR   rS   )r>   http.HTTPFlowrR   rS   r>   rT   rR   bool)__name__
__module____qualname__r   __annotations__r   r!   r0   r8   r?   rA   r;    r   r   r   r      s3    "&I&`
&"P
H
*r   r   c                   | rt         j                  }ddt         di}nt         j                  }ddt         di}t        j                   j
                  |   }t        j                  j                  |d| d| d| d| d	|      S )	NzProxy-AuthenticatezBasic realm=""zWWW-Authenticatez<html><head><title> z</title></head><body><h1>z</h1></body></html>)r   PROXY_AUTH_REQUIREDREALMUNAUTHORIZEDr   	RESPONSESResponsemake)rN   status_coderG   reasons       r   rK   rK   p   s    "66'=q)AB"//%ugQ'?@((5F=='=& 2$Qvh /
 		 	r   c                
    | ryy)NzProxy-AuthorizationAuthorizationr[   )rN   s    r   rE   rE      s    $r   c                ~    t        | j                  j                  t        j                  t        j
                  f      S )z
    Returns:
        - True, if authentication is done as if mitmproxy is a proxy
        - False, if authentication is done as if mitmproxy is an HTTP server
    )
isinstancer6   
proxy_moder   RegularModeUpstreamMode)r>   s    r   rD   rD      s1     	  :#9#9:;R;R"S r   c                    t        j                  | dz   |z   j                  d            j                  d      }|dz   |z   S )z#
    Craft a basic auth string
    r&   utf8asciir^   )binascii
b2a_base64encodedecode)r3   r4   rQ   vs       r   mkauthrv      sB     	X^h6>>vFGNNwWAC<!r   c                X   | j                         \  }}|j                         dk7  rt        d      	 t        j                  |j                               j                  dd      j                  d      \  }}|||fS # t        j                  $ r}t        t        |            d}~ww xY w)zU
    Parse a basic auth header.
    Raises a ValueError if the input is invalid.
    basiczUnknown schemero   replacer&   N)	splitlower
ValueErrorrq   
a2b_base64rs   rt   Errorr   )srQ   authinfouserr4   es         r   rI   rI      s    
 wwyFH||~ )**! 1299&)LRRSVW 	h
 4!! >> !Q  !s   AA= =B)B$$B)c                  "    e Zd ZdZedd       Zy)	Validatorz0Base class for all username/password validators.c                    t         r   )NotImplementedErrorr   r3   r4   s      r   __call__zValidator.__call__   s    !!r   Nr3   r   r4   r   rR   rV   )rW   rX   rY   __doc__r   r   r[   r   r   r   r      s    :" "r   r   c                      e Zd ZddZy)r(   c                     yr2   r[   r   s      r   r   zAcceptAll.__call__   s    r   Nr   )rW   rX   rY   r   r[   r   r   r(   r(      s    r   r(   c                      e Zd ZddZddZy)r,   c                    	 |j                  d      \  | _        | _        y # t        $ r t	        j
                  d      w xY w)Nr&   z'Invalid single-user auth specification.)rz   r3   r4   r|   r
   r-   )r   r   s     r   r   zSingleUser.__init__   sB    	U+4??3+?(DM4= 	U))*STT	Us	   ! A c                B    | j                   |k(  xr | j                  |k(  S r   )r3   r4   r   s      r   r   zSingleUser.__call__   s    }}(FT]]h-FFr   Nr   r   r   rW   rX   rY   r   r   r[   r   r   r,   r,      s    UGr   r,   c                      e Zd ZddZddZy)r*   c                    |dd  }	 t         j                  j                  |      | _        y # t        t
        f$ r t        j                  d|       w xY w)N   zCould not open htpasswd file: )passlibapacheHtpasswdFilehtpasswdr|   OSErrorr
   r-   )r   r   paths      r   r   zHtpasswd.__init__   sX    }	S#NN77=DMG$ 	S)),J4&*QRR	Ss	   $, (Ac                :    | j                   j                  ||      S r   )r   check_passwordr   s      r   r   zHtpasswd.__call__   s    }}++Hh??r   Nr   r   r   r[   r   r   r*   r*      s    S@r   r*   c                  X    e Zd ZU ded<   ded<   ded<   ded<   ddZedd	       Zdd
Zy)r+   zldap3.Connectionconnzldap3.Serverserverr   
dn_subtree
filter_keyc                    | j                  |      \  }}}}}| _        | _        t        j                  |||      }t        j
                  |||d      }|| _        || _        y )N)portuse_sslT	auto_bind)
parse_specr   r   ldap3Server
Connectionr   r   )	r   r   r   urlr   	ldap_user	ldap_passr   r   s	            r   r   zLdap.__init__   sd     OOI&	
OOcg>	9M	r   c                   	 | j                  d      dkD  r$| j                  d      \  }}}}}}t        |      }n| j                  d      \  }}}}}d }d|v r6|j                  d      \  }}|j                  d      \  }	}
|	dk(  r|
}nt        d}|dk(  rd}n|d	k(  rd
}nt        |||||||fS # t        $ r t	        j
                  d|        w xY w)Nr&      ?=search_filter_keycnldapsTr%   FzInvalid LDAP specification: )countrz   intr|   r
   r-   )specsecurityr   port_strr   r   r   r   
search_strkeyvaluer   r   s                r   r   zLdap.parse_spec   s   *	Qzz#" JJsO8}BF**S/?#y)Zj )3)9)9#)>&
J'--c2
U--(-%$$$(!7"V#   !   	Q)),H*OPP	Qs   B+B. ."Cc                (   |r|sy| j                   j                  | j                  d| j                   d| d       | j                   j                  r@t        j                  | j                  | j                   j                  d   d   |d      }|ryy)	NF(r   )r   dnTr   )r   searchr   r   rL   r   r   r   )r   r3   r4   cs       r   r   zLdap.__call__  s    x		Adoo->az*KL99  TYY//248(dA r   Nr   )r   r   rR   z0tuple[bool, str, int | None, str, str, str, str]r   )rW   rX   rY   rZ   r   staticmethodr   r   r[   r   r   r+   r+      s9    
OO +Q +QZ
r   r+   )rN   rV   rR   zhttp.Response)rN   rV   rR   r   rU   )rx   )r3   r   r4   r   rQ   r   rR   r   )r   r   rR   ztuple[str, str, str])%
__future__r   rq   r   abcr   r   collections.abcr   typingr   r   passlib.apacher   r   r   r	   r
   r   mitmproxy.net.httpr   mitmproxy.proxyr   mitmproxy.proxy.layersr   r`   r   rK   rE   rD   rv   rI   r   r(   r,   r*   r+   r[   r   r   <module>r      s    "     *          + & (U Up*""" "	 
G G	@y 	@M9 Mr   