a
    ¡Öa¬Q ã                   @   s  d dl mZ d dlmZ d dlmZmZ d dlmZ d dl	m
Z
 d dlZd dlm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 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mZ d dl m!Z! d dl"m#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' /¡ \Z0Z1e) 2¡ a3e- 4t3¡a5e0j6a6e7e1ƒdk rŽe' 8¡  e 9d¡ e1d  Z:e1d a;t5 <ej=¡ G dd„ de!ƒZ>G dd„ de!ƒZ?G dd„ de!ƒZ@G dd„ de!ƒZAG dd„ de!ƒZBG d d!„ d!e!ƒZCeeDe.d" dS )#é    )Úprint_function)Údsdb)Ú
ndr_unpackÚndr_pack)ÚSamDB)Úsystem_sessionN)ÚERR_OPERATIONS_ERROR)Úcredentials)ÚdnsÚdnspÚ	dnsserver)Ú	TXTRecordÚdns_record_matchÚdata_to_dns_record)ÚSubunitOptionsÚTestProgram)ÚwerrorÚWERRORError)ÚDNSTestz*dns.py <server name> <server ip> [options]z	--timeoutÚintÚtimeoutz Specify timeout for DNS requests)ÚtypeÚdestÚhelpé   é   c                       sl   e Z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‡  ZS )ÚTestSimpleQueriesc                    s0   t t| ƒ ¡  t| _t| _t| _t| _t| _d S ©N)	Úsuperr   ÚsetUpÚserver_nameÚserverÚ	server_ipÚlpÚcredsr   ©Úself©Ú	__class__© ú1/usr/lib/python3/dist-packages/samba/tests/dns.pyr   I   s    zTestSimpleQueries.setUpc                 C   s¬   |   tj¡}g }d| j|  ¡ f }|  |tjtj¡}td|j	ƒ | 
|¡ |  ||¡ | j|td\}}|  |tj¡ |  |tj¡ |  |jd¡ |  |jd j| j¡ dS )ú1create a query packet containing one query recordú%s.%súasking for ©Úhostr   r   N)Úmake_name_packetr
   ÚDNS_OPCODE_QUERYr!   Úget_dns_domainÚmake_name_questionÚDNS_QTYPE_AÚDNS_QCLASS_INÚprintÚnameÚappendÚfinish_name_packetÚdns_transaction_udpr"   Úassert_dns_rcode_equalsÚDNS_RCODE_OKÚassert_dns_opcode_equalsÚassertEqualÚancountÚanswersÚrdata©r&   ÚpÚ	questionsr7   ÚqÚresponseÚresponse_packetr)   r)   r*   Útest_one_a_queryR   s    
ÿÿz"TestSimpleQueries.test_one_a_queryc                 C   s¼   |   tj¡}g }d|  ¡  }|  |tjtj¡}td|jƒ | 	|¡ |  
||¡ | j|td\}}|  |tj¡ |  |tj¡ |  |jd¡ |  |jd jj ¡ d| j|  ¡ f  ¡ ¡ dS )z=create a query packet containing one query record for the SOAú%sr-   r.   r   r   r,   N)r0   r
   r1   r2   r3   ÚDNS_QTYPE_SOAr5   r6   r7   r8   r9   r:   r"   r;   r<   r=   r>   r?   r@   rA   ZmnameÚupperr!   rB   r)   r)   r*   Útest_one_SOA_querye   s     
ÿþz$TestSimpleQueries.test_one_SOA_queryc                 C   s¬   |   tj¡}g }d| j|  ¡ f }|  |tjtj¡}td|j	ƒ | 
|¡ |  ||¡ | j|td\}}|  |tj¡ |  |tj¡ |  |jd¡ |  |jd j| j¡ dS )z9create a query packet containing one query record via TCPr,   r-   r.   r   r   N)r0   r
   r1   r!   r2   r3   r4   r5   r6   r7   r8   r9   Zdns_transaction_tcpr"   r;   r<   r=   r>   r?   r@   rA   rB   r)   r)   r*   Útest_one_a_query_tcpy   s    
ÿÿz&TestSimpleQueries.test_one_a_query_tcpc                 C   s(  |   tj¡}g }d| j|  ¡ f }|  |tjtj¡}td|j	ƒ | 
|¡ |  ||¡ | j|td\}}|  |tj¡ |  |tj¡ |  |jd¡ |   tj¡}g }d| j|  ¡ f }|  |tjtj¡}td|j	ƒ | 
|¡ |  ||¡ | j|td\}}|  |tj¡ |  |tj¡ |  |jd¡ dS )z6create a query packet causing an empty RCODE_OK answerr,   r-   r.   r   zinvalid-%s.%sN)r0   r
   r1   r!   r2   r3   ÚDNS_QTYPE_MXr5   r6   r7   r8   r9   r:   r"   r;   r<   r=   r>   r?   ÚDNS_RCODE_NXDOMAINrB   r)   r)   r*   Útest_one_mx_queryŒ   s0    
ÿ
ÿz#TestSimpleQueries.test_one_mx_queryc                 C   s´   |   tj¡}g }d| j|  ¡ f }|  |tjtj¡}| |¡ dd|  ¡ f }|  |tjtj¡}| |¡ |  	||¡ z$| j
|td\}}|  |tj¡ W n tjy®   Y n0 dS )z2create a query packet containing two query recordsr,   Z	bogusnamer.   N)r0   r
   r1   r!   r2   r3   r4   r5   r8   r9   r:   r"   r;   ÚDNS_RCODE_FORMERRÚsocketr   rB   r)   r)   r*   Útest_two_queries¬   s    

ÿz"TestSimpleQueries.test_two_queriesc           	      C   sæ   |   tj¡}g }d| j|  ¡ f }|  |tjtj¡}td|j	ƒ | 
|¡ |  ||¡ | j|td\}}d}t d¡}|dur†|d7 }|  |tj¡ |  |tj¡ |  |j|¡ |  |jd j| j¡ |durâ|  |jd j|¡ dS )zcreate a QTYPE_ALL queryr,   r-   r.   r   ZSERVER_IPV6Nr   )r0   r
   r1   r!   r2   r3   ÚDNS_QTYPE_ALLr5   r6   r7   r8   r9   r:   r"   ÚosÚgetenvr;   r<   r=   r>   r?   r@   rA   )	r&   rC   rD   r7   rE   rF   rG   Znum_answersZdc_ipv6r)   r)   r*   Útest_qtype_all_queryÅ   s*    
ÿ
ÿz&TestSimpleQueries.test_qtype_all_queryc                 C   sˆ   |   tj¡}g }d| j|  ¡ f }|  |tjtj¡}| |¡ |  	||¡ z$| j
|td\}}|  |tj¡ W n tjy‚   Y n0 dS )zcreate a QCLASS_NONE queryr,   r.   N)r0   r
   r1   r!   r2   r3   rT   ÚDNS_QCLASS_NONEr8   r9   r:   r"   r;   ÚDNS_RCODE_NOTIMPrR   r   rB   r)   r)   r*   Útest_qclass_none_queryà   s     ý
ÿz(TestSimpleQueries.test_qclass_none_queryc                 C   s˜   |   tj¡}g }d| j|  ¡ f }|  |tjtj¡}| |¡ |  	||¡ | j
|td\}}|  |tj¡ |  |tj¡ |  |jd¡ |  |jd¡ dS )z!create a SOA query for a hostnamer,   r.   r   r   N)r0   r
   r1   r!   r2   r3   rJ   r5   r8   r9   r:   r"   r;   r<   r=   r>   r?   ÚnscountrB   r)   r)   r*   Útest_soa_hostname_queryø   s    
ÿz)TestSimpleQueries.test_soa_hostname_queryc                 C   s’   |   tj¡}g }d|  ¡  }|  |tjtj¡}| |¡ |  ||¡ | j	|t
d\}}|  |tj¡ |  |tj¡ |  |jd¡ |  |jd¡ dS )z*create a SOA query for an unknown hostnamez	foobar.%sr.   r   r   N)r0   r
   r1   r2   r3   rJ   r5   r8   r9   r:   r"   r;   rO   r=   r>   r?   r[   rB   r)   r)   r*   Útest_soa_unknown_hostname_query  s    
ÿz1TestSimpleQueries.test_soa_unknown_hostname_queryc                 C   s–   |   tj¡}g }|  ¡ }|  |tjtj¡}| |¡ |  ||¡ | j	|t
d\}}|  |tj¡ |  |tj¡ |  |jd¡ |  |jd jjd¡ dS )zcreate a SOA query for a domainr.   r   r   i  N)r0   r
   r1   r2   r3   rJ   r5   r8   r9   r:   r"   r;   r<   r=   r>   r?   r@   rA   ZminimumrB   r)   r)   r*   Útest_soa_domain_query  s    
