
    8jK                       U d Z ddlmZ ddlZddlZddlmZ ddlmZm	Z	m
Z
mZmZmZmZmZ ddlmZ ddlmZmZ dd	lmZ dd
lmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$ dZ%dZ&dZ'dZ(e)ej*        ee+fZ,i Z-de.d<   e/Z0e1Z2 G d d          Z3dS )a  Multicast DNS Service Discovery for Python, v0.14-wmcbrine
Copyright 2003 Paul Scott-Murphy, 2014 William McBrine

This module provides a framework for the use of DNS Service Discovery
using IP multicast.

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
    )annotationsN)Any   )
DNSAddressDNSHinfoDNSNsec
DNSPointerDNSQuestion	DNSRecord
DNSServiceDNSText)IncomingDecodeError)
_mark_seenlog)current_time_millis)_FLAGS_QR_MASK_FLAGS_QR_QUERY_FLAGS_QR_RESPONSE	_FLAGS_TC_TYPE_A
_TYPE_AAAA_TYPE_CNAME_TYPE_HINFO
_TYPE_NSEC	_TYPE_PTR	_TYPE_SRV	_TYPE_TXT_TYPES         zdict[str, None]
_seen_logsc                  N   e Zd ZdZdZ	 	 	 d=d>dZd?dZd?dZd?dZe	d?d            Z
e	d@d            Ze	dAd            Ze	dAd            Ze	dAd            Ze	dAd            ZdBdZedCd            ZdDd Zd?d!ZdEd#ZdBd$ZdBd%ZdEd&ZdFd)ZdBd*ZdGd1ZdHd4ZdEd5ZdId<ZdS )JDNSIncomingz/Object representation of an incoming DNS packet)_answers	_data_len_did_read_others_has_qu_question_name_cache_num_additionals_num_answers_num_authorities_num_questions
_questionsdataflagsidnowoffsetscope_idsourcevalidviewNr/   bytesr5   tuple[str, int] | Noner4   
int | Noner2   float | NonereturnNonec                   d| _         d| _        || _        || _        t	          |          | _        i | _        g | _        g | _        d| _	        d| _
        d| _        d| _        d| _        d| _        d| _        |pt!                      | _        || _        || _        d| _        	 |                                  dS # t,          $ r+ |                     d| j        | j        | j                   Y dS w xY w)z/Constructor from string holding bytes of packetr   F?Received invalid packet from %s at offset %d while unpacking %rN)r0   r3   r/   r7   lenr&   r)   r.   r%   r1   r-   r+   r,   r*   r6   r'   r   r2   r5   r4   r(   _initial_parseDECODE_EXCEPTIONS_log_exception_debug)selfr/   r5   r4   r2   s        Q/home/user/adhan/venv/lib/python3.11/site-packages/zeroconf/_protocol/incoming.py__init__zDNSIncoming.__init__`   s    
		T13-/)+ ! !
 %/-//  %	!!!!!  	 	 	%%Q		     	s   "B8 81C-,C-boolc                2    | j         t          z  t          k    S )z Returns true if this is a query.)r0   r   r   rD   s    rE   is_queryzDNSIncoming.is_query   s    
^+??    c                2    | j         t          z  t          k    S )z#Returns true if this is a response.)r0   r   r   rI   s    rE   is_responsezDNSIncoming.is_response   s    
^+0BBBrK   c                    | j         S )z.Returns true if any question is a QU question.)r(   rI   s    rE   has_qu_questionzDNSIncoming.has_qu_question   s    $$rK   c                2    | j         t          z  t          k    S )z$Returns true if this is a truncated.)r0   r   rI   s    rE   	truncatedzDNSIncoming.truncated   s     
Y&944rK   list[DNSQuestion]c                    | j         S )zQuestions in the packet.)r.   rI   s    rE   	questionszDNSIncoming.questions   s     rK   intc                    | j         S )z"Number of questions in the packet.)r-   rI   s    rE   num_questionszDNSIncoming.num_questions   s     ""rK   c                    | j         S )z Number of answers in the packet.)r+   rI   s    rE   num_answerszDNSIncoming.num_answers   s       rK   c                    | j         S )z$Number of authorities in the packet.r,   rI   s    rE   num_authoritieszDNSIncoming.num_authorities        $$rK   c                    | j         S )z$Number of additionals in the packet.)r*   rI   s    rE   num_additionalszDNSIncoming.num_additionals   r]   rK   c                    |                                   |                                  | j        s|                                  d| _        dS )z6Parse the data needed to initialize the packet object.TN)_read_header_read_questionsr-   _read_othersr6   rI   s    rE   rA   zDNSIncoming._initial_parse   sN    " 	 


