
    kj                        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  e j*                  d      Ze G d dej.                               Ze G d dej.                               Ze G d dej.                               Zdej6                  ded   defdZ G d dej<                        Zy)    N)	dataclass)List)Literal)dns)flow)response_codes)commands)events)layer)Context)expect!Hc                   0    e Zd ZU dZej
                  ed<   y)DnsRequestHookz(
    A DNS query has been received.
    r   N__name__
__module____qualname____doc__r   DNSFlow__annotations__     c/home/ubuntu/.cache/pipx/cdb5059130eadca/lib/python3.12/site-packages/mitmproxy/proxy/layers/dns.pyr   r           ++r   r   c                   0    e Zd ZU dZej
                  ed<   y)DnsResponseHookz2
    A DNS response has been received or set.
    r   Nr   r   r   r   r   r      r   r   r   c                   0    e Zd ZU dZej
                  ed<   y)DnsErrorHookz#
    A DNS error has occurred.
    r   Nr   r   r   r   r   r   %   r   r   r   messagetransport_protocol)tcpudpreturnc                 l    | j                   }|dk(  r"t        j                  dt        |            |z   S |S )Nr"   r   )packedstructpacklen)r    r!   r&   s      r   pack_messager*   .   s4     ^^FU"{{4V-66r   c                       e Zd ZU dZeeej                  f   ed<   e	ed<   e	ed<   de
f fdZdej                  dej                  d	ej                  d
   fdZdej                  dej                  d	ej                  d
   fdZdej                  ded	ej                  d
   fdZdeded	eej                     fdZ eej2                        d	ej                  d
   fd       Z eej6                  ej8                        dej:                  d	ej                  d
   fd       Z eej6                  ej8                        d	ej                  d
   fd       ZeZ  xZ!S )DNSLayerz3
    Layer that handles resolving DNS queries.
    flowsreq_bufresp_bufcontextc                 n    t         |   |       i | _        t               | _        t               | _        y N)super__init__r-   	bytearrayr.   r/   )selfr0   	__class__s     r   r4   zDNSLayer.__init__A   s)    !
 {!r   r   msgr$   Nc              #   $  K   ||_         t        |       |j                  r%| j                  ||j                        E d {    y |j                  r/| j                  ||j                  j                        E d {    y | j                  j                  j                  s| j                  |d      E d {    y | j                  j                  j                  sQt        j                  | j                  j                        }|r$| j                  |t        |            E d {    y t        |j                   |j                  j                         }t        j"                  | j                  j                  |       y 7 D7 7 7 dw)Nz;No hook has set a response and there is no upstream server.)requestr   responsehandle_responseerrorhandle_errorr8   r0   serveraddress	connectedr	   OpenConnectionstrr*   server_connr!   SendData)r6   r   r8   errr&   s        r   handle_requestzDNSLayer.handle_requestG   s3     T""==++D$--@@@ZZ((tzz~~>>>$$,,((S   <<&&00$33DLL4G4GHH#00s3x@@@!$,,0@0@0S0STF##DLL$7$7@@ A> AsJ   A FF:F=F	>:F8F9A0F)F*AF	FFFc              #      K   ||_         t        |       |j                   rWt        |j                   |j                  j                        }t        j                  | j                  j                  |       y y wr2   )	r;   r   r*   client_connr!   r	   rE   r0   client)r6   r   r8   r&   s       r   r<   zDNSLayer.handle_response^   s_      d##==!$--1A1A1T1TUF##DLL$7$7@@ s   A9A;rF   c              #   @  K   t        j                  |      |_        t        |       |j                  j                  t        j                        }t        j                  | j                  j                  t        ||j                  j                               y wr2   )mflowErrorr=   r   r:   failr   SERVFAILr	   rE   r0   rJ   r*   rI   r!   )r6   r   rF   servfails       r   r>   zDNSLayer.handle_errorg   sq     [[%
4  <<$$^%<%<=LL4#3#3#F#FG
 	
s   BBdatafrom_clientc                 <   g }|r| j                   n| j                  }| j                  j                  j                  dk(  rD|j                  t        j                  j                  |t        j                                      |S | j                  j                  j                  dk(  r|j                  |       t        |      }d}	 ||z
  t        j                  k  rnt        j                  ||      \  }|t        j                  z  }|dk(  rt        j                   d      ||z
  |k  r|t        j                  z  }nYt#        ||||z          }||z  }|j                  t        j                  j                  |t        j                                      |d |= |S )Nr#   )	timestampr"   r   z#Message length field cannot be zero)r.   r/   r0   rJ   r!   appendr   
