a
    cl_y                     @   s   d Z ddlmZmZm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 ddlmZ dd	lmZmZmZmZ dd
lmZ ddlmZ ddlZdd Zdd Zdd ZG dd deZdS )zTests for samba.dcerpc.sam.    )samrsecuritylsa)DomainGeneralInformation)RpcInterfaceTestCase)env_loadparmdelete_force)Credentials)system_session)SamDB)ATYPE_NORMAL_ACCOUNTATYPE_WORKSTATION_TRUSTGTYPE_SECURITY_UNIVERSAL_GROUPGTYPE_SECURITY_GLOBAL_GROUP)generate_random_password)
ndr_unpackNc                 C   s   dd |j d | D S )Nc                 S   s   g | ]}|j |jfqS  )idxname).0entryr   r   8/usr/lib/python3/dist-packages/samba/tests/dcerpc/sam.py
<listcomp>*       ztoArray.<locals>.<listcomp>)entries)handleZarraynum_entriesr   r   r   toArray)   s    r   c                 C   s$   t tj| d d }| \}}|S N	objectSIDr   r   r   dom_sidsplit)msgsid_ridr   r   r   r&   0   s    r&   c                 C   s   | d d S )N   6   r   )r   r   r   r   calc_max_size;   s    r)   c                       s   e Zd Z fddZdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Z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 )-	SamrTestsc                    s4   t t|   td|  | _|   |   d S )Nzncalrpc:)superr*   setUpr   Zget_loadparmconn
open_samdbopen_domain_handleself	__class__r   r   r,   A   s    zSamrTests.setUpc                 C   sL   t  | _tjd | _t | _| j| j t | _	t
| j	| j| jd| _d S )NZDOMAIN)Zsession_infoZcredentialslp)r   r4   osenvirondomainr	   ZcredsZguessr
   Zsessionr   samdbr0   r   r   r   r.   J   s    zSamrTests.open_samdbc                 C   sH   | j d tj| _| j | jt| j| _	| j 
| jtj| j	| _d S N)r-   Connect2r   SEC_FLAG_MAXIMUM_ALLOWEDr   ZLookupDomainr   Stringr7   Z
domain_sidZ
OpenDomaindomain_handler0   r   r   r   r/   U   s    zSamrTests.open_domain_handlec                    s,   dd t | j   fdd|D S )Nc                 S   s$   t tj| d d }| \}}|S r   r    )r#   r$   xr%   r   r   r   r$   c   s    z$SamrTests.filter_domain.<locals>.sidc                    s   g | ]}| kr|qS r   r   )r   r>   r!   r$   r   r   r   i   r   z+SamrTests.filter_domain.<locals>.<listcomp>)r   r!   r8   Zget_domain_sid)r1   
unfilteredr   r?   r   filter_domainb   s    zSamrTests.filter_domainc                 C   s    | j d ddt \}}}d S )Nr   r'   )r-   ZConnect5r   ZConnectInfo1)r1   levelinfor   r   r   r   test_connect5k   s    zSamrTests.test_connect5c                 C   s"   | j d tj}| |d u d S r9   )r-   r:   r   r;   
assertTruer1   r   r   r   r   test_connect2o   s    zSamrTests.test_connect2c                 C   s4   | j d tj}t| j |dd  | j | d S )Nr       )r-   r:   r   r;   r   ZEnumDomainsCloserF   r   r   r   test_EnumDomainss   s    zSamrTests.test_EnumDomainsc                 C   sN   g }|D ]@}d| }d|| j  f }t| j | | j | || q|S )Nz
SAMR_GRP%dzcn=%s,cn=Users,%s)r8   	domain_dnr   Znewgroupappendr1   Zidsdnsir   dnr   r   r   create_groups}   s    zSamrTests.create_groupsc              	   C   sf   g }|D ]X}d| }d|| j  f }t| j | | j j|d dd| d| d| d || q|S )NzSAMR_USER%dzcn=%s,CN=USERS,%sFzDescription for zgiven%dnamez	surname%d)ZpasswordZsetpassworddescriptionZ	givennameZsurname)r8   rK   r   ZnewuserrL   rM   r   r   r   create_users   s    zSamrTests.create_usersc                 C   sV   g }|D ]H}d| }d|| j  f }t| j | | j j|d| d || q|S )Nz
SAMR_CMP%dzcn=%s,cn=COMPUTERS,%szDescription of )rR   )r8   rK   r   ZnewcomputerrL   rM   r   r   r   create_computers   s    zSamrTests.create_computersc                 C   s   |D ]}t | j| qd S r9   )r   r8   )r1   rN   rP   r   r   r   
delete_dns   s    zSamrTests.delete_dnsc                 C   s`  | j j||d}| t|dk | j| j|ddd\}}}	| t|| | t|| |||	j | j| j|d|d\}
}}| ||
 | || |||j | |dk | j| j||d dd\}}}| || | d| |t	|dd  |j | |dk | j| j|ddd\}}}| || | d| |t	|d d |j | |dk | j| j|ddd\}}}| || | d| |t	|dd |j |g d	}| j| j|ddd\}}}| || | t|d | |t	|dd  |j | j j||d}| j| j|ddd\}}}| t|t| | | t|t| | |||j | 
| | j| j|ddd\}}}| t|t| | |t|kr|||j n<|t|d kr
|t	|dd  |j n| d
| | j| j||dd\}}}| || | d| | j| j d S )NZ
expressionattrsr   i   rH         r'   i  i  i  i  zIncorrect number of entries {0})r8   searchrE   lenr-   ZQueryDisplayInfor=   assertEqualr   listrU   ZfailformatrI   r   )r1   rB   check_resultsselect
attributesZadd_elementsexpectedZtsZrsactualZts1Zrs1Zactual1Zts2Zrs2Zactual2rN   Zts3Zrs3Zactual3newZts4Zrs4Zactual4Zts5Zrs5Zactual5Zts6Zrs6Zactual6r   r   r   _test_QueryDisplayInfo   s    









z SamrTests._test_QueryDisplayInfoc                    sN    fdd}  g d}dt}g d} d||| j   | d S )Nc                    s   t | |D ]\}} t|tj  t|d t|j |jj	dkrZ 
d|v  n t|d t|j |jj	dkr 
d|v  q
 t|d t|j q
d S )NsAMAccountNamer   displayNamerR   )ziprE   
isinstancer   ZDispEntryGeneralr^   straccount_nameZ	full_namelengthassertFalserR   rd   re   ear0   r   r   ra   4  s    z>SamrTests.test_QueryDisplayInfo_level_1.<locals>.check_resultsr'   rX   rZ      )(&(objectclass=user)(sAMAccountType={0}))rh   ri   rR   r'   rS   r`   r   rg   rU   r1   ra   rN   rb   rc   r   r0   r   test_QueryDisplayInfo_level_13  s    z'SamrTests.test_QueryDisplayInfo_level_1c                    sN    fdd}  g d}dt}ddg} d||| j   | d S )Nc                    sz   t | |D ]j\}} t|tj  t|d t|j |jj	dkrZ 
d|v  q
 t|d t|j q