rK   logger_datar   c                    t          t          t          t          j                    d                             }t          j        |pdgd|i d S )Nr   zException occurredexc_info)r   r"   strsysrf   r   debug)clsrd   log_exc_infos      rE   rC   z DNSIncoming._log_exception_debug   sH    !*c#,..2C.D.DEE	K9$8#9R\RRRRRrK   list[DNSRecord]c                    | j         sM	 |                                  n7# t          $ r* |                     d| j        | j        | j                   Y nw xY w| j        S )zAnswers in the packet.r?   )r'   rc   rB   rC   r5   r3   r/   r%   rI   s    rE   answerszDNSIncoming.answers   s    $ 		!!####$   ))UKKI	     }s    1AAc                    | j         dk    S )z Returns true if this is a probe.r   r[   rI   s    rE   is_probezDNSIncoming.is_probe   s    $q((rK   rg   c                   d                     d                    d| j         d| j         d| j         d| j         d| j         d| j         d	| j         d
| j	         d| 
                                 g	                    S )Nz<DNSIncoming:{}>z, zid=zflags=z
truncated=zn_q=zn_ans=zn_auth=zn_add=z
questions=zanswers=)formatjoinr1   r0   rQ   r-   r+   r,   r*   r.   rn   rI   s    rE   __repr__zDNSIncoming.__repr__   s    !((II#$'OO)TZ))11104.000T.005d3554T244222/t||~~//
 
 
 	
rK   c                   | j         }| j        }| xj        dz  c_        ||         dz  ||dz            z  | _        ||dz            dz  ||dz            z  | _        ||dz            dz  ||dz            z  | _        ||dz            dz  ||d	z            z  | _        ||dz            dz  ||d
z            z  | _        ||dz            dz  ||dz            z  | _        dS )zReads header portion of packet      r   r                  	   
      N)r7   r3   r1   r0   r-   r+   r,   r*   )rD   r7   r3   s      rE   ra   zDNSIncoming._read_header   s    yrv,!#d6A:&66&1*%*T&1*-==
"6A:.!3d6A:6FF !,1D!4DD $VaZ 0A 5VaZ8H H $Vb[ 1Q 6frk9J JrK   c                   | j         }| j        }t          | j                  D ]}|                                 }| j        }| xj        dz  c_        ||         dz  ||dz            z  }||dz            dz  ||dz            z  }t          j        t                    }|                    |||           |j	        rd| _
        |                    |           dS )z!Reads questions section of packetry   rw   r   r   rx   TN)r7   r.   ranger-   
_read_namer3   r
   __new__
_fast_inituniquer(   append)	rD   r7   rT   _namer3   type_class_questions	            rE   rb   zDNSIncoming._read_questions   s    yO	t*++ 	' 	'A??$$D[FKK1KKLA%VaZ(88E&1*%*T&1*-==F"*;77HeV444 -(,%X&&&&	' 	'rK   c           
     D   | j         | j                 }| xj        dz  c_        | j        |z   | j        k    r*t          d| d| j         d| j         d| j                   | j        | j        | j        |z                                dd          }| xj        |z  c_        |S )z(Reads a character string from the packetr   zCharacter string length  at offset  overruns packet of  bytes from utf-8replace)r7   r3   r&   r   r5   r/   decoderD   lengthinfos      rE   _read_character_stringz"DNSIncoming._read_character_string   s    4;'q ;$.00%G6 G Gdk G G!^G G9=G G   yt{V';;<CCGYWWvrK   r   _intc           
         | j         |z   | j        k    r*t          d| d| j          d| j         d| j                   | j        | j         | j         |z            }| xj         |z  c_         |S )z0Reads a string of a given length from the packetzString length r   r   r   )r3   r&   r   r5   r/   r   s      rE   _read_stringzDNSIncoming._read_string  s    ;$.00%G G GDK G G!^G G9=G G   yt{V';;<vrK   c           
     v   d| _         | j        }| j        | j        z   | j        z   }t          |          D ]}|                                 }| j        }| xj        dz  c_        ||         dz  ||dz            z  }||dz            dz  ||dz            z  }||dz            dz  ||d	z            d