DNSMessageunpacktimeextendr)   _LENGTH_LABELsizeunpack_fromr'   r=   bytes)r6   rQ   rR   msgsbufr[   offsetexpected_sizes           r   unpack_messagezDNSLayer.unpack_messagep   sb   %')dllt}}<<11U:KK--ddiik-JK. - \\  33u<JJts8DF&==#5#55#0#<#<S&#I -,,, A% ,,'LMM&==0m000FS-&*@AB-'CNN11$$))+1NO   GVGr   c              #   F   K   | j                   | _        dE d {    y 7 wNr   )state_query_handle_eventr6   _s     r   state_startzDNSLayer.state_start   s     !--s   !!eventc              #     K   t        |t        j                        sJ |j                  | j                  j
                  u }t        |t        j                        rxg }	 | j                  |j                  |      }|D ]S  }	 | j                  |j                     }|r| j                  ||      E d {    :| j!                  ||      E d {    U y t        |t        j0                        r|r| j                  j                  n| j                  j
                  }|j2                  rt'        j*                  |       | j,                  | _        | j                  j5                         D ]	  }d|_         y t9        d|       # t        $ r] t        j                  | j                  j
                  | j                  j                  d      }|| j                  |j                  <   Y Pw xY w7 =7 %# t"        j$                  $ rb}t'        j(                  |j                   d|        t'        j*                  |j                         | j,                  | _        Y d }~y d }~ww xY ww)NT)livez sent an invalid message: FzUnexpected event: )
isinstancer
   ConnectionEvent
connectionr0   rJ   DataReceivedrb   rQ   r-   idKeyErrorr   r   r?   rG   r<   r'   r=   r	   LogCloseConnection
state_donerf   ConnectionClosedrA   valuesrl   AssertionError)r6   rj   rR   r^   r8   r   e
other_conns           r   re   zDNSLayer.state_query   s    %!7!7888&&$,,*=*==eV001)+DC**5::{C   CC2#zz#&&1 ##'#6#6tS#AAA#'#7#7c#BBBC v6670;,,ATATJ##..z::!%D

))+ "!	" !#5eW!=>>' $ 2"{{ LL//1D1D4  .2

366*	2 BB! << 5lle&6&6%77QRSQT#UVV..u/?/?@@%)__""5su   AI+G3 :I+ FI+0G-1I+G0B8I+A"G*&I+)G**I+0I+3I(AI#I+#I((I+c              #   $   K   dE d {    y 7 wrd   r   rg   s     r   ru   zDNSLayer.state_done   s     s   )"r   r   r   r   dictintr   r   r   r5   r   r4   rV   r   CommandGeneratorrG   r<   rC   r>   r]   boolr   rb   r   r
   Startri   rp   rv   Eventre   ru   rf   __classcell__)r7   s   @r   r,   r,   8   s    S[[ !!$ $AKKA&)nnA				%A.AKKA&)nnA				%A
 
3 
5;Q;QRV;W 
5 t S^^@T > FLL 6 6t <   F!8!89#? #?%2H2H2N #? :#?J F!8!89u55d;  :  Mr   r,   ) r'   rX   dataclassesr   typingr   r   	mitmproxyr   r   rL   mitmproxy.net.dnsr   mitmproxy.proxyr	   r
   r   mitmproxy.proxy.contextr   mitmproxy.proxy.utilsr   StructrZ   	StartHookr   r   r   rV   r]   r*   Layerr,   r   r   r   <module>r      s      !    # , $ " ! + (d# X''   h((   8%%  ^^181F
F u{{ F r   