a
    W×aH;  ã                   @   sø   d dl mZmZ d dlZd dlZd dlmZ d dlmZm	Z	m
Z
mZ d dlmZmZmZ d dlmZmZmZ d dlm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"Z"dZ#dZ$G dd„ deƒZ%e	fdd„Z&dd„ Z'dS )é    )ÚTestCaseÚdelete_forceN)Úsystem_session)ÚCredentialsÚCLI_CRED_NTLMv2_AUTHÚCLI_CRED_NTLM_AUTHÚDONT_USE_KERBEROS)ÚnetlogonÚntlmsspÚsrvsvc)Únetr_AuthenticatorÚnetr_WorkstationInformationÚMSV1_0_ALLOW_MSVCHAPV2)ÚSEC_CHAN_WKSTA)ÚUF_WORKSTATION_TRUST_ACCOUNTÚUF_PASSWD_NOTREQDÚUF_NORMAL_ACCOUNT)Úndr_pack)ÚSamDB)ÚNTSTATUSErrorÚntstatus)Ú
get_stringZPCTMZPCTUc                       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‡  ZS )#ÚPyCredentialsTestsc                    s€   t t| ƒ ¡  tjd | _tjd | _tjd | _|  ¡ | _	|  
¡ | _tƒ | _td| j | j| j| j	d| _|  ¡  |  ¡  d S )NZSERVERZDOMAINZ	SERVER_IPz	ldap://%s)ZurlZsession_infoÚcredentialsÚlp)Úsuperr   ÚsetUpÚosÚenvironÚserverÚdomainZhostÚget_loadparmr   Zget_credentialsr   r   Zsessionr   ÚldbÚcreate_machine_accountÚcreate_user_account©Úself©Ú	__class__© ú</usr/lib/python3/dist-packages/samba/tests/py_credentials.pyr   8   s    


ýzPyCredentialsTests.setUpc                    s.   t t| ƒ ¡  t| j| jƒ t| j| jƒ d S ©N)r   r   ÚtearDownr   r"   Ú
machine_dnÚuser_dnr%   r'   r)   r*   r,   K   s    zPyCredentialsTests.tearDownc                 C   s   |   t| jj¡ d S r+   )ZassertRaisesÚ
ValueErrorÚmachine_credsÚnew_client_authenticatorr%   r)   r)   r*   Útest_no_netlogon_connectionS   s    ÿz.PyCredentialsTests.test_no_netlogon_connectionc                 C   s    |   ¡ }| j ¡ }|  |¡ d S r+   )Úget_netlogon_connectionr0   r1   ZassertIsNotNone)r&   ÚcÚar)   r)   r*   Útest_have_netlogon_connectionZ   s    
z0PyCredentialsTests.test_have_netlogon_connectionc                 C   s|   |   ¡ }|  |¡\}}|  |||¡ |  |¡\}}|  |||¡ |  |¡\}}|  |||¡ |  |¡\}}|  |||¡ d S r+   )r3   Úget_authenticatorÚdo_NetrLogonSamLogonWithFlagsÚdo_NetrLogonGetDomainInfo)r&   r4   ÚauthenticatorÚ
subsequentr)   r)   r*   Útest_client_authenticatora   s    z,PyCredentialsTests.test_client_authenticatorc              
   C   sž   |   ¡ }t| j| j| jƒ}tj}tj}d}z | | j	| j 
¡ ||||¡ W nN ty˜ } z6t |jd ¡j}|tjkr‚|  d¡ n‚ W Y d }~n
d }~0 0 d S )Nr   úgot wrong password error)r3   Úsamlogon_logon_infor    Úmachine_nameÚ
user_credsr	   Ú$NetlogonNetworkTransitiveInformationÚNetlogonValidationSamInfo4Únetr_LogonSamLogonExr   Úget_workstationr   ÚctypesÚc_uint32ÚargsÚvaluer   ÚNT_STATUS_WRONG_PASSWORDÚfail©r&   r4   ÚlogonÚlogon_levelÚvalidation_levelÚ
netr_flagsÚeÚenumr)   r)   r*   Útest_SamLogonExl   s*    þû
z"PyCredentialsTests.test_SamLogonExc              
   C   sº   |   ¡ }| j d¡ t| j| j| jƒ}tj}tj}d}z | 	| j