z  z  ||dz            dz  z  ||dz            z  }||dz            dz  ||dz            z  }	| j        |	z   }
d}	 |                     |||||	          }nN# t          $ rA |
| _        t          j        d|t          j        ||          | j        | j        d           Y nw xY w|>| j        |
k    r3t          j        d|t          j        ||          |	           |
| _        d}|| j                            |           dS )zLReads the answers, authorities and additionals section of the
        packetTr~   rw   r   r   rx   ry      rz      r{   r|   r}   NzTUnable to parse; skipping record for %s with type %s at offset %d while unpacking %r)rf   zHRecord for %s with type %s did not consume exactly rdlength=%d; dropping)r'   r7   r+   r,   r*   r   r   r3   _read_recordrB   r   ri   r   getr/   r%   r   )rD   r7   nr   domainr3   r   r   ttlr   endrecs               rE   rc   zDNSIncoming._read_others  s%    !%y 558MMq )	* )	*A__&&F[FKK2KK LA%VaZ(88E&1*%*T&1*-==Fvz"b(4
+;r+AADRSDTXYDYY\`agjkak\llC&1*%*T&1*-==F+&CC''vsFKK$    "	jJue,,KI!      4;##5#5
 	^Jue,,	   "$$S)))S)	* )	*s   3DAEEr   _strr   r   r   DNSRecord | Nonec                @   |t           k    rNt          j        t                    }|                    |||||                     d          d| j                   |S |t          t          fv rLt          j        t                    }|                    ||||| 	                                | j                   |S |t          k    rMt          j        t                    }|                    |||||                     |          | j                   |S |t          k    r| j        }	| j        }
| xj        dz  c_        |	|
         dz  |	|
dz            z  }|	|
dz            dz  |	|
dz            z  }|	|
dz            dz  |	|
dz            z  }t          j        t                    }|                    |||||||| 	                                | j        	  	         |S |t           k    r_t#          j        t"                    }|                    |||||                                 |                                 | j                   |S |t&          k    rSt          j        t                    }|                    |||||                     d	          | j        | j                   |S |t*          k    rj| j        }t-          j        t,                    }|                    ||||| 	                                |                     ||z             | j                   |S | xj        |z  c_        dS )
z/Read known records types and skip unknown ones.ry   Nr{   rw   r   r   rx   rz   r   )r   r   r   r   r   r2   r   r   r	   r   r   r   r   r7   r3   r   r   r   r   r   r4   r   r   _read_bitmap)rD   r   r   r   r   r   address_recpointer_rectext_recr7   r3   priorityweightportsrv_rec	hinfo_rec
name_startnsec_recs                     rE   r   zDNSIncoming._read_recordK  s.    G$,Z88K""65&#t?P?PQR?S?SUY[_[cddd[),,,$,Z88K""65&#t?P?PRVRZ[[[Iw//HvsD<M<Mf<U<UW[W_```OI9D[FKK1KKF|q(4
+;;H&1*%*T&1*-==F
#q(4
+;;D (44G!!
 
 
 NK (22I  ++--++--   J$,Z88K""!!"%%   JJw//H!!!!*v"566   O 	vtrK   r   	list[int]c                   g }| j         }| j        |k     r| j        }|dz   }|dz   }||k    rt          d| d| j                   ||         }||         }||z   }	|dk    s|dk    s|	|k    rt          d| d| d| j                   t	          | j        ||	                   D ]@\  }
}t          d	          D ]+}|d
|z	  z  r!|                    ||dz  z   |
d	z  z              ,A| xj        d|z   z  c_        | j        |k     |S )z%Reads an NSEC bitmap from the packet.r   r   z.NSEC bitmap window header truncated at offset  from r       zNSEC bitmap length z* invalid or overruns record end at offset rw   r       )r7   r3   r   r5   	enumerater/   r   r   )rD   r   rdtypesr7   r3   offset_plus_oneoffset_plus_twowindowbitmap_length
bitmap_endibytebits                rE   r   zDNSIncoming._read_bitmap  s   ykC[F$qjO$qjO $$)`V``SWS^``   &\F 1M(=8J!!]R%7%7:;K;K)=- = =!'= =/3{= =   %TYz/I%JKK C C4 88 C CCts{+ CsVc\'9AE'ABBBC KK1},,KK3 kC4 rK   c                &   g }t                      }| j        }|                     |||d          | _        || j        |<   d                    |          dz   }t          |          t          k    r"t          d| dt           d| j                   |S )z$Reads a domain name from the packet.r   .z	DNS name z exceeds maximum length of r   )	setr3   _decode_labels_at_offsetr)   rs   r@   MAX_NAME_LENGTHr   r5   )rD   labelsseen_pointersoriginal_offsetr   s        rE   r   zDNSIncoming._read_name  s    "%%%+33OV]\]^^,2)xx#%t99&&%aDaa_aaTXT_aa   rK   offr   	list[str]r   set[int]depthc                "   |t           k    r"t          dt            d| d| j                   | j        }|| j        k     r||         }|dk    r
|t
          z   S |dk     rQ|t
          z   }|                    | j        |||z                                dd                     |t
          |z   z  }{|dk     rt          d	| d
| d| j                   ||dz            }|dz  dz  |z   }	|	}
|	| j        k    rt          d| d|	 d| j                   |	|k    rt          d| d| j                   |
|v rt          d| d| j                   | j	        
                    |
          }|s<g }|                    |
           |                     |	|||dz              || j	        |
<   |                    |           t          |          t           k    rt          d| d| j                   |t          z   S t          d| j                   )Nz&DNS compression pointer chain exceeds z at r   r   @   r   r      zDNS compression type z is unknown at r   ?   r   zDNS compression pointer at z points to z beyond packet from z points to itself from z was seen again from z7Maximum dns labels reached while processing pointer at z1Corrupt packet received while decoding name from )MAX_DNS_LABELSr   r5   r7   r&   DNS_COMPRESSION_HEADER_LENr   r/   r   r)   r   addr   extendr@   DNS_COMPRESSION_POINTER_LEN)rD   r   r   r   r   r7   r   	label_idx	link_datalinklink_py_intlinked_labelss               rE   r   z$DNSIncoming._decode_labels_at_offset  s    >!!%eeeSeeX\Xcee   yDN""#YF{{777}}"<<	di	I4F(FGNNwXabbccc1F::}})[F[[3[[dk[[  
 S1WITMS(94DKdn$$)i#ii$ii\`\gii   s{{)[#[[dk[[   m++)Y#YYDKYY   !,00==M  > "!!+...--dM=RWZ[R[\\\0= -MM-(((6{{^++)fcffY]Ydff   444!"cVZVa"c"cdddrK   )NNN)
r/   r8   r5   r9   r4   r:   r2   r;   r<   r=   )r<   rG   )r<   rR   )r<   rU   )r<   r=   )rd   r   r<   r=   )r<   rl   )r<   rg   )r   r   r<   r8   )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<   rU   )__name__
__module____qualname____doc__	__slots__rF   rJ   rM   rO   propertyrQ   rT   rW   rY   r\   r_   rA   classmethodrC   rn   rp   rt   ra   rb   r   r   rc   r   r   r   r    rK   rE   r$   r$   G   s       99I2 *.# # # # # #J@ @ @ @C C C C% % % % 5 5 5 X5    X # # # X# ! ! ! X! % % % X% % % % X%    S S S [S   ) ) ) )
 
 
 
"K K K K' ' ' '"   $	 	 	 	/* /* /* /*bN N N N`   @   6e 6e 6e 6e 6e 6erK   r$   )4r   
__future__r   structrh   typingr   _dnsr   r   r   r	   r
   r   r   r   _exceptionsr   _loggerr   r   _utils.timer   constr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   
IndexErrorerrorRecursionErrorrB   r"   __annotations__rg   r   rU   r   r$   r   rK   rE   <module>r      s    , # " " " " "  



      	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 . - - - - - % % % % % % % % - - - - - -                                 /BNS  !
        

xe xe xe xe xe xe xe xe xe xerK   