
    @OOfv'                     F   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  ej$                  e      Zd	 Zd
 Ze j.                  d        Z G d d      Zd Ze G d dej6                               Z G d d      Zy)    N)Callable)Sequence)	dataclass)Any)
exceptions)flow)hooksc                 `    t        | d| j                  j                  j                               S )Nname)getattr	__class____name__lower)itms    W/var/www/premiumrankchecker/venv/lib/python3.12/site-packages/mitmproxy/addonmanager.py	_get_namer      s$    3 6 6 < < >??    c                 v    | }t        j                  |       D ]  \  }}}}| j                  } ||k(  s n | xs |S )z
    Cut off a traceback at the function with the given name.
    The func_name's frame is excluded.

    Args:
        tb: traceback object, as returned by sys.exc_info()[2]
        func_name: function name

    Returns:
        Reduced traceback.
    )	traceback
extract_tbtb_next)tb	func_nametb_orig_fnames        r   cut_tracebackr      sK     G#..r2 1eQZZI =r   c               #   $  K   	 d  y # t         j                  t         j                  f$ r  t        $ rX t	        j
                         \  } }}t        |d      }t        |d      }| sJ |sJ t        j                  d| | ||f       Y y w xY ww)Ninvoke_addon_syncinvoke_addonzAddon error: )exc_info)	r   	AddonHaltOptionsError	Exceptionsysr!   r   loggererror)etypevaluer   s      r   safecallr*   ,   s     
  *"9"9:  	
<<>ub2232~.uuE7#UB' 	 	
	
s&   B	 BBB
BBBc                   Z    e Zd ZdZd Z	 ddededededee   dz  d	dfd
Z	dede
d	dfdZy)LoaderzM
    A loader object is passed to the load() event when addons start up.
    c                     || _         y N)masterselfr/   s     r   __init__zLoader.__init__C   s	    r   Nr   typespecdefaulthelpchoicesreturnc                    t        |t              rJ || j                  j                  v r| j                  j                  j                  |   }|j
                  |k(  xrB |j                  |k(  xr1 |j                  |k(  xr  |j                  |k(  xr |j                  |k(  }|ryt        j                  d|z         | j                  j                  j                  |||||       y)z
        Add an option to mitmproxy.

        Help should be a single paragraph with no linebreaks - it will be
        reflowed by tools. Information on the data type should be omitted -
        it will be generated and added by tools as needed.
        NzOver-riding existing option %s)
isinstancestrr/   options_optionsr   r3   r4   r5   r6   r&   warning
add_option)r1   r   r3   r4   r5   r6   existingsame_signatures           r   r>   zLoader.add_optionF   s     gs+++4;;&&&{{**33D9H% 0%%10$$/0 MMT)0 $$/  ?$FG&&tXwgNr   pathfuncc                 P    | j                   j                  j                  ||       y)zAdd a command to mitmproxy.

        Unless you are generating commands programatically,
        this API should be avoided. Decorate your function with `@mitmproxy.command.command` instead.
        N)r/   commandsadd)r1   rA   rB   s      r   add_commandzLoader.add_commande   s     	  t,r   r.   )r   
__module____qualname____doc__r2   r:   typer   r   r>   r   rF    r   r   r,   r,   >   sz     )-OO O 	O
 O #%O 
O>- -8 - -r   r,   c              #   z   K   | D ]0  }| t        |d      st        |j                        E d{    2 y7 w)z.
    Recursively traverse an addon chain.
    addonsN)hasattrtraverserM   )chainas     r   rO   rO   n   s=       *1h)))* *s   ;;9;c                       e Zd ZU dZeed<   y)LoadHookz
    Called when an addon is first loaded. This event receives a Loader
    object, which contains methods for adding options and commands. This
    method is where the addon configures itself.
    loaderN)r   rG   rH   rI   r,   __annotations__rK   r   r   rS   rS   x   s     Nr   rS   c                      e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zdej                  fdZdej                  fdZdej                  fdZdej                  fdZdej                  fdZdej                  fdZy)AddonManagerc                     i | _         g | _        || _        |j                  j                  j                  | j                         y r.   )lookuprP   r/   r;   changedconnect_configure_allr0   s     r   r2   zAddonManager.__init__   s5    
&&t':':;r   c                 L    | j                  t        j                  |             y r.   )triggerr	   ConfigureHook)r1   updateds     r   r\   zAddonManager._configure_all   s    U((12r   c                     | j                   D ]&  }| j                  |t        j                                ( i | _        g | _         y)z$
        Remove all addons.
        N)rP   r   r	   DoneHookrY   )r1   rQ   s     r   clearzAddonManager.clear   s<      	8A""1enn&67	8
r   c                 :    | j                   j                  |d      S )z
        Retrieve an addon by name. Addon names are equal to the .name
        attribute on the instance, or the lower case class name if that
        does not exist.
        N)rY   get)r1   r   s     r   re   zAddonManager.get   s     {{tT**r   c                 ~   dddddd}t        |g      D ]p  }|j                         D ]*  \  }}t        ||      st        j	                  | d       , t        |      }|| j                  v sZt        j                  d|z         t        | j                        }| j                  |t        |             t        |g      D ]  }t        |      }|| j                  |<    t        |g      D ]'  }| j                  j                  j                  |       ) | j                  j                  j!                          |S )	aL  
        Register an addon, call its load event, and then register all its
        sub-addons. This should be used by addons that dynamically manage
        addons.

        If the calling addon is already running, it should follow with
        running and configure events. Must be called within a current
        context.
        zFThe clientconnect event has been removed, use client_connected insteadzLThe clientdisconnect event has been removed, use client_disconnected insteadzYThe serverconnect event has been removed, use server_connect and server_connected insteadzLThe serverdisconnect event has been removed, use server_disconnected insteadzRThe add_log event has been deprecated, use Python's builtin logging module instead)clientconnectclientdisconnectserverconnectserverdisconnectadd_logzM. For more details, see https://docs.mitmproxy.org/dev/addons-api-changelog/.z$An addon called '%s' already exists.)rO   itemsrN   r&   r=   r   rY   r   AddonManagerErrorr,   r/   r   rS   rD   collect_commandsr;   process_deferred)r1   addonapi_changesrQ   oldmsgr   rT   s           r   registerzAddonManager.register   s>     f"nx"nk
 5'" 
	A'--/ S1c?NN%lm
 Q<Dt{{" 22:TA 
	 $uhv&675'" 	"AQ<D !DKK	" 5'" 	5AKK  11!4	5,,.r   c                 f    |D ],  }| j                   j                  | j                  |             . y)z
        Add addons to the end of the chain, and run their load event.
        If any addon has sub-addons, they are registered.
        N)rP   appendrt   )r1   rM   is      r   rE   zAddonManager.add   s.    
  	0AJJdmmA./	0r   c                 N   t        |g      D ]m  }t        |      }|| j                  vrt        j                  d|z        | j
                  D cg c]	  }||us| c}| _        | j                  t        |      = o | j                  |t        j                                yc c}w )z
        Remove an addon and all its sub-addons.

        If the addon is not in the chain - that is, if it's managed by a
        parent addon - it's the parent's responsibility to remove it from
        its own addons attribute.
        zNo such addon: %sN)	rO   r   rY   r   rm   rP   r   r	   rb   )r1   rp   rQ   nrw   s        r   removezAddonManager.remove   s     5'" 	*A!A# 223F3JKK%)ZZ>1A:!>DJIaL)	* 	uenn&67 ?s   	B"B"c                 ,    t        | j                        S r.   )lenrP   )r1   s    r   __len__zAddonManager.__len__   s    4::r   c                 x    t        j                  | j                  D cg c]  }t        |       c}      S c c}w r.   )pprintpformatrP   r:   )r1   rw   s     r   __str__zAddonManager.__str__   s'    ~~tzz:!s1v:;;:s   7c                 4    t        |      }|| j                  v S r.   )r   rY   )r1   itemr   s      r   __contains__zAddonManager.__contains__   s    t{{""r   eventc                    K   |j                         d   }| j                  |       d{    t        |t        j                        r.| j                  t        j                  |g             d{    yy7 M7 w)z+
        Handle a lifecycle event.
        r   N)argstrigger_eventr9   r   Flowr	   
UpdateHook)r1   r   messages      r   handle_lifecyclezAddonManager.handle_lifecycle   sk      **,q/  '''gtyy)$$U%5%5wi%@AAA * 	( Bs"   (A<A8AA<1A:2A<:A<c              #   >  K   t        |t        j                        sJ t        |g      D ]n  }t	        ||j
                  d      }|st        |      r||f /t        |t        j                        rJt        j                  d|j
                   d| d       yw)zK
        Enumerate all hook callables belonging to the given addon
        NzAddon handler  (z) not callable)r9   r	   HookrO   r   r   callabletypes
ModuleTyper   rm   )r1   rp   r   rQ   rB   s        r   _iter_hookszAddonManager._iter_hooks   s      %,,,5'" 	A1ejj$/DD>T'Me&6&67
 $66(BqcH 	s   ABABc                    K   | j                  ||      D ];  \  }} ||j                          }|t        j                  |      s2| d{    = y7 w)zR
        Asynchronously invoke an event on an addon and all its children.
        N)r   r   inspectisawaitable)r1   rp   r   rB   ress        r   r    zAddonManager.invoke_addon  sV       ++E59 	KE4

%C7#6#6s#;				 s   .AAAAAc                     | j                  ||      D ]S  \  }}t        j                  |      r&t        j                  d|j
                   d| d       ||j                           U y)zC
        Invoke an event on an addon and all its children.
        zAsync handler r   z$) cannot be called from sync contextN)r   r   iscoroutinefunctionr   rm   r   r   )r1   rp   r   rB   s       r   r   zAddonManager.invoke_addon_sync  sl      ++E59 	 KE4**40 22$UZZL5'9]^  %**,	 r   c                    K   | j                   D ]0  }	 t               5  | j                  ||       d{    ddd       2 y7 # 1 sw Y   xY w# t        j                  $ r Y  yw xY ww)zD
        Asynchronously trigger an event across all addons.
        N)rP   r*   r    r   r"   r1   r   rw   s      r   r   zAddonManager.trigger_event  sm       	AZ 6++Au5556	 66 6'' sN   A+
AAAAA A+AA	
AA($A+'A((A+c                     | j                   D ](  }	 t               5  | j                  ||       ddd       * y# 1 sw Y   xY w# t        j                  $ r Y  yw xY w)z
        Trigger an event across all addons.

        This API is discouraged and may be deprecated in the future.
        Use `trigger_event()` instead, which provides the same functionality but supports async hooks.
        N)rP   r*   r   r   r"   r   s      r   r^   zAddonManager.trigger(  s^      	AZ 5**1e45	5 5'' s$   
A9AA	AAAN)r   rG   rH   r2   r\   rc   re   rt   rE   rz   r}   r   r   r	   r   r   r   r    r   r   r^   rK   r   r   rW   rW      s    <3+&P08 <#	BEJJ 	B

 *uzz 	 ejj 	 	 	UZZ r   rW   )
contextlibr   loggingr   r%   r   r   collections.abcr   r   dataclassesr   typingr   	mitmproxyr   r   r	   	getLoggerr   r&   r   r   contextmanagerr*   r,   rO   r   rS   rW   rK   r   r   <module>r      s        
   $ $ !     			8	$@( 
 
"-- --`* uzz  q qr   