
    @OOfYE                       d Z ddlmZ ddlZddlZddlZddlZddlZddl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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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dl"m&Z& ddl'm(Z( ddl)m*Z* ddl+m,Z, e	jZ                  dk  rddl.m/Z/ nddlm/Z/ erddl0m1Z1  ejd                  e3      Z4 G d de&jj                        Z6 ede%jn                         Z8 G d! d"ejr                        Z: G d# d$ee8   e%      Z; G d& d'e;e8   e%      Z< G d( d)e;e%jz                           Z> G d* d+e;e%j~                           Z@ G d, d-e<e%j                           ZB G d. d/e<e%j                           ZD G d0 d1e<e%j                           ZF G d2 d3e<e%j                           ZH G d4 d5e<e%j                           ZJ G d6 d7e<e%j                           ZLy)8aA  
This module defines "server instances", which manage
the TCP/UDP servers spawned by mitmproxy as specified by the proxy mode.

Example:

    mode = ProxyMode.parse("reverse:https://example.com")
    inst = ServerInstance.make(mode, manager_that_handles_callbacks)
    await inst.start()
    # TCP server is running now.
    )annotationsN)ABCMeta)abstractmethod)contextmanager)Path)cast)ClassVar)Generic)get_args)TYPE_CHECKING)TypeVar)ctx)flow)platform)Address)local_ip)commands)layers)
mode_specs)server)Context)Layer)human)      )Self)Masterc                  2     e Zd ZU ded<    fdZddZ xZS )ProxyConnectionHandlerr   masterc                    || _         t        | 	  ||||       t        j                  | j
                  j                         d| _        y )Nz: )r    super__init__r   format_addressclientpeername
log_prefix)selfr    rwoptionsmode	__class__s         ]/var/www/premiumrankchecker/venv/lib/python3.12/site-packages/mitmproxy/proxy/mode_servers.pyr#   zProxyConnectionHandler.__init__@   sA    Aw-"11$++2F2FGHK    c                T  K   | j                   j                         5  |j                         \  }| j                  j                  j                  |       d {    t        |t        j                        r|j                          d {    d d d        y 7 ?7 # 1 sw Y   y xY wwN)
timeout_watchdogdisarmargsr    addonshandle_lifecycle
isinstancer   Flowwait_for_resume)r(   hookdatas      r.   handle_hookz"ProxyConnectionHandler.handle_hookE   s     ""))+ 	-iikGT++$$55d;;;$		***,,,	- 	- <,	- 	-s@   B(;BB1B
BB	B(BBB%!B()r:   zcommands.StartHookreturnNone)__name__
__module____qualname____annotations__r#   r<   __classcell__r-   s   @r.   r   r   =   s    NL
-r/   r   M)boundc                  2    e Zd ZU ded<   e	 	 	 	 dd       Zy)ServerManagerz)dict[tuple | str, ProxyConnectionHandler]connectionsc                     y r1    )r(   connection_idhandlers      r.   register_connectionz!ServerManager.register_connectionU   s     r/   N)rL   ztuple | strrM   r   )r?   r@   rA   rB   r   rN   rK   r/   r.   rH   rH   Q   s*    ::(3I r/   rH   c                      e Zd ZU i Zded<   dZded<   ddZd Ze	 	 	 	 	 	 dd       Z	e
edd	              Zdd
ZddZedd       Zedd       Ze
edd              Zedd       ZddZ	 	 	 	 	 	 ddZddZy)ServerInstancez)ClassVar[dict[str, type[ServerInstance]]]_ServerInstance__modesNzException | Nonelast_exceptionc                     || _         || _        y r1   )r,   manager)r(   r,   rT   s      r.   r#   zServerInstance.__init__`   s    	&-r/   c                
   t        | j                  d         d   }t        |t              sXt	        |t
        j                        sJ |j                  t        j                  vsJ | t        j                  |j                  <   yy)z2Register all subclasses so that make() finds them.r   N)
