
    ba                     $   d dl mZmZ d dl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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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(Z(	 dZ)dZ* G d de          Z+e
fdZ,d Z-dS )    )TestCasedelete_forceN)system_session)CredentialsCLI_CRED_NTLMv2_AUTHCLI_CRED_NTLM_AUTHDONT_USE_KERBEROS)lsanetlogonntlmsspsecuritysrvsvc)netr_Authenticatornetr_WorkstationInformationMSV1_0_ALLOW_MSVCHAPV2)SEC_CHAN_WKSTA)UF_WORKSTATION_TRUST_ACCOUNTUF_PASSWD_NOTREQDUF_NORMAL_ACCOUNT)ndr_pack
ndr_unpack)SamDB)NTSTATUSErrorntstatus)
get_string)SDUtilsPCTMPCTUc                        e Zd Z fdZ fdZd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z xZS )PyCredentialsTestsc                    t          t          |                                            t          j        d         | _        t          j        d         | _        t          j        d         | _        |                                 | _	        | 
                                | _        t                      | _        t          d| j        z  | j        | j        | j	                  | _        |                                  |                                  d S )NSERVERDOMAIN	SERVER_IPz	ldap://%s)urlsession_infocredentialslp)superr    setUposenvironserverdomainhostget_loadparmr(   get_credentialsr'   r   sessionr   ldbcreate_machine_accountcreate_user_accountself	__class__s    </usr/lib/python3/dist-packages/samba/tests/py_credentials.pyr*   zPyCredentialsTests.setUp;   s     $''--///:h/:h/:k2	,,..//11)++[494&*l%)%5 G% % %
 	##%%%  """""    c                     t          t          |                                            t          | j        | j                   t          | j        | j                   d S N)r)   r    tearDownr   r3   
machine_dnuser_dnr6   s    r9   r=   zPyCredentialsTests.tearDownN   sN     $''00222TXt///TXt|,,,,,r:   c                 P    |                      t          | j        j                   d S r<   )assertRaises
ValueErrormachine_credsnew_client_authenticatorr7   s    r9   test_no_netlogon_connectionz.PyCredentialsTests.test_no_netlogon_connectionV   s4    *,E	G 	G 	G 	G 	Gr:   c                     |                                  }| j                                        }|                     |           d S r<   )get_netlogon_connectionrC   rD   assertIsNotNone)r7   cas      r9   test_have_netlogon_connectionz0PyCredentialsTests.test_have_netlogon_connection]   sA    ((**7799Qr:   c                    |                                  }|                     |          \  }}|                     |||           |                     |          \  }}|                     |||           |                     |          \  }}|                     |||           |                     |          \  }}|                     |||           d S r<   )rH   get_authenticatordo_NetrLogonSamLogonWithFlagsdo_NetrLogonGetDomainInfo)r7   rJ   authenticator
subsequents       r9   test_client_authenticatorz,PyCredentialsTests.test_client_authenticatord   s    ((**&*&<&<Q&?&?#
**1mZHHH&*&<&<Q&?&?#
&&q-DDD&*&<&<Q&?&?#
&&q-DDD&*&<&<Q&?&?#
&&q-DDDDDr:   c                    |                                  }|                     |          \  }}| j                                        }| j         d| }|                    d          }t                      }t          j        d          |_	        ||_
        |                    | j        | j                                        ||d|           | j                            | j        t          j        dg          }|                     dt'          |                     |d                             dd	          }|                     ||           d S )
N.utf-8some OS   server_namecomputer_name
credentialreturn_authenticatorlevelquerydNSHostNamescopeattrsr   idx)rH   rN   r3   domain_dns_namemachine_nameencoder   r
   Stringos_namedns_hostnamenetr_LogonGetDomainInfor-   
user_credsget_workstationsearchr>   
SCOPE_BASEassertEquallenget	r7   rJ   rQ   rR   domain_hostnamenew_dns_hostnamer_   resgot_dns_hostnames	            r9   test_set_dns_hostname_validz.PyCredentialsTests.test_set_dns_hostname_validp   sL   ((**$($:$:1$=$=!z(2244"/CC/CC+227;;+--
9---	!!/99;;$!+ 	" 	 	 	 hoodo$'N%2O  5 5 	CHH%%%q6::m:;;)+;<<<<<r:   c                 0   |                                  }|                     |          \  }}| j                            | j        t          j        dg          }|                     dt          |                     t          t          j
        |d                             dd                    }t          | j                  }dt          j         d| d}|                    | j        |           | j                                        }| j         d	| }	|	                    d
          }	t%                      }
