a
    a2                     @   sd   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
 d dlmZ G dd deZdS )	    N)system_session)SamDB)
ndr_unpackndr_pack)dnsp)SambaToolCmdTestc                       s   e Z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dd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Z  ZS )-DnsCmdTestCasec           	   	      sB  t t|   dtjd  | _dtjd tjd f | _| d| j| j| _t	| j
 | _d| _d| _|   d	d
dd dddddg}g d}ddg}g d}ddg}g d}|D ] }|d|  |d|  q|D ] }|d|  |d|  qddgg d|||||g dd| _d d!gg d"|||||d#| _d S )$Nz	ldap://%sSERVERz-U%s%%%sZDC_USERNAMEZDC_PASSWORDz-Hz192.168.0.193z192.168.0.194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.ZEXAMPLEz!@#$%^&*()_u
   HIGHÿBYTEz@.EXAMPLE.COM.)z...z.EXAMPLE.COMz	.EXAMPLE. zSAMDOM..EXAMPLE.COMzSAMDOM.EXAMPLE.COM 65530zSAMDOM.EXAMPLE.COM     0)zSAMDOM.EXAMPLE.COM -1r
    zSAMDOM.EXAMPLE.COM 1 1z%SAMDOM.EXAMPLE.COM SAMDOM.EXAMPLE.COMz$SAMDOM.EXAMPLE.COM 65530 65530 65530z$SAMDOM.EXAMPLE.COM     1     1     1)zSAMDOM.EXAMPLE.COM 0 65536 0zSAMDOM.EXAMPLE.COM 0 0 65536zSAMDOM.EXAMPLE.COM 65536 0 0z%s 1z%s 0 0 0z192.168.0.1z255.255.255.255)
z'1234:5678:9ABC:DEF0:0000:0000:0000:0000z'0000:0000:0000:0000:0000:0000:0000:0000z'1234:5678:9ABC:DEF0:1234:5678:9ABC:DEF0z1234:1234:1234::z1234:5678:9ABC:DEF0::z0000:0000::0000z#1234::5678:9ABC:0000:0000:0000:0000z::1z::z1:1:1:1:1:1:1:1)textr   z@#!
)AAAAAPTRCNAMENSMXSRVZ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   )superr   setUposenvironZdburlcreds_stringZgetSamDBsamdbstrZget_config_basednZ	config_dntestipZtestip2addZoneappendgood_recordsbad_records)	selfZgood_dnsZbad_dnsZgood_mxZbad_mxZgood_srvZbad_srvZbad_dnZgood_dn	__class__ ?/usr/lib/python3/dist-packages/samba/tests/samba_tool/dnscmd.pyr      sj    

zDnsCmdTestCase.setUpc                    s   |    tt|   d S N)
deleteZoner   r   tearDownr#   r$   r&   r'   r*   u   s    zDnsCmdTestCase.tearDownc                 C   s   |    |   d S r(   )r)   r   r+   r&   r&   r'   	resetZoney   s    zDnsCmdTestCase.resetZonec                 C   s:   d| _ | ddtjd | j | j\}}}| ||| d S )NzonednsZ
zonecreater	   )r-   	runsubcmdr   r   r   assertCmdSuccessr#   resultouterrr&   r&   r'   r   }   s    
zDnsCmdTestCase.addZonec                 C   s4   |  ddtjd | j| j\}}}| ||| d S )Nr.   Z
zonedeleter	   )r/   r   r   r-   r   r0   r1   r&   r&   r'   r)      s    
zDnsCmdTestCase.deleteZonec                 C   s   | j jd| j   tjddgd}|D ]}|t|jv r&|j} qDq&| j j|tjddgd}|D ]0}|t|jv r`|jttj	|d d f  S q`d S )NzDC=DomainDnsZones,%sz(objectClass=dnsZone)ZcnbaseZscopeZ
expressionattrsz(objectClass=dnsNode)	dnsRecordr   )
r   searchget_default_basednldbSCOPE_SUBTREEr   dnr   r   DnssrvRpcRecord)r#   Z	zone_namerecord_nameZzonesr-   Zzone_dnrecordsZold_packed_recordr&   r&   r'   get_record_from_db   s,    
z!DnsCmdTestCase.get_record_from_dbc              
   C   sx  d}d}|  ddtjd | jd||| j\}}}| |||d||f  | | jd\}}d|_| j	||g}|d ur| 