r   __orig_bases__r7   r   
issubclassr   	ProxyMode	type_namerP   rQ   )clskwargsr,   s      r.   __init_subclass__z ServerInstance.__init_subclass__d   so     **1-.q1$(dJ$8$8999>>)?)????58N""4>>2 )r/   c                    t        |t              rt        j                  j	                  |      }t        j                  |j                     ||      }t        ||       st        |d| j                   d      |S )Nz is not a spec for a z server.)
r7   strr   rX   parserP   rQ   rY   
ValueErrorr?   )rZ   r,   rT   insts       r.   makezServerInstance.makem   sk     dC ''--d3D%%dnn5dGD$$x'<S\\N(STTr/   c                     y r1   rK   r(   s    r.   
is_runningzServerInstance.is_running|        	r/   c                  K   	 | j                          d {    d | _        | j                  rldj	                  | j                  D ch c]  }t        j                  |       c}      }t        j                  | j                  j                   d| d       y t        j                  | j                  j                   d       y 7 # t        $ r}|| _         d }~ww xY wc c}w w)N and z listening at .z	 started.)_startrR   	Exceptionlisten_addrsjoinr   r$   loggerinfor,   description)r(   eaaddrss       r.   startzServerInstance.start   s     	'++-
 #'DLL4CTCT!Ua%"6"6q"9!UVEKK499001waHIKK499001;<   	"#D	 "VsD   C(C
 CC
 ,C(C#$A$C(C
 
	C CC  C(c                  K   | j                   }	 | j                          d {    d | _        |rbdj	                  |D ch c]  }t        j                  |       c}      }t        j                  | j                  j                   d| d       y t        j                  | j                  j                   d       y 7 # t        $ r}|| _         d }~ww xY wc c}w w)Nrh   z at z	 stopped.)rl   _stoprR   rk   rm   r   r$   rn   ro   r,   rp   )r(   rl   rq   rr   rs   s        r.   stopzServerInstance.stop   s     ((	'**,
 #'DLL<!Pa%"6"6q"9!PQEKK499001eWIFGKK499001;<  	"#D	 "QsD   C C C C C  CA$C  C 	CCCC c                   K   y wr1   rK   rd   s    r.   rj   zServerInstance._start   	        c                   K   y wr1   rK   rd   s    r.   rv   zServerInstance._stop   ry   rz   c                     y r1   rK   rd   s    r.   rl   zServerInstance.listen_addrs   rf   r/   c                     y r1   rK   r(   contexts     r.   make_top_layerzServerInstance.make_top_layer   s    r/   c                    | j                   j                  | j                   j                  | j                   j                  | j                  | j
                  rt        | j
                        nd | j                  dS )N)typerp   	full_specre   rR   rl   )r,   rY   rp   r   re   rR   r^   rl   rd   s    r.   to_jsonzServerInstance.to_json   s\    II''9900,,//:>:M:Mc$"5"56SW --
 	
r/   c                  K   t        t        j                  ||t        j                  | j                        }| j                  |j                  j                        |_        t        | j                  t        j                        rt        |t        j                        sJ t        t        j                  |j                  d            }	 t         j"                  sJ t!        j"                  |      }||j                  j                  j$                  _        ||j                  j                  j(                  _        nt        | j                  t        j4                  t        j6                  f      r]|j                  d|j                  j                  j$                  j&                        |j                  j                  j(                  _        | j8                  j;                  |j                  j                  j$                  j<                  |      5  |j?                          d {    d d d        y # t,        $ r2}t.        j1                  d|       |j3                          Y d }~y d }~ww xY w7 K# 1 sw Y   y xY ww)NsocketzTransparent mode failure: remote_endpoint) r   r   r    r+   r,   r   layerr   r7   r   TransparentModeasyncioStreamWriterr   r   get_extra_infor   original_addrr%   socknamer   addressrk   rn   errorcloseWireGuardMode	LocalModerT   rN   idhandle_client)r(   readerwriterrM   soriginal_dstrq   s          r.   handle_streamzServerInstance.handle_stream   s    
 )JJTYY
 ++GMM,A,ABdii!;!;<fg&:&:;;;V]]F$9$9($CDA	D----'55a8 9E%%,,57C%%,,4		J$<$<j>R>R#ST393H3H!7==#8#8#?#?#H#H4GMM!!((0 \\--gmm.C.C.J.J.M.MwW 	*'')))	* 	*  9!?@ *	* 	*s[   C	J'H5 3D JI5'I3(I5,	J5	I0>(I+&J+I00J3I55I>:Jc                D   K   | j                  ||       d {    y 7 wr1   r   r(   streams     r.   handle_udp_streamz ServerInstance.handle_udp_stream          000     )r,   rE   rT   rH   )r,   zmode_specs.ProxyMode | strrT   rH   r=   r   r=   boolr=   r>   r=   ztuple[Address, ...]r   r   r=   r   r=   dict)r   z*asyncio.StreamReader | mitmproxy_rs.Streamr   z*asyncio.StreamWriter | mitmproxy_rs.Streamr=   r>   r   zmitmproxy_rs.Streamr=   r>   )r?   r@   rA   rQ   rB   rR   r#   r\   classmethodrb   propertyr   re   rt   rw   rj   rv   rl   r   r   r   r   rK   r/   r.   rP   rP   [   s    9;G6;'+N$+.9 (  
	    ==         
*:* ;* 
	*<1r/   rP   )	metaclassc                  t     e Zd ZU ded<   d	 fdZed
d       Zedd       Zd	dZd	dZ		 	 	 	 	 	 ddZ
 xZS )AsyncioServerInstance-list[asyncio.Server | mitmproxy_rs.UdpServer]_serversc                2    g | _         t        |   |i | y r1   )r   r"   r#   )r(   r4   r[   r-   s      r.   r#   zAsyncioServerInstance.__init__   s    $)&)r/   c                ,    t        | j                        S r1   )r   r   rd   s    r.   re   z AsyncioServerInstance.is_running   s    DMM""r/   c                   g }| j                   D ]_  }t        |t        j                        r |j	                  |j                                =	 |j                  d |j                  D               a t        |      S # t        $ r Y xw xY w)Nc              3  <   K   | ]  }|j                           y wr1   )getsockname).0socks     r.   	<genexpr>z5AsyncioServerInstance.listen_addrs.<locals>.<genexpr>   s      J!1!1!3 Js   )
