
    @OOf5                       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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 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- ddl+m.Z.  ej^                  e0      Z1 G d d       Z2 G d! d"e*      Z3y)#zr
This addon is responsible for starting/stopping the proxy server sockets/instances specified by the mode option.
    )annotationsN)Iterable)Iterator)contextmanager)Optional)Opcode)command)ctx)
exceptions)http)platform)tcp)udp)	websocket)Address)Flow)events)
mode_specs)server_hooks)TcpMessageInjected)UdpMessageInjected)WebSocketMessageInjected)ProxyConnectionHandler)ServerInstance)ServerManager)asyncio_utils)human)signalsc                  F    e Zd ZddZed	d       Zd
dZddZddZddZ	y)Serversc                    t        j                  d       | _        t               | _        t        j                         | _        || _        y )Nc                      y N r$       ]/var/www/premiumrankchecker/venv/lib/python3.12/site-packages/mitmproxy/addons/proxyserver.py<lambda>z"Servers.__init__.<locals>.<lambda>.   s    r%   )	r   AsyncSignalchangeddict
_instancesasyncioLock_lock_manager)selfmanagers     r&   __init__zServers.__init__-   s1    **<8FJf\\^
r%   c                6    | j                   j                         S r#   )r.   lockedr0   s    r&   is_updatingzServers.is_updating3   s    zz  ""r%   c                  K   d}| j                   4 d {    i }g }t        j                  j                  ri|D ]d  }|| j                  v r| j                  |   }n?t        j                  || j                        }|j                  |j                                |||<   f | j                  j                         D cg c]  \  }}||vr|j                          }}}|| _        | j                  j                          d {    t        j                  |ddi d {   D ]%  }	|	sd}t         j#                  t%        |	             ' t        j                  |ddi d {   D ]%  }	|	sd}t         j#                  t%        |	             ' d d d       d {    | j                  j                          d {    |S 7 c c}}w 7 7 7 m7 7# 1 d {  7  sw Y   GxY w7 ,w)NTreturn_exceptionsF)r.   r
   optionsserverr+   r   maker/   appendstartitemsstopr)   sendr,   gatherloggererrorstr)
r0   modesall_oknew_instancesstart_tasksspecinstances
stop_tasksrets
             r&   updatezServers.update7   s    :: !	+ !	+HJMK{{!!! 3Dt.#'??4#8#1#6#6tT]]#K#**8>>+;<*2M$'3  $446D!}, J  ,DO,,##%%% %^^ZP4PP +"FLLS*+ %^^[QDQQ +"FLLS*+=!	+ !	+F ll!!!I!	+ & Q R=!	+ !	+ !	+ !	+F 	"s   G.GG.B%G>G	'GGG G!	G+:G%G&	G0"GG.G!G.?G, G.	GGGG.G)G G)%G.c                ,    t        | j                        S r#   )lenr+   r5   s    r&   __len__zServers.__len__`   s    4??##r%   c                H    t        | j                  j                               S r#   )iterr+   valuesr5   s    r&   __iter__zServers.__iter__c   s    DOO**,--r%   c                ~    t        |t              rt        j                  j	                  |      }| j
                  |   S r#   )
isinstancerD   r   	ProxyModeparser+   )r0   modes     r&   __getitem__zServers.__getitem__f   s1    dC ''--d3Dt$$r%   N)r1   r   returnbool)rE   zIterable[mode_specs.ProxyMode]r]   r^   )r]   int)r]   zIterator[ServerInstance])rZ   zstr | mode_specs.ProxyModer]   r   )
__name__
__module____qualname__r2   propertyr6   rN   rQ   rU   r[   r$   r%   r&   r    r    ,   s0      # #'R$.%r%   r    c                  N   e Zd ZU dZded<   ded<   ded<   dZd	ed
<   dZded<   d Zd Ze		 	 	 	 dd       Z
d Zd ZddZddZd dZd!dZ ej"                  d      	 d"	 	 	 	 	 	 	 d#d       Z ej"                  d      d$d       Z ej"                  d      d$d       Zd%dZy)&Proxyserverz2
    This addon runs the actual proxy server.
    z)dict[tuple | str, ProxyConnectionHandler]connectionsr    serversr^   
