a
    ¡Öaàþ  ã                   @   sÄ   d dl mZ d dlZd dlZd dlmZ d dlmZ d dlm	Z	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mZmZmZmZmZ d d	lmZmZ d d
lmZmZ G dd„ deƒZ dS )é    )Úprint_functionN)Úsystem_session)ÚSamDB)Ú
ndr_unpackÚndr_pack)ÚdnspÚ	dnsserverÚsecurity)ÚRpcInterfaceTestCaseÚenv_get_var_value)ÚARecordÚ
AAAARecordÚ	PTRRecordÚCNameRecordÚNSRecordÚMXRecordÚ	SRVRecordÚ	TXTRecord)Úsd_utilsÚ
descriptor)ÚWERRORErrorÚwerrorc                       sd  e Zd Zedd„ ƒZ‡ f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dNdd„Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*ejfd+d,„Zd-ejfd.d/„Zejfd0d1„Zd2d3„ Zd4d5„ Zd*ejfd6d7„Zd*ejfd8d9„Zd:d;„ Z d<d=„ Z!d>d?„ Z"d@dA„ Z#dBdC„ Z$dDdE„ Z%dFdG„ Z&dHdI„ Z'dJdK„ Z(dLdM„ Z)‡  Z*S )OÚDnsserverTestsc              	   C   sê   dddd ddddd	d
g	}g d¢}dg}g }dg}g }|D ] }|  d| ¡ |  d| ¡ q:|D ] }|  d| ¡ |  d| ¡ q`ddgg d¢|||||g d¢dœ| _ddgg d¢|||||dœ| _dddd g}	g d¢}
|	|
dœ| _d S )NúSAMDOM.EXAMPLE.COMz1.EXAMPLE.COMz%sEXAMPLE.COMzÈ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.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 65536A   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_recordsZinvalid_records)ÚclsZgood_dnsZbad_dnsZgood_mxZbad_mxZgood_srvZbad_srvZbad_dnZgood_dnZ
invalid_mxZinvalid_srv© r.   ú>/usr/lib/python3/dist-packages/samba/tests/dcerpc/dnsserver.pyÚ
setUpClass$   sd    ø	ÿíÿóþþzDnsserverTests.setUpClassc              
      sÈ   t t| ƒ ¡  tjd | _tdƒ ¡ | _t	 	d| j |  
¡ |  ¡ ¡| _tdtjd  |  
¡ tƒ |  ¡ d| _d| _t	 ¡ }| j|_tj|_d|_d	|_d	|_t	j|_| j t	jd| jd dd
t	j|¡ d S )NZ	DC_SERVERZREALMzncacn_ip_tcp:%s[sign]z	ldap://%sZDC_SERVER_IP)ZurlZlpZsession_infoZcredentialsÚzoner   é   Ú
ZoneCreate)Úsuperr   ÚsetUpÚosÚenvironÚserverr   Úlowerr1   r   Zget_loadparmZ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__r.   r/   r5   u   s:    þý
ùzDnsserverTests.setUpc              
      s4   | j  tjd| j| jddtjd ¡ tt| ƒ 	¡  d S )Nr   ÚDeleteZoneFromDs)
r:   rF   r   rG   r8   r<   ÚDNSSRV_TYPEID_NULLr4   r   ÚtearDown©rI   rK   r.   r/   rO   ”   s    
ùzDnsserverTests.tearDownc                 C   s@  d}d}|   | jd||¡ |   | jd||¡ |   | jd||¡ |   | jd||¡ |   | jd||¡ |   | j| j||¡ | j tjd| j| jd	d
|  |¡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   r2   é   é   é   é   ©Ú
add_recordr<   r:   ÚDnssrvEnumRecords2r   rG   r8   Úrecord_type_intÚDNS_RPC_VIEW_AUTHORITY_DATAÚassertEqualÚlenÚrecÚdnsNodeNameÚstr©rI   Ú
record_strÚrecord_type_strÚ_Úresultr.   r.   r/   Útest_enum_is_sortedŸ   s4    
÷z"DnsserverTests.test_enum_is_sortedc                 C   s¾  d}d}|   | jd||¡ |   | jd||¡ |   | jd||¡ |   | jd||¡ |   | jd||¡ |   | j| jd ||¡ |  | j| jd ¡\}}t | jt|ƒ¡}| d	d
| j¡ | j ||¡ | j	 
tjd	| j| jdd|  |¡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 krº|  |jd jj| j¡ dS )rQ   rR   r"   rS   rT   rU   rV   rW   Ú1r   ZdcrX   Né   r   r2   rZ   r[   r\   r]   rY   )r_   r<   Úget_record_from_dbÚldbÚDnr;   rg   Zset_componentÚrenamer:   r`   r   rG   r8   ra   rb   rc   rd   re   rf   )rI   ri   rj   ÚdnÚrecordZnew_dnrk   rl   r.   r.   r/   Ú!test_enum_is_sorted_with_zone_dupÂ   s@    
÷z0DnsserverTests.test_enum_is_sorted_with_zone_dupc                 C   sÐ   d}d}|   | jd||¡ |   | jd||¡ |   | jd||¡ |   | jd||¡ |   | jd||¡ |   | jd||¡ | j tjd	| j| jd
d|  |¡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
        rR   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.bNrY   r   r^   rh   r.   r.   r/   Ú)test_enum_is_sorted_children_prefix_firstñ   s*    
