a
    )&i                     @   s   d dl Z d dlZd dlmZ d dlmZmZ d dlmZm	Z	 d dl
mZ d dlmZ d dlmZmZmZmZmZmZmZmZmZmZmZ ejd d d	e jd
< dZdZG dd deZe dkrdZdZd dl!Z!e!"  dS )    N)partial)generate_random_passwordunix2nttime)krb5pacsecurity)SDUtils)KDCBaseTest)KDC_ERR_TGT_REVOKEDKDC_ERR_TKT_EXPIREDKPASSWD_ACCESSDENIEDKPASSWD_AUTHERRORKPASSWD_HARDERRORKPASSWD_INITIAL_FLAG_NEEDEDKPASSWD_MALFORMEDKPASSWD_SOFTERRORKPASSWD_SUCCESSNT_PRINCIPALNT_SRV_INSTz
bin/python1ZPYTHONUNBUFFEREDFc                       s  e Zd Z fddZdDd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d0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zd:d; Zd<d= Z d>d? Z!d@dA Z"dBdC Z#  Z$S )EKpasswdTestsc                    sb   t    t| _t| _|  }| }| |j	| |	d |
 }| |j| |d d S )NZ	0000000010)supersetUpglobal_asn1_printZdo_asn1_printglobal_hexdumpZ
do_hexdump	get_samdbZget_dsheuristicsZ
addCleanupZset_dsheuristicsZget_minPwdAgeZset_minPwdAge)selfsamdbZdsheuristicsZ	minPwdAge	__class__ @/usr/lib/python3/dist-packages/samba/tests/krb5/kpasswd_tests.pyr   7   s    

zKpasswdTests.setUpFc                 C   s    d|i}| j | jj|dd}|S )NZexpired_passwordF)account_typeopts	use_cache)get_cached_credsAccountTypeZUSER)r   expiredr#   credsr    r    r!   
_get_credsQ   s    
zKpasswdTests._get_credsc                 C   s,   |   }| |}tj|i}| j|||dS )Nnew_ticket_keychecksum_keys)Zget_mock_rodc_krbtgt_credsTicketDecryptionKey_from_credsr   PAC_TYPE_KDC_CHECKSUMmodified_ticket)r   ticketkrbtgt_creds
krbtgt_keyr,   r    r    r!   issued_by_rodc]   s    
zKpasswdTests.issued_by_rodcc                 C   s   | j tddgdS )NkadminchangepwZ	name_typenames)PrincipalName_creater   )r   r    r    r!   get_kpasswd_snamej   s    zKpasswdTests.get_kpasswd_snamec                 C   s>   |j }|d }|d|}|d }| |}| |}|| S Nauthtime	starttimeendtime)Zticket_privategetget_EpochFromKerberosTime)r   r0   enc_partr;   r<   r=   r    r    r!   get_ticket_lifetimen   s    

z KpasswdTests.get_ticket_lifetimec                 C   sn   |j }dd |D }| tj| t }t||_t }tj|_	||_
|| ||_ | jd7  _|S )Nc                 S   s   g | ]
}|j qS r    )type).0
pac_bufferr    r    r!   
<listcomp>}       z2KpasswdTests.add_requester_sid.<locals>.<listcomp>   )buffersZassertNotInr   ZPAC_TYPE_REQUESTER_SIDZPAC_REQUESTER_SIDr   Zdom_sidsidZ
PAC_BUFFERrB   infoappendZnum_buffers)r   pacrI   pac_buffersZbuffer_typesZrequester_sidZrequester_sid_bufferr    r    r!   add_requester_sidz   s    
zKpasswdTests.add_requester_sidc                 C   sb   |   }| j||  dd}t}d}tdd}| j||||| jjd || | j|dd d S Nr   snamekdc_options   Password changed    modeTfresh)	r)   get_tgtr9   r   r   kpasswd_exchangeKpasswdModeSETupdate_passwordr   r(   r0   expected_codeexpected_msgnew_passwordr    r    r!   test_kpasswd_set   s    

zKpasswdTests.test_kpasswd_setc                 C   sb   |   }| j||  dd}t}d}tdd}| j||||| jjd || | j|dd d S rO   )	r)   rY   r9   r   r   rZ   r[   CHANGEr]   r^   r    r    r!   test_kpasswd_change   s    

