a
    ¡ÖaU  ã                   @   sÂ  d dl mZ d dlZd dlZd dl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mZ d dlmZ d dlmZmZmZ d dlmZmZmZ d dlmZmZ d dlmZ d dlZd dlZe d¡Z e !e ¡Z"e  #e"¡ e j$d	d
ddd e %e ¡Z&e  #e&¡ ee ƒZ'e  #e'¡ e  (¡ \Z)Z*e" +¡ Z,e& -e,¡Z.e)j/Z/e0e*ƒdk rZe  1¡  e 2d¡ e*d  Z3e*d Z4e*dd… Z5e. 6ej7¡ dd„ Z8G dd„ deƒZ9dd„ Z:G dd„ de9ƒZ;ee<e'd dS )é    )Úprint_functionN)ÚcredentialsÚparam)ÚTestCase)ÚdnsÚdnspÚ	dnsserver)Ú	TXTRecordÚdns_record_matchÚdata_to_dns_record)ÚSubunitOptionsÚTestProgramzEdns_forwarder.py <server name> <server ip> (dns forwarder)+ [options]z	--timeoutÚintÚtimeoutz Specify timeout for DNS requests)ÚtypeÚdestÚhelpé   é   é   c                 C   s*   t  ¡ }t ¡ }t| ƒ|_| |_||_|S ©N)r   Z
txt_recordr   Zstring_listÚlenÚcountÚstrZtxt)ZrecordsZ	rdata_txtZs_list© r   ú;/usr/lib/python3/dist-packages/samba/tests/dns_forwarder.pyÚmake_txt_recordE   s    
r   c                   @   sp   e Zd Zedd„ eeƒ ¡ D ƒƒZdd„ Zdd„ Z	ddd	„Z
d
d„ Zdd„ Zdd„ Zedefdd„Zdd„ ZdS )ÚDNSTestc                 c   s$   | ]\}}|  d ¡r||fV  qdS )Z
DNS_RCODE_N)Ú
startswith)Ú.0ÚkÚvr   r   r   Ú	<genexpr>P   ó    zDNSTest.<genexpr>c                 C   s2   |j tj@ }|  ||d| j| | j| f ¡ dS )z$Helper function to check return codezExpected RCODE %s, got %sN)Ú	operationr   Z	DNS_RCODEÚassertEqualÚerrcodes)ÚselfÚpacketZrcodeZ	p_errcoder   r   r   Úassert_dns_rcode_equalsR   s    
ÿzDNSTest.assert_dns_rcode_equalsc                 C   s&   |j tj@ }|  ||d||f ¡ dS )zHelper function to check opcodezExpected OPCODE %s, got %sN)r$   r   Z
DNS_OPCODEr%   )r'   r(   ÚopcodeZp_opcoder   r   r   Úassert_dns_opcode_equalsX   s    
ÿz DNSTest.assert_dns_opcode_equalsNc                 C   s.   t  ¡ }|du rt dd¡|_||_g |_|S )z!Helper creating a dns.name_packetNr   éÿÿ  )r   Úname_packetÚrandomZrandintÚidr$   Ú	questions)r'   r*   ZqidÚpr   r   r   Úmake_name_packet^   s    zDNSTest.make_name_packetc                 C   s   t |ƒ|_||_dS )z$Helper to finalize a dns.name_packetN)r   Zqdcountr0   )r'   r(   r0   r   r   r   Úfinish_name_packetg   s    
zDNSTest.finish_name_packetc                 C   s   t  ¡ }||_||_||_|S )z#Helper creating a dns.name_question)r   Zname_questionÚnameZquestion_typeZquestion_class)r'   r4   ZqtypeZqclassÚqr   r   r   Úmake_name_questionl   s
    zDNSTest.make_name_questionc                 C   s   | j  ¡  ¡ S )zHelper to get dns domain)ÚcredsZ	get_realmÚlower©r'   r   r   r   Úget_dns_domaint   s    zDNSTest.get_dns_domainFc                 C   s®   d}z’t  |¡}|r"t|  |¡ƒ t tjtjd¡}| |¡ | |df¡ | 	|d¡ | 
