
    kjH                    P   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, ddl-m.Z. e	j^                  dk  rddl0m1Z1 nddlm1Z1 erddl2m3Z3  ejh                  e5      Z6 G d de(jn                        Z8 ed e'jr                  !      Z: G d" d#ejv                        Z< G d$ d%ee:   e&      Z= G d' d(e=e:   e&      Z> G d) d*e>e'j~                           Z@ G d+ d,e=e'j                           ZB G d- d.e>e'j                           ZD G d/ d0e>e'j                           ZF G d1 d2e>e'j                           ZH G d3 d4e>e'j                           ZJ G d5 d6e>e'j                           ZL G d7 d8e>e'j                           ZN G d9 d:e=e'j                           ZPy);aA  
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)get_free_port)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         e/home/ubuntu/.cache/pipx/cdb5059130eadca/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
-r0   r    M)boundc                  2    e Zd ZU ded<   e	 	 	 	 dd       Zy)ServerManagerz)dict[tuple | str, ProxyConnectionHandler]connectionsc                     y r2    )r)   connection_idhandlers      r/   register_connectionz!ServerManager.register_connectionU   s     r0   N)rM   ztuple | strrN   r    )r@   rA   rB   rC   r   rO   rL   r0   r/   rI   rI   Q   s*    ::(3I r0   rI   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dZy)ServerInstancez)ClassVar[dict[str, type[ServerInstance]]]_ServerInstance__modesNzException | Nonelast_exceptionc                     || _         || _        y r2   )r-   manager)r)   r-   rU   s      r/   r$   zServerInstance.__init__`   s    	&-r0   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__r8   r   
issubclassr   	ProxyMode	type_namerQ   rR   )clskwargsr-   s      r/   __init_subclass__z ServerInstance.__init_subclass__d   so     **1-.q1$(dJ$8$8999>>)?)????58N""4>>2 )r0   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.)
r8   strr   rY   parserQ   rR   rZ   
ValueErrorr@   )r[   r-   rU   insts       r/   makezServerInstance.makem   sk     dC ''--d3D%%dnn5dGD$$x'<S\\N(STTr0   c                     y r2   rL   r)   s    r/   
is_runningzServerInstance.is_running|        	r0   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.)_startrS   	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)Nri   z at z	 stopped.)rm   _stoprS   rl   rn   r   r%   ro   rp   r-   rq   )r)   rm   rr   rs   rt   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r2   rL   re   s    r/   rk   zServerInstance._start   	        c                   K   y wr2   rL   re   s    r/   rw   zServerInstance._stop   rz   r{   c                     y r2   rL   re   s    r/   rm   zServerInstance.listen_addrs   rg   r0   c                     y r2   rL   r)   contexts     r/   make_top_layerzServerInstance.make_top_layer   s    r0   c                    | j                   j                  | j                   j                  | j                   j                  | j                  | j
                  rt        | j
                        nd | j                  dS )N)typerq   	full_specrf   rS   rm   )r-   rZ   rq   r   rf   rS   r_   rm   re   s    r/   to_jsonzServerInstance.to_json   s\    II''9900,,//:>:M:Mc$"5"56SW --
 	
r0   c                d  K   |t        |t        j                        sJ |}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        j8                  t        j:                  t        j<                  f      r]|j#                  d|j                  j                  j(                  j*                        |j                  j                  j,                  _        | j>                  jA                  |j                  j                  j(                  jB                  |      5  |jE                          d {    d d d        y # t0        $ r2}t2        j5                  d|       |j7                          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)#r8   mitmproxy_rsStreamr    r   r!   r,   r-   r   layerr   r   TransparentModeasyncioStreamWriterr   r   get_extra_infor   original_addrr&   socknamer   addressrl   ro   errorcloseWireGuardMode	LocalModeTunModerU   rO   idhandle_client)r)   readerwriterrN   soriginal_dstrr   s          r/   handle_streamzServerInstance.handle_stream   s    
 >fl&9&9:::F(JJTYY
 ++GMM,A,ABdii!;!;<fg&:&:;;;V]]F$9$9($CDA	D----'55a8 9E%%,,57C%%,,4II%%z';';Z=O=OP
 4:3H3H!7==#8#8#?#?#H#H4GMM!!((0 \\--gmm.C.C.J.J.M.MwW 	*'')))	* 	*  9!?@  *	* 	*s[   C)J0,'I$ D/J0J$J"J$	J0$	J-(JJ0JJ0"J$$J-)J0)r-   rF   rU   rI   )r-   zmode_specs.ProxyMode | strrU   rI   r>   r   r>   boolr>   r?   r>   ztuple[Address, ...]r   r   r>   r   r>   dictr2   )r   z*asyncio.StreamReader | mitmproxy_rs.Streamr   z1asyncio.StreamWriter | mitmproxy_rs.Stream | Noner>   r?   )r@   rA   rB   rR   rC   rS   r$   r]   classmethodrc   propertyr   rf   ru   rx   rk   rw   rm   r   r   r   rL   r0   r/   rQ   rQ   [   s    9;G6;'+N$+.9 (  
	    ==         
 EI"*:"* B"* 
	"*r0   rQ   )	metaclassc                       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
	 	 dd	Z xZS )AsyncioServerInstanceZlist[asyncio.Server | mitmproxy_rs.udp.UdpServer | mitmproxy_rs.wireguard.WireGuardServer]_serversc                2    g | _         t        |   |i | y r2   )r   r#   r$   )r)   r5   r\   r.   s      r/   r$   zAsyncioServerInstance.__init__   s    $)&)r0   c                ,    t        | j                        S r2   )r   r   re   s    r/   rf   z AsyncioServerInstance.is_running   s    DMM""r0   c                ^   g }| j                   D ]  }t        |t        j                  j                  t        j
                  j                  f      r |j                  |j                                a	 |j                  d |j                  D                t        |      S # t        $ r Y w xY w)Nc              3  <   K   | ]  }|j                           y wr2   )getsockname).0socks     r/   	<genexpr>z5AsyncioServerInstance.listen_addrs.<locals>.<genexpr>   s      J!1!1!3 Js   )r   r8   r   udp	UdpServer	wireguardWireGuardServerappendr   extendsocketsOSErrortuple)r)   rt   r   s      r/   rm   z"AsyncioServerInstance.listen_addrs   s     		AL$$..0F0F0V0VW Q]]_-LL J		 JJ		 U|  s   1"B  	B,+B,c                  K   | j                   rJ | j                  j                  t        j                  j                        }| j                  j                  t        j                  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   rq   errno
EADDRINUSEcustom_listen_portcustom_listen_hostr   filename)r)   hostportrr   messages        r/   rk   zAsyncioServerInstance._start   s=    ==  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=   A9E$<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r2   )r   r   )r)   r   s     r/   rw   zAsyncioServerInstance._stop  sC     }}}	]] 	 DMBDMs   A!< A	AAc                  K   | j                   j                  dvrt        | j                   j                        |dk(  r#	 | j                  |t	                      d {   S g }| j                   j                  dv r8|j                  t        j                  | j                  ||       d {          | j                   j                  dv r|dk(  rj| j                  d|       d {   }|j                  |       	 | j                  d	|j                         d
          d {   }|j                  |       |S |j                  | j                  ||       d {          |S 7 	# t
        $ r$}t        j                  d|d       Y d }~/d }~ww xY w7 7 7 y# t
        $ r t        j                  d       Y |S w xY w7 hw)N)tcpr   bothr   z#Failed to listen on a single port (z$), falling back to default behavior.)r   r   )r   r    z0.0.0.0z::   z1Failed to listen on '::', listening on IPv4 only.)r-   transport_protocolAssertionErrorr   r   rl   ro   debugr   r   start_serverr   start_udp_based_serverr   )r)   r   r   rr   serversipv4ipv6s          r/   r   zAsyncioServerInstance.listen  s     99''/EE !=!=>> 19![[}??? 	 	
 99''?:NN!5!5d6H6H$PT!UUV99''?: rz!88DIIt$V!%!<!<d..03" D NN4(  T%@%@t%LLM; @ 9!>bc  V
 J ! VLL!TU V  Ms   =G E) E&E) !A
G+F,:G&F'G=&F #F$F 9"GG
G&E) )	F2FGFGGF G=G GGc                t   K   t         j                  j                  ||| j                         d {   S 7 wr2   )r   r   start_udp_serverr   r)   r   r   s      r/   r   z,AsyncioServerInstance.start_udp_based_serverF  s:      "%%66
 
 	
 
s   /868r   r   r   )r   r_   r   intr>   r   )r>   zCmitmproxy_rs.udp.UdpServer | mitmproxy_rs.wireguard.WireGuardServer)r@   rA   rB   rC   r$   r   rf   rm   rk   rw   r   r   rD   rE   s   @r/   r   r      sq     * # #  ? 	--"-
-^
	L
r0   r   c                  p     e Zd ZU ded<   ded<   ded<   	 	 	 	 d
dZd fdZ	 	 ddZddZd fd	Z xZ	S )WireGuardServerInstancer_   
server_key
client_keypubkeyc                @    t         j                  j                  |      S r2   r   modesTransparentProxyr   s     r/   r   z&WireGuardServerInstance.make_top_layerU       ||,,W55r0   c                  K   | j                   j                  r.t        | j                   j                        j                         }n4t        t        j
                  j                        j                         dz  }|j                         s~|j                  j                  dd       |j                  t        j                  t        j                  j                         t        j                  j                         dd             	 t        j                   |j#                               }|d   | _        |d   | _        t        j                  j-                  | j&                        | _        t        j                  j-                  | j$                        }t.        | a          d {    | j3                         }|sJ t4        j7                  d|z   dz   dz          y # t(        $ r}t+        d	| d
|       |d }~ww xY w7 Zw)Nzwireguard.confT)parentsexist_ok)r   r      )indentr   r   zInvalid configuration file (z): z=------------------------------------------------------------

z<------------------------------------------------------------)r-   r<   r   
expanduserr   r,   confdirexistsparentmkdir
write_textjsondumpsr   r   genkeyloads	read_textr   r   rl   ra   r   r#   rk   client_confro   rp   )r)   	conf_pathcrr   _confr.   s         r/   rk   zWireGuardServerInstance._startZ  s    99>>TYY^^,779IS[[001<<>AQQI!""4$"?  

&2&<&<&C&C&E&2&<&<&C&C&E 	V

9..01AoDOoDO
 #,,33DOOD""))$//:gn!tOd*T1H<=  	V;I;c!MNTUU	V 	s7   DH7G" A(H*H+7H"	H+G==HHc                   K   t         j                  j                  ||| j                  | j                  g| j
                  | j
                         d {   S 7 wr2   )r   r   start_wireguard_serverr   r   r   r   s      r/   r   z.WireGuardServerInstance.start_udp_based_server}  sS      "++BBOO[[M
 
 	
 
s   AAAA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                  | 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   r   stripr   s      r/   r   z#WireGuardServerInstance.client_conf  s    }}II!!#++"9"9: ($$&(%%' 	
 yy$$S[[%<%<=//* +
 &//66tGH IvQtf %

 %'	r0   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Jr0   r   r   )r>   z&mitmproxy_rs.wireguard.WireGuardServerr>   z
str | Noner   )
r@   rA   rB   rC   r   rk   r   r   r   rD   rE   s   @r/   r   r   P  sK    OOK66	6
!>F

	/

.K Kr0   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)LocalRedirectorInstanceNz3ClassVar[mitmproxy_rs.local.LocalRedirector | None]_serverz(ClassVar[LocalRedirectorInstance | None]	_instancerL   c                    | j                   d uS r2   )r  re   s    r/   rf   z"LocalRedirectorInstance.is_running  s    ~~T))r0   c                @    t         j                  j                  |      S r2   r   r   s     r/   r   z&LocalRedirectorInstance.make_top_layer      ||,,W55r0   c                p   K   | j                   $| j                   j                  |       d {    y y 7 wr2   )r  r   )r[   streams     r/   redirector_handle_streamz0LocalRedirectorInstance.redirector_handle_stream  s2     
 ==$----f555 %5s   +646c                  K   | j                   rt        d      | j                  j                  r.| j                  j                   dt	        j
                          }ndt	        j
                          }| j                  }| |_         |j                  B	 t        j                  j                  |j                  |j                         d {   |_        |j                  j                  |       y 7 %# t        $ r	 d |_          w xY ww)Nz,Cannot spawn more than one local redirector.z,!!)r  RuntimeErrorr-   r<   osgetpidr.   r  r   localstart_local_redirectorr  rl   set_intercept)r)   specr[   s      r/   rk   zLocalRedirectorInstance._start  s     >>MNN99>>iinn%R		}5Dryy{m$Dnn;;$0$6$6$M$M0000%  	!!$'   $s0   BD	7C4 C2	C4 D	2C4 4DD	c                   K   | j                   sJ | j                  sJ d | j                  _         | j                  j                  d       y w)Nr   )r  r  r.   r  re   s    r/   rw   zLocalRedirectorInstance._stop  s<     ~~~|||#' ""2&s   A
Ar   r   )r  zmitmproxy_rs.Streamr>   r?   r   )r@   rA   rB   r  rC   r  rm   r   rf   r   r   r  rk   rw   rL   r0   r/   r  r    sj    CGG@Ge:>I7>]L* *6 6#6 
6 6(.'r0   r  c                      e Zd ZddZy)RegularInstancec                @    t         j                  j                  |      S r2   )r   r   	HttpProxyr   s     r/   r   zRegularInstance.make_top_layer  s    ||%%g..r0   Nr   r@   rA   rB   r   rL   r0   r/   r!  r!    s    /r0   r!  c                      e Zd ZddZy)UpstreamInstancec                @    t         j                  j                  |      S r2   )r   r   HttpUpstreamProxyr   s     r/   r   zUpstreamInstance.make_top_layer  s    ||--g66r0   Nr   r$  rL   r0   r/   r&  r&    s    7r0   r&  c                      e Zd ZddZy)TransparentInstancec                @    t         j                  j                  |      S r2   r   r   s     r/   r   z"TransparentInstance.make_top_layer  r  r0   Nr   r$  rL   r0   r/   r*  r*    s    6r0   r*  c                      e Zd ZddZy)ReverseInstancec                @    t         j                  j                  |      S r2   )r   r   ReverseProxyr   s     r/   r   zReverseInstance.make_top_layer  s    ||((11r0   Nr   r$  rL   r0   r/   r-  r-    s    2r0   r-  c                      e Zd ZddZy)Socks5Instancec                @    t         j                  j                  |      S r2   )r   r   Socks5Proxyr   s     r/   r   zSocks5Instance.make_top_layer  s    ||''00r0   Nr   r$  rL   r0   r/   r1  r1    s    1r0   r1  c                      e Zd ZddZy)DnsInstancec                ,    t        j                  |      S r2   )r   DNSLayerr   s     r/   r   zDnsInstance.make_top_layer  s    w''r0   Nr   r$  rL   r0   r/   r5  r5    s    (r0   r5  c                  x     e Zd ZU dZded<   dZ	 	 	 	 ddZedd       Zedd       Z	d fdZ
dd	Zdd
Z xZS )TunInstanceNz$mitmproxy_rs.tun.TunInterface | Noner  rL   c                @    t         j                  j                  |      S r2   r   r   s     r/   r   zTunInstance.make_top_layer  r   r0   c                    | j                   d uS r2   )r  re   s    r/   rf   zTunInstance.is_running   s    ||4''r0   c                P    | j                   r| j                   j                         S y r2   )r  tun_namere   s    r/   r=  zTunInstance.tun_name  s    <<<<((**r0   c                <    d| j                   it        | 	         S )Nr=  )r=  r#   r   r
  s    r/   r   zTunInstance.to_json  s    DMM?UW_->??r0   c                B  K   | j                   J t        j                  j                  | j                  | j                  | j
                  j                  xs d        d {   | _         t        j                  d| j                   j                                 y 7 :w)N)r=  zTUN interface created: )
r  r   tuncreate_tun_interfacer   r-   r<   ro   rp   r=  re   s    r/   rk   zTunInstance._start  s     ||###)--BBYY^^+t C 
 

 	-dll.C.C.E-FGH
s   A B"B#;Bc                   K   | j                   J 	 | j                   j                          | j                   j                          d {    d | _         y 7 # d | _         w xY wwr2   )r  r   wait_closedre   s    r/   rw   zTunInstance._stop  sU     ||'''	 LL ,,**,,,DL -DLs.   A$7A 	A
A A$A 	A!!A$r   r   r  r   r   )r@   rA   rB   r  rC   rm   r   r   rf   r=  r   rk   rw   rD   rE   s   @r/   r9  r9    sa    48G18L66	6
 ( (  @I r0   r9  )Q__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.net.free_portr   mitmproxy.proxyr   r   r   r   mitmproxy.proxy.contextr   mitmproxy.proxy.layerr   mitmproxy.utilsr   version_infotyping_extensionsr   mitmproxy.masterr   	getLoggerr@   ro   LiveConnectionHandlerr    rY   rF   ProtocolrI   rQ   r   r   r   r   r  RegularModer!  UpstreamModer&  r   r*  ReverseModer-  
Socks5Moder1  DnsModer5  r   r9  rL   r0   r/   <module>r_     s  
 #     	  
     %             ( " 1 $ " & " + ' !g&'			8	$-V99 -" Cz++,FOO @*WQZ7 @*Fo
N1- o
dQK3J4L4LM QKh2'nZ-A-AB 2'j/+J,B,BC /
7,Z-D-DE 7
6/
0J0JK 6
2+J,B,BC 2
1*:+@+@A 1
('
(:(:; (
& .!3!34 & r0   