÷z8DnsserverTests.test_enum_is_sorted_children_prefix_firstc                 C   s>  d}d}|   | jd||¡ |   | jd||¡ |   | jd||¡ |   | jd||¡ |   | jd||¡ |   | jd||¡ | j tjd	| j| jd
d|  |¡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 )rQ   rR   r"   rw   rx   ry   rz   r{   r|   r   r}   NrY   r   r2   rW   rZ   rS   r[   rT   r\   rU   r]   rV   r^   rh   r.   r.   r/   Útest_enum_is_sorted_children  s4    
÷z+DnsserverTests.test_enum_is_sorted_childrenc                 C   s¢   d}d}|   | jd||¡ |  | jd¡\}}d|_| j ||g¡}|durT|  d¡ |  | jd|¡ | j | jd||dd |  | jd||¡ |  | jd|d¡ dS )	zX
        See what happens when we set a record's rank to
        DNS_RANK_NONE.
        rR   r"   Ú
testrecordr   Nz2Unable to update dns record to have DNS_RANK_NONE.F©Ú	assertion)	r_   r<   rp   Úrankr;   Údns_replace_by_dnÚfailÚassert_num_recordsÚdelete_record©rI   ri   rj   rt   ru   Úresr.   r.   r/   Útest_rank_none9  s    
zDnsserverTests.test_rank_nonec                 C   sŽ   d}d}|   | jd||¡ |  | jd¡\}}tj|_| j ||g¡}|durV|  d¡ |  	| jd|¡ |  
| jd||¡ |  	| jd|d¡ dS )zI
        See what happens when we set a record to be tombstoned.
        rR   r"   r€   Nz-Unable to update dns record to be tombstoned.r   )r_   r<   rp   r   ZDNS_TYPE_TOMBSTONEÚwTyper;   r„   r…   r†   r‡   rˆ   r.   r.   r/   Útest_dns_tombstonedN  s    
z"DnsserverTests.test_dns_tombstonedc           	      C   s¶   | j jd| j  ¡  tjddgd}d}|D ] }d| t|jƒv r*|j} qLq*|du r`td| ƒ‚| j j|tjdd	gd}|D ]4}|t|jƒv r|tt	j
|d	 d
 ƒ}|j|f  S q|dS )z0
        Returns (dn of record, record)
        zDC=DomainDnsZones,%sz(objectClass=dnsZone)Zcn©ÚbaseÚscopeZ
