HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux spn-python 5.15.0-89-generic #99-Ubuntu SMP Mon Oct 30 20:42:41 UTC 2023 x86_64
User: arjun (1000)
PHP: 8.1.2-1ubuntu2.20
Disabled: NONE
Upload Files
File: //usr/lib/python3/dist-packages/samba/tests/__pycache__/dns.cpython-310.pyc
o

�/a_Q�@sddlmZddlmZmZddlmZddlmZddl	Z	ddl	m
Z
ddlZddlZddl
Z
ddlZddlmZddlmZddlmZmZmZdd	lmZdd
lmZmZddlmZmZddlmZmZdd
lmZddl m!Z"ddl#Z#e#�$d�Z%e"�&e%�Z'e%�(e'�e%j)ddddd�e"�*e%�Z+e%�(e+�ee%�Z,e%�(e,�e%�-�\Z.Z/e'�0�a1e+�2t1�a3e.j4a4e5e/�dkr�e%�6�e�7d�e/dZ8e/da9t3�:ej;�Gdd�de�Z<Gdd�de�Z=Gdd�de�Z>Gdd�de�Z?Gdd�de�Z@Gd d!�d!e�ZAeeBe,d"�dS)#�)�dsdb)�
ndr_unpack�ndr_pack)�SamDB)�system_sessionN)�ERR_OPERATIONS_ERROR)�credentials)�dns�dnsp�	dnsserver)�	TXTRecord)�record_from_string�dns_record_match)�SubunitOptions�TestProgram)�werror�WERRORError)�DNSTestz*dns.py <server name> <server ip> [options]z	--timeout�int�timeoutz Specify timeout for DNS requests)�type�dest�help��csleZdZ�fdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
�ZS)�TestSimpleQueriesc�0tt|���t|_t|_t|_t|_t|_dS�N)	�superr�setUp�server_name�server�	server_ip�lp�credsr��self��	__class__��1/usr/lib/python3/dist-packages/samba/tests/dns.pyrH�
zTestSimpleQueries.setUpcC�|�tj�}g}d|j|��f}|�|tjtj�}td|j	�|�
|�|�||�|j|t
d�\}}|�|tj�|�|tj�|�|jd�|�|jdj|j
�dS)�1create a query packet containing one query record�%s.%s�asking for ��hostrrN)�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�	questionsr9�q�response�response_packetr)r)r*�test_one_a_queryQ�
��z"TestSimpleQueries.test_one_a_querycCs�|�tj�}g}d|��}|�|tjtj�}td|j�|�	|�|�
||�|j|td�\}}|�
|tj�|�|tj�|�|jd�|�|jdjj��d|j|��f���dS)z=create a query packet containing one query record for the SOA�%sr/r0rrr.N)r2r	r3r4r5�
DNS_QTYPE_SOAr7r8r9r:r;r<r"r=r>r?r@rArBrC�mname�upperr!rDr)r)r*�test_one_SOA_queryds 
��z$TestSimpleQueries.test_one_SOA_querycCr,)z9create a query packet containing one query record via TCPr.r/r0rrN)r2r	r3r!r4r5r6r7r8r9r:r;�dns_transaction_tcpr"r=r>r?r@rArBrCrDr)r)r*�test_one_a_query_tcpxrKz&TestSimpleQueries.test_one_a_query_tcpcCs(|�tj�}g}d|j|��f}|�|tjtj�}td|j	�|�
|�|�||�|j|t
d�\}}|�|tj�|�|tj�|�|jd�|�tj�}g}d|j|��f}|�|tjtj�}td|j	�|�
|�|�||�|j|t
d�\}}|�|tj�|�|tj�|�|jd�dS)z6create a query packet causing an empty RCODE_OK answerr.r/r0rz
invalid-%s.%sN)r2r	r3r!r4r5�DNS_QTYPE_MXr7r8r9r:r;r<r"r=r>r?r@rA�DNS_RCODE_NXDOMAINrDr)r)r*�test_one_mx_query�s0
�
�z#TestSimpleQueries.test_one_mx_querycCs�|�tj�}g}d|j|��f}|�|tjtj�}|�|�dd|��f}|�|tjtj�}|�|�|�	||�z|j
|td�\}}|�|tj
�WdStjyYYdSw)z2create a query packet containing two query recordsr.�	bogusnamer0N)r2r	r3r!r4r5r6r7r:r;r<r"r=�DNS_RCODE_FORMERR�socketrrDr)r)r*�test_two_queries�s 

