a
    ¡Öaúa  ã                   @   s¸   d dl mZ d dl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Zd dlZd dlmZ d dlmZ d d	lmZ d dlZd d
lmZmZ dZe dd¡ZG dd„ deƒZdS )é    )Úprint_functionN)ÚMSG_DSDB_LOGÚDSDB_EVENT_NAME)ÚERR_NO_SUCH_OBJECT)ÚSamDB)Úsystem_session)ÚAuditLogTestBase)Údelete_force)ÚNet)ÚsecurityÚlsaZauditlogtestuseré    c                       sŠ   e Zd Z‡ fdd„Zdd„ Z‡ fdd„Zdd„ Zd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 )ÚAuditLogDsdbTestsc                    s  t | _t| _tt| ƒ ¡  tjd | _	dtjd  }t
|tƒ |  ¡ |  ¡ d| _tjd | _| j ¡ | _| j ¡ }| j d¡ |  | jj|¡ | j ¡ }| j d¡ | j ¡ | _|  | jj|¡ t| jdt d | j ƒ | j dt d | j d	ttd
œ¡ d S )NZ	SERVER_IPz	ldap://%sZSERVER)ZurlZsession_infoZcredentialsÚlpZ	000000001Ú0úcn=ú
,cn=users,Úuser)ÚdnÚobjectclassÚsAMAccountNameÚuserPassword)r   Zmessage_typer   Z
event_typeÚsuperr   ÚsetUpÚosÚenvironZ	server_ipr   r   Úget_credentialsÚget_loadparmÚldbÚserverZ	domain_dnÚbase_dnZget_dsheuristicsZset_dsheuristicsZ
addCleanupZget_minPwdAgeZset_minPwdAger	   Ú	USER_NAMEÚaddÚ	USER_PASS)ÚselfZhostZdsheuristicsZ	minPwdAge©Ú	__class__© ú</usr/lib/python3/dist-packages/samba/tests/audit_log_dsdb.pyr   )   s4    ý

üzAuditLogDsdbTests.setUpc                 C   s   | j d|d |  ¡  d S )Né   ©r   )ÚwaitForMessagesÚdiscardMessages)r$   r   r'   r'   r(   ÚdiscardSetupMessagesZ   s    z&AuditLogDsdbTests.discardSetupMessagesc                    s   |   ¡  tt| ƒ ¡  d S )N)r,   r   r   ÚtearDown)r$   r%   r'   r(   r.   ^   s    zAuditLogDsdbTests.tearDownc                 C   s0   | j d d ur,| j d d }|d |kr,dS dS )NÚ
txnMessageÚdsdbTransactionÚtransactionIdTF)Úcontext)r$   ÚexpectedZtxnr'   r'   r(   ÚhaveExpectedTxnb   s
    z!AuditLogDsdbTests.haveExpectedTxnNc                 C   sP   || _ t ¡ }|  |¡s@| j d¡ t ¡ | dkrd| _ dS qd| _ | jd S )z²Wait for a transaction message to arrive
        The connection is passed through to keep the connection alive
        until all the logging messages have been received.
        gš™™™™™¹?é   NÚ r/   )Ú
connectionÚtimer4   Zmsg_ctxZ	loop_oncer2   )r$   r3   r7   Z
start_timer'   r'   r(   ÚwaitForTransactioni   s    
z$AuditLogDsdbTests.waitForTransactionc                 C   sh  dt  d | j }|  |¡ | j|  ¡ d}|  ¡ }t||| jd}d}|j|t t	d | j
d||d}td	t|ƒ ƒ |  dt|ƒd
¡ |d d }|  d|d ¡ |  |d ¡ |  | ¡ |d  ¡ ¡ |  |d | j¡ |  ¡ }|  ||d ¡ |  |  |d ¡¡ |d }	|  dt|	ƒ¡ |	d d }
|  dt|
ƒ¡ |  |
d d ¡ |  d|
d d ¡ d S )NúCN=ú
,CN=Users,©Útemplate©r   únewPassword!!42)ÚnewpasswordZusernameZoldpasswordr5   r*   úReceived %d messagesú/Did not receive the expected number of messagesr   Ú
dsdbChangeÚModifyÚ	operationÚperformedAsSystemr   ÚremoteAddressÚ	sessionIdr1   Ú
attributesÚclearTextPasswordÚactionsÚredactedÚreplaceÚaction)r!   r    r-   Úinsta_credsr   r   r
   r   Zchange_passwordr#   r+   ÚprintÚlenÚassertEqualÚassertFalseÚ
