2001-09-27 13:36:38 +04:00
/*
Unix SMB / Netbios implementation .
passdb editing frontend
Version 3.0
Copyright ( C ) Simo Sorce 2000
Copyright ( C ) Andrew Bartlett 2001
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 .
*/
2000-12-06 21:18:48 +03:00
/* base uid for trust accounts is set to 60000 !
* May be we should add the defines in smb . h to make it possible having
* different values on different platforms ?
*/
# define BASE_MACHINE_UID 60000
2001-08-28 10:02:51 +04:00
# define MAX_MACHINE_UID 65500 /* 5500 trust accounts aren't enough? */
2000-12-06 21:18:48 +03:00
# include "includes.h"
extern pstring global_myname ;
/*
* Next two lines needed for SunOS and don ' t
* hurt anything else . . .
*/
extern char * optarg ;
extern int optind ;
/*********************************************************
Print command usage on stderr and die .
2001-12-31 03:06:51 +03:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2000-12-06 21:18:48 +03:00
static void usage ( void )
{
if ( getuid ( ) = = 0 ) {
2001-11-25 21:54:04 +03:00
printf ( " pdbedit options \n " ) ;
2000-12-06 21:18:48 +03:00
} else {
printf ( " You need to be root to use this tool! \n " ) ;
}
printf ( " (actually to add a user you need to use smbpasswd) \n " ) ;
printf ( " options: \n " ) ;
printf ( " -l list usernames \n " ) ;
2001-03-14 23:17:27 +03:00
printf ( " -v verbose output \n " ) ;
printf ( " -w smbpasswd file style \n " ) ;
2000-12-06 21:18:48 +03:00
printf ( " -u username print user's info \n " ) ;
printf ( " -f fullname set Full Name \n " ) ;
printf ( " -h homedir set home directory \n " ) ;
printf ( " -d drive set home dir drive \n " ) ;
printf ( " -s script set logon script \n " ) ;
printf ( " -p profile set profile path \n " ) ;
printf ( " -a create new account \n " ) ;
printf ( " -m it is a machine trust \n " ) ;
printf ( " -x delete this user \n " ) ;
printf ( " -i file import account from file (smbpasswd style) \n " ) ;
exit ( 1 ) ;
}
2001-09-28 01:20:14 +04:00
2000-12-06 21:18:48 +03:00
/*********************************************************
Print info from sam structure
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-09-28 01:20:14 +04:00
2000-12-06 21:18:48 +03:00
static int print_sam_info ( SAM_ACCOUNT * sam_pwent , BOOL verbosity , BOOL smbpwdstyle )
{
/* TODO: chaeck if entry is a user or a workstation */
if ( ! sam_pwent ) return - 1 ;
2001-09-28 01:20:14 +04:00
if ( verbosity ) {
2001-12-31 03:06:51 +03:00
printf ( " username: %s \n " , sam_pwent - > username ) ;
printf ( " user ID/Group: %d/%d \n " , sam_pwent - > uid ,
sam_pwent - > gid ) ;
printf ( " user RID/GRID: %d/%d \n " , sam_pwent - > user_rid ,
sam_pwent - > group_rid ) ;
printf ( " Full Name: %s \n " , sam_pwent - > full_name ) ;
printf ( " Home Directory: %s \n " , sam_pwent - > home_dir ) ;
printf ( " HomeDir Drive: %s \n " , sam_pwent - > dir_drive ) ;
printf ( " Logon Script: %s \n " , sam_pwent - > logon_script ) ;
printf ( " Profile Path: %s \n " , sam_pwent - > profile_path ) ;
2001-09-28 01:20:14 +04:00
} else if ( smbpwdstyle ) {
2001-11-04 04:09:04 +03:00
char lm_passwd [ 33 ] ;
char nt_passwd [ 33 ] ;
pdb_sethexpwd ( lm_passwd ,
pdb_get_lanman_passwd ( sam_pwent ) ,
pdb_get_acct_ctrl ( sam_pwent ) ) ;
pdb_sethexpwd ( nt_passwd ,
pdb_get_nt_passwd ( sam_pwent ) ,
pdb_get_acct_ctrl ( sam_pwent ) ) ;
printf ( " %s:%d:%s:%s:%s:LCT-%08X: \n " ,
pdb_get_username ( sam_pwent ) ,
2001-12-31 03:06:51 +03:00
pdb_get_uid ( sam_pwent ) ,
2001-11-04 04:09:04 +03:00
lm_passwd ,
nt_passwd ,
pdb_encode_acct_ctrl ( pdb_get_acct_ctrl ( sam_pwent ) , NEW_PW_FORMAT_SPACE_PADDED_LEN ) ,
( uint32 ) pdb_get_pass_last_set_time ( sam_pwent ) ) ;
} else {
2001-12-31 03:06:51 +03:00
printf ( " %s:%d:%s \n " , sam_pwent - > username , sam_pwent - > uid , sam_pwent - > full_name ) ;
2001-11-04 04:09:04 +03:00
}
2000-12-06 21:18:48 +03:00
return 0 ;
}
/*********************************************************
Get an Print User Info
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-09-28 01:20:14 +04:00
2000-12-06 21:18:48 +03:00
static int print_user_info ( char * username , BOOL verbosity , BOOL smbpwdstyle )
{
2001-05-04 19:44:27 +04:00
SAM_ACCOUNT * sam_pwent = NULL ;
BOOL ret ;
pdb_init_sam ( & sam_pwent ) ;
2000-12-06 21:18:48 +03:00
2001-05-04 19:44:27 +04:00
ret = pdb_getsampwnam ( sam_pwent , username ) ;
if ( ret = = False ) {
fprintf ( stderr , " Username not found! \n " ) ;
2001-09-29 17:08:26 +04:00
pdb_free_sam ( & sam_pwent ) ;
2001-05-04 19:44:27 +04:00
return - 1 ;
}
ret = print_sam_info ( sam_pwent , verbosity , smbpwdstyle ) ;
2001-09-29 17:08:26 +04:00
pdb_free_sam ( & sam_pwent ) ;
2001-05-04 19:44:27 +04:00
return ret ;
2000-12-06 21:18:48 +03:00
}
/*********************************************************
List Users
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static int print_users_list ( BOOL verbosity , BOOL smbpwdstyle )
{
2001-05-04 19:44:27 +04:00
SAM_ACCOUNT * sam_pwent = NULL ;
2000-12-06 21:18:48 +03:00
BOOL ret ;
2001-05-04 19:44:27 +04:00
pdb_init_sam ( & sam_pwent ) ;
2001-12-31 03:06:51 +03:00
2000-12-06 21:18:48 +03:00
ret = pdb_setsampwent ( False ) ;
if ( ret & & errno = = ENOENT ) {
fprintf ( stderr , " Password database not found! \n " ) ;
2001-09-29 17:08:26 +04:00
pdb_free_sam ( & sam_pwent ) ;
2000-12-06 21:18:48 +03:00
exit ( 1 ) ;
}
2001-09-28 01:20:14 +04:00
while ( ( ret = pdb_getsampwent ( sam_pwent ) ) ) {
if ( verbosity )
printf ( " --------------- \n " ) ;
2000-12-06 21:18:48 +03:00
print_sam_info ( sam_pwent , verbosity , smbpwdstyle ) ;
2001-05-07 18:04:46 +04:00
pdb_reset_sam ( sam_pwent ) ;
2000-12-06 21:18:48 +03:00
}
pdb_endsampwent ( ) ;
2001-09-29 17:08:26 +04:00
pdb_free_sam ( & sam_pwent ) ;
2000-12-06 21:18:48 +03:00
return 0 ;
}
/*********************************************************
Set User Info
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-09-28 01:20:14 +04:00
2000-12-06 21:18:48 +03:00
static int set_user_info ( char * username , char * fullname , char * homedir , char * drive , char * script , char * profile )
{
2001-05-04 19:44:27 +04:00
SAM_ACCOUNT * sam_pwent = NULL ;
BOOL ret ;
pdb_init_sam ( & sam_pwent ) ;
2000-12-06 21:18:48 +03:00
2001-05-04 19:44:27 +04:00
ret = pdb_getsampwnam ( sam_pwent , username ) ;
2001-09-28 01:20:14 +04:00
if ( ret = = False ) {
2000-12-06 21:18:48 +03:00
fprintf ( stderr , " Username not found! \n " ) ;
2001-09-29 17:08:26 +04:00
pdb_free_sam ( & sam_pwent ) ;
2000-12-06 21:18:48 +03:00
return - 1 ;
}
2001-09-28 01:20:14 +04:00
if ( fullname )
pdb_set_fullname ( sam_pwent , fullname ) ;
if ( homedir )
2001-12-31 03:06:51 +03:00
pdb_set_homedir ( sam_pwent , homedir , True ) ;
2001-09-28 01:20:14 +04:00
if ( drive )
2001-12-31 03:06:51 +03:00
pdb_set_dir_drive ( sam_pwent , drive , True ) ;
2001-09-28 01:20:14 +04:00
if ( script )
2001-12-31 03:06:51 +03:00
pdb_set_logon_script ( sam_pwent , script , True ) ;
2001-09-28 01:20:14 +04:00
if ( profile )
2001-12-31 03:06:51 +03:00
pdb_set_profile_path ( sam_pwent , profile , True ) ;
2001-09-28 01:20:14 +04:00
if ( pdb_update_sam_account ( sam_pwent , True ) )
print_user_info ( username , True , False ) ;
else {
2000-12-06 21:18:48 +03:00
fprintf ( stderr , " Unable to modify entry! \n " ) ;
2001-09-29 17:08:26 +04:00
pdb_free_sam ( & sam_pwent ) ;
2000-12-06 21:18:48 +03:00
return - 1 ;
}
2001-09-29 17:08:26 +04:00
pdb_free_sam ( & sam_pwent ) ;
2000-12-06 21:18:48 +03:00
return 0 ;
}
2001-12-31 03:06:51 +03:00
/*********************************************************
A strdup with exit
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static char * strdup_x ( const char * s )
{
char * new_s = strdup ( s ) ;
if ( ! new_s ) {
fprintf ( stderr , " out of memory \n " ) ;
exit ( 1 ) ;
}
return new_s ;
}
/*************************************************************
Utility function to prompt for passwords from stdin . Each
password entered must end with a newline .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static char * stdin_new_passwd ( void )
{
static fstring new_passwd ;
size_t len ;
ZERO_ARRAY ( new_passwd ) ;
/*
* if no error is reported from fgets ( ) and string at least contains
* the newline that ends the password , then replace the newline with
* a null terminator .
*/
if ( fgets ( new_passwd , sizeof ( new_passwd ) , stdin ) ! = NULL ) {
if ( ( len = strlen ( new_passwd ) ) > 0 ) {
if ( new_passwd [ len - 1 ] = = ' \n ' )
new_passwd [ len - 1 ] = 0 ;
}
}
return ( new_passwd ) ;
}
/*************************************************************
Utility function to get passwords via tty or stdin
Used if the ' - s ' option is set to silently get passwords
to enable scripting .
_copied_ from smbpasswd
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static char * get_pass ( char * prompt , BOOL stdin_get )
{
char * p ;
if ( stdin_get ) {
p = stdin_new_passwd ( ) ;
} else {
p = getpass ( prompt ) ;
}
return strdup_x ( p ) ;
}
/*************************************************************
Utility function to prompt for new password .
_copied_ from smbpasswd
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static char * prompt_for_new_password ( BOOL stdin_get )
{
char * p ;
fstring new_passwd ;
ZERO_ARRAY ( new_passwd ) ;
p = get_pass ( " New SMB password: " , stdin_get ) ;
fstrcpy ( new_passwd , p ) ;
safe_free ( p ) ;
p = get_pass ( " Retype new SMB password: " , stdin_get ) ;
if ( strcmp ( p , new_passwd ) ) {
fprintf ( stderr , " Mismatch - password unchanged. \n " ) ;
ZERO_ARRAY ( new_passwd ) ;
safe_free ( p ) ;
return NULL ;
}
return p ;
}
2000-12-06 21:18:48 +03:00
/*********************************************************
Add New User
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static int new_user ( char * username , char * fullname , char * homedir , char * drive , char * script , char * profile )
{
2001-09-26 15:28:26 +04:00
SAM_ACCOUNT * sam_pwent = NULL ;
2000-12-06 21:18:48 +03:00
struct passwd * pwd = NULL ;
2001-12-31 03:06:51 +03:00
char * password ;
2000-12-06 21:18:48 +03:00
2001-03-23 05:14:08 +03:00
ZERO_STRUCT ( sam_pwent ) ;
2001-12-31 03:06:51 +03:00
pdb_init_sam ( & sam_pwent ) ;
2001-09-28 01:20:14 +04:00
if ( ! ( pwd = sys_getpwnam ( username ) ) ) {
2000-12-06 21:18:48 +03:00
fprintf ( stderr , " User %s does not exist in system passwd! \n " , username ) ;
2001-12-31 03:06:51 +03:00
pdb_free_sam ( & sam_pwent ) ;
2000-12-06 21:18:48 +03:00
return - 1 ;
}
2001-12-31 03:06:51 +03:00
password = prompt_for_new_password ( 0 ) ;
if ( ! password ) {
fprintf ( stderr , " Passwords do not match! \n " ) ;
pdb_free_sam ( & sam_pwent ) ;
2000-12-06 21:18:48 +03:00
return - 1 ;
}
2001-09-26 15:28:26 +04:00
2001-12-31 03:06:51 +03:00
pdb_set_plaintext_passwd ( sam_pwent , password ) ;
2001-09-26 15:28:26 +04:00
pdb_set_username ( sam_pwent , username ) ;
2001-09-28 01:20:14 +04:00
if ( fullname )
pdb_set_fullname ( sam_pwent , fullname ) ;
if ( homedir )
2001-12-31 03:06:51 +03:00
pdb_set_homedir ( sam_pwent , homedir , True ) ;
2001-09-28 01:20:14 +04:00
if ( drive )
2001-12-31 03:06:51 +03:00
pdb_set_dir_drive ( sam_pwent , drive , True ) ;
2001-09-28 01:20:14 +04:00
if ( script )
2001-12-31 03:06:51 +03:00
pdb_set_logon_script ( sam_pwent , script , True ) ;
2001-09-28 01:20:14 +04:00
if ( profile )
2001-12-31 03:06:51 +03:00
pdb_set_profile_path ( sam_pwent , profile , True ) ;
/* TODO: Check uid not being in MACHINE UID range!! */
pdb_set_uid ( sam_pwent , pwd - > pw_uid ) ;
pdb_set_gid ( sam_pwent , pwd - > pw_gid ) ;
pdb_set_user_rid ( sam_pwent , pdb_uid_to_user_rid ( pwd - > pw_uid ) ) ;
pdb_set_group_rid ( sam_pwent , pdb_gid_to_group_rid ( pwd - > pw_gid ) ) ;
2000-12-06 21:18:48 +03:00
2001-09-26 15:28:26 +04:00
pdb_set_acct_ctrl ( sam_pwent , ACB_NORMAL ) ;
2000-12-06 21:18:48 +03:00
2001-09-26 15:28:26 +04:00
if ( pdb_add_sam_account ( sam_pwent ) ) {
print_user_info ( username , True , False ) ;
} else {
2001-09-27 13:36:38 +04:00
fprintf ( stderr , " Unable to add user! (does it alredy exist?) \n " ) ;
2001-12-31 03:06:51 +03:00
pdb_free_sam ( & sam_pwent ) ;
2000-12-06 21:18:48 +03:00
return - 1 ;
}
2001-12-31 03:06:51 +03:00
pdb_free_sam ( & sam_pwent ) ;
2000-12-06 21:18:48 +03:00
return 0 ;
}
/*********************************************************
Add New Machine
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-09-28 01:20:14 +04:00
2000-12-06 21:18:48 +03:00
static int new_machine ( char * machinename )
{
2001-09-26 15:28:26 +04:00
SAM_ACCOUNT * sam_pwent = NULL ;
SAM_ACCOUNT * sam_trust = NULL ;
2000-12-06 21:18:48 +03:00
char name [ 16 ] ;
char * password = NULL ;
uid_t uid ;
2001-09-26 15:28:26 +04:00
pdb_init_sam ( & sam_pwent ) ;
2000-12-06 21:18:48 +03:00
2001-09-28 01:20:14 +04:00
if ( machinename [ strlen ( machinename ) - 1 ] = = ' $ ' )
machinename [ strlen ( machinename ) - 1 ] = ' \0 ' ;
2000-12-06 21:18:48 +03:00
safe_strcpy ( name , machinename , 16 ) ;
safe_strcat ( name , " $ " , 16 ) ;
string_set ( & password , machinename ) ;
2001-12-31 03:06:51 +03:00
strlower ( password ) ;
2000-12-06 21:18:48 +03:00
2001-09-27 13:36:38 +04:00
pdb_set_plaintext_passwd ( sam_pwent , password ) ;
2001-09-26 15:28:26 +04:00
2001-09-27 13:36:38 +04:00
pdb_set_username ( sam_pwent , name ) ;
2001-05-04 19:44:27 +04:00
2001-09-26 15:28:26 +04:00
for ( uid = BASE_MACHINE_UID ; uid < = MAX_MACHINE_UID ; uid + + ) {
pdb_init_sam ( & sam_trust ) ;
2001-12-31 03:06:51 +03:00
if ( pdb_getsampwuid ( sam_trust , uid ) ) {
pdb_free_sam ( & sam_trust ) ;
2001-09-26 15:28:26 +04:00
} else {
2001-05-04 19:44:27 +04:00
break ;
2001-09-26 15:28:26 +04:00
}
}
2000-12-06 21:18:48 +03:00
2001-05-04 19:44:27 +04:00
if ( uid > MAX_MACHINE_UID ) {
2000-12-06 21:18:48 +03:00
fprintf ( stderr , " No more free UIDs available to Machine accounts! \n " ) ;
2001-09-29 17:08:26 +04:00
pdb_free_sam ( & sam_pwent ) ;
2000-12-06 21:18:48 +03:00
return - 1 ;
}
2001-05-04 19:44:27 +04:00
2001-12-31 03:06:51 +03:00
pdb_set_uid ( sam_pwent , uid ) ;
pdb_set_gid ( sam_pwent , BASE_MACHINE_UID ) ; /* TODO: set there more appropriate value!! */
2001-09-26 15:28:26 +04:00
pdb_set_user_rid ( sam_pwent , pdb_uid_to_user_rid ( uid ) ) ;
pdb_set_group_rid ( sam_pwent , pdb_gid_to_group_rid ( BASE_MACHINE_UID ) ) ;
pdb_set_acct_ctrl ( sam_pwent , ACB_WSTRUST ) ;
2000-12-06 21:18:48 +03:00
2001-09-26 15:28:26 +04:00
if ( pdb_add_sam_account ( sam_pwent ) ) {
2001-07-13 02:27:00 +04:00
print_user_info ( name , True , False ) ;
2001-09-26 15:28:26 +04:00
} else {
2001-09-27 13:36:38 +04:00
fprintf ( stderr , " Unable to add machine! (does it already exist?) \n " ) ;
2001-12-31 03:06:51 +03:00
pdb_free_sam ( & sam_pwent ) ;
2000-12-06 21:18:48 +03:00
return - 1 ;
}
2001-12-31 03:06:51 +03:00
pdb_free_sam ( & sam_pwent ) ;
2000-12-06 21:18:48 +03:00
return 0 ;
}
/*********************************************************
Delete user entry
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-09-28 01:20:14 +04:00
2000-12-06 21:18:48 +03:00
static int delete_user_entry ( char * username )
{
return pdb_delete_sam_account ( username ) ;
}
/*********************************************************
Delete machine entry
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-09-28 01:20:14 +04:00
2000-12-06 21:18:48 +03:00
static int delete_machine_entry ( char * machinename )
{
char name [ 16 ] ;
safe_strcpy ( name , machinename , 16 ) ;
if ( name [ strlen ( name ) ] ! = ' $ ' )
safe_strcat ( name , " $ " , 16 ) ;
return pdb_delete_sam_account ( name ) ;
}
/*********************************************************
Import smbpasswd style file
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-09-28 01:20:14 +04:00
2000-12-06 21:18:48 +03:00
static int import_users ( char * filename )
{
FILE * fp = NULL ;
2001-09-27 13:36:38 +04:00
SAM_ACCOUNT * sam_pwent = NULL ;
2000-12-06 21:18:48 +03:00
static pstring user_name ;
static unsigned char smbpwd [ 16 ] ;
static unsigned char smbntpwd [ 16 ] ;
char linebuf [ 256 ] ;
size_t linebuf_len ;
unsigned char c ;
unsigned char * p ;
long uidval ;
int line = 0 ;
int good = 0 ;
2001-12-31 03:06:51 +03:00
if ( ! pdb_init_sam ( & sam_pwent ) ) {
fprintf ( stderr , " pdb_init_sam FAILED! \n " ) ;
}
2001-09-27 13:36:38 +04:00
2001-09-28 01:20:14 +04:00
if ( ( fp = sys_fopen ( filename , " rb " ) ) = = NULL ) {
2000-12-06 21:18:48 +03:00
fprintf ( stderr , " %s \n " , strerror ( ferror ( fp ) ) ) ;
return - 1 ;
}
2001-09-28 01:20:14 +04:00
while ( ! feof ( fp ) ) {
2000-12-06 21:18:48 +03:00
/*Get a new line*/
linebuf [ 0 ] = ' \0 ' ;
fgets ( linebuf , 256 , fp ) ;
2001-09-28 01:20:14 +04:00
if ( ferror ( fp ) ) {
2000-12-06 21:18:48 +03:00
fprintf ( stderr , " %s \n " , strerror ( ferror ( fp ) ) ) ;
2001-12-31 03:06:51 +03:00
pdb_free_sam ( & sam_pwent ) ;
2000-12-06 21:18:48 +03:00
return - 1 ;
}
2001-09-28 01:20:14 +04:00
if ( ( linebuf_len = strlen ( linebuf ) ) = = 0 ) {
2000-12-06 21:18:48 +03:00
line + + ;
continue ;
}
2001-09-28 01:20:14 +04:00
if ( linebuf [ linebuf_len - 1 ] ! = ' \n ' ) {
2000-12-06 21:18:48 +03:00
c = ' \0 ' ;
2001-09-28 01:20:14 +04:00
while ( ! ferror ( fp ) & & ! feof ( fp ) ) {
2000-12-06 21:18:48 +03:00
c = fgetc ( fp ) ;
if ( c = = ' \n ' ) break ;
}
2001-09-28 01:20:14 +04:00
} else
linebuf [ linebuf_len - 1 ] = ' \0 ' ;
2000-12-06 21:18:48 +03:00
linebuf [ linebuf_len ] = ' \0 ' ;
2001-09-28 01:20:14 +04:00
if ( ( linebuf [ 0 ] = = 0 ) & & feof ( fp ) ) {
2000-12-06 21:18:48 +03:00
/*end of file!!*/
2001-12-31 03:06:51 +03:00
pdb_free_sam ( & sam_pwent ) ;
2000-12-06 21:18:48 +03:00
return 0 ;
}
line + + ;
2001-09-28 01:20:14 +04:00
if ( linebuf [ 0 ] = = ' # ' | | linebuf [ 0 ] = = ' \0 ' )
continue ;
2000-12-06 21:18:48 +03:00
2001-12-31 03:06:51 +03:00
pdb_set_acct_ctrl ( sam_pwent , ACB_NORMAL ) ;
2000-12-06 21:18:48 +03:00
/* Get user name */
2001-07-04 11:36:09 +04:00
p = ( unsigned char * ) strchr_m ( linebuf , ' : ' ) ;
2001-09-28 01:20:14 +04:00
if ( p = = NULL ) {
2000-12-06 21:18:48 +03:00
fprintf ( stderr , " Error: malformed password entry at line %d !! \n " , line ) ;
2001-12-31 03:06:51 +03:00
pdb_reset_sam ( sam_pwent ) ;
2000-12-06 21:18:48 +03:00
continue ;
}
strncpy ( user_name , linebuf , PTR_DIFF ( p , linebuf ) ) ;
user_name [ PTR_DIFF ( p , linebuf ) ] = ' \0 ' ;
/* Get smb uid. */
p + + ;
2001-09-28 01:20:14 +04:00
if ( * p = = ' - ' ) {
2000-12-06 21:18:48 +03:00
fprintf ( stderr , " Error: negative uid at line %d \n " , line ) ;
2001-12-31 03:06:51 +03:00
pdb_reset_sam ( sam_pwent ) ;
2000-12-06 21:18:48 +03:00
continue ;
}
2001-09-28 01:20:14 +04:00
if ( ! isdigit ( * p ) ) {
2000-12-06 21:18:48 +03:00
fprintf ( stderr , " Error: malformed password entry at line %d (uid not number) \n " , line ) ;
2001-12-31 03:06:51 +03:00
pdb_reset_sam ( sam_pwent ) ;
2000-12-06 21:18:48 +03:00
continue ;
}
uidval = atoi ( ( char * ) p ) ;
while ( * p & & isdigit ( * p ) ) p + + ;
2001-09-28 01:20:14 +04:00
if ( * p ! = ' : ' ) {
2000-12-06 21:18:48 +03:00
fprintf ( stderr , " Error: malformed password entry at line %d (no : after uid) \n " , line ) ;
2001-12-31 03:06:51 +03:00
pdb_reset_sam ( sam_pwent ) ;
2000-12-06 21:18:48 +03:00
continue ;
}
2001-11-04 04:09:04 +03:00
2001-12-31 03:06:51 +03:00
pdb_set_username ( sam_pwent , user_name ) ;
pdb_set_uid ( sam_pwent , uidval ) ;
2000-12-06 21:18:48 +03:00
/* Get passwords */
p + + ;
2001-09-28 01:20:14 +04:00
if ( * p = = ' * ' | | * p = = ' X ' ) {
2000-12-06 21:18:48 +03:00
/* Password deliberately invalid */
fprintf ( stderr , " Warning: entry invalidated for user %s \n " , user_name ) ;
2001-09-27 13:36:38 +04:00
pdb_set_lanman_passwd ( sam_pwent , NULL ) ;
pdb_set_nt_passwd ( sam_pwent , NULL ) ;
pdb_set_acct_ctrl ( sam_pwent , pdb_get_acct_ctrl ( sam_pwent ) | ACB_DISABLED ) ;
2001-09-28 01:20:14 +04:00
} else {
if ( linebuf_len < ( PTR_DIFF ( p , linebuf ) + 33 ) ) {
2000-12-06 21:18:48 +03:00
fprintf ( stderr , " Error: malformed password entry at line %d (password too short) \n " , line ) ;
2001-12-31 03:06:51 +03:00
pdb_reset_sam ( sam_pwent ) ;
2000-12-06 21:18:48 +03:00
continue ;
}
2001-09-28 01:20:14 +04:00
if ( p [ 32 ] ! = ' : ' ) {
2000-12-06 21:18:48 +03:00
fprintf ( stderr , " Error: malformed password entry at line %d (no terminating :) \n " , line ) ;
2001-12-31 03:06:51 +03:00
pdb_reset_sam ( sam_pwent ) ;
2000-12-06 21:18:48 +03:00
continue ;
}
2001-09-28 01:20:14 +04:00
if ( ! strncasecmp ( ( char * ) p , " NO PASSWORD " , 11 ) ) {
2001-09-27 13:36:38 +04:00
pdb_set_lanman_passwd ( sam_pwent , NULL ) ;
pdb_set_acct_ctrl ( sam_pwent , pdb_get_acct_ctrl ( sam_pwent ) | ACB_PWNOTREQ ) ;
2001-09-28 01:20:14 +04:00
} else {
2001-09-28 01:27:12 +04:00
if ( ! pdb_gethexpwd ( ( char * ) p , smbpwd ) ) {
2000-12-06 21:18:48 +03:00
fprintf ( stderr , " Error: malformed Lanman password entry at line %d (non hex chars) \n " , line ) ;
2001-12-31 03:06:51 +03:00
pdb_reset_sam ( sam_pwent ) ;
2000-12-06 21:18:48 +03:00
continue ;
}
2001-09-27 13:36:38 +04:00
pdb_set_lanman_passwd ( sam_pwent , smbpwd ) ;
2000-12-06 21:18:48 +03:00
}
/* NT password */
2001-12-31 03:06:51 +03:00
pdb_set_nt_passwd ( sam_pwent , smbpwd ) ;
2000-12-06 21:18:48 +03:00
p + = 33 ;
2001-09-28 01:20:14 +04:00
if ( ( linebuf_len > = ( PTR_DIFF ( p , linebuf ) + 33 ) ) & & ( p [ 32 ] = = ' : ' ) ) {
if ( * p ! = ' * ' & & * p ! = ' X ' ) {
if ( pdb_gethexpwd ( ( char * ) p , smbntpwd ) ) {
2001-09-27 13:36:38 +04:00
pdb_set_nt_passwd ( sam_pwent , smbntpwd ) ;
2000-12-06 21:18:48 +03:00
}
}
p + = 33 ;
}
}
/* Get ACCT_CTRL field if any */
2001-09-28 01:20:14 +04:00
if ( * p = = ' [ ' ) {
2001-09-27 13:36:38 +04:00
uint16 acct_ctrl ;
2001-07-04 11:36:09 +04:00
unsigned char * end_p = ( unsigned char * ) strchr_m ( ( char * ) p , ' ] ' ) ;
2000-12-06 21:18:48 +03:00
2001-09-27 13:36:38 +04:00
acct_ctrl = pdb_decode_acct_ctrl ( ( char * ) p ) ;
2001-09-28 01:20:14 +04:00
if ( acct_ctrl )
acct_ctrl = ACB_NORMAL ;
2001-09-27 13:36:38 +04:00
pdb_set_acct_ctrl ( sam_pwent , acct_ctrl ) ;
2000-12-06 21:18:48 +03:00
/* Get last change time */
2001-09-28 01:20:14 +04:00
if ( end_p )
p = end_p + 1 ;
if ( * p = = ' : ' ) {
2000-12-06 21:18:48 +03:00
p + + ;
2001-09-28 01:20:14 +04:00
if ( * p & & ( StrnCaseCmp ( ( char * ) p , " LCT- " , 4 ) = = 0 ) ) {
2000-12-06 21:18:48 +03:00
int i ;
p + = 4 ;
2001-09-28 01:20:14 +04:00
for ( i = 0 ; i < 8 ; i + + ) {
2000-12-06 21:18:48 +03:00
if ( p [ i ] = = ' \0 ' | | ! isxdigit ( p [ i ] ) ) break ;
}
2001-09-28 01:20:14 +04:00
if ( i = = 8 ) {
2001-09-27 13:36:38 +04:00
pdb_set_pass_last_set_time ( sam_pwent , ( time_t ) strtol ( ( char * ) p , NULL , 16 ) ) ;
2000-12-06 21:18:48 +03:00
}
}
}
}
2001-12-31 03:06:51 +03:00
/* Old-style workstation account code droped. */
if ( pdb_get_acct_ctrl ( sam_pwent ) & ACB_WSTRUST ) {
if ( ( uidval < BASE_MACHINE_UID ) | | ( uidval > MAX_MACHINE_UID ) ) {
fprintf ( stderr , " Warning: Machine UID out of normal range %d-%d \n " ,
BASE_MACHINE_UID ,
MAX_MACHINE_UID ) ;
}
pdb_set_uid ( sam_pwent , BASE_MACHINE_UID ) ;
}
/* Test if user is valid */
if ( pdb_get_acct_ctrl ( sam_pwent ) & ACB_NORMAL ) {
struct passwd * pwd = NULL ;
if ( ! ( pwd = sys_getpwnam ( user_name ) ) ) {
fprintf ( stderr , " Error: User %s does not exist in system passwd! \n " , user_name ) ;
continue ;
}
pdb_set_gid ( sam_pwent , pwd - > pw_gid ) ;
}
/* Fill in sam_pwent structure */
pdb_set_user_rid ( sam_pwent , pdb_uid_to_user_rid ( pdb_get_uid ( sam_pwent ) ) ) ;
pdb_set_group_rid ( sam_pwent , pdb_gid_to_group_rid ( pdb_get_gid ( sam_pwent ) ) ) ;
/* TODO: set also full_name, home_dir, dir_drive, logon_script, profile_path, ecc...
* when defaults will be available ( after passdb redesign )
* let them blank just now they are not used anyway
*/
2000-12-06 21:18:48 +03:00
/* Now ADD the entry */
2001-09-28 01:20:14 +04:00
if ( ! ( pdb_add_sam_account ( sam_pwent ) ) ) {
2000-12-06 21:18:48 +03:00
fprintf ( stderr , " Unable to add user entry! \n " ) ;
2001-12-31 03:06:51 +03:00
pdb_reset_sam ( sam_pwent ) ;
2000-12-06 21:18:48 +03:00
continue ;
}
printf ( " %s imported! \n " , user_name ) ;
good + + ;
2001-12-31 03:06:51 +03:00
pdb_reset_sam ( sam_pwent ) ;
2000-12-06 21:18:48 +03:00
}
2001-12-31 03:06:51 +03:00
printf ( " %d lines read. \n %d entries imported \n " , line , good ) ;
pdb_free_sam ( & sam_pwent ) ;
2000-12-06 21:18:48 +03:00
return 0 ;
}
/*********************************************************
Start here .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-09-28 01:20:14 +04:00
2000-12-06 21:18:48 +03:00
int main ( int argc , char * * argv )
{
int ch ;
2001-12-31 05:04:08 +03:00
static pstring servicesf ;
2001-07-13 02:27:00 +04:00
BOOL list_users = False ;
BOOL verbose = False ;
BOOL spstyle = False ;
BOOL setparms = False ;
BOOL machine = False ;
BOOL add_user = False ;
BOOL delete_user = False ;
BOOL import = False ;
2000-12-06 21:18:48 +03:00
char * user_name = NULL ;
char * full_name = NULL ;
char * home_dir = NULL ;
char * home_drive = NULL ;
char * logon_script = NULL ;
char * profile_path = NULL ;
char * smbpasswd = NULL ;
2001-12-31 05:04:08 +03:00
pstrcpy ( servicesf , dyn_CONFIGFILE ) ;
2001-12-31 03:06:51 +03:00
TimeInit ( ) ;
2001-11-25 21:54:04 +03:00
setup_logging ( " pdbedit " , True ) ;
2000-12-06 21:18:48 +03:00
2001-09-28 01:20:14 +04:00
if ( argc < 2 ) {
2000-12-06 21:18:48 +03:00
usage ( ) ;
return 0 ;
}
2001-12-31 03:06:51 +03:00
if ( ! lp_load ( servicesf , True , False , False ) ) {
fprintf ( stderr , " Can't load %s - run testparm to debug it \n " ,
servicesf ) ;
2000-12-06 21:18:48 +03:00
exit ( 1 ) ;
}
2001-12-31 03:06:51 +03:00
secrets_init ( ) ;
if ( ! initialize_password_db ( True ) ) {
fprintf ( stderr , " Can't setup password database vectors. \n " ) ;
2000-12-06 21:18:48 +03:00
exit ( 1 ) ;
}
2001-12-31 03:06:51 +03:00
while ( ( ch = getopt ( argc , argv , " ad:f:h:i:lmp:s:u:vwxD: " ) ) ! = EOF ) {
2000-12-06 21:18:48 +03:00
switch ( ch ) {
case ' a ' :
2001-07-13 02:27:00 +04:00
add_user = True ;
2000-12-06 21:18:48 +03:00
break ;
case ' m ' :
2001-07-13 02:27:00 +04:00
machine = True ;
2000-12-06 21:18:48 +03:00
break ;
case ' l ' :
2001-07-13 02:27:00 +04:00
list_users = True ;
2000-12-06 21:18:48 +03:00
break ;
case ' v ' :
2001-07-13 02:27:00 +04:00
verbose = True ;
2000-12-06 21:18:48 +03:00
break ;
case ' w ' :
2001-07-13 02:27:00 +04:00
spstyle = True ;
2000-12-06 21:18:48 +03:00
break ;
case ' u ' :
user_name = optarg ;
break ;
case ' f ' :
2001-07-13 02:27:00 +04:00
setparms = True ;
2000-12-06 21:18:48 +03:00
full_name = optarg ;
break ;
case ' h ' :
2001-07-13 02:27:00 +04:00
setparms = True ;
2000-12-06 21:18:48 +03:00
home_dir = optarg ;
break ;
case ' d ' :
2001-07-13 02:27:00 +04:00
setparms = True ;
2000-12-06 21:18:48 +03:00
home_drive = optarg ;
break ;
case ' s ' :
2001-07-13 02:27:00 +04:00
setparms = True ;
2000-12-06 21:18:48 +03:00
logon_script = optarg ;
break ;
case ' p ' :
2001-07-13 02:27:00 +04:00
setparms = True ;
2000-12-06 21:18:48 +03:00
profile_path = optarg ;
break ;
case ' x ' :
2001-07-13 02:27:00 +04:00
delete_user = True ;
2000-12-06 21:18:48 +03:00
break ;
case ' i ' :
2001-07-13 02:27:00 +04:00
import = True ;
2000-12-06 21:18:48 +03:00
smbpasswd = optarg ;
break ;
2001-12-31 03:06:51 +03:00
case ' D ' :
DEBUGLEVEL = atoi ( optarg ) ;
break ;
2000-12-06 21:18:48 +03:00
default :
usage ( ) ;
}
}
2001-09-28 01:20:14 +04:00
if ( ( ( add_user ? 1 : 0 ) + ( delete_user ? 1 : 0 ) + ( list_users ? 1 : 0 ) + ( import ? 1 : 0 ) + ( setparms ? 1 : 0 ) ) > 1 ) {
2000-12-06 21:18:48 +03:00
fprintf ( stderr , " Incompatible options on command line! \n " ) ;
usage ( ) ;
exit ( 1 ) ;
}
2001-09-28 01:20:14 +04:00
if ( add_user ) {
if ( ! user_name ) {
2000-12-06 21:18:48 +03:00
fprintf ( stderr , " Username not specified! (use -u option) \n " ) ;
return - 1 ;
}
2001-09-28 01:20:14 +04:00
if ( machine )
return new_machine ( user_name ) ;
else
return new_user ( user_name , full_name , home_dir , home_drive , logon_script , profile_path ) ;
2000-12-06 21:18:48 +03:00
}
2001-09-28 01:20:14 +04:00
if ( delete_user ) {
if ( ! user_name ) {
2000-12-06 21:18:48 +03:00
fprintf ( stderr , " Username not specified! (use -u option) \n " ) ;
return - 1 ;
}
2001-09-28 01:20:14 +04:00
if ( machine )
return delete_machine_entry ( user_name ) ;
else
return delete_user_entry ( user_name ) ;
2000-12-06 21:18:48 +03:00
}
2001-09-28 01:20:14 +04:00
if ( user_name ) {
if ( setparms )
set_user_info ( user_name , full_name ,
2000-12-06 21:18:48 +03:00
home_dir ,
home_drive ,
logon_script ,
profile_path ) ;
2001-09-28 01:20:14 +04:00
else
return print_user_info ( user_name , verbose , spstyle ) ;
2000-12-06 21:18:48 +03:00
return 0 ;
}
if ( list_users )
return print_users_list ( verbose , spstyle ) ;
if ( import )
return import_users ( smbpasswd ) ;
usage ( ) ;
return 0 ;
}