d	 g }	|  dd
tjd | jd|| j\}}}z,| |||d | d|v o||v d W n$ ty }
 zW Y d }
~
n
d }
~
0 0 |  ddtjd | jd||| j\}}}z| |d W n0 tyf }
 z|	|
 W Y d }
~
n
d }
~
0 0 |  ddtjd | jd||| j\}}}z| |||d W n0 ty }
 z|	|
 W Y d }
~
n
d }
~
0 0 |  dd
tjd | jd|| j\}}}z| |d W n0 ty< }
 z|	|
 W Y d }
~
n
d }
~
0 0 t|	dkrtd}|	D ]}|d t| }qTt|d S )Nz192.168.50.50r   r.   addr	   
testrecord'Failed to add record '%s' with type %s.r   z2Unable to update dns record to have DNS_RANK_NONE.queryz4Failed to query for a recordwhich had DNS_RANK_NONE.zVQuery for a record which had DNS_RANK_NONEsucceeded but produced no resulting records.zBSuccessfully added duplicate recordof one which had DNS_RANK_NONE.deletez/Failed to delete recordwhich had DNS_RANK_NONE.z?Successfully queried for deleted recordwhich had DNS_RANK_NONE.z0Failed appropriate behaviour with DNS_RANK_NONE:r   )r/   r   r   r-   r   r0   rA   Zrankr   Zdns_replace_by_dnfail
assertTrueAssertionErrorassertCmdFailr    lenr   )r#   Z
record_strZrecord_type_strr2   r3   r4   r=   recordreserrorseZerr_strerrorr&   r&   r'   test_rank_none   sv    





 
 
 zDnsCmdTestCase.test_rank_nonec           
      C   sT  d}g }| j D ]}| j | D ] }z| ddtjd | jd||| j\}}}| |||d||f  | ddtjd | jd|| j\}}}| |||d||f  | dd	tjd | jd||| j\}}}| |||d
||f  W q ty } z|d }|| W Y d}~qd}~0 0 qq|dkrP|D ]}	t	|	 q2| 
d|  dS )zN
        For all good records, attempt to add, query and delete them.
        r   r.   rB   r	   rC   z$Failed to addrecord %s with type %s.rE   z+Failed to queryrecord %s with qualifier %s.rF   z'Failed to removerecord %s with type %s.   N@Failed to accept valid commands. %d total failures.Errors above.)r!   r/   r   r   r-   r   r0   rI   r    printrG   )
r#   num_failuresfailure_msgsdnstyperL   r2   r3   r4   rO   msgr&   r&   r'   test_accept_valid_commands   sR    



$
z)DnsCmdTestCase.test_accept_valid_commandsc                 C   s  d}g }| j D ]}| j | D ]}z@| ddtjd | jd||| j\}}}| |d||f  W n> ty } z&|d }|| | 	  W Y d}~n
d}~0 0 z@| dd	tjd | jd||| j\}}}| |d
||f  W q ty$ } z&|d }|| | 	  W Y d}~qd}~0 0 qq| j D ].}| j | D ]}	| j
| d }
z| ddtjd | jd||
| j\}}}| |||d||f  | ddtjd | jd||
|	| j	\}}}| |d|
||	f  | dd	tjd | jd||
| j\}}}| |||d|
|f  W n@ tyX } z&|d }|| | 	  W Y d}~n
d}~0 0 q@q0|dkr|D ]}t| qp| d|  dS )z}
        For all bad records, attempt to add them and update to them,
        making sure that both operations fail.
        r   r.   rB   r	   rC   z3Successfully added invalidrecord '%s' of type '%s'.rR   NrF   zJSuccessfully deleted invalidrecord '%s' of type '%s' whichshouldn't exist.rD   updatez\Successfully updated valid record '%s' of type '%s' to invalid record '%s' of the same type.0Could not delete valid record '%s' of type '%s'.zCFailed to reject invalid commands. %d total failures. Errors above.)r"   r/   r   r   r-   r   rJ   rI   r    r,   r!   r0   rT   rG   )r#   rU   rV   rW   rL   r2   r3   r4   rO   Z
