
    b                        d 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	 ddl
mZmZmZ ddl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  G d de          ZdS )z Tests for samba.dcerpc.dnsserver    N)system_session)SamDB)
ndr_unpackndr_pack)dnsp	dnsserversecurity)RpcInterfaceTestCaseenv_get_var_value)record_from_stringflag_from_stringARecord)sd_utils
descriptor)WERRORErrorwerrorc                   V    e Zd Zed             Z fdZ fdZd Zd Zd Z	d Z
d Zd	 Zd
 Zd Zd Zd Zd Z	 d*dZd Zd Zd Zd Zd Zd Zdej        fdZdej        fdZej        fdZdej        fdZdej        fdZd  Z d! Z!d" Z"d# Z#d$ Z$d% Z%d& Z&d' Z'd( Z(d) Z) xZ*S )+DnsserverTestsc           	         ddddz  ddddd	d
g	}g d}dg}g }dg}g }|D ]2}|                     d|z             |                     d|z             3|D ]2}|                     d|z             |                     d|z             3ddgg d|||||g dd| _        ddgg d|||||d| _        ddddz  g}	g d}
|	|
d| _        d S )NSAMDOM.EXAMPLE.COMz1.EXAMPLE.COMz%sEXAMPLE.COMz1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.EXAMPLEz
.COMz!@#$%^&*()_u
   HIGHÿBYTEz@.EXAMPLE.COM.)z...z.EXAMPLE.COMz	.EXAMPLE. zSAMDOM..EXAMPLE.COMzSAMDOM.EXAMPLE.COM 65535z$SAMDOM.EXAMPLE.COM 65535 65535 65535z%s 1z%s 0 0 0z192.168.0.1z255.255.255.255)z'1234:5678:9ABC:DEF0:0000:0000:0000:0000'0000:0000:0000:0000:0000:0000:0000:0000z'1234:5678:9ABC:DEF0:1234:5678:9ABC:DEF0z1234:1234:1234::z1234:1234:1234:1234:1234::z1234:5678:9ABC:DEF0::z0000:0000::0000z#1234::5678:9ABC:0000:0000:0000:0000::1::z1:1:1:1:1:1:1:1)textr   z@#!
)AAAAAPTRCNAMENSMXSRVTXTz192.168.0.500z255.255.255.255/32)z'GGGG:1234:5678:9ABC:0000:0000:0000:0000z)0000:0000:0000:0000:0000:0000:0000:0000/1z'AAAA:AAAA:AAAA:AAAA:G000:0000:0000:1234z,1234:5678:9ABC:DEF0:1234:5678:9ABC:DEF0:1234z"1234:5678:9ABC:DEF0:1234:5678:9ABCz1111::1111::1111)r   r    r!   r"   r#   r$   r%   zSAMDOM.EXAMPLE.COM -1zSAMDOM.EXAMPLE.COM 65536   AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA)zSAMDOM.EXAMPLE.COM 0 65536 0zSAMDOM.EXAMPLE.COM 0 0 65536zSAMDOM.EXAMPLE.COM 65536 0 0)r$   r%   )appendgood_recordsbad_recordsinvalid_records)clsgood_dnsbad_dnsgood_mxbad_mxgood_srvbad_srvbad_dngood_dn
invalid_mxinvalid_srvs              >/usr/lib/python3/dist-packages/samba/tests/dcerpc/dnsserver.py
setUpClasszDnsserverTests.setUpClass#   s   (##z2!"#* * * ..:; 	0 	0FMM&6/***NN:.//// 	2 	2GNN6G+,,,OOJ01111  #%
( 
( 
( ,,,'
 
. "&() ) ) 
 
$ .0	*,
7 7 7 
 
    c           
      B   t          t          |                                            t          j        d         | _        t          d                                          | _        t          j	        d| j        z  | 
                                |                                           | _        t          dt          j        d         z  | 
                                t                      |                                           | _        d| _        t          j                    }| j        |_        t&          j        |_        d|_        d	|_        d	|_        t          j        |_        | j                            t          j        d| j        d dd
t          j        |           d S )N	DC_SERVERREALMzncacn_ip_tcp:%s[sign]z	ldap://%sDC_SERVER_IP)urllpsession_infocredentialszoner      
ZoneCreate)superr   setUposenvironserverr   lowerrB   r   get_loadparmget_credentialsconnr   r   samdbcustom_zone!DNS_RPC_ZONE_CREATE_INFO_LONGHORNpszZoneNamer   DNS_ZONE_TYPE_PRIMARY
dwZoneTypefAgingfDsIntegratedfLoadExistingDNS_DP_DOMAIN_DEFAULT	dwDpFlagsDnssrvOperation2DNS_CLIENT_VERSION_LONGHORNDNSSRV_TYPEID_ZONE_CREATE)selfzone_create_info	__class__s     r7   rF   zDnsserverTests.setUpt   sn   nd##))+++j-%g..4466	'(?4;(O(,(9(9(;(;(,(<(<(>(>@ @	 {RZ-GG"//11(6(8(8'+';';'='=? ? ?

 "$FHH'+'7$&*&@#"#)*&)*&%.%D"	""9#H#$#';#'#$#/#,#F#3	5 	5 	5 	5 	5r9   c           
          | j                             t          j        d| j        | j        ddt          j        d            t          t          |           	                                 d S )Nr   DeleteZoneFromDs)
rM   rY   r   rZ   rI   rO   DNSSRV_TYPEID_NULLrE   r   tearDown)r\   r^   s    r7   rb   zDnsserverTests.tearDown   sc    	""9#H#$#';#'#3#$#5#,#?#'	) 	) 	) 	nd##,,.....r9   c                 j   d}d}|                      | j        d||           |                      | j        d||           |                      | j        d||           |                      | j        d||           |                      | j        d||           |                      | j        | j        ||           | j                            t          j        d| j        | j        d	d
t          |          t          j        d
d

  
        \  }}| 	                    t          |j                  d           | 	                    |j        d         j        j        d           | 	                    |j        d         j        j        d           | 	                    |j        d         j        j        d           | 	                    |j        d         j        j        d           | 	                    |j        d         j        j        d           | 	                    |j        d         j        j        d           d
