
    kjQ                       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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
 G d dejD                               Z#e
 G d dejD                               Z$e
 G d dejD                               Z% G d dejL                        Z'y)    )annotationsN)Iterable)	dataclass)IPv4Address)IPv6Address)Any)cast)ClassVar)Self)flow)serializable)classes)domain_names)https_records)op_codes)response_codes)types)HTTPSRecord)HTTPSRecordJSON)SVCParamKeysc                  |    e Zd ZU  ej                  d      Zded<   ded<   ded<   ded<   dd	Zdd
Ze	dd       Z
y)Questionz!HHClassVar[struct.Struct]HEADERstrnameinttypeclass_c                    | j                   S N)r   selfs    V/home/ubuntu/.cache/pipx/cdb5059130eadca/lib/python3.12/site-packages/mitmproxy/dns.py__str__zQuestion.__str__(   s    yy    c                    | j                   t        j                  | j                        t	        j                  | j
                        dS )za
        Converts the question into json for mitmweb.
        Sync with web/src/flow.ts.
        )r   r   class)r   r   to_strr   r   r   r"   s    r$   to_jsonzQuestion.to_json+   s5     IILL+^^DKK0
 	
r&   c                v     | |d   t        j                  |d         t        j                  |d               S )Nr   r   r(   r   r   r   )r   from_strr   )clsdatas     r$   	from_jsonzQuestion.from_json6   s8    fV-##DM2
 	
r&   Nreturnr   r2   dict)r/   zdict[str, str]r2   r   )__name__
__module____qualname__structStructr   __annotations__r%   r*   classmethodr0    r&   r$   r   r       sE    &3fmmE&:F#:
I
IK	
 
 
r&   r   c                     e Zd ZU dZded<    ej                  d      Zded<   ded<   d	ed
<   d	ed<   d	ed<   ded<   d'dZe	d'd       Z
e
j                  d(d       Z
e	d)d       Zej                  d*d       Ze	d+d       Zej                  d,d       Ze	d'd       Zej                  d-d       Ze	d.d       Zej                  d/d       Ze	d0d       Zej                  d1d       Zd2dZd3dZed4d       Zeedd5d        Zeed	 	 	 	 	 	 	 d6d!       Zeed	 	 	 	 	 	 	 d7d"       Zeedd8d#       Zeedd9d$       Zeef	 	 	 	 	 	 	 d:d%       Zy&);ResourceRecord<   zClassVar[int]DEFAULT_TTLz!HHIHr   r   r   r   r   r   r   ttlbytesr/   c                4    t        | j                               S r!   )r   
_data_jsonr"   s    r$   r%   zResourceRecord.__str__J   s    4??$%%r&   c                8    | j                   j                  d      S Nutf-8)r/   decoder"   s    r$   textzResourceRecord.textM   s    yy((r&   c                0    |j                  d      | _        y rF   )encoder/   )r#   values     r$   rI   zResourceRecord.textQ   s    LL)	r&   c                ,    t        | j                        S r!   )r   r/   r"   s    r$   ipv4_addresszResourceRecord.ipv4_addressU       499%%r&   c                &    |j                   | _        y r!   packedr/   r#   ips     r$   rN   zResourceRecord.ipv4_addressY       II	r&   c                ,    t        | j                        S r!   )r   r/   r"   s    r$   ipv6_addresszResourceRecord.ipv6_address]   rO   r&   c                &    |j                   | _        y r!   rQ   rS   s     r$   rW   zResourceRecord.ipv6_addressa   rU   r&   c                @    t        j                  | j                        S r!   )r   unpackr/   r"   s    r$   domain_namezResourceRecord.domain_namee   s    ""499--r&   c                8    t        j                  |      | _        y r!   )r   packr/   )r#   r   s     r$   r[   zResourceRecord.domain_namei   s     %%d+	r&   c                Z   t        j                  | j                        }|j                  j	                  t
        j                  j                  d       }|Vd}g }|t        |      k  r9||   }|j                  ||dz   |dz   |z           ||dz   z  }|t        |      k  r9t        |      S y )Nr      )r   rZ   r/   paramsgetr   ALPNrL   lenappendtuple)r#   record