ÿz'TestSimpleQueries.test_soa_domain_query)Ú__name__Ú
__module__Ú__qualname__r   rH   rL   rM   rP   rS   rW   rZ   r\   r]   r^   Ú__classcell__r)   r)   r'   r*   r   H   s   	 r   c                       sd   e Z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‡  ZS )ÚTestDNSUpdatesc                    s0   t t| ƒ ¡  t| _t| _t| _t| _t| _d S r   )	r   rc   r   r    r!   r"   r#   r$   r   r%   r'   r)   r*   r   1  s    zTestDNSUpdates.setUpc                 C   s¬   |   tj¡}g }d| j|  ¡ f }|  |tjtj¡}| |¡ |  ¡ }|  |tjtj¡}| |¡ |  	||¡ z$| j
|td\}}|  |tj¡ W n tjy¦   Y n0 dS )zcreate two update requestsr,   r.   N)r0   r
   ÚDNS_OPCODE_UPDATEr!   r2   r3   r4   r5   r8   r9   r:   r"   r;   rQ   rR   r   ©r&   rC   Úupdatesr7   ÚurF   rG   r)   r)   r*   Útest_two_updates:  s    

ÿzTestDNSUpdates.test_two_updatesc                 C   sd   |   tj¡}g }|  ¡ }|  |tjtj¡}| |¡ |  ||¡ | j	|t
d\}}|  |tj¡ dS )z"create update with DNS_QCLASS_NONEr.   N)r0   r
   rd   r2   r3   r4   rX   r8   r9   r:   r"   r;   rY   re   r)   r)   r*   Útest_update_wrong_qclassS  s    
ÿz'TestDNSUpdates.test_update_wrong_qclassc           	      C   sÔ   |   tj¡}g }|  ¡ }|  |tjtj¡}| |¡ |  ||¡ g }t 	¡ }d| j
|  ¡ f |_tj|_tj|_d|_d|_| |¡ t|ƒ|_||_z$| j|td\}}|  |tj¡ W n tjyÎ   Y n0 dS )ztest update with a non-null TTLr,   r   r   r.   N)r0   r
   rd   r2   r3   rJ   r5   r8   r9   Úres_recr!   r7   ÚDNS_QTYPE_TXTÚrr_typerX   Úrr_classÚttlÚlengthÚlenr?   r@   r:   r"   r;   rQ   rR   r   ©	r&   rC   rf   r7   rg   ZprereqsÚrrF   rG   r)   r)   r*   Ú$test_update_prereq_with_non_null_ttla  s,    


ÿz3TestDNSUpdates.test_update_prereq_with_non_null_ttlc           	      C   sº   |   tj¡}g }|  ¡ }|  |tjtj¡}| |¡ |  ||¡ g }t 	¡ }d| j
|  ¡ f |_tj|_tj|_d|_d|_| |¡ t|ƒ|_||_| j|td\}}|  |tj¡ dS )z"test update with a non-null lengthr,   r   r   r.   N)r0   r
   rd   r2   r3   rJ   r5   r8   r9   rj   r!   r7   rk   rl   ÚDNS_QCLASS_ANYrm   rn   ro   rp   r?   r@   r:   r"   r;   ÚDNS_RCODE_NXRRSETrq   r)   r)   r*   Ú'test_update_prereq_with_non_null_lengthƒ  s&    


ÿz6TestDNSUpdates.test_update_prereq_with_non_null_lengthc           	      C   s´   |   tj¡}g }|  ¡ }|  |tjtj¡}| |¡ |  ||¡ g }t 	¡ }d|  ¡  |_
tj|_tj|_d|_d|_| |¡ t|ƒ|_||_| j|td\}}|  |tj¡ dS )z#test update with a nonexisting namezidontexist.%sr   r.   N)r0   r
   rd   r2   r3   rJ   r5   r8   r9   rj   r7   rk   rl   rt   rm   rn   ro   rp   r?   r@   r:   r"   r;   ru   rq   r)   r)   r*   Ú#test_update_prereq_nonexisting_namež  s&    


ÿz2TestDNSUpdates.test_update_prereq_nonexisting_namec                 C   sH   ddg }}|   ||¡}| j|td\}}|  |tj¡ |  ||¡ dS )útest adding records worksZtextrecú"This is a test"r.   N)Úmake_txt_updater:   r"   r;   r
   r<   Úcheck_query_txt©r&   ÚprefixÚtxtrC   rF   rG   r)   r)   r*   Útest_update_add_txt_record¹  s    ÿz)TestDNSUpdates.test_update_add_txt_recordc                 C   s4  d|   ¡  }|  tj¡}g }|   ¡ }|  |tjtj¡}| |¡ |  ||¡ g }t 	¡ }||_
tj|_tj|_d|_d|_|  dg¡}||_| |¡ t|ƒ|_||_| j|td\}}	|  |tj¡ |  tj¡}g }
|  |tjtj¡}|
 |¡ |  ||
¡ | j|td\}}	|  |tj¡ |  tj¡}g }|   ¡ }|  |tjtj¡}| |¡ |  ||¡ g }t 	¡ }||_
tj|_tj|_d|_d|_|  dg¡}||_| |¡ t|ƒ|_||_| j|td\}}	|  |tj¡ |  tj¡}g }
|  |tjtj¡}|
 |¡ |  ||
¡ | j|td\}}	|  |tj¡ dS )zTest if deleting records workszdeleterec.%sé„  éÿÿ  ry   r.   r   N©r2   r0   r
   rd   r3   rJ   r5   r8   r9   rj   r7   rk   rl   rm   rn   ro   Zmake_txt_recordrA   rp   r[   Únsrecsr:   r"   r;   r<   r1   rX   rO   ©r&   ÚNAMErC   rf   r7   rg   rr   rA   rF   rG   rD   rE   r)   r)   r*   Útest_delete_recordÂ  sv    


ÿ
ÿ


ÿ
ÿz!TestDNSUpdates.test_delete_recordc                 C   sF  d|   ¡  }|  tj¡}g }|   ¡ }|  |tjtj¡}| |¡ |  ||¡ g }t 	¡ }||_
tj|_tj|_d|_d|_|  dg¡}||_| |¡ t|ƒ|_||_| j|td\}}	|  |tj¡ |  tj¡}g }
|  |tjtj¡}|
 |¡ |  ||
¡ | j|td\}}	|  |tj¡ |  tj¡}g }|   ¡ }|  |tjtj¡}| |¡ |  ||¡ g }t 	¡ }||_
tj|_tj|_d|_d|_|  dg¡}||_| |¡ t|ƒ|_||_| j|td\}}	|  |tj¡ |  tj¡}g }
|  |tjtj¡}|
 |¡ |  ||
¡ | j|td\}}	|  |tj¡ |  tj¡}g }|   ¡ }|  |tjtj¡}| |¡ |  ||¡ g }t 	¡ }||_
tj|_tj|_d|_d|_|  dg¡}||_| |¡ t|ƒ|_||_| j|td\}}	|  |tj¡ |  tj¡}g }
|  |tjtj¡}|
 |¡ |  ||
¡ | j|td\}}	|  |tj¡ dS )z:Test if adding, deleting and then readding a records workszreaddrec.%sr€   r   ry   r.   r   Nr‚   r„   r)   r)   r*   Útest_readd_record  s°    


ÿ
ÿ


ÿ
ÿ


ÿ
ÿz TestDNSUpdates.test_readd_recordc                 C   sŠ  |   tj¡}g }|  ¡ }|  |tjtj¡}| |¡ |  ||¡ g }t 	¡ }d|  ¡  |_
tj|_tj|_d|_d|_t ¡ }d|_d|  ¡  |_||_| |¡ t|ƒ|_||_| j|td\}}|  |tj¡ |   tj¡}g }	d|  ¡  }|  |tjtj¡}
|	 |
¡ |  ||	¡ | j|td\}}|  |tj¡ |  |jd¡ |jd }|  |jtj¡ |  |jjd¡ |  |jjd|  ¡  ¡ d	S )
ztest adding MX records worksrI   r€   r   é
   zmail.%sr.   r   r   N)r0   r
   rd   r2   r3   rJ   r5   r8   r9   rj   r7   rN   rl   rm   rn   ro   Z	mx_recordZ