S ),
        Confirm the zone is sorted
        192.168.50.50r   atestrecord-1atestrecord-2atestrecord-3atestrecord-4atestrecord-0r   @N   r   rC               
add_recordrO   rM   DnssrvEnumRecords2r   rZ   rI   r   DNS_RPC_VIEW_AUTHORITY_DATAassertEquallenrecdnsNodeNamestrr\   
record_strrecord_type_str_results        r7   test_enum_is_sortedz"DnsserverTests.test_enum_is_sorted   s   
 %
(/?JWWW(/?JWWW(/?JWWW(/?JWWW(/?JWWW 	($*:OZXXXI001V1215151A14151A/1R1R1:1V1515	7 	7	6 	VZ!,,,A26;;;A26HHHA26HHHA26HHHA26HHHA26HHHHHr9   c                 "   d}d}|                      | j        d||           |                      | j        d||           |                      | j        d||           |                      | j        d||           |                      | j        d||           |                      | j        | j        dz   ||           |                     | j        | j        dz             \  }}t          j        | j        t          |                    }|                    d	d
| j                   | j                            ||           | j	        
                    t          j        d	| j        | j        ddt          |          t          j        dd
  
        \  }}|                     t#          |j                  d           |                     |j        d	         j        j        d           |                     |j        d         j        j        d           |                     |j        d         j        j        d           |                     |j        d         j        j        d           |                     |j        d         j        j        d           |                     |j        d         j        j        d           |j        d         j        j        | j        dz   k    r2|                     |j        d         j        j        | j                   dS dS )rd   re   r   rf   rg   rh   ri   rj   1r   dcrk   N   r   rC   rm   rn   ro   rp   rl   )rr   rO   get_record_from_dbldbDnrN   ry   set_componentrenamerM   rs   r   rZ   rI   r   rt   ru   rv   rw   rx   )r\   r{   r|   dnrecordnew_dnr}   r~   s           r7   !test_enum_is_sorted_with_zone_dupz0DnsserverTests.test_enum_is_sorted_with_zone_dup   s   
 %
(/?JWWW(/?JWWW(/?JWWW(/?JWWW(/?JWWW 	($*:S*@/S]^^^,,T-=t?ORU?UVV
F
CGG,,Qd&6777
"f%%%I001V1215151A14151A/1R1R1:1V1515	7 	7	6 	VZ!,,,A26;;;A26HHHA26HHHA26HHHA26HHHA26HHH
 :a=$(T-=-CDDVZ]6:D<LMMMMM EDr9   c                    d}d}|                      | j        d||           |                      | j        d||           |                      | j        d||           |                      | j        d||           |                      | j        d||           |                      | j        d||           | j                            t          j        d	| j        | j        d
dt          |          t          j        dd
  
        \  }}| 	                    t          |j                  d           | 	                    |j        d	         j        j        d           dS )z}
        Confirm the zone returns the selected prefix first but no more
        as Samba is flappy for the full sort
        re   r   atestrecord-1.a.batestrecord-2.a.batestrecord-3.a.batestrecord-4.a.batestrecord-0.a.batestrecord-0.b.br   a.bNrl   r   rq   rz   s        r7   )test_enum_is_sorted_children_prefix_firstz8DnsserverTests.test_enum_is_sorted_children_prefix_first   sQ    %
(*=PZ[[[(*=PZ[[[(*=PZ[[[(*=PZ[[[(*=PZ[[[ 	(*=PZ[[[I001V1215151A16151A/1R1R1:1V1515	7 	7	6 	VZ!,,,A26;;;;;r9   c                 `   d}d}|                      | j        d||           |                      | j        d||           |                      | j        d||           |                      | j        d||           |                      | j        d||           |                      | j        d||           | j                            t          j        d	| j        | j        d
dt          |          t          j        dd
  
        \  }}| 	                    t          |j                  d           | 	                    |j        d	         j        j        d           | 	                    |j        d         j        j        d           | 	                    |j        d         j        j        d           | 	                    |j        d         j        j        d           | 	                    |j        d         j        j        d           | 	                    |j        d         j        j        d           dS )rd   re   r   r   r   r   r   r   r   r   r   Nrl   r   rC   rj   rm   rf   rn   rg   ro   rh   rp   ri   rq   rz   s        r7   test_enum_is_sorted_childrenz+DnsserverTests.test_enum_is_sorted_children  s   
 %
(*=PZ[[[(*=PZ[[[(*=PZ[[[(*=PZ[[[(*=PZ[[[ 	(*=PZ[[[I001V1215151A16151A/1R1R1:1V1515	7 	7	6 	VZ!,,,A26;;;A26HHHA26HHHA26HHHA26HHHA26HHHHHr9   c                    d}d}|                      | j        d||           |                     | j        d          \  }}d|_        | j                            ||g          }||                     d           |                     | j        d|           |                      | j        d||d           |                     | j        d||           |                     | j        d|d           dS )	zX
        See what happens when we set a record's rank to
        DNS_RANK_NONE.
        re   r   
testrecordr   Nz2Unable to update dns record to have DNS_RANK_NONE.F	assertion)	rr   rO   r   rankrN   dns_replace_by_dnfailassert_num_recordsdelete_record)r\   r{   r|   r   r   ress         r7   test_rank_nonezDnsserverTests.test_rank_none8  s     %
(,TTT,,T-=|LL
Fj**2x88?IIJKKK 0,PPP(,_deee4+\?JWWW 0,QRSSSSSr9   c                    d}|                      | j        dd|           |                     | j        d          \  }}t          j        |_        d|_        | j                            ||g           | 	                    | j        ddd           | 	                    | j        ddd           | 
                    | j        d          }|                     t          |          d           |d         }|                     |j        t          j                   |                     |j        d           |                     | j        dd|d	           d
S )z0What happens with a zero EntombedTime tombstone?re   r   r   r   ALLrC   g ؅W4vCFr   N)rr   rO   r   r   DNS_TYPE_TOMBSTONEwTypedatarN   r   r   ldap_get_recordsru   rv   assertGreaterr   )r\   r{   r   r   recordsrs         r7   "test_dns_tombstoned_zero_timestampz1DnsserverTests.test_dns_tombstoned_zero_timestampM  sR   * %
(,ZHHH,,T-=|LL
F.
$$R&222 	 0,QGGG
 	 0,qIII ''(8,GGWq)))AJ$"9:::164((( 	4+\3
%* 	 	, 	, 	, 	, 	,r9   c                    d}|                      | j        dd|           |                     | j        d          \  }}t          j        |_        d|_        | j                            ||g           | 	                    | j        ddd           | 	                    | j        ddd           | 
                    | j        dd|d	           | 	                    | j        ddd           | 	                    | j        ddd           d
S )zgSee what happens when we set a record to be tombstoned with an
        EntombedTime timestamp.
        re   r   r   l   xhH rC   	TOMBSTONEr   Tr   N)rr   rO   r   r   r   r   r   rN   r   r   r   )r\   r{   r   r   s       r7   %test_dns_tombstoned_nonzero_timestampz4DnsserverTests.test_dns_tombstoned_nonzero_timestamp}  s    %
(,ZHHH,,T-=|LL
F."
$$R&222 	 0,QGGG 0,QOOO4+\3
%) 	 	+ 	+ 	+ 0,QOOO 0,QGGGGGr9   c                    | j                             d| j                                         z  t          j        ddg          }d}|D ]$}d|z  t          |j                  v r	|j        } n%|t          d|z            | j                             |t          j        dd	g          }|D ]I}|t          |j                  v r1t          t          j
        |d	         d
                   }|j        |fc S JdS )z0
        Returns (dn of record, record)
        zDC=DomainDnsZones,%sz(objectClass=dnsZone)cnbasescope
expressionattrsNzDC=%s,zCouldn't find zone '%s'.z(objectClass=dnsNode)	dnsRecordr   )rN   searchget_default_basednr   SCOPE_SUBTREEry   r   AssertionErrorr   r   DnssrvRpcRecord)	r\   	zone_namerecord_namezoneszone_dnrB   r   old_packed_recordrw   s	            r7   r   z!DnsserverTests.get_record_from_db  s3   
 
!!'=
@]@]@_@_'_gjgx-D)- " 0 0  	 	D)#s47||33' 4 ? !;i!GHHH*##8I/F+6- $ 9 9 ") 	3 	3c"3"67777 !57H7UVW7XYY),c2222 8	3 	3r9   c                     d| d| j                                          }d| d}| j                             |t          j        |dg          }|d                             d          }d |D             S )	NzDC=z#,CN=MicrosoftDNS,DC=DomainDNSZones,z(&(objectClass=dnsNode)(name=z))r   r   r   c                 B    g | ]}t          t          j        |          S  )r   r   r   ).0r   s     r7   
<listcomp>z3DnsserverTests.ldap_get_records.<locals>.<listcomp>  s%    EEE
4/33EEEr9   )rN   r   r   r   r   get)r\   rB   namer   exprnodesr   s          r7   r   zDnsserverTests.ldap_get_records  s    8 8 8j33558 8 8t777
!!w(+(9-1)4 " 7 7
 (,,{++EEWEEEEr9   c                    dg}ddg}dg di}dgg ddgd	gd
gd}dD ]}|||<   |||<   |D ]}||         D ]}|                      | j        d||d                    |D ]=}|                      | j        d||d           |                     | j        d|           >|                     | j        d||d                    |D ]B}|                      | j        d||d                    |                     | j        d||           CΌ|D ]T}||         D ]G}d}	|D ]n}|	dz   }		 |                      | j        d||           |                     | j        d||	           D# t          $ r}
t	          d|d|
d|d          d}
~
ww xY w|D ]&}|                     | j        d||           |dk    r&'|                      | j        d||d                    |D ]_}||d         k    r	 |                     | j        d||d           0# t          $ r#}
t	          d|d         d|d|
          d}
~
ww xY w|                     | j        d||d                    IVdS )z
        Make sure that records which should be distinct from each other or duplicate
        to each other behave as expected.
        )r   zSAMDOM.EXAMPLE.COzEXAMPLE.COMzSAMDOM.EXAMPLE)r   zsamdom.example.comzSAMDOM.example.COM)zEXAMPLE.r   r    ))AAAA::zaaaa::)r   zAAAA:0000::)r   z'AAAA:0000:0000:0000:0000:0000:0000:0000)r   zAAAA:0:0:0:0:0:0:0)z0123::z123::)r   z::0r   )z192.168.1.0z192.168.1.1z192.168.2.0z192.169.1.0z193.168.1.0))zAAAA::1234:5678:9ABCz::AAAA:1234:5678:9ABC)z1000::z::1000)r   z::11z::1111)z1234::z0234::)zSAMDOM.EXAMPLE.COM 1 1 1zSAMDOM.EXAMPLE.COM 1 1 0zSAMDOM.EXAMPLE.COM 1 0 1zSAMDOM.EXAMPLE.COM 0 1 1zSAMDOM.EXAMPLE.COM 2 1 0zSAMDOM.EXAMPLE.COM 2 2 2)zSAMDOM.EXAMPLE.COM 1zSAMDOM.EXAMPLE.COM 0)zA RECORDzB RECORDza record)r   r    r%   r$   r&   )r!   r"   r#   r   r   Fr   rC   expected_numzFailed to add zG, which should be distinct from all others in the set. Original error: z
Distinct set: r   Nr"   zManaged to remove z by attempting to remove z. Original error: )rr   rO   r   r   r   )r\   distinct_dnsduplicate_dns
duplicatesdistinctr|   duplicate_tupler   distinct_tupleies              r7   test_duplicate_matchingz&DnsserverTests.test_duplicate_matching  s   : ; \02
  O O O

 ^^+ + +i jCD89

 

  6 	8 	8O(4H_%*7J'') 	` 	`O#-o#> ` ` 0,Q`abQcddd- ] ]FOOD$4lOU[glOmmm++D,<lO\\\\""4#3\?TcdeTfggg . ` `FOOD$4lOUdefUghhh&&t'7X^____``  ( 	g 	gO"*?"; g g, t tFAAt(8,Y_```//0@,P_no/pppp) t t t,nX^X^X^`a`a`acqcqcq.s t t tt - ! !F&&t'7X^___&'11  2
  0,Q_`aQbccc, O OF!222 O**4+;\?\bns*tttt) O O O,n0>q0A0A0A66611.N O O OO ""4#3\?TbcdTeffff;g	g 	gs0   ";E
F	(F	F	'H
H4	H/	/H4	c                     | j         D ]h}| j         |         D ]X}|                     | j        d||           |                     | j        d|           |                     | j        d||           YidS )zb
        Make sure that we can add, update and delete a variety
        of valid records.
        r   Nr)   rr   rO   r   r   )r\   r|   r{   s      r7   test_accept_valid_commandsz)DnsserverTests.test_accept_valid_commands  s    
  $0 	` 	`O"/@ ` `
 0,Q[\\\''(8,XXX""4#3\?T^____`	` 	`r9   r   rB   r   c                    |                      |	|
          }|                     |d|z             |\  }}|                     ||j        d|d|j        d|d           |                     ||j        d|d|j        d|d           |                     ||j        d|d|j        d|d           |                     ||j        d|d|j        d|d           |                     ||j        d	|d|j        d|d           |                     |                                |j	                                        d
|d|j	                                        d|                                d           |                     ||j
        d|d|j
        d|d           |                     ||j        d|d|j        d|d           d S )Nz/Expected record %s but was not found over LDAP.z"Unexpected data length for record z. Got z, expected r   zUnexpected rank for record zUnexpected flags for record z#Unexpected time to live for record z!Unexpected dwReserved for record zUnexpected data for record zUnexpected wType for record z Unexpected timestamp for record )r   assertIsNotNoneru   wDataLengthr   flagsdwTtlSeconds
dwReservedrJ   r   r   dwTimeStamp)r\   r   r   r   r   r   r   r   r   rB   rec_namer   rec_dnrw   s                 r7   check_paramszDnsserverTests.check_params  s*   %%dH55S"SVZ"Z[[[coow{w{w{  ~A  ~M  ~M  ~M  OZ  OZ  OZ  8[  	\  	\  	\sxxbfbfbfhkhphphprvrvrv)wxxx		eieieiknktktktv{v{v{+|}}}s'7'7z~z~z~  AD  AQ  AQ  AQ  S_  S_  S_  :`  	a  	a  	aS^^txtxtxz}  {I  {I  {I  KU  KU  KU  6V  	W  	W  	Wsx~~'7'7'7rvrvrvx{  yA  yG  yG  yI  yI  yI  yI  KO  KU  KU  KW  KW  KW  KW  :X  	Y  	Y  	Y		eieieiknktktktv{v{v{+|}}}coouyuyuy{~  |K  |K  |K  MX  MX  MX  8Y  	Z  	Z  	Z  	Z  	Zr9   c           	         |                      | j        ddd           |                     ddddddd           |                     | j        ddd           |                      | j        dd	d
           |                     ddddddd           |                     | j        dd	d
           |                      | j        ddd           |                     ddddddd           |                     | j        ddd           dS )zx
        Make sure that, when we add records to the database,
        they're added with reasonable parameters.
        r   r   re   ro      r   i  rC   r    zAAAA:AAAA::   z'AAAA:AAAA:0000:0000:0000:0000:0000:0000   r"   	cnamedest   rp   N)rr   rO   r   r   )r\   s    r7   test_record_paramsz!DnsserverTests.test_record_params-  s   
 	(,_MMM!S!S!_a@@@4+\3PPP(,NNN"c1c1.WY[\\\4+\6=QQQ(,MMM"c1c1k1===4+\7KPPPPPr9   c           	         d}| j         D ]}| j         |         D ]}	 |                     | j        d||d           |                     | j        d|d           |                     | j        d||d           `# t
          $ r}t          |           |dz   }Y d}~d}~ww xY w| j         D ]}| j         |         D ]}| j        |         d         }|                     | j        d||           	 |                     | j        d||d           n+# t
          $ r}t          |           |dz   }Y d}~nd}~ww xY w|                     | j        d||           |                     |dk    d|z             dS )	z
        Make sure that we can't add a variety of invalid records,
        and that we can't update valid records to invalid ones.
        r   r   Fr   r   rC   Nz6Failed to reject invalid commands. Total failures: %d.)	r*   rr   rO   r   r   r   printr)   
assertTrue)r\   num_failuresr|   r{   r   good_record_strs         r7   test_reject_invalid_commandsz+DnsserverTests.test_reject_invalid_commands<  s   
 #/ 
	4 
	4O".? 	4 	4
4OOD$4lOU_kpOqqq++D,<lOjk+lll&&t'7Xbns&tttt% 4 4 4!HHH#/!#3LLLLLL4	4  $/ 		e 		eO".? e e
"&"3O"DQ"G 0,Q`aaa4OOD$4lOU_kpOqqqq% 4 4 4!HHH#/!#3LLLLLL4 ""4#3\?Tcdddde 	)+cfr+rssssss0   AA99
B!BB!.D
D6D11D6c                 B   d}| j         D ]v}| j         |         d         }|                     | j        d||           | j         D ]}||k    r
| j         |         d         }|dk    p|dk    }|dk    p|dk    }|dk    p|dk    }|dk    p|dk    }	|dk    p|dk    }
|dk    p|dk    }|d	k    p|d	k    }d
}|dk    r|s|sd}|dk    r
|	s|
s|s|rd}|r
|s|s|s|rd}	 |                     | j        d||           |r|dz   }t          d|d|d           n4# t          $ r'}|s|dz   }t          d|d|d           Y d}~nd}~ww xY w|sd}d}|	r|
rd}|s|s|r|dk    s|dk    rd}|dk    r|s|rd}	 |                     | j        d||           n8# t          $ r+}|dz   }t          d|d|d|d|d	           Y d}~nd}~ww xY w	 |                     | j        d||           n8# t          $ r+}|dz   }t          d|d|d|d|d	           Y d}~nd}~ww xY w	 |                     | j        d||           # t          $ r}Y d}~d}~ww xY w|                     | j        d||           x|                     |dk    d|z             dS )zv
        Attempt to add some values which have the same name as
        existing ones, just a different type.
        r   r   r   r    r"   r!   r$   r%   r&   Fr#   TrC   zExpected error when adding z	 while a z	 existed.z Didn't expect error when adding Nr   z	Expected  z records after adding a z record and a z record already existed.z>Failed collision and replacement behavior. Total failures: %d.)r)   rr   rO   r   r   r   r   r   )r\   r   record_type_str_1record1record_type_str_2record2has_ahas_aaaa	has_cnamehas_ptrhas_mxhas_srvhas_txtadd_error_okr   expected_num_type_1expected_num_type_2s                    r7   !test_add_duplicate_different_typez0DnsserverTests.test_add_duplicate_different_type\  s   
 !%!2 M	[ M	['(9:1=GOOD,l<MwWWW%)%6 H H!$(999+,=>qA)S0L4E4L,6U:Kv:U-8X<MQX<X	+u4R8IU8R*d2O6G46O+u4R8IU8R+u4R8IU8R  %$,,U,8,#'L$//W//%/S[/#'L  (% (8 (w (' (#'L
HOOD$4lDUW^___# H'3a'7!2!2!24E4E4EG H H H% H H H' H'3a'7!2!2!24E4E4EG H H HH $ p*+'*+'  06 0./+ " 0W 0 0>OSX>X>X\mqu\u\u./+)T11u11./+p//0@,Pa  qD/  E  E  E  E) p p p'3a'7!4!4!46G6G6GIZIZIZ\m\m\mo p p p p p p p ppp//0@,Pa  qD/  E  E  E  E) p p p'3a'7!4!4!46G6G6GIZIZIZ\m\m\mo p p p p p p p pp
&&t'7GXZabbbb%   DDDD t/?PRYZZZZ)+knz+z{{{{{sZ    :D
E%EE<F
G%!GGG33
H(=!H##H(,I
I I c                    | j         d         d         }|                     | j        dd|           | j         D ]R}| j         |         d         }|                     | j        d||d           |                     | j        d|d           Sd}d}|                     | j        d	d
|d           |                     | j        dd|d           |                     | j        dd|           dS )z@
        Test some special properties of CNAME records.
        r"   rC   r   r   Fr   r   ztestrecord 1mxrecr$   nsrecr#   Nr   )r\   cname_recordr|   other_record	mx_record	ns_records         r7   _test_cnamezDnsserverTests._test_cname  s    (1!4(,NNN#0 	e 	eO,_=a@LOOD,lO\ejOkkk##D$4lObc#dddd #	 	('4eTTT('4eTTT4+\7LQQQQQr9   c                 *   | j         D ]}| j         |         d         }|                     | j        d||           |                     | j        d||d           |                     | j        d|           |                     | j        d||           dS )zK
        Make sure that we can't add duplicate values of any type.
        r   r   Fr   Nr   )r\   r|   r   s      r7   test_add_duplicate_valuez'DnsserverTests.test_add_duplicate_value  s      $0 	X 	XO&7:FOOD,lOVTTTOOD,lOV_dOeee##D$4lOTTTt/PVWWWW	X 	Xr9   c                    | j         D ]}t          dt          | j         |                             D ]}| j         |         |dz
           }| j         |         |         }|dk    r2|dk    rdnd}|                     | j        d||           |                     | j        d||           |                     | j        d||           |                     | j        d||           |                     | j        d||           όdS )z
        Attempt to add values with the same name and type in the same
        zone. This should work, and should result in both values
        existing (except with some types).
        rC   r"   rm   r   r   N)r)   rangerv   rr   rO   r   r   )r\   r|   r   r   r   r   s         r7   test_add_similar_valuez%DnsserverTests.test_add_similar_value  s8     $0 	] 	]O1c$"3O"DEEFF ] ]+O<QUC+O<Q?"g-- %4w$>$>qqA 0,QXYYY 0,QXYYY''(8,fr'sss""4#3\?T[\\\""4#3\?T[\\\\%]	] 	]r9   Tc                 V   	 |                      |||          \  }}n0# t          $ r#}	|rt          d|d|d          Y d}	~	dS d}	~	ww xY wd}
|j        d         j        D ]}|j        |k    rd}
 n|
r|st          d|d|d          |
s|rt          d|d|d          dS dS )	zo
        Asserts whether or not the given record with the given type exists in the
        given zone.
        zRecord '' of type 'z+' was not present when it should have been.NFr   Tz*' was present when it shouldn't have been.)query_recordsRuntimeErrorr   rw   r   r   )r\   rB   r   r|   expected_record_strr   client_versionr}   r~   r   foundr   s               r7   assert_recordzDnsserverTests.assert_record  st   	**4GGIAvv 	 	 	 $n(;(;(;___&N O O O 	 jm+ 	 	F{111 2  	P 	P .h{h{h{  ~M  ~M  ~M  "N  O  O  O 	P9 	P .i|i|i|  N  N  N  "O  P  P  P	P 	P 	P 	Ps    
A
AA
rC   c                 
   	 |                      |||          \  }}t          |j        d         j                  }||k    st	          d||||fz            dS # t
          $ r |dk    st	          d|||fz            Y dS w xY w)zq
        Asserts that there are a given amount of records with the given type in
        the given zone.
        r   zLThere were %d records of type '%s' with the name '%s' when %d were expected.zLThere were no records of type '%s' with the name '%s' when %d were expected.N)r  rv   rw   r   r   r  )	r\   rB   r   r|   r   r  r}   r~   num_resultss	            r7   r   z!DnsserverTests.assert_num_records  s    		N**4GGIAvfjm344K,..$%s(3_dL'Y&Z [ [ [ /.  	N 	N 	N1$$$%s(7|'L&M N N N %$$	Ns   AA %BBc                     | j                             |d| j        ||d t          |          t          j        t          j        z  d d 
  
        S )Nr   )rM   rs   rI   r   r   rt   DNS_RPC_VIEW_NO_CHILDREN)r\   rB   r   r|   r  s        r7   r  zDnsserverTests.query_records  sO    y++N,-,0K,0,0,0,<_,M,M,5,QT]Tv,v,0,0	2 	2 		2r9   c                 Z   t          ||d          }t          j                    }||_        	 | j                            |d| j        |||d           |st          d|d|d          dS # t          $ r3}	|r&t          d|d|d	t          |	          d
          Y d}	~	dS d}	~	ww xY w)z
        Attempts to add a map from the given name to a record of the given type,
        in the given zone.
        Also asserts whether or not the add was successful.
        This can also update existing records if they have the same name.
        r   sepr   NzSuccessfully added record 'r  ', which should have failed.zFailed to add record '+', which should have succeeded. Error was ''.
r   r   DNS_RPC_RECORD_BUFrw   rM   DnssrvUpdateRecord2rI   r   r  ry   )
r\   rB   r   r|   r{   r   r  r   add_rec_bufr   s
             r7   rr   zDnsserverTests.add_record)  s,    $OZSIII244 	NI)).*+*.+*.*.*5*.0 0 0  F$n(2

OOO&E F F FF F  	N 	N 	N N$n(2

OOOSVVVV&M N N NN N N N N N	N   =A- -
B*7(B%%B*c                 Z   t          ||d          }t          j                    }||_        	 | j                            |d| j        ||d|           |st          d|d|d          dS # t          $ r3}	|r&t          d|d|d	t          |	          d
          Y d}	~	dS d}	~	ww xY w)z
        Attempts to delete a record with the given name, record and record type
        from the given zone.
        Also asserts whether or not the deletion was successful.
        r   r  r   NzSuccessfully deleted record 'r  r  zFailed to delete record 'r   r!  r"  )
r\   rB   r   r|   r{   r   r  r   del_rec_bufr   s
             r7   r   zDnsserverTests.delete_recordE  sv    $OZSIII244 	hI)).*+*.+*.*.*.*57 7 7  Q$ns}s}s}  @O  @O  @O  &P  Q  Q  QQ Q 	h 	h 	h h$n  CM  CM  CM  O^  O^  O^  `c  de  `f  `f  `f  `f  &g  h  h  hh h h h h h	hr&  c                    | j                             t          j        d| j        d d          \  }}|                     t          j        |           | j                             t          j        d| j        d d          \  }}|                     t          j        |           | j                             t          j	        d| j        d d          \  }}|                     t          j
        |           d S )Nr   
ServerInfo)rM   DnssrvQuery2r   DNS_CLIENT_VERSION_W2KrI   ru   DNSSRV_TYPEID_SERVER_INFO_W2KDNS_CLIENT_VERSION_DOTNET DNSSRV_TYPEID_SERVER_INFO_DOTNETrZ   DNSSRV_TYPEID_SERVER_INFO)r\   typeidr~   s      r7   test_query2zDnsserverTests.test_query2^  s    //	0P0104040<	> >
 	@&III//	0S0104040<	> >
 	CVLLL//	0U0104040<	> >
 	<fEEEEEr9   c                 \   d}t           j        }t          j                    }d|_        t          j        |_        	 | j                            | j	        |dd||          }n8# t          $ r+}|j        d         t          j        k    rY d }~d S Y d }~nd }~ww xY w|                                  d S )Na-zone-that-does-not-existAllowUpdaterC   ResetDwordPropertyr   )r   DNSSRV_TYPEID_NAME_AND_PARAMDNS_RPC_NAME_AND_PARAMpszNodeNamer   DNS_ZONE_UPDATE_SECUREdwParamrM   DnssrvOperationrI   r   argsr   "WERR_DNS_ERROR_ZONE_DOES_NOT_EXISTr   )r\   non_zoner1  name_and_paramr   r   s         r7   test_operation_invalidz%DnsserverTests.test_operation_invalidx  s    /7"9;;%2"!%!<		)++DK,4,-,@,2,:< <CC  	 	 	vayFEEE FEEEE	
 			s   $A   