alpn_bytesiret	token_lens         r$   
https_alpnzResourceRecord.https_alpnm   s    %%dii0]]&&|'8'8'>'>E
!ACc*o%&qM	

:a!ea!ei.?@AY]" c*o% :r&   c                b   t        j                  | j                        }|5|j                  j	                  t
        j                  j                  d        n?dj                  d |D              }||j                  t
        j                  j                  <   t        j                  |      | _        y )Nr&   c              3  L   K   | ]  }t        t        |      g      |z     y wr!   )rB   rc   ).0as     r$   	<genexpr>z,ResourceRecord.https_alpn.<locals>.<genexpr>   s     !D!%Q/A"5!Ds   "$)
r   rZ   r/   r`   popr   rb   rL   joinr]   )r#   alpnrf   rg   s       r$   rk   zResourceRecord.https_alpn|   s{    %%dii0<MMl//55t<!Dt!DDJ5?FMM,++112!&&v.	r&   c                    t        j                  | j                        }|j                  j	                  t
        j                  j                  d       }|$t        j                  |      j                  d      S y rF   )r   rZ   r/   r`   ra   r   ECHrL   base64	b64encoderH   )r#   rf   	ech_bytess      r$   	https_echzResourceRecord.https_ech   s]    %%dii0MM%%l&6&6&<&<dC	 ##I.55g>>r&   c                z   t        j                  | j                        }|5|j                  j	                  t
        j                  j                  d        nKt        j                  |j                  d            }||j                  t
        j                  j                  <   t        j                  |      | _        y rF   )r   rZ   r/   r`   rq   r   ru   rL   rv   	b64decoderK   r]   )r#   echrf   rx   s       r$   ry   zResourceRecord.https_ech   s    %%dii0;MMl..44d;((G)<=I4=FMM,**001!&&v.	r&   c                   	 | j                   xt        j                  k(  r t        | j                        S xt        j
                  k(  r t        | j                        S xxt        j                  k(  rn*xt        j                  k(  rnxt        j                  k(  rn n  | j                  S xt        j                  k(  r | j                  S t        j                  k(  r-t        j                  | j                         j#                         S 	 d| j                   j%                          S # t&        $ rA d| j                   j%                          dt        j(                  | j                          dcY S w xY w)N0xz
 (invalid z data))r   r   Ar   rN   AAAArW   NSCNAMEPTRr[   TXTrI   HTTPSr   rZ   r/   r*   hex	Exceptionr)   r"   s    r$   rD   zResourceRecord._data_json   s    	S))UWWt0011UZZt00117XUXXieii7+++UYY99$[[(//		:BBDD		011 	S		(
5<<		3J2K6RR	Ss0   3D) (D) AD) ,D) >D) D) )AE32E3c                    | j                   t        j                  | j                        t	        j                  | j
                        | j                  | j                         dS )zh
        Converts the resource record into json for mitmweb.
        Sync with web/src/flow.ts.
        )r   r   r(   rA   r/   )r   r   r)   r   r   r   rA   rD   r"   s    r$   r*   zResourceRecord.to_json   sF     IILL+^^DKK088OO%
 	
r&   c                N    | |d   t        j                  |d         t        j                  |d         |d   d      }|d   }	 |j                  xt         j                  k(  r t        |      |_        |S xt         j                  k(  r t        |      |_	        |S xxt         j                  k(  rn*xt         j                  k(  rnxt         j                  k(  rn n  ||_        |S xt         j                  k(  r
 ||_        |S t         j                   k(  r?t#        j$                  t'        t(        |            }t+        j,                  |      |_        |S 	 t0        # t2        $ r? t4        j7                  |j9                  d      j;                  d	      d
         |_        Y |S w xY w)Nr   r   r(   rA   r&   )r   r   r   rA   r/   r/   r~   z (r   )r   r-   r   r   r   r   rN   r   r   rW   r   r   r   r[   r   rI   r   r   r0   r	   r   r   r]   r/   
ValueErrorr   rB   fromhexremoveprefix	partition)r.   r/   instdrf   s        r$   r0   zResourceRecord.from_json   s\   fV-##DM2U
 f	O))UWW(3AD%   UZZ(3AD%  8XUXXieii7'(D$  UYY !DI  [[(2243KLF - 2 26 :DI  $$ 	OannT&:&D&DT&J1&MNDI	Os3   /E 7$E AE 'E AE E AF$#F$)rA   c               f     | |t         j                  t        j                  ||j                        S )zCreate an IPv4 resource record.)r   r   r   INrR   r.   r   rT   rA   s       r$   r   zResourceRecord.A   s#     4'**c299==r&   c               f     | |t         j                  t        j                  ||j                        S )zCreate an IPv6 resource record.)r   r   r   r   rR   r   s       r$   r   zResourceRecord.AAAA   s#    
 4WZZbii@@r&   c          	     x     | |t         j                  t        j                  |t	        j
                  |            S z1Create a canonical internet name resource record.)r   r   r   r   r   r]   )r.   alias	canonicalrA   s       r$   r   zResourceRecord.CNAME   s*    
 5%++wzz38I8I)8TUUr&   c          	     x     | |t         j                  t        j                  |t	        j
                  |            S r   )r   r   r   r   r   r]   )r.   inaddrptrrA   s       r$   r   zResourceRecord.PTR   s*     6599gjj#|7H7H7MNNr&   c          	     p     | |t         j                  t        j                  ||j	                  d            S )z!Create a textual resource record.rG   )r   r   r   r   rK   )r.   r   rI   rA   s       r$   r   zResourceRecord.TXT   s(     4GJJT[[5IJJr&   c           	     x     | |t         j                  t        j                  |t	        j
                  |            S )zCreate a HTTPS resource record)r   r   r   r   r   r]   )r.   r   rf   rA   s       r$   r   zResourceRecord.HTTPS   s*    
 4gjj#}7I7I&7QRRr&   Nr1   )rL   r   r2   None)r2   r   )rT   r   r2   r   )r2   r   )rT   r   r2   r   )r   r   r2   r   )r2   ztuple[bytes, ...] | None)rs   zIterable[bytes] | Noner2   r   )r2   
str | None)r|   r   r2   r   )r2   zstr | HTTPSRecordJSON)r2   z&dict[str, str | int | HTTPSRecordJSON])r/   zdict[str, Any]r2   r   )r   r   rT   r   rA   r   r2   r>   )r   r   rT   r   rA   r   r2   r>   )r   r   r   r   rA   r   r2   r>   )r   r   r   r   rA   r   r2   r>   )r   r   rI   r   rA   r   r2   r>   )r   r   rf   r   rA   r   r2   r>   )r5   r6   r7   r@   r:   r8   r9   r   r%   propertyrI   setterrN   rW   r[   rk   ry   rD   r*   r;   r0   r   r   r   r   r   r   r<   r&   r$   r>   r>   ?   sq   !#K#&3fmmG&<F#<
I
IK	H
K& ) ) 
[[* * & &   & &   . . , ,   / /   / /S$
  < 9D > > 7BAA'A14A	A A 7BVV$'V14V	V V 6A O O 5@ K K 8CSS +S25S	S Sr&   r>   c                     e Zd ZU  ej                  d      Zded<   ded<   	 ded<   	 ded<   	 ded	<   	 ded
<   	 ded<   	 ded<   	 ded<   	 ded<   	 ded<   	 ded<   	 ded<   	 ded<   	 dZded<   	 d$dZe	d%d       Z
e	d&d       Ze	d'd       Zd(dZd)dZed*d+d       Ze	 d*	 	 	 	 	 	 	 d,d       Ze	d%d        Zd-d!Zed.d"       Zd/d#Zy)0
DNSMessagez!HHHHHHr   r   r   idboolqueryop_codeauthoritative_answer
truncationrecursion_desiredrecursion_availablereservedresponse_codezlist[Question]	questionslist[ResourceRecord]answersauthoritiesadditionalsNfloat | None	timestampc                    dj                  t        t        t        j                  | j
                  | j                  | j                  | j                                    S )Nz
)	rr   mapr   	itertoolschainr   r   r   r   r"   s    r$   r%   zDNSMessage.__str__+  sG    {{NNDLL$2B2BDDTDT
 	
r&   c                    | j                   S r!   )rR   r"   s    r$   contentzDNSMessage.content5  s    {{r&   c                R    t        | j                        dk(  r| j                  d   S y)zjDNS practically only supports a single question at the
        same time, so this is a shorthand for this.r_   r   N)rc   r   r"   s    r$   questionzDNSMessage.question9  s'     t~~!#>>!$$r&   c                    t        d t        j                  j                  | j                  | j
                  | j                  g      D              S )zAReturns the cumulative data size of all resource record sections.c              3  F   K   | ]  }t        |j                          y wr!   )rc   r/   )rn   xs     r$   rp   z"DNSMessage.size.<locals>.<genexpr>D  s       
 K
s   !)sumr   r   from_iterabler   r   r   r"   s    r$   sizezDNSMessage.sizeA  sG      
__22t//1A1AB
 
 	
r&   c                    |t         j                  k(  rt        d      t        t	        j                         | j
                  d| j                  dd| j                  dd|| j                  g g g       S )Nz$response_code must be an error code.Fr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )	r   NOERRORr   r   timer   r   r   r   )r#   r   s     r$   failzDNSMessage.failK  sk    N222CDDiikwwLL!&"44 %'nn
 	
r&   c                    t        t        j                         | j                  d| j                  dd| j                  ddt
        j                  | j                  |g g       S )NFTr   r   )r   r   r   r   r   r   r   r   )r#   r   s     r$   succeedzDNSMessage.succeed_  sW    iikwwLL!&"44 $(00nn
 	
r&   c                    | j                  |d|      \  }}|t        |      k7  rt        j                  d| d      |S )z4Converts the entire given buffer into a DNS message.r   zunpack requires a buffer of  bytes)unpack_fromrc   r8   error)r.   bufferr   lengthmsgs        r$   rZ   zDNSMessage.unpackq  sD     oofa;S[ ,,!=fXVLMM
r&   c                d   t         j                  j                        \  }}}}}}	t        |||dz  dk(  |dz	  dz  |dz  dk7  |dz  dk7  |dz  dk7  |dz  dk7  |d	z	  d
z  |dz  g g g g       }
t         j                  j                  z  t	        j
                         dfdt        d|      D ]q  }	         }t        j                  j                        \  }}t        j                  j                  z  |
j                  j                  t        |||             s 	 	 	 	 	 	 	 	 dfd} ||
j                  d|        ||
j                  d|        ||
j                  d|	       |
fS # t        j                  $ r }t        j                  d| d|       d}~ww xY w)zWConverts the buffer from a given offset into a DNS message and also returns its length.   r                           r   c                 F    t        j                        \  } }|z  | S r!   )r   unpack_from_with_compression)r   r   r   cached_namesoffsets     r$   unpack_domain_namez2DNSMessage.unpack_from.<locals>.unpack_domain_name  s/    'DDLD& fFKr&   r,   z
question #: Nc           
     .   t        d|      D ]  }	         }t        j                  j                        \  }}}}t        j                  j                  z  |z   }	t              |	k  rt        j                  d| d      |	 }
t        j                  |      rt        j                  |	      }
| j                  t        |||||
             |z   y # t        j                  $ r"}t        j                  | d| d|       d }~ww xY w)Nr   z!unpack requires a data buffer of r   z #r   )ranger>   r   r   r   rc   r8   r   r    record_data_can_have_compressiondecompress_from_record_datard   )sectionsection_namecountrh   r   r   r   rA   len_dataend_datar/   er   r   r   r   s               r$   
unpack_rrsz*DNSMessage.unpack_from.<locals>.unpack_rrs  s+    1e_ DD-/D2@2G2G2S2S3/D&#x n33888F%0H6{X-$ll?zP  "&2D#DDTJ+GG"FHl  NN>$fc4#PQh&F)D* || D ,,,r!Bqc'BCCDs   C
CD2DDanswer	authority
additionalr1   )r   r   r   r   r   r   r2   r   )r   r   r   r   r   cacher   r   r   rd   r8   r   r   r   r   )r.   r   r   r   r   flagslen_questionslen_answerslen_authoritieslen_additionalsr   rh   r   r   r   r   r   r   r   s    ``              @@r$   r   zDNSMessage.unpack_fromy  s    ))&&9	
G$*b[F*"'7"3!9(Q.$/A5!&&!1a 7qjE)&.
  	*##(((#))+	 q-( 	:A:)+'::66Jf(//...$$X4d6%RS	:	D)	D9<	DEH	D	D 	D8 	3;;+63??KA3??L/B}E << :llZs"QC#899:s   ;A.E<<F/F**F/c                   | j                   dk  s| j                   dkD  rt        d| j                    d      d}| j                  s|dz  }| j                  dk  s| j                  dkD  rt        d| j                   d      || j                  dz  z  }| j                  r|d	z  }| j
                  r|d
z  }| j                  r|dz  }| j                  r|dz  }| j                  dk  s| j                  dkD  rt        d| j                   d      || j                  dz  z  }| j                  dk  s| j                  dkD  rt        d| j                   d      || j                  z  }t               }|j                  t        j                  j                  | j                   |t        | j                         t        | j"                        t        | j$                        t        | j&                                     | j                   D ]s  }|j                  t)        j                  |j*                               |j                  t,        j                  j                  |j.                  |j0                               u g | j"                  | j$                  | j&                  D ]  }|j                  t)        j                  |j*                               |j                  t2        j                  j                  |j.                  |j0                  |j4                  t        |j6                                     |j                  |j6                          t9        |      S )z(Converts the message into network bytes.r     zDNS message's id z is out of bounds.r   r   zDNS message's op_code r   r   r   r   r   r   z DNS message's reserved value of r   zDNS message's response_code )r   r   r   r   r   r   r   r   r   r   	bytearrayextendr   r   r]   rc   r   r   r   r   r   r   r   r   r   r>   rA   r/   rB   )r#   r   r/   r   rrs        r$   rR   zDNSMessage.packed  s    77Q;$''E/0	9KLMMzzWE<<!t||f45dll^CUVWW##$$WE??VOE!!VOE##VOE==1 524==/AST  	!##!T%7%7&%@.t/A/A.BBTU  	###{""DNN#DLL!D$$%D$$%		
  	NHKK))(--89KK,,X]]HOOLM	N HDLLG4#3#3Gd6F6FG 	!BKK))"''23KK%%**277BIIrvvs277|T KK 	! T{r&   c                   | j                   | j                  t        j                  | j                        | j
                  | j                  | j                  | j                  t        j                  | j                        t        j                  | j                        | j                  D cg c]  }|j                          c}| j                  D cg c]  }|j                          c}| j                  D cg c]  }|j                          c}| j                   D cg c]  }|j                          c}| j"                  d}| j$                  r| j$                  |d<   |S c c}w c c}w c c}w c c}w )z`
        Converts the message into json for mitmweb.
        Sync with web/src/flow.ts.
        )r   r   r   r   r   r   r   r   status_coder   r   r   r   r   r   )r   r   r   r)   r   r   r   r   r   r   r   http_equiv_status_coder   r*   r   r   r   r   r   )r#   r   r   ri   s       r$   r*   zDNSMessage.to_json  s    ''ZZt||4$($=$=//!%!7!7#'#;#;+2243E3EF)@@ASAST=A^^L(**,L/3||<