| j ¡ ||||¡ W n^ ty´ } zFt |jd ¡j}|tjkrŽ|  d¡ n|  dt|ƒ ¡ W Y d }~n
d }~0 0 d S )NÚ r   r=   zgot unexpected error)r3   r@   Z
set_domainr>   r    r?   r	   rA   rB   rC   r   rD   r   rE   rF   rG   rH   r   rI   rJ   ÚstrrK   r)   r)   r*   Útest_SamLogonEx_no_domain…   s,    þû
z,PyCredentialsTests.test_SamLogonEx_no_domainc              
   C   s¢   |   ¡ }t| j| j| jtd}tj}tj}d}z | 	| j
| j ¡ ||||¡ W nN tyœ } z6t |jd ¡j}|tjkr†|  d¡ n‚ W Y d }~n
d }~0 0 d S ©N)Úflagsr   r=   )r3   r>   r    r?   r@   r   r	   rA   rB   rC   r   rD   r   rE   rF   rG   rH   r   rI   rJ   rK   r)   r)   r*   Útest_SamLogonExNTLM    s,    ýû
z&PyCredentialsTests.test_SamLogonExNTLMc              
   C   sª   |   ¡ }t| j| j| jtd}t|j_t	j
}t	j}d}z | | j| j ¡ ||||¡ W nN ty¤ } z6t |jd ¡j}|tjkrŽ|  d¡ n‚ W Y d }~n
d }~0 0 d S rV   )r3   r>   r    r?   r@   r   r   Úidentity_infoZparameter_controlr	   rA   rB   rC   r   rD   r   rE   rF   rG   rH   r   rI   rJ   rK   r)   r)   r*   Útest_SamLogonExMSCHAPv2º   s.    ýû
z*PyCredentialsTests.test_SamLogonExMSCHAPv2c                 C   s$   |   ¡  t d| j | j| j¡ d S )Nzncacn_np:%s)Údo_Netr_ServerPasswordSet2r   r   r   r0   r%   r)   r)   r*   Útest_encrypt_netr_passwordÚ   s
    þz-PyCredentialsTests.test_encrypt_netr_passwordc                 C   s¶   |   ¡ }|  |¡\}}d}d}t ||¡}| d¡}t|ƒ}dd„ t || ¡D ƒ}	t 	¡ }
||
_
|	dd„ |D ƒ |
_| j |
¡ | | j| j ¡ t| j||
¡ || _| j |¡ d S )Né    i   ú	utf-16-lec                 S   s"   g | ]}t |tƒr|nt|ƒ‘qS r)   ©Ú
isinstanceÚintÚord©Ú.0Úxr)   r)   r*   Ú
<listcomp>í   ó    zAPyCredentialsTests.do_Netr_ServerPasswordSet2.<locals>.<listcomp>c                 S   s"   g | ]}t |tƒr|nt|ƒ‘qS r)   r_   rc   r)   r)   r*   rf   ð   rg   )r3   r7   ÚsambaÚgenerate_random_passwordÚencodeÚlenr   Úurandomr	   Znetr_CryptPasswordÚlengthÚdatar0   Zencrypt_netr_crypt_passwordZnetr_ServerPasswordSet2r   rD   r   r?   Úmachine_passÚset_password)r&   r4   r:   r;   ZPWD_LENZDATA_LENZnewpassZencodedZpwd_lenZfillerÚpwdr)   r)   r*   r[   å   s*    
ûz-PyCredentialsTests.do_Netr_ServerPasswordSet2c                 C   s   t   d| j | j| j¡S )Nzncacn_ip_tcp:%s[schannel,seal])r	   r   r   r0   r%   r)   r)   r*   r3   þ   s    þz*PyCredentialsTests.get_netlogon_connectionc                 C   sÖ   t  dd¡| _t| _d| j| j ¡ f | _t| j| jƒ dt	| jƒ  
d¡}| j | jdd| j tttB ƒ|dœ¡ tƒ | _| j |  ¡ ¡ | j t¡ | j t¡ | j | j¡ | j | jd ¡ | j | j¡ d S )	Nr]   úcn=%s,%sú"%s"r^   Zcomputerz%s$©ZdnZobjectclassZsAMAccountNameZuserAccountControlZ
unicodePwdú$)rh   ri   ro   ÚMACHINE_NAMEr?   r"   Ú	domain_dnr-   r   r   rj   ÚaddrT   r   r   r   r0   Úguessr!   Zset_secure_channel_typer   Zset_kerberos_stater   rp   Úset_usernameÚset_workstation©r&   Zutf16pwr)   r)   r*   r#     s&    
úz)PyCredentialsTests.create_machine_accountc                 C   s¶   t  dd¡| _t| _d| j| j ¡ f | _t| j| jƒ dt	| jƒ  
d¡}| j | jdd| j ttƒ|dœ¡ tƒ | _| j |  ¡ ¡ | j | j¡ | j | j¡ | j | j¡ d S )Nr]   rr   rs   r^   Úuserz%srt   )rh   ri   Z	user_passÚ	USER_NAMEZ	user_namer"   rw   r.   r   r   rj   rx   rT   r   r   r@   ry   r!   rp   rz   r{   r?   r|   r)   r)   r*   r$   !  s$    ûz&PyCredentialsTests.create_user_accountc                 C   s>   | j  ¡ }tƒ }dd„ |d D ƒ|j_|d |_tƒ }||fS )Nc                 S   s"   g | ]}t |tƒr|nt|ƒ‘qS r)   r_   rc   r)   r)   r*   rf   >  rg   z8PyCredentialsTests.get_authenticator.<locals>.<listcomp>Z
credentialÚ	timestamp)r0   r1   r   Zcredrn   r   )r&   r4   ZauthÚcurrentr;   r)   r)   r*   r7   ;  s    