z KpasswdTests.test_kpasswd_changec                 C   s   |   }|  }| j||dd}t}d}tdd}| j||||| jjd || | j||dd}tdd}| j||||| jj	d d S )Nr   rP   rS   rT   rU   )
r)   r9   rY   r   r   rZ   r[   r\   r]   rc   )r   r(   rQ   r0   r_   r`   ra   r    r    r!   test_kpasswd_no_canonicalize   s2    


z)KpasswdTests.test_kpasswd_no_canonicalizec                 C   s   |   }|  }|  }| j|||dd}t}d}tdd}| j||||| jj	d |
| | j|||dd}tdd}| j||||| jjd d S )Nr   rQ   realmrR   rS   rT   rU   r)   r9   	get_realm
capitalizerY   r   r   rZ   r[   r\   r]   rc   r   r(   rQ   rg   r0   r_   r`   ra   r    r    r!   'test_kpasswd_no_canonicalize_realm_case   s8    


z4KpasswdTests.test_kpasswd_no_canonicalize_realm_casec                 C   s   |   }| j||  dd}t}d}tdd}| j||||| jjd || | j||  dd}tdd}| j||||| jj	d d S )NcanonicalizerP   rS   rT   rU   )
r)   rY   r9   r   r   rZ   r[   r\   r]   rc   r^   r    r    r!   test_kpasswd_canonicalize  s0    


z&KpasswdTests.test_kpasswd_canonicalizec                 C   s   |   }|  }|  }| j|||dd}t}d}tdd}| j||||| jj	d |
| | j|||dd}tdd}| j||||| jjd d S )Nrm   rf   rS   rT   rU   rh   rk   r    r    r!   $test_kpasswd_canonicalize_realm_case.  s8    


z1KpasswdTests.test_kpasswd_canonicalize_realm_casec                 C   s\   |   }| j||  dd}t}d}d}| j||||| jjd | j||||| jjd d S )Nr   rP   s.   Password does not meet complexity requirementsZpasswordrU   )r)   rY   r9   r   rZ   r[   r\   rc   r^   r    r    r!   test_kpasswd_too_weakV  s&    z"KpasswdTests.test_kpasswd_too_weakc                 C   sh   |   }| j||  dd}ttf}d}d}| j||||| jjd t}d}| j||||| jjd d S )Nr   rP   )s@   Password too short, password must be at least 7 characters long.   String conversion failed! rU   rq   )	r)   rY   r9   r   r   rZ   r[   r\   rc   r^   r    r    r!   test_kpasswd_emptyq  s*    zKpasswdTests.test_kpasswd_emptyc                 C   sf   |   }| j||  dd}t}d}tdd}| j||||| jjdd | j||||| jjdd d S )Nr   rP   s/   gensec_unwrap failed - NT_STATUS_ACCESS_DENIED
rT   F)rV   Zsend_seq_number)	r)   rY   r9   r   r   rZ   r[   r\   rc   r^   r    r    r!   test_kpasswd_no_seq_number  s*    
z'KpasswdTests.test_kpasswd_no_seq_numberc                 C   sl   |   }| j||  dd}| |}t}d}tdd}| j||||| jjd | j||||| jj	d d S )Nr   rP   /   gensec_update failed - NT_STATUS_LOGON_FAILURE
rT   rU   )
r)   rY   r9   r3   r   r   rZ   r[   r\   rc   r^   r    r    r!   test_kpasswd_from_rodc  s(    

z#KpasswdTests.test_kpasswd_from_rodcc                 C   sh   |   }| }| jt|dd}| j||  dd}t}d}tdd}| j	||||| j
j|d d S )N/r6   r   rP   )<   Realm and principal must be both present, or neither present   Failed to decode packetrT   )rV   target_princ)r)   get_usernamer8   r   splitrY   r9   r   r   rZ   r[   r\   r   r(   usernamecnamer0   r_   r`   ra   r    r    r!   "test_kpasswd_set_target_princ_only  s$    
z/KpasswdTests.test_kpasswd_set_target_princ_onlyc                 C   sT   |   }| j||  dd}ttf}d}tdd}| j||||| jj|	 d d S )Nr   rP   )rx   ry   s#   No such user when changing passwordrT   )rV   target_realm)
r)   rY   r9   r   r   r   rZ   r[   r\   ri   r^   r    r    r!   "test_kpasswd_set_target_realm_only  s    
z/KpasswdTests.test_kpasswd_set_target_realm_onlyc              	   C   sn   |   }| }| jt|dd}| j||  dd}t}d}tdd}| j	||||| j
j|| d d S )Nrw   r6   r   rP   s    Not permitted to change passwordrT   rV   rz   r   )r)   r{   r8   r   r|   rY   r9   r   r   rZ   r[   r\   ri   r}   r    r    r!   1test_kpasswd_set_target_princ_and_realm_no_access  s&    
z>KpasswdTests.test_kpasswd_set_target_princ_and_realm_no_accessc              	   C   s   |   }| }| |}| jt|dd}|  }t|}| }| 	||}d| d}	|
||	 |  }
| j||
dddd}t}d	}td
d
}| j||||| jj|| d d S )Nrw   r6   z	(A;;CR;;;)r4   r5   r   servicetarget_namerR   rS   rT   r   )r)   r{   rY   r8   r   r|   r   r   get_dnget_objectSidZdacl_add_aceget_krbtgt_credsget_service_ticketr   r   rZ   r[   r\   ri   )r   r(   r~   tgtr   r   Zsd_utilsuser_dnuser_sidZacer1   r0   r_   r`   ra   r    r    r!   .test_kpasswd_set_target_princ_and_realm_access  s<    

z;KpasswdTests.test_kpasswd_set_target_princ_and_realm_accessc                 C   sN   | j dd}| j||  dd}t}d}tdd}| j||||| jjd d S NT)r'   r   rP   rS   rT   rU   )r)   rY   r9   r   r   rZ   r[   r\   r^   r    r    r!   !test_kpasswd_set_expired_passwordG  s    
z.KpasswdTests.test_kpasswd_set_expired_passwordc                 C   sN   | j dd}| j||  dd}t}d}tdd}| j||||| jjd d S r   )r)   rY   r9   r   r   rZ   r[   rc   r^   r    r    r!   $test_kpasswd_change_expired_password[  s    
z1KpasswdTests.test_kpasswd_change_expired_passwordc                 C   s6   |   }| j||  dd}| |}| d| d S )Nr   rP   x   )r)   rY   r9   rA   ZassertEqual)r   r(   r0   lifetimer    r    r!   test_kpasswd_ticket_lifetimeo  s    
z)KpasswdTests.test_kpasswd_ticket_lifetimec                 C   sb   |   }| j||  dd}| }| jtd|gd}|| |  }| j|||t	t
fd d S )Nr   rP   krbtgtr6   Zexpect_error)get_client_credsrY   r9   ri   r8   r   	set_snameget_service_creds_make_tgs_requestr	   r
   )r   r(   r0   rg   krbtgt_snameservice_credsr    r    r!   test_kpasswd_ticket_tgs|  s    

z$KpasswdTests.test_kpasswd_ticket_tgsc           	         st     }|}tj|i}jddj|d  fdd}fddfdd}j|||||d	S )
Ni)offsetc                    s$   | d< d| v r| d<  | d< | S r:   r    )r@   )end_time
start_timer    r!   modify_ticket_times  s
    zCKpasswdTests.modify_requester_sid_time.<locals>.modify_ticket_timesc                    sJ   | j }|D ]*}|jtjkr
 }t||j_ q@q
 d || _ | S )Nz$failed to find LOGON_NAME PAC buffer)	rH   rB   r   ZPAC_TYPE_LOGON_NAMEr?   r   rJ   
