
    @OOf?                    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 e G d dej.                               Ze G d dej.                               Ze G d dej.                               Z G d dej6                        Zy)    )annotationsN)	dataclass)IPv4Address)IPv6Address)ClassVar)flow)serializable)classes)domain_names)op_codes)response_codes)typesc                  j    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y)Questionz!HHClassVar[struct.Struct]HEADERstrnameinttypeclass_c                    | j                   S N)r   selfs    N/var/www/premiumrankchecker/venv/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   Nreturnr   r$   dict)	__name__
__module____qualname__structStructr   __annotations__r   r"    r   r   r   r      s1    &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d'dZeedd(d       Zeed	 	 	 	 	 	 	 d)d       Zeed	 	 	 	 	 	 	 d*d       Zeedd+d       Zeedd,d       Zy)-ResourceRecord<   zClassVar[int]DEFAULT_TTLz!HHIHr   r   r   r   r   r   r   ttlbytesdatac                   	 | j                   t        j                  k(  rt        | j                        S | j                   t        j
                  k(  rt        | j                        S | j                   t        j                  t        j                  t        j                  fv r| j                  S | j                   t        j                  k(  r| 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   ipv4_addressAAAAipv6_addressNSCNAMEPTRdomain_nameTXTtext	Exceptionr4   hexr!   r   s    r   r   zResourceRecord.__str__9   s    
	SyyEGG#4,,--yyEJJ&4,,--yyUXXu{{EII>>'''yyEII%yy  & DIIMMO$%%  	S		(
5<<		3J2K6RR	Ss$   1C4 1C4 &AC4 -(C4 4AD>=D>c                8    | j                   j                  d      S Nutf-8)r4   decoder   s    r   r@   zResourceRecord.textG   s    yy((r   c                0    |j                  d      | _        y rD   )encoder4   )r   values     r   r@   zResourceRecord.textK   s    LL)	r   c                ,    t        | j                        S r   )r   r4   r   s    r   r8   zResourceRecord.ipv4_addressO       499%%r   c                &    |j                   | _        y r   packedr4   r   ips     r   r8   zResourceRecord.ipv4_addressS       II	r   c                ,    t        | j                        S r   )r   r4   r   s    r   r:   zResourceRecord.ipv6_addressW   rK   r   c                &    |j                   | _        y r   rM   rO   s     r   r:   zResourceRecord.ipv6_address[   rQ   r   c                @    t        j                  | j                        S r   )r   unpackr4   r   s    r   r>   zResourceRecord.domain_name_   s    ""499--r   c                8    t        j                  |      | _        y r   )r   packr4   )r   r   s     r   r>   zResourceRecord.domain_namec   s     %%d+	r   c                    | j                   t        j                  | j                        t	        j                  | j
                        | j                  t        |       dS )zh
        Converts the resource record into json for mitmweb.
        Sync with web/src/flow.ts.
        )r   r   r    r2   r4   )r   r   r!   r   r
   r   r2   r   r   s    r   r"   zResourceRecord.to_jsong   sC     IILL+^^DKK088I
 	
r   )r2   c               f     | |t         j                  t        j                  ||j                        S )zCreate an IPv4 resource record.)r   r7   r
   INrN   clsr   rP   r2   s       r   r7   zResourceRecord.At   s#     4'**c299==r   c               f     | |t         j                  t        j                  ||j                        S )zCreate an IPv6 resource record.)r   r9   r
   rZ   rN   r[   s       r   r9   zResourceRecord.AAAAy   s#    
 4WZZbii@@r   c          	     x     | |t         j                  t        j                  |t	        j
                  |            S z1Create a canonical internet name resource record.)r   r<   r
   rZ   r   rW   )r\   alias	canonicalr2   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
   rZ   r   rW   )r\   inaddrptrr2   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.rE   )r   r?   r
   rZ   rH   )r\   r   r@   r2   s       r   r?   zResourceRecord.TXT   s(     4GJJT[[5IJJr   Nr#   )rI   r   r$   None)r$   r   )rP   r   r$   rf   )r$   r   )rP   r   r$   rf   )r   r   r$   rf   r%   )r   r   rP   r   r2   r   r$   r/   )r   r   rP   r   r2   r   r$   r/   )r`   r   ra   r   r2   r   r$   r/   )rc   r   rd   r   r2   r   r$   r/   )r   r   r@   r   r2   r   r$   r/   )r'   r(   r)   r1   r,   r*   r+   r   r   propertyr@   setterr8   r:   r>   r"   classmethodr7   r9   r<   r=   r?   r-   r   r   r/   r/   .   s   !#K#&3fmmG&<F#<
I
IK	H
K& ) ) 
[[* * & &   & &   . . , ,
 9D > > 7BAA'A14A	A A 7BVV$'V14V	V V 6A O O 5@ K Kr   r/   c                  f   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ed<   	 d"dZed#d       Z	ed$d       Z
d%dZd&dZed'd       Zed(d       Zed#d       Zd)dZd*d Zy!)+Messagez!HHHHHHr   r   float	timestampr   idboolqueryop_codeauthoritative_answer
truncationrecursion_desiredrecursion_availablereservedresponse_codezlist[Question]	questionslist[ResourceRecord]answersauthoritiesadditionalsc                    dj                  t        t        t        j                  | j
                  | j                  | j                  | j                                    S )Nz
)	joinmapr   	itertoolschainrx   rz   r{   r|   r   s    r   r   zMessage.__str__   sG    {{NNDLL$2B2BDDTDT
 	
r   c                4    t        |       j                         S )z@Returns the user-friendly content of all parts as encoded bytes.)r   rH   r   s    r   contentzMessage.content   s     4y!!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   )lenr4   ).0xs     r   	<genexpr>zMessage.size.<locals>.<genexpr>   s       
 K