assertTrueÚlowerÚassertRegexpMatchesrG   Úget_sessionÚis_guid)r$   r   Úcredsr   ÚnetÚpasswordÚmessagesÚauditÚ
session_idrI   rK   r'   r'   r(   Útest_net_change_password{   s@    
þþ
ÿz*AuditLogDsdbTests.test_net_change_passwordc                 C   sj  dt  d | j }|  |¡ | j|  ¡ d}|  ¡ }t||| jd}d}| d¡}|j	|t |d | j
d||d	}td
t|ƒ ƒ |  dt|ƒd¡ |d d }|  d|d ¡ |  |d ¡ |  ||d ¡ |  |d | j¡ |  ¡ }	|  |	|d ¡ |  |  |d ¡¡ |d }
|  dt|
ƒ¡ |
d d }|  dt|ƒ¡ |  |d d ¡ |  d|d d ¡ d S )Nr:   r;   r<   r>   r?   Z	workgroup)r@   Zaccount_nameZdomain_namer5   r*   rA   rB   r   rC   rD   rE   rF   r   rG   rH   r1   rI   rJ   rK   rL   rM   rN   )r!   r    r-   rO   r   r   r
   r   ÚgetZset_passwordr+   rP   rQ   rR   rS   rV   rG   rW   rT   rX   )r$   r   rY   r   rZ   r[   Zdomainr\   r]   r^   rI   rK   r'   r'   r(   Útest_net_set_password¥   sB    

þþ
ÿz'AuditLogDsdbTests.test_net_set_passwordc           	      C   s®  dt  d | j }|  |¡ t dd¡}dt  d | j }| j d| d d d d t d d	 d | d ¡ |  d
¡}t	dt
|ƒ ƒ |  d
t
|ƒd¡ |d d }|  d|d ¡ |  |d ¡ |  ||d ¡ |  |d | j¡ |  |  |d ¡¡ |  ¡ }|  ||d ¡ |  ¡ }|  |d¡ |d }|  d
t
|ƒ¡ |d d }|  dt
|ƒ¡ |  |d d ¡ |  d|d d ¡ |  |d
 d ¡ |  d|d
 d ¡ d S )Nr   r   r   údn: Ú
úchangetype: modify
zdelete: userPassword
úuserPassword: zadd: userPassword
r5   rA   rB   r   rC   rD   rE   rF   r   rG   rH   ÚLDAPrI   r   rK   r)   rL   ÚdeleterN   r"   )r!   r    r-   ÚsambaÚgenerate_random_passwordr   Úmodify_ldifr#   r+   rP   rQ   rR   rS   rV   rG   rT   rX   rW   Úget_service_description©	r$   r   Znew_passwordr\   r]   r^   Úservice_descriptionrI   rK   r'   r'   r(   Útest_ldap_change_passwordÎ   sf    

ÿþýýýüûûûÿ
þ
ÿz+AuditLogDsdbTests.test_ldap_change_passwordc           	      C   s†  dt  d | j }|  |¡ t dd¡}| j d| d d d d | d ¡ | jd	|d
}tdt	|ƒ ƒ |  
d	t	|ƒd¡ |d d }|  
d|d ¡ |  |d ¡ |  | ¡ |d  ¡ ¡ |  |d | j¡ |  |  |d ¡¡ |  ¡ }|  
||d ¡ |  ¡ }|  
|d¡ |  |  |d ¡¡ |d }|  
d	t	|ƒ¡ |d d }|  
d	t	|ƒ¡ |  |d d ¡ |  
d|d d ¡ d S )Nr   r   r   rb   rc   rd   zreplace: userPassword
re   r5   r*   rA   rB   r   rC   rD   rE   rF   r   rG   rH   rf   r1   rI   r   rK   rL   rM   rN   )r!   r    r-   rh   ri   r   rj   r+   rP   rQ   rR   rS   rT   rU   rV   rG   rX   rW   rk   rl   r'   r'   r(   Útest_ldap_replace_passwordø   sR    

ÿþýýýÿþ
ÿz,AuditLogDsdbTests.test_ldap_replace_passwordc                 C   s  dt  d | j }| jd|d}tdt|ƒ ƒ |  dt|ƒd¡ |d d }|  d	|d
 ¡ |  |d ¡ |  ||d ¡ |  |d | j¡ |  	¡ }|  ||d ¡ |  