d S Nrh   r   rR   )rj   rE   rk   r   ZDispEntryFullr^   rl   rm   rR   rn   ro   rp   r0   r   r   ra   \  s    z>SamrTests.test_QueryDisplayInfo_level_2.<locals>.check_resultsrs   ru   rh   rR   rX   )rT   r`   r   rg   rU   rx   r   r0   r   test_QueryDisplayInfo_level_2[  s    z'SamrTests.test_QueryDisplayInfo_level_2c                    sP    fdd}  g d}dttf }ddg} d||| j   | d S )Nc                    sz   t | |D ]j\}} t|tj  t|d t|j |jj	dkrZ 
d|v  q
 t|d t|j q
d S rz   )rj   rE   rk   r   ZDispEntryFullGroupr^   rl   rm   rR   rn   ro   rp   r0   r   r   ra     s    z>SamrTests.test_QueryDisplayInfo_level_3.<locals>.check_resultsrs   5(&(|(groupType=%d)(groupType=%d))(objectClass=group))rh   rR   rZ   rQ   r   r   rg   rU   rx   r   r0   r   test_QueryDisplayInfo_level_3  s    z'SamrTests.test_QueryDisplayInfo_level_3c                    sN    fdd}  g d}dt}g d} d||| j   | d S )Nc                    sZ   t | |D ]J\}} t|tj  t|jtj  t	|d t	|jj
 q
d S Nrh   rj   rE   rk   r   ZDispEntryAsciirm   r   ZAsciiStringLarger^   rl   stringrp   r0   r   r   ra     s    z>SamrTests.test_QueryDisplayInfo_level_4.<locals>.check_resultsrs   ru   rv   rt   rw   rx   r   r0   r   test_QueryDisplayInfo_level_4  s    z'SamrTests.test_QueryDisplayInfo_level_4c                    sP    fdd}  g d}dttf }ddg} d||| j   | d S )Nc                    sZ   t | |D ]J\}} t|tj  t|jtj  t	|d t	|jj
 q
d S r   r   rp   r0   r   r   ra     s    z>SamrTests.test_QueryDisplayInfo_level_5.<locals>.check_resultsrs   r|   rh   rR      r}   rx   r   r0   r   test_QueryDisplayInfo_level_5  s    z'SamrTests.test_QueryDisplayInfo_level_5c                    s   fdd}  g d}dttf }ddg} jj||d} |} t|dk tt	|t
d	}tt|d
 } j jd|\}	}
} t|| |||
j td} j jd|\}	}
} d| ||d d |
j td}t|} j j  j j||\}	}} d|  d|	 td}g }
 j jd|\}	}}|	r d| |
|jd   j j|	|\}	}}q`|r|
|jd  g }
td} j jd|\}	}}  g d}|	r$ d| |
|jd   j j|	|\}	}}q|r:|
|jd   t|t|
 |||
 tt|t| d
 } j jd|\}	}
} t|t| |  jj||d} |} t|t|k tt	|t
d	}|||
j g }
td} j jd|\}	}} | |	r^|r^ d| |
|jd   j j|	|\}	}}q|rt|
|jd   t|t|
 |||
  | d S )Nc                    sF   t | |D ]6\}} t|tj  t|d t|jj q
