a
    “I_J  ã                   @   sl   d Z ddlmZ ddlmZmZ ddlZddlZddlmZ ddl	m
Z
 ddlmZ G dd	„ d	ejjƒZdS )
z)
    Tests GetDCNameEx calls in NETLOGON
é    )Úauth)ÚWERRORErrorÚwerrorN)ÚCredentials)Únetlogon)ÚGUIDc                   @   s®   e Zd Zdd„ Zd,dd„Zdd	„ Zd
d„ Zdd„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ ZdS )-ÚGetDCNameExc                 C   sd   t j ¡ | _tƒ | _d | _tj 	d¡| _
tj 	d¡| _tj 	d¡| _tj 	d¡| _tj 	d¡| _d S )NZSERVERZREALMZDOMAINZTRUST_REALMZTRUST_DOMAIN)ÚsambaÚtestsZenv_loadparmZlpr   ZcredsÚnetlogon_connÚosÚenvironÚgetÚserverÚrealmÚdomainÚtrust_realmÚtrust_domain)Úself© r   ú7/usr/lib/python3/dist-packages/samba/tests/getdcname.pyÚsetUp!   s    zGetDCNameEx.setUpNFr   c              	   C   sT   | j d u rt d|  ¡ ¡| _ |r:| j  | jd d||||¡S | j  | j||||¡S d S )Nzncalrpc:[schannel]r   )r   r   Zget_loadparmZnetr_DsRGetDCNameEx2r   Znetr_DsRGetDCNameEx)r   r   Údomain_guidÚ	site_nameÚex2Úflagsr   r   r   Ú_call_get_dc_name,   s$    
ÿ
û
üzGetDCNameEx._call_get_dc_namec                 C   sÒ   | j dd}|  |jdu¡ |  |j d¡¡ |  |jdu¡ |  |j d¡¡ |  |j ¡ | j ¡ kpz|j ¡ | j ¡ k¡ | j dt	j
d}|  |j ¡ | j ¡ ¡ | j dt	jd}|  |j ¡ | j ¡ ¡ dS )zìCheck the most trivial requirements of Ex2 (no domain or site)

        a) The paths are prefixed with two backslashes
        b) The returned domains conform to the format requested
        c) The domain matches our own domain
        T)r   Nú\\)r   r   )r   Ú
assertTrueÚdc_uncÚ
startswithÚ
dc_addressÚdomain_nameÚlowerr   r   r   ÚDS_RETURN_DNS_NAMEÚassertEqualÚDS_RETURN_FLAT_NAME©r   Úresponser   r   r   Útest_get_dc_ex2@   s0    ÿÿþÿÿÿÿzGetDCNameEx.test_get_dc_ex2c                 C   s  | j du rdS | j| j dd}| j| jdd}|  |jdu¡ |  |j d¡¡ |  |jdu¡ |  |j d¡¡ |  |j|j¡ |  |j|j¡ |  |j 	¡ | j  	¡ kp¼|j 	¡ | j
 	¡ k¡ | j| j tjdd}|  |j 	¡ | j  	¡ ¡ | j| j tjdd}|  |j 	¡ | j
 	¡ ¡ dS )zþCheck what happens to Ex2 requests after being forwarded to winbind

        a) The paths must still have the same backslash prefixes
        b) The returned domain does not match our own domain
        c) The domain matches the format requested
        NT)r   r   r   ©r   r   r   )r   r   r   r   r   r    r!   ÚassertNotEqualr"   r#   r   r   r$   r%   r&   )r   Úresponse_trustr(   r   r   r   Útest_get_dc_over_winbind_ex2]   sN    
ÿÿÿÿÿÿþþÿþÿz(GetDCNameEx.test_get_dc_over_winbind_ex2c                 C   s€   | j du rdS | j| j tjd}|  |jdu¡ |  |j d¡¡ |  |jdu¡ |  |j d¡¡ |  |j	 
¡ | j  
¡ ¡ dS )ziTest the standard Ex version (not Ex2)

        Ex calls Ex2 anyways, from now on, just test Ex.
        N©r   r   r   )r   r   r   r$   r   r   r    r!   r%   r"   r#   )r   r,   r   r   r   Útest_get_dc_over_winbind‡   s    
ÿÿz$GetDCNameEx.test_get_dc_over_winbindc                 C   sœ   | j du rdS d}| j| j |tjd}|  |jdu¡ |  |j d¡¡ |  |jdu¡ |  |j d¡¡ |  |j	 
¡ | j  
¡ ¡ |  | 
¡ |j 
¡ ¡ dS )úpTest the standard Ex version (not Ex2)

        We assume that there is a Default-First-Site-Name site.
        NúDefault-First-Site-Name©r   r   r   r   )r   r   r   r$   r   r   r    r!   r%   r"   r#   Údc_site_name)r   Úsiter,   r   r   r   Ú"test_get_dc_over_winbind_with_siteš   s    