preferenceZexchangerA   rp   r[   rƒ   r:   r"   r;   r<   r1   r>   r?   r@   )r&   rC   rf   r7   rg   rr   rA   rF   rG   rD   rE   Zansr)   r)   r*   Útest_update_add_mx_recordŒ  sJ    


ÿ
ÿ
z(TestDNSUpdates.test_update_add_mx_record)r_   r`   ra   r   rh   ri   rs   rv   rw   r   r†   r‡   r‰   rb   r)   r)   r'   r*   rc   0  s   	"	Rxrc   c                       s|   e Z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‡  ZS )ÚTestComplexQueriesc           
      C   s”   |   tj¡}|  ¡ }|  |tjtj¡}|  ||g¡ t ¡ }||_	||_
tj|_d|_d|_||_d|_|g|_| j|td\}}	|  |tj¡ d S )Nr€   r   r   r.   )r0   r
   rd   r2   r3   rJ   r5   r9   rj   r7   rl   rm   rn   ro   rA   r[   rƒ   r:   r"   r;   r<   )
r&   ÚkeyÚvalueZqtyperC   r7   rg   rr   rF   rG   r)   r)   r*   Úmake_dns_update½  s     ÿz"TestComplexQueries.make_dns_updatec                    s0   t t| ƒ ¡  t| _t| _t| _t| _t| _d S r   )	r   rŠ   r   r    r!   r"   r#   r$   r   r%   r'   r)   r*   r   Ñ  s    zTestComplexQueries.setUpc                 C   sº  zêd|   ¡  }d| j|   ¡ f }|  ||tj¡ |  tj¡}g }d|   ¡  }|  |tjtj	¡}t
d|jƒ | |¡ |  ||¡ | j|| jd\}}|  |tj¡ |  |tj¡ |  |jd¡ |  |jd jtj¡ |  |jd jd| j|   ¡ f ¡ |  |jd jtj¡ |  |jd j| j¡ W |  tj¡}g }|   ¡ }|  |tjtj	¡}	| |	¡ |  ||¡ g }t ¡ }
d|   ¡  |
_tj|
_tj|
_d|
_d|
_d| j|   ¡ f |
_| |
¡ t|ƒ|_ ||_!| j|| jd\}}|  |tj¡ nÈ|  tj¡}g }|   ¡ }|  |tjtj	¡}	| |	¡ |  ||¡ g }t ¡ }
d|   ¡  |
_tj|
_tj|
_d|
_d|
_d| j|   ¡ f |
_| |
¡ t|ƒ|_ ||_!| j|| jd\}}|  |tj¡ 0 d	S )
r+   zcname_test.%sr,   r-   r.   r   r   r   r   N)"r2   r!   r   r
   ÚDNS_QTYPE_CNAMEr0   r1   r3   r4   r5   r6   r7   r8   r9   r:   r"   r;   r<   r=   r>   r?   r@   rl   rA   rd   rJ   rj   rX   rm   rn   ro   rp   r[   rƒ   )r&   r7   rA   rC   rD   rE   rF   rG   rf   rg   rr   r)   r)   r*   rH   Û  s’    þ
ÿÿÿþ


ÿçþ


ÿz#TestComplexQueries.test_one_a_queryc           	      C   st  d|   ¡  }d|   ¡  }d|   ¡  }|  ||tj¡ |  ||tj¡ |  |ttj¡ |  tj¡}g }|  |tjtj	¡}| 
|¡ |  ||¡ | j|td\}}|  |tj¡ |  |tj¡ |  |jd¡ |  |jd jtj¡ |  |jd j|¡ |  |jd j|¡ |  |jd jtj¡ |  |jd j|¡ |  |jd j|¡ |  |jd jtj¡ |  |jd j| j¡ d S )	Núcnamechain0.%súcnamechain1.%súcnamechain2.%sr.   é   r   r   r   )r2   r   r
   rŽ   r"   r4   r0   r1   r3   r5   r8   r9   r:   r;   r<   r=   r>   r?   r@   rl   r7   rA   ©	r&   Úname0Zname1Úname2rC   rD   rE   rF   rG   r)   r)   r*   Útest_cname_two_chain  s8    
ÿ
ÿÿz'TestComplexQueries.test_cname_two_chainc                 C   sB   d|   ¡  }z|  |dtj¡ W n ty2   Y n0 |  d¡ d S )Nzcnamedotprefix0.%sÚ z1Successfully added empty CNAME, which is invalid.)r2   r   r
   rŽ   ÚAssertionErrorÚfail)r&   r”   r)   r)   r*   Útest_invalid_empty_cname;  s    z+TestComplexQueries.test_invalid_empty_cnamec           	      C   sH  d|   ¡  }d|   ¡  }d|   ¡  }|  ||tj¡ |  ||tj¡ |  |ttj¡ |  tj¡}g }|  |tj	tj
¡}| |¡ |  ||¡ | j|td\}}|  |tj¡ |  |tj¡ |  |jd¡ |  |jd jtj¡ |  |jd j|¡ |  |jd j|¡ |  |jd jtj¡ |  |jd j|¡ |  |jd j|¡ d S )Nr   r   r‘   r.   r   r   r   )r2   r   r
   rŽ   r"   r4   r0   r1   r3   rk   r5   r8   r9   r:   r;   r<   r=   r>   r?   r@   rl   r7   rA   r“   r)   r)   r*   Ú'test_cname_two_chain_not_matching_qtypeD  s0    
ÿ
ÿz:TestComplexQueries.test_cname_two_chain_not_matching_qtypec           
      C   sº   d|   ¡  }d|   ¡  }d|   ¡  }|  ||tj¡ |  ||tj¡ |  ||tj¡ |  tj¡}g }|  |tjtj	¡}| 
|¡ |  ||¡ | j|| jd\}}d}	|  t|jƒ|	¡ d S )Nzcnamelooptestrec.zcnamelooptestrec2.zcnamelooptestrec3.r.   é   )r2   r   r   ÚDNS_TYPE_CNAMEr0   r
   r1   r3   r4   r5   r8   r9   r:   r"   r>   rp   r@   )
r&   Úcname1Úcname2Úcname3rC   rD   rE   rF   rG   Zmax_recursion_depthr)   r)   r*   Útest_cname_loopd  s$    þ
ÿz"TestComplexQueries.test_cname_loopc                 C   s¦   d  ||  ¡ ¡}d}|d }td|d ƒD ]}||ƒ}|  |||¡ q*|  tj¡}g }	|  ||tj¡}
|	 	|
¡ |  
||	¡ | j|| jd\}}|  t|jƒ|¡ d S )Nzlimittestrec{0}.{1}rœ   é   r   r.   )Úformatr2   Úranger   r0   r
   r1   r3   r5   r8   r9   r:   r"   r>   rp   r@   )r&   ÚrtypeÚrec_genr7   ÚlimitÚnum_recs_to_enterÚiÚiprC   rD   rE   rF   rG   r)   r)   r*   Úmax_rec_test}  s"    þ
ÿzTestComplexQueries.max_rec_testc                 C   s   dd„ }| j tj|d d S )Nc                 S   s   dt | ƒ S )Nú127.0.0.©Ústr©r©   r)   r)   r*   Úip4_gen•  s    z7TestComplexQueries.test_record_limit_A.<locals>.ip4_gen©r¥   r¦   )r«   r
   r4   )r&   r°   r)   r)   r*   Útest_record_limit_A”  s    z&TestComplexQueries.test_record_limit_Ac                 C   s   dd„ }| j tj|d d S )Nc                 S   s   dt | ƒ S )NzAAAA:0:0:0:0:0:0:r­   r¯   r)   r)   r*   Úip6_genš  s    z:TestComplexQueries.test_record_limit_AAAA.<locals>.ip6_genr±   )r«   r
   ZDNS_QTYPE_AAAA)r&   r³   r)   r)   r*   Útest_record_limit_AAAA™  s    z)TestComplexQueries.test_record_limit_AAAAc                 C   s   dd„ }| j tj|d d S )Nc                 S   s,   t  ¡ }d|_d|_d|_dt| ƒ |_|S )Nr   é\   Z
srvtestrec)r
   Z
srv_recordZpriorityZweightZportr®   Útarget)r©   Úrecr)   r)   r*   Úsrv_genŸ  s    z9TestComplexQueries.test_record_limit_SRV.<locals>.srv_genr±   )r«   r
   ZDNS_QTYPE_SRV)r&   r¸   r)   r)   r*   Útest_record_limit_SRVž  s    z(TestComplexQueries.test_record_limit_SRVc                 C   sî   d|   ¡  }d|   ¡  }d|   ¡  }d}d}|d }|  ||tj¡ |  ||tj¡ |d }td|d ƒD ] }|t|ƒ }	|  ||	tj¡ qj|  tj	¡}
g }|  
|tjtj¡}| |¡ |  |
|¡ | j|
| jd	\}}|  t|jƒ|¡ d S )
Nzcnamelimittestrec.zcnamelimittestrec2.zcnamelimittestrec3.r¬   rœ   r¢   r   r   r.   )r2   r   r   r   r¤   r®   r
   r4   r0   r1   r3   r5   r8   r9   r:   r"   r>   rp   r@   )r&   rž   rŸ   r    Z	ip_prefixr§   r¨   Znum_arecs_to_enterr©   rª   rC   rD   rE   rF   rG   r)   r)   r*   Útest_cname_limit©  s.    þ
ÿz#TestComplexQueries.test_cname_limitc           	      C   sÎ   d|   ¡  }d|   ¡  }d|   ¡  }|  ||tj¡ |  ||tj¡ |  tj¡}g }|  |tjtj	¡}| 
|¡ |  ||¡ | j|| jd\}}|  t|jƒd¡ |  |jd j|¡ |  |jd j|¡ d S )Nzcnameanytestrec.zcnameanytestrec2.zcnameanytestrec3.r.   r   r   )r2   r   r   r   r0   r
   r1   r3   rT   r5   r8   r9   r:   r"   r>   rp   r@   r7   rA   )	r&   rž   rŸ   r    rC   rD   rE   rF   rG   r)   r)   r*   Útest_cname_any_queryÇ  s$    þ
ÿz'TestComplexQueries.test_cname_any_query)r_   r`   ra   r   r   rH   r–   rš   r›   r¡   r«   r²   r´   r¹   rº   r»   rb   r)   r)   r'   r*   rŠ   ¼  s   
?!	 rŠ   c                       s,   e Zd Z‡ fdd„Zdd„ Zdd„ Z‡  ZS )ÚTestInvalidQueriesc                    s0   t t| ƒ ¡  t| _t| _t| _t| _t| _d S r   )	r   r¼   r   r    r!   r"   r#   r$   r   r%   r'   r)   r*   r   á  s    zTestInvalidQueries.setUpc                 C   s  d}zBt   t jt jd¡}| | jdf¡ | dd¡ W |durZ| ¡  n|durX| ¡  0 |  tj	¡}g }d| j
|  ¡ f }|  |tjtj¡}td|jƒ | |¡ |  ||¡ | j|| jd\}}|  |tj¡ |  |tj	¡ |  |jd¡ |  |jd j| j¡ dS )	zTsend 0 bytes follows by create a query packet
           containing one query recordNr   é5   ó    r,   r-   r.   r   )rR   ÚAF_INETZ