is_runningNzAddress | None_connect_addrzasyncio.Task | None_update_taskc                @    i | _         t        |       | _        d| _        y )NF)rf   r    rg   rh   r5   s    r&   r2   zProxyserver.__init__x   s    t}r%   c                4    dt        | j                         dS )NzProxyserver(z active conns))rP   rf   r5   s    r&   __repr__zProxyserver.__repr__}   s    c$"2"234NCCr%   c              #  r   K   || j                   |<   	 d  | j                   |= y # | j                   |= w xY wwr#   )rf   )r0   connection_idhandlers      r&   register_connectionzProxyserver.register_connection   s<      +2'	0  /  /s   7% 747c                   |j                  dt        ddd       |j                  dt        t           d d       |j                  dt        t           d d	       |j                  d
t        dd       |j                  dt        dd       |j                  dt        dd       |j                  dt        dd       |j                  dt        t           d d       y )Nconnection_strategyeagera^  Determine when server connections should be established. When set to lazy, mitmproxy tries to defer establishing an upstream connection as long as possible. This makes it possible to use server replay while being offline. When set to eager, mitmproxy can detect protocols with server-side greetings, as well as accurately mirror TLS ALPN negotiation.)rt   lazy)choicesstream_large_bodiesa  
            Stream data to the client if response body exceeds the given
            threshold. If streamed, the body will not be stored in any way,
            and such responses cannot be modified. Understands k/m/g
            suffixes, i.e. 3m for 3 megabytes.
            body_size_limitz
            Byte size limit of HTTP request and response bodies. Understands
            k/m/g suffixes, i.e. 3m for 3 megabytes.
            keep_host_headerFz
            Reverse Proxy: Keep the original host header instead of rewriting it
            to the reverse proxy target.
            proxy_debugz$Enable debug logs in the proxy core.normalize_outbound_headersTa  
            Normalize outgoing HTTP/2 header names, but emit a warning when doing so.
            HTTP/2 does not allow uppercase header names. This option makes sure that HTTP/2 headers set
            in custom scripts are lowercased before they are sent.
            validate_inbound_headersz
            Make sure that incoming HTTP requests are not malformed.
            Disabling this option makes mitmproxy vulnerable to HTTP smuggling attacks.
            connect_addrzWSet the local IP address that mitmproxy should use when connecting to upstream servers.)