logon_timeZfail)rL   rM   rD   r   )r   r   r    r!   modify_pac_time  s    

z?KpasswdTests.modify_requester_sid_time.<locals>.modify_pac_timec                    s   j | d}  | } | S )N)rI   )rN   )rL   )r   r   rI   r    r!   modify_pac_fn  s    z=KpasswdTests.modify_requester_sid_time.<locals>.modify_pac_fn)r+   	modify_fnr   r,   )r   r-   r   r.   Zget_KerberosTimer/   )	r   r0   rI   r   r1   r2   r,   r   r   r    )r   r   r   rI   r   r!   modify_requester_sid_time  s    
z&KpasswdTests.modify_requester_sid_timec           	      C   s   |   }| j||  dd}| }| jtd|gd}|| |  }| }| 	||}| j
||dd}|  }| j|||td d S )Nr   rP   r   r6   r   rI   r   r   )r   rY   r9   ri   r8   r   r   r   r   r   r   r   r   r
   	r   r(   r0   rg   r   r   r   r   r   r    r    r!   %test_kpasswd_ticket_requester_sid_tgs  s(    

z2KpasswdTests.test_kpasswd_ticket_requester_sid_tgsc           	      C   s   |   }| j||  dd}| }| jtd|gd}|| |  }| }| 	||}| j
||dd}|  }| j|||dd d S )	Nr   rP   r   r6      r   Fr   )r   rY   r9   ri   r8   r   r   r   r   r   r   r   r   r   r    r    r!   .test_kpasswd_ticket_requester_sid_lifetime_tgs  s(    

z;KpasswdTests.test_kpasswd_ticket_requester_sid_lifetime_tgsc                 C   sf   |   }| |}||   t}d}tdd}| j||||| jjd | j||||| jj	d d S )Ns,   A TGT may not be used as a ticket to kpasswdrT   rU   )
r)   rY   r   r9   r   r   rZ   r[   r\   rc   )r   r(   r   r_   r`   ra   r    r    r!   test_kpasswd_tgt  s$    

zKpasswdTests.test_kpasswd_tgtc                 C   st   |   }| |}|  }| j||dddd}t}d}tdd}| j||||| jjd | j||||| jj	d d S )Nr4   r5   r   r   s   Expected an initial ticketrT   rU   )
r)   rY   r   r   r   r   rZ   r[   r\   rc   )r   r(   r   r1   r0   r_   r`   ra   r    r    r!   test_kpasswd_non_initial+  s0    

z%KpasswdTests.test_kpasswd_non_initialc                    s        fdd}t}d}| }tdd}j||||jjd  | | }tdd}j||||jjd d S )Nc                     sL   j  dd} j| ddddd}tjddd} }j|||d	S )
NTrW   r4   r5   r   )r   r   rR   rX   initial)flagvalue)r   r,   )rY   r   r   Zmodify_ticket_flagZget_krbtgt_checksum_keyr/   )r   r0   Zset_initial_flagr,   r(   r1   r   r    r!   
get_ticketS  s     z5KpasswdTests.test_kpasswd_initial.<locals>.get_ticketrS   rT   rU   )	r)   r   r   r   rZ   r[   r\   r]   rc   )r   r   r_   r`   r0   ra   r    r   r!   test_kpasswd_initialL  s,    


z!KpasswdTests.test_kpasswd_initialc                 C   s   |   }|  }| j||dd}|  }| |}| |jd tj|i}| j	|||d}| j
tdgd}|| t}d}	tdd}
| j||
||	| jjd	 | j||
||	| jjd	 d S )
Nr   rP   7a kvno is required to tell the DB which key to look up.r*   ZAdministratorr6   ru   rT   rU   )r)   r9   rY   Zget_admin_credsr-   assertIsNotNonekvnor   r.   r/   r8   r   r   r   r   rZ   r[   r\   rc   )r   r(   rQ   r0   Zadmin_credsZ	admin_keyr,   Zadmin_snamer_   r`   ra   r    r    r!   test_kpasswd_wrong_key  sF    


