
    b                         d Z ddlZddlZddlZddlZddlmZmZ ddlm	Z	 d Z
ej        d         Zej        d          dej        d	          Zd
Zd Z G d de	          Z G d de          Z G d de          ZdS )ztSanity tests for DNS and NBT server parsing.

We don't use a proper client library so we can make improper packets.
    N)dnsnbt)TestCasec               #   8   K   	 t          dd          D ]} | V  )NT   i  )range)is    8/usr/lib/python3/dist-packages/samba/tests/dns_packet.py_msg_idr   !   s4      q&!! 	 	AGGGG    	SERVER_IPSERVER.REALMg      ?c                     g }| dz   dd         } | D ]8}|                     |dz	  dz              |                     |dz  dz              9t          |          S )zEEven RFC 1002 uses distancing quotes when calling this "compression".s                      N      A      )appendbytes)charsoutcs      r
   encode_netbios_bytesr   ,   sm    
C++SbS1E " "

AFb=!!!

AFb=!!!!::r   c                   H    e Zd Z e            Zd Zd Zd Zd	dZd Z	d Z
dS )
TestDnsPacketBasec                     t          d          D ]}|                                 }|r d S t          ddt          z   d           d S )N(   z'the server is STILL unresponsive after z seconds)r   _known_good_queryprintTIMEOUT)selfr	   oks      r
   tearDownzTestDnsPacketBase.tearDown9   sb     r 	 	A''))B NWNNNOOOOOr   c                 \    |d d         }t          j        d|          \  }}}}}}d|dz  iS )N   !6Hrcoder   )structunpack)	r#   dataheaderidflagsn_qn_an_recn_extas	            r
   decode_replyzTestDnsPacketBase.decode_replyB   sI    crc-3]5;A.C .C*E3UF US[
 	
r   c           	         t          j        dt          | j                  dt	          |          ddd          }t          j        dd| j        d          }g }|D ]}t          |t                    r)|                    d          	                    d          }n|}|D ])}|
                    dt	          |          |fz             *|
                    |           |d	                    |          z   S )
a  Create a query packet containing one query record.

        *names* is either a single string name in the usual dotted
        form, or a list of names. In the latter case, each name can
        be a dotted string or a list of byte components, which allows
        dots in components. Where I say list, I mean non-string
        iterable.

        Examples:

        # these 3 are all the same
        "example.com"
        ["example.com"]
        [[b"example", b"com"]]

        # this is three names in the same request
        ["example.com",
         [b"example", b"com", b"..!"],
         (b"first component", b" 2nd component")]
        r(      r   z!BHHr   utf8   .s   %c%sr   )r*   packnextmsg_idlenqtype
isinstancestrencodesplitr   join)r#   namesr-   tailencoded_bitsnamebitsbs           r
   construct_queryz!TestDnsPacketBase.construct_queryJ   s
   * U!$+..# ZZ###
 
 {6:!
 

  	& 	&D$$$ {{6**0066 ; ;##Gs1vvqk$9::::%%%%....r    Nc                    t          |t                    r|g}|                     |          }t          j        t          j        t          j                  }|                    || j                   t          j        |gg g t                    \  }}}|
                                 ||gk    r,|                                 }|                     |d           d S d S )Nthe server is unresponsive)r>   r?   rI   socketAF_INET
SOCK_DGRAMsendtoserverselectr"   closer    
assertTrue)r#   rC   expected_rcodepacketsr_r$   s           r
   _test_queryzTestDnsPacketBase._test_queryy   s    eS!! 	GE%%e,,M&.&*;<<	%%%-RW551a				 88''))BOOB =>>>>> 8r   c                 P   | j         d         dk    rt          }t          j        }nt	          d          dg}t
          j        }|                     |g          }t          j        t          j	        t          j
                  }|                    || j                    t          j        |gg g t                    \  }}}||gk    r|                                 dS |                    d          \  }}|                                 |                     |          d         }	||	k    S )Nr   5   s   nxdomainFi   r)   )rQ   SERVER_NAMEr   DNS_RCODE_OKr   r   NBT_RCODE_NAMrI   rM   rN   rO   rP   rR   r"   rS   recvfromr4   )