SOCK_DGRAMÚconnectr"   ÚsendÚcloser0   r
   r1   r!   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   )r&   ÚsrC   rD   r7   rE   rF   rG   r)   r)   r*   rH   ê  s0    
ÿ

ÿÿz#TestInvalidQueries.test_one_a_queryc           
      C   s,  |   tj¡}g }dd|  ¡ f }|  |tjtj¡}td|jƒ | 	|¡ |  
||¡ | jtjO  _d}zªz~t |¡}t tjtjd¡}| t¡ | j}| |df¡ t dt|ƒ¡}||7 }| |d¡ | dd¡}	|  dt|	ƒ¡ W n tjyü   Y n0 W |dur(| ¡  n|dur&| ¡  0 dS )	zsend a reply instead of a queryr,   Zfakefakefaker-   Nr   r½   z!Hi  )r0   r
   r1   r2   r3   r4   r5   r6   r7   r8   r9   Z	operationZDNS_FLAG_REPLYÚndrr   rR   r¿   ZSOCK_STREAMZ
settimeoutr   r"   rÀ   ÚstructZpackrp   rÁ   Zrecvr>   rÂ   )
r&   rC   rD   r7   rE   rÃ   Zsend_packetr/   Z
tcp_packetZrecv_packetr)   r)   r*   Útest_one_a_reply  s4    




ÿ
z#TestInvalidQueries.test_one_a_reply)r_   r`   ra   r   rH   rÆ   rb   r)   r)   r'   r*   r¼   à  s   	r¼   c                       s*  e Zd Z‡ fdd„Z‡ fdd„ZdEdd„ZdFdd	„Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ ZdGdd„Zdddgfdd„Zdd „ ZdHd!d"„Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zd9d:„ Zd;d<„ Zd=d>„ Zd?d@„ Z dAdB„ Z!dCdD„ Z"‡  Z#S )IÚ	TestZonesc                    sŽ   t t| ƒ ¡  t| _t| _t| _t| _t| _d| _	t
 
d| j | j| j¡| _td| j |  ¡ tƒ | jd| _d| j	 d t| j ¡ ƒ | _d S )Nútest.lanúncacn_ip_tcp:%s[sign]úldap://©Úurlr#   Zsession_infor	   zDC=z#,CN=MicrosoftDNS,DC=DomainDNSZones,)r   rÇ   r   r    r!   r"   r#   r$   r   Úzoner   Úrpc_connr   Úget_loadparmr   Úsamdbr®   Zget_default_basednÚzone_dnr%   r'   r)   r*   r   .  s,    ÿþ
ýÿþzTestZones.setUpc              
      s^   t t| ƒ ¡  z|  | j¡ W n: tyX } z"|j\}}|tjkrD‚ W Y d }~n
d }~0 0 d S r   )	r   rÇ   ÚtearDownÚdelete_zonerÍ   ÚRuntimeErrorÚargsr   Z"WERR_DNS_ERROR_ZONE_DOES_NOT_EXIST)r&   ÚeÚnumÚstringr'   r)   r*   rÒ   D  s    

zTestZones.tearDownFc                 C   s@   t  ¡ }||_tj|_t|ƒ|_t j|_	d|_
d|_tj|_|S )Nr   )r   Z!DNS_RPC_ZONE_CREATE_INFO_LONGHORNÚpszZoneNamer   ZDNS_ZONE_TYPE_PRIMARYZ
dwZoneTyper   ZfAgingZDNS_DP_DOMAIN_DEFAULTZ	dwDpFlagsZfDsIntegratedZfLoadExistingÚDNS_ZONE_UPDATE_UNSECUREZfAllowUpdate)r&   rÍ   Úaging_enabledÚzone_creater)   r)   r*   Úmake_zone_objN  s    
zTestZones.make_zone_objc              
   C   sh   |   ||¡}z(tj}| j |d| jd ddtj|¡ W n. tyb } z|  |¡ W Y d }~n
d }~0 0 d S )Nr   Ú
ZoneCreate)	rÝ   r   ÚDNS_CLIENT_VERSION_LONGHORNrÎ   ÚDnssrvOperation2r"   ÚDNSSRV_TYPEID_ZONE_CREATEr   r™   )r&   rÍ   rÛ   rÜ   Úclient_versionrÖ   r)   r)   r*   Úcreate_zoneY  s    ùzTestZones.create_zonec           	      K   s–   |  dd ¡}| ¡ D ]|\}}t ¡ }||_||_tj}tj}z | j 	|d| j
|dd||¡ W q tyŽ } z|  t|ƒ¡ W Y d }~qd }~0 0 qd S )NrÍ   r   ZResetDwordProperty)ÚpopÚitemsr   ZDNS_RPC_NAME_AND_PARAMZdwParamZpszNodeNamerß   ZDNSSRV_TYPEID_NAME_AND_PARAMrÎ   rà   r!   r   r™   r®   )	r&   ÚkwargsrÍ   r‹   ÚvalZ
name_paramrâ   Znap_typerÖ   r)   r)   r*   Ú
set_paramsh  s&    ùzTestZones.set_paramsc                 C   s^   d  || j¡}|  |¡}|D ]}||ƒ q|dd„ |D ƒdœ}| j tj | j|tj¡¡ d S )Nz
DC={0},{1}c                 S   s   g | ]}t |ƒ‘qS r)   )r   ©Ú.0rr   r)   r)   r*   Ú
<listcomp>‚  r¾   z1TestZones.ldap_modify_dnsrecs.<locals>.<listcomp>)ÚdnÚ	dnsRecord)	r£   rÑ   Úldap_get_dns_recordsrÐ   ÚmodifyÚldbÚMessageÚ	from_dictÚFLAG_MOD_REPLACE)r&   r7   Úfuncrì   Zdns_recsr·   Úupdate_dictr)   r)   r*   Úldap_modify_dnsrecs}  s    

þzTestZones.ldap_modify_dnsrecsc                    sf   |   |ˆ | j¡}| j|| jd\}}|  |tj¡ |  |¡}‡ fdd„|D ƒ}|  t	|ƒd¡ |d S )Nr.   c                    s   g | ]}|j jˆ kr|‘qS r)   )Údatar®   ré   ©r~   r)   r*   rë   Œ  r¾   z/TestZones.dns_update_record.<locals>.<listcomp>r   r   )
rz   rÍ   r:   r"   r;   r
   r<   rî   r>   rp   )r&   r}   r~   rC   ÚcoderF   Úrecsr)   rø   r*   Údns_update_record‡  s    
zTestZones.dns_update_recordc                 C   s6   |d | }t  ¡ }d|_t j|_| j ||g¡ d S )NÚ.iè  )r   ÚDnssrvRpcRecordÚdwTimeStampÚDNS_TYPE_TOMBSTONEÚwTyperÐ   Zdns_replace)r&   r}   r~   rÍ   r7   Útor)   r)   r*   Údns_tombstone  s
    zTestZones.dns_tombstonec                 C   s$   d  |¡}| jj| jtj|dgdS )Nz"(&(objectClass=dnsNode)(name={0}))Ú*©ÚbaseZscopeZ
expressionÚattrs)r£   rÐ   ÚsearchrÑ   rð   ÚSCOPE_SUBTREE)r&   r7   Úexprr)   r)   r*   Úldap_get_records™  s    
ÿzTestZones.ldap_get_recordsc                 C   s"   |   |¡}dd„ |d  d¡D ƒS )Nc                 S   s   g | ]}t tj|ƒ‘qS r)   )r   r   rý   ré   r)   r)   r*   rë   £  s   ÿz2TestZones.ldap_get_dns_records.<locals>.<listcomp>r   rí   )r
  Úget)r&   r7   Úrecordsr)   r)   r*   rî   ¡  s    