B*BBc           
      x   t           j        }d}t           j        }t          j                    }d|_        t
          j        |_        	 | j        	                    |d| j
        |dd||          }n8# t          $ r+}|j        d         t          j        k    rY d }~d S Y d }~nd }~ww xY w|                                  d S )Nr4  r5  r   rC   r6  )r   rZ   r7  r8  r9  r   r:  r;  rM   rY   rI   r   r=  r   r>  r   )r\   r  r?  r1  r@  r   r   s          r7   test_operation2_invalidz&DnsserverTests.test_operation2_invalid  s    ">/7"9;;%2"!%!<	),,^-.-1[-5-.-A-3-;= =CC  	 	 	vayFEEE FEEEE	
 			s   &A. .
B#8BB#c           
         t           j        }d}t          j                    }||_        t          j        |_        t          j        |_        d|_	        t           j
        |_        | j                            |d| j        d ddt           j        |           t           j        t           j        z  }| j                            |d| j        d dt           j        |          \  }}|                     d|j                   | j                            |d| j        |ddt           j        d            | j                            |d| j        d dt           j        |          \  }}|                     d|j                   d S )Nz1.168.192.in-addr.arpar   rD   	EnumZonesrC   r`   )r   rZ   rP   rQ   r   rR   rS   r:  fAllowUpdaterT   rW   rX   rM   rY   rI   r[   DNS_ZONE_REQUEST_REVERSEDNS_ZONE_REQUEST_PRIMARYDnssrvComplexOperation2DNSSRV_TYPEID_DWORDru   dwZoneCountra   )r\   r  rev_zonezone_createrequest_filterr}   r   r1  s           r7   test_operation2zDnsserverTests.test_operation2  s}   ">+ACC"*!%!;#'#>  ) ? 		"">#$#';#'#$#/#,#F#.	0 	0 	0 $<#<=944^5659[595@5>5R5CE E5 	E-... 		"">#$#';#+#$#5#,#?#'	) 	) 	) 	99.:;:>+:>:E:C:W:HJ J 	E-.....r9   c           	      6   t           j        }t           j        t           j        z  }| j                            |d| j        d dt           j        |          \  }}|                     t           j	        |           |                     d|j
                   t           j        t           j        z  }| j                            |d| j        d dt           j        |          \  }}|                     t           j	        |           |                     d|j
                   d S )Nr   rE  rn   )r   rZ   DNS_ZONE_REQUEST_FORWARDrH  rM   rI  rI   rJ  ru   DNSSRV_TYPEID_ZONE_LISTrK  rG  )r\   r  rN  r1  r   s        r7   test_complexoperation2z%DnsserverTests.test_complexoperation2  s   ">#<#<= 	99.:;:>+:>:E:C:W:HJ J 	:FCCCE-...#<#<=	99.:;:>+:>:E:C:W:HJ J 	:FCCCE-.....r9   c                     t           j        }t          j        }t           j        t           j        z  }| j                            |d| j        ddd ||d d 
  
        \  }}| 	                    d|j
                   d S )Nr   z..RootHintsr      )r   rZ   r   DNS_TYPE_NSDNS_RPC_VIEW_ROOT_HINT_DATADNS_RPC_VIEW_ADDITIONAL_DATArM   rs   rI   ru   count)r\   r  record_typeselect_flagsr}   	roothintss         r7   test_enumrecords2z DnsserverTests.test_enumrecords2  s    ">&!=!>?y33N4548K4A47484?4@4848	: 	:9 	Y_-----r9   c                 @   t           j        }t          j        }t           j        }d}t          d          }t          d          }t          j                    }||_        | j        	                    |d| j
        | j        ||d            | j                            |d| j
        | j        |d ||d d 
  
        \  }}	|                     d|	j                   |                     d|	j        d         j                   |                     t          j        |	j        d         j        d         j                   |                     d|	j        d         j        d         j                   t          j                    }||_        t          j                    }
||
_        | j        	                    |d| j
        | j        |||
           | j                            |d| j
        | j        |d ||d d 
  
        \  }}	|                     d|	j                   |                     d|	j        d         j                   |                     t          j        |	j        d         j        d         j                   |                     d|	j        d         j        d         j                   t          j                    }
||
_        | j        	                    |d| j
        | j        |d |
           |                     t(          | j        j        |d| j
        | j        |d ||d d            d S )Ndummyz1.2.3.4z5.6.7.8r   rC   )r   rZ   r   
DNS_TYPE_Art   r   r#  rw   rM   r$  rI   rB   rs   ru   rY  wRecordCountr   r   r   assertRaisesr  )r\   r  rZ  r[  r   rw   rec2r%  r}   r~   r(  buflens               r7   test_updaterecords2z"DnsserverTests.test_updaterecords2  s   ">o <i  y!!  244	%%n&'&*k&*i&*&1&*	, 	, 	, I0012151515151<1=1515	7 	7	6 	FL)))FJqM6777&*Q-*?*B*HIIIFJqM$9!$<$ABBB  244244	%%n&'&*k&*i&*&1&1	3 	3 	3 55n676:k6:i6:6:6A6B6:6:	< 	< 	FL)))FJqM6777&*Q-*?*B*HIIIFJqM$9!$<$ABBB  244	%%n&'&*k&*i&*&*&1	3 	3 	3 	,	(D(+)%&
	  
	  
	  
	  
	 r9   c                 6   | j                             d| j                                         z  t          j        dddg          }|                     t          |          d           |                     d|d                    |d         d         d         }t          j	        | j                   }t          t          j        |          }t          j        | j                                                   }| j                             | j                                         t          j        dd	g          }t          t          t          j        |d         d	         d                             }t          j        d
|d|i          }t          j        t          t          j        |                    }	t          j        |	||          }
|                     |
dd|
d|	                    |j                  d|                    |j                             dS )z_
        Make sure that security descriptors of the msdcs zone is
        as expected.
        zDC=ForestDnsZones,%sz&(&(objectClass=dnsZone)(name=_msdcs*))nTSecurityDescriptorobjectClassr   rC   r   (sAMAccountName=DnsAdmins)	objectSidzO:SYG:BAD:AI(A;;RPWPCRCCDCLCLORCWOWDSDDTSW;;;DA)(A;;CC;;;AU)(A;;RPLCLORC;;;WD)(A;;RPWPCRCCDCLCLORCWOWDSDDTSW;;;SY)(A;CI;RPWPCRCCDCLCRCWOWDSDDTSW;;;ED)	DnsAdminsr   z8SD of msdcs zone different to expected.
Difference was:

Expected: 
Got: N)rN   r   r   r   r   ru   rv   assertInr   SDUtilsr   r	   r   dom_sidget_domain_sidry   sddl2binaryget_clean_sdget_diff_sdsas_sddl
domain_sid)r\   r   tmputilssdrv  r   	dns_admin	packed_sdexpected_sddiffs              r7   #test_security_descriptor_msdcs_zonez2DnsserverTests.test_security_descriptor_msdcs_zonec  s    
!!'=
@]@]@_@_'_(+(9-U)?(O " Q Q 	UQ''',eAh777Ah-.q1 ,,+S11%dj&?&?&A&ABB
jTZ%B%B%D%DCL]+G'2m   5 5 
8#3SVK5H5KLLMM	* ,R ,6Y7OQ Q	 !-j9Li.X.XYY&{B
CCrr$$ 3 3E4D E E E E**U%5666$8 	9 	9 	9 	9 	9r9   c                 	   d}t          j                    }t          j        |_        d|_        d|_        d|_        ||_        t           j	        |_
        | j                            t           j        d| j        dddt           j        |           | j                                        }|                    d           | j                            |t(          j        d|z  dg	          }|                     t/          |          d           |d         j        }|                     d|d                    |d         d         d         }t5          j        | j                  }t9          t:          j        |          }t;          j        | j                                                   }	| j                            | j                                        t(          j        d
dg	          }
tC          t9          t:          j        |
d         d         d                             }t=          j"        d|	d|i          }t=          j#        t9          t:          j        |                    }t=          j$        |	d|i          }t=          j#        t9          t:          j        |                    }t=          j%        |	          }t=          j#        t9          t:          j        |                    }	 t)          j&        | j        dtC          |          z            }|'                                |f|'                                |f|'                                |fg}|D ]\  }}| j                            |t(          j(        dg          }|                     d|d                    |d         d         d         }t5          j        | j                  }t9          t:          j        |          }t=          j)        |||	          }|                     |dd|d|d|*                    |j+                  d|*                    |j+                             	 | j                            t           j        d| j        |ddt           j,        d           dS # | j                            t           j        d| j        |ddt           j,        d           w xY w)zb
        Make sure that security descriptors of forest dns zones are
        as expected.
        test_forest_zoner   rC   NrD   zDC=ForestDnsZones	(name=%s)rg  r   ri  rj  O:DAG:DAD:AI(A;;RPWPCRCCDCLCLORCWOWDSDDTSW;;;DA)(A;;CC;;;AU)(A;;RPLCLORC;;;WD)(A;;RPWPCRCCDCLCLORCWOWDSDDTSW;;;SY)(A;CI;RPWPCRCCDCLCRCWOWDSDDTSW;;;ED)rk  CN=MicrosoftDNS,%sr   r   r   r   z0Security descriptor of forest DNS zone with DN ')' different to expected. Difference was:
rl  rm  r`   )-r   rP   r   rR   rS   rT   rU   rV   rQ   DNS_DP_FOREST_DEFAULTrX   rM   rY   rZ   rI   r[   rN   r   	add_childr   r   r   ru   rv   r   rn  r   ro  r   r	   r   rp  rq  ry   rr  rs  'get_dns_forest_microsoft_dns_descriptorget_dns_partition_descriptorr   get_linearized
SCOPE_BASErt  ru  rv  ra   )r\   forest_zoner]   partition_dnr   
current_dnrw  rx  ry  rv  r   rz  r{  r|  packed_msdnsexpected_msdns_sdpacked_part_sdexpected_part_sdmsdns_dnsecurity_desc_dictkeysec_descr}  s                          r7   $test_security_descriptor_forest_zonez3DnsserverTests.test_security_descriptor_forest_zone  s   
 )$FHH&*&@#"#)*&)*&'2$%.%D"	""9#H#$#';#'#$#/#,#F#3	5 	5 	5 z44662333