r#   rF   rU   rV   rW   rX   rY   r,   addrr)   s
             r
   r    z#TestDnsPacketBase._known_good_query   s    ;q>RD -NN(55{CD .N%%tf--M&.&*;<<	%%%-RW551a88GGIII5ZZ%%
d				!!$''0&&r   c                    d}t          j         t           j        t           j                  }|                    || j                   |                                 |                                 }|                     |d           d S )Nr   rL   )rM   rN   rO   rP   rQ   rS   r    rT   )r#   rV   rW   r$   s       r
   _test_empty_packetz$TestDnsPacketBase._test_empty_packet   sn    M&.&*;<<	%%%				
 ##%%9:::::r   )rJ   N)__name__
__module____qualname__r   r;   r%   r4   rI   rZ   r    rc   rJ   r   r
   r   r   6   s        WYYFP P P
 
 
-/ -/ -/^? ? ? ?"' ' '*; ; ; ; ;r   r   c                   4    e Zd ZedfZdZddZd Zd Zd Z	dS )	TestDnsPacketsr\   r   Nc                 B    |g|z  }|                      |g|           d S )NrU   )rZ   r#   labelnrU   rF   s        r
   _test_many_repeated_componentsz-TestDnsPackets._test_many_repeated_components   s;    w{$(6 	 	8 	8 	8 	8 	8r   c                 6    d}|                      |d           d S Ns?   ...............................................................   rn   r#   rl   s     r
   test_127_very_dotty_componentsz-TestDnsPackets.test_127_very_dotty_components   #    ++E377777r   c                 6    d}|                      |d           d S Ns?   x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.xrq   rr   rs   s     r
   test_127_half_dotty_componentsz-TestDnsPackets.test_127_half_dotty_components   #    !++E377777r   c                 .    |                                   d S Nrc   r#   s    r
   test_empty_packetz TestDnsPackets.test_empty_packet       !!!!!r   r{   )
rd   re   rf   r   rQ   r=   rn   rt   rx   r~   rJ   r   r
   rh   rh      sc        b\FE8 8 8 8
8 8 88 8 8" " " " "r   rh   c                   :    e Zd ZedfZdZd Zd	dZd Zd Z	d Z
dS )
TestNbtPackets       c                 v   t          |t                    r|g}g }|D ]}t          |t                    r)|                    d                              d          }n|}t	          |d                   g}|                    |dd                     |                    |            | j        |g|R i | d S )Nr7   r8   r   r   )r>   r?   r@   rA   r   extendr   rZ   )r#   rC   argskwargs	nbt_namesrF   rG   encodeds           r
   _test_nbt_encode_queryz%TestNbtPackets._test_nbt_encode_query   s    eS!! 	GE	 	& 	&D$$$ {{6**0066+DG445GNN48$$$W%%%%4T444V44444r   Nc                 f    |g|z  }t          |          |d<   |                     |g|           d S )Nr   rj   )r   rZ   rk   s        r
   rn   z-TestNbtPackets._test_many_repeated_components   sL    w{&u--Q$(6 	 	8 	8 	8 	8 	8r   c                 6    d}|                      |d           d S rp   rr   rs   s     r
   rt   z-TestNbtPackets.test_127_very_dotty_components   ru   r   c                 6    d}|                      |d           d S rw   rr   rs   s     r
   rx   z-TestNbtPackets.test_127_half_dotty_components   ry   r   c                 .    |                                   d S r{   r|   r}   s    r
   r~   z TestNbtPackets.test_empty_packet   r   r   r{   )rd   re   rf   r   rQ   r=   r   rn   rt   rx   r~   rJ   r   r
   r   r      sr        c]FE5 5 5"8 8 8 88 8 88 8 8" " " " "r   r   )__doc__osr*   rM   rR   samba.dcerpcr   r   samba.testsr   r   environr   r]   r"   r   r   rh   r   rJ   r   r
   <module>r      sD  & 
 
			    ! ! ! ! ! ! ! !               
K	 H%==
7(;==
  t; t; t; t; t; t; t; t;n" " " " "& " " "*$" $" $" $" $"& $" $" $" $" $"r   