z$PyCredentialsTests.get_authenticatorc              
   C   sF   t | j| j| jƒ}tj}tj}d}| | j| j 	¡ ||||||¡ d S )Nr   )
r>   r    r?   r@   r	   rA   rB   Znetr_LogonSamLogonWithFlagsr   rD   )r&   r4   r€   r;   rL   rM   rN   rO   r)   r)   r*   r8   D  s     þùz0PyCredentialsTests.do_NetrLogonSamLogonWithFlagsc                 C   s&   t ƒ }| | j| j ¡ ||d|¡ d S )Né   )r   Znetr_LogonGetDomainInfor   r@   rD   )r&   r4   r€   r;   Zqueryr)   r)   r*   r9   U  s    ûz,PyCredentialsTests.do_NetrLogonGetDomainInfo)Ú__name__Ú
__module__Ú__qualname__r   r,   r2   r6   r<   rR   rU   rX   rZ   r\   r[   r3   r#   r$   r7   r8   r9   Ú__classcell__r)   r)   r'   r*   r   6   s"    	r   c           
      C   s¢   t | |ƒ}d}|j|||d}t ¡ }dd„ |D ƒ|_t ¡ |_t|d ƒ|j_dd„ |d D ƒ|j_	t 
¡ |_| ¡ \}}	|	|jj_||jj_| ¡ |jj_|S )Ns   abcdefgh)rW   Ú	challengeÚtarget_infoc                 S   s"   g | ]}t |tƒr|nt|ƒ‘qS r)   r_   rc   r)   r)   r*   rf   p  rg   z'samlogon_logon_info.<locals>.<listcomp>Znt_responsec                 S   s"   g | ]}t |tƒr|nt|ƒ‘qS r)   r_   rc   r)   r)   r*   rf   s  rg   )Úsamlogon_targetZget_ntlm_responser	   Znetr_NetworkInfor†   Znetr_ChallengeResponseÚntrk   rm   rn   Znetr_IdentityInforY   Zget_ntlm_username_domainÚdomain_nameÚstringZaccount_namerD   Zworkstation)
rŠ   Úcomputer_nameZcredsrW   Ztarget_info_blobr†   ZresponserL   Zusernamer    r)   r)   r*   r>   c  s"    
þ



r>   c                 C   s^   t  ¡ }d|_t  ¡ }t j|_||_t  ¡ }t j|_| |_t  ¡ }t j|_|||g|_	t
|ƒS )Né   )r
   ZAV_PAIR_LISTÚcountZAV_PAIRZMsvAvNbComputerNameZAvIdZValueZMsvAvNbDomainNameZMsvAvEOLZpairr   )rŠ   rŒ   r‡   ZcomputernameZ
domainnameZeolr)   r)   r*   rˆ     s    rˆ   )(Zsamba.testsr   r   r   rh   Z
samba.authr   Zsamba.credentialsr   r   r   r   Zsamba.dcerpcr	   r
   r   Zsamba.dcerpc.netlogonr   r   r   Zsamba.dcerpc.miscr   Z
samba.dsdbr   r   r   Z	samba.ndrr   Zsamba.samdbr   r   r   Zsamba.compatr   rE   rv   r~   r   r>   rˆ   r)   r)   r)   r*   Ú<module>   s*     0ÿ