!!|3;L-8;-F)?(@ " B B 	UQ'''1X[
,eAh777Ah-.q1 ,,+S11%dj&?&?&A&ABB
jTZ%B%B%D%D&)&7+G'2m   5 5
 
8#3SVK5H5KLLMM	* ,R ,6Y7OQ Q	 !-j9Li.X.XYY!I*KVXaJbd d&3Jx?RT`4a4abb#@LL%2:h>Q>L4N 4N O O	-vdj*>\ARAR*RSSH#-#<#<#>#>"L#+#:#:#<#<>O"P#/#>#>#@#@BR"S"U $6 r rh
))s#.1G0H * J J4eAh???Ah56q9 (44 3S99!.xZHH  rr$'CCx/?/?@P/Q/Q/Q/QSUS]S]^c^nSoSoSo,q r r r rr I&&y'L'('+{'2'('9'0'C'+- - - - -DI&&y'L'('+{'2'('9'0'C'+- - - -s   'E'R <Sc                    | j                                         }|                    d           | j                             |t          j        d| j        z  dg          }|                     t          |          d           |d         j	        }| 
                    d|d                    |d         d         d         }t          j        | j                   }t          t          j        |          }|                    |j                  }t          j        | j                                                   }| j                             | j                                         t          j        ddg          }	t)          t          t          j        |	d         d         d                             }