ÿzTestZones.ldap_get_dns_recordsc                    sˆ   | j j| jtjdd | j¡ dgd}|  t|ƒd¡ dd„ |d  	d¡D ƒ}d	d
ddddddddddddddddœ‰ ‡ fdd„|D ƒS )Nú(&(objectClass=dnsZone)ú(name={0}))ÚdNSPropertyr  r   c                 S   s   g | ]}t tj|ƒ‘qS r)   ©r   r   ZDnsPropertyré   r)   r)   r*   rë   ¬  s   ÿz4TestZones.ldap_get_zone_settings.<locals>.<listcomp>r   ZEMPTYZTYPEZALLOW_UPDATEZSECURE_TIMEZNOREFRESH_INTERVALZSCAVENGING_SERVERSZAGING_ENABLED_TIMEZREFRESH_INTERVALZAGING_STATEZDELETED_FROM_HOSTNAMEZMASTER_SERVERSZAUTO_NS_SERVERSZDCPROMO_CONVERTZSCAVENGING_SERVERS_DAZMASTER_SERVERS_DAZNS_SERVERS_DAZNODE_DBFLAGS)r   r   r   é   é   é   é   é    é@   é€   é   é‚   éƒ   é   é‘   é’   é   c                    s   i | ]}ˆ |j   ¡ |j“qS r)   )ÚidÚlowerr÷   ©rê   rC   ©Zzone_prop_idsr)   r*   Ú
<dictcomp>Á  r¾   z4TestZones.ldap_get_zone_settings.<locals>.<dictcomp>)
rÐ   r  rÑ   rð   Ú
SCOPE_BASEr£   rÍ   r>   rp   r  )r&   r  Úpropsr)   r"  r*   Úldap_get_zone_settings¦  s:    
ÿýÿðz TestZones.ldap_get_zone_settingsc                 C   s4   | j | j|d | jddtt|ƒƒ| jtjd d S )N©rÛ   r   ©ÚNoRefreshIntervalÚRefreshIntervalÚAgingrÍ   ÚAllowUpdate)rã   rÍ   rè   r   Úboolr   rÚ   )r&   Úenabler)   r)   r*   Ú	set_agingÃ  s
    þzTestZones.set_agingTÚ	agingtestútest txtc                 C   sT   | j dd |  ¡ }|  |d d u¡ |  |d ¡ |  ddg¡}|  |jd¡ d S )NT©r.  Úaging_stater0  r1  r   )r/  r&  Ú
assertTruerû   ÚassertNotEqualrþ   )r&   r.  r7   r~   Úsettingsr·   r)   r)   r*   Útest_set_agingÉ  s    zTestZones.test_set_agingc                 C   sT   | j dd |  ¡ }|  |d d u¡ |  |d ¡ |  ddg¡}|  |jd¡ d S )NFr2  r3  r0  r1  r   )r/  r&  r4  ZassertFalserû   r5  rþ   )r&   r6  r·   r)   r)   r*   Útest_set_aging_disabledÒ  s    z!TestZones.test_set_aging_disabledc           	         s¸   ddg }}ˆj dd ˆ ||¡}|s8ˆjˆjdd d‰ ‡ ‡fdd	„}ˆ ||¡ ˆ |¡}ˆ t|ƒd
¡ |d }ˆ |j|jˆ  ¡ ˆ ||¡}|r |n|}ˆ |j|j¡ d S )Nr0  r1  Tr2  r   )rÍ   r+  r   c                    s"   ˆ  | jdk¡ |  jˆ 8  _d S )Nr   ©r4  rþ   ©r·   ©Zdecr&   r)   r*   Úmod_tsã  s    z+TestZones.test_aging_update.<locals>.mod_tsr   )	r/  rû   rè   rÍ   rö   rî   r>   rp   rþ   )	r&   r.  r7   r~   Ú
before_modr<  Z	after_modZafter_updateZafter_should_equalr)   r;  r*   Útest_aging_updateÛ  s&    
ÿÿzTestZones.test_aging_updatec                 C   s   | j dd d S )NFr2  )r>  r%   r)   r)   r*   Útest_aging_update_disabledñ  s    z$TestZones.test_aging_update_disabledc                    s¼   ddg }}ˆj ˆjdd d‰ ˆjˆ ˆ dˆjtjd ˆ ||¡}‡ ‡fdd	„}ˆ ||¡ ˆ ||¡}‡ ‡fd
d	„}ˆ ||¡ ˆ ||¡}ˆ |j|jˆ d  ¡ ˆ |j|j¡ d S )Nr0  r1  Tr'  rˆ   r   r(  c                    s&   ˆ  | jdk¡ |  jˆ d 8  _d S ©Nr   r   r9  r:  ©Úintervalr&   r)   r*   r<  ý  s    z,TestZones.test_aging_refresh.<locals>.mod_tsc                    s*   ˆ  | jdk¡ |  jˆ ˆ d  8  _d S r@  r9  r:  rA  r)   r*   r<    s    r   )	rã   rÍ   rè   r   rÚ   rû   rö   r>   rþ   )r&   r7   r~   r=  r<  Zupdate_during_norefreshZupdate_during_refreshr)   rA  r*   Útest_aging_refreshô  s(    þÿÿzTestZones.test_aging_refreshc              	   C   sx   ddg }}| j dd t ¡ }t|ƒ|_| j tjd| j| j	||d ¡ |  
|¡}|  t|ƒd¡ |  |d jd¡ d S )Nr0  r1  Tr2  r   r   )r/  r   ÚDNS_RPC_RECORD_BUFr   r·   rÎ   ÚDnssrvUpdateRecord2rß   r"   rÍ   rî   r>   rp   rþ   )r&   r7   r~   Úrec_bufrú   r)   r)   r*   Útest_rpc_add_no_timestamp  s     
ù
z#TestZones.test_rpc_add_no_timestampc              	   C   sl   ddg }}dg}| j dd t ¡ }t|ƒ|_| j tjd| j| j	||d ¡ |  
||¡}|  |jd¡ d S )Nr0  r1  ú	test txt2Tr2  r   )r/  r   rD  r   r·   rÎ   rE  rß   r"   rÍ   rû   r>   rþ   )r&   r7   r~   Útxt2rF  Zrec2r)   r)   r*   Ú!test_static_record_dynamic_update  s     
ù	z+TestZones.test_static_record_dynamic_updatec              	   C   sÊ   ddg }}dg}dg}| j dd |  ||¡ t ¡ }t|ƒ|_| j tjd| j	| j
||d ¡ |  ||¡ |  |¡}dd	„ |D ƒ}|  |t|ƒ jd¡ |  |t|ƒ jd¡ |  |t|ƒ jd¡ d S )
Nr0  r1  rH  ú	test txt3Tr2  r   c                 S   s   i | ]}t |jj ƒ|“qS r)   ©r®   r÷   ré   r)   r)   r*   r#  G  r¾   z?TestZones.test_dynamic_record_static_update.<locals>.<dictcomp>)r/  rû   r   rD  r   r·   rÎ   rE  rß   r"   rÍ   rî   r5  r®   rþ   r>   )r&   r7   r~   rI  Útxt3rF  rú   r)   r)   r*   Ú!test_dynamic_record_static_update0  s,    
ù	
z+TestZones.test_dynamic_record_static_updatec              
      sà  |   ¡ }t| ¡ |tƒ | jd| _ddg }‰ ddg }}ddg }}dd	g }}d
dg }	}
| j| jdd d}| j||d| jt	j
d |  |ˆ ¡ |  |ˆ ¡ |  ||¡ |  |ˆ ¡ |  ||¡ |  ||¡}‡ fdd„}|  ||¡ |  ||¡ t ¡ }t|ƒ|_| j tjd| j| j||d ¡ |  |	|
¡ |  |	|
| j¡ |  |¡ d}| t|jƒd ¡}z| jj| jtj|dgd}W n6 tjy¸ } z|  t |ƒ¡ W Y d }~n
d }~0 0 dd„ |D ƒ}|  !|t"||gƒ¡ d S )NrË   r0  r1  Ú
agingtest2rH  Ú
agingtest3rK  Ú
agingtest4ú	test txt4Ú
agingtest5ú	test txt5Tr'  rˆ   r   r(  c                    s   | j jˆ kr|  jd8  _d S )Nr   )r÷   r®   rþ   r:  rø   r)   r*   r<  h  s    z>TestZones.test_dns_tombstone_custom_match_rule.<locals>.mod_tsr   ú'(dnsRecord:1.3.6.1.4.1.7165.4.5.3:={0})r  r  c                 S   s   h | ]}t | d ¡ƒ’qS )r7   )r®   r  ré   r)   r)   r*   Ú	<setcomp>†  r¾   zATestZones.test_dns_tombstone_custom_match_rule.<locals>.<setcomp>)#rÏ   r   Ú	samdb_urlr   r$   rÐ   rã   rÍ   rè   r   rÚ   rû   rö   r   rD  r   r·   rÎ   rE  rß   r"   r  rî   r£   r   rþ   r  rÑ   rð   r  ÚLdbErrorr™   r®   r>   Úset)r&   r#   r7   r•   rI  Úname3rM  Úname4Útxt4Úname5Útxt5rB  Zlast_updater<  rF  r	  ÚresrÖ   Zupdated_namesr)   rø   r*   Ú$test_dns_tombstone_custom_match_ruleL  sb    
þþ
ù