dd¡}|rvt|  |¡ƒ t  tj|¡W |dur”| ¡  S n|dur¨| ¡  0 dS )z#send a DNS query and read the replyNr   é5   i   )ÚndrÚndr_packÚprintZhexdumpÚsocketÚAF_INETÚ
SOCK_DGRAMÚ
settimeoutÚconnectÚsendÚrecvÚ
ndr_unpackr   r-   Úclose)r'   r(   ÚhostÚdumpr   ÚsÚsend_packetZrecv_packetr   r   r   Údns_transaction_udpx   s(    

ý ÿzDNSTest.dns_transaction_udpc           	      C   s’   |   tj¡}|  ¡ }|  |tjtj¡}|  ||g¡ t ¡ }||_	tj
|_tj|_d|_d|_|}||_d|_|g|_|  |¡}|  |tj¡ d S )Ni„  r,   r   )r2   r   ZDNS_OPCODE_UPDATEr:   r6   ZDNS_QTYPE_SOAÚDNS_QCLASS_INr3   Zres_recr4   ÚDNS_QTYPE_CNAMEZrr_typeZrr_classZttlZlengthÚrdataZnscountZnsrecsrL   r)   ÚDNS_RCODE_OK)	r'   ÚkeyÚvaluer1   r4   ÚuÚrrO   Zresponser   r   r   Úmake_cname_updateŒ   s     
zDNSTest.make_cname_update)N)Ú__name__Ú
__module__Ú__qualname__ÚdictÚvarsr   Úitemsr&   r)   r+   r2   r3   r6   r:   Ú	server_ipr   rL   rU   r   r   r   r   r   N   s   
	ÿ
r   c                 C   s$   t   t jt jd¡}| | |f¡ |S )Nr   )r?   r@   rA   rC   )rH   ÚportrJ   r   r   r   Úcontact_real_server¡   s    r^   c                       s¬   e Zd Z‡ fdd„Z‡ fdd„Zdd„ Z‡ f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‡  ZS )%ÚTestDnsForwardingc                    s    t t| ƒj|i |¤Ž g | _d S r   )Úsuperr_   Ú__init__Úsubprocesses)r'   ÚargsÚkwargs©Ú	__class__r   r   ra   ¨   s    zTestDnsForwarding.__init__c                    s*   t t| ƒ ¡  t| _t| _t| _t| _d S r   )r`   r_   ÚsetUpÚserver_nameZserverr\   Úlpr7   r9   re   r   r   rg   ¬   s
    zTestDnsForwarding.setUpc           	      C   sä   t j}t |tj t ¡ d¡|t	|ƒ|g¡}| j
 |¡ t tjtjd¡}tdƒD ]Œ}t d¡ | ||f¡ z| dd¡ W nD tjyÂ } z*|jtjtjfv r®W Y d }~qRW Y d }~n
d }~0 0 |jd urØ|  d¡ |  S d S )Nz2python/samba/tests/dns_forwarder_helpers/server.pyr   i,  gš™™™™™©?s	   timeout 0z&Toy server has managed to die already!)ÚsysÚ
executableÚ
subprocessÚPopenÚosÚpathÚjoinÚsambaZsource_tree_topdirr   rb   Úappendr?   r@   rA   ÚrangeÚtimeÚsleeprC   rD   ÚerrorÚerrnoZECONNREFUSEDZEHOSTUNREACHÚ
returncodeÚfail)	r'   rH   r]   r/   Úpythonr1   rJ   ÚiÚer   r   r   Ústart_toy_server³   s(    ÿ
ü
"

z"TestDnsForwarding.start_toy_serverc                    s&   t t| ƒ ¡  | jD ]}| ¡  qd S r   )r`   r_   ÚtearDownrb   Úkill)r'   r1   re   r   r   r~   Ê   s    
zTestDnsForwarding.tearDownc                 C   s®   |   td dd¡}| dd¡ d}|  tj¡}g }|  |tjtj¡}| 	|¡ |  
||¡ t |¡}| |d¡ | d¡ z| dd¡ |  d¡ W n tjy¨   Y n0 d S )	Nr   r;   Ú
forwarder1s   timeout 1000000z an-address-that-will-not-resolver   é  z'DNS forwarder should have been inactive)r}   Údns_serversrD   r2   r   ÚDNS_OPCODE_QUERYr6   ÚDNS_QTYPE_TXTrM   rr   r3   r<   r=   rB   rE   ry   r?   r   )r'   rJ   r4   r1   r0   r5   rK   r   r   r   Útest_comatose_forwarderÏ   s     