��z"TestSimpleQueries.test_two_queriesc	Cs�|�tj�}g}d|j|��f}|�|tjtj�}td|j	�|�
|�|�||�|j|t
d�\}}d}t�d�}|durC|d7}|�|tj�|�|tj�|�|j|�|�|jdj|j
�|durs|�|jdj|�dSdS)zcreate a QTYPE_ALL queryr.r/r0r�SERVER_IPV6Nr)r2r	r3r!r4r5�
DNS_QTYPE_ALLr7r8r9r:r;r<r"�os�getenvr=r>r?r@rArBrC)	r&rErFr9rGrHrI�num_answers�dc_ipv6r)r)r*�test_qtype_all_query�s,
�
��z&TestSimpleQueries.test_qtype_all_querycCs�|�tj�}g}d|j|��f}|�|tjtj�}|�|�|�	||�z|j
|td�\}}|�|tj
�WdStjyCYdSw)zcreate a QCLASS_NONE queryr.r0N)r2r	r3r!r4r5r[�DNS_QCLASS_NONEr:r;r<r"r=�DNS_RCODE_NOTIMPrXrrDr)r)r*�test_qclass_none_query�s"�
��z(TestSimpleQueries.test_qclass_none_querycCs�|�tj�}g}d|j|��f}|�|tjtj�}|�|�|�	||�|j
|td�\}}|�|tj
�|�|tj�|�|jd�|�|jd�dS)z!create a SOA query for a hostnamer.r0rrN)r2r	r3r!r4r5rMr7r:r;r<r"r=r>r?r@rA�nscountrDr)r)r*�test_soa_hostname_query�s
�z)TestSimpleQueries.test_soa_hostname_querycCs�|�tj�}g}d|��}|�|tjtj�}|�|�|�||�|j	|t
d�\}}|�|tj�|�
|tj�|�|jd�|�|jd�dS)z*create a SOA query for an unknown hostnamez	foobar.%sr0rrN)r2r	r3r4r5rMr7r:r;r<r"r=rTr?r@rArdrDr)r)r*�test_soa_unknown_hostname_query
s
�z1TestSimpleQueries.test_soa_unknown_hostname_querycCs�|�tj�}g}|��}|�|tjtj�}|�|�|�||�|j	|t
d�\}}|�|tj�|�
|tj�|�|jd�|�|jdjjd�dS)zcreate a SOA query for a domainr0rriN)r2r	r3r4r5rMr7r:r;r<r"r=r>r?r@rArBrC�minimumrDr)r)r*�test_soa_domain_querys
�z'TestSimpleQueries.test_soa_domain_query)�__name__�
__module__�__qualname__rrJrPrRrUrYr`rcrerfrh�
__classcell__r)r)r'r*rGs	 rcsdeZdZ�fdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Z�Z
S)�TestDNSUpdatescrr)	rrmrr r!r"r#r$rr%r'r)r*r0r+zTestDNSUpdates.setUpcCs�|�tj�}g}d|j|��f}|�|tjtj�}|�|�|��}|�|tjtj�}|�|�|�	||�z|j
|td�\}}|�|tj
�WdStjyUYdSw)zcreate two update requestsr.r0N)r2r	�DNS_OPCODE_UPDATEr!r4r5r6r7r:r;r<r"r=rWrXr�r&rE�updatesr9�urHrIr)r)r*�test_two_updates9s 

��zTestDNSUpdates.test_two_updatescCsd|�tj�}g}|��}|�|tjtj�}|�|�|�||�|j	|t
d�\}}|�|tj�dS)z"create update with DNS_QCLASS_NONEr0N)
r2r	rnr4r5r6rar:r;r<r"r=rbror)r)r*�test_update_wrong_qclassRs
�z'TestDNSUpdates.test_update_wrong_qclassc	Cs�|�tj�}g}|��}|�|tjtj�}|�|�|�||�g}t�	�}d|j
|��f|_tj|_
tj|_d|_d|_|�|�t|�|_||_z|j|td�\}}|�|tj�WdStjyiYdSw)ztest update with a non-null TTLr.rrr0N)r2r	rnr4r5rMr7r:r;�res_recr!r9�
DNS_QTYPE_TXT�rr_typera�rr_class�ttl�length�lenrArBr<r"r=rWrXr�	r&rErpr9rq�prereqs�rrHrIr)r)r*�$test_update_prereq_with_non_null_ttl`s.


��z3TestDNSUpdates.test_update_prereq_with_non_null_ttlc	Cs�|�tj�}g}|��}|�|tjtj�}|�|�|�||�g}t�	�}d|j
|��f|_tj|_
tj|_d|_d|_|�|�t|�|_||_|j|td�\}}|�|tj�dS)z"test update with a non-null lengthr.rrr0N)r2r	rnr4r5rMr7r:r;rtr!r9rurv�DNS_QCLASS_ANYrwrxryrzrArBr<r"r=�DNS_RCODE_NXRRSETr{r)r)r*�'test_update_prereq_with_non_null_length�s&


�z6TestDNSUpdates.test_update_prereq_with_non_null_lengthc	Cs�|�tj�}g}|��}|�|tjtj�}|�|�|�||�g}t�	�}d|��|_
tj|_tj
|_d|_d|_|�|�t|�|_||_|j|td�\}}|�|tj�dS)z#test update with a nonexisting namez
idontexist.%srr0N)r2r	rnr4r5rMr7r:r;rtr9rurvrrwrxryrzrArBr<r"r=r�r{r)r)r*�#test_update_prereq_nonexisting_name�s&


�z2TestDNSUpdates.test_update_prereq_nonexisting_namecCsHddg}}|�||�}|j|td�\}}|�|tj�|�||�dS)�test adding records works�textrec�"This is a test"r0N)�make_txt_updater<r"r=r	r>�check_query_txt�r&�prefix�txtrErHrIr)r)r*�test_update_add_txt_record�s�z)TestDNSUpdates.test_update_add_txt_recordcCs4d|��}|�tj�}g}|��}|�|tjtj�}|�|�|�||�g}t�	�}||_
tj|_tj|_
d|_d|_|�dg�}||_|�|�t|�|_||_|j|td�\}}	|�|tj�|�tj�}g}
|�|tjtj�}|
�|�|�||
�|j|td�\}}	|�|tj�|�tj�}g}|��}|�|tjtj�}|�|�|�||�g}t�	�}||_
tj|_tj|_
d|_d|_|�dg�}||_|�|�t|�|_||_|j|td�\}}	|�|tj�|�tj�}g}
|�|tjtj�}|
�|�|�||
�|j|td�\}}	|�|tj�dS)zTest if deleting records workszdeleterec.%s��r�r0rN�r4r2r	rnr5rMr7r:r;rtr9rurvrwrxry�make_txt_recordrCrzrd�nsrecsr<r"r=r>r3rarT�r&�NAMErErpr9rqr}rCrHrIrFrGr)r)r*�test_delete_record�sv


�
�


�
�z!TestDNSUpdates.test_delete_recordcCsFd|��}|�tj�}g}|��}|�|tjtj�}|�|�|�||�g}t�	�}||_
tj|_tj|_
d|_d|_|�dg�}||_|�|�t|�|_||_|j|td�\}}	|�|tj�|�tj�}g}
|�|tjtj�}|
�|�|�||
�|j|td�\}}	|�|tj�|�tj�}g}|��}|�|tjtj�}|�|�|�||�g}t�	�}||_
tj|_tj|_
d|_d|_|�dg�}||_|�|�t|�|_||_|j|td�\}}	|�|tj�|�tj�}g}
|�|tjtj�}|
�|�|�||
�|j|td�\}}	|�|tj�|�tj�}g}|��}|�|tjtj�}|�|�|�||�g}t�	�}||_
tj|_tj|_
d|_d|_|�dg�}||_|�|�t|�|_||_|j|td�\}}	|�|tj�|�tj�}g}
|�|tjtj�}|
�|�|�||
�|j|td�\}}	|�|tj�dS)z:Test if adding, deleting and then readding a records workszreaddrec.%sr�r�r�r0rNr�r�r)r)r*�test_readd_records�


�
�


�
�


�
�z TestDNSUpdates.test_readd_recordcCs�|�tj�}g}|��}|�|tjtj�}|�|�|�||�g}t�	�}d|��|_
tj|_tj|_
d|_d|_t��}d|_d|��|_||_|�|�t|�|_||_|j|td�\}}|�|tj�|�tj�}g}	d|��}|�|tjtj�}
|	�|
�|�||	�|j|td�\}}|�|tj�|�|jd�|jd}|�|jtj�|�|jjd�|�|jjd|���d	S)
ztest adding MX records worksrLr�r��
zmail.%sr0rrN)r2r	rnr4r5rMr7r:r;rtr9rSrvrwrxry�	mx_record�
preference�exchangerCrzrdr�r<r"r=r>r3r@rArB)r&rErpr9rqr}rCrHrIrFrG�ansr)r)r*�test_update_add_mx_record�sJ