t'          j        d          |
_        |	|
_        |                    | j        | j                                        ||d|
           | j                            | j        t          j        dg          }|                     dt          |                     |d                             dd          }|                     |	|           d S )N	objectSidra   rX   r   rd   z
(OD;;SWWP;;;)rU   rV   rW   rY   r`   )rH   rN   r3   ro   r>   rp   rq   rr   r   r   dom_sidrs   r   GUID_DRS_DNS_HOST_NAMEdacl_add_acerf   rg   rh   r   r
   ri   rj   rk   rl   r-   rm   rn   )r7   rJ   rQ   rR   rw   machine_sidsd_utilsmodru   rv   r_   rx   s               r9   "test_set_dns_hostname_valid_deniedz5PyCredentialsTests.test_set_dns_hostname_valid_denied   s   ((**$($:$:1$=$=!zhoodo$'N%0M  3 3 	CHH%%% !1!$QKQ!?!?A A 48$$!H; ! !! ! !dos333(2244"/CC/CC+227;;+--
9---	!!/99;;$!+ 	" 	 	 	 hoodo$'N%2O  5 5 	CHH%%%q6::m:;;)+;<<<<<r:   c                    |                                  }|                     |          \  }}| j                            | j        t          j        dg          }|                     dt          |                     t          t          j
        |d                             dd                    }t          | j                  }dt          j         d| d}|                    | j        |           d	}t                      }	t!          j        d
          |	_        ||	_        |                    | j        | j                                        ||d|	           | j                            | j        t          j        dg          }|                     dt          |                     |d                             dd          }
|                     |
           d S )Nr{   ra   rX   r   rd   z(OA;;SW;r|   r}      invalidrW   rY   r`   rH   rN   r3   ro   r>   rp   rq   rr   r   r   r~   rs   r   r   r   r   r
   ri   rj   rk   rl   r-   rm   rn   assertIsNoner7   rJ   rQ   rR   rw   r   r   r   rv   r_   rx   s              r9   -test_set_dns_hostname_invalid_validated_writez@PyCredentialsTests.test_set_dns_hostname_invalid_validated_write      ((**$($:$:1$=$=!zhoodo$'N%0M  3 3 	CHH%%% !1!$QKQ!?!?A A 48$$!(9 ! !! ! !dos333%+--
9---	!!/99;;$!+ 	" 	 	 	 hoodo$'N%2O  5 5 	CHH%%%q6::m:;;*+++++r:   c                    |                                  }|                     |          \  }}| j                            | j        t          j        dg          }|                     dt          |                     t          t          j
        |d                             dd                    }t          | j                  }dt          j         d| d}|                    | j        |           d	}t                      }	t!          j        d
          |	_        ||	_        |                    | j        | j                                        ||d|	           | j                            | j        t          j        dg          }|                     dt          |                     |d                             dd          }