z)TestDnsForwarding.test_comatose_forwarderc                 C   sî   t tdƒ}d}|  tj¡}g }|  |tjtj¡}| |¡ |  	||¡ t
 |¡}|  	||¡ | jtjO  _t
 |¡}| |d¡ | t¡ z:| dd¡}t
 tj|¡}|  |tj¡ |  |jd¡ W n" tjyè   |  dt ¡ Y n0 d S ©Nr;   údsfsfds.dsfsdfsr   r   ú#DNS server is too slow (timeout %s))r^   r\   r2   r   rƒ   r6   r„   rM   rr   r3   r<   r=   r$   ÚDNS_FLAG_RECURSION_DESIREDrD   rB   r   rE   rF   r-   r)   ÚDNS_RCODE_SERVFAILr%   Úancountr?   ry   ©r'   Úadr4   r1   r0   r5   rK   Údatar   r   r   Útest_no_active_forwarderç   s(    




z*TestDnsForwarding.test_no_active_forwarderc                 C   sÞ   t tdƒ}d}|  tj¡}g }|  |tjtj¡}| |¡ |  	||¡ t
 |¡}|  	||¡ t
 |¡}| |d¡ | t¡ z:| dd¡}t
 tj|¡}|  |tj¡ |  |jd¡ W n" tjyØ   |  dt ¡ Y n0 d S r†   )r^   r\   r2   r   rƒ   r6   r„   rM   rr   r3   r<   r=   rD   rB   r   rE   rF   r-   r)   ZDNS_RCODE_NXDOMAINr%   r‹   r?   ry   rŒ   r   r   r   Ú test_no_flag_recursive_forwarder  s&    




z2TestDnsForwarding.test_no_flag_recursive_forwarderc           	      C   sð   |   td dd¡}ttdƒ}d}|  tj¡}g }|  |tjtj	¡}| 
|¡ |  ||¡ | jtjO  _t |¡}| |d¡ | t¡ z@| dd¡}t tj|¡}|  |tj¡ |  d|jd j¡ W n" tjyê   |  dt ¡ Y n0 d S )Nr   r;   r€   r‡   r   rˆ   )r}   r‚   r^   r\   r2   r   rƒ   r6   rN   rM   rr   r3   r$   r‰   r<   r=   rD   rB   r   rE   rF   r-   r)   rP   r%   ÚanswersrO   r?   ry   ©	r'   rJ   r   r4   r1   r0   r5   rK   rŽ   r   r   r   Útest_single_forwarder  s*    

ÿ


z'TestDnsForwarding.test_single_forwarderc                 C   sÊ   t tdƒ}d}|  tj¡}g }|  |tjtj¡}| |¡ |  	||¡ | j
tjO  _
t |¡}| |d¡ | t¡ z,| dd¡}t tj|¡}|  |tj¡ W n" tjyÄ   |  dt ¡ Y n0 d S r†   )r^   r\   r2   r   rƒ   r6   rN   rM   rr   r3   r$   r‰   r<   r=   rD   rB   r   rE   rF   r-   r)   rŠ   r?   ry   rŒ   r   r   r   Ú(test_single_forwarder_not_actually_there6  s&    

ÿ


z:TestDnsForwarding.test_single_forwarder_not_actually_therec           	      C   sè   |   td dd¡}| dd¡ ttdƒ}d}|  tj¡}g }|  |tj	tj
¡}| |¡ |  ||¡ | jtjO  _t |¡}| |d¡ | t¡ z,| dd¡}t tj|¡}|  |tj¡ W n" tjyâ   |  dt ¡ Y n0 d S )Nr   r;   r€   ó   timeout 10000r‡   r   rˆ   )r}   r‚   rD   r^   r\   r2   r   rƒ   r6   rN   rM   rr   r3   r$   r‰   r<   r=   rB   r   rE   rF   r-   r)   rŠ   r?   ry   r’   r   r   r   Ú%test_single_forwarder_waiting_foreverM  s*    

ÿ


z7TestDnsForwarding.test_single_forwarder_waiting_foreverc           
      C   s(  t tƒdk rtdƒ d S |  td dd¡}|  td dd¡}| dd¡ ttdƒ}d	}|  tj	¡}g }|  