t          j        d	|d
|
i          }t          j        t          t          j        |                    }t          j        |d
|
i          }t          j        t          t          j        |                    }t          j        |          }t          j        t          t          j        |                    }t	          j        | j         dt)          |          z            }|                                |f|                                |f|                                |fg}|D ]\  }}| j                             |t          j        dg          }| 
                    d|d                    |d         d         d         }t          j        | j                   }t          t          j        |          }t          j        |||          }|                     |dd|d|d|                    |j                  d|                    |j                             dS )zb
        Make sure that security descriptors of domain dns zones are
        as expected.
        zDC=DomainDnsZonesr  rg  r   rC   r   ri  rj  r  rk  r  r  r   z0Security descriptor of domain DNS zone with DN 'r  rl  rm  N)rN   r   r  r   r   r   rO   ru   rv   r   rn  r   ro  r   r	   r   ru  rv  rp  rq  ry   rr  rs  'get_dns_domain_microsoft_dns_descriptorr  r   r  r  rt  )r\   r  r   r  rw  rx  ry  sddlrv  r   rz  r{  r|  r  r  r  r  r  r  r  r  r}  s                         r7   $test_security_descriptor_domain_zonez3DnsserverTests.test_security_descriptor_domain_zone  s    z44662333
!!|3;L-84;K-K)?(@ " B B 	UQ'''1X[
,eAh777Ah-.q1 ,,+S11zz%*++%dj&?&?&A&ABB
jTZ%B%B%D%DCL]+G'2m   5 5 
8#3SVK5H5KLLMM	* ,R ,6Y7OQ Q	 !-j9Li.X.XYY!I*KVXaJbd d&3Jx?RT`4a4abb#@LL%2:h>Q>L4N 4N O O 6$*&:S=N=N&NOO)88::KH'6688:KL+::<<>NOQ  2 	n 	nOS(J%%3cn-C,D & F FEMM0%(;;;(1215C$TZ00EH/55B*8RDDDT22 #TTT8+;+;E<L+M+M+M+MrzzZ_ZjOkOkOk(m n n n n	n 	nr9   )r   rB   r   )+__name__
__module____qualname__classmethodr8   rF   rb   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r
  r  r  r   rZ   r  r   r  rr   r   r2  rA  rC  rO  rS  r]  re  r~  r  r  __classcell__)r^   s   @r7   r   r   !   s       N
 N
 [N
`5 5 5 5 5>	/ 	/ 	/ 	/ 	/!I !I !IF-N -N -N^< < <>!I !I !IRT T T*., ., .,`H H H43 3 36F F FSg Sg Sgj	` 	` 	` BNZ Z Z ZQ Q Qt t t@U| U| U|pR R R.
X 
X 
X] ] ]8 !%Y5ZP P P P4 LM*3*ON N N N" IRHm 
2 
2 
2 
2 ")2WN N N N: !%Y5Zh h h h2F F F4  .  .1/ 1/ 1/f/ / /6. . ."S  S  S |%9 %9 %9NX- X- X-t<n <n <n <n <n <n <nr9   r   )__doc__rG   r   
samba.authr   samba.samdbr   	samba.ndrr   r   samba.dcerpcr   r   r	   samba.testsr
   r   samba.dnsserverr   r   r   sambar   r   r   r   r   r   r9   r7   <module>r     s(  $ ' & 				 



 % % % % % %       * * * * * * * * 2 2 2 2 2 2 2 2 2 2 ? ? ? ? ? ? ? ? I I I I I I I I I I & & & & & & & & % % % % % % % %n n n n n) n n n n nr9   