�
�
z(TestDNSUpdates.test_update_add_mx_record)rirjrkrrrrsr~r�r�r�r�r�r�rlr)r)r'r*rm/s	"	Rxrmcs|eZdZdd�Z�fdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Z�ZS)�TestComplexQueriesc
Cs�|�tj�}|��}|�|tjtj�}|�||g�t��}||_	||_
tj|_d|_d|_
||_d|_|g|_|j|td�\}}	|�|tj�dS)Nr�r�rr0)r2r	rnr4r5rMr7r;rtr9rvrwrxryrCrdr�r<r"r=r>)
r&�key�value�qtyperEr9rqr}rHrIr)r)r*�make_dns_update�s �z"TestComplexQueries.make_dns_updatecrr)	rr�rr r!r"r#r$rr%r'r)r*r�s
zTestComplexQueries.setUpcCs�z�d|��}d|j|��f}|�||tj�|�tj�}g}d|��}|�|tjtj	�}t
d|j�|�|�|�
||�|j||jd�\}}|�|tj�|�|tj�|�|jd�|�|jdjtj�|�|jdjd|j|��f�|�|jdjtj�|�|jdj|j�W|�tj�}g}|��}|�|tjtj	�}	|�|	�|�
||�g}t��}
d|��|
_tj|
_tj|
_d|
_d|
_d|j|��f|
_|�|
�t|�|_ ||_!|j||jd�\}}|�|tj�d	S|�tj�}g}|��}|�|tjtj	�}	|�|	�|�
||�g}t��}
d|��|
_tj|
_tj|
_d|
_d|
_d|j|��f|
_|�|
�t|�|_ ||_!|j||jd�\}}|�|tj�w)
r-z
cname_test.%sr.r/r0rrrr�N)"r4r!r�r	�DNS_QTYPE_CNAMEr2r3r5r6r7r8r9r:r;r<r"r=r>r?r@rArBrvrCrnrMrtrarwrxryrzrdr�)r&r9rCrErFrGrHrIrprqr}r)r)r*rJ�s��
����


���


�z#TestComplexQueries.test_one_a_queryc	Cstd|��}d|��}d|��}|�||tj�|�||tj�|�|ttj�|�tj�}g}|�|tjtj	�}|�
|�|�||�|j|td�\}}|�
|tj�|�|tj�|�|jd�|�|jdjtj�|�|jdj|�|�|jdj|�|�|jdjtj�|�|jdj|�|�|jdj|�|�|jdjtj�|�|jdj|j�dS)	N�cnamechain0.%s�cnamechain1.%s�cnamechain2.%sr0�rrr)r4r�r	r�r"r6r2r3r5r7r:r;r<r=r>r?r@rArBrvr9rC�	r&�name0�name1�name2rErFrGrHrIr)r)r*�test_cname_two_chains8
�
��z'TestComplexQueries.test_cname_two_chaincCsDd|��}z
|�|dtj�Wn
tyYdSw|�d�dS)Nzcnamedotprefix0.%s�z1Successfully added empty CNAME, which is invalid.)r4r�r	r��AssertionError�fail)r&r�r)r)r*�test_invalid_empty_cname:s�z+TestComplexQueries.test_invalid_empty_cnamec	CsHd|��}d|��}d|��}|�||tj�|�||tj�|�|ttj�|�tj�}g}|�|tj	tj
�}|�|�|�||�|j
|td�\}}|�|tj�|�|tj�|�|jd�|�|jdjtj�|�|jdj|�|�|jdj|�|�|jdjtj�|�|jdj|�|�|jdj|�dS)Nr�r�r�r0rrr)r4r�r	r�r"r6r2r3r5rur7r:r;r<r=r>r?r@rArBrvr9rCr�r)r)r*�'test_cname_two_chain_not_matching_qtypeCs0
�
�z:TestComplexQueries.test_cname_two_chain_not_matching_qtypec
Cs�d|��}d|��}d|��}|�||tj�|�||tj�|�||tj�|�tj�}g}|�|tjtj	�}|�
|�|�||�|j||j
d�\}}d}	|�t|j�|	�dS)Nzcnamelooptestrec.zcnamelooptestrec2.zcnamelooptestrec3.r0�)r4r�r
�DNS_TYPE_CNAMEr2r	r3r5r6r7r:r;r<r"r@rzrB)
r&�cname1�cname2�cname3rErFrGrHrI�max_recursion_depthr)r)r*�test_cname_loopcs$�
�z"TestComplexQueries.test_cname_loopc
Cs�d�||���}d}|d}td|d�D]
}||�}|�|||�q|�tj�}g}	|�||tj�}
|	�	|
�|�
||	�|j||jd�\}}|�
t|j�|�dS)Nzlimittestrec{0}.{1}r��rr0)�formatr4�ranger�r2r	r3r5r7r:r;r<r"r@rzrB)
r&�rtype�rec_genr9�limit�num_recs_to_enter�i�iprErFrGrHrIr)r)r*�max_rec_test|s"�
�zTestComplexQueries.max_rec_testcC�dd�}|jtj|d�dS)NcS�dt|�S)N�127.0.0.��str�r�r)r)r*�ip4_gen��z7TestComplexQueries.test_record_limit_A.<locals>.ip4_gen�r�r�)r�r	r6)r&r�r)r)r*�test_record_limit_A��z&TestComplexQueries.test_record_limit_AcCr�)NcSr�)NzAAAA:0:0:0:0:0:0:r�r�r)r)r*�ip6_gen�r�z:TestComplexQueries.test_record_limit_AAAA.<locals>.ip6_genr�)r�r	�DNS_QTYPE_AAAA)r&r�r)r)r*�test_record_limit_AAAA�r�z)TestComplexQueries.test_record_limit_AAAAcCr�)NcSs,t��}d|_d|_d|_dt|�|_|S)Nr�\�
srvtestrec)r	�
srv_record�priority�weight�portr��target)r��recr)r)r*�srv_gen�sz9TestComplexQueries.test_record_limit_SRV.<locals>.srv_genr�)r�r	�
DNS_QTYPE_SRV)r&r�r)r)r*�test_record_limit_SRV�sz(TestComplexQueries.test_record_limit_SRVcCs�d|��}d|��}d|��}d}d}|d}|�||tj�|�||tj�|d}td|d�D]}|t|�}	|�||	tj�q5|�tj	�}
g}|�
|tjtj�}|�|�|�
|
|�|j|
|jd	�\}
}|�t|
j�|�dS)
Nzcnamelimittestrec.zcnamelimittestrec2.zcnamelimittestrec3.r�r�r�rrr0)r4r�r
r�r�r�r	r6r2r3r5r7r:r;r<r"r@rzrB)r&r�r�r��	ip_prefixr�r��num_arecs_to_enterr�r�rErFrGrHrIr)r)r*�test_cname_limit�s.�
�z#TestComplexQueries.test_cname_limitc	Cs�d|��}d|��}d|��}|�||tj�|�||tj�|�tj�}g}|�|tjtj	�}|�
|�|�||�|j||j
d�\}}|�t|j�d�|�|jdj|�|�|jdj|�dS)Nzcnameanytestrec.zcnameanytestrec2.zcnameanytestrec3.r0rr)r4r�r
r�r2r	r3r5r[r7r:r;r<r"r@rzrBr9rC)	r&r�r�r�rErFrGrHrIr)r)r*�test_cname_any_query�s$�
�z'TestComplexQueries.test_cname_any_query)rirjrkr�rrJr�r�r�r�r�r�r�r�r�r�rlr)r)r'r*r��s
?!	 r�cs,eZdZ�fdd�Zdd�Zdd�Z�ZS)�TestInvalidQueriescrr)	rr�rr r!r"r#r$rr%r'r)r*r�r+zTestInvalidQueries.setUpcCs
d}z!t�tjtjd�}|�|jdf�|�dd�W|dur#|��n
|dur-|��ww|�tj	�}g}d|j
|��f}|�|tj
tj�}td|j�|�|�|�||�|j||jd�\}}|�|tj�|�|tj	�|�|jd�|�|jdj|j�dS)	zTsend 0 bytes follows by create a query packet
           containing one query recordNr�5�r.r/r0r)rX�AF_INET�
SOCK_DGRAM�connectr"�send�closer2r	r3r!r4r5r6r7r8r9r:r;r<r=r>r?r@rArBrC)r&�srErFr9rGrHrIr)r)r*rJ�s4��
�
��z#TestInvalidQueries.test_one_a_queryc
Cs,|�tj�}g}dd|��f}|�|tjtj�}td|j�|�	|�|�
||�|jtjO_d}zWz?t
�|�}t�tjtjd�}|�t�|j}|�|df�t�dt|��}||7}|�|d�|�dd�}	|�dt|	��Wn
tjy~YnwW|dur�|��dSdS|dur�|��ww)	zsend a reply instead of a queryr.�fakefakefaker/Nrr�z!Hi)r2r	r3r4r5r6r7r8r9r:r;�	operation�DNS_FLAG_REPLY�ndrrrXr��SOCK_STREAM�
settimeoutrr"r��struct�packrzr��recvr@r�)
r&rErFr9rGr��send_packetr1�
tcp_packet�recv_packetr)r)r*�test_one_a_replys:


���
�z#TestInvalidQueries.test_one_a_reply)rirjrkrrJr�rlr)r)r'r*r��s	r�cs*eZdZ�fdd�Z�fdd�ZdEdd�ZdEdd	�Zd
d�Zdd
�Zdd�Z	dd�Z
dd�Zdd�Zdd�Z
dEdd�Zdddgfdd�Zdd �ZdFd!d"�Zd#d$�Zd%d&�Zd'd(�Zd)d*�Zd+d,�Zd-d.�Zd/d0�Zd1d2�Zd3d4�Zd5d6�Zd7d8�Zd9d:�Zd;d<�Zd=d>�Zd?d@�Z dAdB�Z!dCdD�Z"�Z#S)G�	TestZonescs�tt|���t|_t|_t|_t|_t|_d|_	t
�
d|j|j|j�|_td|j|�
�t�|jd�|_d|j	dt|j���|_dS)N�test.lan�ncacn_ip_tcp:%s[sign]�ldap://��urlr#�session_inforzDC=z#,CN=MicrosoftDNS,DC=DomainDNSZones,)rr�rr r!r"r#r$r�zoner�rpc_connr�get_loadparmr�samdbr��get_default_basedn�zone_dnr%r'r)r*r-s,��
��
�zTestZones.setUpc
s^tt|���z	|�|j�WdSty.}z|j\}}|tjkr#�WYd}~dSd}~wwr)	rr��tearDown�delete_zoner��RuntimeError�argsr�"WERR_DNS_ERROR_ZONE_DOES_NOT_EXIST)r&�e�num�stringr'r)r*rCs