expressionÚattrsNzDC=%s,zCouldn't find zone '%s'.z(objectClass=dnsNode)Z	dnsRecordr   )r;   ÚsearchÚget_default_basednrq   ÚSCOPE_SUBTREErg   rt   ÚAssertionErrorr   r   ZDnssrvRpcRecord)	rI   Z	zone_nameZrecord_nameÚzonesZzone_dnr1   ÚrecordsZold_packed_recordre   r.   r.   r/   rp   a  s&    þþz!DnsserverTests.get_record_from_dbc                 C   sb  dg}ddg}dg d¢i}dgg d¢dgd	gd
gdœ}dD ]}|||< |||< q:|D ] }|| D ]’}|   | jd||d ¡ |D ]*}| j | jd||dd |  | jd|¡ q~|  | jd||d ¡ |D ],}|   | jd||d ¡ |  | jd||¡ qÄq`qT|D ]`}|| D ]P}d}	|D ]r}|	d }	z*|   | jd||¡ | j| jd||	d W n8 ty„ }
 ztd||
|f ƒ‚W Y d}
~
n
d}
~
0 0 q|D ]&}|  | jd||¡ |dkrŽqŽqŽ|   | jd||d ¡ |D ]p}||d kræqÐz| j| jd||dd W n< ty< }
 z"td|d ||
f ƒ‚W Y d}
~
n
d}
~
0 0 qÐ|  | jd||d ¡ qqúd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   r2   ©Úexpected_numzkFailed to add %s, which should be distinct from all others in the set. Original error: %s
Distinct set: %s.Nr%   zCManaged to remove %s by attempting to remove %s. Original error: %s)r_   r<   r†   r‡   r”   )rI   Zdistinct_dnsZduplicate_dnsÚ
duplicatesZdistinctrj   Zduplicate_tupleru   Zdistinct_tupleÚiÚer.   r.   r/   Útest_duplicate_matching|  sh    ÿÿ÷

ÿ 
ÿ z&DnsserverTests.test_duplicate_matchingc                 C   sT   | j D ]H}| j | D ]8}|  | jd||¡ |  | jd|¡ |  | jd||¡ qqdS )zb
        Make sure that we can add, update and delete a variety
        of valid records.
        r€   N©r+   r_   r<   r†   r‡   )rI   rj   ri   r.   r.   r/   Útest_accept_valid_commandsÑ  s
    
