2003-07-01 17:51:52 +00:00
/*
2002-01-30 06:08:46 +00:00
* Unix SMB / CIFS implementation .
2003-03-14 17:05:13 +00:00
* Routines to operate on various trust relationships
* Copyright ( C ) Andrew Bartlett 2001
* Copyright ( C ) Rafal Szczesniak 2003
2001-12-05 11:00:26 +00:00
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*/
# include "includes.h"
/*********************************************************
Change the domain password on the PDC .
Just changes the password betwen the two values specified .
Caller must have the cli connected to the netlogon pipe
already .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static NTSTATUS just_change_the_password ( struct cli_state * cli , TALLOC_CTX * mem_ctx ,
unsigned char orig_trust_passwd_hash [ 16 ] ,
2003-04-16 10:20:14 +00:00
unsigned char new_trust_passwd_hash [ 16 ] ,
uint32 sec_channel_type )
2001-12-05 11:00:26 +00:00
{
NTSTATUS result ;
2002-08-30 10:46:59 +00:00
2003-08-19 22:47:10 +00:00
/* ensure that schannel uses the right domain */
fstrcpy ( cli - > domain , lp_workgroup ( ) ) ;
if ( ! NT_STATUS_IS_OK ( result = cli_nt_establish_netlogon ( cli , sec_channel_type , orig_trust_passwd_hash ) ) ) {
2003-05-01 02:51:49 +00:00
DEBUG ( 3 , ( " just_change_the_password: unable to setup creds (%s)! \n " ,
2002-03-17 04:36:35 +00:00
nt_errstr ( result ) ) ) ;
2001-12-05 11:00:26 +00:00
return result ;
}
2003-08-19 22:47:10 +00:00
2002-11-12 23:15:52 +00:00
result = cli_net_srv_pwset ( cli , mem_ctx , global_myname ( ) , new_trust_passwd_hash ) ;
2001-12-05 11:00:26 +00:00
if ( ! NT_STATUS_IS_OK ( result ) ) {
DEBUG ( 0 , ( " just_change_the_password: unable to change password (%s)! \n " ,
2002-03-17 04:36:35 +00:00
nt_errstr ( result ) ) ) ;
2001-12-05 11:00:26 +00:00
}
return result ;
}
/*********************************************************
Change the domain password on the PDC .
Store the password ourselves , but use the supplied password
Caller must have already setup the connection to the NETLOGON pipe
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
NTSTATUS trust_pw_change_and_store_it ( struct cli_state * cli , TALLOC_CTX * mem_ctx ,
2003-04-16 10:20:14 +00:00
const char * domain ,
unsigned char orig_trust_passwd_hash [ 16 ] ,
uint32 sec_channel_type )
2001-12-05 11:00:26 +00:00
{
unsigned char new_trust_passwd_hash [ 16 ] ;
char * new_trust_passwd ;
char * str ;
NTSTATUS nt_status ;
/* Create a random machine account password */
str = generate_random_str ( DEFAULT_TRUST_ACCOUNT_PASSWORD_LENGTH ) ;
new_trust_passwd = talloc_strdup ( mem_ctx , str ) ;
2002-06-25 07:58:29 +00:00
E_md4hash ( new_trust_passwd , new_trust_passwd_hash ) ;
2001-12-05 11:00:26 +00:00
nt_status = just_change_the_password ( cli , mem_ctx , orig_trust_passwd_hash ,
2003-04-16 10:20:14 +00:00
new_trust_passwd_hash , sec_channel_type ) ;
2001-12-05 11:00:26 +00:00
if ( NT_STATUS_IS_OK ( nt_status ) ) {
2002-06-25 08:57:24 +00:00
DEBUG ( 3 , ( " %s : trust_pw_change_and_store_it: Changed password. \n " ,
timestring ( False ) ) ) ;
2001-12-05 11:00:26 +00:00
/*
* Return the result of trying to write the new password
* back into the trust account file .
*/
2003-04-16 10:20:14 +00:00
if ( ! secrets_store_machine_password ( new_trust_passwd , domain , sec_channel_type ) ) {
2001-12-05 11:00:26 +00:00
nt_status = NT_STATUS_UNSUCCESSFUL ;
}
}
return nt_status ;
}
/*********************************************************
Change the domain password on the PDC .
Do most of the legwork ourselfs . Caller must have
already setup the connection to the NETLOGON pipe
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2003-04-16 10:20:14 +00:00
NTSTATUS trust_pw_find_change_and_store_it ( struct cli_state * cli ,
TALLOC_CTX * mem_ctx ,
2002-11-12 23:15:52 +00:00
const char * domain )
2001-12-05 11:00:26 +00:00
{
unsigned char old_trust_passwd_hash [ 16 ] ;
char * up_domain ;
2003-04-16 10:20:14 +00:00
uint32 sec_channel_type = 0 ;
2001-12-05 11:00:26 +00:00
up_domain = talloc_strdup ( mem_ctx , domain ) ;
if ( ! secrets_fetch_trust_account_password ( domain ,
old_trust_passwd_hash ,
2003-04-16 10:20:14 +00:00
NULL , & sec_channel_type ) ) {
2001-12-05 11:00:26 +00:00
DEBUG ( 0 , ( " could not fetch domain secrets for domain %s! \n " , domain ) ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
2003-04-16 10:20:14 +00:00
return trust_pw_change_and_store_it ( cli , mem_ctx , domain ,
old_trust_passwd_hash ,
sec_channel_type ) ;
2001-12-05 11:00:26 +00:00
2003-03-14 17:05:13 +00:00
}
2003-07-01 03:49:41 +00:00
/*********************************************************************
Enumerate the list of trusted domains from a DC
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2003-07-01 17:51:52 +00:00
BOOL enumerate_domain_trusts ( TALLOC_CTX * mem_ctx , const char * domain ,
char * * * domain_names , uint32 * num_domains ,
2003-07-01 03:49:41 +00:00
DOM_SID * * sids )
{
POLICY_HND pol ;
NTSTATUS result = NT_STATUS_UNSUCCESSFUL ;
fstring dc_name ;
struct in_addr dc_ip ;
uint32 enum_ctx = 0 ;
struct cli_state * cli = NULL ;
BOOL retry ;
2003-07-01 17:51:52 +00:00
2003-07-01 03:49:41 +00:00
* domain_names = NULL ;
* num_domains = 0 ;
* sids = NULL ;
2003-07-01 17:51:52 +00:00
2003-07-01 03:49:41 +00:00
/* lookup a DC first */
2003-07-01 17:51:52 +00:00
2004-01-05 04:10:28 +00:00
if ( ! get_dc_name ( domain , NULL , dc_name , & dc_ip ) ) {
2003-07-01 03:49:41 +00:00
DEBUG ( 3 , ( " enumerate_domain_trusts: can't locate a DC for domain %s \n " ,
domain ) ) ;
return False ;
}
2003-07-01 17:51:52 +00:00
2003-07-01 03:49:41 +00:00
/* setup the anonymous connection */
2003-07-01 17:51:52 +00:00
result = cli_full_connection ( & cli , global_myname ( ) , dc_name , & dc_ip , 0 , " IPC$ " , " IPC " ,
2003-07-30 23:49:29 +00:00
" " , " " , " " , 0 , Undefined , & retry ) ;
2003-07-01 03:49:41 +00:00
if ( ! NT_STATUS_IS_OK ( result ) )
goto done ;
2003-07-01 17:51:52 +00:00
2003-07-01 03:49:41 +00:00
/* open the LSARPC_PIPE */
2003-07-01 17:51:52 +00:00
2003-07-01 03:49:41 +00:00
if ( ! cli_nt_session_open ( cli , PI_LSARPC ) ) {
result = NT_STATUS_UNSUCCESSFUL ;
goto done ;
}
2003-07-01 17:51:52 +00:00
2003-07-01 03:49:41 +00:00
/* get a handle */
2003-07-01 17:51:52 +00:00
result = cli_lsa_open_policy ( cli , mem_ctx , True ,
2003-07-01 03:49:41 +00:00
POLICY_VIEW_LOCAL_INFORMATION , & pol ) ;
if ( ! NT_STATUS_IS_OK ( result ) )
goto done ;
/* Lookup list of trusted domains */
result = cli_lsa_enum_trust_dom ( cli , mem_ctx , & pol , & enum_ctx ,
num_domains , domain_names , sids ) ;
2003-07-01 17:51:52 +00:00
if ( ! NT_STATUS_IS_OK ( result ) )
2003-07-01 03:49:41 +00:00
goto done ;
2003-07-01 17:51:52 +00:00
done :
2003-07-01 03:49:41 +00:00
/* cleanup */
2003-09-16 03:54:42 +00:00
if ( cli ) {
2003-11-22 06:15:28 +00:00
DEBUG ( 10 , ( " enumerate_domain_trusts: shutting down connection... \n " ) ) ;
2003-09-16 03:54:42 +00:00
cli_shutdown ( cli ) ;
}
2003-03-15 08:18:29 +00:00
2003-07-01 17:51:52 +00:00
return NT_STATUS_IS_OK ( result ) ;
2003-03-14 17:05:13 +00:00
}