ÿ
$z.TestZones.test_dns_tombstone_custom_match_rulec              
   C   sÄ   |   ¡ }t| ¡ |tƒ | jd| _| j| jdd d}| j||d| jt	j
d d}| d¡}z| jj| jtj|dgd	}W n4 tjy® } z|  t|ƒ¡ W Y d }~n
d }~0 0 |  d
t|ƒ¡ d S )NrË   Tr'  rˆ   r   r(  rU  r  r  r   )rÏ   r   rW  r   r$   rÐ   rã   rÍ   rè   r   rÚ   r£   r  rÑ   rð   r  rX  r™   r®   r>   rp   )r&   r#   rB  r	  r_  rÖ   r)   r)   r*   Ú/test_dns_tombstone_custom_match_rule_no_records‰  s(    
þþ
ÿ
$z9TestZones.test_dns_tombstone_custom_match_rule_no_recordsc           	   
   C   sÜ  | j | jdd tt ¡ ttƒ | jd}d}|j| jt	j
|dgd}|  t|ƒd¡ z:d}|j| jt	j
|dgd}|  t|ƒd¡ |  d	¡ W n< t	jyÊ } z"|j\}}|  |t¡ W Y d }~n
d }~0 0 z:d
}|j| jt	j
|dgd}|  t|ƒd¡ |  d	¡ W n> t	jyD } z"|j\}}|  |t¡ W Y d }~n
d }~0 0 zDd}| d¡}|j| jt	j
|dgd}|  t|ƒd¡ |  d	¡ W n> t	jyÈ } z"|j\}}|  |t¡ W Y d }~n
d }~0 0 z:d}|j| jt	j
|dgd}|  t|ƒd¡ |  d	¡ W n> t	jyB } z"|j\}}|  |t¡ W Y d }~n
d }~0 0 zTtd| j |  ¡ | jd}d}|j| jt	j
|dgd}|  t|ƒd¡ |  d	¡ W n> t	jyÖ } z"|j\}}|  |t¡ W Y d }~n
d }~0 0 d S )NTr'  rË   z'(dnsProperty:1.3.6.1.4.1.7165.4.5.3:=1)r  r  r   z$(dnsRecord:1.3.6.1.4.1.7165.4.5.3:=)z%Exception: ldb.ldbError not generatedz%(dnsRecord:1.3.6.1.4.1.7165.4.5.3:=-)rU  ZA11111111111111111111111111111111111111111111111111111111111111111z+(dnsRecord:1.3.6.1.4.1.7165.4.5.3:=expired)rÊ   )rÌ   r#   r	   z%(dnsRecord:1.3.6.1.4.1.7165.4.5.3:=2))rã   rÍ   r   r#   rW  r   r$   r  rÑ   rð   r  r>   rp   r™   rX  rÕ   r   r£   r"   rÏ   )	r&   rÐ   r	  r_  rÖ   r×   ÚmsgÚ_Zdbr)   r)   r*   Ú)test_dns_tombstone_custom_match_rule_failŸ  s„    ýÿÿ
"ÿ
"
ÿ
"ÿ
"
þÿ
z3TestZones.test_dns_tombstone_custom_match_rule_failc                    s2  ˆ  ¡ }t| ¡ |tƒ ˆjdˆ_ˆjˆjdd d‰ˆjˆˆˆjdt	j
d ddg }‰dd	g }}d
dg }}ddg }}ddg }	}
ˆ |ˆ¡ ˆ |ˆ¡ ˆ ||¡ ˆ |ˆ¡ ˆ ||¡ ˆ ||¡ ˆ ||ˆj¡ ˆ |¡}ˆ d|d v ¡ ˆ |d d d d¡ ˆ |	|
¡ ˆ |	|
ˆj¡ ˆ |	|
¡ ˆ |	¡}ˆ d|d v ¡ ˆ |d d d d¡ ˆ ||¡‰‡‡‡fdd„}‡fdd„}ˆ ||¡ ˆ ||¡ ˆ ||¡ ˆ |	|¡ ˆ tttdd ƒƒ¡ t ˆj¡ ˆ |¡}ˆ t|ƒd¡ ˆ |d jt	j¡ ˆ |¡}ˆ d|d v ¡ ˆ |d d d d¡ ˆ |¡}ˆ t|ƒd¡ ˆ |d jt	j¡ ˆ |d jj|¡ ˆ |¡}ˆ t|ƒd¡ dd„ |D ƒ}ˆ |t|ƒt|ƒh¡ ˆ |d jt	j¡ ˆ |d jt	j¡ ˆ |¡}ˆ t|ƒd¡ ˆ |d jt	j¡ ˆ |¡}ˆ d|d v ¡ ˆ |d d d d¡ ˆ |	¡}ˆ t|ƒd¡ ˆ |d jt	j¡ ˆ |	¡}ˆ d|d v ¡ ˆ |d d d d¡ dD ]l}|rÎdnd‰ ‡ ‡fdd„}ˆ ||¡ t ˆj¡ ˆ |¡}|rˆ t|ƒd¡ nˆ t|ƒd¡ qÀd S )NrË   Tr'  r   )r)  r*  rÍ   r+  r,  r0  r1  rO  rH  rP  rK  rQ  rR  rS  rT  ZdNSTombstonedr   s   TRUEs   FALSEc                    s2   ˆ  | jdk¡ | jjˆkr.|  jˆ d 8  _d S )Nr   r¢   )r4  rþ   r÷   r®   r:  )rB  r&   r~   r)   r*   r<    s    z/TestZones.test_basic_scavenging.<locals>.mod_tsc                    s   |  j ˆ d 8  _ d S )Nr¢   )rþ   r:  )rB  r)   r*   Ú
mod_ts_all  s    z3TestZones.test_basic_scavenging.<locals>.mod_ts_allÚ_scavenge_dns_recordsr   c                 S   s   h | ]}t |jj ƒ’qS r)   rL  ré   r)   r)   r*   rV  +  r¾   z2TestZones.test_basic_scavenging.<locals>.<setcomp>)FTéÿÿÿÿc                    s   ˆj d ˆ  | _d S )NiP  )rþ   r÷   r:  )ÚincÚlast_addr)   r*   r<  A  s    )rÏ   r   rW  r   r$   rÐ   rã   rÍ   rè   r   rÚ   rû   r  r
  r4  r>   rö   ÚcallableÚgetattrr   rf  rî   rp   r   rÿ   ÚDNS_TYPE_TXTr÷   r®   Z_dns_delete_tombstones)r&   r#   r7   r•   rI  rZ  rM  r[  r\  r]  r^  r  r<  re  rú   ZtxtsZmake_it_workr)   )rh  rB  ri  r&   r~   r*   Útest_basic_scavengingè  sœ    
þþ










zTestZones.test_basic_scavengingc           
   	      sô   ‡ fdd„}ˆ   ˆ j¡ |ˆ jd ƒ ˆ   ˆ jd ¡ |ˆ jd ƒ tj}tj}tj}ˆ j |dˆ jd d||¡\}}ˆ  	ˆ j¡ ˆ  	ˆ jd ¡ g }dd	„ |j
D ƒ}|D ]}	|	 ˆ j¡r¨| |	¡ q¨ˆ  t|ƒd
¡ ˆ  t|ƒˆ jd ˆ jh¡ d S )Nc              
      s   z6ˆ   | ¡}tj}tj}ˆ j |dˆ jd dd||¡ W nD tyz } z,|j\}}|t	j
krdˆ  |¡ W Y d }~d S d }~0 0 ˆ  d | ¡¡ d S )Nr   rÞ   zZone {} should already exist)rÝ   r   rß   rá   rÎ   rà   r"   r   rÕ   r   Z"WERR_DNS_ERROR_ZONE_ALREADY_EXISTSr™   r£   )rÍ   rÜ   râ   Zzc_typerÖ   Úenumrc  r%   r)   r*   Úcreate_zone_expect_existsM  s&    
ù


