a
    “I_†  ã                   @   s¬   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d„ Z
ejd Zejd › d	ejd
 › ZdZdd„ ZG dd„ de	ƒZG dd„ deƒZG d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                  c   s   t ddƒD ]
} | V  q
q d S )Né   iÿÿ  )Úrange)Úi© r   ú8/usr/lib/python3/dist-packages/samba/tests/dns_packet.pyÚ_msg_id!   s    r
   Z	SERVER_IPÚSERVERÚ.ZREALMg      à?c                 C   sJ   g }| d dd… } | D ](}|  |d? d ¡ |  |d@ d ¡ qt|ƒS )zEEven RFC 1002 uses distancing quotes when calling this "compression".s                      Né   é   éA   é   )ÚappendÚbytes)ÚcharsÚoutÚcr   r   r	   Úencode_netbios_bytes,   s    r   c                   @   sD   e Zd Zeƒ Zdd„ Zdd„ Zdd„ Zdd	d
„Zdd„ Z	dd„ Z
dS )ÚTestDnsPacketBasec                 C   s8   t dƒD ]}|  ¡ }|r d S qtddt › dƒ d S )Né(   z'the server is STILL unresponsive after z seconds)r   Ú_known_good_queryÚprintÚTIMEOUT)Úselfr   Úokr   r   r	   ÚtearDown9   s
    zTestDnsPacketBase.tearDownc           	      C   s0   |d d… }t  d|¡\}}}}}}d|d@ iS )Né   ú!6HÚrcoder   )ÚstructZunpack)	r   ÚdataÚheaderÚidÚflagsZn_qZn_aZn_recZn_extar   r   r	   Údecode_replyB   s    ÿÿzTestDnsPacketBase.decode_replyc              	   C   s˜   t  dt| jƒdt|ƒddd¡}t  dd| jd¡}g }|D ]N}t|tƒrZ| d¡ 	d¡}n|}|D ]}| 
dt|ƒ|f ¡ qb| 
|¡ q:|d	 |¡ 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%só    )r"   ZpackÚnextÚmsg_idÚlenÚqtypeÚ
isinstanceÚstrÚencodeÚsplitr   Újoin)r   Únamesr$   ÚtailZencoded_bitsÚnameÚbitsÚbr   r   r	   Úconstruct_queryJ   s,    úý
z!TestDnsPacketBase.construct_queryr   Nc                 C   sz   t |tƒr|g}|  |¡}t tjtj¡}| || j¡ t |gg g t	¡\}}}| 
¡  ||gkrv|  ¡ }|  |d¡ d S )Núthe server is unresponsive)r0   r1   r:   ÚsocketÚAF_INETÚ
SOCK_DGRAMÚsendtoÚserverÚselectr   Úcloser   Ú
assertTrue)r   r5   Úexpected_rcodeÚpacketÚsÚrÚ_r   r   r   r	   Ú_test_queryy   s    


zTestDnsPacketBase._test_queryc           
      C   s°   | j d dkrt}tj}ntdƒdg}tj}|  |g¡}t tj	tj
¡}| || j ¡ t |gg g t¡\}}}||gkr„| ¡  dS | d¡\}}| ¡  |  |¡d }	||	kS )Nr   é5   s   nxdomainFi   r!   )r@   ÚSERVER_NAMEr   ZDNS_RCODE_OKr   r   ZNBT_RCODE_NAMr:   r<   r=   r>   r?   rA   r   rB   Zrecvfromr'   )
r   r7   rD   rE   rF   rG   rH   r#   Zaddrr!   r   r   r	   r   Š   s     
z#TestDnsPacketBase._known_good_queryc                 C   sB   d}t   t jt j¡}| || j¡ | ¡  |  ¡ }|  |d¡ d S )Nr+   r;   )r<   r=   r>   r?   r@   rB   r   rC   )r   rE   rF   r   r   r   r	   Ú_test_empty_packetŸ   s    z$TestDnsPacketBase._test_empty_packet)r   N)Ú__name__Ú
__module__Ú__qualname__r
   r-   r   r'   r:   rI   r   rL   r   r   r   r	   r   6   s   	/
r   c                   @   s:   e Zd ZedfZdZddd„Zdd„ Zdd	„ Zd
d„ Z	dS )ÚTestDnsPacketsrJ   r   Nc                 C   s   |g| }| j |g|d d S )N©rD   )rI   ©r   ÚlabelÚnrD   r7   r   r   r	   Ú_test_many_repeated_components±   s    
ÿz-TestDnsPackets._test_many_repeated_componentsc                 C   s   d}|   |d¡ d S ©Ns?   ...............................................................é   ©rU   ©r   rS   r   r   r	   Útest_127_very_dotty_components¶   s    z-TestDnsPackets.test_127_very_dotty_componentsc                 C   s   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.xrW   rX   rY   r   r   r	   Útest_127_half_dotty_componentsº   s    z-TestDnsPackets.test_127_half_dotty_componentsc                 C   s   |   ¡  d S ©N©rL   ©r   r   r   r	   Útest_empty_packet¾   s    z TestDnsPackets.test_empty_packet)N)
rM   rN   rO   r   r@   r/   rU   rZ   r\   r`   r   r   r   r	   rP   ­   s   
rP   c                   @   sB   e Zd ZedfZdZdd„ Zddd„Zdd	„ Zd
d„ Z	dd„ Z
dS )ÚTestNbtPacketsé‰   é    c                 O   s„   t |tƒr|g}g }|D ]N}t |tƒr8| d¡ d¡}n|}t|d ƒg}| |dd … ¡ | |¡ q| j|g|¢R i |¤Ž d S )Nr)   r*   r   r   )r0   r1   r2   r3   r   Úextendr   rI   )r   r5   ÚargsÚkwargsZ	nbt_namesr7   r8   Zencodedr   r   r	   Ú_test_nbt_encode_queryÆ   s    

z%TestNbtPackets._test_nbt_encode_queryNc                 C   s*   |g| }t |ƒ|d< | j|g|d d S )Nr   rQ   )r   rI   rR   r   r   r	   rU   ×   s
    
ÿz-TestNbtPackets._test_many_repeated_componentsc                 C   s   d}|   |d¡ d S rV   rX   rY   r   r   r	   rZ   Ý   s    z-TestNbtPackets.test_127_very_dotty_componentsc                 C   s   d}|   |d¡ d S r[   rX   rY   r   r   r	   r\   á   s    z-TestNbtPackets.test_127_half_dotty_componentsc                 C   s   |   ¡  d S r]   r^   r_   r   r   r	   r`   å   s    z TestNbtPackets.test_empty_packet)N)rM   rN   rO   r   r@   r/   rg   rU   rZ   r\   r`   r   r   r   r	   ra   Â   s   
ra   )Ú__doc__Úosr"   r<   rA   Zsamba.dcerpcr   r   Zsamba.testsr   r
   Úenvironr   rK   r   r   r   rP   ra   r   r   r   r	   Ú<module>   s   

w