���zTestZones.tearDownFcCs@t��}||_tj|_t|�|_tj|_	d|_
d|_tj|_
|S)Nr)r�!DNS_RPC_ZONE_CREATE_INFO_LONGHORN�pszZoneNamer
�DNS_ZONE_TYPE_PRIMARY�
dwZoneTyper�fAging�DNS_DP_DOMAIN_DEFAULT�	dwDpFlags�
fDsIntegrated�
fLoadExisting�DNS_ZONE_UPDATE_UNSECURE�fAllowUpdate)r&r��
aging_enabled�zone_creater)r)r*�
make_zone_objMs
zTestZones.make_zone_objc
Csh|�||�}ztj}|j�|d|jdddtj|�WdSty3}z|�|�WYd}~dSd}~ww)Nr�
ZoneCreate)	rr�DNS_CLIENT_VERSION_LONGHORNr��DnssrvOperation2r"�DNSSRV_TYPEID_ZONE_CREATErr�)r&r�rr�client_versionrr)r)r*�create_zoneXs 
���zTestZones.create_zonecKs�|��D]>\}}t��}||_||_tj}tj}z|j�|d|j	|j
dd||�WqtyB}z
|�t
|��WYd}~qd}~wwdS)Nr�ResetDwordProperty)�itemsr�DNS_RPC_NAME_AND_PARAM�dwParam�pszNodeNamer�DNSSRV_TYPEID_NAME_AND_PARAMr�rr!r�rr�r�)r&�kwargsr��val�
name_paramr�nap_typerr)r)r*�
set_paramsgs*����zTestZones.set_paramscCs^d�||j�}|�|�}|D]}||�q|dd�|D�d�}|j�tj�|j|tj��dS)Nz
DC={0},{1}cSsg|]}t|��qSr))r��.0r}r)r)r*�
<listcomp>�sz1TestZones.ldap_modify_dnsrecs.<locals>.<listcomp>)�dn�	dnsRecord)	r�r��ldap_get_dns_recordsr��modify�ldb�Message�	from_dict�FLAG_MOD_REPLACE)r&r9�funcr*�dns_recsr��update_dictr)r)r*�ldap_modify_dnsrecs{s


�zTestZones.ldap_modify_dnsrecscsf|�|�|j�}|j||jd�\}}|�|tj�|�|�}�fdd�|D�}|�t	|�d�|dS)Nr0csg|]
}|jj�kr|�qSr))�datar�r'�r�r)r*r)�sz/TestZones.dns_update_record.<locals>.<listcomp>rr)
r�r�r<r"r=r	r>r,r@rz)r&r�r�rE�coderH�recsr)r7r*�dns_update_record�s
zTestZones.dns_update_recordcCs6|d|}t��}d|_tj|_|j�||g�dS)N�.i�)r
�DnssrvRpcRecord�dwTimeStamp�DNS_TYPE_TOMBSTONE�wTyper��dns_replace)r&r�r�r�r9�tor)r)r*�
dns_tombstone�s
zTestZones.dns_tombstonecCs$d�|�}|jj|jtj|dgd�S)Nz"(&(objectClass=dnsNode)(name={0}))�*��base�scope�
expression�attrs)r�r��searchr�r.�
SCOPE_SUBTREE)r&r9�exprr)r)r*�ldap_get_records�s
�zTestZones.ldap_get_recordscCs"|�|�}dd�|d�d�D�S)NcS�g|]}ttj|��qSr))rr
r<r'r)r)r*r)���z2TestZones.ldap_get_dns_records.<locals>.<listcomp>rr+)rL�get)r&r9�recordsr)r)r*r,�s
�zTestZones.ldap_get_dns_recordscs�|jj|jtjdd�|j�dgd�}|�t|�d�dd�|d�	d�D�}idd	�dd
�dd�d
d�dd�dd�dd�dd�dd�dd�dd�dd�dd �d!d"�d#d$�d%d&�d'd(���fd)d*�|D�S)+N�(&(objectClass=dnsZone)�(name={0}))�dNSPropertyrDrcSrMr)�rr
�DnsPropertyr'r)r)r*r)�rNz4TestZones.ldap_get_zone_settings.<locals>.<listcomp>r�EMPTY�TYPEr�ALLOW_UPDATE��SECURE_TIME��NOREFRESH_INTERVAL��SCAVENGING_SERVERS��AGING_ENABLED_TIME� �REFRESH_INTERVAL�@�AGING_STATE��DELETED_FROM_HOSTNAME��MASTER_SERVERS��AUTO_NS_SERVERS��DCPROMO_CONVERT��SCAVENGING_SERVERS_DA��MASTER_SERVERS_DA��
NS_SERVERS_DA��NODE_DBFLAGScsi|]}�|j��|j�qSr))�id�lowerr6�r(rE��
zone_prop_idsr)r*�
<dictcomp>�sz4TestZones.ldap_get_zone_settings.<locals>.<dictcomp>)
r�rIr�r.�
SCOPE_BASEr�r�r@rzrO)r&rP�propsr)rxr*�ldap_get_zone_settings�sX
�����������	�
���
����z TestZones.ldap_get_zone_settingscCs0|j|j|d�|jddtt|��tjd�dS)N�rr��NoRefreshInterval�RefreshInterval�Aging�AllowUpdate)rr�r&r�boolr
r)r&�enabler)r)r*�	set_aging�s

�zTestZones.set_agingT�	agingtest�test txtcCsT|jdd�|��}|�|ddu�|�|d�|�ddg�}|�|jd�dS)NT�r��aging_stater�r�r)r�r}�
assertTruer:�assertNotEqualr=)r&r�r9r��settingsr�r)r)r*�test_set_aging��zTestZones.test_set_agingcCsT|jdd�|��}|�|ddu�|�|d�|�ddg�}|�|jd�dS)NFr�r�r�r�r)r�r}r��assertFalser:r�r=)r&r�r�r)r)r*�test_set_aging_disabled�r�z!TestZones.test_set_aging_disabledc	s�ddg}}�jdd���||�}|s�jdd�d���fdd	�}��||���|�}��t|�d
�|d}��|j|j����||�}|rN|n|}��|j|j�dS)Nr�r�Tr�r)r�rcs"��|jdk�|j�8_dS)Nr�r�r=�r���decr&r)r*�mod_ts�sz+TestZones.test_aging_update.<locals>.mod_tsr)r�r:r&r5r,r@rzr=)	r&r�r9r��
before_modr��	after_mod�after_update�after_should_equalr)r�r*�test_aging_update�s&
��zTestZones.test_aging_updatecCs|jdd�dS)NFr�)r�r%r)r)r*�test_aging_update_disabled�sz$TestZones.test_aging_update_disabledcs�ddg}}�j�jdd�d��j��dtjd���||�}��fdd	�}��||���||�}��fd
d	�}��||���||�}��|j|j�d���|j|j�dS)Nr�r�Tr~r�rrcs&��|jdk�|j�d8_dS�Nrrr�r���intervalr&r)r*r��sz,TestZones.test_aging_refresh.<locals>.mod_tscs*��|jdk�|j��d8_dSr�r�r�r�r)r*r�sr)	rr�r&r
rr:r5r@r=)r&r9r�r�r��update_during_norefresh�update_during_refreshr)r�r*�test_aging_refresh�s*���zTestZones.test_aging_refreshc	Csxddg}}|jdd�t��}t|�|_|j�tjd|j|j	||d�|�
|�}|�t|�d�|�|dj
d�dS)Nr�r�Tr�rr)r�r�DNS_RPC_RECORD_BUFrr�r��DnssrvUpdateRecord2rr"r�r,r@rzr=)r&r9r��rec_bufr9r)r)r*�test_rpc_add_no_timestamp
s 
�
z#TestZones.test_rpc_add_no_timestampc	Cslddg}}dg}|jdd�t��}t|�|_|j�tjd|j|j	||d�|�
||�}|�|jd�dS)Nr�r��	test txt2Tr�r)
r�rr�rr�r�r�rr"r�r:r@r=)r&r9r��txt2r��rec2r)r)r*�!test_static_record_dynamic_updates 
�	z+TestZones.test_static_record_dynamic_updatec	Cs�ddg}}dg}dg}|jdd�|�||�t��}t|�|_|j�tjd|j	|j
||d�|�||�|�|�}dd	�|D�}|�|t
|�jd�|�|t
|�jd�|�|t
|�jd�dS)
Nr�r�r��	test txt3Tr�rcSsi|]	}t|jj�|�qSr)�r�r6r'r)r)r*rzG�z?TestZones.test_dynamic_record_static_update.<locals>.<dictcomp>)r�r:rr�rr�r�r�rr"r�r,r�r�r=r@)r&r9r�r��txt3r�r9r)r)r*�!test_dynamic_record_static_update0s,
�	
z+TestZones.test_dynamic_record_static_updatec
s�|��}t|��|t�|jd�|_ddg}�ddg}}ddg}}dd	g}}d
dg}	}
|j|jdd
�d}|j||dt	j
d�|�|��|�|��|�||�|�|��|�||�|�||�}�fdd�}
|�||
�|�||
�t
��}t|�|_|j�t
jd|j|j||d�|�|	|
�|�|	|
|j�|�|�d}|�t|j�d�}z|jj|jtj|dgd�}Wntjy�}z
|�t |��WYd}~nd}~wwdd�|D�}|�!|t"||g��dS)Nr�r�r��
agingtest2r��
agingtest3r��
agingtest4�	test txt4�
agingtest5�	test txt5Tr~r�rrcs"|jj�kr|jd8_dSdS)Nr)r6r�r=r�r7r)r*r�is�z>TestZones.test_dns_tombstone_custom_match_rule.<locals>.mod_tsr�'(dnsRecord:1.3.6.1.4.1.7165.4.5.3:={0})rCrDcSsh|]	}t|�d���qS)r9)r�rOr'r)r)r*�	<setcomp>�r�zATestZones.test_dns_tombstone_custom_match_rule.<locals>.<setcomp>)#r�r�	samdb_urlrr$r�rr�r&r
rr:r5rr�rr�r�r�rr"rBr,r�rr=rIr�r.rJ�LdbErrorr�r�r@�set)r&r#r9r�r��name3r��name4�txt4�name5�txt5r��last_updater�r�rK�resr�
updated_namesr)r7r*�$test_dns_tombstone_custom_match_ruleLsh
��
�


���z.TestZones.test_dns_tombstone_custom_match_rulec
Cs�|��}t|��|t�|jd�|_|j|jdd�d}|j||dt	j
d�d}|�d�}z|jj|j
tj|dgd	�}WntjyU}z
|�t|��WYd}~nd}~ww|�d
t|��dS)Nr�Tr~r�rrr�rCrDr)r�rr�rr$r�rr�r&r
rr�rIr�r.rJr�r�r�r@rz)r&r#r�rKr�rr)r)r*�/test_dns_tombstone_custom_match_rule_no_records�s.
��

���z9TestZones.test_dns_tombstone_custom_match_rule_no_recordsc	
Cs�|j|jdd�tt��tt�|jd�}d}|j|jt	j
|dgd�}|�t|�d�zd}|j|jt	j
|dgd�}|�t|�d�|�
d	�Wnt	jye}z|j\}}|�|t�WYd}~nd}~wwzd
}|j|jt	j
|dgd�}|�t|�d�|�
d	�Wnt	jy�}z|j\}}|�|t�WYd}~nd}~wwz"d}|�d�}|j|jt	j
|dgd�}|�t|�d�|�
d	�Wnt	jy�}z|j\}}|�|t�WYd}~nd}~wwzd
}|j|jt	j
|dgd�}|�t|�d�|�
d	�Wnt	j�y}z|j\}}|�|t�WYd}~nd}~wwz+td|j|��|jd�}d}|j|jt	j
|dgd�}|�t|�d�|�
d	�WdSt	j�yk}z|j\}}|�|t�WYd}~dSd}~ww)NTr~r�z'(dnsProperty:1.3.6.1.4.1.7165.4.5.3:=1)rCrDrz$(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:=-)r��A11111111111111111111111111111111111111111111111111111111111111111z+(dnsRecord:1.3.6.1.4.1.7165.4.5.3:=expired)r�)r�r#rz%(dnsRecord:1.3.6.1.4.1.7165.4.5.3:=2))rr�rr#r�rr$rIr�r.rJr@rzr�r�rrr�r"r�)	r&r�rKr�rr�msg�_�dbr)r)r*�)test_dns_tombstone_custom_match_rule_fail�s����
���
��
�
���
��
��
��z3TestZones.test_dns_tombstone_custom_match_rule_failcs&���}t|��|t��jd��_�j�jdd�d��j��dt	j
d�ddg}�dd	g}}d
dg}}dd
g}}ddg}	}
��|����|����||���|����||���||���||�j���
|�}��d|d���|dddd���|	|
���|	|
�j���|	|
���
|	�}��d|d���|dddd���||�����fdd�}�fdd�}
��||���||���||���|	|
���tttdd���t��j���|�}��t|�d���|djt	j���
|�}��d|d���|dddd���|�}��t|�d���|djt	j���|djj|���|�}��t|�d�dd�|D�}��|t|�t|�h���|djt	j���|djt	j���|�}��t|�d���|djt	j���
|�}��d|d���|dddd���|	�}��t|�d���|djt	j���
|	�}��d|d���|dddd�dD]7}|�r�dnd���fdd�}��||�t��j���
|�}|�r��t|�d��qو�t|�d��q�dS)Nr�Tr~rrr�r�r�r�r�r�r�r�r�r��
dNSTombstonedrsTRUEsFALSEcs6��|jdk�|jj�kr|j�d8_dSdS)Nrr�)r�r=r6r�r�)r�r&r�r)r*r�s�z/TestZones.test_basic_scavenging.<locals>.mod_tscs|j�d8_dS)Nr�)r=r�)r�r)r*�
mod_ts_allsz3TestZones.test_basic_scavenging.<locals>.mod_ts_all�_scavenge_dns_recordsrcSsh|]}t|jj��qSr)r�r'r)r)r*r�.sz2TestZones.test_basic_scavenging.<locals>.<setcomp>)FT���cs�jd�|_dS)NiP)r=r6r�)�inc�last_addr)r*r�Ds)r�rr�rr$r�rr�r&r
rr:rBrL�assertInr@r5r��callable�getattrrr�r,rzr?r>�DNS_TYPE_TXTr6r��_dns_delete_tombstones)r&r#r9r�r�r�r�r�r�r�r�rPr�r�r9�txts�make_it_workr))r�r�r�r&r�r*�test_basic_scavenging�s�
��










�zTestZones.test_basic_scavengingc
	s��fdd�}���j�|�jd����jd�|�jd�tj}tj}tj}�j�|d�jdd||�\}}��	�j���	�jd�g}dd	�|j
D�}|D]
}	|	��j�ra|�|	�qT��
t|�d
���
t|��jd�jh�dS)Nc
s�z��|�}tj}tj}�j�|d�jddd||�Wn"ty=}z|j\}}|t	j
kr2��|�WYd}~dSd}~ww��d�|��dS)NrrzZone {} should already exist)
rrrrr�rr"rrr�"WERR_DNS_ERROR_ZONE_ALREADY_EXISTSr�r�)r�rr�zc_typer�enumr�r%r)r*�create_zone_expect_existsPs*
�


��zFTestZones.test_fully_qualified_zone.<locals>.create_zone_expect_existsr;z2.�2r�	EnumZonescSsg|]}t|j��qSr))r�r	)r(�zr)r)r*r)|sz7TestZones.test_fully_qualified_zone.<locals>.<listcomp>r)rr�rr�DNS_ZONE_REQUEST_PRIMARY�DNSSRV_TYPEID_DWORDr��DnssrvComplexOperation2r"r�	ZoneArray�
startswithr:r@rzr�)
r&r�r�request_filter�tid�typeidr��zones_we_just_made�zonesr�r)r%r*�test_fully_qualified_zoneNs4�
� z#TestZones.test_fully_qualified_zonec
Cs$|j�tjd|j|ddtjd�dS)Nr�DeleteZoneFromDs)r�rrrr"�DNSSRV_TYPEID_NULL)r&r�r)r)r*r�s
�zTestZones.delete_zonecCsd}|�tj�}g}|�|tjtj�}|�|�|�||�|j|t	d�\}}|�
|tj�|�|tj�|�
|jd�|�|�|j|t	d�\}}|�
|tj�|�|tj�|�
|jd�|�
|jdjtj�|�|�|j|t	d�\}}|�
|tj�|�|tj�|�
|jd�dS)Nr�r0rr)r2r	r3r5rMr7r:r;r<r"r=rTr?r@rArr>rBrvr)r&r�rErFrGrHrIr)r)r*�test_soa_query�s0
�
�
�zTestZones.test_soa_querycs�|jj|jtjdd�|j�dgd�}|�t|�d�dd�|d�	d�D�}�fd	d�|D�}t
��}�|_d|_
d|_|t�|�g7}|dj}||d
�}|j�tj�|j|tj��dS)NrQrRrSrDrcSrMr)rTr'r)r)r*r)�rNz9TestZones.set_dnsProperty_zero_length.<locals>.<listcomp>rcs g|]}|j�krt�|��qSr))rur�rrw��dnsproperty_idr)r*r)�s )r*�dnsProperty)r�rIr�r.r{r�r�r@rzrOr
�DnsProperty_shortru�
namelengthr9r�rr*r-r/r0r1)r&r�rPr|�	new_props�
zero_length_pr*r4r)r�r*�set_dnsProperty_zero_length�s,
���


�z%TestZones.set_dnsProperty_zero_lengthcCs8|�|j�|�tj�|�ddg�}|�|jd�dS)N�dnspropertytestr�r)rr�r�r
�DSPROPERTY_ZONE_ALLOW_UPDATEr:r�r=)r&r�r)r)r*�)test_update_while_dnsProperty_zero_length�sz3TestZones.test_update_while_dnsProperty_zero_lengthc	CsL|�|j�|�tj�tj}tj}tj}|j	�
|d|jdd||�\}}dS)Nrr�)rr�r�r
r�rrr�r�r�r�r")r&rr�r�r�r�r)r)r*�-test_enum_zones_while_dnsProperty_zero_length�s�z7TestZones.test_enum_zones_while_dnsProperty_zero_lengthcC�*|�|j�|�tj�|jtjd�dS�N)r�)rr�r�r
r�r&�DNS_ZONE_UPDATE_SECUREr%r)r)r*�2test_rpc_zone_update_while_dnsProperty_zero_length��z<TestZones.test_rpc_zone_update_while_dnsProperty_zero_lengthcCr�r�)rr�r�r
�!DSPROPERTY_ZONE_MASTER_SERVERS_DAr&r�r%r)r)r*�8test_rpc_zone_update_while_other_dnsProperty_zero_length�r�zBTestZones.test_rpc_zone_update_while_other_dnsProperty_zero_length)F)T)$rirjrkrrrrr&r5r:rBrLr,r}r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�r�r�r�r�r�rlr)r)r'r*r�,sB



		
	
	>Id5