<373C3CDRBJJLD373C3CDRBJJLDII
  >>#~~C
 M<DDs   +E$E)9E. E3c                (    | |d   |d   t        j                  |d         |d   |d   |d   |d   dt        j                  |d	         |d
   D cg c]  }t        j	                  |       c}|d   D cg c]  }t
        j	                  |       c}|d   D cg c]  }t
        j	                  |       c}|d   D cg c]  }t
        j	                  |       c}      }|j                  d      x}r||_        |S c c}w c c}w c c}w c c}w )z$Reconstruct a DNS message from JSON.r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r-   r   r   r0   r>   ra   r   )r.   r/   r   r   tss        r$   r0   zDNSMessage.from_json  s    Dzw-%%d9o6!%&<!=L)"#67 $%: ;(11$2GH6:;6GHx))!,H:>y/JQ^--a0J>B=>QR11!4R>B=>QR11!4R
 +&&2&DN IJRRs   D 6DD
 D c                ~    | j                         }t        j                  dd      |d<   t        j	                  |      S )Nr   r   r   )	get_staterandomrandintr   
from_state)r#   states     r$   copyzDNSMessage.copy.  s3     nnQ.d$$U++r&   r1   )r2   rB   )r2   zQuestion | None)r2   r   )r   r   r2   r   )r   r   r2   r   r!   )r   rB   r   r   r2   r   )r   zbytes | bytearrayr   r   r   r   r2   ztuple[int, DNSMessage]r3   )r/   r   r2   r   )r2   r   )r5   r6   r7   r8   r9   r   r:   r   r%   r   r   r   r   r   r   r;   rZ   r   rR   r*   r0   r  r<   r&   r$   r   r      sy   &3fmmI&>F#>GQKAL  z  CMN1 "!(%%)%%("I|"=
     
 