bad_recordZgood_recordrX   r&   r&   r'   test_reject_invalid_commands  s    





"




&
z+DnsCmdTestCase.test_reject_invalid_commandsc                 C   sL  | j D ]>}| j | d }| ddtjd | jd||| j\}}}| |||d||f  | j D ]}| j | d }| ddtjd | jd||| j\}}}z| | W n ty   Y q`Y n0 | ddtjd | jd|||| j	\}}}| |d||||f  | ddtjd | jd|||| j	\}}}| |d	||||f  q`qd
S )zV
        Make sure that a record can't be updated to one of a different type.
        r   r.   rB   r	   rC   %Failed to add record %s with type %s.rZ   ziSuccessfully updated record '%s' to '%s', even though the latter is of type '%s' where '%s' was expected.ziSuccessfully updated record '%s' to '%s', even though the former is of type '%s' where '%s' was expected.N)	r!   r/   r   r   r-   r   r0   rJ   rI   )r#   dnstype1record1r2   r3   r4   dnstype2record2r&   r&   r'   test_update_invalid_typek  sR    







z'DnsCmdTestCase.test_update_invalid_typec                 C   s  | j D ]}| j | D ]}| ddtjd | jd||| j\}}}| |||d||f  | ddtjd | jd|||| j	\}}}| |d|  | ddtjd | jd||| j\}}}| |||d	||f  qq| j d
 D ]:}| ddtjd | jdd
|| j\}}}| |||d|  | }t	t
|d d }d|d |d |d |f }| ddtjd | jdd
||| j	\}}}| |||d|d
|f  | ddtjd | jdd
| j\}}}| |||d|d
f  | ddtjd | jdd
|| j\}}}| |||d	|d
f  q| j D ]}t| j | dk r@q$| j | d }	| j | d }
| j | d }| ddtjd | jd||	| j\}}}| |||d|	|f  | ddtjd | jd||
|| j	\}}}| |d|	|
|f  q$d S )Nr.   rB   r	   rC   r]   rZ   z8Successfully updated record '%s' to be exactly the same.rF   r[   r   z(Failed to add record %s with type 'SRV'.   rR   z%s %s %s %sr      z2Failed to update record '%s' of type '%s' to '%s'.rE   z-Failed to query for record '%s' of type '%s'.zeSuccessfully updated record '%s' from '%s' to '%s', even though the given source record is incorrect.)r!   r/   r   r   r-   r   r0   rJ   splitr   intrK   )r#   rW   rL   r2   r3   r4   re   Znew_bitZ
new_recordZused_recordZunused_recordr&   r&   r'   test_update_valid_type  s    











z%DnsCmdTestCase.test_update_valid_typec              
   C   sL   |  ddtjd | jddd| j\}}}| |d | d|v d	|  d S )
Nr.   rB   r	   rC   ZSOAtestzNSuccessfully added record of type SOA, when this type should not be available.ztype SOA is not supportedzEInvalid error message '%s' when attempting to add record of type SOA.)r/   r   r   r-   r   rJ   rH   r1   r&   r&   r'   test_invalid_types  s    