r�cs�eZdZ�fdd�Z�fdd�Zd%dd�Zd	d
�Zdd�Zd
d�Zdd�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd �Zd!d"�Zd#d$�Z�ZS)&�TestRPCRoundtripcsDtt|���t|_t|_t|_t|_t�d|j|j|j�|_	dS)Nr�)
rrrr r!r"r#r$rr�r%r'r)r*r�s�
�zTestRPCRoundtrip.setUpcstt|���dSr)rrrr%r'r)r*r�szTestRPCRoundtrip.tearDownNFc		Cs`|pd|��}t||�}t��}||_|}d}|rd}|}|j�tjd|j|��|||�dS)Nzrpctestrec.r)	r4r
rr�r�r�r�rr")	r&�fqnr6r?�deleter��add_rec_buf�add_arg�del_argr)r)r*�
rpc_update�s$
�zTestRPCRoundtrip.rpc_updatec
Cs�d}d||��f}z|j||tjdd�Wn$ty:}z|jdtjkr0|�d|jd�WYd}~nd}~wwz|j|tj|d�Wn%tyk}z|jdtj	kr`|�d|jd�WYd}~dSd}~ww|�d	�dS)
N�cnametest2_unqual_rec_loopr.T)rr6r?rrzLRPC DNS gaven wrong error on pre-test cleanup for self referencing CNAME: %s)rr?r6zDRPC DNS gaven wrong error on insertion of self referencing CNAME: %sz3RPC DNS allowed insertion of self referencing CNAME)
r4rr
r�rrr�$WERR_DNS_ERROR_RECORD_DOES_NOT_EXISTr��WERR_DNS_ERROR_CNAME_LOOP)r&�cname�	cname_fqnrr)r)r*�test_rpc_self_referencing_cnames0
�������z0TestRPCRoundtrip.test_rpc_self_referencing_cnamecCs�ddg}}d||��f}ttjd�}t��}||_z|j�tj	d|j
|��||d�WntyF}z
|�t
|��WYd}~nd}~wwz|�||�W|j�tj	d|j
|��|d|�dS|j�tj	d|j
|��|d|�w)N�
rpctextrecr�r.z"\"This is a test\""r�r4r
r
r�rr�r�r�r�rr"rr�r�r��r&r�r�r9r�rrr)r)r*�test_update_add_txt_rpc_to_dnssL�	����z/TestRPCRoundtrip.test_update_add_txt_rpc_to_dnsc
Cs`dgd�}}|�||�}|j|td�\}}|�|tj�|�||�|�t|j	|j|�
�d||�
�ftjd��dgd�}}|�||�}|j|td�\}}|�|tj�|�||�|�t|j	|j|�
�d||�
�ftjd��d	gd
�}}|�||�}|j|td�\}}|�|tj�|�||�|�t|j	|j|�
�d||�
�ftjd��dS)
r��pad1textrec�r�r�r�r0r.�"\"This is a test\"" "" ""�pad2textrec�r�r�r�z	more text�&"\"This is a test\"" "" "" "more text"�pad3textrec�r�r�r��"" "" "\"This is a test\""N�
r�r<r"r=r	r>r��assertIsNotNonerr�r4r
r�r�r)r)r*�&test_update_add_null_padded_txt_record=s^������	���z7TestRPCRoundtrip.test_update_add_null_padded_txt_recordcCs�dgd�}}d|}d||��f}ttjd�}t��}||_z|j�tj	d|j
|��||d�WntyK}z
|�t
|��WYd}~nd}~wwz|�||�W|j�tj	d|j
|��|d|�n|j�tj	d|j
|��|d|�wdgd�}}d|}d||��f}ttjd	�}t��}||_z|j�tj	d|j
|��||d�Wnty�}z
|�t
|��WYd}~nd}~wwz|�||�W|j�tj	d|j
|��|d|�n|j�tj	d|j
|��|d|�wd
gd�}}d|}d||��f}ttjd�}t��}||_z|j�tj	d|j
|��||d�Wnt�y8}z
|�t
|��WYd}~nd}~wwz|�||�W|j�tj	d|j
|��|d|�dS|j�tj	d|j
|��|d|�w)
Nrr�rpcr.rrrrrrrrrrr)r)r*�"test_update_add_padding_rpc_to_dnsks���	����	��	����	������z3TestRPCRoundtrip.test_update_add_padding_rpc_to_dnsc
Cs�ddg}}|�||�}|j|td�\}}|�|tj�|�|dg�|�t|j	|j|�
�d||�
�ftjd��dddg}}|�||�}|j|td�\}}|�|tj�|�|ddg�|�t|j	|j|�
�d||�
�ftjd��d	S)
r��nulltextrecz	NULLBYTEr0�NULLr.z"NULL"�nulltextrec2z
"NULL" "NULL"Nrr�r)r)r*�$test_update_add_null_char_txt_record�s,���
�z5TestRPCRoundtrip.test_update_add_null_char_txt_recordcCs�d}d||��f}ttjd�}t��}||_z|j�tj	d|j
|��||d�WntyB}z
|�t
|��WYd}~nd}~wwz|�|dg�W|j�tj	d|j
|��|d|�dS|j�tj	d|j
|��|d|�w)N�rpcnulltextrecr.z"NULLBYTE"rr r)r&r�r9r�rrr)r)r*�$test_update_add_null_char_rpc_to_dns�sL�	����z5TestRPCRoundtrip.test_update_add_null_char_rpc_to_dnsc
C�vddg}}|�||�}|j|td�\}}|�|tj�|�||�|�t|j	|j|�
�d||�
�ftjd��dS)r��
hextextrec�
HIGHÿBYTEr0r.�"HIGHÿBYTE"Nrr�r)r)r*�#test_update_add_hex_char_txt_record��
�z4TestRPCRoundtrip.test_update_add_hex_char_txt_recordcC��ddg}}d|}d||��f}ttjd�}t��}||_z|j�tj	d|j
|��||d�WntyJ}z
|�t
|��WYd}~nd}~wwz|�||�W|j�tj	d|j
|��|d|�dS|j�tj	d|j
|��|d|�w)Nr&r'rr.r(rrrr)r)r*�test_update_add_hex_rpc_to_dnssN�	����z/TestRPCRoundtrip.test_update_add_hex_rpc_to_dnsc
Cr%)r��slashtextrec�Th\=is=is a testr0r.�"Th\\=is=is a test"Nrr�r)r)r*� test_update_add_slash_txt_record5r*z1TestRPCRoundtrip.test_update_add_slash_txt_recordcCr+)Nr-r.rr.r/rrrr)r)r*� test_update_add_slash_rpc_to_dnsEsN�	����z1TestRPCRoundtrip.test_update_add_slash_rpc_to_dnsc
Csxdddg}}|�||�}|j|td�\}}|�|tj�|�||�|�t|j	|j|�
�d||�
�ftjd��dS)�!test adding two txt records works�textrec2r��"and this is a test, too"r0r.�2"\"This is a test\"" "\"and this is a test, too\""Nrr�r)r)r*�test_update_add_two_txt_recordsgs��
�z0TestRPCRoundtrip.test_update_add_two_txt_recordscCs�dddg}}d|}d||��f}ttjd�}t��}||_z|j�tj	d|j
|��||d�WntyK}z
|�t
|��WYd}~nd}~wwz|�||�W|j�tj	d|j
|��|d|�dS|j�tj	d|j
|��|d|�w)Nr3r�r4rr.r5rrrr)r)r*�test_update_add_two_rpc_to_dnsvsV���	����z/TestRPCRoundtrip.test_update_add_two_rpc_to_dnsc
Cstdg}}|�||�}|j|td�\}}|�|tj�|�||�|�t|j	|j|�
�d||�
�ftjd��dS)r2�emptytextrecr0r.r�Nrr�r)r)r*�!test_update_add_empty_txt_records�s
�
�z2TestRPCRoundtrip.test_update_add_empty_txt_recordscCs�dg}}d||��f}ttjd�}t��}||_z|j�tj	d|j
|��||d�WntyE}z
|�t
|��WYd}~nd}~wwz|�||�W|j�tj	d|j
|��|d|�dS|j�tj	d|j
|��|d|�w)N�rpcemptytextrecr.r�rrrr)r)r*� test_update_add_empty_rpc_to_dns�sL
�����z1TestRPCRoundtrip.test_update_add_empty_rpc_to_dns)NNNF)rirjrkrrrrrrrr"r$r)r,r0r1r6r7r9r;rlr)r)r'r*r�s$
!.d 
!"$
r)�module�opts)C�sambar�	samba.ndrrr�samba.samdbr�
samba.authrr.rr\�sysr�rXr�r�samba.dcerpcr	r
r�samba.dnsserverrr
r�samba.tests.subunitrunrrrr�samba.tests.dns_baser�samba.getopt�getopt�options�optparse�OptionParser�parser�SambaOptions�	sambaopts�add_option_group�
add_option�CredentialsOptions�credopts�subunitopts�
parse_argsr=rr�r#�get_credentialsr$rrz�print_usage�exitr r"�set_krb_forwardable�NO_KRB_FORWARDABLErrmr�r�r�rrir)r)r)r*�<module>sz



�




i&M9k