|                     |
           d S )Nr{   ra   rX   r   rd   z(OA;;WP;r|   r}   r   rW   rY   r`   r   r   s              r9   ,test_set_dns_hostname_invalid_write_propertyz?PyCredentialsTests.test_set_dns_hostname_invalid_write_property   r   r:   c                 `   |                                  }|                     |          \  }}| j                            d          }t	                      }t          j        d          |_        ||_        |	                    | j
        | j                                        ||d|           | j                            | j        t          j        dg          }|                     dt%          |                     |d                             dd          }|                     |           d S )	NrV   rW   rX   rY   r`   ra   r   rd   )rH   rN   rg   rh   r   r
   ri   rj   rk   rl   r-   rm   rn   r3   ro   r>   rp   rq   rr   rs   r   )r7   rJ   rQ   rR   rv   r_   rw   rx   s           r9   %test_set_dns_hostname_to_machine_namez8PyCredentialsTests.test_set_dns_hostname_to_machine_name  s"   ((**$($:$:1$=$=!z,33G<<+--
9---	!!/99;;$!+ 	" 	 	 	 hoodo$'N%2O  5 5 	CHH%%%q6::m:;;*+++++r:   c                    |                                  }|                     |          \  }}| j                                        }| j         d| }|                    d          }t                      }t          j        d          |_	        ||_
        |                    | j        | j                                        ||d|           | j                            | j        t          j        dg          }|                     dt'          |                     |d                             dd	          }|                     |           d S )
Nz.foo.rV   rW   rX   rY   r`   ra   r   rd   )rH   rN   r3   rf   rg   rh   r   r
   ri   rj   rk   rl   r-   rm   rn   ro   r>   rp   rq   rr   rs   r   rt   s	            r9   $test_set_dns_hostname_invalid_suffixz7PyCredentialsTests.test_set_dns_hostname_invalid_suffix9  sI   ((**$($:$:1$=$=!z(2244"/GGoGG+227;;+--
9---	!!/99;;$!+ 	" 	 	 	 hoodo$'N%2O  5 5 	CHH%%%q6::m:;;*+++++r:   c                 T   |                                  }|                     |          \  }}| j                                        }| j         d| }|                    d          }d}t                      }t          j        |          |_	        ||_
        t          j        |_        |                    | j        | j                                        ||d|           | j                            | j        t          j        ddg          }|                     dt-          |                     |d	                             dd	
          }	|                     |	           |d	                             dd	
          }
|                     |                    d          |
           d S )NrU   rV   rW   rX   rY   r`   operatingSystemra   r   rd   )rH   rN   r3   rf   rg   rh   r   r
   ri   rj   rk   r   NETR_WS_FLAG_HANDLES_SPN_UPDATEworkstation_flagsrl   r-   rm   rn   ro   r>   rp   rq   rr   rs   r   )r7   rJ   rQ   rR   ru   rv   operating_systemr_   rw   rx   got_oss              r9   test_set_dns_hostname_with_flagz2PyCredentialsTests.test_set_dns_hostname_with_flagZ  s   ((**$($:$:1$=$=!z(2244"/CC/CC+227;;$+--
#344-"*"J	!!/99;;$!+ 	" 	 	 	 hoodo$'N%2%6%8  9 9 	CHH%%%q6::m:;;*+++Q-155)00996BBBBBr:   c                    |                                  }t          | j        | j        | j                  }t
          j        }t
          j        }d}	 |                    | j	        | j        
                                ||||           d S # t          $ rV}t          j        |j        d                   j        }|t           j        k    r|                     d           n Y d }~d S d }~ww xY w)Nr   got wrong password error)rH   samlogon_logon_infor.   rg   rm   r   $NetlogonNetworkTransitiveInformationNetlogonValidationSamInfo4netr_LogonSamLogonExr-   rn   r   ctypesc_uint32argsvaluer   NT_STATUS_WRONG_PASSWORDfailr7   rJ   logonlogon_levelvalidation_level
netr_flagseenums           r9   test_SamLogonExz"PyCredentialsTests.test_SamLogonEx  s   ((**#DK$($5$(O5 5 C#>
	""4;#'?#B#B#D#D#.#(#3#-/ / / / /  	 	 	?16!9--3Dx888		45555 655555	s   6B 
C(AC##C(c                 ^   |                                  }| j                            d           t          | j        | j        | j                  }t          j        }t          j        }d}	 |	                    | j
        | j                                        ||||           d S # t          $ r}t          j        |j        d                   j        }|t"          j        k    r|                     d           n+|                     dt)          |          z              Y d }~d S Y d }~d S d }~ww xY w)N r   r   zgot unexpected error)rH   rm   
set_domainr   r.   rg   r   r   r   r   r-   rn   r   r   r   r   r   r   r   r   strr   s           r9   test_SamLogonEx_no_domainz,PyCredentialsTests.test_SamLogonEx_no_domain  sH   ((**""2&&&#DK$($5$(O5 5 C#>
	;""4;#'?#B#B#D#D#.#(#3#-/ / / / /  	; 	; 	;?16!9--3Dx888		45555		03q669::::::::: 655555	;s   *6B" "
D,,A/D''D,c                    |                                  }t          | j        | j        | j        t
                    }t          j        }t          j        }d}	 |	                    | j
        | j                                        ||||           d S # t          $ rV}t          j        |j        d                   j        }|t"          j        k    r|                     d           n Y d }~d S d }~ww xY wN)flagsr   r   )rH   r   r.   rg   rm   r   r   r   r   r   r-   rn   r   r   r   r   r   r   r   r   r   s           r9   test_SamLogonExNTLMz&PyCredentialsTests.test_SamLogonExNTLM  s   ((**#DK$($5$(O*<> > >
 C#>
	""4;#'?#B#B#D#D#.#(#3#-/ / / / /  	 	 	?16!9--3Dx888		45555 655555	s   6B 
C/AC**C/c                    |                                  }t          | j        | j        | j        t
                    }t          |j        _        t          j
        }t          j        }d}	 |                    | j        | j                                        ||||           d S # t          $ rV}t!          j        |j        d                   j        }|t(          j        k    r|                     d           n Y d }~d S d }~ww xY wr   )rH   r   r.   rg   rm   r   r   identity_infoparameter_controlr   r   r   r   r-   rn   r   r   r   r   r   r   r   r   r   s           r9   test_SamLogonExMSCHAPv2z*PyCredentialsTests.test_SamLogonExMSCHAPv2  s   ((**#DK$($5$(O*<> > >
 1G-C#>
	""4;#'?#B#B#D#D#.#(#3#-/ / / / /  	 	 	?16!9--3Dx888		45555 655555	s   (6B   
D *AC;;D c                 ~    |                                   t          j        d| j        z  | j        | j                   d S )Nzncacn_np:%s)do_Netr_ServerPasswordSet2r   r-   r(   rC   rE   s    r9   test_encrypt_netr_passwordz-PyCredentialsTests.test_encrypt_netr_password  sF    '')))mt{3g(	* 	* 	* 	* 	*r:   c                 l   |                                  }|                     |          \  }}d}d}t          j        ||          }|                    d          }t          |          }d t          j        ||z
            D             }	t          j	                    }
||
_
        |	d |D             z   |
_        | j                            |
           |                    | j        | j                                        t"          | j        ||
           || _        | j                            |           d S )N    i   	utf-16-lec                 Z    g | ](}t          |t                    r|nt          |          )S  
isinstanceintord.0xs     r9   
<listcomp>zAPyCredentialsTests.do_Netr_ServerPasswordSet2.<locals>.<listcomp>  s1    ___1
1c**611A___r:   c                 Z    g | ](}t          |t                    r|nt          |          )S r   r   r   s     r9   r   zAPyCredentialsTests.do_Netr_ServerPasswordSet2.<locals>.<listcomp>  s1    RRRQ*Q"4"4@QQ#a&&RRRr:   )rH   rN   sambagenerate_random_passwordrh   rr   r+   urandomr   netr_CryptPasswordlengthdatarC   encrypt_netr_crypt_passwordnetr_ServerPasswordSet2r-   rn   r   rg   machine_passset_password)r7   rJ   rQ   rR   PWD_LENDATA_LENnewpassencodedpwd_lenfillerpwds              r9   r   z-PyCredentialsTests.do_Netr_ServerPasswordSet2  s1   ((**&*&<&<Q&?&?#
0'BB..--g,,__
8V]K]@^@^___)++
RR'RRRR66s;;;	!!$+"&"4"D"D"F"F"0"&"3"/"%	' 	' 	' $''00000r:   c                 R    t          j         d| j        z  | j        | j                  S )Nzncacn_ip_tcp:%s[schannel,seal])r   r-   r(   rC   rE   s    r9   rH   z*PyCredentialsTests.get_netlogon_connection  s,     !ADK!O!%!%!35 5 	5r:   c           	      t   t          j        dd          | _        t          | _        d| j        d| j                                        | _        t          | j        | j                   dt          | j                  z  
                    d          }| j                            | j        dd| j        z  t          t          t          z            |d           t                      | _        | j                            |                                            | j                            t(                     | j                            t,                     | j                            | j                   | j                            | j        d	z              | j                            | j                   d S )
Nr   cn=,"%s"r   computerz%s$dnobjectclasssAMAccountNameuserAccountControl
unicodePwd$)r   r   r   MACHINE_NAMErg   r3   	domain_dnr>   r   r   rh   addr   r   r   r   rC   guessr0   set_secure_channel_typer   set_kerberos_stater	   r   set_usernameset_workstationr7   utf16pws     r9   r4   z)PyCredentialsTests.create_machine_account  s   !:2rBB((,(9(9(948;M;M;O;O;OP 	TXt///Jt'8999AA+NN/%#d&7703DDEE!# # 	$ 	$ 	$ )]]  !2!2!4!455522>BBB--.?@@@''(9:::''(9C(?@@@**4+<=====r:   c                    t          j        dd          | _        t          | _        d| j        d| j                                        | _        t          | j        | j                   dt          | j                  z  
                    d          }| j                            | j        dd| j        z  t          t                    |d           t                      | _        | j                            |                                            | j                            | j                   | j                            | j                   | j                            | j                   d S )	Nr   r   r   r   r   userz%sr   )r   r   	user_pass	USER_NAME	user_namer3   r   r?   r   r   rh   r   r   r   r   rm   r   r0   r   r   r   rg   r   s     r9   r5   z&PyCredentialsTests.create_user_account6  s:   7B??"%)^^^TX5G5G5I5I5IJ 	TXt|,,,Jt~666>>{KK,!"T^3"%&7"8"8!# # 	$ 	$ 	$ &--d//11222$$T^444$$T^444''(9:::r:   c                     | j                                         }t                      }d |d         D             |j        _        |d         |_        t                      }||fS )Nc                 Z    g | ](}t          |t                    r|nt          |          )S r   r   r   s     r9   r   z8PyCredentialsTests.get_authenticator.<locals>.<listcomp>S  s1    ]]]Q*Q"4"4@QQ#a&&]]]r:   r\   	timestamp)rC   rD   r   credr   r   )r7   rJ   authcurrentrR   s        r9   rN   z$PyCredentialsTests.get_authenticatorP  sa    !::<<$&&]]$|J\]]] -'))
$$r:   c           
          t          | j        | j        | j                  }t          j        }t          j        }d}|                    | j        | j        	                                ||||||           d S )Nr   )
r   r.   rg   rm   r   r   r   netr_LogonSamLogonWithFlagsr-   rn   )r7   rJ   r   rR   r   r   r   r   s           r9   rO   z0PyCredentialsTests.do_NetrLogonSamLogonWithFlagsY  s    #DK$($5$(O5 5 C#>
	%%dk&*o&E&E&G&G&-&0&1&+&6&0	2 	2 	2 	2 	2r:   c                     t                      }|                    | j        | j                                        ||d|           d S )N   )r   rl   r-   rm   rn   )r7   rJ   r   rR   r_   s        r9   rP   z,PyCredentialsTests.do_NetrLogonGetDomainInfoj  sP    +--	!!$+"&/"A"A"C"C")","#"'	) 	) 	) 	) 	)r:   )__name__
__module____qualname__r*   r=   rF   rL   rS   ry   r   r   r   r   r   r   r   r   r   r   r   r   rH   r4   r5   rN   rO   rP   __classcell__)r8   s   @r9   r    r    9   s       # # # # #&- - - - -G G G     	E 	E 	E= = =B,= ,= ,=`), ), ),Z), ), ),Z, , ,<, , ,B%C %C %CN  2; ; ;6  4  @* * *1 1 125 5 5> > >8  4% % %2 2 2") ) ) ) ) ) )r:   r    c                 0   t          | |          }d}|                    |||          }t          j                    }d |D             |_        t          j                    |_        t          |d                   |j        _        d |d         D             |j        _	        t          j
                    |_        |                                \  }}	|	|j        j        _        ||j        j        _        |                                |j        j        _        |S )Ns   abcdefgh)r   	challengetarget_infoc                 Z    g | ](}t          |t                    r|nt          |          )S r   r   r   s     r9   r   z'samlogon_logon_info.<locals>.<listcomp>  s1    RRR1