|tjtj¡}| |¡ |  ||¡ | jtjO  _t |¡}| |d¡ | t¡ z@| d
d¡}	t tj|	¡}	|  |	tj¡ |  d|	jd j¡ W n$ tjy"   |  dt ¡ Y n0 d S )Nr   z+Ignoring test_double_forwarder_first_frozenr   r;   r€   r   Ú
forwarder2s   timeout 1000r‡   r   rˆ   ©r   r‚   r>   r}   rD   r^   r\   r2   r   rƒ   r6   rN   rM   rr   r3   r$   r‰   r<   r=   rB   r   rE   rF   r-   r)   rP   r%   r‘   rO   r?   ry   ©
r'   Ús1Ús2r   r4   r1   r0   r5   rK   rŽ   r   r   r   Ú"test_double_forwarder_first_frozenf  s4    

ÿ


z4TestDnsForwarding.test_double_forwarder_first_frozenc           	      C   s
  t tƒdk rtdƒ d S |  td dd¡}ttdƒ}d}|  tj¡}g }|  	|tj
tj¡}| |¡ |  ||¡ | jtjO  _t |¡}| |d¡ | t¡ z@| dd¡}t tj|¡}|  |tj¡ |  d|jd j¡ W n$ tjy   |  d	t ¡ Y n0 d S )
Nr   z)Ignoring test_double_forwarder_first_downr   r;   r—   r‡   r   r   rˆ   )r   r‚   r>   r}   r^   r\   r2   r   rƒ   r6   rN   rM   rr   r3   r$   r‰   r<   r=   rD   rB   r   rE   rF   r-   r)   rP   r%   r‘   rO   r?   ry   )	r'   r›   r   r4   r1   r0   r5   rK   rŽ   r   r   r   Ú test_double_forwarder_first_down„  s0    

ÿ


z2TestDnsForwarding.test_double_forwarder_first_downc           
      C   s4  t tƒdk rtdƒ d S |  td dd¡}|  td dd¡}| dd¡ | dd¡ ttdƒ}d	}|  tj	¡}g }|  
|tjtj¡}| |¡ |  ||¡ | jtjO  _t |¡}| |d¡ | t¡ z@| d
d¡}	t tj|	¡}	|  |	tj¡ |  d|	jd j¡ W n$ tjy.   |  dt ¡ Y n0 d S )Nr   z(Ignoring test_double_forwarder_both_slowr   r;   r€   r   r—   s   timeout 1.5r‡   r   rˆ   r˜   r™   r   r   r   Útest_double_forwarder_both_slow   s6    

ÿ


z1TestDnsForwarding.test_double_forwarder_both_slowc           	      C   s  |   td dd¡}ttdƒ}d}|  tj¡}g }|  |tjtj	¡}| 
|¡ |  ||¡ | jtjO  _t |¡}| |d¡ | t¡ zR| dd¡}t tj|¡}|  |tj¡ |  t|jƒd¡ |  d|jd j¡ W n" tjyü   |  dt ¡ Y n0 d S )Nr   r;   r€   zresolve.cnamer   r   rˆ   )r}   r‚   r^   r\   r2   r   rƒ   r6   rN   rM   rr   r3   r$   r‰   r<   r=   rD   rB   r   rE   rF   r-   r)   rP   r%   r   r‘   rO   r?   ry   )	r'   rš   r   r4   r1   r0   r5   rK   rŽ   r   r   r   Ú
test_cname¿  s,    

ÿ


zTestDnsForwarding.test_cnamec           	      C   s  |   td dd¡}d|  ¡  }|  |d¡ ttdƒ}|  tj¡}g }|  	|tj
tj¡}| |¡ |  ||¡ | jtjO  _t |¡}| |d¡ | t¡ z@| dd¡}t tj|¡}|  |tj¡ |  d|jd j¡ W n" tjyþ   |  dt ¡ Y n0 d S )	Nr   r;   r€   úresolve.cname.%sr‡   r   r   rˆ   )r}   r‚   r:   rU   r^   r\   r2   r   rƒ   r6   ÚDNS_QTYPE_ArM   rr   r3   r$   r‰   r<   r=   rD   rB   r   rE   rF   r-   r)   rP   r%   r‘   rO   r?   ry   )	r'   rš   r4   r   r1   r0   r5   rK   rŽ   r   r   r   Útest_double_cnameÚ  s,    

ÿ


z#TestDnsForwarding.test_double_cnamec           
      C   s<  t tƒdk rtdƒ d S |  td dd¡}|  td dd¡}| dd¡ d	|  ¡  }|  |d