þÿz.GetDCNameEx.test_get_dc_over_winbind_with_sitec              
   C   s~   | j du rdS d}z$| j| j |tjdd}|  d¡ W nB tyx } z*|j\}}|tjkrd|  d¡ W Y d}~n
d}~0 0 dS ©zqTest the standard Ex version (not Ex2)

        We assume that there is no Invalid-First-Site-Name site.
        NúInvalid-First-Site-NameF©r   r   r   r   ú3Failed to give the correct error for incorrect siteú%Failed to detect an invalid site name©	r   r   r   r$   Úfailr   Úargsr   ÚWERR_NO_SUCH_DOMAIN©r   r4   r,   ÚeÚenumÚestrr   r   r   Ú%test_get_dc_over_winbind_invalid_site±   s    
ý

z1GetDCNameEx.test_get_dc_over_winbind_invalid_sitec              
   C   s~   | j du rdS d}z$| j| j |tjdd}|  d¡ W nB tyx } z*|j\}}|tjkrd|  d¡ W Y d}~n
d}~0 0 dS )z`Test the Ex2 version.

        We assume that there is no Invalid-First-Site-Name site.
        Nr7   Tr8   r9   r:   r;   r?   r   r   r   Ú)test_get_dc_over_winbind_invalid_site_ex2Å   s    
ý

z5GetDCNameEx.test_get_dc_over_winbind_invalid_site_ex2c              
   C   sà   | j du rdS d}z| j| j |tjd}W n6 ty` } z|  dt|ƒ ¡ W Y d}~n
d}~0 0 |  |jdu¡ |  |j 	d¡¡ |  |j
du¡ |  |j
 	d¡¡ |  |j ¡ | j  ¡ ¡ |  |jdu¡ |  d|j¡ dS )r0   NÚ r2   ú(Unable to get empty string site result: r   )r   r   r   r$   r   r<   Ústrr   r   r    r!   r%   r"   r#   r3   r+   ©r   r4   r,   r@   r   r   r   Ú*test_get_dc_over_winbind_empty_string_siteÙ   s&    
þ
(ÿz6GetDCNameEx.test_get_dc_over_winbind_empty_string_sitec              
   C   sˆ   | j du rdS z| j| jtjdd}W n6 ty\ } z|  dt|ƒ ¡ W Y d}~n
d}~0 0 |  |du¡ |  	|j
 ¡ | j  ¡ ¡ dS )z#Supply a NETBIOS trust domain name.NFr*   ú Failed to succeed over winbind: )r   r   r   r   r$   r   r<   rG   r   r%   r"   r#   )r   r,   r@   r   r   r   Ú test_get_dc_over_winbind_netbiosô   s    
þ
(ÿz,GetDCNameEx.test_get_dc_over_winbind_netbiosc              
   C   s¨   | j du rdS d}z| j| j|tjdd}W n: tyf } z"|  d| j||f ¡ W Y d}~n
d}~0 0 |  |du¡ |  |j	 
¡ | j  
¡ ¡ |  | 
¡ |j 
¡ ¡ dS )zóSupply a NETBIOS trust domain name.

        Sporadically fails because NETBIOS queries do not return site name in
        winbind. The site check in NETLOGON will trigger and fail the request.

        Currently marked in flapping...
        Nr1   Fr8   z7get_dc_name (domain=%s,site=%s) over winbind failed: %s)r   r   r   r   r$   r   r<   r   r%   r"   r#   r3   rH   r   r   r   Ú*test_get_dc_over_winbind_with_site_netbios  s$    
ý

ÿÿz6GetDCNameEx.test_get_dc_over_winbind_with_site_netbiosc              
   C   sÄ   | j du rdS tƒ }z| j| j |tjd}W n6 tyb } z|  dt|ƒ ¡ W Y d}~n
d}~0 0 |  |j	du¡ |  |j	 
d¡¡ |  |jdu¡ |  |j 
d¡¡ |  |j ¡ | j  ¡ ¡ dS )ú?Ensure that we do not reject requests supplied with a NULL GUIDN©r   r   r   z'Unable to get NULL domain GUID result: r   )r   r   r   r   r$   r   r<   rG   r   r   r    r!   r%   r"   r#   )r   Ú	null_guidr,   r@   r   r   r   Ú$test_get_dc_over_winbind_domain_guid  s"    
þ
(ÿz0GetDCNameEx.test_get_dc_over_winbind_domain_guidc                 C   sŽ   d}| j | j|tjd}|  |jdu¡ |  |j d¡¡ |  |jdu¡ |  |j d¡¡ |  |j	 
¡ | j 
¡ ¡ |  | 
¡ |j 
¡ ¡ dS )r0   r1   r2   Nr   )r   r   r   r$   r   r   r    r!   r%   r"   r#   r3   )r   r4   r(   r   r   r   Útest_get_dc_with_site5  s    þÿz!GetDCNameEx.test_get_dc_with_sitec              
   C   s~   | j du rdS d}z$| j| j |tjdd}|  d¡ W nB tyx } z*|j\}}|tjkrd|  d¡ W Y d}~n