add_optionrD   r   r^   )r0   loaders     r&   loadzProxyserver.load   s   !X & 	 		
 	!SM	
	
 	SM		
 			
 	2		
 	(			
 	&		
 	SMi		
r%   c                    d| _         y )NT)rh   r5   s    r&   runningzProxyserver.running   s	    r%   c           	        d|v r.	 t        j                  t        j                  j                         d|v r.	 t        j                  t        j                  j                         d|v r`	 t        j                  j                  r>t        t        j                  t        j                  j                              df| _        nd | _        d	|v sd
|v r"g }t        j                  j                  D ]1  }	 |j                  t         j"                  j%                  |             3 |D cg c]_  }|j'                  t        j                  j&                        |j)                  t        j                  j(                        |j*                  fa }}t-        t/        |            t-        |      k7  rat1        j2                  |      j5                  d      d   d   \  }}}	t        j6                  |xs d|f      }
t        j                  d|
       t        j                  j                  r>t        j8                  j:                  j=                  d      st>        jA                  d       tC        d |D              r:tD        jF                  rtE        jH                          nt        j                  d      | jJ                  r6tM        jN                  | jP                  jS                  |      d      | _*        y y y # t
        $ r1 t        j                  dt        j                  j                         w xY w# t
        $ r1 t        j                  dt        j                  j                         w xY w# t
        $ r2 t        j                  dt        j                  j                  d      w xY w# t
        $ r!}t        j                  d| d| d      d }~ww xY wc c}w )Nrw   z+Invalid stream_large_bodies specification: rx   z'Invalid body_size_limit specification: r}   r   z Invalid value for connect_addr: z. Specify a valid IP address.rZ   r:   z"Invalid proxy mode specification: z ()   z0.0.0.0z3Cannot spawn multiple servers on the same address: 	nextlayerz5Warning: Running proxyserver without nextlayer addon!c              3  P   K   | ]  }t        |t        j                           y wr#   )rW   r   TransparentMode).0ms     r&   	<genexpr>z(Proxyserver.configure.<locals>.<genexpr>  s     L:a!;!;<Ls   $&z0Transparent mode not supported on this platform.zupdate servers)name)+r   
parse_sizer
   r9   rw   
ValueErrorr   OptionsErrorrx   r}   rD   	ipaddress
ip_addressri   rZ   r<   r   rX   rY   listen_hostlisten_porttransport_protocolrP   setcollectionsCountermost_commonformat_addressmasteraddonsgetrB   warninganyr   original_addrinit_transparent_moderh   r   create_taskrg   rN   rj   )r0   updatedrE   rZ   er   listen_addrshostport_dup_addrs              r&   	configurezProxyserver.configure   sY    G+  !@!@A '  !<!<= W$;;++I001I1IJK*D&
 *.D&
 WG 302E(( LL!5!5!;!;D!AB  	 MM#++"9"9:MM#++"9"9:((L  3|$%\)::"-"5"5l"C"O"OPQ"RST"UVW"XtQ //1BD0IJ --I(T  {{

(9(9(=(=k(JVWLeLL))224$11J  $1$=$=LL''.5E%! K !45   --A{{6679    --={{2235    --6s{{7O7O6RRop  " $11<TF"QCqI sB   -K5 -L2 *AM/ 2.N-&A$O5:L/2:M,/;N*-	O6OOc                   K   | j                   j                  t        j                  j                  D cg c]!  }t
        j                  j                  |      # c}       d{   S c c}w 7 	w)ziSetup proxy servers. This may take an indefinite amount of time to complete (e.g. on permission prompts).N)rg   rN   r
   r9   rZ   r   rX   rY   )r0   r   s     r&   setup_serverszProxyserver.setup_servers  sS     \\((47KK4D4DEqZ!!''*E
 
 	
E
s   2A0&A)
A0$A.%
A0c                h    | j                   D cg c]  }|j                  D ]  }|  c}}S c c}}w r#   )rg   r   )r0   r:   addrs      r&   r   zProxyserver.listen_addrs#  s,    #'<<PF<O<OPDPPPPs   .c                z   |j                   j                  j                  dk7  r!|j                   j                  j                  }n@|j                   j                  j                  |j                   j                  j
                  f}|| j                  vrt        d      | j                  |   j                  |       y )Nr   z#Flow is not from a live connection.)	flowclient_connr   idpeernamesocknamerf   r   server_event)r0   eventro   s      r&   inject_eventzProxyserver.inject_event&  s    ::!!44=!JJ2255M 

&&//

&&//M  0 00BCC'44U;r%   zinject.websocketc                   t        |t        j                        r|j                  st        j                  d       t        j                  |rt        j                  nt        j                  | |      }t        ||      }	 | j                  |       y # t        $ r(}t        j                  t        |             Y d }~y d }~ww xY w)Nz:Cannot inject WebSocket messages into non-WebSocket flows.)rW   r   HTTPFlowr   rB   r   WebSocketMessager   TEXTBINARYr   r   r   rD   )r0   r   	to_clientmessageis_textmsgr   r   s           r&   inject_websocketzProxyserver.inject_websocket4  s     $.dnnNNWX(("FKK9}g
 )s3	#e$ 	#NN3q6""	#s   B 	CB??Cz
inject.tcpc                0   t        |t        j                        st        j	                  d       t        |t        j                  | |            }	 | j                  |       y # t        $ r(}t        j	                  t        |             Y d }~y d }~ww xY w)Nz.Cannot inject TCP messages into non-TCP flows.)
rW   r   TCPFlowrB   r   r   
TCPMessager   r   rD   r0   r   r   r   r   r   s         r&   
inject_tcpzProxyserver.inject_tcpD  l    $,NNKL"4Iw)OP	#e$ 	#NN3q6""	#   A$ $	B-BBz
inject.udpc                0   t        |t        j                        st        j	                  d       t        |t        j                  | |            }	 | j                  |       y # t        $ r(}t        j	                  t        |             Y d }~y d }~ww xY w)Nz.Cannot inject UDP messages into non-UDP flows.)
rW   r   UDPFlowrB   r   r   
UDPMessager   r   rD   r   s         r&   
inject_udpzProxyserver.inject_udpO  r   r   c                   |j                   j                  | j                  |j                   _        |j                   j                  sJ |j                   j                  ^}}}| j                  D ]j  }|j
                  D ]Y  ^}}}||k(  xr7 |ddd|fv xr- |j                  j                  |j                   j                  k(  }|sGd|j                   _          y  l y )N	localhostz	127.0.0.1z::1z\Request destination unknown. Unable to figure out where this request should be forwarded to.)	r:   r   ri   addressrg   r   rZ   r   rC   )	r0   dataconnect_hostconnect_portr   r:   r   r   self_connects	            r&   server_connectzProxyserver.server_connectZ  s    ;;'#'#5#5DKK  {{"""")-)<)<&lQll 	F060C0C ,[1 K/ Y$k5+(VVY66$++:X:XX 
  Z KK% 	r%   )ro   ztuple | strrp   r   )r]   Noner\   )r]   zlist[Address])r   zevents.MessageInjected)T)r   r   r   r^   r   bytesr   r^   )r   r   r   r^   r   r   )r   z%server_hooks.ServerConnectionHookData)r`   ra   rb   __doc____annotations__ri   rj   r2   rm   r   rq   r   r   r   r   r   r   r	   r   r   r   r   r$   r%   r&   re   re   l   s    ;:$(M>((,L%, 
D 0(03I0 0F
PFP
Q< W__'(KO##%)#49#DH# )# W__\"# ## W__\"# ##r%   re   )4r   
__future__r   r,   r   r   loggingcollections.abcr   r   
contextlibr   typingr   wsproto.frame_protocolr   	mitmproxyr	   r
   r   r   r   r   r   r   mitmproxy.connectionr   mitmproxy.flowr   mitmproxy.proxyr   r   r   mitmproxy.proxy.layers.tcpr   mitmproxy.proxy.layers.udpr    mitmproxy.proxy.layers.websocketr   mitmproxy.proxy.mode_serversr   r   r   mitmproxy.utilsr   r   r   	getLoggerr`   rB   r    re   r$   r%   r&   <module>r      s    #     $ $ %  )          (  " & ( 9 9 E ? 7 6 ) ! #			8	$=% =%@B- Br%   