z)DnsserverTests.test_accept_valid_commandsr   r1   r€   c              	   C   s  |   |	|
¡}|  |d| ¡ |\}}|  ||jd||j|f ¡ |  ||jd||j|f ¡ |  ||jd||j|f ¡ |  ||jd||j|f ¡ |  ||jd||j|f ¡ |  | ¡ |j	 ¡ d||j	 ¡ | ¡ f ¡ |  ||j
d||j
|f ¡ |  ||jd	||j|f ¡ d S )
Nz/Expected record %s but was not found over LDAP.z:Unexpected data length for record %s. Got %s, expected %s.z3Unexpected rank for record %s. Got %s, expected %s.z4Unexpected flags for record %s. Got %s, expected %s.z;Unexpected time to live for record %s. Got %s, expected %s.z9Unexpected dwReserved for record %s. Got %s, expected %s.z3Unexpected data for record %s. Got %s, expected %s.z4Unexpected wType for record %s. Got %s, expected %s.z8Unexpected timestamp for record %s. Got %s, expected %s.)rp   ZassertIsNotNonerc   ÚwDataLengthrƒ   ÚflagsÚdwTtlSecondsÚ
dwReservedr9   Údatar‹   ÚdwTimeStamp)rI   r    rƒ   r¡   r¢   r£   r¤   r‹   r¥   r1   Zrec_namer‰   Zrec_dnre   r.   r.   r/   Úcheck_paramsÜ  s    ,zDnsserverTests.check_paramsc              	   C   s²   |   | 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"   rR   r\   éð   r   i„  r2   r#   zAAAA:AAAA::é   z'AAAA:AAAA:0000:0000:0000:0000:0000:0000é   r%   Z	cnamedesté   r]   N)r_   r<   r¦   r‡   rP   r.   r.   r/   Útest_record_paramsê  s    z!DnsserverTests.test_record_paramsc                 C   sR  d}| j D ]Ž}| j | D ]~}zD| j| jd||dd | j| jd|dd | j| jd||dd W q ty” } zt|ƒ |d }W Y d}~qd}~0 0 qq
| j D ]˜}| j | D ]ˆ}| j| d }|  | jd||¡ z| j| jd||dd W n6 ty" } zt|ƒ |d }W Y d}~n
d}~0 0 |  | jd||¡ q®q |  |dkd| ¡ 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˜   r2   Nz6Failed to reject invalid commands. Total failures: %d.)	r,   r_   r<   r†   r‡   r”   Úprintr+   Ú
assertTrue)rI   Únum_failuresrj   ri   rœ   Zgood_record_strr.   r.   r/   Útest_reject_invalid_commandsù  s*    
"
z+DnsserverTests.test_reject_invalid_commandsc                 C   s  d}| j D ]ô}| j | d }|  | jd||¡ | j D ]´}||krFq6| j | d }|dkpb|dk}|dkpr|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}z4|  | jd||¡ |rL|d }td||f ƒ W nD ty’ } z*|s~|d }td||f ƒ W Y d}~n
d}~0 0 |s®d}d}|	r²|
r²d}|sÄ|sÄ|rÜ|dksØ|dkrÜd}|dkrö|sò|röd}z| j| jd||d W nB tyP } z(|d }td||||f ƒ W Y d}~n
d}~0 0 z| j| jd||d W nB ty¬ } z(|d }td||||f ƒ W Y d}~n
d}~0 0 z|  | jd||¡ W q6 tyê } zW Y d}~q6d}~0 0 q6|  | jd||¡ q
|  |dkd| ¡ 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&   Tr2   z1Expected error when adding %s while a %s existed.z6Didn't expect error when adding %s while a %s existed.Nr˜   zPExpected %s %s records after adding a %s record and a %s record already existed.z>Failed collision and replacement behavior. Total failures: %d.)r+   r_   r<   r¬   r”   r†   r‡   r­   )rI   r®   Zrecord_type_str_1Úrecord1Zrecord_type_str_2Úrecord2Zhas_aZhas_aaaaZ	has_cnameZhas_ptrZhas_mxZhas_srvZhas_txtZadd_error_okrœ   Zexpected_num_type_1Zexpected_num_type_2r.   r.   r/   Ú!test_add_duplicate_different_type  s€    ÿ
ÿ&
ÿ
ÿz0DnsserverTests.test_add_duplicate_different_typec                 C   s®   | j d d }|  | jdd|¡ | j D ]<}| j | d }| j| jd||dd | j| jd|dd q&d}d}| j| jd	d
|dd | j| jdd|dd |  | jdd|¡ dS )z@
        Test some special properties of CNAME records.
        r%   r2   r€   r   Fr   r˜   ztestrecord 1Zmxrecr'   Znsrecr&   Nrž   )rI   Zcname_recordrj   Zother_recordZ	mx_recordZ	ns_recordr.   r.   r/   Ú_test_cnameq  s    
zDnsserverTests._test_cnamec                 C   sh   | j D ]\}| j | d }|  | jd||¡ | j| jd||dd |  | jd|¡ |  | jd||¡ qdS )zK
        Make sure that we can't add duplicate values of any type.
        r   r€   Fr   Nrž   )rI   rj   ru   r.   r.   r/   Útest_add_duplicate_valueˆ  s    
z'DnsserverTests.test_add_duplicate_valuec                 C   sÀ   | j D ]´}tdt| j | ƒƒD ]š}| j | |d  }| j | | }|dkrLq|dkrXdnd}|  | jd||¡ |  | jd||¡ | j| jd||d |  | jd||¡ |  | jd||¡ qq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).
        r2   r%   rZ   r€   r˜   N)r+   Úrangerd   r_   r<   r†   r‡   )rI   rj   r›   r°   r±   r™   r.   r.   r/   Útest_add_similar_value”  s    
z%DnsserverTests.test_add_similar_valueTc              
   C   s¾   z|   |||¡\}}W nH ty^ }	 z0|r<td||f ƒ‚nW Y d}	~	dS W Y d}	~	n
d}	~	0 0 d}
|jd jD ]}|j|krpd}
 qˆqp|