1c 2 2>11ARRRr:   nt_responsec                 Z    g | ](}t          |t                    r|nt          |          )S r   r   r   s     r9   r   z'samlogon_logon_info.<locals>.<listcomp>  s1    ```1
1c 2 2>11A```r:   )samlogon_targetget_ntlm_responser   netr_NetworkInfor  netr_ChallengeResponsentrr   r   r   netr_IdentityInfor   get_ntlm_username_domaindomain_namestringaccount_namern   workstation)
r  r[   credsr   target_info_blobr  responser   usernamer.   s
             r9   r   r   x  s    '{MBBI&&U1:3C ' E EH %''ERR	RRREO"9;;EHh}566EHO``Q^H_```EHM"466E88::Xv.4E#*.6E$+.3.C.C.E.EE#*Lr:   c                 \   t          j                    }d|_        t          j                    }t           j        |_        ||_        t          j                    }t           j        |_        | |_        t          j                    }t           j        |_        |||g|_	        t          |          S )N   )r   AV_PAIR_LISTcountAV_PAIRMsvAvNbComputerNameAvIdValueMsvAvNbDomainNameMsvAvEOLpairr   )r  r[   r  computername
domainnameeols         r9   r  r    s    &((KK?$$L3L&L""J/JO"J
/

CCH"L#6KK   r:   ).samba.testsr   r   r+   r3   r   
samba.authr   samba.credentialsr   r   r   r	   samba.dcerpcr
   r   r   r   r   samba.dcerpc.netlogonr   r   r   samba.dcerpc.miscr   
samba.dsdbr   r   r   	samba.ndrr   r   samba.samdbr   r   r   samba.commonr   samba.sd_utilsr   r   r   r   r    r   r  r   r:   r9   <module>r4     s  $ / . . . . . . . 				 



  % % % % % %           
 B A A A A A A A A A A A A A         
 - , , , , ,          + * * * * * * *       ) ) ) ) ) ) ) ) # # # # # # " " " " " "  	y) y) y) y) y) y) y) y)@ 3   <! ! ! ! !r:   