2004-08-18 16:47:08 +04:00
/*
Samba Unix / Linux SMB client library
Distributed SMB / CIFS Server Management Utility
Copyright ( C ) 2004 Stefan Metzmacher ( metze @ samba . org )
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"
2004-11-02 14:42:35 +03:00
# include "utils/net/net.h"
# include "libnet/libnet.h"
2005-02-10 08:09:35 +03:00
# include "system/filesys.h"
2004-11-02 06:13:06 +03:00
# include "system/passwd.h"
2004-08-18 16:47:08 +04:00
/*
* Code for Changing and setting a password
*/
2005-02-17 00:54:01 +03:00
static int net_password_change_usage ( struct net_context * ctx , int argc , const char * * argv )
{
d_printf ( " net_password_change_usage: TODO \n " ) ;
return 0 ;
}
2004-08-18 16:47:08 +04:00
static int net_password_change ( struct net_context * ctx , int argc , const char * * argv )
{
NTSTATUS status ;
struct libnet_context * libnetctx ;
union libnet_ChangePassword r ;
char * password_prompt = NULL ;
const char * new_password ;
if ( argc > 0 & & argv [ 0 ] ) {
new_password = argv [ 0 ] ;
} else {
2004-08-19 16:36:05 +04:00
password_prompt = talloc_asprintf ( ctx - > mem_ctx , " Enter new password for account [%s \\ %s]: " ,
2005-03-21 05:08:38 +03:00
cli_credentials_get_domain ( ctx - > credentials ) ,
2005-08-29 08:30:22 +04:00
cli_credentials_get_username ( ctx - > credentials , ctx - > mem_ctx ) ) ;
2004-08-18 16:47:08 +04:00
new_password = getpass ( password_prompt ) ;
}
2005-06-16 15:36:09 +04:00
libnetctx = libnet_context_init ( NULL ) ;
2004-08-18 16:47:08 +04:00
if ( ! libnetctx ) {
return - 1 ;
}
2005-06-04 01:30:07 +04:00
libnetctx - > cred = ctx - > credentials ;
2004-08-18 16:47:08 +04:00
/* prepare password change */
r . generic . level = LIBNET_CHANGE_PASSWORD_GENERIC ;
2005-08-29 08:30:22 +04:00
r . generic . in . account_name = cli_credentials_get_username ( ctx - > credentials , ctx - > mem_ctx ) ;
2005-03-21 05:08:38 +03:00
r . generic . in . domain_name = cli_credentials_get_domain ( ctx - > credentials ) ;
r . generic . in . oldpassword = cli_credentials_get_password ( ctx - > credentials ) ;
2004-08-18 16:47:08 +04:00
r . generic . in . newpassword = new_password ;
/* do password change */
status = libnet_ChangePassword ( libnetctx , ctx - > mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
DEBUG ( 0 , ( " net_password_change: %s \n " , r . generic . out . error_string ) ) ;
return - 1 ;
}
2005-06-16 15:36:09 +04:00
talloc_free ( libnetctx ) ;
2004-08-18 16:47:08 +04:00
return 0 ;
}
2005-02-17 00:54:01 +03:00
static int net_password_set_usage ( struct net_context * ctx , int argc , const char * * argv )
2004-08-18 16:47:08 +04:00
{
2005-02-17 00:54:01 +03:00
d_printf ( " net_password_set_usage: TODO \n " ) ;
2004-08-18 16:47:08 +04:00
return 0 ;
}
2005-02-17 00:54:01 +03:00
2004-08-20 13:55:21 +04:00
static int net_password_set ( struct net_context * ctx , int argc , const char * * argv )
{
NTSTATUS status ;
struct libnet_context * libnetctx ;
union libnet_SetPassword r ;
char * password_prompt = NULL ;
char * p ;
char * tmp ;
const char * account_name ;
const char * domain_name ;
const char * new_password = NULL ;
switch ( argc ) {
case 0 : /* no args -> fail */
2005-02-17 00:54:01 +03:00
return net_password_set_usage ( ctx , argc , argv ) ;
2004-08-20 13:55:21 +04:00
case 1 : /* only DOM\\user; prompt for password */
tmp = talloc_strdup ( ctx - > mem_ctx , argv [ 0 ] ) ;
break ;
case 2 : /* DOM\\USER and password */
tmp = talloc_strdup ( ctx - > mem_ctx , argv [ 0 ] ) ;
new_password = argv [ 1 ] ;
break ;
default : /* too mayn args -> fail */
DEBUG ( 0 , ( " net_password_set: too many args [%d] \n " , argc ) ) ;
2005-02-15 04:11:20 +03:00
return net_password_usage ( ctx , argc , argv ) ;
2004-08-20 13:55:21 +04:00
}
if ( ( p = strchr_m ( tmp , ' \\ ' ) ) ) {
* p = 0 ;
domain_name = tmp ;
account_name = talloc_strdup ( ctx - > mem_ctx , p + 1 ) ;
} else {
account_name = tmp ;
2005-03-21 05:08:38 +03:00
domain_name = cli_credentials_get_domain ( ctx - > credentials ) ;
2004-08-20 13:55:21 +04:00
}
if ( ! new_password ) {
password_prompt = talloc_asprintf ( ctx - > mem_ctx , " Enter new password for account [%s \\ %s]: " ,
domain_name , account_name ) ;
new_password = getpass ( password_prompt ) ;
}
2005-06-16 15:36:09 +04:00
libnetctx = libnet_context_init ( NULL ) ;
2004-08-20 13:55:21 +04:00
if ( ! libnetctx ) {
return - 1 ;
}
2005-06-04 01:30:07 +04:00
libnetctx - > cred = ctx - > credentials ;
2004-08-20 13:55:21 +04:00
/* prepare password change */
r . generic . level = LIBNET_SET_PASSWORD_GENERIC ;
r . generic . in . account_name = account_name ;
r . generic . in . domain_name = domain_name ;
r . generic . in . newpassword = new_password ;
/* do password change */
status = libnet_SetPassword ( libnetctx , ctx - > mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
DEBUG ( 0 , ( " net_password_set: %s \n " , r . generic . out . error_string ) ) ;
return - 1 ;
}
2005-06-16 15:36:09 +04:00
talloc_free ( libnetctx ) ;
2004-08-20 13:55:21 +04:00
return 0 ;
}
2004-12-23 07:09:25 +03:00
static const struct net_functable net_password_functable [ ] = {
2005-02-17 00:54:01 +03:00
{ " change " , " change password (old password required) \n " , net_password_change , net_password_change_usage } ,
{ " set " , " set password \n " , net_password_set , net_password_set_usage } ,
2004-08-18 16:47:08 +04:00
{ NULL , NULL }
} ;
int net_password ( struct net_context * ctx , int argc , const char * * argv )
{
return net_run_function ( ctx , argc , argv , net_password_functable , net_password_usage ) ;
}
int net_password_usage ( struct net_context * ctx , int argc , const char * * argv )
{
2005-02-15 04:11:20 +03:00
d_printf ( " net password <command> [options] \n " ) ;
2004-08-18 16:47:08 +04:00
return 0 ;
}