¡ }|  |d¡ |  |  |d ¡¡ |  |  |d ¡¡ |d }|  dt|ƒ¡ |d d }|  dt|ƒ¡ |  d|d d ¡ |  dt|d d ƒ¡ |  d|d d d d ¡ |d d }|  dt|ƒ¡ |  d|d d ¡ |  dt|d d ƒ¡ |  t |d d d d ¡ |d d }|  dt|ƒ¡ |  d|d d ¡ |  |d d ¡ d S )Nr   r   r)   r*   rA   rB   r5   rC   ÚAddrE   rF   r   rG   rH   rf   r1   rI   é   r   rK   r"   r   rN   Úvaluesr   Úvaluer   r   rL   )r!   r    r+   rP   rQ   rR   rS   rV   rG   rW   rk   rT   rX   )r$   r   r\   r]   r^   rm   rI   rK   r'   r'   r(   Útest_ldap_add_user  sH    þ
ÿz$AuditLogDsdbTests.test_ldap_add_userc                 C   s`  dt  d | j }|  |¡ | j t ¡ | jd|d}tdt|ƒ ƒ |  dt|ƒd¡ |d d }|  d	|d
 ¡ |  	|d ¡ |  
| ¡ |d  ¡ ¡ |  |d | j¡ |  
|  |d ¡¡ |  d|d ¡ |  d|d ¡ |  ¡ }|  ||d ¡ |  ¡ }|  |d¡ |d }|  |¡}|d }|  d|d ¡ |  
|  |d ¡¡ |  
|d dk¡ d S )Nr   r   r5   r*   rA   rB   r   rC   ÚDeleterE   rF   r   rG   rH   Ú
statusCodeZSuccessÚstatusrf   r1   r0   ZcommitrN   Úduration)r!   r    r-   r   Z
deleteuserr+   rP   rQ   rR   rS   rT   rU   rV   rG   rX   rW   rk   r9   )r$   r   r\   r]   r^   rm   r1   Úmessager'   r'   r(   Útest_samdb_delete_userJ  s:    
þ
ÿ
z(AuditLogDsdbTests.test_samdb_delete_userc           	      C   s”  d}dt  d | j }|  |¡ d| d | j }z| j |¡ |  d¡ W n ty^   Y n0 |  d¡}tdt	|ƒ ƒ |  
dt	|ƒd¡ |d d	 }|  
d
|d ¡ |  |d ¡ |  | ¡ |d  ¡ ¡ |  |d | j¡ |  
t|d ¡ |  
d|d ¡ |  |  |d ¡¡ |  ¡ }|  
||d ¡ |  ¡ }|  
|d¡ |d }|  |¡}|d }|  
d|d ¡ |  |  |d ¡¡ |  |d dk¡ d S )NZdoesNotExistr   r   zException not thrownr5   rA   rB   r   rC   ru   rE   rF   r   rG   rv   zNo such objectrw   rH   rf   r1   r0   ZrollbackrN   rx   )r!   r    r-   r   rg   ZfailÚ	Exceptionr+   rP   rQ   rR   rS   rT   rU   rV   rG   r   rX   rW   rk   r9   )	r$   ZDOES_NOT_EXISTr   r\   r]   r^   rm   r1   ry   r'   r'   r(   Ú!test_samdb_delete_non_existent_dnl  sF    

þ
ÿ
z3AuditLogDsdbTests.test_samdb_delete_non_existent_dnc                 C   sä  d| j  }|  |¡ | j|  ¡ d}t d| j |  ¡ |¡}|jdt 	¡ t
jd}t ¡ }d|_|j||t
jd | jd|d	}td
t|ƒ ƒ |  dt|ƒd¡ |d d }|  d|d ¡ |  |d ¡ |  | ¡ |d  ¡ ¡ |  |d | j¡ |  |  |d ¡¡ |  ¡ }|  ||d ¡ |d }	|  dt|	ƒ¡ |	d }
|  dt|
d ƒ¡ |
d d }|  d|d ¡ |d }|  dt|ƒ¡ |  d|d d ¡ |	d }|  dt|d ƒ¡ |d d }|  d|d ¡ |d }|  dt|ƒ¡ |  d|d d ¡ |  ¡  |j||t
jd}| |¡ | jd|d	}td
t|ƒ ƒ |  dt|ƒd¡ d| j  }|d d }|  d|d ¡ |  |d ¡ |  | ¡ |d  ¡ ¡ |  |d | j¡ |  |  |d ¡¡ |  ¡ }|  ||d ¡ d S ) Nzcn=Test Secret,CN=System,r<   zncacn_np:%sú\)Zsystem_nameÚattrÚaccess_maskzG$Test)ZhandleÚnamer   r5   r*   rA   rB   r   rC   rp   rE   rF   r   rG   rH   rI   r)   ZobjectClassrK   r"   rN   rr   Zsecretrs   ÚcnzTest Secretru   )r    r-   rO   r   r   Zlsarpcr   r   ZOpenPolicy2ZObjectAttributer   ZSEC_FLAG_MAXIMUM_ALLOWEDÚStringÚstringZCreateSecretr+   rP   rQ   rR   rT   rU   rV   rG   rX   rW   r,   Z
OpenSecretZDeleteObject)r$   r   rY   Zlsa_connZ
lsa_handleZsecret_namer\   r]   r^   rI   Zobject_classrN   rr   r   Úhr'   r'   r(   Ú&test_create_and_delete_secret_over_lsa”  s˜    

ýýýþ
ÿý
þ

ÿz8AuditLogDsdbTests.test_create_and_delete_secret_over_lsac           	      C   s  dt  d | j }|  |¡ | j d| d d d d ¡ | jd|d	}td
t|ƒ ƒ |  dt|ƒd¡ |d d }|  d|d ¡ |  	|d ¡ |  ||d ¡ |  
|d | j¡ |  |  |d ¡¡ |  ¡ }|  ||d ¡ |  ¡ }|  |d¡ |d }|  dt|ƒ¡ |d d }|  dt|ƒ¡ |  d|d d ¡ |d d }|  dt|ƒ¡ |  d|d d ¡ |  ¡  | j d| d d d d ¡ | jd|d	}td
t|ƒ ƒ |  dt|ƒd¡ |d d d }|  dt|ƒ¡ |d d }|  dt|ƒ¡ |  d|d d ¡ |d d }|  dt|ƒ¡ |  d|d d ¡ |  ¡  | j d| d d d d d  ¡ | jd|d	}td
t|ƒ ƒ |  dt|ƒd¡ |d d d }|  dt|ƒ¡ |d d }|  dt|ƒ¡ |  d|d d ¡ |d d }|  d!t|ƒ¡ |  d"|d d ¡ |  d#|d d ¡ |  ¡  | j d| d d$ d% d d  ¡ | jd|d	}td
t|ƒ ƒ |  dt|ƒd¡ |d d d }|  dt|ƒ¡ |d d }|  dt|ƒ¡ |  d&|d d ¡ |d d }|  d!t|ƒ¡ |  d"|d d ¡ |  d#|d d ¡ |  ¡  | j d| d d$ d' d( d) ¡ | jd|d	}td
t|ƒ ƒ |  dt|ƒd¡ |d d d }|  dt|ƒ¡ |d d }|  dt|ƒ¡ |  d*|d d ¡ |d d }|  d!t|ƒ¡ |  d+|d d ¡ |  d,|d d ¡ d S )-Nr   r   rb   rc   rd   zadd: carLicense
zcarLicense: license-01
r5   r*   rA   rB   r   rC   rD   rE   rF   r   rG   rH   rf   rI   Z
carLicenserK   r"   rN   rr   z
license-01rs   zcarLicense: license-02
z
license-02zcarLicense: license-03
zcarLicense: license-04
r)   z
license-03z
license-04zchangetype: delete
zdelete: carLicense
rg   zreplace: carLicense
zcarLicense: license-05
zcarLicense: license-06
rM   z
license-05z
license-06)r!   r    r-   r   rj   r+   rP   rQ   rR   rS   rV   rG   rT   rX   rW   rk   r,   )	r$   r   r\   r]   r^   rm   rI   rK   rr   r'   r'   r(   Útest_modifyî  s   

ÿþýÿþ
ÿ
ÿþýÿþ
ÿþýüÿþ
ÿþýüÿþ
ÿþýüÿþzAuditLogDsdbTests.test_modify)N)Ú__name__Ú
__module__Ú__qualname__r   r-   r.   r4   r9   r_   ra   rn   ro   rt   rz   r|   r…   r†   Ú__classcell__r'   r'   r%   r(   r   '   s   1
*)*&,"(Zr   )Z
__future__r   Zsamba.testsrh   Zsamba.dcerpc.messagingr   r   r   r   Zsamba.samdbr   Z
samba.authr   r   r8   Zsamba.tests.audit_log_baser   r	   Z	samba.netr
   Zsamba.dcerpcr   r   r!   ri   r#   r   r'   r'   r'   r(   Ú<module>   s   