2001-09-27 13:36:38 +04:00
/*
2002-01-30 09:08:46 +03:00
Unix SMB / CIFS implementation .
2001-09-27 13:36:38 +04:00
passdb editing frontend
Copyright ( C ) Simo Sorce 2000
Copyright ( C ) Andrew Bartlett 2001
2002-04-13 12:16:41 +04:00
Copyright ( C ) Jelmer Vernooij 2002
2001-09-27 13:36:38 +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 .
*/
2000-12-06 21:18:48 +03:00
# include "includes.h"
extern pstring global_myname ;
2002-01-08 00:32:22 +03:00
extern BOOL AllowDebugChange ;
2000-12-06 21:18:48 +03:00
/*********************************************************
2002-04-13 12:16:41 +04:00
Add all currently available users to another db
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2002-07-21 07:26:10 +04:00
static int export_database ( struct pdb_context * in , char * db ) {
2002-04-13 12:16:41 +04:00
struct pdb_context * context ;
SAM_ACCOUNT * user = NULL ;
2002-06-14 06:58:03 +04:00
if ( ! NT_STATUS_IS_OK ( make_pdb_context_string ( & context , db ) ) ) {
2002-04-13 12:16:41 +04:00
fprintf ( stderr , " Can't initialize %s. \n " , db ) ;
return 1 ;
}
2002-05-24 13:57:48 +04:00
if ( ! in - > pdb_setsampwent ( in , 0 ) ) {
2002-04-13 12:16:41 +04:00
fprintf ( stderr , " Can't sampwent! \n " ) ;
return 1 ;
}
2002-05-24 13:57:48 +04:00
if ( ! NT_STATUS_IS_OK ( pdb_init_sam ( & user ) ) ) {
2002-04-13 12:16:41 +04:00
fprintf ( stderr , " Can't initialize new SAM_ACCOUNT! \n " ) ;
return 1 ;
2000-12-06 21:18:48 +03:00
}
2002-04-13 12:16:41 +04:00
2002-05-24 13:57:48 +04:00
while ( in - > pdb_getsampwent ( in , user ) ) {
2002-04-13 12:16:41 +04:00
context - > pdb_add_sam_account ( context , user ) ;
2002-05-24 13:57:48 +04:00
if ( ! NT_STATUS_IS_OK ( pdb_reset_sam ( user ) ) ) {
2002-04-13 12:16:41 +04:00
fprintf ( stderr , " Can't reset SAM_ACCOUNT! \n " ) ;
return 1 ;
}
}
in - > pdb_endsampwent ( in ) ;
return 0 ;
2000-12-06 21:18:48 +03:00
}
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 )
{
2001-12-31 17:39:26 +03:00
uid_t uid ;
gid_t gid ;
2002-04-13 14:32:09 +04:00
time_t tmp ;
2001-12-31 17:39:26 +03:00
2000-12-06 21:18:48 +03:00
/* 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 ) {
2002-06-14 06:58:03 +04:00
printf ( " Unix username: %s \n " , pdb_get_username ( sam_pwent ) ) ;
2002-05-18 19:09:21 +04:00
printf ( " NT username: %s \n " , pdb_get_nt_username ( sam_pwent ) ) ;
2002-07-14 12:38:09 +04:00
printf ( " Account Flags: %s \n " , pdb_encode_acct_ctrl ( pdb_get_acct_ctrl ( sam_pwent ) , NEW_PW_FORMAT_SPACE_PADDED_LEN ) ) ;
2001-12-31 17:39:26 +03:00
if ( IS_SAM_UNIX_USER ( sam_pwent ) ) {
uid = pdb_get_uid ( sam_pwent ) ;
gid = pdb_get_gid ( sam_pwent ) ;
2002-06-13 18:06:08 +04:00
printf ( " User ID/Group ID: %d/%d \n " , uid , gid ) ;
2001-12-31 17:39:26 +03:00
}
2002-06-13 18:06:08 +04:00
printf ( " User SID: %s \n " ,
2002-06-14 08:02:28 +04:00
sid_string_static ( pdb_get_user_sid ( sam_pwent ) ) ) ;
2002-06-13 18:06:08 +04:00
printf ( " Primary Group SID: %s \n " ,
2002-06-14 08:02:28 +04:00
sid_string_static ( pdb_get_group_sid ( sam_pwent ) ) ) ;
2002-04-13 14:32:09 +04:00
printf ( " Full Name: %s \n " , pdb_get_fullname ( sam_pwent ) ) ;
printf ( " Home Directory: %s \n " , pdb_get_homedir ( sam_pwent ) ) ;
2002-07-21 10:32:25 +04:00
printf ( " HomeDir Drive: %s \n " , pdb_get_dir_drive ( sam_pwent ) ) ;
2002-04-13 14:32:09 +04:00
printf ( " Logon Script: %s \n " , pdb_get_logon_script ( sam_pwent ) ) ;
printf ( " Profile Path: %s \n " , pdb_get_profile_path ( sam_pwent ) ) ;
printf ( " Domain: %s \n " , pdb_get_domain ( sam_pwent ) ) ;
printf ( " Account desc: %s \n " , pdb_get_acct_desc ( sam_pwent ) ) ;
printf ( " Workstations: %s \n " , pdb_get_workstations ( sam_pwent ) ) ;
printf ( " Munged dial: %s \n " , pdb_get_munged_dial ( sam_pwent ) ) ;
tmp = pdb_get_logon_time ( sam_pwent ) ;
printf ( " Logon time: %s \n " , tmp ? http_timestring ( tmp ) : " 0 " ) ;
tmp = pdb_get_logoff_time ( sam_pwent ) ;
printf ( " Logoff time: %s \n " , tmp ? http_timestring ( tmp ) : " 0 " ) ;
tmp = pdb_get_kickoff_time ( sam_pwent ) ;
printf ( " Kickoff time: %s \n " , tmp ? http_timestring ( tmp ) : " 0 " ) ;
tmp = pdb_get_pass_last_set_time ( sam_pwent ) ;
printf ( " Password last set: %s \n " , tmp ? http_timestring ( tmp ) : " 0 " ) ;
tmp = pdb_get_pass_can_change_time ( sam_pwent ) ;
printf ( " Password can change: %s \n " , tmp ? http_timestring ( tmp ) : " 0 " ) ;
tmp = pdb_get_pass_must_change_time ( sam_pwent ) ;
printf ( " Password must change: %s \n " , tmp ? http_timestring ( tmp ) : " 0 " ) ;
2001-09-28 01:20:14 +04:00
} else if ( smbpwdstyle ) {
2001-12-31 17:39:26 +03:00
if ( IS_SAM_UNIX_USER ( sam_pwent ) ) {
2001-11-04 04:09:04 +03:00
char lm_passwd [ 33 ] ;
char nt_passwd [ 33 ] ;
2001-12-31 17:39:26 +03:00
uid = pdb_get_uid ( sam_pwent ) ;
2001-11-04 04:09:04 +03:00
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 17:39:26 +03:00
uid ,
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 17:39:26 +03:00
fprintf ( stderr , " Can't output in smbpasswd format, no uid on this record. \n " ) ;
}
} else {
if ( IS_SAM_UNIX_USER ( sam_pwent ) ) {
printf ( " %s:%d:%s \n " , pdb_get_username ( sam_pwent ) , pdb_get_uid ( sam_pwent ) ,
pdb_get_fullname ( sam_pwent ) ) ;
} else {
printf ( " %s:(null):%s \n " , pdb_get_username ( sam_pwent ) , pdb_get_fullname ( sam_pwent ) ) ;
}
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
2002-04-13 12:16:41 +04:00
static int print_user_info ( struct pdb_context * in , char * username , BOOL verbosity , BOOL smbpwdstyle )
2000-12-06 21:18:48 +03:00
{
2001-05-04 19:44:27 +04:00
SAM_ACCOUNT * sam_pwent = NULL ;
BOOL ret ;
2002-01-31 14:38:47 +03:00
if ( ! NT_STATUS_IS_OK ( pdb_init_sam ( & sam_pwent ) ) ) {
return - 1 ;
}
2000-12-06 21:18:48 +03:00
2002-04-13 12:16:41 +04:00
ret = in - > pdb_getsampwnam ( in , sam_pwent , username ) ;
2001-05-04 19:44:27 +04:00
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
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2002-04-13 12:16:41 +04:00
static int print_users_list ( struct pdb_context * in , BOOL verbosity , BOOL smbpwdstyle )
2000-12-06 21:18:48 +03:00
{
2001-05-04 19:44:27 +04:00
SAM_ACCOUNT * sam_pwent = NULL ;
2002-03-19 02:57:14 +03:00
BOOL check , ret ;
2000-12-06 21:18:48 +03:00
2002-04-13 12:16:41 +04:00
check = in - > pdb_setsampwent ( in , False ) ;
2002-05-10 18:40:55 +04:00
if ( ! check ) {
return 1 ;
2000-12-06 21:18:48 +03:00
}
2002-03-19 02:57:14 +03:00
check = True ;
if ( ! ( NT_STATUS_IS_OK ( pdb_init_sam ( & sam_pwent ) ) ) ) return 1 ;
2002-04-13 12:16:41 +04:00
while ( check & & ( ret = in - > pdb_getsampwent ( in , sam_pwent ) ) ) {
2001-09-28 01:20:14 +04:00
if ( verbosity )
printf ( " --------------- \n " ) ;
2000-12-06 21:18:48 +03:00
print_sam_info ( sam_pwent , verbosity , smbpwdstyle ) ;
2002-01-27 06:00:56 +03:00
pdb_free_sam ( & sam_pwent ) ;
2002-03-19 02:57:14 +03:00
check = NT_STATUS_IS_OK ( pdb_init_sam ( & sam_pwent ) ) ;
2000-12-06 21:18:48 +03:00
}
2002-03-19 02:57:14 +03:00
if ( check ) pdb_free_sam ( & sam_pwent ) ;
2000-12-06 21:18:48 +03:00
2002-04-13 12:16:41 +04:00
in - > pdb_endsampwent ( in ) ;
2000-12-06 21:18:48 +03:00
return 0 ;
}
/*********************************************************
Set User Info
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-09-28 01:20:14 +04:00
2002-04-13 12:16:41 +04:00
static int set_user_info ( struct pdb_context * in , char * username , char * fullname , char * homedir , char * drive , char * script , char * profile )
2000-12-06 21:18:48 +03:00
{
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
2002-04-13 12:16:41 +04:00
ret = in - > pdb_getsampwnam ( in , 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 17:39:26 +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
2002-04-13 12:16:41 +04:00
if ( in - > pdb_update_sam_account ( in , sam_pwent ) )
print_user_info ( in , username , True , False ) ;
2001-09-28 01:20:14 +04:00
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 ;
}
/*********************************************************
Add New User
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2002-04-13 12:16:41 +04:00
static int new_user ( struct pdb_context * in , char * username , char * fullname , char * homedir , char * drive , char * script , char * profile )
2000-12-06 21:18:48 +03:00
{
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 ;
2002-08-04 19:40:39 +04:00
char * password1 , * password2 , * staticpass ;
2000-12-06 21:18:48 +03:00
2001-03-23 05:14:08 +03:00
ZERO_STRUCT ( sam_pwent ) ;
2002-01-26 08:53:07 +03:00
if ( ( pwd = getpwnam_alloc ( username ) ) ) {
2002-01-23 15:59:24 +03:00
pdb_init_sam_pw ( & sam_pwent , pwd ) ;
passwd_free ( & pwd ) ;
} else {
fprintf ( stderr , " WARNING: user %s does not exist in system passwd \n " , username ) ;
pdb_init_sam ( & sam_pwent ) ;
if ( ! pdb_set_username ( sam_pwent , username ) ) {
return False ;
}
}
2001-12-31 17:39:26 +03:00
2002-08-04 19:40:39 +04:00
staticpass = getpass ( " new password: " ) ;
password1 = strdup ( staticpass ) ;
memset ( staticpass , 0 , strlen ( staticpass ) ) ;
staticpass = getpass ( " retype new password: " ) ;
password2 = strdup ( staticpass ) ;
memset ( staticpass , 0 , strlen ( staticpass ) ) ;
2001-12-31 17:39:26 +03:00
if ( strcmp ( password1 , password2 ) ) {
2002-08-04 19:40:39 +04:00
fprintf ( stderr , " Passwords does not match! \n " ) ;
memset ( password1 , 0 , strlen ( password1 ) ) ;
SAFE_FREE ( password1 ) ;
memset ( password2 , 0 , strlen ( password2 ) ) ;
SAFE_FREE ( password2 ) ;
pdb_free_sam ( & sam_pwent ) ;
return - 1 ;
2000-12-06 21:18:48 +03:00
}
2001-09-26 15:28:26 +04:00
2001-12-31 17:39:26 +03:00
pdb_set_plaintext_passwd ( sam_pwent , password1 ) ;
2002-08-04 19:40:39 +04:00
memset ( password1 , 0 , strlen ( password1 ) ) ;
SAFE_FREE ( password1 ) ;
memset ( password2 , 0 , strlen ( password2 ) ) ;
SAFE_FREE ( password2 ) ;
2001-09-26 15:28:26 +04:00
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-26 15:28:26 +04:00
pdb_set_acct_ctrl ( sam_pwent , ACB_NORMAL ) ;
2000-12-06 21:18:48 +03:00
2002-04-13 12:16:41 +04:00
if ( in - > pdb_add_sam_account ( in , sam_pwent ) ) {
print_user_info ( in , username , True , False ) ;
2001-09-26 15:28:26 +04:00
} else {
2001-09-27 13:36:38 +04:00
fprintf ( stderr , " Unable to add user! (does it alredy exist?) \n " ) ;
2001-12-31 17:39:26 +03:00
pdb_free_sam ( & sam_pwent ) ;
2000-12-06 21:18:48 +03:00
return - 1 ;
}
2001-12-31 17:39:26 +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
2002-04-13 12:16:41 +04:00
static int new_machine ( struct pdb_context * in , char * machinename )
2000-12-06 21:18:48 +03:00
{
2001-09-26 15:28:26 +04:00
SAM_ACCOUNT * sam_pwent = NULL ;
2000-12-06 21:18:48 +03:00
char name [ 16 ] ;
char * password = NULL ;
2001-09-26 15:28:26 +04:00
2002-01-31 14:38:47 +03:00
if ( ! NT_STATUS_IS_OK ( pdb_init_sam ( & sam_pwent ) ) ) {
return - 1 ;
}
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 17:39:26 +03:00
strlower_m ( 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
pdb_set_acct_ctrl ( sam_pwent , ACB_WSTRUST ) ;
2000-12-06 21:18:48 +03:00
2002-06-13 18:06:08 +04:00
pdb_set_group_sid_from_rid ( sam_pwent , DOMAIN_GROUP_RID_COMPUTERS ) ;
2002-03-19 16:57:53 +03:00
2002-04-13 12:16:41 +04:00
if ( in - > pdb_add_sam_account ( in , sam_pwent ) ) {
print_user_info ( in , 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 17:39:26 +03:00
pdb_free_sam ( & sam_pwent ) ;
2000-12-06 21:18:48 +03:00
return - 1 ;
}
2001-12-31 17:39:26 +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
2002-04-13 12:16:41 +04:00
static int delete_user_entry ( struct pdb_context * in , char * username )
2000-12-06 21:18:48 +03:00
{
2002-01-31 14:38:47 +03:00
SAM_ACCOUNT * samaccount = NULL ;
This is another *BIG* change...
Samba now features a pluggable passdb interface, along the same lines as the
one in use in the auth subsystem. In this case, only one backend may be active
at a time by the 'normal' interface, and only one backend per passdb_context is
permitted outside that.
This pluggable interface is designed to allow any number of passdb backends to
be compiled in, with the selection at runtime. The 'passdb backend' paramater
has been created (and documented!) to support this.
As such, configure has been modfied to allow (for example) --with-ldap and the
old smbpasswd to be selected at the same time.
This patch also introduces two new backends: smbpasswd_nua and tdbsam_nua.
These two backends accept 'non unix accounts', where the user does *not* exist
in /etc/passwd. These accounts' don't have UIDs in the unix sense, but to
avoid conflicts in the algroitmic mapping of RIDs, they use the values
specified in the 'non unix account range' paramter - in the same way as the
winbind ranges are specifed.
While I was at it, I cleaned up some of the code in pdb_tdb (code copied
directly from smbpasswd and not really considered properly). Most of this was
to do with % macro expansion on stored data. It isn't easy to get the macros
into the tdb, and the first password change will 'expand' them. tdbsam needs
to use a similar system to pdb_ldap in this regard.
This patch only makes minor adjustments to pdb_nisplus and pdb_ldap, becouse I
don't have the test facilities for these. I plan to incoroprate at least
pdb_ldap into this scheme after consultation with Jerry.
Each (converted) passdb module now no longer has any 'static' variables, and
only exports 1 init function outside its .c file.
The non-unix-account support in this patch has been proven! It is now possible
to join a win2k machine to a Samba PDC without an account in /etc/passwd!
Other changes:
Minor interface adjustments:
pdb_delete_sam_account() now takes a SAM_ACCOUNT, not a char*.
pdb_update_sam_account() no longer takes the 'override' argument that was being
ignored so often (every other passdb backend). Extra checks have been added in
some places.
Minor code changes:
smbpasswd no longer attempts to initialise the passdb at startup, this is
now done on first use.
pdbedit has lost some of its 'machine account' logic, as this behaviour is now
controlled by the passdb subsystem directly.
The samr subsystem no longer calls 'local password change', but does the pdb
interactions directly. This allow the ACB_ flags specifed to be transferred
direct to the backend, without interference.
Doco:
I've updated the doco to reflect some of the changes, and removed some paramters
no longer applicable to HEAD.
(This used to be commit ff354c99c585068af6dc1ff35a1f109a806b326b)
2002-01-20 17:30:58 +03:00
2002-01-31 14:38:47 +03:00
if ( ! NT_STATUS_IS_OK ( pdb_init_sam ( & samaccount ) ) ) {
return - 1 ;
}
This is another *BIG* change...
Samba now features a pluggable passdb interface, along the same lines as the
one in use in the auth subsystem. In this case, only one backend may be active
at a time by the 'normal' interface, and only one backend per passdb_context is
permitted outside that.
This pluggable interface is designed to allow any number of passdb backends to
be compiled in, with the selection at runtime. The 'passdb backend' paramater
has been created (and documented!) to support this.
As such, configure has been modfied to allow (for example) --with-ldap and the
old smbpasswd to be selected at the same time.
This patch also introduces two new backends: smbpasswd_nua and tdbsam_nua.
These two backends accept 'non unix accounts', where the user does *not* exist
in /etc/passwd. These accounts' don't have UIDs in the unix sense, but to
avoid conflicts in the algroitmic mapping of RIDs, they use the values
specified in the 'non unix account range' paramter - in the same way as the
winbind ranges are specifed.
While I was at it, I cleaned up some of the code in pdb_tdb (code copied
directly from smbpasswd and not really considered properly). Most of this was
to do with % macro expansion on stored data. It isn't easy to get the macros
into the tdb, and the first password change will 'expand' them. tdbsam needs
to use a similar system to pdb_ldap in this regard.
This patch only makes minor adjustments to pdb_nisplus and pdb_ldap, becouse I
don't have the test facilities for these. I plan to incoroprate at least
pdb_ldap into this scheme after consultation with Jerry.
Each (converted) passdb module now no longer has any 'static' variables, and
only exports 1 init function outside its .c file.
The non-unix-account support in this patch has been proven! It is now possible
to join a win2k machine to a Samba PDC without an account in /etc/passwd!
Other changes:
Minor interface adjustments:
pdb_delete_sam_account() now takes a SAM_ACCOUNT, not a char*.
pdb_update_sam_account() no longer takes the 'override' argument that was being
ignored so often (every other passdb backend). Extra checks have been added in
some places.
Minor code changes:
smbpasswd no longer attempts to initialise the passdb at startup, this is
now done on first use.
pdbedit has lost some of its 'machine account' logic, as this behaviour is now
controlled by the passdb subsystem directly.
The samr subsystem no longer calls 'local password change', but does the pdb
interactions directly. This allow the ACB_ flags specifed to be transferred
direct to the backend, without interference.
Doco:
I've updated the doco to reflect some of the changes, and removed some paramters
no longer applicable to HEAD.
(This used to be commit ff354c99c585068af6dc1ff35a1f109a806b326b)
2002-01-20 17:30:58 +03:00
2002-04-13 12:16:41 +04:00
if ( ! in - > pdb_getsampwnam ( in , samaccount , username ) ) {
This is another *BIG* change...
Samba now features a pluggable passdb interface, along the same lines as the
one in use in the auth subsystem. In this case, only one backend may be active
at a time by the 'normal' interface, and only one backend per passdb_context is
permitted outside that.
This pluggable interface is designed to allow any number of passdb backends to
be compiled in, with the selection at runtime. The 'passdb backend' paramater
has been created (and documented!) to support this.
As such, configure has been modfied to allow (for example) --with-ldap and the
old smbpasswd to be selected at the same time.
This patch also introduces two new backends: smbpasswd_nua and tdbsam_nua.
These two backends accept 'non unix accounts', where the user does *not* exist
in /etc/passwd. These accounts' don't have UIDs in the unix sense, but to
avoid conflicts in the algroitmic mapping of RIDs, they use the values
specified in the 'non unix account range' paramter - in the same way as the
winbind ranges are specifed.
While I was at it, I cleaned up some of the code in pdb_tdb (code copied
directly from smbpasswd and not really considered properly). Most of this was
to do with % macro expansion on stored data. It isn't easy to get the macros
into the tdb, and the first password change will 'expand' them. tdbsam needs
to use a similar system to pdb_ldap in this regard.
This patch only makes minor adjustments to pdb_nisplus and pdb_ldap, becouse I
don't have the test facilities for these. I plan to incoroprate at least
pdb_ldap into this scheme after consultation with Jerry.
Each (converted) passdb module now no longer has any 'static' variables, and
only exports 1 init function outside its .c file.
The non-unix-account support in this patch has been proven! It is now possible
to join a win2k machine to a Samba PDC without an account in /etc/passwd!
Other changes:
Minor interface adjustments:
pdb_delete_sam_account() now takes a SAM_ACCOUNT, not a char*.
pdb_update_sam_account() no longer takes the 'override' argument that was being
ignored so often (every other passdb backend). Extra checks have been added in
some places.
Minor code changes:
smbpasswd no longer attempts to initialise the passdb at startup, this is
now done on first use.
pdbedit has lost some of its 'machine account' logic, as this behaviour is now
controlled by the passdb subsystem directly.
The samr subsystem no longer calls 'local password change', but does the pdb
interactions directly. This allow the ACB_ flags specifed to be transferred
direct to the backend, without interference.
Doco:
I've updated the doco to reflect some of the changes, and removed some paramters
no longer applicable to HEAD.
(This used to be commit ff354c99c585068af6dc1ff35a1f109a806b326b)
2002-01-20 17:30:58 +03:00
fprintf ( stderr , " user %s does not exist in the passdb \n " , username ) ;
return - 1 ;
}
2002-04-13 12:16:41 +04:00
return in - > pdb_delete_sam_account ( in , samaccount ) ;
2000-12-06 21:18:48 +03:00
}
/*********************************************************
Delete machine entry
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-09-28 01:20:14 +04:00
2002-04-13 12:16:41 +04:00
static int delete_machine_entry ( struct pdb_context * in , char * machinename )
2000-12-06 21:18:48 +03:00
{
char name [ 16 ] ;
2002-01-31 14:38:47 +03:00
SAM_ACCOUNT * samaccount = NULL ;
2000-12-06 21:18:48 +03:00
safe_strcpy ( name , machinename , 16 ) ;
if ( name [ strlen ( name ) ] ! = ' $ ' )
safe_strcat ( name , " $ " , 16 ) ;
This is another *BIG* change...
Samba now features a pluggable passdb interface, along the same lines as the
one in use in the auth subsystem. In this case, only one backend may be active
at a time by the 'normal' interface, and only one backend per passdb_context is
permitted outside that.
This pluggable interface is designed to allow any number of passdb backends to
be compiled in, with the selection at runtime. The 'passdb backend' paramater
has been created (and documented!) to support this.
As such, configure has been modfied to allow (for example) --with-ldap and the
old smbpasswd to be selected at the same time.
This patch also introduces two new backends: smbpasswd_nua and tdbsam_nua.
These two backends accept 'non unix accounts', where the user does *not* exist
in /etc/passwd. These accounts' don't have UIDs in the unix sense, but to
avoid conflicts in the algroitmic mapping of RIDs, they use the values
specified in the 'non unix account range' paramter - in the same way as the
winbind ranges are specifed.
While I was at it, I cleaned up some of the code in pdb_tdb (code copied
directly from smbpasswd and not really considered properly). Most of this was
to do with % macro expansion on stored data. It isn't easy to get the macros
into the tdb, and the first password change will 'expand' them. tdbsam needs
to use a similar system to pdb_ldap in this regard.
This patch only makes minor adjustments to pdb_nisplus and pdb_ldap, becouse I
don't have the test facilities for these. I plan to incoroprate at least
pdb_ldap into this scheme after consultation with Jerry.
Each (converted) passdb module now no longer has any 'static' variables, and
only exports 1 init function outside its .c file.
The non-unix-account support in this patch has been proven! It is now possible
to join a win2k machine to a Samba PDC without an account in /etc/passwd!
Other changes:
Minor interface adjustments:
pdb_delete_sam_account() now takes a SAM_ACCOUNT, not a char*.
pdb_update_sam_account() no longer takes the 'override' argument that was being
ignored so often (every other passdb backend). Extra checks have been added in
some places.
Minor code changes:
smbpasswd no longer attempts to initialise the passdb at startup, this is
now done on first use.
pdbedit has lost some of its 'machine account' logic, as this behaviour is now
controlled by the passdb subsystem directly.
The samr subsystem no longer calls 'local password change', but does the pdb
interactions directly. This allow the ACB_ flags specifed to be transferred
direct to the backend, without interference.
Doco:
I've updated the doco to reflect some of the changes, and removed some paramters
no longer applicable to HEAD.
(This used to be commit ff354c99c585068af6dc1ff35a1f109a806b326b)
2002-01-20 17:30:58 +03:00
2002-01-31 14:38:47 +03:00
if ( ! NT_STATUS_IS_OK ( pdb_init_sam ( & samaccount ) ) ) {
return - 1 ;
}
This is another *BIG* change...
Samba now features a pluggable passdb interface, along the same lines as the
one in use in the auth subsystem. In this case, only one backend may be active
at a time by the 'normal' interface, and only one backend per passdb_context is
permitted outside that.
This pluggable interface is designed to allow any number of passdb backends to
be compiled in, with the selection at runtime. The 'passdb backend' paramater
has been created (and documented!) to support this.
As such, configure has been modfied to allow (for example) --with-ldap and the
old smbpasswd to be selected at the same time.
This patch also introduces two new backends: smbpasswd_nua and tdbsam_nua.
These two backends accept 'non unix accounts', where the user does *not* exist
in /etc/passwd. These accounts' don't have UIDs in the unix sense, but to
avoid conflicts in the algroitmic mapping of RIDs, they use the values
specified in the 'non unix account range' paramter - in the same way as the
winbind ranges are specifed.
While I was at it, I cleaned up some of the code in pdb_tdb (code copied
directly from smbpasswd and not really considered properly). Most of this was
to do with % macro expansion on stored data. It isn't easy to get the macros
into the tdb, and the first password change will 'expand' them. tdbsam needs
to use a similar system to pdb_ldap in this regard.
This patch only makes minor adjustments to pdb_nisplus and pdb_ldap, becouse I
don't have the test facilities for these. I plan to incoroprate at least
pdb_ldap into this scheme after consultation with Jerry.
Each (converted) passdb module now no longer has any 'static' variables, and
only exports 1 init function outside its .c file.
The non-unix-account support in this patch has been proven! It is now possible
to join a win2k machine to a Samba PDC without an account in /etc/passwd!
Other changes:
Minor interface adjustments:
pdb_delete_sam_account() now takes a SAM_ACCOUNT, not a char*.
pdb_update_sam_account() no longer takes the 'override' argument that was being
ignored so often (every other passdb backend). Extra checks have been added in
some places.
Minor code changes:
smbpasswd no longer attempts to initialise the passdb at startup, this is
now done on first use.
pdbedit has lost some of its 'machine account' logic, as this behaviour is now
controlled by the passdb subsystem directly.
The samr subsystem no longer calls 'local password change', but does the pdb
interactions directly. This allow the ACB_ flags specifed to be transferred
direct to the backend, without interference.
Doco:
I've updated the doco to reflect some of the changes, and removed some paramters
no longer applicable to HEAD.
(This used to be commit ff354c99c585068af6dc1ff35a1f109a806b326b)
2002-01-20 17:30:58 +03:00
2002-04-13 12:16:41 +04:00
if ( ! in - > pdb_getsampwnam ( in , samaccount , name ) ) {
This is another *BIG* change...
Samba now features a pluggable passdb interface, along the same lines as the
one in use in the auth subsystem. In this case, only one backend may be active
at a time by the 'normal' interface, and only one backend per passdb_context is
permitted outside that.
This pluggable interface is designed to allow any number of passdb backends to
be compiled in, with the selection at runtime. The 'passdb backend' paramater
has been created (and documented!) to support this.
As such, configure has been modfied to allow (for example) --with-ldap and the
old smbpasswd to be selected at the same time.
This patch also introduces two new backends: smbpasswd_nua and tdbsam_nua.
These two backends accept 'non unix accounts', where the user does *not* exist
in /etc/passwd. These accounts' don't have UIDs in the unix sense, but to
avoid conflicts in the algroitmic mapping of RIDs, they use the values
specified in the 'non unix account range' paramter - in the same way as the
winbind ranges are specifed.
While I was at it, I cleaned up some of the code in pdb_tdb (code copied
directly from smbpasswd and not really considered properly). Most of this was
to do with % macro expansion on stored data. It isn't easy to get the macros
into the tdb, and the first password change will 'expand' them. tdbsam needs
to use a similar system to pdb_ldap in this regard.
This patch only makes minor adjustments to pdb_nisplus and pdb_ldap, becouse I
don't have the test facilities for these. I plan to incoroprate at least
pdb_ldap into this scheme after consultation with Jerry.
Each (converted) passdb module now no longer has any 'static' variables, and
only exports 1 init function outside its .c file.
The non-unix-account support in this patch has been proven! It is now possible
to join a win2k machine to a Samba PDC without an account in /etc/passwd!
Other changes:
Minor interface adjustments:
pdb_delete_sam_account() now takes a SAM_ACCOUNT, not a char*.
pdb_update_sam_account() no longer takes the 'override' argument that was being
ignored so often (every other passdb backend). Extra checks have been added in
some places.
Minor code changes:
smbpasswd no longer attempts to initialise the passdb at startup, this is
now done on first use.
pdbedit has lost some of its 'machine account' logic, as this behaviour is now
controlled by the passdb subsystem directly.
The samr subsystem no longer calls 'local password change', but does the pdb
interactions directly. This allow the ACB_ flags specifed to be transferred
direct to the backend, without interference.
Doco:
I've updated the doco to reflect some of the changes, and removed some paramters
no longer applicable to HEAD.
(This used to be commit ff354c99c585068af6dc1ff35a1f109a806b326b)
2002-01-20 17:30:58 +03:00
fprintf ( stderr , " user %s does not exist in the passdb \n " , name ) ;
return - 1 ;
}
2002-04-13 12:16:41 +04:00
return in - > pdb_delete_sam_account ( in , samaccount ) ;
2000-12-06 21:18:48 +03:00
}
/*********************************************************
Start here .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-09-28 01:20:14 +04:00
2000-12-06 21:18:48 +03:00
int main ( int argc , char * * argv )
{
2002-04-15 12:50:36 +04:00
static BOOL list_users = False ;
static BOOL verbose = False ;
static BOOL spstyle = False ;
static BOOL setparms = False ;
static BOOL machine = False ;
static BOOL add_user = False ;
static BOOL delete_user = False ;
static BOOL import = False ;
2002-04-13 12:16:41 +04:00
int opt ;
2002-04-15 12:50:36 +04:00
static char * full_name = NULL ;
static char * user_name = NULL ;
static char * home_dir = NULL ;
static char * home_drive = NULL ;
static char * backend_in = NULL ;
static char * backend_out = NULL ;
static char * logon_script = NULL ;
static char * profile_path = NULL ;
2002-05-10 18:40:55 +04:00
static char * config_file = dyn_CONFIGFILE ;
2002-05-24 13:57:48 +04:00
static char * new_debuglevel = NULL ;
2002-07-24 09:26:32 +04:00
static char * account_policy = NULL ;
2002-07-28 10:43:03 +04:00
static long int account_policy_value = 0 ;
BOOL account_policy_value_set = False ;
2002-04-15 12:50:36 +04:00
struct pdb_context * in ;
2002-04-13 12:16:41 +04:00
poptContext pc ;
struct poptOption long_options [ ] = {
POPT_AUTOHELP
{ " list " , ' l ' , POPT_ARG_VAL , & list_users , 1 , " list all users " , NULL } ,
{ " verbose " , ' v ' , POPT_ARG_VAL , & verbose , 1 , " be verbose " , NULL } ,
{ " smbpasswd-style " , ' w ' , POPT_ARG_VAL , & spstyle , 1 , " give output in smbpasswd style " , NULL } ,
{ " user " , ' u ' , POPT_ARG_STRING , & user_name , 0 , " use username " , " USER " } ,
{ " fullname " , ' f ' , POPT_ARG_STRING , & full_name , 0 , " set full name " , NULL } ,
{ " homedir " , ' h ' , POPT_ARG_STRING , & home_dir , 0 , " set home directory " , NULL } ,
{ " drive " , ' d ' , POPT_ARG_STRING , & home_drive , 0 , " set home drive " , NULL } ,
{ " script " , ' s ' , POPT_ARG_STRING , & logon_script , 0 , " set logon script " , NULL } ,
{ " profile " , ' p ' , POPT_ARG_STRING , & profile_path , 0 , " set profile path " , NULL } ,
{ " create " , ' a ' , POPT_ARG_VAL , & add_user , 1 , " create user " , NULL } ,
{ " machine " , ' m ' , POPT_ARG_VAL , & machine , 1 , " account is a machine account " , NULL } ,
{ " delete " , ' x ' , POPT_ARG_VAL , & delete_user , 1 , " delete user " , NULL } ,
{ " import " , ' i ' , POPT_ARG_STRING , & backend_in , 0 , " use different passdb backend " , NULL } ,
{ " export " , ' e ' , POPT_ARG_STRING , & backend_out , 0 , " export user accounts to backend " , NULL } ,
2002-07-28 10:43:03 +04:00
{ " debuglevel " , ' D ' , POPT_ARG_STRING , & new_debuglevel , 0 , " set debuglevel " , NULL } ,
{ " configfile " , ' c ' , POPT_ARG_STRING , & config_file , 0 , " use different configuration file " , NULL } ,
{ " account-policy " , ' P ' , POPT_ARG_STRING , & account_policy , 0 , " value of an account policy (like maximum password age) " , NULL } ,
{ " value " , ' V ' , POPT_ARG_LONG , & account_policy_value , ' V ' , " set the account policy to this value " , NULL } ,
2002-04-13 12:16:41 +04:00
{ 0 , 0 , 0 , 0 }
} ;
2002-07-24 09:26:32 +04:00
2002-04-13 12:16:41 +04:00
setup_logging ( " pdbedit " , True ) ;
2002-07-24 09:26:32 +04:00
2002-04-13 12:16:41 +04:00
pc = poptGetContext ( NULL , argc , ( const char * * ) argv , long_options ,
2002-07-24 09:26:32 +04:00
POPT_CONTEXT_KEEP_FIRST ) ;
2002-07-28 10:43:03 +04:00
while ( ( opt = poptGetNextOpt ( pc ) ) ! = - 1 ) {
switch ( opt ) {
case ' V ' :
account_policy_value_set = True ;
break ;
}
}
2002-07-24 09:26:32 +04:00
2002-05-24 13:57:48 +04:00
if ( new_debuglevel ) {
debug_parse_levels ( new_debuglevel ) ;
AllowDebugChange = False ;
2002-04-26 20:16:14 +04:00
}
2002-07-24 09:26:32 +04:00
2002-05-10 18:40:55 +04:00
if ( ! lp_load ( config_file , True , False , False ) ) {
fprintf ( stderr , " Can't load %s - run testparm to debug it \n " ,
2002-07-24 09:26:32 +04:00
config_file ) ;
2002-05-10 18:40:55 +04:00
exit ( 1 ) ;
}
2002-07-24 09:26:32 +04:00
2002-04-13 12:16:41 +04:00
setparms = ( full_name | | home_dir | | home_drive | | logon_script | | profile_path ) ;
2002-07-24 09:26:32 +04:00
if ( ( ( add_user ? 1 : 0 ) + ( delete_user ? 1 : 0 ) + ( list_users ? 1 : 0 ) + ( import ? 1 : 0 ) + ( setparms ? 1 : 0 ) ) + ( backend_out ? 1 : 0 ) + ( account_policy ? 1 : 0 ) > 1 ) {
2002-04-13 12:16:41 +04:00
fprintf ( stderr , " Incompatible options on command line! \n " ) ;
This is another *BIG* change...
Samba now features a pluggable passdb interface, along the same lines as the
one in use in the auth subsystem. In this case, only one backend may be active
at a time by the 'normal' interface, and only one backend per passdb_context is
permitted outside that.
This pluggable interface is designed to allow any number of passdb backends to
be compiled in, with the selection at runtime. The 'passdb backend' paramater
has been created (and documented!) to support this.
As such, configure has been modfied to allow (for example) --with-ldap and the
old smbpasswd to be selected at the same time.
This patch also introduces two new backends: smbpasswd_nua and tdbsam_nua.
These two backends accept 'non unix accounts', where the user does *not* exist
in /etc/passwd. These accounts' don't have UIDs in the unix sense, but to
avoid conflicts in the algroitmic mapping of RIDs, they use the values
specified in the 'non unix account range' paramter - in the same way as the
winbind ranges are specifed.
While I was at it, I cleaned up some of the code in pdb_tdb (code copied
directly from smbpasswd and not really considered properly). Most of this was
to do with % macro expansion on stored data. It isn't easy to get the macros
into the tdb, and the first password change will 'expand' them. tdbsam needs
to use a similar system to pdb_ldap in this regard.
This patch only makes minor adjustments to pdb_nisplus and pdb_ldap, becouse I
don't have the test facilities for these. I plan to incoroprate at least
pdb_ldap into this scheme after consultation with Jerry.
Each (converted) passdb module now no longer has any 'static' variables, and
only exports 1 init function outside its .c file.
The non-unix-account support in this patch has been proven! It is now possible
to join a win2k machine to a Samba PDC without an account in /etc/passwd!
Other changes:
Minor interface adjustments:
pdb_delete_sam_account() now takes a SAM_ACCOUNT, not a char*.
pdb_update_sam_account() no longer takes the 'override' argument that was being
ignored so often (every other passdb backend). Extra checks have been added in
some places.
Minor code changes:
smbpasswd no longer attempts to initialise the passdb at startup, this is
now done on first use.
pdbedit has lost some of its 'machine account' logic, as this behaviour is now
controlled by the passdb subsystem directly.
The samr subsystem no longer calls 'local password change', but does the pdb
interactions directly. This allow the ACB_ flags specifed to be transferred
direct to the backend, without interference.
Doco:
I've updated the doco to reflect some of the changes, and removed some paramters
no longer applicable to HEAD.
(This used to be commit ff354c99c585068af6dc1ff35a1f109a806b326b)
2002-01-20 17:30:58 +03:00
exit ( 1 ) ;
}
2002-07-24 09:26:32 +04:00
if ( account_policy ) {
uint32 value ;
int field = account_policy_name_to_feildnum ( account_policy ) ;
if ( field = = 0 ) {
fprintf ( stderr , " No account policy by that name \n " ) ;
exit ( 1 ) ;
}
if ( ! account_policy_get ( field , & value ) ) {
fprintf ( stderr , " valid account policy, but unable to fetch value! \n " ) ;
exit ( 1 ) ;
}
2002-07-28 10:43:03 +04:00
if ( account_policy_value_set ) {
printf ( " account policy value for %s was %u \n " , account_policy , value ) ;
if ( ! account_policy_set ( field , account_policy_value ) ) {
fprintf ( stderr , " valid account policy, but unable to set value! \n " ) ;
exit ( 1 ) ;
}
printf ( " account policy value for %s is now %lu \n " , account_policy , account_policy_value ) ;
exit ( 0 ) ;
} else {
printf ( " account policy value for %s is %u \n " , account_policy , value ) ;
exit ( 0 ) ;
}
2002-07-24 09:26:32 +04:00
}
2002-04-15 12:50:36 +04:00
2002-06-14 06:58:03 +04:00
if ( ! backend_in ) {
if ( ! NT_STATUS_IS_OK ( make_pdb_context_list ( & in , lp_passdb_backend ( ) ) ) ) {
fprintf ( stderr , " Can't initialize passdb backend. \n " ) ;
return 1 ;
}
} else {
if ( ! NT_STATUS_IS_OK ( make_pdb_context_string ( & in , backend_in ) ) ) {
fprintf ( stderr , " Can't initialize passdb backend. \n " ) ;
return 1 ;
}
2000-12-06 21:18:48 +03:00
}
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 )
2002-04-13 12:16:41 +04:00
return new_machine ( in , user_name ) ;
2001-09-28 01:20:14 +04:00
else
2002-04-15 12:50:36 +04:00
return new_user ( in , 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 )
2002-04-13 12:16:41 +04:00
return delete_machine_entry ( in , user_name ) ;
2001-09-28 01:20:14 +04:00
else
2002-04-13 12:16:41 +04:00
return delete_user_entry ( in , user_name ) ;
2000-12-06 21:18:48 +03:00
}
2002-04-15 12:50:36 +04:00
2001-09-28 01:20:14 +04:00
if ( user_name ) {
if ( setparms )
2002-04-15 12:50:36 +04:00
return set_user_info ( in , user_name , full_name ,
home_dir ,
home_drive ,
logon_script ,
profile_path ) ;
2001-09-28 01:20:14 +04:00
else
2002-04-15 12:50:36 +04:00
return print_user_info ( in , user_name , verbose ,
spstyle ) ;
2000-12-06 21:18:48 +03:00
}
if ( list_users )
2002-04-13 12:16:41 +04:00
return print_users_list ( in , verbose , spstyle ) ;
if ( backend_out )
return export_database ( in , backend_out ) ;
2002-04-15 12:50:36 +04:00
2002-04-13 12:16:41 +04:00
poptPrintHelp ( pc , stderr , 0 ) ;
2002-04-15 12:50:36 +04:00
2002-04-13 12:16:41 +04:00
return 1 ;
2000-12-06 21:18:48 +03:00
}
2002-04-15 12:50:36 +04:00