d}~0 0 dS r6   )	r   r   r   r$   r<   r   r=   r   r>   ©r   r4   r(   r@   rA   rB   r   r   r   Útest_get_dc_invalid_siteJ  s    
ý

z$GetDCNameEx.test_get_dc_invalid_sitec              
   C   sp   d}z$| j | j|tjdd}|  d¡ W nB tyj } z*|j\}}|tjkrV|  d¡ W Y d}~n
d}~0 0 dS )z_Test the Ex2 version

        We assume that there is no Invalid-First-Site-Name site.
        r7   Tr8   r9   r:   N)	r   r   r   r$   r<   r   r=   r   r>   rR   r   r   r   Útest_get_dc_invalid_site_ex2^  s    ý

z(GetDCNameEx.test_get_dc_invalid_site_ex2c              
   C   sÒ   d}z| j | j|tjd}W n6 tyR } z|  dt|ƒ ¡ W Y d}~n
d}~0 0 |  |jdu¡ |  |j 	d¡¡ |  |j
du¡ |  |j
 	d¡¡ |  |j ¡ | j ¡ ¡ |  |jdu¡ |  d|j¡ dS )r0   rE   r2   rF   Nr   )r   r   r   r$   r   r<   rG   r   r   r    r!   r%   r"   r#   r3   r+   ©r   r4   r(   r@   r   r   r   Útest_get_dc_empty_string_sitep  s"    þ
(ÿz)GetDCNameEx.test_get_dc_empty_string_sitec              
   C   sz   z| j | jtjdd}W n6 tyN } z|  dt|ƒ ¡ W Y d}~n
d}~0 0 |  |du¡ |  |j	 
¡ | j 
¡ ¡ dS )úSupply a NETBIOS domain name.Fr*   rJ   N)r   r   r   r$   r   r<   rG   r   r%   r"   r#   r   )r   r(   r@   r   r   r   Útest_get_dc_netbios‰  s    þ
(ÿzGetDCNameEx.test_get_dc_netbiosc              
   C   s–   d}z| j | j|tjdd}W n6 tyT } z|  dt|ƒ ¡ W Y d}~n
d}~0 0 |  |du¡ |  |j	 
¡ | j 
¡ ¡ |  | 
¡ |j 
¡ ¡ dS )rW   r1   Fr8   rJ   N)r   r   r   r$   r   r<   rG   r   r%   r"   r#   r   r3   rU   r   r   r   Útest_get_dc_with_site_netbios—  s    ý
(ÿz)GetDCNameEx.test_get_dc_with_site_netbiosc                 C   sz   t ƒ }| j| j|tjd}|  |jdu¡ |  |j d¡¡ |  |jdu¡ |  |j d¡¡ |  	|j
 ¡ | j ¡ ¡ dS )rM   rN   Nr   )r   r   r   r   r$   r   r   r    r!   r%   r"   r#   )r   rO   r(   r   r   r   Útest_get_dc_with_domain_guid©  s    þÿz(GetDCNameEx.test_get_dc_with_domain_guidc                 C   sp   | j dtjd}|  |jdu¡ |  |j d¡¡ |  |jdu¡ |  |j d¡¡ |  |j 	¡ | j
 	¡ ¡ dS )z1Ensure that empty domain resolve to the DC domainrE   r.   Nr   )r   r   r$   r   r   r    r!   r%   r"   r#   r   r'   r   r   r   Ú$test_get_dc_with_empty_string_domain¹  s    ÿÿz0GetDCNameEx.test_get_dc_with_empty_string_domain)NNNFr   )Ú__name__Ú
__module__Ú__qualname__r   r   r)   r-   r/   r5   rC   rD   rI   rK   rL   rP   rQ   rS   rT   rV   rX   rY   rZ   r[   r   r   r   r   r      s,     ÿ
*r   )Ú__doc__r	   r   r   r   Zsamba.testsr   Zsamba.credentialsr   Zsamba.dcerpcr   Zsamba.dcerpc.miscr   r
   ZTestCaser   r   r   r   r   Ú<module>   s   