
    kj%                    p   d dl mZ d dl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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 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)htpasswd	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    c/home/ubuntu/.cache/pipx/cdb5059130eadca/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.configure0   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_authA   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   r7   r   fs     r   http_connectzProxyAuth.http_connectF   s:    >>d44Q701

;0GDq}}- 8>r   c                    | j                   r^|j                  | j                  v r'| j                  |j                     |j                  d<   y |j                  ry | j                  |       y y r;   )r   r7   r   r=   	is_replayr<   r>   s     r   requestheaderszProxyAuth.requestheadersK   sU    >>}} 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?   r4   r5   is_validis_proxyauth_header
auth_valueschemes	            r   r<   zProxyAuth.authenticate_httpU   s     ~~~ #&x0	**..{B?J)>z)J&FHh~~h9H '/&:AJJ{#		!!+.4X>AJ  		s   AB/ /	B;:B;)returnNone)r8   zmodes.Socks5AuthDatarT   rU   )r?   http.HTTPFlowrT   rU   r?   rV   rT   bool)__name__
__module____qualname__r   __annotations__r   r"   r1   r9   r@   rC   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)rP   status_coderI   reasons       r   rM   rM   s   s    "66'=q)AB"//%ugQ'?@((5F=='=& 2$Qvh /
 		 	r   c                
    | ryy)NzProxy-AuthorizationAuthorizationr]   )rP   s    r   rG   rG      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
    )
isinstancer7   
proxy_moder   RegularModeUpstreamMode)r?   s    r   rF   rF      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)r4   r5   rS   vs       r   mkauthrx      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 schemerq   replacer'   N)	splitlower
ValueErrorrs   
a2b_base64ru   rv   Errorr    )srS   authinfouserr5   es         r   rK   rK      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   r4   r5   s      r   __call__zValidator.__call__   s    !!r   Nr4   r    r5   r    rT   rX   )rY   rZ   r[   __doc__r   r   r]   r   r   r   r      s    :" "r   r   c                      e Zd ZddZy)r)   c                     yr3   r]   r   s      r   r   zAcceptAll.__call__   s    r   Nr   )rY   rZ   r[   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.)r|   r4   r5   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   )r4   r5   r   s      r   r   zSingleUser.__call__   s    }}(FT]]h-FFr   Nr   r    r   rY   rZ   r[   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                    t        j                  |dd        j                         }	 t        j                  j                  |      | _        y # t        t        f$ r}t        j                  d|       |d }~ww xY w)N   zCould not open htpasswd file: )
pathlibPath
expanduserr   HtpasswdFile	from_filer~   OSErrorr
   r.   )r   r   pathr   s       r   r   zHtpasswd.__init__   sq    ||IabM*557	$11;;DADMG$ 	))07	s   $A A:A55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    @r   r+   c                  `    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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: )countr|   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                z    t         j                  j                  j                  |      }d| j                   d| dS )N(r   ))r   utilsconvescape_filter_charsr   )r   r4   s     r   make_search_filterzLdap.make_search_filter  s6    ;;##77A4??#1XJa00r   c                $   |r|sy| j                   j                  | j                  | j                  |             | j                   j                  r@t        j                  | j                  | j                   j                  d   d   |d      }|ryy)NFr   dnTr   )r   searchr   r   rN   r   r   r   )r   r4   r5   cs       r   r   zLdap.__call__   sv    x		$*A*A(*KL99  TYY//248(dA r   Nr   )r   r    rT   z0tuple[bool, str, int | None, str, str, str, str])r4   r    rT   r    r   )	rY   rZ   r[   r\   r   staticmethodr   r   r   r]   r   r   r,   r,      s>    
OO +Q +QZ1
r   r,   )rP   rX   rT   zhttp.Response)rP   rX   rT   r    rW   )rz   )r4   r    r5   r    rS   r    rT   r    )r   r    rT   ztuple[str, str, str])&
__future__r   rs   r   r   abcr   r   collections.abcr   typingr   r   r   r   r	   r
   r   mitmproxy.net.httpr   mitmproxy.proxyr   mitmproxy.proxy.layersr   mitmproxy.utilsr   rb   r   rM   rG   rF   rx   rK   r   r)   r-   r+   r,   r]   r   r   <module>r      s    "      *         + & ( $W Wt*""" "	 
G G@y @Q9 Qr   