zFTestZones.test_fully_qualified_zone.<locals>.create_zone_expect_existsrü   z2.Ú2r   Ú	EnumZonesc                 S   s   g | ]}t |jƒ‘qS r)   )r®   rÙ   )rê   Úzr)   r)   r*   rë   y  r¾   z7TestZones.test_fully_qualified_zone.<locals>.<listcomp>r   )rã   rÍ   r   rß   ÚDNS_ZONE_REQUEST_PRIMARYÚDNSSRV_TYPEID_DWORDrÎ   ÚDnssrvComplexOperation2r"   rÓ   Z	ZoneArrayÚ
startswithr8   r>   rp   rY  )
r&   ro  râ   Úrequest_filterÚtidÚtypeidr_  Zzones_we_just_madeZzonesrÍ   r)   r%   r*   Útest_fully_qualified_zoneK  s2    úz#TestZones.test_fully_qualified_zonec              
   C   s$   | j  tjd| j|ddtjd ¡ d S )Nr   ZDeleteZoneFromDs)rÎ   rà   r   rß   r"   ZDNSSRV_TYPEID_NULL)r&   rÍ   r)   r)   r*   rÓ   €  s    
ùzTestZones.delete_zonec                 C   s  d}|   tj¡}g }|  |tjtj¡}| |¡ |  ||¡ | j|t	d\}}|  
|tj¡ |  |tj¡ |  |jd¡ |  |¡ | j|t	d\}}|  
|tj¡ |  |tj¡ |  |jd¡ |  |jd jtj¡ |  |¡ | j|t	d\}}|  
|tj¡ |  |tj¡ |  |jd¡ d S )NrÈ   r.   r   r   )r0   r
   r1   r3   rJ   r5   r8   r9   r:   r"   r;   rO   r=   r>   r?   rã   r<   r@   rl   rÓ   )r&   rÍ   rC   rD   rE   rF   rG   r)   r)   r*   Útest_soa_queryŠ  s0    
ÿ
ÿ
ÿzTestZones.test_soa_queryc                    s¾   | j j| jtjdd | j¡ dgd}|  t|ƒd¡ dd„ |d  	d¡D ƒ}‡ fd	d„|D ƒ}t
 ¡ }ˆ |_d|_d|_|t |¡g7 }|d j}||d
œ}| j  tj | j |tj¡¡ d S )Nr  r  r  r  r   c                 S   s   g | ]}t tj|ƒ‘qS r)   r  ré   r)   r)   r*   rë   ¯  s   ÿz9TestZones.set_dnsProperty_zero_length.<locals>.<listcomp>r   c                    s    g | ]}|j ˆ krt |¡‘qS r)   )r  rÄ   r   r!  ©Údnsproperty_idr)   r*   rë   ±  r¾   )rì   ZdnsProperty)rÐ   r  rÑ   rð   r$  r£   rÍ   r>   rp   r  r   ZDnsProperty_shortr  Z
namelengthr7   rÄ   r   rì   rï   rñ   rò   ró   )r&   r}  r  r%  Z	new_propsZzero_length_prì   rõ   r)   r|  r*   Úset_dnsProperty_zero_length©  s,    
ÿýÿ

þz%TestZones.set_dnsProperty_zero_lengthc                 C   s8   |   | j¡ |  tj¡ |  ddg¡}|  |jd¡ d S )NZdnspropertytestr1  r   )rã   rÍ   r~  r   ÚDSPROPERTY_ZONE_ALLOW_UPDATErû   r5  rþ   )r&   r·   r)   r)   r*   Ú)test_update_while_dnsProperty_zero_length¿  s    z3TestZones.test_update_while_dnsProperty_zero_lengthc              	   C   sL   |   | j¡ |  tj¡ tj}tj}tj}| j	 
|d| jd d||¡\}}d S )Nr   rq  )rã   rÍ   r~  r   r  r   rß   rs  rt  rÎ   ru  r"   )r&   râ   rw  rx  ry  r_  r)   r)   r*   Ú-test_enum_zones_while_dnsProperty_zero_lengthÅ  s    úz7TestZones.test_enum_zones_while_dnsProperty_zero_lengthc                 C   s.   |   | j¡ |  tj¡ | j| jtjd d S ©N)rÍ   r,  )rã   rÍ   r~  r   r  rè   ÚDNS_ZONE_UPDATE_SECUREr%   r)   r)   r*   Ú2test_rpc_zone_update_while_dnsProperty_zero_lengthÓ  s    z<TestZones.test_rpc_zone_update_while_dnsProperty_zero_lengthc                 C   s.   |   | j¡ |  tj¡ | j| jtjd d S r‚  )rã   rÍ   r~  r   Z!DSPROPERTY_ZONE_MASTER_SERVERS_DArè   rƒ  r%   r)   r)   r*   Ú8test_rpc_zone_update_while_other_dnsProperty_zero_lengthØ  s    zBTestZones.test_rpc_zone_update_while_other_dnsProperty_zero_length)F)F)F)T)$r_   r`   ra   r   rÒ   rÝ   rã   rè   rö   rû   r  r
  rî   r&  r/  r7  r8  r>  r?  rC  rG  rJ  rN  r`  ra  rd  rm  rz  rÓ   r{  r~  r€  r  r„  r…  rb   r)   r)   r'   r*   rÇ   -  s@   



		
		
=Ic5
rÇ   c                       s¢   e Zd Z‡ fdd„Z‡ f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‡  ZS )&ÚTestRPCRoundtripc                    sD   t t| ƒ ¡  t| _t| _t| _t| _t d| j | j| j¡| _	d S )NrÉ   )
r   r†  r   r    r!   r"   r#   r$   r   rÎ   r%   r'   r)   r*   r   Þ  s    ÿýzTestRPCRoundtrip.setUpc                    s   t t| ƒ ¡  d S r   )r   r†  rÒ   r%   r'   r)   r*   rÒ   ê  s    zTestRPCRoundtrip.tearDownNFc           	   	   C   s`   |pd|   ¡  }t||ƒ}t ¡ }||_|}d }|r<d }|}| j tjd| j|   ¡ |||¡ d S )Nzrpctestrec.r   )	r2   r   r   rD  r·   rÎ   rE  rß   r"   )	r&   Úfqnr÷   r   Údeleter·   Úadd_rec_bufZadd_argZdel_argr)   r)   r*   Ú
rpc_updateí  s$    
ùzTestRPCRoundtrip.rpc_updatec              
   C   sæ   d}d||   ¡ f }z| j||tjdd W nH tyt } z0|jd tjkr`|  d|jd  ¡ W Y d }~n
d }~0 0 z| j|tj|d W nJ tyÖ } z2|jd tj	krÀ|  d|jd  ¡ W Y d }~d S d }~0 0 |  d	¡ d S )
NZcnametest2_unqual_rec_loopr,   T)r‡  r÷   r   rˆ  r   zLRPC DNS gaven wrong error on pre-test cleanup for self referencing CNAME: %s)r‡  r   r÷   zDRPC DNS gaven wrong error on insertion of self referencing CNAME: %sz3RPC DNS allowed insertion of self referencing CNAME)
r2   rŠ  r   r   r   rÕ   r   Z$WERR_DNS_ERROR_RECORD_DOES_NOT_EXISTr™   ZWERR_DNS_ERROR_CNAME_LOOP)r&   ZcnameZ	cname_fqnrÖ   r)   r)   r*   Útest_rpc_self_referencing_cname  s(    ÿ
ÿÿz0TestRPCRoundtrip.test_rpc_self_referencing_cnamec                 C   sæ   ddg }}d||   ¡ f }ttjdƒ}t ¡ }||_z$| j tj	d| j
|   ¡ ||d ¡ W n2 tyŒ } z|  t|ƒ¡ W Y d }~n
d }~0 0 z0|  ||¡ W | j tj	d| j
|   ¡ |d |¡ n"| j tj	d| j
|   ¡ |d |¡ 0 d S )NZ
rpctextrecry   r,   z"\"This is a test\""r   ©r2   r   r   rl  r   rD  r·   rÎ   rE  rß   r"   r   r™   r®   r{   ©r&   r}   r~   r7   r·   r‰  rÖ   r)   r)   r*   Útest_update_add_txt_rpc_to_dns  sH    ù	$ùùz/TestRPCRoundtrip.test_update_add_txt_rpc_to_dnsc              
   C   s`  dg d¢ }}|   ||¡}| j|td\}}|  |tj¡ |  ||¡ |  t| j	| j|  
¡ d||  
¡ f tjdƒ¡ dg d¢ }}|   ||¡}| j|td\}}|  |tj¡ |  ||¡ |  t| j	| j|  
¡ d||  
¡ f tjdƒ¡ d	g d
¢ }}|   ||¡}| j|td\}}|  |tj¡ |  ||¡ |  t| j	| j|  
¡ d||  
¡ f tjdƒ¡ dS )rx   Úpad1textrec©ry   r—   r—   r.   r,   ú"\"This is a test\"" "" ""Úpad2textrec©ry   r—   r—   z	more textú&"\"This is a test\"" "" "" "more text"Úpad3textrec©r—   r—   ry   ú"" "" "\"This is a test\""N©rz   r:   r"   r;   r
   r<   r{   ZassertIsNotNoner   rÎ   r2   r   rl  r|   r)   r)   r*   Ú&test_update_add_null_padded_txt_record:  s^    ÿûÿÿúÿ	ÿúÿz7TestRPCRoundtrip.test_update_add_null_padded_txt_recordc                 C   sÌ  dg d¢ }}d| }d||   ¡ f }ttjdƒ}t ¡ }||_z$| j tj	d| j