z#KpasswdTests.test_kpasswd_wrong_keyc           
      C   s   | j | jjdd}|  }| j||dd}| |}| |jd tj	|i}| j
|||d}| }| jt|dd}|| t}d	}td
d
}	| j||	||| jjd | j||	||| jjd d S )NF)r"   r$   r   rP   r   r*   rw   r6   ru   rT   rU   )r%   r&   ZCOMPUTERr9   rY   r-   r   r   r   r.   r/   r{   r8   r   r|   r   r   r   rZ   r[   r\   rc   )
r   r(   rQ   r0   Zour_keyr,   r~   r_   r`   ra   r    r    r!   test_kpasswd_wrong_key_service  sJ    



z+KpasswdTests.test_kpasswd_wrong_key_servicec                 C   s   |   }|  }| j||dd}|  }| |}| |jd tj|i}| j	|||d}|
 }| jt|dd}|| t}	d}
tdd}| j|||	|
| jjd	 | j|||	|
| jjd	 d S )
Nr   rP   r   r*   rw   r6   ru   rT   rU   )r)   r9   rY   Zget_dc_credsr-   r   r   r   r.   r/   r{   r8   r   r|   r   r   r   rZ   r[   r\   rc   )r   r(   rQ   r0   Zdc_credsZdc_keyr,   Zdc_usernameZdc_snamer_   r`   ra   r    r    r!   test_kpasswd_wrong_key_server  sH    


z*KpasswdTests.test_kpasswd_wrong_key_server)F)%__name__
__module____qualname__r   r)   r3   r9   rA   rN   rb   rd   re   rl   rn   ro   rp   rs   rt   rv   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__r    r    r   r!   r   5   sB   
%'#(!*<"!!403r   __main__)#ossys	functoolsr   Zsambar   r   Zsamba.dcerpcr   r   Zsamba.sd_utilsr   Zsamba.tests.krb5.kdc_base_testr   Z"samba.tests.krb5.rfc4120_constantsr	   r
   r   r   r   r   r   r   r   r   r   pathinsertenvironr   r   r   r   Zunittestmainr    r    r    r!   <module>   s0   4
       g