z!DnsCmdTestCase.test_invalid_typesc           	      C   s  d}| j D ]}| j | d }| j D ]}|d7 }|d dkr@q$||krJq$| j | d }| ddtjd | jd||| j\}}}| |||d||f  | ddtjd | jd||| j\}}}| |||d	||||f  | dd
tjd | jd|| j\}}}| |||d||||f  | dd
tjd | jd|| j\}}}| |||d||||f  | ddtjd | jd||| j\}}}| |||d||f  | ddtjd | jd||| j\}}}| |||d||f  q$q
dS )zp
        Make sure that we can add an entry with the same name as an existing one but a different type.
        r   rR      r.   rB   r	   rC   z'Failed to add record '%s' of type '%s'.zaFailed to add record '%s' of type '%s' when a record '%s' of type '%s' with the same name exists.rE   znFailed to query for record '%s' of type '%s' when a new record '%s' of type '%s' with the same name was added.zuFailed to query record '%s' of type '%s' which should have been added with the same name as record '%s' of type '%s'.rF   z*Failed to delete record '%s' of type '%s'.N)r!   r/   r   r   r-   r   r0   )	r#   ir^   r_   r`   ra   r2   r3   r4   r&   r&   r'   #test_add_overlapping_different_type  s|    








z2DnsCmdTestCase.test_add_overlapping_different_typec              
   C   s|   |  ddtjd | jdd| j| j |  ddtjd | jdd| j| j |  ddtjd | jdd| j\}}}| | d S )Nr.   rB   r	   rC   r   rF   rE   r/   r   r   r-   r   r   rJ   r1   r&   r&   r'   test_query_deleted_recordX  s    
z(DnsCmdTestCase.test_query_deleted_recordc                 C   s   | j D ]}| ddtjd | jd|| j | d | j\}}}| ||| | ddtjd | jd|| j | d | j\}}}| | | ddtjd | jd|| j\}}}| ||| | ddtjd | jd|| j | d | j\}}}| ||| qd S )Nr.   rB   r	   rC   r   rE   rF   )r!   r/   r   r   r-   r   r0   rJ   )r#   Zrecord_typer2   r3   r4   r&   r&   r'   test_add_duplicate_recordd  s>    





z(DnsCmdTestCase.test_add_duplicate_recordc              
   C   s   |  ddtjd | jdd| j| j |  ddtjd | jdd| j| j |  ddtjd | jdd| j| j\}}}| | |  ddtjd | jdd| j\}}}| | |  ddtjd | jdd| j| j\}}}| | d S )	Nr.   rB   r	   rC   r   rF   rE   Ztestrecord2rm   r1   r&   r&   r'   test_remove_deleted_record  s0    






z)DnsCmdTestCase.test_remove_deleted_recordc              
   C   sJ  |  ddtjd | jdd| j| j dd| j }|  ddtjd | jdd|| j |  ddtjd | jd	d
|| j |  ddtjd | jdd|| j d|}|  ddtjd | jdd|| j |  ddtjd || j dD ]^}| jj	d| j
 tjd|dgd}| t|d |D ]}| t|d d q(qdS )z;
        Test dns cleanup command is working fine.
        r.   rB   r	   testar   {0}.{1}	testcnamer   testnsr   testptrr   {0} 65530 65530 65530testsrvr   cleanup)rq   rs   rt   ru   rw   DC=DomainDnsZones,{0}"(&(objectClass=dnsNode)(name={0}))dNSTombstonedr5   rR   TRUENr/   r   r   r-   r   r   formatlowerr   r9   r:   r;   r<   assertEqualrK   r   r#   dnshostname
srv_recordr?   r@   rL   r&   r&   r'   test_cleanup_record  s<    




z"DnsCmdTestCase.test_cleanup_recordc              
   C   sp  |  ddtjd | jdd| j| j dd| j }|  ddtjd | jdd	|| j |  ddtjd | jd
