1998-03-08 17:14:49 +03:00
/*
Unix SMB / Netbios implementation .
Version 1.9 .
1998-03-14 15:57:58 +03:00
Samba Web Administration Tool
1998-03-08 17:14:49 +03:00
Copyright ( C ) Andrew Tridgell 1997 - 1998
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 .
*/
# ifdef SYSLOG
# undef SYSLOG
# endif
# include "includes.h"
# include "smb.h"
1998-03-14 11:29:06 +03:00
# define GLOBALS_SNUM -1
1998-03-08 17:14:49 +03:00
static pstring servicesf = CONFIGFILE ;
1998-11-12 10:13:06 +03:00
static BOOL demo_mode = False ;
1998-03-08 17:14:49 +03:00
1998-11-12 00:37:44 +03:00
/*
* Password Management Globals
*/
1998-11-12 10:06:48 +03:00
# define USER "username"
# define OLD_PSWD "old_passwd"
# define NEW_PSWD "new_passwd"
# define NEW2_PSWD "new2_passwd"
1998-11-12 21:44:16 +03:00
# define CHG_S_PASSWD_FLAG "chg_s_passwd_flag"
# define CHG_R_PASSWD_FLAG "chg_r_passwd_flag"
1998-11-12 10:06:48 +03:00
# define ADD_USER_FLAG "add_user_flag"
# define DISABLE_USER_FLAG "disable_user_flag"
# define ENABLE_USER_FLAG "enable_user_flag"
1998-11-12 21:44:16 +03:00
# define RHOST "remote_host"
1998-03-08 17:14:49 +03:00
1998-03-10 09:42:36 +03:00
/* we need these because we link to locking*.o */
void become_root ( BOOL save_dir ) { }
void unbecome_root ( BOOL restore_dir ) { }
1998-11-12 00:37:44 +03:00
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-05-08 05:45:12 +04:00
static int enum_index ( int value , struct enum_list * enumlist )
{
int i ;
for ( i = 0 ; enumlist [ i ] . name ; i + + )
if ( value = = enumlist [ i ] . value ) break ;
return ( i ) ;
}
1998-05-08 20:59:30 +04:00
static char * fix_backslash ( char * str )
1998-05-08 05:45:12 +04:00
{
static char newstring [ 1024 ] ;
char * p = newstring ;
1998-05-08 20:59:30 +04:00
while ( * str ) {
if ( * str = = ' \\ ' ) { * p + + = ' \\ ' ; * p + + = ' \\ ' ; }
else * p + + = * str ;
+ + str ;
1998-05-08 05:45:12 +04:00
}
1998-11-11 04:54:31 +03:00
* p = ' \0 ' ;
return newstring ;
}
static char * stripspace ( char * str )
{
static char newstring [ 1024 ] ;
char * p = newstring ;
while ( * str ) {
if ( * str ! = ' ' ) * p + + = * str ;
+ + str ;
}
* p = ' \0 ' ;
1998-05-08 05:45:12 +04:00
return newstring ;
}
static char * make_parm_name ( char * label )
{
1998-11-12 10:06:48 +03:00
static char parmname [ 1024 ] ;
char * p = parmname ;
1998-05-08 05:45:12 +04:00
while ( * label ) {
if ( * label = = ' ' ) * p + + = ' _ ' ;
else * p + + = * label ;
+ + label ;
}
1998-11-11 04:54:31 +03:00
* p = ' \0 ' ;
1998-05-08 05:45:12 +04:00
return parmname ;
}
1998-03-10 09:42:36 +03:00
1998-11-12 00:37:44 +03:00
/****************************************************************************
include a lump of html in a page
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-09-01 10:03:03 +04:00
static int include_html ( char * fname )
1998-03-08 17:14:49 +03:00
{
FILE * f = fopen ( fname , " r " ) ;
char buf [ 1024 ] ;
int ret ;
if ( ! f ) {
printf ( " ERROR: Can't open %s \n " , fname ) ;
1998-09-01 10:03:03 +04:00
return 0 ;
1998-03-08 17:14:49 +03:00
}
while ( ! feof ( f ) ) {
ret = fread ( buf , 1 , sizeof ( buf ) , f ) ;
if ( ret < = 0 ) break ;
fwrite ( buf , 1 , ret , stdout ) ;
}
fclose ( f ) ;
1998-09-01 10:03:03 +04:00
return 1 ;
}
1998-11-12 00:37:44 +03:00
/****************************************************************************
start the page with standard stuff
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-09-01 10:03:03 +04:00
static void print_header ( void )
{
if ( ! cgi_waspost ( ) ) {
printf ( " Expires: 0 \r \n " ) ;
}
printf ( " Content-type: text/html \r \n \r \n " ) ;
if ( ! include_html ( " include/header.html " ) ) {
printf ( " <!DOCTYPE HTML PUBLIC \" -//W3C//DTD HTML 3.2//EN \" > \n " ) ;
1998-09-02 06:02:30 +04:00
printf ( " <HTML> \n <HEAD> \n <TITLE>Samba Web Administration Tool</TITLE> \n </HEAD> \n <BODY background= \" /swat/images/background.jpg \" > \n \n " ) ;
1998-09-01 10:03:03 +04:00
}
1998-03-08 17:14:49 +03:00
}
1998-11-12 00:37:44 +03:00
/****************************************************************************
finish off the page
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-09-01 10:03:03 +04:00
static void print_footer ( void )
{
if ( ! include_html ( " include/footer.html " ) ) {
printf ( " \n </BODY> \n </HTML> \n " ) ;
}
}
1998-11-12 00:37:44 +03:00
/****************************************************************************
display one editable parameter in a form
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-03-08 17:14:49 +03:00
static void show_parameter ( int snum , struct parm_struct * parm )
{
int i ;
void * ptr = parm - > ptr ;
1998-03-14 11:29:06 +03:00
if ( parm - > class = = P_LOCAL & & snum > = 0 ) {
1998-03-08 17:14:49 +03:00
ptr = lp_local_ptr ( snum , ptr ) ;
}
1998-11-11 04:54:31 +03:00
printf ( " <tr><td><A HREF= \" /swat/help/smb.conf.5.html#%s \" >?</A> %s</td><td> " ,
stripspace ( parm - > label ) , parm - > label ) ;
1998-03-08 17:14:49 +03:00
switch ( parm - > type ) {
case P_CHAR :
printf ( " <input type=text size=2 name= \" parm_%s \" value= \" %c \" > " ,
1998-05-08 05:45:12 +04:00
make_parm_name ( parm - > label ) , * ( char * ) ptr ) ;
printf ( " <input type=button value= \" Set Default \" onClick= \" swatform.parm_%s.value= \' %c \' \" > " ,
make_parm_name ( parm - > label ) , ( char ) ( parm - > def . cvalue ) ) ;
1998-03-08 17:14:49 +03:00
break ;
case P_STRING :
case P_USTRING :
printf ( " <input type=text size=40 name= \" parm_%s \" value= \" %s \" > " ,
1998-05-08 05:45:12 +04:00
make_parm_name ( parm - > label ) , * ( char * * ) ptr ) ;
printf ( " <input type=button value= \" Set Default \" onClick= \" swatform.parm_%s.value= \' %s \' \" > " ,
make_parm_name ( parm - > label ) , fix_backslash ( ( char * ) ( parm - > def . svalue ) ) ) ;
1998-03-08 17:14:49 +03:00
break ;
case P_GSTRING :
case P_UGSTRING :
printf ( " <input type=text size=40 name= \" parm_%s \" value= \" %s \" > " ,
1998-05-08 05:45:12 +04:00
make_parm_name ( parm - > label ) , ( char * ) ptr ) ;
printf ( " <input type=button value= \" Set Default \" onClick= \" swatform.parm_%s.value= \' %s \' \" > " ,
make_parm_name ( parm - > label ) , fix_backslash ( ( char * ) ( parm - > def . svalue ) ) ) ;
1998-03-08 17:14:49 +03:00
break ;
case P_BOOL :
1998-05-08 05:45:12 +04:00
printf ( " <select name= \" parm_%s \" > " , make_parm_name ( parm - > label ) ) ;
printf ( " <option %s>Yes " , ( * ( BOOL * ) ptr ) ? " selected " : " " ) ;
printf ( " <option %s>No " , ( * ( BOOL * ) ptr ) ? " " : " selected " ) ;
printf ( " </select> " ) ;
printf ( " <input type=button value= \" Set Default \" onClick= \" swatform.parm_%s.selectedIndex= \' %d \' \" > " ,
make_parm_name ( parm - > label ) , ( BOOL ) ( parm - > def . bvalue ) ? 0 : 1 ) ;
1998-03-08 17:14:49 +03:00
break ;
case P_BOOLREV :
1998-05-08 05:45:12 +04:00
printf ( " <select name= \" parm_%s \" > " , make_parm_name ( parm - > label ) ) ;
printf ( " <option %s>Yes " , ( * ( BOOL * ) ptr ) ? " " : " selected " ) ;
printf ( " <option %s>No " , ( * ( BOOL * ) ptr ) ? " selected " : " " ) ;
printf ( " </select> " ) ;
printf ( " <input type=button value= \" Set Default \" onClick= \" swatform.parm_%s.selectedIndex= \' %d \' \" > " ,
make_parm_name ( parm - > label ) , ( BOOL ) ( parm - > def . bvalue ) ? 1 : 0 ) ;
1998-03-08 17:14:49 +03:00
break ;
case P_INTEGER :
1998-05-08 05:45:12 +04:00
printf ( " <input type=text size=8 name= \" parm_%s \" value=%d> " , make_parm_name ( parm - > label ) , * ( int * ) ptr ) ;
printf ( " <input type=button value= \" Set Default \" onClick= \" swatform.parm_%s.value= \' %d \' \" > " ,
make_parm_name ( parm - > label ) , ( int ) ( parm - > def . ivalue ) ) ;
1998-03-08 17:14:49 +03:00
break ;
case P_OCTAL :
1998-05-08 05:45:12 +04:00
printf ( " <input type=text size=8 name= \" parm_%s \" value=0%o> " , make_parm_name ( parm - > label ) , * ( int * ) ptr ) ;
printf ( " <input type=button value= \" Set Default \" onClick= \" swatform.parm_%s.value= \' 0%o \' \" > " ,
make_parm_name ( parm - > label ) , ( int ) ( parm - > def . ivalue ) ) ;
1998-03-08 17:14:49 +03:00
break ;
case P_ENUM :
1998-05-08 05:45:12 +04:00
printf ( " <select name= \" parm_%s \" > " , make_parm_name ( parm - > label ) ) ;
1998-03-08 17:14:49 +03:00
for ( i = 0 ; parm - > enum_list [ i ] . name ; i + + )
1998-05-08 05:45:12 +04:00
printf ( " <option %s>%s " , ( * ( int * ) ptr ) = = parm - > enum_list [ i ] . value ? " selected " : " " , parm - > enum_list [ i ] . name ) ;
printf ( " </select> " ) ;
printf ( " <input type=button value= \" Set Default \" onClick= \" swatform.parm_%s.selectedIndex= \' %d \' \" > " ,
make_parm_name ( parm - > label ) , enum_index ( ( int ) ( parm - > def . ivalue ) , parm - > enum_list ) ) ;
1998-03-08 17:14:49 +03:00
break ;
1998-03-14 11:29:06 +03:00
case P_SEP :
break ;
1998-03-08 17:14:49 +03:00
}
printf ( " </td></tr> \n " ) ;
}
1998-11-12 00:37:44 +03:00
/****************************************************************************
display a set of parameters for a service
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-03-08 17:14:49 +03:00
static void show_parameters ( int snum , int allparameters , int advanced , int printers )
{
int i = 0 ;
struct parm_struct * parm ;
1998-03-14 11:29:06 +03:00
char * heading = NULL ;
char * last_heading = NULL ;
1998-03-08 17:14:49 +03:00
while ( ( parm = lp_next_parameter ( snum , & i , allparameters ) ) ) {
1998-03-14 11:29:06 +03:00
if ( snum < 0 & & parm - > class = = P_LOCAL & & ! ( parm - > flags & FLAG_GLOBAL ) )
continue ;
if ( parm - > class = = P_SEPARATOR ) {
heading = parm - > label ;
continue ;
}
1998-03-08 17:14:49 +03:00
if ( parm - > flags & FLAG_HIDE ) continue ;
if ( ! advanced ) {
1998-05-08 05:45:12 +04:00
if ( ! printers & & ! ( parm - > flags & FLAG_BASIC ) ) {
void * ptr = parm - > ptr ;
switch ( parm - > type ) {
case P_CHAR :
if ( * ( char * ) ptr = = ( char ) ( parm - > def . cvalue ) ) continue ;
break ;
case P_STRING :
case P_USTRING :
if ( ! strcmp ( * ( char * * ) ptr , ( char * ) ( parm - > def . svalue ) ) ) continue ;
break ;
case P_GSTRING :
case P_UGSTRING :
if ( ! strcmp ( ( char * ) ptr , ( char * ) ( parm - > def . svalue ) ) ) continue ;
break ;
case P_BOOL :
case P_BOOLREV :
if ( * ( BOOL * ) ptr = = ( BOOL ) ( parm - > def . bvalue ) ) continue ;
break ;
case P_INTEGER :
case P_OCTAL :
if ( * ( int * ) ptr = = ( int ) ( parm - > def . ivalue ) ) continue ;
break ;
case P_ENUM :
if ( * ( int * ) ptr = = ( int ) ( parm - > def . ivalue ) ) continue ;
break ;
case P_SEP :
continue ;
}
}
1998-03-08 17:14:49 +03:00
if ( printers & & ! ( parm - > flags & FLAG_PRINT ) ) continue ;
}
1998-03-14 11:29:06 +03:00
if ( heading & & heading ! = last_heading ) {
printf ( " <tr><td></td></tr><tr><td><b><u>%s</u></b></td></tr> \n " , heading ) ;
last_heading = heading ;
}
1998-03-08 17:14:49 +03:00
show_parameter ( snum , parm ) ;
}
}
1998-11-12 00:37:44 +03:00
/****************************************************************************
write a config file
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-03-17 14:44:16 +03:00
static void write_config ( FILE * f , BOOL show_defaults )
{
fprintf ( f , " # Samba config file created using SWAT \n " ) ;
1998-03-17 15:31:43 +03:00
fprintf ( f , " # from %s (%s) \n " , cgi_remote_host ( ) , cgi_remote_addr ( ) ) ;
1998-03-17 14:44:16 +03:00
fprintf ( f , " # Date: %s \n \n " , timestring ( ) ) ;
lp_dump ( f , show_defaults ) ;
}
1998-11-12 00:37:44 +03:00
/****************************************************************************
save and reoad the smb . conf config file
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-03-08 17:14:49 +03:00
static int save_reload ( void )
{
FILE * f ;
f = fopen ( servicesf , " w " ) ;
if ( ! f ) {
printf ( " failed to open %s for writing \n " , servicesf ) ;
return 0 ;
}
1998-03-17 14:44:16 +03:00
write_config ( f , False ) ;
1998-03-08 17:14:49 +03:00
fclose ( f ) ;
lp_killunused ( NULL ) ;
1998-03-14 11:29:06 +03:00
if ( ! lp_load ( servicesf , False , False , False ) ) {
1998-03-08 17:14:49 +03:00
printf ( " Can't reload %s \n " , servicesf ) ;
return 0 ;
}
return 1 ;
}
1998-11-12 00:37:44 +03:00
/****************************************************************************
commit one parameter
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-03-14 14:24:01 +03:00
static void commit_parameter ( int snum , struct parm_struct * parm , char * v )
{
int i ;
char * s ;
if ( snum < 0 & & parm - > class = = P_LOCAL ) {
/* this handles the case where we are changing a local
variable globally . We need to change the parameter in
all shares where it is currently set to the default */
for ( i = 0 ; i < lp_numservices ( ) ; i + + ) {
s = lp_servicename ( i ) ;
if ( s & & ( * s ) & & lp_is_default ( i , parm ) ) {
lp_do_parameter ( i , parm - > label , v ) ;
}
}
}
lp_do_parameter ( snum , parm - > label , v ) ;
}
1998-11-12 00:37:44 +03:00
/****************************************************************************
commit a set of parameters for a service
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-03-08 17:14:49 +03:00
static void commit_parameters ( int snum )
{
int i = 0 ;
struct parm_struct * parm ;
pstring label ;
char * v ;
while ( ( parm = lp_next_parameter ( snum , & i , 1 ) ) ) {
1998-05-11 10:35:45 +04:00
slprintf ( label , sizeof ( label ) - 1 , " parm_%s " , make_parm_name ( parm - > label ) ) ;
1998-03-08 17:14:49 +03:00
if ( ( v = cgi_variable ( label ) ) ) {
1998-03-14 14:24:01 +03:00
if ( parm - > flags & FLAG_HIDE ) continue ;
commit_parameter ( snum , parm , v ) ;
1998-03-08 17:14:49 +03:00
}
}
}
1998-11-12 00:37:44 +03:00
/****************************************************************************
load the smb . conf file into loadparm .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-03-08 17:14:49 +03:00
static void load_config ( void )
{
1998-03-14 11:29:06 +03:00
if ( ! lp_load ( servicesf , False , True , False ) ) {
1998-03-08 17:14:49 +03:00
printf ( " <b>Can't load %s - using defaults</b><p> \n " ,
servicesf ) ;
}
}
1998-11-12 00:37:44 +03:00
/****************************************************************************
spit out the html for a link with an image
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void image_link ( char * name , char * hlink , char * src )
1998-03-08 17:14:49 +03:00
{
1998-11-12 00:37:44 +03:00
printf ( " <A HREF= \" %s/%s \" ><img src= \" /swat/%s \" alt= \" %s \" ></A> \n " ,
cgi_baseurl ( ) , hlink , src , name ) ;
1998-03-08 17:14:49 +03:00
}
1998-11-12 00:37:44 +03:00
/****************************************************************************
display the main navigation controls at the top of each page along
with a title
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-03-08 17:14:49 +03:00
static void show_main_buttons ( void )
{
1998-11-12 00:37:44 +03:00
image_link ( " Home " , " " , " images/home.gif " ) ;
/* Root gets full functionality */
1998-11-12 10:28:29 +03:00
if ( demo_mode | | am_root ( ) ) {
1998-11-12 00:37:44 +03:00
image_link ( " Globals " , " globals " , " images/globals.gif " ) ;
image_link ( " Shares " , " shares " , " images/shares.gif " ) ;
image_link ( " Printers " , " printers " , " images/printers.gif " ) ;
image_link ( " Status " , " status " , " images/status.gif " ) ;
image_link ( " View Config " , " viewconfig " , " images/viewconfig.gif " ) ;
}
/* Everyone gets this functionality */
image_link ( " Password Management " , " passwd " , " images/passwd.gif " ) ;
1998-03-08 17:14:49 +03:00
printf ( " <HR> \n " ) ;
}
1998-11-12 00:37:44 +03:00
/****************************************************************************
display a welcome page
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-03-08 17:14:49 +03:00
static void welcome_page ( void )
{
include_html ( " help/welcome.html " ) ;
}
1998-11-12 00:37:44 +03:00
/****************************************************************************
display the current smb . conf
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-03-14 11:29:06 +03:00
static void viewconfig_page ( void )
{
1998-03-17 14:44:16 +03:00
int full_view = 0 ;
if ( cgi_variable ( " full_view " ) ) {
full_view = 1 ;
}
1998-03-14 11:29:06 +03:00
printf ( " <H2>Current Config</H2> \n " ) ;
1998-03-17 14:44:16 +03:00
printf ( " <form method=post> \n " ) ;
if ( full_view ) {
printf ( " <input type=submit name= \" normal_view \" value= \" Normal View \" > \n " ) ;
} else {
printf ( " <input type=submit name= \" full_view \" value= \" Full View \" > \n " ) ;
}
printf ( " <p><pre> " ) ;
1998-03-17 17:46:17 +03:00
write_config ( stdout , full_view ) ;
1998-03-14 11:29:06 +03:00
printf ( " </pre> " ) ;
1998-03-17 14:44:16 +03:00
printf ( " </form> \n " ) ;
1998-03-14 11:29:06 +03:00
}
1998-11-12 00:37:44 +03:00
/****************************************************************************
display a globals editing page
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-03-08 17:14:49 +03:00
static void globals_page ( void )
{
int advanced = 0 ;
printf ( " <H2>Global Variables</H2> \n " ) ;
if ( cgi_variable ( " Advanced " ) & & ! cgi_variable ( " Basic " ) )
advanced = 1 ;
if ( cgi_variable ( " Commit " ) ) {
commit_parameters ( GLOBALS_SNUM ) ;
1998-03-14 11:29:06 +03:00
save_reload ( ) ;
1998-03-08 17:14:49 +03:00
}
1998-05-08 05:45:12 +04:00
printf ( " <FORM name= \" swatform \" method=post> \n " ) ;
1998-03-08 17:14:49 +03:00
printf ( " <input type=submit name= \" Commit \" value= \" Commit Changes \" > \n " ) ;
1998-05-08 05:45:12 +04:00
printf ( " <input type=reset name= \" Reset Values \" value= \" Reset Values \" > \n " ) ;
1998-03-08 17:14:49 +03:00
if ( advanced = = 0 ) {
printf ( " <input type=submit name= \" Advanced \" value= \" Advanced View \" > \n " ) ;
} else {
printf ( " <input type=submit name= \" Basic \" value= \" Basic View \" > \n " ) ;
}
printf ( " <p> \n " ) ;
1998-03-14 11:29:06 +03:00
printf ( " <table> \n " ) ;
1998-03-08 17:14:49 +03:00
show_parameters ( GLOBALS_SNUM , 1 , advanced , 0 ) ;
1998-03-14 11:29:06 +03:00
printf ( " </table> \n " ) ;
1998-03-08 17:14:49 +03:00
if ( advanced ) {
printf ( " <input type=hidden name= \" Advanced \" value=1> \n " ) ;
}
1998-05-08 05:45:12 +04:00
printf ( " </FORM> \n " ) ;
1998-03-08 17:14:49 +03:00
}
1998-11-12 00:37:44 +03:00
/****************************************************************************
display a shares editing page
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-03-08 17:14:49 +03:00
static void shares_page ( void )
{
char * share = cgi_variable ( " share " ) ;
char * s ;
int snum = - 1 ;
int i ;
int advanced = 0 ;
if ( share )
snum = lp_servicenumber ( share ) ;
printf ( " <H2>Share Parameters</H2> \n " ) ;
if ( cgi_variable ( " Advanced " ) & & ! cgi_variable ( " Basic " ) )
advanced = 1 ;
if ( cgi_variable ( " Commit " ) & & snum > = 0 ) {
commit_parameters ( snum ) ;
1998-03-14 11:29:06 +03:00
save_reload ( ) ;
1998-03-08 17:14:49 +03:00
}
if ( cgi_variable ( " Delete " ) & & snum > = 0 ) {
lp_remove_service ( snum ) ;
save_reload ( ) ;
share = NULL ;
snum = - 1 ;
}
if ( cgi_variable ( " createshare " ) & & ( share = cgi_variable ( " newshare " ) ) ) {
1998-03-14 11:29:06 +03:00
lp_copy_service ( GLOBALS_SNUM , share ) ;
1998-03-08 17:14:49 +03:00
save_reload ( ) ;
snum = lp_servicenumber ( share ) ;
}
1998-05-08 05:45:12 +04:00
printf ( " <FORM name= \" swatform \" method=post> \n " ) ;
1998-03-08 17:14:49 +03:00
printf ( " <table> \n " ) ;
printf ( " <tr><td><input type=submit name=selectshare value= \" Choose Share \" ></td> \n " ) ;
printf ( " <td><select name=share> \n " ) ;
if ( snum < 0 )
printf ( " <option value= \" \" > \n " ) ;
for ( i = 0 ; i < lp_numservices ( ) ; i + + ) {
s = lp_servicename ( i ) ;
1998-03-08 17:52:45 +03:00
if ( s & & ( * s ) & & strcmp ( s , " IPC$ " ) & & ! lp_print_ok ( i ) ) {
1998-03-08 17:14:49 +03:00
printf ( " <option %s value= \" %s \" >%s \n " ,
( share & & strcmp ( share , s ) = = 0 ) ? " SELECTED " : " " ,
s , s ) ;
}
}
printf ( " </select></td></tr><p> " ) ;
printf ( " <tr><td><input type=submit name=createshare value= \" Create Share \" ></td> \n " ) ;
printf ( " <td><input type=text size=30 name=newshare></td></tr> \n " ) ;
printf ( " </table> " ) ;
if ( snum > = 0 ) {
printf ( " <input type=submit name= \" Commit \" value= \" Commit Changes \" > \n " ) ;
printf ( " <input type=submit name= \" Delete \" value= \" Delete Share \" > \n " ) ;
if ( advanced = = 0 ) {
printf ( " <input type=submit name= \" Advanced \" value= \" Advanced View \" > \n " ) ;
} else {
printf ( " <input type=submit name= \" Basic \" value= \" Basic View \" > \n " ) ;
}
printf ( " <p> \n " ) ;
}
if ( snum > = 0 ) {
1998-03-14 11:29:06 +03:00
printf ( " <table> \n " ) ;
1998-03-08 17:14:49 +03:00
show_parameters ( snum , 1 , advanced , 0 ) ;
1998-03-14 11:29:06 +03:00
printf ( " </table> \n " ) ;
1998-03-08 17:14:49 +03:00
}
if ( advanced ) {
printf ( " <input type=hidden name= \" Advanced \" value=1> \n " ) ;
}
printf ( " </FORM> \n " ) ;
}
1998-11-12 10:06:48 +03:00
/*************************************************************
change a password either locally or remotely
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static BOOL change_password ( const char * remote_machine , char * user_name ,
char * old_passwd , char * new_passwd ,
BOOL add_user , BOOL enable_user , BOOL disable_user )
1998-11-12 00:37:44 +03:00
{
1998-11-13 02:49:32 +03:00
BOOL ret = False ;
pstring err_str ;
pstring msg_str ;
1998-11-12 10:13:06 +03:00
if ( demo_mode ) {
printf ( " password change in demo mode rejected \n <p> " ) ;
return False ;
}
1998-11-12 10:06:48 +03:00
if ( remote_machine ! = NULL ) {
1998-11-13 02:49:32 +03:00
ret = remote_password_change ( remote_machine , user_name , old_passwd ,
new_passwd , err_str , sizeof ( err_str ) ) ;
if ( * err_str )
printf ( " %s \n <p> " , err_str ) ;
return ret ;
1998-11-12 00:37:44 +03:00
}
1998-11-12 10:06:48 +03:00
if ( ! initialize_password_db ( ) ) {
1998-11-12 10:13:06 +03:00
printf ( " Can't setup password database vectors. \n <p> " ) ;
1998-11-12 10:06:48 +03:00
return False ;
1998-11-12 00:37:44 +03:00
}
1998-11-13 02:49:32 +03:00
ret = local_password_change ( user_name , False , add_user , enable_user ,
disable_user , False , new_passwd , err_str , sizeof ( err_str ) ,
msg_str , sizeof ( msg_str ) ) ;
if ( * msg_str )
1998-11-13 02:59:59 +03:00
printf ( " %s \n <p> " , msg_str ) ;
1998-11-13 02:49:32 +03:00
if ( * err_str )
printf ( " %s \n <p> " , err_str ) ;
return ret ;
1998-11-12 00:37:44 +03:00
}
/****************************************************************************
do the stuff required to add or change a password
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void chg_passwd ( void )
{
1998-11-12 21:44:16 +03:00
char * host ;
1998-11-12 00:37:44 +03:00
BOOL rslt ;
/* Make sure users name has been specified */
1998-11-12 10:06:48 +03:00
if ( strlen ( cgi_variable ( USER ) ) = = 0 ) {
1998-11-12 00:37:44 +03:00
printf ( " <p> Must specify \" User Name \" \n " ) ;
return ;
}
/*
1998-11-12 04:22:07 +03:00
* smbpasswd doesn ' t require anything but the users name to disable or enable the user ,
1998-11-12 00:37:44 +03:00
* so if that ' s what we ' re doing , skip the rest of the checks
*/
1998-11-12 10:06:48 +03:00
if ( ! cgi_variable ( DISABLE_USER_FLAG ) & & ! cgi_variable ( ENABLE_USER_FLAG ) ) {
1998-11-12 00:37:44 +03:00
1998-11-12 21:44:16 +03:00
/*
* If current user is not root , make sure old password has been specified
* If REMOTE change , even root must provide old password
*/
if ( ( ( am_root ( ) = = False ) & & ( strlen ( cgi_variable ( OLD_PSWD ) ) < = 0 ) ) | |
( ( cgi_variable ( CHG_R_PASSWD_FLAG ) ) & & ( strlen ( cgi_variable ( OLD_PSWD ) ) < = 0 ) ) ) {
1998-11-12 00:37:44 +03:00
printf ( " <p> Must specify \" Old Password \" \n " ) ;
return ;
}
1998-11-12 21:44:16 +03:00
/* If changing a users password on a remote hosts we have to know what host */
if ( ( cgi_variable ( CHG_R_PASSWD_FLAG ) ) & & ( strlen ( cgi_variable ( RHOST ) ) < = 0 ) ) {
printf ( " <p> Must specify \" Remote Machine \" \n " ) ;
return ;
}
1998-11-12 00:37:44 +03:00
/* Make sure new passwords have been specified */
1998-11-12 10:06:48 +03:00
if ( ( strlen ( cgi_variable ( NEW_PSWD ) ) < = 0 ) | |
( strlen ( cgi_variable ( NEW2_PSWD ) ) < = 0 ) ) {
1998-11-12 00:37:44 +03:00
printf ( " <p> Must specify \" New, and Re-typed Passwords \" \n " ) ;
return ;
}
/* Make sure new passwords was typed correctly twice */
1998-11-12 10:06:48 +03:00
if ( strcmp ( cgi_variable ( NEW_PSWD ) , cgi_variable ( NEW2_PSWD ) ) ! = 0 ) {
1998-11-12 00:37:44 +03:00
printf ( " <p> Re-typed password didn't match new password \n " ) ;
return ;
}
}
1998-11-12 21:44:16 +03:00
if ( cgi_variable ( CHG_R_PASSWD_FLAG ) ) {
host = cgi_variable ( RHOST ) ;
} else if ( am_root ( ) ) {
host = NULL ;
} else {
host = " 127.0.0.1 " ;
}
rslt = change_password ( host ,
1998-11-12 10:06:48 +03:00
cgi_variable ( USER ) ,
cgi_variable ( OLD_PSWD ) , cgi_variable ( NEW_PSWD ) ,
cgi_variable ( ADD_USER_FLAG ) ? True : False ,
cgi_variable ( ENABLE_USER_FLAG ) ? True : False ,
cgi_variable ( DISABLE_USER_FLAG ) ? True : False ) ;
1998-11-12 00:37:44 +03:00
1998-11-12 10:06:48 +03:00
if ( rslt = = True ) {
printf ( " <p> The passwd for '%s' has been changed. \n " , cgi_variable ( USER ) ) ;
} else {
printf ( " <p> The passwd for '%s' has NOT been changed. \n " , cgi_variable ( USER ) ) ;
1998-11-12 00:37:44 +03:00
}
return ;
}
/****************************************************************************
display a password editing page
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void passwd_page ( void )
{
1998-11-12 10:32:33 +03:00
char * new_name = get_user_name ( ) ;
1998-11-12 00:37:44 +03:00
/*
* After the first time through here be nice . If the user
* changed the User box text to another users name , remember it .
*/
1998-11-12 10:32:33 +03:00
if ( cgi_variable ( USER ) ) {
1998-11-12 10:06:48 +03:00
new_name = cgi_variable ( USER ) ;
1998-11-12 10:32:33 +03:00
}
if ( ! new_name ) new_name = " " ;
1998-11-12 00:37:44 +03:00
1998-11-12 21:44:16 +03:00
printf ( " <H2>Server Password Management</H2> \n " ) ;
printf ( " <FORM name= \" swatform \" method=post> \n " ) ;
printf ( " <table> \n " ) ;
/*
* Create all the dialog boxes for data collection
*/
1998-11-13 01:17:51 +03:00
printf ( " <tr><td> User Name : </td> \n " ) ;
printf ( " <td><input type=text size=30 name=%s value=%s></td></tr> \n " , USER , new_name ) ;
1998-11-12 02:47:03 +03:00
if ( am_root ( ) = = False ) {
1998-11-13 01:17:51 +03:00
printf ( " <tr><td> Old Password : </td> \n " ) ;
printf ( " <td><input type=password size=30 name=%s></td></tr> \n " , OLD_PSWD ) ;
1998-11-12 00:37:44 +03:00
}
1998-11-13 01:17:51 +03:00
printf ( " <tr><td> New Password : </td> \n " ) ;
printf ( " <td><input type=password size=30 name=%s></td></tr> \n " , NEW_PSWD ) ;
printf ( " <tr><td> Re-type New Password : </td> \n " ) ;
printf ( " <td><input type=password size=30 name=%s></td></tr> \n " , NEW2_PSWD ) ;
1998-11-12 00:37:44 +03:00
1998-11-12 21:44:16 +03:00
/*
* Create all the control buttons for requesting action
*/
1998-11-13 01:17:51 +03:00
printf ( " <tr><td><input type=submit name=%s value= \" Change Password \" ></td></tr> \n " , CHG_S_PASSWD_FLAG ) ;
1998-11-12 02:47:03 +03:00
if ( am_root ( ) = = True ) {
1998-11-13 01:17:51 +03:00
printf ( " <tr><td><input type=submit name=%s value= \" Add New User \" ></td></tr> \n " , ADD_USER_FLAG ) ;
printf ( " <tr><td><input type=submit name=%s value= \" Disable User \" ></td></tr> \n " , DISABLE_USER_FLAG ) ;
printf ( " <tr><td><input type=submit name=%s value= \" Enable User \" ></td></tr> \n " , ENABLE_USER_FLAG ) ;
1998-11-12 00:37:44 +03:00
}
/*
1998-11-12 21:44:16 +03:00
* Do some work if change , add , disable or enable was requested . It could be
* this is the first time through this code , so there isn ' t anything to do .
1998-11-12 00:37:44 +03:00
*/
1998-11-12 21:44:16 +03:00
if ( ( cgi_variable ( CHG_S_PASSWD_FLAG ) ) | | ( cgi_variable ( ADD_USER_FLAG ) ) | |
( cgi_variable ( DISABLE_USER_FLAG ) ) | | ( cgi_variable ( ENABLE_USER_FLAG ) ) ) {
chg_passwd ( ) ;
}
1998-11-13 01:17:51 +03:00
printf ( " </table> \n " ) ;
1998-11-12 21:44:16 +03:00
printf ( " </FORM> \n " ) ;
printf ( " <H2>Client/Server Password Management</H2> \n " ) ;
printf ( " <FORM name= \" swatform \" method=post> \n " ) ;
printf ( " <table> \n " ) ;
/*
* Create all the dialog boxes for data collection
*/
1998-11-13 01:17:51 +03:00
printf ( " <tr><td> User Name : </td> \n " ) ;
printf ( " <td><input type=text size=30 name=%s value=%s></td></tr> \n " , USER , new_name ) ;
printf ( " <tr><td> Old Password : </td> \n " ) ;
printf ( " <td><input type=password size=30 name=%s></td></tr> \n " , OLD_PSWD ) ;
printf ( " <tr><td> New Password : </td> \n " ) ;
printf ( " <td><input type=password size=30 name=%s></td></tr> \n " , NEW_PSWD ) ;
printf ( " <tr><td> Re-type New Password : </td> \n " ) ;
printf ( " <td><input type=password size=30 name=%s></td></tr> \n " , NEW2_PSWD ) ;
printf ( " <tr><td> Remote Machine : </td> \n " ) ;
printf ( " <td><input type=password size=30 name=%s></td></tr> \n " , RHOST ) ;
1998-11-12 21:44:16 +03:00
/*
* Create all the control buttons for requesting action
*/
1998-11-13 01:17:51 +03:00
printf ( " <tr><td><input type=submit name=%s value= \" Change Password \" ></td></tr> " , CHG_R_PASSWD_FLAG ) ;
1998-11-12 21:44:16 +03:00
/*
* Do some work if a request has been made to change the password somewhere other
* than the server . It could be this is the first time through this code , so there
* isn ' t anything to do .
*/
if ( cgi_variable ( CHG_R_PASSWD_FLAG ) ) {
1998-11-12 00:37:44 +03:00
chg_passwd ( ) ;
}
printf ( " </table> " ) ;
printf ( " </FORM> \n " ) ;
}
/****************************************************************************
display a printers editing page
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-03-08 17:14:49 +03:00
static void printers_page ( void )
{
char * share = cgi_variable ( " share " ) ;
char * s ;
int snum = - 1 ;
int i ;
int advanced = 0 ;
if ( share )
snum = lp_servicenumber ( share ) ;
printf ( " <H2>Printer Parameters</H2> \n " ) ;
if ( cgi_variable ( " Advanced " ) & & ! cgi_variable ( " Basic " ) )
advanced = 1 ;
if ( cgi_variable ( " Commit " ) & & snum > = 0 ) {
commit_parameters ( snum ) ;
1998-03-14 11:29:06 +03:00
save_reload ( ) ;
1998-03-08 17:14:49 +03:00
}
if ( cgi_variable ( " Delete " ) & & snum > = 0 ) {
lp_remove_service ( snum ) ;
save_reload ( ) ;
share = NULL ;
snum = - 1 ;
}
if ( cgi_variable ( " createshare " ) & & ( share = cgi_variable ( " newshare " ) ) ) {
1998-03-14 11:29:06 +03:00
lp_copy_service ( GLOBALS_SNUM , share ) ;
1998-03-08 17:14:49 +03:00
snum = lp_servicenumber ( share ) ;
lp_do_parameter ( snum , " print ok " , " Yes " ) ;
save_reload ( ) ;
snum = lp_servicenumber ( share ) ;
}
1998-05-08 05:45:12 +04:00
printf ( " <FORM name= \" swatform \" method=post> \n " ) ;
1998-03-08 17:14:49 +03:00
printf ( " <table> \n " ) ;
printf ( " <tr><td><input type=submit name=selectshare value= \" Choose Printer \" ></td> \n " ) ;
printf ( " <td><select name=share> \n " ) ;
if ( snum < 0 | | ! lp_print_ok ( snum ) )
printf ( " <option value= \" \" > \n " ) ;
for ( i = 0 ; i < lp_numservices ( ) ; i + + ) {
s = lp_servicename ( i ) ;
if ( s & & ( * s ) & & strcmp ( s , " IPC$ " ) & & lp_print_ok ( i ) ) {
printf ( " <option %s value= \" %s \" >%s \n " ,
( share & & strcmp ( share , s ) = = 0 ) ? " SELECTED " : " " ,
s , s ) ;
}
}
printf ( " </select></td></tr><p> " ) ;
printf ( " <tr><td><input type=submit name=createshare value= \" Create Printer \" ></td> \n " ) ;
printf ( " <td><input type=text size=30 name=newshare></td></tr> \n " ) ;
printf ( " </table> " ) ;
if ( snum > = 0 ) {
printf ( " <input type=submit name= \" Commit \" value= \" Commit Changes \" > \n " ) ;
printf ( " <input type=submit name= \" Delete \" value= \" Delete Printer \" > \n " ) ;
if ( advanced = = 0 ) {
printf ( " <input type=submit name= \" Advanced \" value= \" Advanced View \" > \n " ) ;
} else {
printf ( " <input type=submit name= \" Basic \" value= \" Basic View \" > \n " ) ;
}
printf ( " <p> \n " ) ;
}
if ( snum > = 0 ) {
1998-03-14 11:29:06 +03:00
printf ( " <table> \n " ) ;
1998-03-08 17:14:49 +03:00
show_parameters ( snum , 1 , advanced , 1 ) ;
1998-03-14 11:29:06 +03:00
printf ( " </table> \n " ) ;
1998-03-08 17:14:49 +03:00
}
if ( advanced ) {
printf ( " <input type=hidden name= \" Advanced \" value=1> \n " ) ;
}
printf ( " </FORM> \n " ) ;
}
1998-11-12 00:37:44 +03:00
/****************************************************************************
MAIN ( )
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-09-21 15:34:44 +04:00
int main ( int argc , char * argv [ ] )
1998-03-08 17:14:49 +03:00
{
extern char * optarg ;
extern int optind ;
extern FILE * dbf ;
int opt ;
char * page ;
/* just in case it goes wild ... */
alarm ( 300 ) ;
dbf = fopen ( " /dev/null " , " w " ) ;
if ( ! dbf ) dbf = stderr ;
1998-03-08 17:31:50 +03:00
while ( ( opt = getopt ( argc , argv , " s:a " ) ) ! = EOF ) {
1998-03-08 17:14:49 +03:00
switch ( opt ) {
case ' s ' :
pstrcpy ( servicesf , optarg ) ;
break ;
1998-03-08 17:31:50 +03:00
case ' a ' :
1998-11-12 10:13:06 +03:00
demo_mode = True ;
1998-03-08 17:31:50 +03:00
break ;
1998-03-08 17:14:49 +03:00
}
}
1998-11-12 10:13:06 +03:00
cgi_setup ( SWATDIR , ! demo_mode ) ;
1998-03-08 17:14:49 +03:00
print_header ( ) ;
1998-03-14 07:13:24 +03:00
1998-03-08 17:14:49 +03:00
charset_initialise ( ) ;
/* if this binary is setuid then run completely as root */
setuid ( 0 ) ;
load_config ( ) ;
cgi_load_variables ( NULL ) ;
show_main_buttons ( ) ;
1998-03-14 07:13:24 +03:00
page = cgi_pathinfo ( ) ;
1998-03-08 17:14:49 +03:00
1998-11-12 00:37:44 +03:00
/* Root gets full functionality */
1998-11-12 10:13:06 +03:00
if ( demo_mode | | am_root ( ) ) {
1998-11-12 00:37:44 +03:00
if ( strcmp ( page , " globals " ) = = 0 ) {
globals_page ( ) ;
} else if ( strcmp ( page , " shares " ) = = 0 ) {
shares_page ( ) ;
} else if ( strcmp ( page , " printers " ) = = 0 ) {
printers_page ( ) ;
} else if ( strcmp ( page , " status " ) = = 0 ) {
status_page ( ) ;
} else if ( strcmp ( page , " viewconfig " ) = = 0 ) {
viewconfig_page ( ) ;
} else if ( strcmp ( page , " passwd " ) = = 0 ) {
passwd_page ( ) ;
} else {
welcome_page ( ) ;
}
1998-03-08 17:14:49 +03:00
} else {
1998-11-12 00:37:44 +03:00
/* Everyone gets this functionality */
if ( strcmp ( page , " passwd " ) = = 0 ) {
passwd_page ( ) ;
} else {
welcome_page ( ) ;
}
1998-03-08 17:14:49 +03:00
}
print_footer ( ) ;
return 0 ;
}