|   ¡ ||d ¡ W n2 ty– } z|  t|ƒ¡ W Y d }~n
d }~0 0 z0|  ||¡ W | j tj	d| j
|   ¡ |d |¡ n"| j tj	d| j
|   ¡ |d |¡ 0 dg d¢ }}d| }d||   ¡ f }ttjd	ƒ}t ¡ }||_z$| j tj	d| j
|   ¡ ||d ¡ W n4 ty„ } z|  t|ƒ¡ W Y d }~n
d }~0 0 z0|  ||¡ W | j tj	d| j
|   ¡ |d |¡ n"| j tj	d| j
|   ¡ |d |¡ 0 d
g d¢ }}d| }d||   ¡ f }ttjdƒ}t ¡ }||_z$| j tj	d| j
|   ¡ ||d ¡ W n4 tyr } z|  t|ƒ¡ W Y d }~n
d }~0 0 z0|  ||¡ W | j tj	d| j
|   ¡ |d |¡ n"| j tj	d| j
|   ¡ |d |¡ 0 d S )Nr  r  Úrpcr,   r‘  r   r’  r“  r”  r•  r–  r—  rŒ  r  r)   r)   r*   Ú"test_update_add_padding_rpc_to_dnsh  sê    ÿù	$ùù	ÿù	$ùù	ÿù$ùùz3TestRPCRoundtrip.test_update_add_padding_rpc_to_dnsc              
   C   sð   ddg }}|   ||¡}| j|td\}}|  |tj¡ |  |dg¡ |  t| j	| j|  
¡ d||  
¡ f tjdƒ¡ dddg }}|   ||¡}| j|td\}}|  |tj¡ |  |ddg¡ |  t| j	| j|  
¡ d||  
¡ f tjdƒ¡ d	S )
rx   Znulltextrecz	NULL BYTEr.   ÚNULLr,   z"NULL"Znulltextrec2z"NULL" "NULL"Nr˜  r|   r)   r)   r*   Ú$test_update_add_null_char_txt_recordÌ  s,    ÿýÿýz5TestRPCRoundtrip.test_update_add_null_char_txt_recordc                 C   sà   d}d||   ¡ f }ttjdƒ}t ¡ }||_z$| j tj	d| j
|   ¡ ||d ¡ W n2 ty„ } z|  t|ƒ¡ W Y d }~n
d }~0 0 z2|  |dg¡ W | j tj	d| j
|   ¡ |d |¡ n"| j tj	d| j
|   ¡ |d |¡ 0 d S )NZrpcnulltextrecr,   z"NULL BYTE"r   rœ  rŒ  )r&   r}   r7   r·   r‰  rÖ   r)   r)   r*   Ú$test_update_add_null_char_rpc_to_dnsä  sH    ù	$ùùz5TestRPCRoundtrip.test_update_add_null_char_rpc_to_dnsc              
   C   sv   ddg }}|   ||¡}| j|td\}}|  |tj¡ |  ||¡ |  t| j	| j|  
¡ d||  
¡ f tjdƒ¡ dS )rx   Ú
hextextrecõ
   HIGHÃ¿BYTEr.   r,   õ   "HIGHÃ¿BYTE"Nr˜  r|   r)   r)   r*   Ú#test_update_add_hex_char_txt_record  s    ÿýz4TestRPCRoundtrip.test_update_add_hex_char_txt_recordc                 C   sî   ddg }}d| }d||   ¡ f }ttjdƒ}t ¡ }||_z$| j tj	d| j
|   ¡ ||d ¡ W n2 ty” } z|  t|ƒ¡ W Y d }~n
d }~0 0 z0|  ||¡ W | j tj	d| j
|   ¡ |d |¡ n"| j tj	d| j
|   ¡ |d |¡ 0 d S )NrŸ  r   rš  r,   r¡  r   rŒ  r  r)   r)   r*   Útest_update_add_hex_rpc_to_dns  sJ    ù	$ùùz/TestRPCRoundtrip.test_update_add_hex_rpc_to_dnsc              
   C   sv   ddg }}|   ||¡}| j|td\}}|  |tj¡ |  ||¡ |  t| j	| j|  
¡ d||  
¡ f tjdƒ¡ dS )rx   ÚslashtextrecúTh\=is=is a testr.   r,   ú"Th\\=is=is a test"Nr˜  r|   r)   r)   r*   Ú test_update_add_slash_txt_record2  s    ÿýz1TestRPCRoundtrip.test_update_add_slash_txt_recordc                 C   sî   ddg }}d| }d||   ¡ f }ttjdƒ}t ¡ }||_z$| j tj	d| j
|   ¡ ||d ¡ W n2 ty” } z|  t|ƒ¡ W Y d }~n
d }~0 0 z0|  ||¡ W | j tj	d| j
|   ¡ |d |¡ n"| j tj	d| j
|   ¡ |d |¡ 0 d S )Nr¤  r¥  rš  r,   r¦  r   rŒ  r  r)   r)   r*   Ú test_update_add_slash_rpc_to_dnsB  sJ    ù	$ùùz1TestRPCRoundtrip.test_update_add_slash_rpc_to_dnsc              
   C   sx   dddg }}|   ||¡}| j|td\}}|  |tj¡ |  ||¡ |  t| j	| j|  
¡ d||  
¡ f tjdƒ¡ dS )ú!test adding two txt records worksÚtextrec2ry   ú"and this is a test, too"r.   r,   ú2"\"This is a test\"" "\"and this is a test, too\""Nr˜  r|   r)   r)   r*   Útest_update_add_two_txt_recordsd  s    ÿÿýz0TestRPCRoundtrip.test_update_add_two_txt_recordsc                 C   sð   dddg }}d| }d||   ¡ f }ttjdƒ}t ¡ }||_z$| j tj	d| j
|   ¡ ||d ¡ W n2 ty– } z|  t|ƒ¡ W Y d }~n
d }~0 0 z0|  ||¡ W | j tj	d| j
|   ¡ |d |¡ n"| j tj	d| j
|   ¡ |d |¡ 0 d S )Nrª  ry   r«  rš  r,   r¬  r   rŒ  r  r)   r)   r*   Útest_update_add_two_rpc_to_dnss  sR    ÿÿù	$ùùz/TestRPCRoundtrip.test_update_add_two_rpc_to_dnsc              
   C   st   dg  }}|   ||¡}| j|td\}}|  |tj¡ |  ||¡ |  t| j	| j|  
¡ d||  
¡ f tjdƒ¡ dS )r©  Zemptytextrecr.   r,   r—   Nr˜  r|   r)   r)   r*   Ú!test_update_add_empty_txt_records—  s    
ÿýz2TestRPCRoundtrip.test_update_add_empty_txt_recordsc                 C   sä   dg  }}d||   ¡ f }ttjdƒ}t ¡ }||_z$| j tj	d| j
|   ¡ ||d ¡ W n2 tyŠ } z|  t|ƒ¡ W Y d }~n
d }~0 0 z0|  ||¡ W | j tj	d| j
|   ¡ |d |¡ n"| j tj	d| j
|   ¡ |d |¡ 0 d S )NZrpcemptytextrecr,   r—   r   rŒ  r  r)   r)   r*   Ú test_update_add_empty_rpc_to_dns¤  sH    
ù$ùùz1TestRPCRoundtrip.test_update_add_empty_rpc_to_dns)NNNF)r_   r`   ra   r   rÒ   rŠ  r‹  rŽ  r™  r›  r  rž  r¢  r£  r§  r¨  r­  r®  r¯  r°  rb   r)   r)   r'   r*   r†  Ý  s"   
!.d !"$r†  )ÚmoduleÚopts)EZ
__future__r   Zsambar   Z	samba.ndrr   r   Zsamba.samdbr   Z
samba.authr   rð   r   rU   ÚsysrÅ   rR   rÄ   r	   Zsamba.dcerpcr
   r   r   Zsamba.netcmd.dnsr   r   r   Zsamba.tests.subunitrunr   r   r   r   Zsamba.tests.dns_baser   Zsamba.getoptZgetoptZoptionsZoptparseZOptionParserÚparserZSambaOptionsZ	sambaoptsZadd_option_groupZ
add_optionZCredentialsOptionsZcredoptsZsubunitoptsÚ
parse_argsr²  rÕ   rÏ   r#   Zget_credentialsr$   r   rp   Zprint_usageÚexitr    r"   Zset_krb_forwardableZNO_KRB_FORWARDABLEr   rc   rŠ   r¼   rÇ   r†  r_   r)   r)   r)   r*   Ú<module>   sx   



ÿ




 i     &M     5   k