r¢|s¢td||f ƒ‚n|
sº|rºtd||f ƒ‚dS )zo
        Asserts whether or not the given record with the given type exists in the
        given zone.
        zBRecord '%s' of type '%s' was not present when it should have been.NFr   TzARecord '%s' of type '%s' was present when it shouldn't have been.)Úquery_recordsÚRuntimeErrorr”   re   r–   r¤   )rI   r1   Únamerj   Zexpected_record_strr‚   Úclient_versionrk   rl   rœ   Úfoundru   r.   r.   r/   Úassert_record¯  s"    ÿ$
zDnsserverTests.assert_recordr2   c           	      C   st   zB|   |||¡\}}t|jd jƒ}||ks@td||||f ƒ‚W n, tyn   |dksjtd|||f ƒ‚Y n0 dS )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·   rd   re   r–   r”   r¸   )	rI   r1   r¹   rj   r™   rº   rk   rl   Znum_resultsr.   r.   r/   r†   É  s    
ÿ
ÿz!DnsserverTests.assert_num_recordsc                 C   s.   | j  |d| j||d |  |¡tjtjB d d ¡
S )Nr   )r:   r`   r8   ra   r   rb   ZDNS_RPC_VIEW_NO_CHILDREN)rI   r1   r¹   rj   rº   r.   r.   r/   r·   Ú  s    
÷zDnsserverTests.query_recordsc                 C   sØ   |dkrt |ƒS |dkr t|ƒS |dkr0t|ƒS |dkr@t|ƒS |dkrPt|ƒS |dkrx| d¡}t|d t|d	 ƒƒS |d
krÄ| d¡}|d }t|d	 ƒ}t|d ƒ}t|d ƒ}t||||ƒS |dkrÔt	|ƒS d S )Nr"   r#   r$   r%   r&   r'   ú r   r2   r(   rZ   r[   r)   )
r   r   r   r   r   Úsplitr   Úintr   r   )rI   rj   ri   r¾   ÚtargetZportZpriorityZweightr.   r.   r/   Úrecord_obj_from_stræ  s,    

z"DnsserverTests.record_obj_from_strc                 C   st   |dkrt jS |dkrt jS |dkr*t jS |dkr8t jS |dkrFt jS |dkrTt jS |dkrbt jS |dkrpt jS d S )	Nr"   r#   r$   r%   r&   r'   r(   r)   )	r   Ú
DNS_TYPE_AZDNS_TYPE_AAAAZDNS_TYPE_PTRZDNS_TYPE_CNAMEÚDNS_TYPE_NSZDNS_TYPE_MXZDNS_TYPE_SRVZDNS_TYPE_TXT)rI   rj   r.   r.   r/   ra   þ  s     zDnsserverTests.record_type_intc           
   
   C   s   |   ||¡}t ¡ }||_z2| j |d| j|||d¡ |sJtd||f ƒ‚W n> tyŠ }	 z&|rvtd||t	|	ƒf ƒ‚W Y d}	~	n
d}	~	0 0 dS )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   NzFSuccessfully added record '%s' of type '%s', which should have failed.zTFailed to add record '%s' of type '%s', which should have succeeded. Error was '%s'.©
rÁ   r   ÚDNS_RPC_RECORD_BUFre   r:   ÚDnssrvUpdateRecord2r8   r”   r¸   rg   )
rI   r1   r¹   rj   ri   r‚   rº   ru   Úadd_rec_bufrœ   r.   r.   r/   r_     s*    úÿ
ÿzDnsserverTests.add_recordc           
   
   C   s   |   ||¡}t ¡ }||_z2| j |d| j||d|¡ |sJtd||f ƒ‚W n> tyŠ }	 z&|rvtd||t	|	ƒf ƒ‚W Y d}	~	n
d}	~	0 0 dS )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   NzHSuccessfully deleted record '%s' of type '%s', which should have failed.zWFailed to delete record '%s' of type '%s', which should have succeeded. Error was '%s'.rÄ   )
rI   r1   r¹   rj   ri   r‚   rº   ru   Údel_rec_bufrœ   r.   r.   r/   r‡   ,  s"    úzDnsserverTests.delete_recordc                 C   s‚   | 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   Z
ServerInfo)r:   ZDnssrvQuery2r   ZDNS_CLIENT_VERSION_W2Kr8   rc   ZDNSSRV_TYPEID_SERVER_INFO_W2KZDNS_CLIENT_VERSION_DOTNETZ DNSSRV_TYPEID_SERVER_INFO_DOTNETrG   ZDNSSRV_TYPEID_SERVER_INFO)rI   Útypeidrl   r.   r.   r/   Útest_query2E  s*    
ü
ü
üzDnsserverTests.test_query2c              
   C   sŒ   d}t j}t  ¡ }d|_tj|_z| j | j	|dd||¡}W nB t
y~ } z*|jd tjkrjW Y d }~d S W Y d }~n
d }~0 0 |  ¡  d S )Núa-zone-that-does-not-existÚAllowUpdater2   ÚResetDwordPropertyr   )r   ÚDNSSRV_TYPEID_NAME_AND_PARAMÚDNS_RPC_NAME_AND_PARAMÚpszNodeNamer   ÚDNS_ZONE_UPDATE_SECUREÚdwParamr:   ZDnssrvOperationr8   r   Úargsr   Ú"WERR_DNS_ERROR_ZONE_DOES_NOT_EXISTr…   )rI   Únon_zonerÉ   Úname_and_paramr‰   rœ   r.   r.   r/   Útest_operation_invalid_  s"    
û$z%DnsserverTests.test_operation_invalidc              
   C   s–   t j}d}t j}t  ¡ }d|_tj|_z | j 	|d| j
|dd||¡}W nB tyˆ } z*|jd tjkrtW Y d }~d S W Y d }~n
d }~0 0 |  ¡  d S )NrË   rÌ   r   r2   rÍ   )r   rG   rÎ   rÏ   rÐ   r   rÑ   rÒ   r:   rF   r8   r   rÓ   r   rÔ   r…   )rI   rº   rÕ   rÉ   rÖ   r‰   rœ   r.   r.   r/   Útest_operation2_invalidv  s(    ù$z&DnsserverTests.test_operation2_invalidc              
   C   sÞ   t j}d}t  ¡ }||_tj|_tj|_d|_	t j
|_| j |d| jd ddt j|¡ t jt jB }| 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   r3   Ú	EnumZonesr2   rM   )r   rG   r=   r>   r   r?   r@   rÑ   ZfAllowUpdaterA   rD   rE   r:   rF   r8   rH   ÚDNS_ZONE_REQUEST_REVERSEÚDNS_ZONE_REQUEST_PRIMARYÚDnssrvComplexOperation2ÚDNSSRV_TYPEID_DWORDrc   ÚdwZoneCountrN   )rI   rº   Zrev_zoneZzone_createÚrequest_filterrk   r•   rÉ   r.   r.   r/   Útest_operation2  s^    ù	ÿúù	úzDnsserverTests.test_operation2c              	   C   sš   t j}t jt jB }| j |d| jd dt j|¡\}}|  t j	|¡ |  d|j
¡ t jt jB }| j |d| jd dt j|¡\}}|  t j	|¡ |  d|j
¡ d S )Nr   rÙ   r[   )r   rG   ZDNS_ZONE_REQUEST_FORWARDrÛ   r:   rÜ   r8   rÝ   rc   ZDNSSRV_TYPEID_ZONE_LISTrÞ   rÚ   )rI   rº   rß   rÉ   r•   r.   r.   r/   Útest_complexoperation2À  s6    ÿúÿúz%DnsserverTests.test_complexoperation2c                 C   sN   t j}tj}t jt jB }| j |d| jddd ||d d ¡
\}}|  	d|j
¡ d S )Nr   z..RootHintsr   é   )r   rG   r   rÃ   ZDNS_RPC_VIEW_ROOT_HINT_DATAZDNS_RPC_VIEW_ADDITIONAL_DATAr:   r`   r8   rc   Úcount)rI   rº   Úrecord_typeÚselect_flagsrk   Z	roothintsr.   r.   r/   Útest_enumrecords2Û  s"    ÿ÷
z DnsserverTests.test_enumrecords2c                 C   sÚ  t j}tj}t j}d}tdƒ}tdƒ}t  ¡ }||_| 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  ¡ }||_t  ¡ }
||
_| 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 	|d| j
| j|d |
¡ |  t| jj|d| j
| j|d ||d d ¡ d S )NZdummyz1.2.3.4z5.6.7.8r   r2   )r   rG   r   rÂ   rb   r   rÅ   re   r:   rÆ   r8   r1   r`   rc   rã   ZwRecordCountr–   r‹   r¤   ZassertRaisesr¸   )rI   rº   rä   rå   r¹   re   Zrec2rÇ   rk   rl   rÈ   Zbuflenr.   r.   r/   Útest_updaterecords2ì  s     ú÷
ú÷
úöz"DnsserverTests.test_updaterecords2c              
   C   s  | j jd| j  ¡  tjdddgd}|  t|ƒd¡ |  d|d v ¡ |d d d }t 	| j ¡}t
tj|ƒ}t | j  ¡ ¡}| j j| j  ¡ tjdd	gd}tt
tj|d d	 d ƒƒ}t d
|d|i¡}t t
tj|ƒ¡}	t |	||¡}
|  |
dd|
|	 |j¡| |j¡f ¡ dS )z_
        Make sure that security descriptors of the msdcs zone is
        as expected.
        zDC=ForestDnsZones,%sz&(&(objectClass=dnsZone)(name=_msdcs*))ÚnTSecurityDescriptorZobjectClassr   r2   r   ú(sAMAccountName=DnsAdmins)Ú	objectSidz–O:SYG:BAD:AI(A;;RPWPCRCCDCLCLORCWOWDSDDTSW;;;DA)(A;;CC;;;AU)(A;;RPLCLORC;;;WD)(A;;RPWPCRCCDCLCLORCWOWDSDDTSW;;;SY)(A;CI;RPWPCRCCDCLCRCWOWDSDDTSW;;;ED)Ú	DnsAdminsr   zOSD of msdcs zone different to expected.
Difference was:
%s
Expected: %s
Got: %sN)r;   r‘   r’   rq   r“   rc   rd   r­   r   ÚSDUtilsr   r	   r   Údom_sidÚget_domain_sidrg   Úsddl2binaryÚget_clean_sdÚget_diff_sdsÚas_sddlÚ
domain_sid)rI   r•   ÚtmpÚutilsÚsdró   r‰   Ú	dns_adminÚ	packed_sdÚexpected_sdÚdiffr.   r.   r/   Ú#test_security_descriptor_msdcs_zoneK  s4    ýþú

ÿþz2DnsserverTests.test_security_descriptor_msdcs_zonec                 C   s   d}t  ¡ }tj|_d|_d|_d|_||_t j	|_
| j t jd| jdddt j|¡ | j ¡ }| d¡ | jj|tjd| dgd	}|  t|ƒd¡ |d j}|  d|d v ¡ |d d d }t | j¡}ttj|ƒ}t | j  ¡ ¡}	| jj| j ¡ tjd
dgd	}
t!ttj|
d d d ƒƒ}t "d|	d|i¡}t #ttj|ƒ¡}t $|	d|i¡}t #ttj|ƒ¡}t %|	¡}t #ttj|ƒ¡}zôt &| jdt!|ƒ ¡}| '¡ |f| '¡ |f| '¡ |fg}|D ]’\}}| jj|tj(dgd}|  d|d v ¡ |d d d }t | j¡}ttj|ƒ}t )|||	¡}|  |dd||| *|j+¡| *|j+¡f ¡ qÂW | j t jd| j|ddt j,d¡ n"| j t jd| j|ddt j,d¡ 0 dS )zb
        Make sure that security descriptors of forest dns zones are
        as expected.
        Ztest_forest_zoner   r2   Nr3   zDC=ForestDnsZonesú	(name=%s)rè   r   ré   rê   ú–O:DAG:DAD:AI(A;;RPWPCRCCDCLCLORCWOWDSDDTSW;;;DA)(A;;CC;;;AU)(A;;RPLCLORC;;;WD)(A;;RPWPCRCCDCLCLORCWOWDSDDTSW;;;SY)(A;CI;RPWPCRCCDCLCRCWOWDSDDTSW;;;ED)rë   úCN=MicrosoftDNS,%s©rŽ   r   r   r   zrSecurity descriptor of forest DNS zone with DN '%s' different to expected. Difference was:
%s
Expected: %s
Got: %srM   )-r   r=   r   r?   r@   rA   rB   rC   r>   ZDNS_DP_FOREST_DEFAULTrE   r:   rF   rG   r8   rH   r;   r’   Ú	add_childr‘   rq   r“   rc   rd   rt   r­   r   rì   r   r	   r   rí   rî   rg   rï   rð   Z'get_dns_forest_microsoft_dns_descriptorÚget_dns_partition_descriptorrr   Úget_linearizedÚ
SCOPE_BASErñ   rò   ró   rN   )rI   Zforest_zonerJ   Úpartition_dnr•   Ú
current_dnrô   rõ   rö   ró   r‰   r÷   rø   rù   Úpacked_msdnsÚexpected_msdns_sdÚpacked_part_sdÚexpected_part_sdÚmsdns_dnÚsecurity_desc_dictÚkeyÚsec_descrú   r.   r.   r/   Ú$test_security_descriptor_forest_zoner  s¦    
ù	

þ
ýúÿ

ÿ


þÿ
ÿ
ùùz3DnsserverTests.test_security_descriptor_forest_zonec                 C   s  | j  ¡ }| d¡ | j j|tjd| j dgd}|  t|ƒd¡ |d j	}|  
d|d v ¡ |d d d }t | j ¡}ttj|ƒ}| |j¡}t | j  ¡ ¡}| j j| j  ¡ tjddgd}	tttj|	d d d ƒƒ}
t d	|d
|
i¡}t ttj|ƒ¡}t |d
|
i¡}t ttj|ƒ¡}t |¡}t ttj|ƒ¡}t | j dt|ƒ ¡}| ¡ |f| ¡ |f| ¡ |fg}|D ]’\}}| j j|tjdgd}|  
d|d v ¡ |d d d }t | j ¡}ttj|ƒ}t |||¡}|  |dd||| |j¡| |j¡f ¡ qzdS )zb
        Make sure that security descriptors of domain dns zones are
        as expected.
        zDC=DomainDnsZonesrü   rè   r   r2   r   ré   rê   rý   rë   rþ   rÿ   r   zrSecurity descriptor of domain DNS zone with DN '%s' different to expected. Difference was:
%s
Expected: %s
Got: %sN)r;   r’   r   r‘   rq   r“   r<   rc   rd   rt   r­   r   rì   r   r	   r   rò   ró   rí   rî   rg   rï   rð   Z'get_dns_domain_microsoft_dns_descriptorr  rr   r  r  rñ   )rI   r  r•   r  rô   rõ   rö   Zsddlró   r‰   r÷   rø   rù   r  r  r  r	  r
  r  r  r  rú   r.   r.   r/   Ú$test_security_descriptor_domain_zoneÌ  s`    

þ
þúÿ

ÿ


þÿ
ÿz3DnsserverTests.test_security_descriptor_domain_zone)r   r1   r€   )+Ú__name__Ú
__module__Ú__qualname__Úclassmethodr0   r5   rO   rm   rv   r~   r   rŠ   rŒ   rp   r   rŸ   r¦   r«   r¯   r²   r³   r´   r¶   r   rG   r¼   r†   r·   rÁ   ra   r_   r‡   rÊ   r×   rØ   rà   rá   ræ   rç   rû   r  r  Ú__classcell__r.   r.   rK   r/   r   "   sV   
P#/)U ÿ
 Xÿ
ÿ
ÿ
ÿ
3_'Zr   )!Z
__future__r   r6   rq   Z
samba.authr   Zsamba.samdbr   Z	samba.ndrr   r   Zsamba.dcerpcr   r   r	   Zsamba.testsr
   r   Zsamba.netcmd.dnsr   r   r   r   r   r   r   r   Zsambar   r   r   r   r   r.   r.   r.   r/   Ú<module>   s   (