r   r7   mitmproxy_rs	UdpServerappendr   extendsocketsOSErrortuple)r(   rs   r   s      r.   rl   z"AsyncioServerInstance.listen_addrs   sw     	A!\334Q]]_-LL J		 JJ	 U|  s   "A<<	BBc                  K   | j                   rJ | j                  j                  t        j                  j                        }| j                  j                  t        j                  j
                        }	 | j                  ||       d {   | _         y 7 
# t        $ r}| j                  j                   d|xs d d| d| }|j                  t        j                  k(  rQ| j                  j                  ;| j                  j                  J |d| j                  j                   d|dz    dz  }t        |j                  ||j                        |d }~ww xY ww)	Nz failed to listen on *:z with z2
Try specifying a different port by using `--mode @   z`.)r   r,   listen_hostr   r+   listen_portlistenr   rp   errno
EADDRINUSEcustom_listen_portcustom_listen_hostr   filename)r(   hostportrq   messages        r.   rj   zAsyncioServerInstance._start   s1    ==  yy$$S[[%<%<=yy$$S[[%<%<=		?"&++dD"99DM9 	?..//DT[SMQRSWRXX^_`^abGww%***tyy/K/K/SII0088PQUQZQZQdQdPeefgknogofpprss!''7AJJ7Q>	?s=   A5E 8B B	B E B 	E#B5EEE c                   K   | j                   sJ 	 | j                   D ]  }|j                           	 g | _         y # g | _         w xY wwr1   )r   r   )r(   r   s     r.   rv   zAsyncioServerInstance._stop  sC     }}}	]] 	 DMBDMs   A!< A	AAc                  K   | j                   j                  dk(  r|dk(  r	 t        j                  t        j                  t        j                        }|j                  d       |j                         d   }|j                          t        j                  | j                  ||       d {   gS t        j                  | j                  ||       d {   gS | j                   j                  dk(  r|dk(  rht        j                  d	|| j                          d {   }	 t        j                  d
|j                         d   | j                          d {   }||gS t        j                  ||| j                          d {   gS t#        | j                   j                        7 # t        $ r$}t        j                  d|d       Y d }~#d }~ww xY w7 7 7 # t        $ r t        j                  d       |gcY S w xY w7 w)Ntcpr   ) r      z#Failed to listen on a single port (z$), falling back to default behavior.udpr   0.0.0.0z::z1Failed to listen on '::', listening on IPv4 only.)r,   transport_protocolr   AF_INETSOCK_STREAMbindr   r   r   start_serverr   rk   rn   debugr   start_udp_serverr   AssertionError)r(   r   r   r   
fixed_portrq   ipv4ipv6s           r.   r   zAsyncioServerInstance.listen  s     99''50
 qyfnnf6H6HIAFF7O!"!3JGGI%2243E3EtZXX  "..t/A/A4NNOOYY))U2 rz)::** 

(!-!>!>((*1-.." D !$<'"33**   !!=!=>>G Y  LL=aUBfg  O

 ! "LL!TU 6M"s   HB
F- ,F+-F- 1%HGAHG H$5G$ G"G$ (HH$H+F- -	G6GHGH H"G$ $!HHHHr   r   r   )r   r^   r   intr=   r   )r?   r@   rA   rB   r#   r   re   rl   rj   rv   r   rC   rD   s   @r.   r   r      s]    ;;* # # 
 
?	2?2?"2?	62?r/   r   c                       e Zd ZU dZded<   ded<   ded<   ddZedd       Zedd	       Zdd
Z	ddZ
d fdZddZddZ xZS )WireGuardServerInstanceNz#mitmproxy_rs.WireGuardServer | None_serverr^   
server_key
client_keyc                @    t         j                  j                  |      S r1   r   modesTransparentProxyr~   s     r.   r   z&WireGuardServerInstance.make_top_layerH      ||,,W55r/   c                    | j                   d uS r1   )r   rd   s    r.   re   z"WireGuardServerInstance.is_runningK  s    ||4''r/   c                d    | j                   r| j                   j                         fS t               S r1   )r   r   r   rd   s    r.   rl   z$WireGuardServerInstance.listen_addrsO  s&    <<LL,,.007Nr/   c                  K   | j                   J | j                  j                  t        j                  j                        }| j                  j                  t        j                  j
                        }| j                  j                  r.t        | j                  j                        j                         }n4t        t        j                  j                        j                         dz  }|j                         sj|j                  j                  dd       |j                  t        j                  t!        j"                         t!        j"                         dd             	 t        j$                  |j'                               }|d   | _        |d   | _        t!        j0                  | j*                        }t!        j0                  | j(                        }t!        j2                  |xs d|| j(                  |g| j4                  | j4                         d {   | _         | j7                         }|sJ t8        j;                  d|z   dz   dz          y # t,        $ r}t/        d	| d