d|| j |  ddtjd | jdd|| j d|}|  ddtjd | jdd|| j |  ddtjd | jdd| j| j |  ddtjd || j dD ]`}| jj	d| j
 tjd|dgd}| t|d |D ]}| t|d d qLq
dS )zB
        Test dns cleanup command works with no A record.
        r.   rB   r	   Znotestar   rr   rq   notestcnamer   notestnsr   	notestptrr   rv   	notestsrvr   rF   rx   )r   r   r   r   ry   rz   r{   r5   rR   r|   Nr}   r   r&   r&   r'   test_cleanup_record_no_A_record  sB    




z.DnsCmdTestCase.test_cleanup_record_no_A_recordc                 C   s  ddg}d}|D ]f}|  ddtjd | j|d| j| j d|| j }d	|}|  ddtjd | j|d
|| j q| jj	d| j
 tjd|dgd}| t|d d d d| j }|  ddtjd || j | jj	d| j
 tjd|ddgd}| t|d d d |d d d }ttj|}	d| j }
| |	jj|
 | d|d vpt|d d dk dS )a?  
        Test dns cleanup command for multi-valued SRV record.

        Steps:
        - Add 2 A records host1 and host2
        - Add a SRV record srv1 and points to both host1 and host2
        - Run cleanup command for host1
        - Check records for srv1, data for host1 should be gone and host2 is kept.
        Zhost1Zhost2Zsrv1r.   rB   r	   r   rr   rv   r   ry   rz   r8   r5   r   rd   z	host1.{0}rx   r{   rR   z	host2.{0}ZFALSEN)r/   r   r   r-   r   r   r~   r   r   r9   r:   r;   r<   r   rK   r   r   r>   dataZ
nameTargetrH   r   )r#   ZhostsZsrv_nameZhostr   r   r@   Zdnshostname1Zdns_record_binZdns_record_objZdnshostname2r&   r&   r'   test_cleanup_multi_srv_record  sH    

z,DnsCmdTestCase.test_cleanup_multi_srv_recordc                 C   s  d}g }ddg}|D ]D\}}}}z|  ddtjd | j|||| j\}}	}
| ||	|
d|||f  |  ddtjd | j||| j\}}	}
| ||	|
d	||f  |  ddtjd | j||| j\}}	}
| |d	||f  |  dd
tjd | j|||| j\}}	}
| ||	|
d||f  W q tyX } z|d }|| W Y d}~qd}~0 0 q|dkr|D ]}t	| qj| 
d|  dS )zT
        Ensure that DNS wild card entries can be added deleted and queried
        r   )z*.ZMISSr   z1.1.1.1)z*.SAMDOMzMISS.SAMDOMr   z1.1.1.2r.   rB   r	   z*Failed to add record %s (%s) with type %s.rE   z,Failed to query record %s with qualifier %s.rF   z(Failed to remove record %s with type %s.rR   NrS   )r/   r   r   r-   r   r0   rJ   rI   r    rT   rG   )r#   rU   rV   r@   nameZmissrW   rL   r2   r3   r4   rO   rX   r&   r&   r'   test_dns_wildcards5  s    

	

"
z!DnsCmdTestCase.test_dns_wildcardsc              	   C   sR   dD ]H}|  ddd|tjd | j\}}}| |||d|  | |dk qd S )N)Zw2kZdotnetZlonghornr.   Z
serverinfoz--client-versionr	   z1Failed to print serverinfo with client version %sr   )r/   r   r   r   r0   rH   )r#   vr2   r3   r4   r&   r&   r'   test_serverinfox  s    
zDnsCmdTestCase.test_serverinfoc                 C   sD   |  ddtjd | j| j\}}}| |||d | |dk d S )Nr.   Zzoneinfor	   zFailed to print zoneinfor   )r/   r   r   r-   r   r0   rH   r1   r&   r&   r'   test_zoneinfo  s    
zDnsCmdTestCase.test_zoneinfo)__name__
__module____qualname__r   r*   r,   r   r)   rA   rQ   rY   r\   rb   rg   ri   rl   rn   ro   rp   r   r   r   r   r   r   __classcell__r&   r&   r$   r'   r      s,   X	F-T4bK.2=Cr   )r   r;   Z
samba.authr   Zsamba.samdbr   Z	samba.ndrr   r   Zsamba.dcerpcr   Zsamba.tests.samba_tool.baser   r   r&   r&   r&   r'   <module>   s   