r492: BUG 483: patch from Michel Gravey <michel.gravey@optogone.com> to fix password...
[Samba/gebeck_regimport.git] / source3 / web / swat.c
blobed53d0d71281482ec4cbe823d4f2ecaab85585d4
1 /*
2 Unix SMB/CIFS implementation.
3 Samba Web Administration Tool
4 Version 3.0.0
5 Copyright (C) Andrew Tridgell 1997-2002
6 Copyright (C) John H Terpstra 2002
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 /**
24 * @defgroup swat SWAT - Samba Web Administration Tool
25 * @{
26 * @file swat.c
28 * @brief Samba Web Administration Tool.
29 **/
31 #include "includes.h"
32 #include "../web/swat_proto.h"
34 static BOOL demo_mode = False;
35 static BOOL have_write_access = False;
36 static BOOL have_read_access = False;
37 static int iNumNonAutoPrintServices = 0;
40 * Password Management Globals
42 #define SWAT_USER "username"
43 #define OLD_PSWD "old_passwd"
44 #define NEW_PSWD "new_passwd"
45 #define NEW2_PSWD "new2_passwd"
46 #define CHG_S_PASSWD_FLAG "chg_s_passwd_flag"
47 #define CHG_R_PASSWD_FLAG "chg_r_passwd_flag"
48 #define ADD_USER_FLAG "add_user_flag"
49 #define DELETE_USER_FLAG "delete_user_flag"
50 #define DISABLE_USER_FLAG "disable_user_flag"
51 #define ENABLE_USER_FLAG "enable_user_flag"
52 #define RHOST "remote_host"
55 /****************************************************************************
56 ****************************************************************************/
57 static int enum_index(int value, const struct enum_list *enumlist)
59 int i;
60 for (i=0;enumlist[i].name;i++)
61 if (value == enumlist[i].value) break;
62 return(i);
65 static char *fix_backslash(const char *str)
67 static char newstring[1024];
68 char *p = newstring;
70 while (*str) {
71 if (*str == '\\') {*p++ = '\\';*p++ = '\\';}
72 else *p++ = *str;
73 ++str;
75 *p = '\0';
76 return newstring;
79 static char *stripspaceupper(const char *str)
81 static char newstring[1024];
82 char *p = newstring;
84 while (*str) {
85 if (*str != ' ') *p++ = toupper(*str);
86 ++str;
88 *p = '\0';
89 return newstring;
92 static char *make_parm_name(const char *label)
94 static char parmname[1024];
95 char *p = parmname;
97 while (*label) {
98 if (*label == ' ') *p++ = '_';
99 else *p++ = *label;
100 ++label;
102 *p = '\0';
103 return parmname;
106 /****************************************************************************
107 include a lump of html in a page
108 ****************************************************************************/
109 static int include_html(const char *fname)
111 int fd;
112 char buf[1024];
113 int ret;
115 fd = web_open(fname, O_RDONLY, 0);
117 if (fd == -1) {
118 d_printf(_("ERROR: Can't open %s"), fname);
119 d_printf("\n");
120 return 0;
123 while ((ret = read(fd, buf, sizeof(buf))) > 0) {
124 write(1, buf, ret);
127 close(fd);
128 return 1;
131 /****************************************************************************
132 start the page with standard stuff
133 ****************************************************************************/
134 static void print_header(void)
136 if (!cgi_waspost()) {
137 d_printf("Expires: 0\r\n");
139 d_printf("Content-type: text/html\r\n\r\n");
141 if (!include_html("include/header.html")) {
142 d_printf("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2//EN\">\n");
143 d_printf("<HTML>\n<HEAD>\n<TITLE>Samba Web Administration Tool</TITLE>\n</HEAD>\n<BODY background=\"/swat/images/background.jpg\">\n\n");
147 /* *******************************************************************
148 show parameter label with translated name in the following form
149 because showing original and translated label in one line looks
150 too long, and showing translated label only is unusable for
151 heavy users.
152 -------------------------------
153 HELP security [combo box][button]
154 SECURITY
155 -------------------------------
156 (capital words are translated by gettext.)
157 if no translation is available, then same form as original is
158 used.
159 "i18n_translated_parm" class is used to change the color of the
160 translated parameter with CSS.
161 **************************************************************** */
162 static const char* get_parm_translated(
163 const char* pAnchor, const char* pHelp, const char* pLabel)
165 const char* pTranslated = _(pLabel);
166 static pstring output;
167 if(strcmp(pLabel, pTranslated) != 0)
169 pstr_sprintf(output,
170 "<A HREF=\"/swat/help/smb.conf.5.html#%s\" target=\"docs\"> %s</A>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %s <br><span class=\"i18n_translated_parm\">%s</span>",
171 pAnchor, pHelp, pLabel, pTranslated);
172 return output;
174 pstr_sprintf(output,
175 "<A HREF=\"/swat/help/smb.conf.5.html#%s\" target=\"docs\"> %s</A>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %s",
176 pAnchor, pHelp, pLabel);
177 return output;
179 /****************************************************************************
180 finish off the page
181 ****************************************************************************/
182 static void print_footer(void)
184 if (!include_html("include/footer.html")) {
185 d_printf("\n</BODY>\n</HTML>\n");
189 /****************************************************************************
190 display one editable parameter in a form
191 ****************************************************************************/
192 static void show_parameter(int snum, struct parm_struct *parm)
194 int i;
195 void *ptr = parm->ptr;
197 if (parm->class == P_LOCAL && snum >= 0) {
198 ptr = lp_local_ptr(snum, ptr);
201 d_printf("<tr><td>%s</td><td>", get_parm_translated(stripspaceupper(parm->label), _("Help"), parm->label));
202 switch (parm->type) {
203 case P_CHAR:
204 d_printf("<input type=text size=2 name=\"parm_%s\" value=\"%c\">",
205 make_parm_name(parm->label), *(char *)ptr);
206 d_printf("<input type=button value=\"%s\" onClick=\"swatform.parm_%s.value=\'%c\'\">",
207 _("Set Default"), make_parm_name(parm->label),(char)(parm->def.cvalue));
208 break;
210 case P_LIST:
211 d_printf("<input type=text size=40 name=\"parm_%s\" value=\"",
212 make_parm_name(parm->label));
213 if ((char ***)ptr && *(char ***)ptr && **(char ***)ptr) {
214 char **list = *(char ***)ptr;
215 for (;*list;list++) {
216 /* enclose in quotes if the string contains a space */
217 if ( strchr_m(*list, ' ') )
218 d_printf("\'%s\'%s", *list, ((*(list+1))?", ":""));
219 else
220 d_printf("%s%s", *list, ((*(list+1))?", ":""));
223 d_printf("\">");
224 d_printf("<input type=button value=\"%s\" onClick=\"swatform.parm_%s.value=\'",
225 _("Set Default"), make_parm_name(parm->label));
226 if (parm->def.lvalue) {
227 char **list = (char **)(parm->def.lvalue);
228 for (; *list; list++) {
229 /* enclose in quotes if the string contains a space */
230 if ( strchr_m(*list, ' ') )
231 d_printf("\'%s\'%s", *list, ((*(list+1))?", ":""));
232 else
233 d_printf("%s%s", *list, ((*(list+1))?", ":""));
236 d_printf("\'\">");
237 break;
239 case P_STRING:
240 case P_USTRING:
241 d_printf("<input type=text size=40 name=\"parm_%s\" value=\"%s\">",
242 make_parm_name(parm->label), *(char **)ptr);
243 d_printf("<input type=button value=\"%s\" onClick=\"swatform.parm_%s.value=\'%s\'\">",
244 _("Set Default"), make_parm_name(parm->label),fix_backslash((char *)(parm->def.svalue)));
245 break;
247 case P_GSTRING:
248 case P_UGSTRING:
249 d_printf("<input type=text size=40 name=\"parm_%s\" value=\"%s\">",
250 make_parm_name(parm->label), (char *)ptr);
251 d_printf("<input type=button value=\"%s\" onClick=\"swatform.parm_%s.value=\'%s\'\">",
252 _("Set Default"), make_parm_name(parm->label),fix_backslash((char *)(parm->def.svalue)));
253 break;
255 case P_BOOL:
256 d_printf("<select name=\"parm_%s\">",make_parm_name(parm->label));
257 d_printf("<option %s>Yes", (*(BOOL *)ptr)?"selected":"");
258 d_printf("<option %s>No", (*(BOOL *)ptr)?"":"selected");
259 d_printf("</select>");
260 d_printf("<input type=button value=\"%s\" onClick=\"swatform.parm_%s.selectedIndex=\'%d\'\">",
261 _("Set Default"), make_parm_name(parm->label),(BOOL)(parm->def.bvalue)?0:1);
262 break;
264 case P_BOOLREV:
265 d_printf("<select name=\"parm_%s\">",make_parm_name(parm->label));
266 d_printf("<option %s>Yes", (*(BOOL *)ptr)?"":"selected");
267 d_printf("<option %s>No", (*(BOOL *)ptr)?"selected":"");
268 d_printf("</select>");
269 d_printf("<input type=button value=\"%s\" onClick=\"swatform.parm_%s.selectedIndex=\'%d\'\">",
270 _("Set Default"), make_parm_name(parm->label),(BOOL)(parm->def.bvalue)?1:0);
271 break;
273 case P_INTEGER:
274 d_printf("<input type=text size=8 name=\"parm_%s\" value=\"%d\">", make_parm_name(parm->label), *(int *)ptr);
275 d_printf("<input type=button value=\"%s\" onClick=\"swatform.parm_%s.value=\'%d\'\">",
276 _("Set Default"), make_parm_name(parm->label),(int)(parm->def.ivalue));
277 break;
279 case P_OCTAL:
280 d_printf("<input type=text size=8 name=\"parm_%s\" value=%s>", make_parm_name(parm->label), octal_string(*(int *)ptr));
281 d_printf("<input type=button value=\"%s\" onClick=\"swatform.parm_%s.value=\'%s\'\">",
282 _("Set Default"), make_parm_name(parm->label),
283 octal_string((int)(parm->def.ivalue)));
284 break;
286 case P_ENUM:
287 d_printf("<select name=\"parm_%s\">",make_parm_name(parm->label));
288 for (i=0;parm->enum_list[i].name;i++) {
289 if (i == 0 || parm->enum_list[i].value != parm->enum_list[i-1].value) {
290 d_printf("<option %s>%s",(*(int *)ptr)==parm->enum_list[i].value?"selected":"",parm->enum_list[i].name);
293 d_printf("</select>");
294 d_printf("<input type=button value=\"%s\" onClick=\"swatform.parm_%s.selectedIndex=\'%d\'\">",
295 _("Set Default"), make_parm_name(parm->label),enum_index((int)(parm->def.ivalue),parm->enum_list));
296 break;
297 case P_SEP:
298 break;
300 d_printf("</td></tr>\n");
303 /****************************************************************************
304 display a set of parameters for a service
305 ****************************************************************************/
306 static void show_parameters(int snum, int allparameters, unsigned int parm_filter, int printers)
308 int i = 0;
309 struct parm_struct *parm;
310 const char *heading = NULL;
311 const char *last_heading = NULL;
313 while ((parm = lp_next_parameter(snum, &i, allparameters))) {
314 if (snum < 0 && parm->class == P_LOCAL && !(parm->flags & FLAG_GLOBAL))
315 continue;
316 if (parm->class == P_SEPARATOR) {
317 heading = parm->label;
318 continue;
320 if (parm->flags & FLAG_HIDE) continue;
321 if (snum >= 0) {
322 if (printers & !(parm->flags & FLAG_PRINT)) continue;
323 if (!printers & !(parm->flags & FLAG_SHARE)) continue;
326 if (!( parm_filter & FLAG_ADVANCED )) {
327 if (!(parm->flags & FLAG_BASIC)) {
328 void *ptr = parm->ptr;
330 if (parm->class == P_LOCAL && snum >= 0) {
331 ptr = lp_local_ptr(snum, ptr);
334 switch (parm->type) {
335 case P_CHAR:
336 if (*(char *)ptr == (char)(parm->def.cvalue)) continue;
337 break;
339 case P_LIST:
340 if (!str_list_compare(*(char ***)ptr, (char **)(parm->def.lvalue))) continue;
341 break;
343 case P_STRING:
344 case P_USTRING:
345 if (!strcmp(*(char **)ptr,(char *)(parm->def.svalue))) continue;
346 break;
348 case P_GSTRING:
349 case P_UGSTRING:
350 if (!strcmp((char *)ptr,(char *)(parm->def.svalue))) continue;
351 break;
353 case P_BOOL:
354 case P_BOOLREV:
355 if (*(BOOL *)ptr == (BOOL)(parm->def.bvalue)) continue;
356 break;
358 case P_INTEGER:
359 case P_OCTAL:
360 if (*(int *)ptr == (int)(parm->def.ivalue)) continue;
361 break;
364 case P_ENUM:
365 if (*(int *)ptr == (int)(parm->def.ivalue)) continue;
366 break;
367 case P_SEP:
368 continue;
371 if (printers && !(parm->flags & FLAG_PRINT)) continue;
374 if ((parm_filter & FLAG_WIZARD) && !(parm->flags & FLAG_WIZARD)) continue;
376 if ((parm_filter & FLAG_ADVANCED) && !(parm->flags & FLAG_ADVANCED)) continue;
378 if (heading && heading != last_heading) {
379 d_printf("<tr><td></td></tr><tr><td><b><u>%s</u></b></td></tr>\n", _(heading));
380 last_heading = heading;
382 show_parameter(snum, parm);
386 /****************************************************************************
387 load the smb.conf file into loadparm.
388 ****************************************************************************/
389 static BOOL load_config(BOOL save_def)
391 lp_resetnumservices();
392 return lp_load(dyn_CONFIGFILE,False,save_def,False);
395 /****************************************************************************
396 write a config file
397 ****************************************************************************/
398 static void write_config(FILE *f, BOOL show_defaults)
400 fprintf(f, "# Samba config file created using SWAT\n");
401 fprintf(f, "# from %s (%s)\n", cgi_remote_host(), cgi_remote_addr());
402 fprintf(f, "# Date: %s\n\n", timestring(False));
404 lp_dump(f, show_defaults, iNumNonAutoPrintServices);
407 /****************************************************************************
408 save and reload the smb.conf config file
409 ****************************************************************************/
410 static int save_reload(int snum)
412 FILE *f;
413 struct stat st;
415 f = sys_fopen(dyn_CONFIGFILE,"w");
416 if (!f) {
417 d_printf(_("failed to open %s for writing"), dyn_CONFIGFILE);
418 d_printf("\n");
419 return 0;
422 /* just in case they have used the buggy xinetd to create the file */
423 if (fstat(fileno(f), &st) == 0 &&
424 (st.st_mode & S_IWOTH)) {
425 #if defined HAVE_FCHMOD
426 fchmod(fileno(f), S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH);
427 #else
428 chmod(dyn_CONFIGFILE, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH);
429 #endif
432 write_config(f, False);
433 if (snum)
434 lp_dump_one(f, False, snum);
435 fclose(f);
437 lp_killunused(NULL);
439 if (!load_config(False)) {
440 d_printf(_("Can't reload %s"), dyn_CONFIGFILE);
441 d_printf("\n");
442 return 0;
444 iNumNonAutoPrintServices = lp_numservices();
445 load_printers();
447 return 1;
450 /****************************************************************************
451 commit one parameter
452 ****************************************************************************/
453 static void commit_parameter(int snum, struct parm_struct *parm, const char *v)
455 int i;
456 char *s;
458 if (snum < 0 && parm->class == P_LOCAL) {
459 /* this handles the case where we are changing a local
460 variable globally. We need to change the parameter in
461 all shares where it is currently set to the default */
462 for (i=0;i<lp_numservices();i++) {
463 s = lp_servicename(i);
464 if (s && (*s) && lp_is_default(i, parm)) {
465 lp_do_parameter(i, parm->label, v);
470 lp_do_parameter(snum, parm->label, v);
473 /****************************************************************************
474 commit a set of parameters for a service
475 ****************************************************************************/
476 static void commit_parameters(int snum)
478 int i = 0;
479 struct parm_struct *parm;
480 pstring label;
481 const char *v;
483 while ((parm = lp_next_parameter(snum, &i, 1))) {
484 slprintf(label, sizeof(label)-1, "parm_%s", make_parm_name(parm->label));
485 if ((v = cgi_variable(label))) {
486 if (parm->flags & FLAG_HIDE) continue;
487 commit_parameter(snum, parm, v);
492 /****************************************************************************
493 spit out the html for a link with an image
494 ****************************************************************************/
495 static void image_link(const char *name, const char *hlink, const char *src)
497 d_printf("<A HREF=\"%s/%s\"><img border=\"0\" src=\"/swat/%s\" alt=\"%s\"></A>\n",
498 cgi_baseurl(), hlink, src, name);
501 /****************************************************************************
502 display the main navigation controls at the top of each page along
503 with a title
504 ****************************************************************************/
505 static void show_main_buttons(void)
507 char *p;
509 if ((p = cgi_user_name()) && strcmp(p, "root")) {
510 d_printf(_("Logged in as <b>%s</b>"), p);
511 d_printf("<p>\n");
514 image_link(_("Home"), "", "images/home.gif");
515 if (have_write_access) {
516 image_link(_("Globals"), "globals", "images/globals.gif");
517 image_link(_("Shares"), "shares", "images/shares.gif");
518 image_link(_("Printers"), "printers", "images/printers.gif");
519 image_link(_("Wizard"), "wizard", "images/wizard.gif");
521 if (have_read_access) {
522 image_link(_("Status"), "status", "images/status.gif");
523 image_link(_("View Config"), "viewconfig", "images/viewconfig.gif");
525 image_link(_("Password Management"), "passwd", "images/passwd.gif");
527 d_printf("<HR>\n");
530 /****************************************************************************
531 * Handle Display/Edit Mode CGI
532 ****************************************************************************/
533 static void ViewModeBoxes(int mode)
535 d_printf("<p>%s:&nbsp;\n", _("Current View Is"));
536 d_printf("<input type=radio name=\"ViewMode\" value=0 %s>%s\n", ((mode == 0) ? "checked" : ""), _("Basic"));
537 d_printf("<input type=radio name=\"ViewMode\" value=1 %s>%s\n", ((mode == 1) ? "checked" : ""), _("Advanced"));
538 d_printf("<br>%s:&nbsp;\n", _("Change View To"));
539 d_printf("<input type=submit name=\"BasicMode\" value=\"%s\">\n", _("Basic"));
540 d_printf("<input type=submit name=\"AdvMode\" value=\"%s\">\n", _("Advanced"));
541 d_printf("</p><br>\n");
544 /****************************************************************************
545 display a welcome page
546 ****************************************************************************/
547 static void welcome_page(void)
549 include_html("help/welcome.html");
552 /****************************************************************************
553 display the current smb.conf
554 ****************************************************************************/
555 static void viewconfig_page(void)
557 int full_view=0;
559 if (cgi_variable("full_view")) {
560 full_view = 1;
563 d_printf("<H2>%s</H2>\n", _("Current Config"));
564 d_printf("<form method=post>\n");
566 if (full_view) {
567 d_printf("<input type=submit name=\"normal_view\" value=\"%s\">\n", _("Normal View"));
568 } else {
569 d_printf("<input type=submit name=\"full_view\" value=\"%s\">\n", _("Full View"));
572 d_printf("<p><pre>");
573 write_config(stdout, full_view);
574 d_printf("</pre>");
575 d_printf("</form>\n");
578 /****************************************************************************
579 second screen of the wizard ... Fetch Configuration Parameters
580 ****************************************************************************/
581 static void wizard_params_page(void)
583 unsigned int parm_filter = FLAG_WIZARD;
585 /* Here we first set and commit all the parameters that were selected
586 in the previous screen. */
588 d_printf("<H2>%s</H2>\n", _("Wizard Parameter Edit Page"));
590 if (cgi_variable("Commit")) {
591 commit_parameters(GLOBAL_SECTION_SNUM);
592 save_reload(0);
595 d_printf("<form name=\"swatform\" method=post action=wizard_params>\n");
597 if (have_write_access) {
598 d_printf("<input type=submit name=\"Commit\" value=\"Commit Changes\">\n");
601 d_printf("<input type=reset name=\"Reset Values\" value=\"Reset\">\n");
602 d_printf("<p>\n");
604 d_printf("<table>\n");
605 show_parameters(GLOBAL_SECTION_SNUM, 1, parm_filter, 0);
606 d_printf("</table>\n");
607 d_printf("</form>\n");
610 /****************************************************************************
611 Utility to just rewrite the smb.conf file - effectively just cleans it up
612 ****************************************************************************/
613 static void rewritecfg_file(void)
615 commit_parameters(GLOBAL_SECTION_SNUM);
616 save_reload(0);
617 d_printf("<H2>%s</H2>\n", _("Note: smb.conf file has been read and rewritten"));
620 /****************************************************************************
621 wizard to create/modify the smb.conf file
622 ****************************************************************************/
623 static void wizard_page(void)
625 /* Set some variables to collect data from smb.conf */
626 int role = 0;
627 int winstype = 0;
628 int have_home = -1;
629 int HomeExpo = 0;
630 int SerType = 0;
632 if (cgi_variable("Rewrite")) {
633 (void) rewritecfg_file();
634 return;
637 if (cgi_variable("GetWizardParams")){
638 (void) wizard_params_page();
639 return;
642 if (cgi_variable("Commit")){
643 SerType = atoi(cgi_variable("ServerType"));
644 winstype = atoi(cgi_variable("WINSType"));
645 have_home = lp_servicenumber(HOMES_NAME);
646 HomeExpo = atoi(cgi_variable("HomeExpo"));
648 /* Plain text passwords are too badly broken - use encrypted passwords only */
649 lp_do_parameter( GLOBAL_SECTION_SNUM, "encrypt passwords", "Yes");
651 switch ( SerType ){
652 case 0:
653 /* Stand-alone Server */
654 lp_do_parameter( GLOBAL_SECTION_SNUM, "security", "USER" );
655 lp_do_parameter( GLOBAL_SECTION_SNUM, "domain logons", "No" );
656 break;
657 case 1:
658 /* Domain Member */
659 lp_do_parameter( GLOBAL_SECTION_SNUM, "security", "DOMAIN" );
660 lp_do_parameter( GLOBAL_SECTION_SNUM, "domain logons", "No" );
661 break;
662 case 2:
663 /* Domain Controller */
664 lp_do_parameter( GLOBAL_SECTION_SNUM, "security", "USER" );
665 lp_do_parameter( GLOBAL_SECTION_SNUM, "domain logons", "Yes" );
666 break;
668 switch ( winstype ) {
669 case 0:
670 lp_do_parameter( GLOBAL_SECTION_SNUM, "wins support", "No" );
671 lp_do_parameter( GLOBAL_SECTION_SNUM, "wins server", "" );
672 break;
673 case 1:
674 lp_do_parameter( GLOBAL_SECTION_SNUM, "wins support", "Yes" );
675 lp_do_parameter( GLOBAL_SECTION_SNUM, "wins server", "" );
676 break;
677 case 2:
678 lp_do_parameter( GLOBAL_SECTION_SNUM, "wins support", "No" );
679 lp_do_parameter( GLOBAL_SECTION_SNUM, "wins server", cgi_variable("WINSAddr"));
680 break;
683 /* Have to create Homes share? */
684 if ((HomeExpo == 1) && (have_home == -1)) {
685 pstring unix_share;
687 pstrcpy(unix_share,HOMES_NAME);
688 load_config(False);
689 lp_copy_service(GLOBAL_SECTION_SNUM, unix_share);
690 iNumNonAutoPrintServices = lp_numservices();
691 have_home = lp_servicenumber(HOMES_NAME);
692 lp_do_parameter( have_home, "read only", "No");
693 lp_do_parameter( have_home, "valid users", "%S");
694 lp_do_parameter( have_home, "browseable", "No");
695 commit_parameters(have_home);
698 /* Need to Delete Homes share? */
699 if ((HomeExpo == 0) && (have_home != -1)) {
700 lp_remove_service(have_home);
701 have_home = -1;
704 commit_parameters(GLOBAL_SECTION_SNUM);
705 save_reload(0);
707 else
709 /* Now determine smb.conf WINS settings */
710 if (lp_wins_support())
711 winstype = 1;
712 if (lp_wins_server_list() && strlen(*lp_wins_server_list()))
713 winstype = 2;
716 /* Do we have a homes share? */
717 have_home = lp_servicenumber(HOMES_NAME);
719 if ((winstype == 2) && lp_wins_support())
720 winstype = 3;
722 role = lp_server_role();
724 /* Here we go ... */
725 d_printf("<H2>%s</H2>\n", _("Samba Configuration Wizard"));
726 d_printf("<form method=post action=wizard>\n");
728 if (have_write_access) {
729 d_printf("%s\n", _("The \"Rewrite smb.conf file\" button will clear the smb.conf file of all default values and of comments."));
730 d_printf("%s", _("The same will happen if you press the commit button."));
731 d_printf("<br><br>\n");
732 d_printf("<center>");
733 d_printf("<input type=submit name=\"Rewrite\" value=\"%s\"> &nbsp;&nbsp;",_("Rewrite smb.conf file"));
734 d_printf("<input type=submit name=\"Commit\" value=\"%s\"> &nbsp;&nbsp;",_("Commit"));
735 d_printf("<input type=submit name=\"GetWizardParams\" value=\"%s\">", _("Edit Parameter Values"));
736 d_printf("</center>\n");
739 d_printf("<hr>");
740 d_printf("<center><table border=0>");
741 d_printf("<tr><td><b>%s:&nbsp;</b></td>\n", _("Server Type"));
742 d_printf("<td><input type=radio name=\"ServerType\" value=\"0\" %s> %s&nbsp;</td>", ((role == ROLE_STANDALONE) ? "checked" : ""), _("Stand Alone"));
743 d_printf("<td><input type=radio name=\"ServerType\" value=\"1\" %s> %s&nbsp;</td>", ((role == ROLE_DOMAIN_MEMBER) ? "checked" : ""), _("Domain Member"));
744 d_printf("<td><input type=radio name=\"ServerType\" value=\"2\" %s> %s&nbsp;</td>", ((role == ROLE_DOMAIN_PDC) ? "checked" : ""), _("Domain Controller"));
745 d_printf("</tr>\n");
746 if (role == ROLE_DOMAIN_BDC) {
747 d_printf("<tr><td></td><td colspan=3><font color=\"#ff0000\">%s</font></td></tr>\n", _("Unusual Type in smb.conf - Please Select New Mode"));
749 d_printf("<tr><td><b>%s:&nbsp;</b></td>\n", _("Configure WINS As"));
750 d_printf("<td><input type=radio name=\"WINSType\" value=\"0\" %s> %s&nbsp;</td>", ((winstype == 0) ? "checked" : ""), _("Not Used"));
751 d_printf("<td><input type=radio name=\"WINSType\" value=\"1\" %s> %s&nbsp;</td>", ((winstype == 1) ? "checked" : ""), _("Server for client use"));
752 d_printf("<td><input type=radio name=\"WINSType\" value=\"2\" %s> %s&nbsp;</td>", ((winstype == 2) ? "checked" : ""), _("Client of another WINS server"));
753 d_printf("</tr>\n");
754 d_printf("<tr><td></td><td></td><td></td><td>%s&nbsp;<input type=text size=\"16\" name=\"WINSAddr\" value=\"", _("Remote WINS Server"));
756 /* Print out the list of wins servers */
757 if(lp_wins_server_list()) {
758 int i;
759 const char **wins_servers = lp_wins_server_list();
760 for(i = 0; wins_servers[i]; i++) d_printf("%s ", wins_servers[i]);
763 d_printf("\"></td></tr>\n");
764 if (winstype == 3) {
765 d_printf("<tr><td></td><td colspan=3><font color=\"#ff0000\">%s</font></td></tr>\n", _("Error: WINS Server Mode and WINS Support both set in smb.conf"));
766 d_printf("<tr><td></td><td colspan=3><font color=\"#ff0000\">%s</font></td></tr>\n", _("Please Select desired WINS mode above."));
768 d_printf("<tr><td><b>%s:&nbsp;</b></td>\n", _("Expose Home Directories"));
769 d_printf("<td><input type=radio name=\"HomeExpo\" value=\"1\" %s> Yes</td>", (have_home == -1) ? "" : "checked ");
770 d_printf("<td><input type=radio name=\"HomeExpo\" value=\"0\" %s> No</td>", (have_home == -1 ) ? "checked" : "");
771 d_printf("<td></td></tr>\n");
773 /* Enable this when we are ready ....
774 * d_printf("<tr><td><b>%s:&nbsp;</b></td>\n", _("Is Print Server"));
775 * d_printf("<td><input type=radio name=\"PtrSvr\" value=\"1\" %s> Yes</td>");
776 * d_printf("<td><input type=radio name=\"PtrSvr\" value=\"0\" %s> No</td>");
777 * d_printf("<td></td></tr>\n");
780 d_printf("</table></center>");
781 d_printf("<hr>");
783 d_printf("%s\n", _("The above configuration options will set multiple parameters and will generally assist with rapid Samba deployment."));
784 d_printf("</form>\n");
788 /****************************************************************************
789 display a globals editing page
790 ****************************************************************************/
791 static void globals_page(void)
793 unsigned int parm_filter = FLAG_BASIC;
794 int mode = 0;
796 d_printf("<H2>%s</H2>\n", _("Global Parameters"));
798 if (cgi_variable("Commit")) {
799 commit_parameters(GLOBAL_SECTION_SNUM);
800 save_reload(0);
803 if ( cgi_variable("ViewMode") )
804 mode = atoi(cgi_variable("ViewMode"));
805 if ( cgi_variable("BasicMode"))
806 mode = 0;
807 if ( cgi_variable("AdvMode"))
808 mode = 1;
810 d_printf("<form name=\"swatform\" method=post action=globals>\n");
812 ViewModeBoxes( mode );
813 switch ( mode ) {
814 case 0:
815 parm_filter = FLAG_BASIC;
816 break;
817 case 1:
818 parm_filter = FLAG_ADVANCED;
819 break;
821 d_printf("<br>\n");
822 if (have_write_access) {
823 d_printf("<input type=submit name=\"Commit\" value=\"%s\">\n",
824 _("Commit Changes"));
827 d_printf("<input type=reset name=\"Reset Values\" value=\"%s\">\n",
828 _("Reset Values"));
830 d_printf("<p>\n");
831 d_printf("<table>\n");
832 show_parameters(GLOBAL_SECTION_SNUM, 1, parm_filter, 0);
833 d_printf("</table>\n");
834 d_printf("</form>\n");
837 /****************************************************************************
838 display a shares editing page. share is in unix codepage, and must be in
839 dos codepage. FIXME !!! JRA.
840 ****************************************************************************/
841 static void shares_page(void)
843 const char *share = cgi_variable("share");
844 char *s;
845 int snum = -1;
846 int i;
847 int mode = 0;
848 unsigned int parm_filter = FLAG_BASIC;
850 if (share)
851 snum = lp_servicenumber(share);
853 d_printf("<H2>%s</H2>\n", _("Share Parameters"));
855 if (cgi_variable("Commit") && snum >= 0) {
856 commit_parameters(snum);
857 save_reload(0);
860 if (cgi_variable("Delete") && snum >= 0) {
861 lp_remove_service(snum);
862 save_reload(0);
863 share = NULL;
864 snum = -1;
867 if (cgi_variable("createshare") && (share=cgi_variable("newshare"))) {
868 load_config(False);
869 lp_copy_service(GLOBAL_SECTION_SNUM, share);
870 iNumNonAutoPrintServices = lp_numservices();
871 save_reload(0);
872 snum = lp_servicenumber(share);
875 d_printf("<FORM name=\"swatform\" method=post>\n");
877 d_printf("<table>\n");
879 if ( cgi_variable("ViewMode") )
880 mode = atoi(cgi_variable("ViewMode"));
881 if ( cgi_variable("BasicMode"))
882 mode = 0;
883 if ( cgi_variable("AdvMode"))
884 mode = 1;
886 ViewModeBoxes( mode );
887 switch ( mode ) {
888 case 0:
889 parm_filter = FLAG_BASIC;
890 break;
891 case 1:
892 parm_filter = FLAG_ADVANCED;
893 break;
895 d_printf("<br><tr>\n");
896 d_printf("<td><input type=submit name=selectshare value=\"%s\"></td>\n", _("Choose Share"));
897 d_printf("<td><select name=share>\n");
898 if (snum < 0)
899 d_printf("<option value=\" \"> \n");
900 for (i=0;i<lp_numservices();i++) {
901 s = lp_servicename(i);
902 if (s && (*s) && strcmp(s,"IPC$") && !lp_print_ok(i)) {
903 d_printf("<option %s value=\"%s\">%s\n",
904 (share && strcmp(share,s)==0)?"SELECTED":"",
905 s, s);
908 d_printf("</select></td>\n");
909 if (have_write_access) {
910 d_printf("<td><input type=submit name=\"Delete\" value=\"%s\"></td>\n", _("Delete Share"));
912 d_printf("</tr>\n");
913 d_printf("</table>");
914 d_printf("<table>");
915 if (have_write_access) {
916 d_printf("<tr>\n");
917 d_printf("<td><input type=submit name=createshare value=\"%s\"></td>\n", _("Create Share"));
918 d_printf("<td><input type=text size=30 name=newshare></td></tr>\n");
920 d_printf("</table>");
923 if (snum >= 0) {
924 if (have_write_access) {
925 d_printf("<input type=submit name=\"Commit\" value=\"%s\">\n", _("Commit Changes"));
928 d_printf("<input type=reset name=\"Reset Values\" value=\"%s\">\n", _("Reset Values"));
929 d_printf("<p>\n");
932 if (snum >= 0) {
933 d_printf("<table>\n");
934 show_parameters(snum, 1, parm_filter, 0);
935 d_printf("</table>\n");
938 d_printf("</FORM>\n");
941 /*************************************************************
942 change a password either locally or remotely
943 *************************************************************/
944 static BOOL change_password(const char *remote_machine, const char *user_name,
945 const char *old_passwd, const char *new_passwd,
946 int local_flags)
948 BOOL ret = False;
949 pstring err_str;
950 pstring msg_str;
952 if (demo_mode) {
953 d_printf("%s\n<p>", _("password change in demo mode rejected"));
954 return False;
957 if (remote_machine != NULL) {
958 ret = remote_password_change(remote_machine, user_name, old_passwd,
959 new_passwd, err_str, sizeof(err_str));
960 if(*err_str)
961 d_printf("%s\n<p>", err_str);
962 return ret;
965 if(!initialize_password_db(True)) {
966 d_printf("%s\n<p>", _("Can't setup password database vectors."));
967 return False;
970 ret = local_password_change(user_name, local_flags, new_passwd, err_str, sizeof(err_str),
971 msg_str, sizeof(msg_str));
973 if(*msg_str)
974 d_printf("%s\n<p>", msg_str);
975 if(*err_str)
976 d_printf("%s\n<p>", err_str);
978 return ret;
981 /****************************************************************************
982 do the stuff required to add or change a password
983 ****************************************************************************/
984 static void chg_passwd(void)
986 const char *host;
987 BOOL rslt;
988 int local_flags = 0;
990 /* Make sure users name has been specified */
991 if (strlen(cgi_variable(SWAT_USER)) == 0) {
992 d_printf("<p>%s\n", _(" Must specify \"User Name\" "));
993 return;
997 * smbpasswd doesn't require anything but the users name to delete, disable or enable the user,
998 * so if that's what we're doing, skip the rest of the checks
1000 if (!cgi_variable(DISABLE_USER_FLAG) && !cgi_variable(ENABLE_USER_FLAG) && !cgi_variable(DELETE_USER_FLAG)) {
1003 * If current user is not root, make sure old password has been specified
1004 * If REMOTE change, even root must provide old password
1006 if (((!am_root()) && (strlen( cgi_variable(OLD_PSWD)) <= 0)) ||
1007 ((cgi_variable(CHG_R_PASSWD_FLAG)) && (strlen( cgi_variable(OLD_PSWD)) <= 0))) {
1008 d_printf("<p>%s\n", _(" Must specify \"Old Password\" "));
1009 return;
1012 /* If changing a users password on a remote hosts we have to know what host */
1013 if ((cgi_variable(CHG_R_PASSWD_FLAG)) && (strlen( cgi_variable(RHOST)) <= 0)) {
1014 d_printf("<p>%s\n", _(" Must specify \"Remote Machine\" "));
1015 return;
1018 /* Make sure new passwords have been specified */
1019 if ((strlen( cgi_variable(NEW_PSWD)) <= 0) ||
1020 (strlen( cgi_variable(NEW2_PSWD)) <= 0)) {
1021 d_printf("<p>%s\n", _(" Must specify \"New, and Re-typed Passwords\" "));
1022 return;
1025 /* Make sure new passwords was typed correctly twice */
1026 if (strcmp(cgi_variable(NEW_PSWD), cgi_variable(NEW2_PSWD)) != 0) {
1027 d_printf("<p>%s\n", _(" Re-typed password didn't match new password "));
1028 return;
1032 if (cgi_variable(CHG_R_PASSWD_FLAG)) {
1033 host = cgi_variable(RHOST);
1034 } else if (am_root()) {
1035 host = NULL;
1036 } else {
1037 host = "127.0.0.1";
1041 * Set up the local flags.
1044 local_flags |= (cgi_variable(ADD_USER_FLAG) ? LOCAL_ADD_USER : 0);
1045 local_flags |= (cgi_variable(ADD_USER_FLAG) ? LOCAL_SET_PASSWORD : 0);
1046 local_flags |= (cgi_variable(CHG_S_PASSWD_FLAG) ? LOCAL_SET_PASSWORD : 0);
1047 local_flags |= (cgi_variable(DELETE_USER_FLAG) ? LOCAL_DELETE_USER : 0);
1048 local_flags |= (cgi_variable(ENABLE_USER_FLAG) ? LOCAL_ENABLE_USER : 0);
1049 local_flags |= (cgi_variable(DISABLE_USER_FLAG) ? LOCAL_DISABLE_USER : 0);
1052 rslt = change_password(host,
1053 cgi_variable(SWAT_USER),
1054 cgi_variable(OLD_PSWD), cgi_variable(NEW_PSWD),
1055 local_flags);
1057 if(cgi_variable(CHG_S_PASSWD_FLAG)) {
1058 d_printf("<p>");
1059 if (rslt == True) {
1060 d_printf(_(" The passwd for '%s' has been changed."), cgi_variable(SWAT_USER));
1061 d_printf("\n");
1062 } else {
1063 d_printf(_(" The passwd for '%s' has NOT been changed."), cgi_variable(SWAT_USER));
1064 d_printf("\n");
1068 return;
1071 /****************************************************************************
1072 display a password editing page
1073 ****************************************************************************/
1074 static void passwd_page(void)
1076 const char *new_name = cgi_user_name();
1079 * After the first time through here be nice. If the user
1080 * changed the User box text to another users name, remember it.
1082 if (cgi_variable(SWAT_USER)) {
1083 new_name = cgi_variable(SWAT_USER);
1086 if (!new_name) new_name = "";
1088 d_printf("<H2>%s</H2>\n", _("Server Password Management"));
1090 d_printf("<FORM name=\"swatform\" method=post>\n");
1092 d_printf("<table>\n");
1095 * Create all the dialog boxes for data collection
1097 d_printf("<tr><td> %s : </td>\n", _("User Name"));
1098 d_printf("<td><input type=text size=30 name=%s value=%s></td></tr> \n", SWAT_USER, new_name);
1099 if (!am_root()) {
1100 d_printf("<tr><td> %s : </td>\n", _("Old Password"));
1101 d_printf("<td><input type=password size=30 name=%s></td></tr> \n",OLD_PSWD);
1103 d_printf("<tr><td> %s : </td>\n", _("New Password"));
1104 d_printf("<td><input type=password size=30 name=%s></td></tr>\n",NEW_PSWD);
1105 d_printf("<tr><td> %s : </td>\n", _("Re-type New Password"));
1106 d_printf("<td><input type=password size=30 name=%s></td></tr>\n",NEW2_PSWD);
1107 d_printf("</table>\n");
1110 * Create all the control buttons for requesting action
1112 d_printf("<input type=submit name=%s value=\"%s\">\n",
1113 CHG_S_PASSWD_FLAG, _("Change Password"));
1114 if (demo_mode || am_root()) {
1115 d_printf("<input type=submit name=%s value=\"%s\">\n",
1116 ADD_USER_FLAG, _("Add New User"));
1117 d_printf("<input type=submit name=%s value=\"%s\">\n",
1118 DELETE_USER_FLAG, _("Delete User"));
1119 d_printf("<input type=submit name=%s value=\"%s\">\n",
1120 DISABLE_USER_FLAG, _("Disable User"));
1121 d_printf("<input type=submit name=%s value=\"%s\">\n",
1122 ENABLE_USER_FLAG, _("Enable User"));
1124 d_printf("<p></FORM>\n");
1127 * Do some work if change, add, disable or enable was
1128 * requested. It could be this is the first time through this
1129 * code, so there isn't anything to do. */
1130 if ((cgi_variable(CHG_S_PASSWD_FLAG)) || (cgi_variable(ADD_USER_FLAG)) || (cgi_variable(DELETE_USER_FLAG)) ||
1131 (cgi_variable(DISABLE_USER_FLAG)) || (cgi_variable(ENABLE_USER_FLAG))) {
1132 chg_passwd();
1135 d_printf("<H2>%s</H2>\n", _("Client/Server Password Management"));
1137 d_printf("<FORM name=\"swatform\" method=post>\n");
1139 d_printf("<table>\n");
1142 * Create all the dialog boxes for data collection
1144 d_printf("<tr><td> %s : </td>\n", _("User Name"));
1145 d_printf("<td><input type=text size=30 name=%s value=%s></td></tr>\n",SWAT_USER, new_name);
1146 d_printf("<tr><td> %s : </td>\n", _("Old Password"));
1147 d_printf("<td><input type=password size=30 name=%s></td></tr>\n",OLD_PSWD);
1148 d_printf("<tr><td> %s : </td>\n", _("New Password"));
1149 d_printf("<td><input type=password size=30 name=%s></td></tr>\n",NEW_PSWD);
1150 d_printf("<tr><td> %s : </td>\n", _("Re-type New Password"));
1151 d_printf("<td><input type=password size=30 name=%s></td></tr>\n",NEW2_PSWD);
1152 d_printf("<tr><td> %s : </td>\n", _("Remote Machine"));
1153 d_printf("<td><input type=text size=30 name=%s></td></tr>\n",RHOST);
1155 d_printf("</table>");
1158 * Create all the control buttons for requesting action
1160 d_printf("<input type=submit name=%s value=\"%s\">",
1161 CHG_R_PASSWD_FLAG, _("Change Password"));
1163 d_printf("<p></FORM>\n");
1166 * Do some work if a request has been made to change the
1167 * password somewhere other than the server. It could be this
1168 * is the first time through this code, so there isn't
1169 * anything to do. */
1170 if (cgi_variable(CHG_R_PASSWD_FLAG)) {
1171 chg_passwd();
1176 /****************************************************************************
1177 display a printers editing page
1178 ****************************************************************************/
1179 static void printers_page(void)
1181 const char *share = cgi_variable("share");
1182 char *s;
1183 int snum=-1;
1184 int i;
1185 int mode = 0;
1186 unsigned int parm_filter = FLAG_BASIC;
1188 if (share)
1189 snum = lp_servicenumber(share);
1191 d_printf("<H2>%s</H2>\n", _("Printer Parameters"));
1193 d_printf("<H3>%s</H3>\n", _("Important Note:"));
1194 d_printf(_("Printer names marked with [*] in the Choose Printer drop-down box "));
1195 d_printf(_("are autoloaded printers from "));
1196 d_printf("<A HREF=\"/swat/help/smb.conf.5.html#printcapname\" target=\"docs\">%s</A>\n", _("Printcap Name"));
1197 d_printf("%s\n", _("Attempting to delete these printers from SWAT will have no effect."));
1199 if (cgi_variable("Commit") && snum >= 0) {
1200 commit_parameters(snum);
1201 if (snum >= iNumNonAutoPrintServices)
1202 save_reload(snum);
1203 else
1204 save_reload(0);
1207 if (cgi_variable("Delete") && snum >= 0) {
1208 lp_remove_service(snum);
1209 save_reload(0);
1210 share = NULL;
1211 snum = -1;
1214 if (cgi_variable("createshare") && (share=cgi_variable("newshare"))) {
1215 load_config(False);
1216 lp_copy_service(GLOBAL_SECTION_SNUM, share);
1217 iNumNonAutoPrintServices = lp_numservices();
1218 snum = lp_servicenumber(share);
1219 lp_do_parameter(snum, "print ok", "Yes");
1220 save_reload(0);
1221 snum = lp_servicenumber(share);
1224 d_printf("<FORM name=\"swatform\" method=post>\n");
1226 if ( cgi_variable("ViewMode") )
1227 mode = atoi(cgi_variable("ViewMode"));
1228 if ( cgi_variable("BasicMode"))
1229 mode = 0;
1230 if ( cgi_variable("AdvMode"))
1231 mode = 1;
1233 ViewModeBoxes( mode );
1234 switch ( mode ) {
1235 case 0:
1236 parm_filter = FLAG_BASIC;
1237 break;
1238 case 1:
1239 parm_filter = FLAG_ADVANCED;
1240 break;
1242 d_printf("<table>\n");
1243 d_printf("<tr><td><input type=submit name=\"selectshare\" value=\"%s\"></td>\n", _("Choose Printer"));
1244 d_printf("<td><select name=\"share\">\n");
1245 if (snum < 0 || !lp_print_ok(snum))
1246 d_printf("<option value=\" \"> \n");
1247 for (i=0;i<lp_numservices();i++) {
1248 s = lp_servicename(i);
1249 if (s && (*s) && strcmp(s,"IPC$") && lp_print_ok(i)) {
1250 if (i >= iNumNonAutoPrintServices)
1251 d_printf("<option %s value=\"%s\">[*]%s\n",
1252 (share && strcmp(share,s)==0)?"SELECTED":"",
1253 s, s);
1254 else
1255 d_printf("<option %s value=\"%s\">%s\n",
1256 (share && strcmp(share,s)==0)?"SELECTED":"",
1257 s, s);
1260 d_printf("</select></td>");
1261 if (have_write_access) {
1262 d_printf("<td><input type=submit name=\"Delete\" value=\"%s\"></td>\n", _("Delete Printer"));
1264 d_printf("</tr>");
1265 d_printf("</table>\n");
1267 if (have_write_access) {
1268 d_printf("<table>\n");
1269 d_printf("<tr><td><input type=submit name=\"createshare\" value=\"%s\"></td>\n", _("Create Printer"));
1270 d_printf("<td><input type=text size=30 name=\"newshare\"></td></tr>\n");
1271 d_printf("</table>");
1275 if (snum >= 0) {
1276 if (have_write_access) {
1277 d_printf("<input type=submit name=\"Commit\" value=\"%s\">\n", _("Commit Changes"));
1279 d_printf("<input type=reset name=\"Reset Values\" value=\"%s\">\n", _("Reset Values"));
1280 d_printf("<p>\n");
1283 if (snum >= 0) {
1284 d_printf("<table>\n");
1285 show_parameters(snum, 1, parm_filter, 1);
1286 d_printf("</table>\n");
1288 d_printf("</FORM>\n");
1293 * main function for SWAT.
1295 int main(int argc, char *argv[])
1297 int opt;
1298 const char *page;
1299 poptContext pc;
1300 struct poptOption long_options[] = {
1301 POPT_AUTOHELP
1302 { "disable-authentication", 'a', POPT_ARG_VAL, &demo_mode, True, "Disable authentication (demo mode)" },
1303 POPT_COMMON_SAMBA
1304 POPT_TABLEEND
1307 fault_setup(NULL);
1308 umask(S_IWGRP | S_IWOTH);
1310 #if defined(HAVE_SET_AUTH_PARAMETERS)
1311 set_auth_parameters(argc, argv);
1312 #endif /* HAVE_SET_AUTH_PARAMETERS */
1314 /* just in case it goes wild ... */
1315 alarm(300);
1317 setlinebuf(stdout);
1319 /* we don't want any SIGPIPE messages */
1320 BlockSignals(True,SIGPIPE);
1322 dbf = x_fopen("/dev/null", O_WRONLY, 0);
1323 if (!dbf) dbf = x_stderr;
1325 /* we don't want stderr screwing us up */
1326 close(2);
1327 open("/dev/null", O_WRONLY);
1329 pc = poptGetContext("swat", argc, (const char **) argv, long_options, 0);
1331 /* Parse command line options */
1333 while((opt = poptGetNextOpt(pc)) != -1) { }
1335 poptFreeContext(pc);
1337 setup_logging(argv[0],False);
1338 load_config(True);
1339 iNumNonAutoPrintServices = lp_numservices();
1340 load_printers();
1342 cgi_setup(dyn_SWATDIR, !demo_mode);
1344 print_header();
1346 cgi_load_variables();
1348 if (!file_exist(dyn_CONFIGFILE, NULL)) {
1349 have_read_access = True;
1350 have_write_access = True;
1351 } else {
1352 /* check if the authenticated user has write access - if not then
1353 don't show write options */
1354 have_write_access = (access(dyn_CONFIGFILE,W_OK) == 0);
1356 /* if the user doesn't have read access to smb.conf then
1357 don't let them view it */
1358 have_read_access = (access(dyn_CONFIGFILE,R_OK) == 0);
1361 show_main_buttons();
1363 page = cgi_pathinfo();
1365 /* Root gets full functionality */
1366 if (have_read_access && strcmp(page, "globals")==0) {
1367 globals_page();
1368 } else if (have_read_access && strcmp(page,"shares")==0) {
1369 shares_page();
1370 } else if (have_read_access && strcmp(page,"printers")==0) {
1371 printers_page();
1372 } else if (have_read_access && strcmp(page,"status")==0) {
1373 status_page();
1374 } else if (have_read_access && strcmp(page,"viewconfig")==0) {
1375 viewconfig_page();
1376 } else if (strcmp(page,"passwd")==0) {
1377 passwd_page();
1378 } else if (have_read_access && strcmp(page,"wizard")==0) {
1379 wizard_page();
1380 } else if (have_read_access && strcmp(page,"wizard_params")==0) {
1381 wizard_params_page();
1382 } else if (have_read_access && strcmp(page,"rewritecfg")==0) {
1383 rewritecfg_file();
1384 } else {
1385 welcome_page();
1388 print_footer();
1389 return 0;
1392 /** @} **/