s   !)sumr   r   from_iterablerz   r{   r|   r   s    r   sizezMessage.size   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   rm   rn   rp   rq   rr   rs   rt   ru   rv   rw   rx   rz   r{   r|   )	r   NOERROR
ValueErrorrk   timern   rq   rt   rx   )r   rw   s     r   failzMessage.fail   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   )rk   r   rn   rq   rt   r   r   rx   )r   rz   s     r   succeedzMessage.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_fromr   r*   error)r\   bufferlengthmsgs       r   rU   zMessage.unpack   sB     oofa0S[ ,,!=fXVLMM
r   c                   t         j                  j                        \  }}}}}}t        t        j                         ||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t        |             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_namez/Message.unpack_from.<locals>.unpack_domain_name%  s/    'DDLD& fFKr   )r   r   r   z
question #: Nc                   t        d|      D ]  }	         }t        j                  j                        \  }}}}t        j                  j                  z  |z   }	t              |	k  rt        j                  d| d      |	 }
d|
v r5	 t        j                        \  }}||k(  rt        j                  |      }
| j                  t        |||||
             |z   y # t        j                  $ r Y ;w xY w# t        j                  $ r+}t        j                  | d| dt        |             d }~ww xY w)Nr   z!unpack requires a data buffer of r      z #r   )ranger/   r   r   r   r   r*   r   r   r   rW   appendr   )sectionsection_namecountir   r   r   r2   len_dataend_datar4   rr_namerr_name_lener   r   r   r   s                 r   
unpack_rrsz'Message.unpack_from.<locals>.unpack_rrs6  sh    1e_ II-/D2@2G2G2S2S3/D&#x n33888F%0H6{X-$ll?zP  "&2D!T)
! !- I I &! ' +  +h6'3'8'8'A NN>$fc4#PQh&F7I0  &|| ! ! || I ,,,r!Bs1vh'GHHIs<   A>D4C+#D+D>D DDE&D==Eanswer	authority
additionalr#   )r   ry   r   r   r   r   r$   rf   )rk   r   r   r   r   r   cacher   r   rx   r   r*   r   r   rz   r{   r|   )r\   r   r   rn   flagslen_questionslen_answerslen_authoritieslen_additionalsr   r   r   r   r   r   r   r   r   s    ``             @@r   r   zMessage.unpack_from  s    NN&&vv6	
iikG$*b[F*"'7"3!9(Q.$/A5!&&!1a 7qjE)&.
  	'..%%%#))+	 q-( 	?A?)+'::66Jf(//...$$X4d6%RS	?!	I)!	I9<!	IEH!	I!	I !	IF 	3;;+63??KA3??L/B}S << ?llZs"SVH#=>>?s   A.FG
!$GG
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 )rn   r   rp   rq   rr   rs   rt   ru   rv   rw   	bytearrayextendrk   r   rW   r   rx   rz   r{   r|   r   r   r   r   r   r/   r2   r4   r3   )r   r   r4   questionrrs        r   rN   zMessage.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  	###{NN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"                  | 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.
        )rn   rp   rq   rr   rs   rt   ru   rw   status_coderx   rz   r{   r|   r   rm   )rn   rp   r   r!   rq   rr   rs   rt   ru   r   rw   http_equiv_status_coderx   r"   rz   r{   r|   r   rm   )r   r   r   s      r   r"   zMessage.to_json  s     ''ZZt||4$($=$=//!%!7!7#'#;#;+2243E3EF)@@ASAST=A^^L(**,L/3||<

<373C3CDRBJJLD373C3CDRBJJLDII
 	
 M<DDs   +EE9E E!c                ~    | j                         }t        j                  dd      |d<   t        j	                  |      S )Nr   r   rn   )	get_staterandomrandintrk   
from_state)r   states     r   copyzMessage.copy  s3     nnQ.d!!%((r   Nr#   )r$   r3   )r$   r   )rw   r   r$   rk   )rz   ry   r$   rk   )r   r3   r$   rk   )r   zbytes | bytearrayr   r   r$   ztuple[int, Message]r%   )r$   rk   )r'   r(   r)   r*   r+   r   r,   r   rg   r   r   r   r   ri   rU   r   rN   r"   r   r-   r   r   rk   rk      s&   &3fmmI&>F#>=GQKAL  z  CMN1 "!(%%)%%(
 " " 
 

(
$   T Tl 1 1f
.)r   rk   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.rk   requestNzMessage | 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   )rk   r   popr   r   r   	set_state)r   r   rr   s      r   r   zDNSFlow.set_state  sS    ))%))I*>?7<yy7L2L!2L**1-SW% r   c                `    dt        | j                         dt        | j                         dS )Nz<DNSFlow
  request=z
  response=z
>)reprr   r   r   s    r   __repr__zDNSFlow.__repr__  s/    'T\\(:';?4PTP]P]K^J__deer   )r$   serializable.State)r   r   r$   rf   r#   )
r'   r(   r)   __doc__r,   r   r   r   r   __classcell__)r   s   @r   r   r     s,    T#Hn#
!
fr   r   )
__future__r   r   r   r*   r   dataclassesr   	ipaddressr   r   typingr   	mitmproxyr   mitmproxy.coretypesr	   mitmproxy.net.dnsr
   r   r   r   r   SerializableDataclassr   r/   rk   Flowr   r-   r   r   <module>r      s    "     ! ! !   , % * & , #
 
|11 
 
, `K\77 `K `KH Y)l00 Y) Y)xfdii fr   