¡ ttdƒ}|  	t
j¡}g }|  |t
jt
j¡}| |¡ |  ||¡ | jt
jO  _t |¡}| |d¡ | t¡ z@| dd¡}	t t
j|	¡}	|  |	t
j¡ |  d|	jd j¡ W n$ tjy6   |   dt ¡ Y n0 d S )Nr   z/Ignoring test_cname_forwarding_with_slow_serverr   r;   r€   r   r—   r•   r    r‡   r   éÿÿÿÿrˆ   )!r   r‚   r>   r}   rD   r:   rU   r^   r\   r2   r   rƒ   r6   r¡   rM   rr   r3   r$   r‰   r<   r=   rB   r   rE   rF   r-   r)   rP   r%   r‘   rO   r?   ry   )
r'   rš   r›   r4   r   r1   r0   r5   rK   rŽ   r   r   r   Ú&test_cname_forwarding_with_slow_serverö  s6    

ÿ


z8TestDnsForwarding.test_cname_forwarding_with_slow_serverc           
      C   s6  t tƒdk rtdƒ d S |  td dd¡}d|  ¡  }d|  ¡  }|  ||¡ |  |d¡ ttdƒ}|  t	j
¡}g }|  |t	jt	j¡}| |¡ |  ||¡ | jt	jO  _t |¡}| |d	¡ | t¡ z@| d
d	¡}	t t	j|	¡}	|  |	t	j¡ |  d|	jd j¡ W n$ tjy0   |   dt ¡ Y n0 d S )Nr   z/Ignoring test_cname_forwarding_with_server_downr   r;   r—   úresolve1.cname.%súresolve2.cname.%sr‡   r   r   r£   rˆ   )!r   r‚   r>   r}   r:   rU   r^   r\   r2   r   rƒ   r6   r¡   rM   rr   r3   r$   r‰   r<   r=   rD   rB   r   rE   rF   r-   r)   rP   r%   r‘   rO   r?   ry   )
r'   r›   Úname1Úname2r   r1   r0   r5   rK   rŽ   r   r   r   Ú&test_cname_forwarding_with_server_down  s6    

ÿ


z8TestDnsForwarding.test_cname_forwarding_with_server_downc                 C   s6  d|   ¡  }|  td d|¡}d|   ¡  }d|   ¡  }|  ||¡ |  ||¡ |  |d¡ ttdƒ}|  tj¡}g }|  	|tj
tj¡}| |¡ |  ||¡ | jtjO  _t |¡}	| |	d¡ | t¡ z@| dd¡}
t tj|
¡}
|  |
tj¡ |  ||
jd j¡ W n$ tjy0   |  d	t ¡ Y n0 d S )
Nzresolve3.cname.%sr   r;   r¥   r¦   r‡   r   r£   rˆ   )r:   r}   r‚   rU   r^   r\   r2   r   rƒ   r6   r¡   rM   rr   r3   r$   r‰   r<   r=   rD   rB   r   rE   rF   r-   r)   rP   r%   r‘   rO   r?   ry   )r'   Zname3rš   r§   r¨   r   r1   r0   r5   rK   rŽ   r   r   r   Ú)test_cname_forwarding_with_lots_of_cnames8  s4    

ÿ


z;TestDnsForwarding.test_cname_forwarding_with_lots_of_cnames)rV   rW   rX   ra   rg   r}   r~   r…   r   r   r“   r”   r–   rœ   r   rž   rŸ   r¢   r¤   r©   rª   Ú__classcell__r   r   re   r   r_   §   s$   !!r_   )ÚmoduleÚopts)=Z
__future__r   rn   rj   r.   r?   rq   rt   rw   Z	samba.ndrr<   r   r   Zsamba.testsr   Zsamba.dcerpcr   r   r   Zsamba.netcmd.dnsr	   r
   r   Zsamba.tests.subunitrunr   r   Zsamba.getoptZgetoptZoptionsZoptparserl   ZOptionParserÚparserZSambaOptionsZ	sambaoptsZadd_option_groupZ
add_optionZCredentialsOptionsZcredoptsZsubunitoptsÚ
parse_argsr­   rc   Zget_loadparmri   Zget_credentialsr7   r   r   Zprint_usageÚexitrh   r\   r‚   Zset_krb_forwardableZNO_KRB_FORWARDABLEr   r   r^   r_   rV   r   r   r   r   Ú<module>   sZ   



ÿ




	S   :