d S r   	rj   rE   rk   r   ZSamEntryr^   rl   r   r   rp   r0   r   r   ra     s
    z6SamrTests.test_EnumDomainGroups.<locals>.check_resultsrs   r|   rh   r   rV   rt   key
   r   r'   r[   )rQ   r   r   r8   r\   rA   rE   r]   sortedr_   r&   r)   r-   EnumDomainGroupsr=   r^   r   rI   r   rL   rU   r1   ra   rN   rb   rc   r@   Zfilteredrd   max_sizeresume_handlere   r   Zrhrr   Z	extra_dnsZunfiltered01Z
filtered01Z
expected01r   r0   r   test_EnumDomainGroups  s    











zSamrTests.test_EnumDomainGroupsc                    s4   fdd}  g d}d}g d} jj||d} |} t|dk tt|td}t	t|d	 } j
 jd
d
|\}	}
} t|| |||
j t	d} j
 jd
d
|\}	}
} d| ||d d |
j t|}t	d} j
 j  j
 j|d
|\}	}} d
|  d
|	 g }
t	d} j
 jd
d
|\}	}}|	r d| |
|jd
   j
 j|	d
|\}	}}q`|r|
|jd
   t|t|
 |||
 g }
t	d} j
 jd
d
|\}	}}  g d}|	rH d| |
|jd
   j
 j|	d
|\}	}}q|r^|
|jd
   t|t|
 |||
 t	t|t| d	 } j
 jd
d
|\}	}
} t|t| |  jj||d} |} t|t|k tt|td} t|| |||
j  ||  d S )Nc                    sF   t | |D ]6\}} t|tj  t|d t|jj q
d S r   r   rp   r0   r   r   ra   b  s
    z5SamrTests.test_EnumDomainUsers.<locals>.check_resultsrs   z(objectClass=user))rh   r   ZuserAccountConrolrV   rt   r   r   r   r'   r[   )rS   r8   r\   rA   rE   r]   r   r_   r&   r)   r-   EnumDomainUsersr=   r^   r   rI   r   rL   rU   r   r   r0   r   test_EnumDomainUsersa  s    

















zSamrTests.test_EnumDomainUsersc                 C   s|   | j | jt}td}| j | jdd|\}}}|}|rj| d| | j | j|d|\}}}||7 }q6| ||j d S Nr'   r   )r-   QueryDomainInfor=   r   r)   r   r^   Z	num_usersr1   rC   r   r   rr   r   countr   r   r   $test_DomGeneralInformation_num_users  s    




z.SamrTests.test_DomGeneralInformation_num_usersc                 C   sx   | j | jt}td}| j | jd|\}}}|}|rf| d| | j | j||\}}}||7 }q4| ||j d S r   )r-   r   r=   r   r)   r   r^   Z
num_groupsr   r   r   r   %test_DomGeneralInformation_num_groups  s    


z/SamrTests.test_DomGeneralInformation_num_groupsc                 C   sx   | j | jt}td}| j | jd|\}}}|}|rf| d| | j | j||\}}}||7 }q4| ||j d S r   )r-   r   r=   r   r)   ZEnumDomainAliasesr^   Znum_aliasesr   r   r   r   &test_DomGeneralInformation_num_aliases  s    


z0SamrTests.test_DomGeneralInformation_num_aliases)__name__
__module____qualname__r,   r.   r/   rA   rD   rG   rJ   rQ   rS   rT   rU   rg   ry   r{   r~   r   r   r   r   r   r   r   __classcell__r   r   r2   r   r*   ?   s.   		
z($% zr*   )__doc__Zsamba.dcerpcr   r   r   Zsamba.dcerpc.samrr   Zsamba.testsr   r   r   Zsamba.credentialsr	   Z
samba.authr
   Zsamba.samdbr   Z
samba.dsdbr   r   r   r   Zsambar   Z	samba.ndrr   r5   r   r&   r)   r*   r   r   r   r   <module>   s   