1998-05-07 22:19:05 +04:00
/*
Unix SMB / Netbios implementation .
Version 1.9 .
Password and authentication handling
2001-09-26 00:21:21 +04:00
Copyright ( C ) Jeremy Allison 1996 - 2001
2000-11-14 02:03:34 +03:00
Copyright ( C ) Luke Kenneth Casson Leighton 1996 - 1998
2001-04-26 02:12:13 +04:00
Copyright ( C ) Gerald ( Jerry ) Carter 2000 - 2001
1998-05-19 01:30:57 +04:00
1998-05-07 22:19:05 +04: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"
1999-12-13 16:27:58 +03:00
/*
* This is set on startup - it defines the SID for this
* machine , and therefore the SAM database for which it is
* responsible .
*/
1998-11-29 23:03:33 +03:00
extern DOM_SID global_sam_sid ;
1998-05-07 22:19:05 +04:00
2000-11-14 02:03:34 +03:00
struct passdb_ops * pdb_ops ;
2001-09-26 00:21:21 +04:00
#if 0 /* JERRY */
2000-11-14 02:03:34 +03:00
static void * pdb_handle = NULL ;
2001-09-26 00:21:21 +04:00
# endif
1998-05-19 03:57:28 +04:00
1998-05-19 23:17:35 +04:00
/***************************************************************
1999-12-13 16:27:58 +03:00
Initialize the password db operations .
1998-05-19 23:17:35 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-09-26 00:21:21 +04:00
2000-11-14 02:03:34 +03:00
BOOL initialize_password_db ( BOOL reload )
2001-09-26 00:21:21 +04:00
{
/*
* This function is unfinished right now , so just
* ignore the details and always return True . It
* is here only as a placeholder - - jerry
*/
2000-11-14 02:03:34 +03:00
return True ;
2001-09-05 12:54:04 +04:00
1998-05-07 22:19:05 +04:00
}
2000-11-14 02:03:34 +03:00
/*************************************************************
2001-09-26 00:21:21 +04:00
Initialises a struct sam_disp_info .
2000-11-14 02:03:34 +03:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-09-26 00:21:21 +04:00
2000-11-14 02:03:34 +03:00
static void pdb_init_dispinfo ( struct sam_disp_info * user )
1998-05-07 22:19:05 +04:00
{
2000-11-14 02:03:34 +03:00
if ( user = = NULL )
return ;
ZERO_STRUCTP ( user ) ;
1998-11-29 23:03:33 +03:00
}
2001-09-27 13:13:26 +04:00
/************************************************************
Fill the SAM_ACCOUNT with default values .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static BOOL pdb_fill_default_sam ( SAM_ACCOUNT * user )
{
if ( user = = NULL ) {
DEBUG ( 0 , ( " pdb_fill_default_sam: SAM_ACCOUNT was NULL \n " ) ) ;
return False ;
}
ZERO_STRUCTP ( user ) ;
2001-10-04 03:08:10 +04:00
/* Don't change these timestamp settings without a good reason.
They are important for NT member server compatibility . */
2001-09-28 00:40:47 +04:00
user - > logon_time = ( time_t ) 0 ;
2001-10-04 02:58:37 +04:00
user - > pass_last_set_time = ( time_t ) 0 ;
user - > pass_can_change_time = ( time_t ) 0 ;
2001-10-02 10:57:18 +04:00
user - > logoff_time =
user - > kickoff_time =
user - > pass_must_change_time = get_time_t_max ( ) ;
2001-09-28 00:40:47 +04:00
user - > unknown_3 = 0x00ffffff ; /* don't know */
user - > logon_divs = 168 ; /* hours per week */
user - > hours_len = 21 ; /* 21 times 8 bits = 168 */
memset ( user - > hours , 0xff , user - > hours_len ) ; /* available at all hours */
user - > unknown_5 = 0x00000000 ; /* don't know */
user - > unknown_6 = 0x000004ec ; /* don't know */
2001-09-27 13:13:26 +04:00
return True ;
}
2000-11-14 02:03:34 +03:00
/*************************************************************
2001-09-26 00:21:21 +04:00
Alloc memory and initialises a struct sam_passwd .
2000-11-14 02:03:34 +03:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-09-26 00:21:21 +04:00
2001-05-04 19:44:27 +04:00
BOOL pdb_init_sam ( SAM_ACCOUNT * * user )
1998-05-07 22:19:05 +04:00
{
2001-05-04 19:44:27 +04:00
if ( * user ! = NULL ) {
DEBUG ( 0 , ( " pdb_init_sam: SAM_ACCOUNT was non NULL \n " ) ) ;
#if 0
smb_panic ( " NULL pointer passed to pdb_init_sam \n " ) ;
# endif
return False ;
}
2000-11-14 02:03:34 +03:00
2001-05-04 19:44:27 +04:00
* user = ( SAM_ACCOUNT * ) malloc ( sizeof ( SAM_ACCOUNT ) ) ;
if ( * user = = NULL ) {
DEBUG ( 0 , ( " pdb_init_sam: error while allocating memory \n " ) ) ;
return False ;
}
2001-09-27 13:13:26 +04:00
pdb_fill_default_sam ( * user ) ;
return True ;
}
/*************************************************************
Initialises a struct sam_passwd with sane values .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
BOOL pdb_init_sam_pw ( SAM_ACCOUNT * * new_sam_acct , struct passwd * pwd )
{
if ( ! pwd ) {
new_sam_acct = NULL ;
return False ;
}
if ( ! pdb_init_sam ( new_sam_acct ) ) {
new_sam_acct = NULL ;
return False ;
}
pdb_set_username ( * new_sam_acct , pwd - > pw_name ) ;
pdb_set_fullname ( * new_sam_acct , pwd - > pw_gecos ) ;
pdb_set_uid ( * new_sam_acct , pwd - > pw_uid ) ;
pdb_set_gid ( * new_sam_acct , pwd - > pw_gid ) ;
pdb_set_profile_path ( * new_sam_acct , lp_logon_path ( ) ) ;
pdb_set_homedir ( * new_sam_acct , lp_logon_home ( ) ) ;
pdb_set_dir_drive ( * new_sam_acct , lp_logon_drive ( ) ) ;
pdb_set_logon_script ( * new_sam_acct , lp_logon_script ( ) ) ;
2001-05-04 19:44:27 +04:00
return True ;
1998-05-07 22:19:05 +04:00
}
2001-09-27 13:13:26 +04:00
2000-11-14 02:03:34 +03:00
/************************************************************
2001-09-27 13:13:26 +04:00
Free the NT / LM hashes only .
2000-11-14 02:03:34 +03:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-09-26 00:21:21 +04:00
2001-09-27 13:13:26 +04:00
static BOOL pdb_free_sam_contents ( SAM_ACCOUNT * user )
1998-05-07 22:19:05 +04:00
{
2001-05-04 19:44:27 +04:00
if ( user = = NULL ) {
2001-09-27 13:13:26 +04:00
DEBUG ( 0 , ( " pdb_free_sam_contents: SAM_ACCOUNT was NULL \n " ) ) ;
2001-05-04 19:44:27 +04:00
#if 0
2001-09-29 17:14:19 +04:00
smb_panic ( " NULL pointer passed to pdb_free_sam_contents \n " ) ;
2001-05-04 19:44:27 +04:00
# endif
return False ;
}
2001-04-26 02:12:13 +04:00
2001-09-27 13:13:26 +04:00
/* As we start mallocing more strings this is where
we should free them . */
2001-09-17 09:04:17 +04:00
SAFE_FREE ( user - > nt_pw ) ;
SAFE_FREE ( user - > lm_pw ) ;
2000-11-14 02:03:34 +03:00
2001-05-04 19:44:27 +04:00
return True ;
1998-05-07 22:19:05 +04:00
}
2001-09-27 13:13:26 +04:00
2001-05-07 18:04:46 +04:00
/************************************************************
2001-09-27 13:13:26 +04:00
Reset the SAM_ACCOUNT and free the NT / LM hashes .
- note : they are not zero ' ed out however .
2001-05-07 18:04:46 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
BOOL pdb_reset_sam ( SAM_ACCOUNT * user )
{
if ( user = = NULL ) {
DEBUG ( 0 , ( " pdb_reset_sam: SAM_ACCOUNT was NULL \n " ) ) ;
2001-09-29 17:14:19 +04:00
#if 0
smb_panic ( " NULL pointer passed to pdb_free_sam \n " ) ;
# endif
2001-05-07 18:04:46 +04:00
return False ;
}
2001-09-27 13:13:26 +04:00
if ( ! pdb_free_sam_contents ( user ) ) {
return False ;
}
if ( ! pdb_fill_default_sam ( user ) ) {
return False ;
}
2001-05-07 18:04:46 +04:00
return True ;
}
2000-02-26 01:25:25 +03:00
2001-09-27 13:13:26 +04:00
/************************************************************
Free the SAM_ACCOUNT and the NT / LM hashes .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-09-29 17:14:19 +04:00
BOOL pdb_free_sam ( SAM_ACCOUNT * * user )
2001-09-27 13:13:26 +04:00
{
2001-09-29 17:14:19 +04:00
if ( * user = = NULL ) {
2001-09-27 13:13:26 +04:00
DEBUG ( 0 , ( " pdb_free_sam: SAM_ACCOUNT was NULL \n " ) ) ;
#if 0
smb_panic ( " NULL pointer passed to pdb_free_sam \n " ) ;
# endif
return False ;
}
2001-09-29 17:14:19 +04:00
if ( ! pdb_free_sam_contents ( * user ) ) {
2001-09-27 13:13:26 +04:00
return False ;
}
2001-09-29 17:14:19 +04:00
SAFE_FREE ( * user ) ;
2001-09-27 13:13:26 +04:00
return True ;
}
2000-11-14 02:03:34 +03:00
/*************************************************************************
Routine to return the next entry in the sam passwd list .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-09-26 00:21:21 +04:00
2000-11-14 02:03:34 +03:00
struct sam_disp_info * pdb_sam_to_dispinfo ( SAM_ACCOUNT * user )
2000-02-26 01:25:25 +03:00
{
2000-11-14 02:03:34 +03:00
static struct sam_disp_info disp_info ;
2000-02-26 01:25:25 +03:00
2000-11-14 02:03:34 +03:00
if ( user = = NULL )
return NULL ;
1998-05-19 01:30:57 +04:00
2000-11-14 02:03:34 +03:00
pdb_init_dispinfo ( & disp_info ) ;
1999-12-13 16:27:58 +03:00
2000-11-14 02:03:34 +03:00
disp_info . smb_name = user - > username ;
disp_info . full_name = user - > full_name ;
disp_info . user_rid = user - > user_rid ;
1999-12-13 16:27:58 +03:00
2000-11-14 02:03:34 +03:00
return & disp_info ;
1998-10-22 01:11:16 +04:00
}
2001-09-26 00:21:21 +04:00
/**********************************************************
Encode the account control bits into a string .
length = length of string to encode into ( including terminating
null ) . length * MUST BE MORE THAN 2 * !
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
char * pdb_encode_acct_ctrl ( uint16 acct_ctrl , size_t length )
{
static fstring acct_str ;
size_t i = 0 ;
acct_str [ i + + ] = ' [ ' ;
if ( acct_ctrl & ACB_PWNOTREQ ) acct_str [ i + + ] = ' N ' ;
if ( acct_ctrl & ACB_DISABLED ) acct_str [ i + + ] = ' D ' ;
if ( acct_ctrl & ACB_HOMDIRREQ ) acct_str [ i + + ] = ' H ' ;
if ( acct_ctrl & ACB_TEMPDUP ) acct_str [ i + + ] = ' T ' ;
if ( acct_ctrl & ACB_NORMAL ) acct_str [ i + + ] = ' U ' ;
if ( acct_ctrl & ACB_MNS ) acct_str [ i + + ] = ' M ' ;
if ( acct_ctrl & ACB_WSTRUST ) acct_str [ i + + ] = ' W ' ;
if ( acct_ctrl & ACB_SVRTRUST ) acct_str [ i + + ] = ' S ' ;
if ( acct_ctrl & ACB_AUTOLOCK ) acct_str [ i + + ] = ' L ' ;
if ( acct_ctrl & ACB_PWNOEXP ) acct_str [ i + + ] = ' X ' ;
if ( acct_ctrl & ACB_DOMTRUST ) acct_str [ i + + ] = ' I ' ;
for ( ; i < length - 2 ; i + + )
acct_str [ i ] = ' ' ;
i = length - 2 ;
acct_str [ i + + ] = ' ] ' ;
acct_str [ i + + ] = ' \0 ' ;
return acct_str ;
}
/**********************************************************
Decode the account control bits from a string .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
uint16 pdb_decode_acct_ctrl ( const char * p )
{
uint16 acct_ctrl = 0 ;
BOOL finished = False ;
/*
* Check if the account type bits have been encoded after the
* NT password ( in the form [ NDHTUWSLXI ] ) .
*/
if ( * p ! = ' [ ' )
return 0 ;
for ( p + + ; * p & & ! finished ; p + + ) {
switch ( * p ) {
case ' N ' : { acct_ctrl | = ACB_PWNOTREQ ; break ; /* 'N'o password. */ }
case ' D ' : { acct_ctrl | = ACB_DISABLED ; break ; /* 'D'isabled. */ }
case ' H ' : { acct_ctrl | = ACB_HOMDIRREQ ; break ; /* 'H'omedir required. */ }
case ' T ' : { acct_ctrl | = ACB_TEMPDUP ; break ; /* 'T'emp account. */ }
case ' U ' : { acct_ctrl | = ACB_NORMAL ; break ; /* 'U'ser account (normal). */ }
case ' M ' : { acct_ctrl | = ACB_MNS ; break ; /* 'M'NS logon user account. What is this ? */ }
case ' W ' : { acct_ctrl | = ACB_WSTRUST ; break ; /* 'W'orkstation account. */ }
case ' S ' : { acct_ctrl | = ACB_SVRTRUST ; break ; /* 'S'erver account. */ }
case ' L ' : { acct_ctrl | = ACB_AUTOLOCK ; break ; /* 'L'ocked account. */ }
case ' X ' : { acct_ctrl | = ACB_PWNOEXP ; break ; /* No 'X'piry on password */ }
case ' I ' : { acct_ctrl | = ACB_DOMTRUST ; break ; /* 'I'nterdomain trust account. */ }
case ' ' : { break ; }
case ' : ' :
case ' \n ' :
case ' \0 ' :
case ' ] ' :
default : { finished = True ; }
}
}
return acct_ctrl ;
}
/*************************************************************
Routine to set 32 hex password characters from a 16 byte array .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void pdb_sethexpwd ( char * p , unsigned char * pwd , uint16 acct_ctrl )
{
if ( pwd ! = NULL ) {
int i ;
for ( i = 0 ; i < 16 ; i + + )
slprintf ( & p [ i * 2 ] , 3 , " %02X " , pwd [ i ] ) ;
} else {
if ( acct_ctrl & ACB_PWNOTREQ )
safe_strcpy ( p , " NO PASSWORDXXXXXXXXXXXXXXXXXXXXX " , 33 ) ;
else
safe_strcpy ( p , " XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX " , 33 ) ;
}
}
/*************************************************************
Routine to get the 32 hex characters and turn them
into a 16 byte array .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
BOOL pdb_gethexpwd ( char * p , unsigned char * pwd )
{
int i ;
unsigned char lonybble , hinybble ;
char * hexchars = " 0123456789ABCDEF " ;
char * p1 , * p2 ;
if ( ! p )
return ( False ) ;
for ( i = 0 ; i < 32 ; i + = 2 ) {
hinybble = toupper ( p [ i ] ) ;
lonybble = toupper ( p [ i + 1 ] ) ;
p1 = strchr ( hexchars , hinybble ) ;
p2 = strchr ( hexchars , lonybble ) ;
if ( ! p1 | | ! p2 )
return ( False ) ;
hinybble = PTR_DIFF ( p1 , hexchars ) ;
lonybble = PTR_DIFF ( p2 , hexchars ) ;
pwd [ i / 2 ] = ( hinybble < < 4 ) | lonybble ;
}
return ( True ) ;
}
2000-11-14 02:03:34 +03:00
/*******************************************************************
Group and User RID username mapping function
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-09-26 00:21:21 +04:00
2000-11-14 02:03:34 +03:00
BOOL pdb_name_to_rid ( char * user_name , uint32 * u_rid , uint32 * g_rid )
{
struct passwd * pw = Get_Pwnam ( user_name , False ) ;
1999-12-13 16:27:58 +03:00
2000-11-14 02:03:34 +03:00
if ( u_rid = = NULL | | g_rid = = NULL | | user_name = = NULL )
return False ;
1999-12-13 16:27:58 +03:00
2001-09-26 00:21:21 +04:00
if ( ! pw ) {
2000-11-14 02:03:34 +03:00
DEBUG ( 1 , ( " Username %s is invalid on this system \n " , user_name ) ) ;
return False ;
1999-12-13 16:27:58 +03:00
}
2001-05-08 02:10:38 +04:00
/* turn the unix UID into a Domain RID. this is what the posix
sub - system does ( adds 1000 to the uid ) */
* u_rid = pdb_uid_to_user_rid ( pw - > pw_uid ) ;
1999-12-13 16:27:58 +03:00
2000-11-14 02:03:34 +03:00
/* absolutely no idea what to do about the unix GID to Domain RID mapping */
* g_rid = pdb_gid_to_group_rid ( pw - > pw_gid ) ;
1999-12-13 16:27:58 +03:00
2000-11-14 02:03:34 +03:00
return True ;
1999-12-13 16:27:58 +03:00
}
2000-11-14 02:03:34 +03:00
/*******************************************************************
Converts NT user RID to a UNIX uid .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-09-26 00:21:21 +04:00
2000-11-14 02:03:34 +03:00
uid_t pdb_user_rid_to_uid ( uint32 user_rid )
1999-12-13 16:27:58 +03:00
{
2000-11-14 02:03:34 +03:00
return ( uid_t ) ( ( ( user_rid & ( ~ USER_RID_TYPE ) ) - 1000 ) / RID_MULTIPLIER ) ;
1999-12-13 16:27:58 +03:00
}
2000-11-14 02:03:34 +03:00
/*******************************************************************
Converts NT user RID to a UNIX gid .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-12-13 16:27:58 +03:00
2000-11-14 02:03:34 +03:00
gid_t pdb_user_rid_to_gid ( uint32 user_rid )
1999-12-13 16:27:58 +03:00
{
2000-11-14 02:03:34 +03:00
return ( uid_t ) ( ( ( user_rid & ( ~ GROUP_RID_TYPE ) ) - 1000 ) / RID_MULTIPLIER ) ;
1999-12-13 16:27:58 +03:00
}
2000-11-14 02:03:34 +03:00
/*******************************************************************
converts UNIX uid to an NT User RID .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-12-13 16:27:58 +03:00
2000-11-14 02:03:34 +03:00
uint32 pdb_uid_to_user_rid ( uid_t uid )
1999-12-13 16:27:58 +03:00
{
2000-11-14 02:03:34 +03:00
return ( ( ( ( ( uint32 ) uid ) * RID_MULTIPLIER ) + 1000 ) | USER_RID_TYPE ) ;
1999-12-13 16:27:58 +03:00
}
2000-11-14 02:03:34 +03:00
/*******************************************************************
converts NT Group RID to a UNIX uid .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2000-10-07 19:56:36 +04:00
2000-11-14 02:03:34 +03:00
uint32 pdb_gid_to_group_rid ( gid_t gid )
2000-10-07 19:56:36 +04:00
{
2000-11-14 02:03:34 +03:00
return ( ( ( ( ( uint32 ) gid ) * RID_MULTIPLIER ) + 1000 ) | GROUP_RID_TYPE ) ;
2000-10-07 19:56:36 +04:00
}
2000-11-14 02:03:34 +03:00
/*******************************************************************
Decides if a RID is a well known RID .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static BOOL pdb_rid_is_well_known ( uint32 rid )
2000-10-07 19:56:36 +04:00
{
2000-11-14 02:03:34 +03:00
return ( rid < 1000 ) ;
2000-10-07 19:56:36 +04:00
}
1999-12-13 16:27:58 +03:00
2000-11-14 02:03:34 +03:00
/*******************************************************************
Decides if a RID is a user or group RID .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-09-26 00:21:21 +04:00
2000-11-14 02:03:34 +03:00
BOOL pdb_rid_is_user ( uint32 rid )
{
/* lkcl i understand that NT attaches an enumeration to a RID
* such that it can be identified as either a user , group etc
* type . there are 5 such categories , and they are documented .
*/
if ( pdb_rid_is_well_known ( rid ) ) {
/*
* The only well known user RIDs are DOMAIN_USER_RID_ADMIN
* and DOMAIN_USER_RID_GUEST .
*/
if ( rid = = DOMAIN_USER_RID_ADMIN | | rid = = DOMAIN_USER_RID_GUEST )
return True ;
} else if ( ( rid & RID_TYPE_MASK ) = = USER_RID_TYPE ) {
return True ;
}
return False ;
}
/*******************************************************************
Convert a rid into a name . Used in the lookup SID rpc .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-09-26 00:21:21 +04:00
2000-11-14 02:03:34 +03:00
BOOL local_lookup_rid ( uint32 rid , char * name , enum SID_NAME_USE * psid_name_use )
{
BOOL is_user = pdb_rid_is_user ( rid ) ;
1999-12-13 16:27:58 +03:00
2001-10-10 00:54:56 +04:00
* psid_name_use = SID_NAME_UNKNOWN ;
2000-11-14 02:03:34 +03:00
DEBUG ( 5 , ( " local_lookup_rid: looking up %s RID %u. \n " , is_user ? " user " :
" group " , ( unsigned int ) rid ) ) ;
1999-12-13 16:27:58 +03:00
2000-11-14 02:03:34 +03:00
if ( is_user ) {
if ( rid = = DOMAIN_USER_RID_ADMIN ) {
pstring admin_users ;
char * p = admin_users ;
2001-10-10 00:54:56 +04:00
* psid_name_use = SID_NAME_USER ;
2000-11-14 02:03:34 +03:00
if ( ! next_token ( & p , name , NULL , sizeof ( fstring ) ) )
fstrcpy ( name , " Administrator " ) ;
} else if ( rid = = DOMAIN_USER_RID_GUEST ) {
pstring guest_users ;
char * p = guest_users ;
2001-10-10 00:54:56 +04:00
* psid_name_use = SID_NAME_USER ;
2000-11-14 02:03:34 +03:00
if ( ! next_token ( & p , name , NULL , sizeof ( fstring ) ) )
fstrcpy ( name , " Guest " ) ;
} else {
2001-01-10 19:05:41 +03:00
uid_t uid ;
struct passwd * pass ;
/*
* Don ' t try to convert the rid to a name if
* running in appliance mode
*/
if ( lp_hide_local_users ( ) )
return False ;
uid = pdb_user_rid_to_uid ( rid ) ;
pass = sys_getpwuid ( uid ) ;
1999-12-13 16:27:58 +03:00
2000-11-14 02:03:34 +03:00
* psid_name_use = SID_NAME_USER ;
DEBUG ( 5 , ( " local_lookup_rid: looking up uid %u %s \n " , ( unsigned int ) uid ,
pass ? " succeeded " : " failed " ) ) ;
if ( ! pass ) {
slprintf ( name , sizeof ( fstring ) - 1 , " unix_user.%u " , ( unsigned int ) uid ) ;
return True ;
}
fstrcpy ( name , pass - > pw_name ) ;
DEBUG ( 5 , ( " local_lookup_rid: found user %s for rid %u \n " , name ,
( unsigned int ) rid ) ) ;
}
} else {
2001-09-26 00:21:21 +04:00
gid_t gid ;
2001-01-10 19:05:41 +03:00
struct group * gr ;
2001-09-26 00:21:21 +04:00
2001-01-10 19:05:41 +03:00
/*
* Don ' t try to convert the rid to a name if running
* in appliance mode
*/
if ( lp_hide_local_users ( ) )
return False ;
2001-05-04 19:44:27 +04:00
gid = pdb_user_rid_to_gid ( rid ) ;
gr = getgrgid ( gid ) ;
2001-09-26 00:21:21 +04:00
* psid_name_use = SID_NAME_ALIAS ;
2000-11-14 02:03:34 +03:00
DEBUG ( 5 , ( " local_local_rid: looking up gid %u %s \n " , ( unsigned int ) gid ,
gr ? " succeeded " : " failed " ) ) ;
if ( ! gr ) {
slprintf ( name , sizeof ( fstring ) - 1 , " unix_group.%u " , ( unsigned int ) gid ) ;
return True ;
}
fstrcpy ( name , gr - > gr_name ) ;
2001-09-26 00:21:21 +04:00
DEBUG ( 5 , ( " local_lookup_rid: found group %s for rid %u \n " , name ,
( unsigned int ) rid ) ) ;
2000-11-14 02:03:34 +03:00
}
return True ;
1998-05-18 19:50:56 +04:00
}
2000-11-14 02:03:34 +03:00
/*******************************************************************
Convert a name into a SID . Used in the lookup name rpc .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-12-13 16:27:58 +03:00
2001-03-21 02:07:36 +03:00
BOOL local_lookup_name ( const char * c_domain , const char * c_user , DOM_SID * psid , enum SID_NAME_USE * psid_name_use )
1998-05-18 18:43:06 +04:00
{
2000-11-14 02:03:34 +03:00
extern DOM_SID global_sid_World_Domain ;
struct passwd * pass = NULL ;
DOM_SID local_sid ;
2001-03-21 02:07:36 +03:00
fstring user ;
fstring domain ;
2001-10-10 00:54:56 +04:00
* psid_name_use = SID_NAME_UNKNOWN ;
2001-03-21 02:07:36 +03:00
/*
* domain and user may be quoted const strings , and map_username and
* friends can modify them . Make a modifiable copy . JRA .
*/
fstrcpy ( domain , c_domain ) ;
fstrcpy ( user , c_user ) ;
2000-11-14 02:03:34 +03:00
sid_copy ( & local_sid , & global_sam_sid ) ;
/*
* Special case for MACHINE \ Everyone . Map to the world_sid .
*/
if ( strequal ( user , " Everyone " ) ) {
sid_copy ( psid , & global_sid_World_Domain ) ;
sid_append_rid ( psid , 0 ) ;
* psid_name_use = SID_NAME_ALIAS ;
return True ;
}
2001-01-10 19:05:41 +03:00
/*
* Don ' t lookup local unix users if running in appliance mode
*/
if ( lp_hide_local_users ( ) )
return False ;
2000-11-14 02:03:34 +03:00
( void ) map_username ( user ) ;
2001-09-26 09:22:10 +04:00
if ( ( pass = Get_Pwnam ( user , False ) ) ) {
2001-05-04 19:44:27 +04:00
sid_append_rid ( & local_sid , pdb_uid_to_user_rid ( pass - > pw_uid ) ) ;
* psid_name_use = SID_NAME_USER ;
} else {
2000-11-14 02:03:34 +03:00
/*
* Maybe it was a group ?
*/
2001-09-26 00:21:21 +04:00
struct group * grp = getgrnam ( user ) ;
2000-11-14 02:03:34 +03:00
2001-09-26 00:21:21 +04:00
if ( ! grp )
return False ;
2001-05-04 19:44:27 +04:00
2001-09-26 00:21:21 +04:00
sid_append_rid ( & local_sid , pdb_gid_to_group_rid ( grp - > gr_gid ) ) ;
* psid_name_use = SID_NAME_ALIAS ;
2000-11-14 02:03:34 +03:00
}
sid_copy ( psid , & local_sid ) ;
return True ;
1998-05-18 18:43:06 +04:00
}
2000-11-14 02:03:34 +03:00
/****************************************************************************
Convert a uid to SID - locally .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-09-26 00:21:21 +04:00
2000-11-14 02:03:34 +03:00
DOM_SID * local_uid_to_sid ( DOM_SID * psid , uid_t uid )
1999-12-13 16:27:58 +03:00
{
2000-11-14 02:03:34 +03:00
extern DOM_SID global_sam_sid ;
sid_copy ( psid , & global_sam_sid ) ;
sid_append_rid ( psid , pdb_uid_to_user_rid ( uid ) ) ;
return psid ;
1999-12-13 16:27:58 +03:00
}
2000-11-14 02:03:34 +03:00
/****************************************************************************
Convert a SID to uid - locally .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-09-26 00:21:21 +04:00
2000-11-14 02:03:34 +03:00
BOOL local_sid_to_uid ( uid_t * puid , DOM_SID * psid , enum SID_NAME_USE * name_type )
1999-12-13 16:27:58 +03:00
{
2000-11-14 02:03:34 +03:00
extern DOM_SID global_sam_sid ;
1999-12-13 16:27:58 +03:00
2000-11-14 02:03:34 +03:00
DOM_SID dom_sid ;
uint32 rid ;
2001-01-16 01:46:22 +03:00
fstring str ;
struct passwd * pass ;
1999-12-13 16:27:58 +03:00
2000-11-14 02:03:34 +03:00
* name_type = SID_NAME_UNKNOWN ;
1999-12-13 16:27:58 +03:00
2000-11-14 02:03:34 +03:00
sid_copy ( & dom_sid , psid ) ;
sid_split_rid ( & dom_sid , & rid ) ;
1999-12-13 16:27:58 +03:00
2001-03-22 04:26:37 +03:00
if ( ! pdb_rid_is_user ( rid ) )
return False ;
2000-11-14 02:03:34 +03:00
/*
* We can only convert to a uid if this is our local
* Domain SID ( ie . we are the controling authority ) .
*/
if ( ! sid_equal ( & global_sam_sid , & dom_sid ) )
return False ;
1999-12-13 16:27:58 +03:00
2000-11-14 02:03:34 +03:00
* puid = pdb_user_rid_to_uid ( rid ) ;
1999-12-13 16:27:58 +03:00
2000-11-14 02:03:34 +03:00
/*
* Ensure this uid really does exist .
*/
2001-01-16 01:46:22 +03:00
if ( ! ( pass = sys_getpwuid ( * puid ) ) )
2000-11-14 02:03:34 +03:00
return False ;
1999-12-13 16:27:58 +03:00
2001-01-16 01:46:22 +03:00
DEBUG ( 10 , ( " local_sid_to_uid: SID %s -> uid (%u) (%s). \n " , sid_to_string ( str , psid ) ,
( unsigned int ) * puid , pass - > pw_name ) ) ;
2001-10-10 00:54:56 +04:00
* name_type = SID_NAME_USER ;
2000-11-14 02:03:34 +03:00
return True ;
}
1999-12-13 16:27:58 +03:00
2000-11-14 02:03:34 +03:00
/****************************************************************************
Convert a gid to SID - locally .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-09-26 00:21:21 +04:00
2000-11-14 02:03:34 +03:00
DOM_SID * local_gid_to_sid ( DOM_SID * psid , gid_t gid )
{
extern DOM_SID global_sam_sid ;
1999-12-13 16:27:58 +03:00
2000-11-14 02:03:34 +03:00
sid_copy ( psid , & global_sam_sid ) ;
sid_append_rid ( psid , pdb_gid_to_group_rid ( gid ) ) ;
1999-12-13 16:27:58 +03:00
2000-11-14 02:03:34 +03:00
return psid ;
1999-12-13 16:27:58 +03:00
}
2000-11-14 02:03:34 +03:00
/****************************************************************************
Convert a SID to gid - locally .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-09-26 00:21:21 +04:00
2000-11-14 02:03:34 +03:00
BOOL local_sid_to_gid ( gid_t * pgid , DOM_SID * psid , enum SID_NAME_USE * name_type )
{
extern DOM_SID global_sam_sid ;
DOM_SID dom_sid ;
uint32 rid ;
2001-01-16 01:46:22 +03:00
fstring str ;
struct group * grp ;
2000-11-14 02:03:34 +03:00
* name_type = SID_NAME_UNKNOWN ;
1999-12-13 16:27:58 +03:00
2000-11-14 02:03:34 +03:00
sid_copy ( & dom_sid , psid ) ;
sid_split_rid ( & dom_sid , & rid ) ;
1999-12-13 16:27:58 +03:00
2000-11-14 02:03:34 +03:00
/*
* We can only convert to a gid if this is our local
* Domain SID ( ie . we are the controling authority ) .
*/
if ( ! sid_equal ( & global_sam_sid , & dom_sid ) )
return False ;
1999-12-13 16:27:58 +03:00
2001-03-22 04:26:37 +03:00
if ( pdb_rid_is_user ( rid ) )
return False ;
2000-11-14 02:03:34 +03:00
* pgid = pdb_user_rid_to_gid ( rid ) ;
1999-12-13 16:27:58 +03:00
2000-11-14 02:03:34 +03:00
/*
* Ensure this gid really does exist .
*/
1999-12-13 16:27:58 +03:00
2001-01-16 01:46:22 +03:00
if ( ! ( grp = getgrgid ( * pgid ) ) )
2000-11-14 02:03:34 +03:00
return False ;
1999-12-13 16:27:58 +03:00
2001-01-16 01:46:22 +03:00
DEBUG ( 10 , ( " local_sid_to_gid: SID %s -> gid (%u) (%s). \n " , sid_to_string ( str , psid ) ,
( unsigned int ) * pgid , grp - > gr_name ) ) ;
2001-10-10 00:54:56 +04:00
* name_type = SID_NAME_ALIAS ;
2000-11-14 02:03:34 +03:00
return True ;
1999-12-13 16:27:58 +03:00
}
2001-05-04 19:44:27 +04:00
static void select_name ( pstring string , const UNISTR2 * from )
2000-10-07 19:56:36 +04:00
{
if ( from - > buffer ! = 0 )
2001-09-26 18:40:21 +04:00
unistr2_to_ascii ( string , from , sizeof ( pstring ) ) ;
2000-10-07 19:56:36 +04:00
}
/*************************************************************
2001-09-26 00:21:21 +04:00
Copies a SAM_USER_INFO_23 to a SAM_ACCOUNT
2000-10-07 19:56:36 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-09-26 00:21:21 +04:00
2000-11-21 08:55:16 +03:00
void copy_id23_to_sam_passwd ( SAM_ACCOUNT * to , SAM_USER_INFO_23 * from )
2000-10-07 19:56:36 +04:00
{
2000-11-21 08:55:16 +03:00
if ( from = = NULL | | to = = NULL )
return ;
2000-10-07 19:56:36 +04:00
to - > logon_time = nt_time_to_unix ( & from - > logon_time ) ;
to - > logoff_time = nt_time_to_unix ( & from - > logoff_time ) ;
to - > kickoff_time = nt_time_to_unix ( & from - > kickoff_time ) ;
to - > pass_last_set_time = nt_time_to_unix ( & from - > pass_last_set_time ) ;
to - > pass_can_change_time = nt_time_to_unix ( & from - > pass_can_change_time ) ;
to - > pass_must_change_time = nt_time_to_unix ( & from - > pass_must_change_time ) ;
2001-05-04 19:44:27 +04:00
select_name ( to - > username , & from - > uni_user_name ) ;
select_name ( to - > full_name , & from - > uni_full_name ) ;
select_name ( to - > home_dir , & from - > uni_home_dir ) ;
select_name ( to - > dir_drive , & from - > uni_dir_drive ) ;
select_name ( to - > logon_script , & from - > uni_logon_script ) ;
select_name ( to - > profile_path , & from - > uni_profile_path ) ;
select_name ( to - > acct_desc , & from - > uni_acct_desc ) ;
select_name ( to - > workstations , & from - > uni_workstations ) ;
select_name ( to - > unknown_str , & from - > uni_unknown_str ) ;
select_name ( to - > munged_dial , & from - > uni_munged_dial ) ;
2000-10-07 19:56:36 +04:00
to - > user_rid = from - > user_rid ;
to - > group_rid = from - > group_rid ;
to - > acct_ctrl = from - > acb_info ;
to - > unknown_3 = from - > unknown_3 ;
to - > logon_divs = from - > logon_divs ;
to - > hours_len = from - > logon_hrs . len ;
memcpy ( to - > hours , from - > logon_hrs . hours , MAX_HOURS_LEN ) ;
to - > unknown_5 = from - > unknown_5 ;
to - > unknown_6 = from - > unknown_6 ;
}
/*************************************************************
2001-09-26 00:21:21 +04:00
Copies a sam passwd .
2000-10-07 19:56:36 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-09-26 00:21:21 +04:00
2000-11-21 08:55:16 +03:00
void copy_id21_to_sam_passwd ( SAM_ACCOUNT * to , SAM_USER_INFO_21 * from )
2000-10-07 19:56:36 +04:00
{
2000-11-21 08:55:16 +03:00
if ( from = = NULL | | to = = NULL )
return ;
2000-10-07 19:56:36 +04:00
to - > logon_time = nt_time_to_unix ( & from - > logon_time ) ;
to - > logoff_time = nt_time_to_unix ( & from - > logoff_time ) ;
to - > kickoff_time = nt_time_to_unix ( & from - > kickoff_time ) ;
to - > pass_last_set_time = nt_time_to_unix ( & from - > pass_last_set_time ) ;
to - > pass_can_change_time = nt_time_to_unix ( & from - > pass_can_change_time ) ;
to - > pass_must_change_time = nt_time_to_unix ( & from - > pass_must_change_time ) ;
2001-05-04 19:44:27 +04:00
select_name ( to - > username , & from - > uni_user_name ) ;
select_name ( to - > full_name , & from - > uni_full_name ) ;
select_name ( to - > home_dir , & from - > uni_home_dir ) ;
select_name ( to - > dir_drive , & from - > uni_dir_drive ) ;
select_name ( to - > logon_script , & from - > uni_logon_script ) ;
select_name ( to - > profile_path , & from - > uni_profile_path ) ;
select_name ( to - > acct_desc , & from - > uni_acct_desc ) ;
select_name ( to - > workstations , & from - > uni_workstations ) ;
select_name ( to - > unknown_str , & from - > uni_unknown_str ) ;
select_name ( to - > munged_dial , & from - > uni_munged_dial ) ;
2000-10-07 19:56:36 +04:00
to - > user_rid = from - > user_rid ;
to - > group_rid = from - > group_rid ;
2000-11-21 08:55:16 +03:00
/* FIXME!! Do we need to copy the passwords here as well?
I don ' t know . Need to figure this out - - jerry */
2000-10-07 19:56:36 +04:00
to - > acct_ctrl = from - > acb_info ;
to - > unknown_3 = from - > unknown_3 ;
to - > logon_divs = from - > logon_divs ;
to - > hours_len = from - > logon_hrs . len ;
memcpy ( to - > hours , from - > logon_hrs . hours , MAX_HOURS_LEN ) ;
to - > unknown_5 = from - > unknown_5 ;
to - > unknown_6 = from - > unknown_6 ;
}
/*************************************************************
2001-09-26 00:21:21 +04:00
Copies a SAM_ACCOUNT .
2000-10-07 19:56:36 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-09-26 00:21:21 +04:00
2000-11-21 08:55:16 +03:00
void copy_sam_passwd ( SAM_ACCOUNT * to , const SAM_ACCOUNT * from )
2000-10-07 19:56:36 +04:00
{
2001-09-26 00:21:21 +04:00
if ( ! from | | ! to )
return ;
2000-10-07 19:56:36 +04:00
2001-05-04 19:44:27 +04:00
memcpy ( to , from , sizeof ( SAM_ACCOUNT ) ) ;
2000-10-07 19:56:36 +04:00
}
2000-11-14 02:03:34 +03:00
/*************************************************************
2001-09-26 00:21:21 +04:00
Change a password entry in the local smbpasswd file .
1999-12-13 16:27:58 +03:00
2000-11-14 02:03:34 +03:00
FIXME ! ! The function needs to be abstracted into the
passdb interface or something . It is currently being called
2001-09-29 17:14:19 +04:00
by _api_samr_create_user ( ) in rpc_server / srv_samr . c ,
in SWAT and by smbpasswd / pdbedit .
2000-11-14 02:03:34 +03:00
- - jerry
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-12-13 16:27:58 +03:00
2000-11-14 02:03:34 +03:00
BOOL local_password_change ( char * user_name , int local_flags ,
char * new_passwd ,
char * err_str , size_t err_str_len ,
char * msg_str , size_t msg_str_len )
{
struct passwd * pwd = NULL ;
2001-05-04 19:44:27 +04:00
SAM_ACCOUNT * sam_pass = NULL ;
1999-12-13 16:27:58 +03:00
2000-11-14 02:03:34 +03:00
* err_str = ' \0 ' ;
* msg_str = ' \0 ' ;
1999-12-13 16:27:58 +03:00
2000-11-14 02:03:34 +03:00
/* Get the smb passwd entry for this user */
2001-05-04 19:44:27 +04:00
pdb_init_sam ( & sam_pass ) ;
2001-09-26 00:21:21 +04:00
if ( ! pdb_getsampwnam ( sam_pass , user_name ) ) {
2001-09-29 17:14:19 +04:00
pdb_free_sam ( & sam_pass ) ;
2001-05-07 18:04:46 +04:00
2001-09-29 17:14:19 +04:00
if ( local_flags & LOCAL_ADD_USER ) {
/*
* Check for a local account - if we ' re adding only .
*/
if ( ! ( pwd = sys_getpwnam ( user_name ) ) ) {
slprintf ( err_str , err_str_len - 1 , " User %s does not \
exist in system password file ( usually / etc / passwd ) . Cannot add \
account without a valid local system user . \ n " , user_name);
return False ;
}
} else {
2000-11-14 02:03:34 +03:00
slprintf ( err_str , err_str_len - 1 , " Failed to find entry for user %s. \n " , user_name ) ;
return False ;
}
1999-12-13 16:27:58 +03:00
2001-09-28 08:48:36 +04:00
if ( ! pdb_init_sam_pw ( & sam_pass , pwd ) ) {
2001-09-29 17:14:19 +04:00
slprintf ( err_str , err_str_len - 1 , " Failed initialise SAM_ACCOUNT for user %s. \n " , user_name ) ;
2001-09-27 13:13:26 +04:00
return False ;
}
1999-12-13 16:27:58 +03:00
2001-10-03 17:07:02 +04:00
/* set account flags. Note that the default is non-expiring accounts */
if ( ! pdb_set_acct_ctrl ( sam_pass , ( ( local_flags & LOCAL_TRUST_ACCOUNT ) ? ACB_WSTRUST : ACB_NORMAL | ACB_PWNOEXP ) ) ) {
2001-09-29 17:14:19 +04:00
slprintf ( err_str , err_str_len - 1 , " Failed to set 'trust account' flags for user %s. \n " , user_name ) ;
pdb_free_sam ( & sam_pass ) ;
2000-11-14 02:03:34 +03:00
return False ;
}
2001-05-04 19:44:27 +04:00
} else {
2000-11-14 02:03:34 +03:00
/* the entry already existed */
local_flags & = ~ LOCAL_ADD_USER ;
}
1999-12-13 16:27:58 +03:00
/*
2000-11-14 02:03:34 +03:00
* We are root - just write the new password
* and the valid last change time .
1999-12-13 16:27:58 +03:00
*/
2001-09-29 17:14:19 +04:00
if ( local_flags & LOCAL_DISABLE_USER ) {
if ( ! pdb_set_acct_ctrl ( sam_pass , pdb_get_acct_ctrl ( sam_pass ) | ACB_DISABLED ) ) {
slprintf ( err_str , err_str_len - 1 , " Failed to set 'disabled' flag for user %s. \n " , user_name ) ;
pdb_free_sam ( & sam_pass ) ;
return False ;
}
2001-09-26 00:21:21 +04:00
} else if ( local_flags & LOCAL_ENABLE_USER ) {
2001-09-29 17:14:19 +04:00
if ( pdb_get_lanman_passwd ( sam_pass ) = = NULL ) {
if ( ! pdb_set_plaintext_passwd ( sam_pass , new_passwd ) ) {
slprintf ( err_str , err_str_len - 1 , " Failed to set password for user %s. \n " , user_name ) ;
pdb_free_sam ( & sam_pass ) ;
return False ;
}
}
if ( ! pdb_set_acct_ctrl ( sam_pass , pdb_get_acct_ctrl ( sam_pass ) & ( ~ ACB_DISABLED ) ) ) {
slprintf ( err_str , err_str_len - 1 , " Failed to unset 'disabled' flag for user %s. \n " , user_name ) ;
pdb_free_sam ( & sam_pass ) ;
return False ;
}
}
if ( local_flags & LOCAL_SET_NO_PASSWORD ) {
if ( ! pdb_set_acct_ctrl ( sam_pass , pdb_get_acct_ctrl ( sam_pass ) | ACB_PWNOTREQ ) ) {
slprintf ( err_str , err_str_len - 1 , " Failed to set 'no password required' flag for user %s. \n " , user_name ) ;
pdb_free_sam ( & sam_pass ) ;
return False ;
1999-12-13 16:27:58 +03:00
}
2000-11-14 02:03:34 +03:00
/* This is needed to preserve ACB_PWNOTREQ in mod_smbfilepwd_entry */
2001-09-29 17:14:19 +04:00
if ( ! pdb_set_lanman_passwd ( sam_pass , NULL ) ) {
slprintf ( err_str , err_str_len - 1 , " Failed to set NULL lanman password for user %s. \n " , user_name ) ;
pdb_free_sam ( & sam_pass ) ;
return False ;
}
if ( ! pdb_set_nt_passwd ( sam_pass , NULL ) ) {
slprintf ( err_str , err_str_len - 1 , " Failed to set NULL NT password for user %s. \n " , user_name ) ;
pdb_free_sam ( & sam_pass ) ;
return False ;
}
2001-09-26 00:21:21 +04:00
} else {
1999-12-13 16:27:58 +03:00
/*
2000-11-14 02:03:34 +03:00
* If we ' re dealing with setting a completely empty user account
* ie . One with a password of ' XXXX ' , but not set disabled ( like
* an account created from scratch ) then if the old password was
* ' XX ' s then getsmbpwent will have set the ACB_DISABLED flag .
* We remove that as we ' re giving this user their first password
* and the decision hasn ' t really been made to disable them ( ie .
* don ' t create them disabled ) . JRA .
1999-12-13 16:27:58 +03:00
*/
2001-09-29 17:14:19 +04:00
if ( ( pdb_get_lanman_passwd ( sam_pass ) = = NULL ) & & ( pdb_get_acct_ctrl ( sam_pass ) & ACB_DISABLED ) ) {
if ( ! pdb_set_acct_ctrl ( sam_pass , pdb_get_acct_ctrl ( sam_pass ) & ( ~ ACB_DISABLED ) ) ) {
slprintf ( err_str , err_str_len - 1 , " Failed to unset 'disabled' flag for user %s. \n " , user_name ) ;
pdb_free_sam ( & sam_pass ) ;
return False ;
}
}
if ( ! pdb_set_acct_ctrl ( sam_pass , pdb_get_acct_ctrl ( sam_pass ) & ( ~ ACB_PWNOTREQ ) ) ) {
slprintf ( err_str , err_str_len - 1 , " Failed to unset 'no password required' flag for user %s. \n " , user_name ) ;
pdb_free_sam ( & sam_pass ) ;
return False ;
}
if ( ! pdb_set_plaintext_passwd ( sam_pass , new_passwd ) ) {
slprintf ( err_str , err_str_len - 1 , " Failed to set password for user %s. \n " , user_name ) ;
pdb_free_sam ( & sam_pass ) ;
return False ;
}
}
if ( local_flags & LOCAL_ADD_USER ) {
if ( pdb_add_sam_account ( sam_pass ) ) {
slprintf ( msg_str , msg_str_len - 1 , " Added user %s. \n " , user_name ) ;
pdb_free_sam ( & sam_pass ) ;
return True ;
} else {
slprintf ( err_str , err_str_len - 1 , " Failed to add entry for user %s. \n " , user_name ) ;
pdb_free_sam ( & sam_pass ) ;
return False ;
}
} else if ( local_flags & LOCAL_DELETE_USER ) {
2001-05-04 19:44:27 +04:00
if ( ! pdb_delete_sam_account ( user_name ) ) {
2000-11-14 02:03:34 +03:00
slprintf ( err_str , err_str_len - 1 , " Failed to delete entry for user %s. \n " , user_name ) ;
2001-09-29 17:14:19 +04:00
pdb_free_sam ( & sam_pass ) ;
2000-11-14 02:03:34 +03:00
return False ;
}
slprintf ( msg_str , msg_str_len - 1 , " Deleted user %s. \n " , user_name ) ;
2001-09-26 00:21:21 +04:00
} else {
2001-05-04 19:44:27 +04:00
if ( ! pdb_update_sam_account ( sam_pass , True ) ) {
2000-11-14 02:03:34 +03:00
slprintf ( err_str , err_str_len - 1 , " Failed to modify entry for user %s. \n " , user_name ) ;
2001-09-29 17:14:19 +04:00
pdb_free_sam ( & sam_pass ) ;
2000-11-14 02:03:34 +03:00
return False ;
}
if ( local_flags & LOCAL_DISABLE_USER )
slprintf ( msg_str , msg_str_len - 1 , " Disabled user %s. \n " , user_name ) ;
else if ( local_flags & LOCAL_ENABLE_USER )
slprintf ( msg_str , msg_str_len - 1 , " Enabled user %s. \n " , user_name ) ;
else if ( local_flags & LOCAL_SET_NO_PASSWORD )
slprintf ( msg_str , msg_str_len - 1 , " User %s password set to none. \n " , user_name ) ;
1999-03-03 23:48:48 +03:00
}
2000-11-14 02:03:34 +03:00
2001-09-29 17:14:19 +04:00
pdb_free_sam ( & sam_pass ) ;
2000-11-14 02:03:34 +03:00
return True ;
1999-12-13 16:27:58 +03:00
}
1998-05-11 19:56:01 +04:00
2000-11-14 02:03:34 +03:00
/*********************************************************************
2001-09-26 00:21:21 +04:00
Collection of get . . . ( ) functions for SAM_ACCOUNT_INFO .
1999-12-13 16:27:58 +03:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-09-26 00:21:21 +04:00
2000-11-14 02:03:34 +03:00
uint16 pdb_get_acct_ctrl ( SAM_ACCOUNT * sampass )
1999-12-13 16:27:58 +03:00
{
2000-11-14 02:03:34 +03:00
if ( sampass )
return ( sampass - > acct_ctrl ) ;
else
return ( ACB_DISABLED ) ;
1999-12-13 16:27:58 +03:00
}
2000-11-14 02:03:34 +03:00
time_t pdb_get_logon_time ( SAM_ACCOUNT * sampass )
1999-12-13 16:27:58 +03:00
{
2000-11-14 02:03:34 +03:00
if ( sampass )
return ( sampass - > logon_time ) ;
else
2000-11-22 22:51:41 +03:00
return ( 0 ) ;
1999-12-13 16:27:58 +03:00
}
2000-11-14 02:03:34 +03:00
time_t pdb_get_logoff_time ( SAM_ACCOUNT * sampass )
1999-12-13 16:27:58 +03:00
{
2000-11-14 02:03:34 +03:00
if ( sampass )
return ( sampass - > logoff_time ) ;
else
return ( - 1 ) ;
1999-12-13 16:27:58 +03:00
}
2000-11-14 02:03:34 +03:00
time_t pdb_get_kickoff_time ( SAM_ACCOUNT * sampass )
1999-12-13 16:27:58 +03:00
{
2000-11-14 02:03:34 +03:00
if ( sampass )
return ( sampass - > kickoff_time ) ;
else
return ( - 1 ) ;
1999-12-13 16:27:58 +03:00
}
2000-11-14 02:03:34 +03:00
time_t pdb_get_pass_last_set_time ( SAM_ACCOUNT * sampass )
1999-12-13 16:27:58 +03:00
{
2000-11-14 02:03:34 +03:00
if ( sampass )
return ( sampass - > pass_last_set_time ) ;
else
return ( - 1 ) ;
1999-12-13 16:27:58 +03:00
}
2000-11-14 02:03:34 +03:00
time_t pdb_get_pass_can_change_time ( SAM_ACCOUNT * sampass )
1999-12-13 16:27:58 +03:00
{
2000-11-14 02:03:34 +03:00
if ( sampass )
return ( sampass - > pass_can_change_time ) ;
else
return ( - 1 ) ;
1999-12-13 16:27:58 +03:00
}
2000-11-14 02:03:34 +03:00
time_t pdb_get_pass_must_change_time ( SAM_ACCOUNT * sampass )
1999-12-13 16:27:58 +03:00
{
2000-11-14 02:03:34 +03:00
if ( sampass )
return ( sampass - > pass_must_change_time ) ;
else
return ( - 1 ) ;
1999-12-13 16:27:58 +03:00
}
2000-11-14 02:03:34 +03:00
uint16 pdb_get_logon_divs ( SAM_ACCOUNT * sampass )
1999-12-13 16:27:58 +03:00
{
2000-11-14 02:03:34 +03:00
if ( sampass )
return ( sampass - > logon_divs ) ;
else
return ( - 1 ) ;
1999-12-13 16:27:58 +03:00
}
2000-11-14 02:03:34 +03:00
uint32 pdb_get_hours_len ( SAM_ACCOUNT * sampass )
1999-12-13 16:27:58 +03:00
{
2000-11-14 02:03:34 +03:00
if ( sampass )
return ( sampass - > hours_len ) ;
else
return ( - 1 ) ;
}
1998-09-29 21:56:12 +04:00
2000-11-14 02:03:34 +03:00
uint8 * pdb_get_hours ( SAM_ACCOUNT * sampass )
{
if ( sampass )
return ( sampass - > hours ) ;
else
return ( NULL ) ;
}
1999-12-13 16:27:58 +03:00
2001-03-11 03:51:54 +03:00
uint8 * pdb_get_nt_passwd ( SAM_ACCOUNT * sampass )
2000-11-14 02:03:34 +03:00
{
if ( sampass )
return ( sampass - > nt_pw ) ;
else
return ( NULL ) ;
}
1999-12-13 16:27:58 +03:00
2001-03-11 03:51:54 +03:00
uint8 * pdb_get_lanman_passwd ( SAM_ACCOUNT * sampass )
2000-11-14 02:03:34 +03:00
{
if ( sampass )
return ( sampass - > lm_pw ) ;
else
return ( NULL ) ;
}
1999-12-13 16:27:58 +03:00
2000-11-14 02:03:34 +03:00
uint32 pdb_get_user_rid ( SAM_ACCOUNT * sampass )
{
if ( sampass )
return ( sampass - > user_rid ) ;
else
return ( - 1 ) ;
1999-12-13 16:27:58 +03:00
}
2000-11-14 02:03:34 +03:00
uint32 pdb_get_group_rid ( SAM_ACCOUNT * sampass )
{
if ( sampass )
return ( sampass - > group_rid ) ;
else
return ( - 1 ) ;
}
1998-09-29 21:56:12 +04:00
2000-11-14 02:03:34 +03:00
uid_t pdb_get_uid ( SAM_ACCOUNT * sampass )
1999-12-13 16:27:58 +03:00
{
2000-11-14 02:03:34 +03:00
if ( sampass )
return ( sampass - > uid ) ;
else
return ( ( uid_t ) - 1 ) ;
}
1999-12-13 16:27:58 +03:00
2000-11-14 02:03:34 +03:00
gid_t pdb_get_gid ( SAM_ACCOUNT * sampass )
{
if ( sampass )
return ( sampass - > gid ) ;
else
return ( ( gid_t ) - 1 ) ;
}
1999-12-13 16:27:58 +03:00
2000-11-14 02:03:34 +03:00
char * pdb_get_username ( SAM_ACCOUNT * sampass )
{
if ( sampass )
return ( sampass - > username ) ;
else
return ( NULL ) ;
}
1998-06-01 22:50:27 +04:00
2000-11-14 02:03:34 +03:00
char * pdb_get_domain ( SAM_ACCOUNT * sampass )
{
if ( sampass )
return ( sampass - > domain ) ;
1999-12-13 16:27:58 +03:00
else
2000-11-14 02:03:34 +03:00
return ( NULL ) ;
}
1999-12-13 16:27:58 +03:00
2000-11-14 02:03:34 +03:00
char * pdb_get_nt_username ( SAM_ACCOUNT * sampass )
{
if ( sampass )
return ( sampass - > nt_username ) ;
else
return ( NULL ) ;
}
1999-12-13 16:27:58 +03:00
2000-11-14 02:03:34 +03:00
char * pdb_get_fullname ( SAM_ACCOUNT * sampass )
{
if ( sampass )
return ( sampass - > full_name ) ;
else
return ( NULL ) ;
1999-12-13 16:27:58 +03:00
}
2000-11-14 02:03:34 +03:00
char * pdb_get_homedir ( SAM_ACCOUNT * sampass )
{
if ( sampass )
return ( sampass - > home_dir ) ;
else
return ( NULL ) ;
}
2000-04-12 04:37:08 +04:00
2000-11-14 02:03:34 +03:00
char * pdb_get_dirdrive ( SAM_ACCOUNT * sampass )
1999-12-13 16:27:58 +03:00
{
2000-11-14 02:03:34 +03:00
if ( sampass )
return ( sampass - > dir_drive ) ;
else
return ( NULL ) ;
}
2000-04-12 04:37:08 +04:00
2000-11-14 02:03:34 +03:00
char * pdb_get_logon_script ( SAM_ACCOUNT * sampass )
{
if ( sampass )
return ( sampass - > logon_script ) ;
else
return ( NULL ) ;
}
2000-04-12 04:37:08 +04:00
2000-11-14 02:03:34 +03:00
char * pdb_get_profile_path ( SAM_ACCOUNT * sampass )
{
if ( sampass )
return ( sampass - > profile_path ) ;
else
return ( NULL ) ;
}
2000-04-12 04:37:08 +04:00
2000-11-14 02:03:34 +03:00
char * pdb_get_acct_desc ( SAM_ACCOUNT * sampass )
{
if ( sampass )
return ( sampass - > acct_desc ) ;
else
return ( NULL ) ;
}
2000-04-12 04:37:08 +04:00
2000-11-14 02:03:34 +03:00
char * pdb_get_workstations ( SAM_ACCOUNT * sampass )
{
if ( sampass )
return ( sampass - > workstations ) ;
else
return ( NULL ) ;
}
2000-04-12 04:37:08 +04:00
2000-11-14 02:03:34 +03:00
char * pdb_get_munged_dial ( SAM_ACCOUNT * sampass )
{
if ( sampass )
return ( sampass - > munged_dial ) ;
else
return ( NULL ) ;
2000-04-12 04:37:08 +04:00
}
2000-11-14 02:03:34 +03:00
uint32 pdb_get_unknown3 ( SAM_ACCOUNT * sampass )
{
if ( sampass )
return ( sampass - > unknown_3 ) ;
else
return ( - 1 ) ;
}
2000-04-12 04:37:08 +04:00
2000-11-14 02:03:34 +03:00
uint32 pdb_get_unknown5 ( SAM_ACCOUNT * sampass )
2000-04-12 04:37:08 +04:00
{
2000-11-14 02:03:34 +03:00
if ( sampass )
return ( sampass - > unknown_5 ) ;
else
return ( - 1 ) ;
}
1999-12-13 16:27:58 +03:00
2000-11-14 02:03:34 +03:00
uint32 pdb_get_unknown6 ( SAM_ACCOUNT * sampass )
{
if ( sampass )
return ( sampass - > unknown_6 ) ;
else
return ( - 1 ) ;
}
2000-04-12 02:47:24 +04:00
2000-11-14 02:03:34 +03:00
/*********************************************************************
2001-09-26 00:21:21 +04:00
Collection of set . . . ( ) functions for SAM_ACCOUNT_INFO .
2000-11-14 02:03:34 +03:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-09-26 00:21:21 +04:00
2000-11-14 02:03:34 +03:00
BOOL pdb_set_acct_ctrl ( SAM_ACCOUNT * sampass , uint16 flags )
{
2000-11-21 08:55:16 +03:00
if ( ! sampass )
return False ;
2001-09-26 00:21:21 +04:00
if ( sampass ) {
2000-11-14 02:03:34 +03:00
sampass - > acct_ctrl = flags ;
return True ;
1999-12-13 16:27:58 +03:00
}
2000-11-14 02:03:34 +03:00
return False ;
}
1999-12-13 16:27:58 +03:00
2000-11-14 18:50:30 +03:00
BOOL pdb_set_logon_time ( SAM_ACCOUNT * sampass , time_t mytime )
2000-11-14 02:03:34 +03:00
{
2000-11-21 08:55:16 +03:00
if ( ! sampass )
return False ;
sampass - > logon_time = mytime ;
return True ;
2000-11-14 02:03:34 +03:00
}
1999-12-13 16:27:58 +03:00
2000-11-14 18:50:30 +03:00
BOOL pdb_set_logoff_time ( SAM_ACCOUNT * sampass , time_t mytime )
2000-11-14 02:03:34 +03:00
{
2000-11-21 08:55:16 +03:00
if ( ! sampass )
return False ;
sampass - > logoff_time = mytime ;
return True ;
2000-11-14 02:03:34 +03:00
}
2000-04-12 04:37:08 +04:00
2000-11-14 18:50:30 +03:00
BOOL pdb_set_kickoff_time ( SAM_ACCOUNT * sampass , time_t mytime )
2000-11-14 02:03:34 +03:00
{
2000-11-21 08:55:16 +03:00
if ( ! sampass )
return False ;
sampass - > kickoff_time = mytime ;
return True ;
2000-11-14 02:03:34 +03:00
}
2000-04-12 04:37:08 +04:00
2000-11-14 18:50:30 +03:00
BOOL pdb_set_pass_can_change_time ( SAM_ACCOUNT * sampass , time_t mytime )
2000-11-14 02:03:34 +03:00
{
2000-11-21 08:55:16 +03:00
if ( ! sampass )
return False ;
sampass - > pass_can_change_time = mytime ;
return True ;
2000-11-14 02:03:34 +03:00
}
1999-12-13 16:27:58 +03:00
2000-11-14 18:50:30 +03:00
BOOL pdb_set_pass_must_change_time ( SAM_ACCOUNT * sampass , time_t mytime )
1999-12-13 16:27:58 +03:00
{
2000-11-21 08:55:16 +03:00
if ( ! sampass )
return False ;
sampass - > pass_must_change_time = mytime ;
return True ;
1999-12-13 16:27:58 +03:00
}
2000-11-14 18:50:30 +03:00
BOOL pdb_set_pass_last_set_time ( SAM_ACCOUNT * sampass , time_t mytime )
1999-12-13 16:27:58 +03:00
{
2000-11-21 08:55:16 +03:00
if ( ! sampass )
return False ;
sampass - > pass_last_set_time = mytime ;
return True ;
1999-12-13 16:27:58 +03:00
}
2000-11-14 02:03:34 +03:00
BOOL pdb_set_hours_len ( SAM_ACCOUNT * sampass , uint32 len )
1999-12-13 16:27:58 +03:00
{
2000-11-21 08:55:16 +03:00
if ( ! sampass )
return False ;
sampass - > hours_len = len ;
return True ;
1999-12-13 16:27:58 +03:00
}
2000-11-14 02:03:34 +03:00
BOOL pdb_set_logons_divs ( SAM_ACCOUNT * sampass , uint16 hours )
1999-12-13 16:27:58 +03:00
{
2000-11-21 08:55:16 +03:00
if ( ! sampass )
return False ;
sampass - > logon_divs = hours ;
return True ;
1999-12-13 16:27:58 +03:00
}
2000-11-14 02:03:34 +03:00
BOOL pdb_set_uid ( SAM_ACCOUNT * sampass , uid_t uid )
1999-12-13 16:27:58 +03:00
{
2000-11-21 08:55:16 +03:00
if ( ! sampass )
return False ;
sampass - > uid = uid ;
return True ;
1999-12-13 16:27:58 +03:00
}
2000-11-14 02:03:34 +03:00
BOOL pdb_set_gid ( SAM_ACCOUNT * sampass , gid_t gid )
1999-12-13 16:27:58 +03:00
{
2000-11-21 08:55:16 +03:00
if ( ! sampass )
return False ;
sampass - > gid = gid ;
return True ;
1999-12-13 16:27:58 +03:00
}
2000-11-14 02:03:34 +03:00
BOOL pdb_set_user_rid ( SAM_ACCOUNT * sampass , uint32 rid )
1999-12-13 16:27:58 +03:00
{
2000-11-21 08:55:16 +03:00
if ( ! sampass )
return False ;
sampass - > user_rid = rid ;
return True ;
1999-12-13 16:27:58 +03:00
}
2000-11-14 02:03:34 +03:00
BOOL pdb_set_group_rid ( SAM_ACCOUNT * sampass , uint32 grid )
1999-12-13 16:27:58 +03:00
{
2000-11-21 08:55:16 +03:00
if ( ! sampass )
return False ;
sampass - > group_rid = grid ;
return True ;
2000-11-14 02:03:34 +03:00
}
1999-12-13 16:27:58 +03:00
2001-05-04 19:44:27 +04:00
/*********************************************************************
2001-09-26 00:21:21 +04:00
Set the user ' s UNIX name .
2001-05-04 19:44:27 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-09-26 00:21:21 +04:00
2001-05-04 19:44:27 +04:00
BOOL pdb_set_username ( SAM_ACCOUNT * sampass , char * username )
{
2001-09-26 00:21:21 +04:00
if ( ! sampass )
return False ;
* sampass - > username = ' \0 ' ;
if ( ! username )
2001-04-26 02:12:13 +04:00
return False ;
2001-05-04 19:44:27 +04:00
StrnCpy ( sampass - > username , username , strlen ( username ) ) ;
2000-11-21 08:55:16 +03:00
return True ;
1998-11-29 23:03:33 +03:00
}
2000-06-08 21:50:19 +04:00
2001-05-04 19:44:27 +04:00
/*********************************************************************
2001-09-26 00:21:21 +04:00
Set the domain name .
2001-05-04 19:44:27 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-09-26 00:21:21 +04:00
2001-05-04 19:44:27 +04:00
BOOL pdb_set_domain ( SAM_ACCOUNT * sampass , char * domain )
{
2001-09-26 00:21:21 +04:00
if ( ! sampass )
return False ;
* sampass - > domain = ' \0 ' ;
if ( ! domain )
2001-04-26 02:12:13 +04:00
return False ;
2001-05-04 19:44:27 +04:00
StrnCpy ( sampass - > domain , domain , strlen ( domain ) ) ;
2001-04-26 02:12:13 +04:00
2000-11-21 08:55:16 +03:00
return True ;
2000-08-02 06:11:55 +04:00
}
2000-06-08 21:50:19 +04:00
2001-05-04 19:44:27 +04:00
/*********************************************************************
2001-09-26 00:21:21 +04:00
Set the user ' s NT name .
2001-05-04 19:44:27 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-09-26 00:21:21 +04:00
2001-05-04 19:44:27 +04:00
BOOL pdb_set_nt_username ( SAM_ACCOUNT * sampass , char * nt_username )
2000-08-23 04:45:40 +04:00
{
2001-09-26 00:21:21 +04:00
if ( ! sampass )
return False ;
* sampass - > nt_username = ' \0 ' ;
if ( ! nt_username )
2001-04-26 02:12:13 +04:00
return False ;
2001-05-04 19:44:27 +04:00
StrnCpy ( sampass - > nt_username , nt_username , strlen ( nt_username ) ) ;
2000-11-21 08:55:16 +03:00
return True ;
2000-11-14 02:03:34 +03:00
}
2000-08-23 04:45:40 +04:00
2001-05-04 19:44:27 +04:00
/*********************************************************************
2001-09-26 00:21:21 +04:00
Set the user ' s full name .
2001-05-04 19:44:27 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-09-26 00:21:21 +04:00
2001-05-04 19:44:27 +04:00
BOOL pdb_set_fullname ( SAM_ACCOUNT * sampass , char * fullname )
2000-11-14 02:03:34 +03:00
{
2001-09-26 00:21:21 +04:00
if ( ! sampass )
return False ;
* sampass - > full_name = ' \0 ' ;
if ( ! fullname )
2001-04-26 02:12:13 +04:00
return False ;
2001-05-04 19:44:27 +04:00
StrnCpy ( sampass - > full_name , fullname , strlen ( fullname ) ) ;
2001-04-26 02:12:13 +04:00
2000-11-21 08:55:16 +03:00
return True ;
2000-11-14 02:03:34 +03:00
}
2000-08-23 04:45:40 +04:00
2001-05-04 19:44:27 +04:00
/*********************************************************************
2001-09-26 00:21:21 +04:00
Set the user ' s logon script .
2001-05-04 19:44:27 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-09-26 00:21:21 +04:00
2001-05-04 19:44:27 +04:00
BOOL pdb_set_logon_script ( SAM_ACCOUNT * sampass , char * logon_script )
2000-11-14 02:03:34 +03:00
{
2001-09-26 00:21:21 +04:00
if ( ! sampass )
return False ;
* sampass - > logon_script = ' \0 ' ;
if ( ! logon_script )
2001-04-26 02:12:13 +04:00
return False ;
2001-05-04 19:44:27 +04:00
StrnCpy ( sampass - > logon_script , logon_script , strlen ( logon_script ) ) ;
2001-04-26 02:12:13 +04:00
2000-11-21 08:55:16 +03:00
return True ;
2000-11-14 02:03:34 +03:00
}
2000-08-23 04:45:40 +04:00
2001-05-04 19:44:27 +04:00
/*********************************************************************
2001-09-26 00:21:21 +04:00
Set the user ' s profile path .
2001-05-04 19:44:27 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-09-26 00:21:21 +04:00
2000-11-14 02:03:34 +03:00
BOOL pdb_set_profile_path ( SAM_ACCOUNT * sampass , char * profile_path )
{
2001-09-26 00:21:21 +04:00
if ( ! sampass )
return False ;
* sampass - > profile_path = ' \0 ' ;
if ( ! profile_path )
2001-04-26 02:12:13 +04:00
return False ;
2001-05-04 19:44:27 +04:00
StrnCpy ( sampass - > profile_path , profile_path , strlen ( profile_path ) ) ;
2001-04-26 02:12:13 +04:00
2000-11-21 08:55:16 +03:00
return True ;
2000-11-14 02:03:34 +03:00
}
2000-08-23 04:45:40 +04:00
2001-05-04 19:44:27 +04:00
/*********************************************************************
2001-09-26 00:21:21 +04:00
Set the user ' s directory drive .
2001-05-04 19:44:27 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-09-26 00:21:21 +04:00
2000-11-14 02:03:34 +03:00
BOOL pdb_set_dir_drive ( SAM_ACCOUNT * sampass , char * dir_drive )
{
2001-09-26 00:21:21 +04:00
if ( ! sampass )
return False ;
* sampass - > dir_drive = ' \0 ' ;
if ( ! dir_drive )
2001-04-26 02:12:13 +04:00
return False ;
2001-05-04 19:44:27 +04:00
StrnCpy ( sampass - > dir_drive , dir_drive , strlen ( dir_drive ) ) ;
2001-04-26 02:12:13 +04:00
2000-11-21 08:55:16 +03:00
return True ;
2000-11-14 02:03:34 +03:00
}
2000-08-23 04:45:40 +04:00
2001-05-04 19:44:27 +04:00
/*********************************************************************
2001-09-26 00:21:21 +04:00
Set the user ' s home directory .
2001-05-04 19:44:27 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-09-26 00:21:21 +04:00
2000-11-14 02:03:34 +03:00
BOOL pdb_set_homedir ( SAM_ACCOUNT * sampass , char * homedir )
{
2001-09-26 00:21:21 +04:00
if ( ! sampass )
return False ;
* sampass - > home_dir = ' \0 ' ;
if ( ! homedir )
2001-04-26 02:12:13 +04:00
return False ;
2001-05-04 19:44:27 +04:00
StrnCpy ( sampass - > home_dir , homedir , strlen ( homedir ) ) ;
2001-04-26 02:12:13 +04:00
2000-11-21 08:55:16 +03:00
return True ;
2000-08-23 04:45:40 +04:00
}
2001-05-04 19:44:27 +04:00
/*********************************************************************
2001-09-26 00:21:21 +04:00
Set the user ' s account description .
2001-05-04 19:44:27 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-09-26 00:21:21 +04:00
2000-11-21 08:55:16 +03:00
BOOL pdb_set_acct_desc ( SAM_ACCOUNT * sampass , char * acct_desc )
{
2001-09-26 00:21:21 +04:00
if ( ! sampass )
return False ;
* sampass - > acct_desc = ' \0 ' ;
if ( ! acct_desc )
2001-04-26 02:12:13 +04:00
return False ;
2001-05-04 19:44:27 +04:00
StrnCpy ( sampass - > acct_desc , acct_desc , strlen ( acct_desc ) ) ;
2000-11-21 08:55:16 +03:00
return True ;
}
2001-04-26 02:12:13 +04:00
2001-05-04 19:44:27 +04:00
/*********************************************************************
2001-09-26 00:21:21 +04:00
Set the user ' s workstation allowed list .
2001-05-04 19:44:27 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-09-26 00:21:21 +04:00
2000-11-21 08:55:16 +03:00
BOOL pdb_set_workstations ( SAM_ACCOUNT * sampass , char * workstations )
{
2001-09-26 00:21:21 +04:00
if ( ! sampass )
return False ;
* sampass - > workstations = ' \0 ' ;
if ( ! workstations )
return False ;
2000-11-21 08:55:16 +03:00
2001-05-04 19:44:27 +04:00
StrnCpy ( sampass - > workstations , workstations , strlen ( workstations ) ) ;
2001-04-26 02:12:13 +04:00
2000-11-21 08:55:16 +03:00
return True ;
}
2001-05-04 19:44:27 +04:00
/*********************************************************************
2001-09-26 00:21:21 +04:00
Set the user ' s dial string .
2001-05-04 19:44:27 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-09-26 00:21:21 +04:00
2000-11-21 08:55:16 +03:00
BOOL pdb_set_munged_dial ( SAM_ACCOUNT * sampass , char * munged_dial )
2000-08-02 06:11:55 +04:00
{
2001-09-26 00:21:21 +04:00
if ( ! sampass )
return False ;
* sampass - > munged_dial = ' \0 ' ;
if ( ! munged_dial )
return False ;
2000-11-21 08:55:16 +03:00
2001-05-04 19:44:27 +04:00
StrnCpy ( sampass - > munged_dial , munged_dial , strlen ( munged_dial ) ) ;
2000-11-21 08:55:16 +03:00
return True ;
}
2000-06-08 21:50:19 +04:00
2001-05-04 19:44:27 +04:00
/*********************************************************************
2001-09-26 00:21:21 +04:00
Set the user ' s NT hash .
2001-05-04 19:44:27 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-09-26 00:21:21 +04:00
2001-03-11 03:51:54 +03:00
BOOL pdb_set_nt_passwd ( SAM_ACCOUNT * sampass , uint8 * pwd )
2000-11-21 08:55:16 +03:00
{
2001-09-29 17:14:19 +04:00
if ( ! sampass )
2001-09-26 00:21:21 +04:00
return False ;
2001-04-26 02:12:13 +04:00
2001-09-29 17:14:19 +04:00
if ( ! pwd ) {
/* Allow setting to NULL */
SAFE_FREE ( sampass - > nt_pw ) ;
return True ;
}
2001-05-04 19:44:27 +04:00
if ( sampass - > nt_pw ! = NULL )
2001-09-26 00:21:21 +04:00
DEBUG ( 4 , ( " pdb_set_nt_passwd: NT hash non NULL overwritting ? \n " ) ) ;
2001-05-04 19:44:27 +04:00
else
sampass - > nt_pw = ( unsigned char * ) malloc ( sizeof ( unsigned char ) * 16 ) ;
2001-04-26 02:12:13 +04:00
2001-05-04 19:44:27 +04:00
if ( sampass - > nt_pw = = NULL )
return False ;
2001-04-26 02:12:13 +04:00
memcpy ( sampass - > nt_pw , pwd , 16 ) ;
2000-06-08 21:50:19 +04:00
2000-11-21 08:55:16 +03:00
return True ;
2000-06-09 22:45:31 +04:00
}
2000-08-23 04:45:40 +04:00
2001-05-04 19:44:27 +04:00
/*********************************************************************
2001-09-26 00:21:21 +04:00
Set the user ' s LM hash .
2001-05-04 19:44:27 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-09-26 00:21:21 +04:00
2001-03-11 03:51:54 +03:00
BOOL pdb_set_lanman_passwd ( SAM_ACCOUNT * sampass , uint8 * pwd )
2000-08-23 04:45:40 +04:00
{
2001-09-29 17:14:19 +04:00
if ( ! sampass )
2001-09-26 00:21:21 +04:00
return False ;
2001-04-26 02:12:13 +04:00
2001-09-29 17:14:19 +04:00
if ( ! pwd ) {
/* Allow setting to NULL */
SAFE_FREE ( sampass - > lm_pw ) ;
return True ;
}
2001-05-04 19:44:27 +04:00
if ( sampass - > lm_pw ! = NULL )
2001-09-26 00:21:21 +04:00
DEBUG ( 4 , ( " pdb_set_lanman_passwd: LM hash non NULL overwritting ? \n " ) ) ;
2001-05-04 19:44:27 +04:00
else
sampass - > lm_pw = ( unsigned char * ) malloc ( sizeof ( unsigned char ) * 16 ) ;
2001-04-26 02:12:13 +04:00
2001-05-04 19:44:27 +04:00
if ( sampass - > lm_pw = = NULL )
return False ;
2001-04-26 02:12:13 +04:00
memcpy ( sampass - > lm_pw , pwd , 16 ) ;
2000-08-23 04:45:40 +04:00
2000-11-21 08:55:16 +03:00
return True ;
2000-11-14 02:03:34 +03:00
}
2001-05-04 18:01:33 +04:00
BOOL pdb_set_unknown_3 ( SAM_ACCOUNT * sampass , uint32 unkn )
{
if ( ! sampass )
return False ;
sampass - > unknown_3 = unkn ;
return True ;
}
BOOL pdb_set_unknown_5 ( SAM_ACCOUNT * sampass , uint32 unkn )
{
if ( ! sampass )
return False ;
sampass - > unknown_5 = unkn ;
return True ;
}
BOOL pdb_set_unknown_6 ( SAM_ACCOUNT * sampass , uint32 unkn )
{
if ( ! sampass )
return False ;
sampass - > unknown_6 = unkn ;
return True ;
}
BOOL pdb_set_hours ( SAM_ACCOUNT * sampass , uint8 * hours )
{
2001-09-26 00:21:21 +04:00
if ( ! sampass )
return False ;
2001-05-04 18:01:33 +04:00
2001-09-26 00:21:21 +04:00
if ( ! hours ) {
2001-05-04 18:01:33 +04:00
memset ( ( char * ) sampass - > hours , 0 , MAX_HOURS_LEN ) ;
return True ;
}
memcpy ( sampass - > hours , hours , MAX_HOURS_LEN ) ;
return True ;
}
2001-10-29 10:15:51 +03:00
/* Helpful interfaces to the above */
/*********************************************************************
Sets the last changed times and must change times for a normal
password change .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
BOOL pdb_set_pass_changed_now ( SAM_ACCOUNT * sampass )
{
if ( ! sampass )
return False ;
if ( ! pdb_set_pass_last_set_time ( sampass , time ( NULL ) ) )
return False ;
if ( ! pdb_set_pass_must_change_time ( sampass ,
pdb_get_pass_last_set_time ( sampass )
+ MAX_PASSWORD_AGE ) )
return False ;
return True ;
}
/*********************************************************************
Set the user ' s PLAINTEXT password . Used as an interface to the above .
Also sets the last change time to NOW .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
BOOL pdb_set_plaintext_passwd ( SAM_ACCOUNT * sampass , const char * plaintext )
{
uchar new_lanman_p16 [ 16 ] ;
uchar new_nt_p16 [ 16 ] ;
if ( ! sampass | | ! plaintext )
return False ;
nt_lm_owf_gen ( plaintext , new_nt_p16 , new_lanman_p16 ) ;
if ( ! pdb_set_nt_passwd ( sampass , new_nt_p16 ) )
return False ;
if ( ! pdb_set_lanman_passwd ( sampass , new_lanman_p16 ) )
return False ;
if ( ! pdb_set_pass_changed_now ( sampass ) )
return False ;
return True ;
}