|       |d }~ww xY w7 _w)Nzwireguard.confT)parentsexist_ok)r   r      )indentr   r   zInvalid configuration file (z): r   z=------------------------------------------------------------

z<------------------------------------------------------------)r   r,   r   r   r+   r   r;   r   
expanduserconfdirexistsparentmkdir
write_textjsondumpsr   genkeyloads	read_textr   r   rk   r`   pubkeystart_wireguard_serverwg_handle_streamclient_confrn   ro   )	r(   r   r   	conf_pathcrq   p_confs	            r.   rj   zWireGuardServerInstance._startV  s     ||###yy$$S[[%<%<=yy$$S[[%<%<=99>>TYY^^,779IS[[001<<>AQQI!""4$"?  

&2&9&9&;&2&9&9&; 	V

9..01AoDOoDO 00)@@IOOC!!!!
 
 !tOd*T1H<=#  	V;I;c!MNTUU	V
s7   E'J*7I !A>JI? <J	I<%I77I<<Jc                   | j                   sy | j                  j                  t        j                  j                        xs* t        j                         xs t        j                         }| j                  j                  t        j                  j                        }t        j                  d| j                   dt        j                  | j                         d| d| d	      j                         S )Nz2
            [Interface]
            PrivateKey = zk
            Address = 10.0.0.1/32
            DNS = 10.0.0.53

            [Peer]
            PublicKey = z;
            AllowedIPs = 0.0.0.0/0
            Endpoint = r   z
            )r   r,   r   r   r+   r   get_local_ipget_local_ip6r   textwrapdedentr   r   r   r   strip)r(   r   r   s      r.   r  z#WireGuardServerInstance.client_conf  s    ||II!!#++"9"9: ($$&(%%' 	
 yy$$S[[%<%<=//* +
 &,,T__=> ?vQtf %

 %'	r/   c                D    d| j                         it        | 	         S )Nwireguard_conf)r  r"   r   )r(   r-   s    r.   r   zWireGuardServerInstance.to_json  s#     $"2"2"4J8IJJr/   c                   K   | j                   J 	 | j                   j                          | j                   j                          d {    d | _         y 7 # d | _         w xY wwr1   )r   r   wait_closedrd   s    r.   rv   zWireGuardServerInstance._stop  sU     ||'''	 LL ,,**,,,DL -DLs.   A$7A 	A
A A$A 	A!!A$c                D   K   | j                  ||       d {    y 7 wr1   r   r   s     r.   r  z(WireGuardServerInstance.wg_handle_stream  r   r   r   r   r   r   )r=   z
str | Noner   r   )r?   r@   rA   r   rB   r   r   re   rl   rj   r  r   rv   r  rC   rD   s   @r.   r   r   B  s`    37G07OO6 ( (  +>Z.K 1r/   r   c                  v    e Zd ZU dZded<   	 dZded<   	 dZedd       ZddZ	e
	 	 	 	 dd	       Zdd
ZddZy)LocalRedirectorInstanceNz-ClassVar[mitmproxy_rs.LocalRedirector | None]r   z(ClassVar[LocalRedirectorInstance | None]	_instancerK   c                    | j                   d uS r1   )r  rd   s    r.   re   z"LocalRedirectorInstance.is_running  s    ~~T))r/   c                @    t         j                  j                  |      S r1   r   r~   s     r.   r   z&LocalRedirectorInstance.make_top_layer  r   r/   c                r   K   | j                   %| j                   j                  ||       d {    y y 7 wr1   )r  r   )rZ   r   s     r.   redirector_handle_streamz0LocalRedirectorInstance.redirector_handle_stream  s4     
 ==$----ff=== %=s   ,757c                z  K   | j                   rt        d      | j                  j                  j	                  d      r.| j                  j                   dt        j                          }nD| j                  j                  r| j                  j                  }ndt        j                          }| j                  }| |_         |j                  8	 t        j                  |j                  |j                         d {   |_        |j                  j                  |       y 7 %# t        $ r	 d |_          w xY ww)Nz,Cannot spawn more than one local redirector.!,)r  RuntimeErrorr,   r;   
startswithosgetpidr-   r   r   start_local_redirectorr  rk   set_intercept)r(   specrZ   s      r.   rj   zLocalRedirectorInstance._start  s     >>MNN99>>$$S)iinn%Qryy{m4DYY^^99>>Dryy{m$Dnn;;$0$G$G0000%  	!!$'   $s0   CD;-D& >D$?	D& D;$D& &D88D;c                   K   | j                   sJ | j                  sJ d | j                  _         | j                  j                  d       y w)Nr   )r  r   r-   r#  rd   s    r.   rv   zLocalRedirectorInstance._stop  s<     ~~~|||#' ""2&s   A
Ar   r   r   r   )r?   r@   rA   r   rB   r  rl   r   re   r   r   r  rj   rv   rK   r/   r.   r  r    sj    =AG:Ae:>I7>]L* *6 >#> 
> >(2'r/   r  c                      e Zd ZddZy)RegularInstancec                @    t         j                  j                  |      S r1   )r   r   	HttpProxyr~   s     r.   r   zRegularInstance.make_top_layer  s    ||%%g..r/   Nr   r?   r@   rA   r   rK   r/   r.   r'  r'    s    /r/   r'  c                      e Zd ZddZy)UpstreamInstancec                @    t         j                  j                  |      S r1   )r   r   HttpUpstreamProxyr~   s     r.   r   zUpstreamInstance.make_top_layer  s    ||--g66r/   Nr   r*  rK   r/   r.   r,  r,    s    7r/   r,  c                      e Zd ZddZy)TransparentInstancec                @    t         j                  j                  |      S r1   r   r~   s     r.   r   z"TransparentInstance.make_top_layer  r   r/   Nr   r*  rK   r/   r.   r0  r0    s    6r/   r0  c                      e Zd ZddZy)ReverseInstancec                @    t         j                  j                  |      S r1   )r   r   ReverseProxyr~   s     r.   r   zReverseInstance.make_top_layer  s    ||((11r/   Nr   r*  rK   r/   r.   r3  r3    s    2r/   r3  c                      e Zd ZddZy)Socks5Instancec                @    t         j                  j                  |      S r1   )r   r   Socks5Proxyr~   s     r.   r   zSocks5Instance.make_top_layer  s    ||''00r/   Nr   r*  rK   r/   r.   r7  r7    s    1r/   r7  c                      e Zd ZddZy)DnsInstancec                ,    t        j                  |      S r1   )r   DNSLayerr~   s     r.   r   zDnsInstance.make_top_layer  s    w''r/   Nr   r*  rK   r/   r.   r;  r;    s    (r/   r;  )M__doc__
__future__r   r   r   r   loggingr   r   sysr  typingabcr   r   
contextlibr   pathlibr   r   r	   r
   r   r   r   r   	mitmproxyr   r   r   mitmproxy.connectionr   mitmproxy.netr   mitmproxy.proxyr   r   r   r   mitmproxy.proxy.contextr   mitmproxy.proxy.layerr   mitmproxy.utilsr   version_infotyping_extensionsr   mitmproxy.masterr   	getLoggerr?   rn   LiveConnectionHandlerr   rX   rE   ProtocolrH   rP   r   r   r   r   r  RegularModer'  UpstreamModer,  r   r0  ReverseModer3  
Socks5Moder7  DnsModer;  rK   r/   r.   <module>rX     s  
 #     	  
     %             ( " $ " & " + ' !g&'			8	$-V99 -" Cz++,FOO }1WQZ7 }1@d?N1- d?Nd1nZ-E-EF d1N4'nZ-A-AB 4'n/+J,B,BC /
7,Z-D-DE 7
6/
0J0JK 6
2+J,B,BC 2
1*:+@+@A 1
('
(:(:; (r/   