(
$   OSO&O03O@LO	O Ob 1 1f2  *,r&   r   c                  V     e Zd ZU dZded<   	 dZded<   	 d
 fdZd fdZdd	Z xZ	S )DNSFlowzJA DNSFlow is a collection of DNS messages representing a single DNS query.r   requestNzDNSMessage | Noneresponsec                    i t         |          | j                  j                         | j                  r| j                  j                         dS d dS )Nr  r  )superr   r  r  )r#   	__class__s    r$   r   zDNSFlow.get_state=  sY    
g!
||--/59]]//1
 	
 IM
 	
r&   c                    t         j                  |j                  d            | _        |j                  d      x}rt         j                  |      nd | _        t
        |   |       y )Nr  r  )r   r  rq   r  r  r  	set_state)r#   r  rr  s      r$   r  zDNSFlow.set_stateD  sW    !,,UYYy-AB.3ii
.C)C)CJ!!!$$ 	 	% r&   c                <    d| j                   d| j                  dS )Nz<DNSFlow
  request=z
  response=z
>r
  r"   s    r$   __repr__zDNSFlow.__repr__K  s"    ''7t}}FWW\]]r&   )r2   serializable.State)r  r  r2   r   r1   )
r5   r6   r7   __doc__r:   r  r   r  r  __classcell__)r  s   @r$   r  r  5  s-    T"&H&
!^r&   r  )(
__future__r   rv   r   r   r8   r   collections.abcr   dataclassesr   	ipaddressr   r   typingr   r	   r
   r   	mitmproxyr   mitmproxy.coretypesr   mitmproxy.net.dnsr   r   r   r   r   r   mitmproxy.net.dns.https_recordsr   r   r   SerializableDataclassr   r>   r   Flowr  r<   r&   r$   <module>r      s    "      $ ! ! !      , % * + & , # 7 ; 8
 
|11 
 
< yS\77 yS ySz t,33 t, t,n	^dii ^r&   