X-Git-Url: http://git.samba.org/?p=amitay%2Fsamba.git;a=blobdiff_plain;f=source3%2Fweb%2Fswat.c;h=0e17b015e949ee56aca0d30c167f6c0ea1567c1a;hp=1502c5bc2f13519daef3016f42c9a3071398d8d3;hb=959516d61bc6ee7cdd12409dde0ec00044208f1b;hpb=9d3d3320928e43a972b88024a52986331d0dbee0 diff --git a/source3/web/swat.c b/source3/web/swat.c index 1502c5bc2f1..0e17b015e94 100644 --- a/source3/web/swat.c +++ b/source3/web/swat.c @@ -4,17 +4,17 @@ Version 3.0.0 Copyright (C) Andrew Tridgell 1997-2002 Copyright (C) John H Terpstra 2002 - + 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 3 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, see . */ @@ -28,7 +28,16 @@ **/ #include "includes.h" +#include "system/filesys.h" +#include "popt_common.h" #include "web/swat_proto.h" +#include "printing/pcap.h" +#include "printing/load.h" +#include "passdb.h" +#include "intl/lang_tdb.h" +#include "../lib/crypto/md5.h" +#include "lib/param/loadparm.h" +#include "messages.h" static int demo_mode = False; static int passwd_only = False; @@ -50,6 +59,9 @@ static int iNumNonAutoPrintServices = 0; #define DISABLE_USER_FLAG "disable_user_flag" #define ENABLE_USER_FLAG "enable_user_flag" #define RHOST "remote_host" +#define XSRF_TOKEN "xsrf" +#define XSRF_TIME "xsrf_time" +#define XSRF_TIMEOUT 300 #define _(x) lang_msg_rotate(talloc_tos(),x) @@ -77,7 +89,7 @@ static char *fix_backslash(const char *str) return newstring; } -static const char *fix_quotes(TALLOC_CTX *ctx, const char *str) +static const char *fix_quotes(TALLOC_CTX *ctx, char *str) { char *newstring = NULL; char *p = NULL; @@ -95,7 +107,7 @@ static const char *fix_quotes(TALLOC_CTX *ctx, const char *str) } ++p; } - newstring = TALLOC_ARRAY(ctx, char, newstring_len); + newstring = talloc_array(ctx, char, newstring_len); if (!newstring) { return ""; } @@ -117,7 +129,7 @@ static char *stripspaceupper(const char *str) char *p = newstring; while (*str) { - if (*str != ' ') *p++ = toupper_ascii(*str); + if (*str != ' ') *p++ = toupper_m(*str); ++str; } *p = '\0'; @@ -138,6 +150,90 @@ static char *make_parm_name(const char *label) return parmname; } +void get_xsrf_token(const char *username, const char *pass, + const char *formname, time_t xsrf_time, char token_str[33]) +{ + struct MD5Context md5_ctx; + uint8_t token[16]; + int i; + + token_str[0] = '\0'; + ZERO_STRUCT(md5_ctx); + MD5Init(&md5_ctx); + + MD5Update(&md5_ctx, (uint8_t *)formname, strlen(formname)); + MD5Update(&md5_ctx, (uint8_t *)&xsrf_time, sizeof(time_t)); + if (username != NULL) { + MD5Update(&md5_ctx, (uint8_t *)username, strlen(username)); + } + if (pass != NULL) { + MD5Update(&md5_ctx, (uint8_t *)pass, strlen(pass)); + } + + MD5Final(token, &md5_ctx); + + for(i = 0; i < sizeof(token); i++) { + char tmp[3]; + + snprintf(tmp, sizeof(tmp), "%02x", token[i]); + /* FIXME ! Truncate check. JRA. */ + (void)strlcat(token_str, tmp, sizeof(tmp)); + } +} + +void print_xsrf_token(const char *username, const char *pass, + const char *formname) +{ + char token[33]; + time_t xsrf_time = time(NULL); + + get_xsrf_token(username, pass, formname, xsrf_time, token); + printf("\n", + XSRF_TOKEN, token); + printf("\n", + XSRF_TIME, (long long int)xsrf_time); +} + +bool verify_xsrf_token(const char *formname) +{ + char expected[33]; + const char *username = cgi_user_name(); + const char *pass = cgi_user_pass(); + const char *token = cgi_variable_nonull(XSRF_TOKEN); + const char *time_str = cgi_variable_nonull(XSRF_TIME); + char *p = NULL; + long long xsrf_time_ll = 0; + time_t xsrf_time = 0; + time_t now = time(NULL); + + errno = 0; + xsrf_time_ll = strtoll(time_str, &p, 10); + if (errno != 0) { + return false; + } + if (p == NULL) { + return false; + } + if (PTR_DIFF(p, time_str) > strlen(time_str)) { + return false; + } + if (xsrf_time_ll > _TYPE_MAXIMUM(time_t)) { + return false; + } + if (xsrf_time_ll < _TYPE_MINIMUM(time_t)) { + return false; + } + xsrf_time = xsrf_time_ll; + + if (abs(now - xsrf_time) > XSRF_TIMEOUT) { + return false; + } + + get_xsrf_token(username, pass, formname, xsrf_time, expected); + return (strncmp(expected, token, sizeof(expected)) == 0); +} + + /**************************************************************************** include a lump of html in a page ****************************************************************************/ @@ -156,7 +252,9 @@ static int include_html(const char *fname) } while ((ret = read(fd, buf, sizeof(buf))) > 0) { - write(1, buf, ret); + if (write(1, buf, ret) == -1) { + break; + } } close(fd); @@ -226,13 +324,15 @@ static void print_footer(void) static void show_parameter(int snum, struct parm_struct *parm) { int i; - void *ptr = parm->ptr; + void *ptr; char *utf8_s1, *utf8_s2; size_t converted_size; TALLOC_CTX *ctx = talloc_stackframe(); if (parm->p_class == P_LOCAL && snum >= 0) { - ptr = lp_local_ptr(snum, ptr); + ptr = lp_local_ptr_by_snum(snum, parm); + } else { + ptr = lp_parm_ptr(NULL, parm); } printf("%s", get_parm_translated(ctx, @@ -253,16 +353,16 @@ static void show_parameter(int snum, struct parm_struct *parm) for (;*list;list++) { /* enclose in HTML encoded quotes if the string contains a space */ if ( strchr_m(*list, ' ') ) { - push_utf8_allocate(&utf8_s1, *list, &converted_size); - push_utf8_allocate(&utf8_s2, ((*(list+1))?", ":""), &converted_size); + push_utf8_talloc(talloc_tos(), &utf8_s1, *list, &converted_size); + push_utf8_talloc(talloc_tos(), &utf8_s2, ((*(list+1))?", ":""), &converted_size); printf(""%s"%s", utf8_s1, utf8_s2); } else { - push_utf8_allocate(&utf8_s1, *list, &converted_size); - push_utf8_allocate(&utf8_s2, ((*(list+1))?", ":""), &converted_size); + push_utf8_talloc(talloc_tos(), &utf8_s1, *list, &converted_size); + push_utf8_talloc(talloc_tos(), &utf8_s2, ((*(list+1))?", ":""), &converted_size); printf("%s%s", utf8_s1, utf8_s2); } - SAFE_FREE(utf8_s1); - SAFE_FREE(utf8_s2); + TALLOC_FREE(utf8_s1); + TALLOC_FREE(utf8_s2); } } printf("\">"); @@ -283,10 +383,10 @@ static void show_parameter(int snum, struct parm_struct *parm) case P_STRING: case P_USTRING: - push_utf8_allocate(&utf8_s1, *(char **)ptr, &converted_size); + push_utf8_talloc(talloc_tos(), &utf8_s1, *(char **)ptr, &converted_size); printf("", make_parm_name(parm->label), fix_quotes(ctx, utf8_s1)); - SAFE_FREE(utf8_s1); + TALLOC_FREE(utf8_s1); printf("", _("Set Default"), make_parm_name(parm->label),fix_backslash((char *)(parm->def.svalue))); break; @@ -310,6 +410,7 @@ static void show_parameter(int snum, struct parm_struct *parm) break; case P_INTEGER: + case P_BYTES: printf("", make_parm_name(parm->label), *(int *)ptr); printf("", _("Set Default"), make_parm_name(parm->label),(int)(parm->def.ivalue)); @@ -372,10 +473,11 @@ static void show_parameters(int snum, int allparameters, unsigned int parm_filte if (!( parm_filter & FLAG_ADVANCED )) { if (!(parm->flags & FLAG_BASIC)) { - void *ptr = parm->ptr; - + void *ptr; if (parm->p_class == P_LOCAL && snum >= 0) { - ptr = lp_local_ptr(snum, ptr); + ptr = lp_local_ptr_by_snum(snum, parm); + } else { + ptr = lp_parm_ptr(NULL, parm); } switch (parm->type) { @@ -384,7 +486,8 @@ static void show_parameters(int snum, int allparameters, unsigned int parm_filte break; case P_LIST: - if (!str_list_compare(*(char ***)ptr, (char **)(parm->def.lvalue))) continue; + if (!str_list_equal(*(const char ***)ptr, + (const char **)(parm->def.lvalue))) continue; break; case P_STRING: @@ -398,6 +501,7 @@ static void show_parameters(int snum, int allparameters, unsigned int parm_filte break; case P_INTEGER: + case P_BYTES: case P_OCTAL: if (*(int *)ptr == (int)(parm->def.ivalue)) continue; break; @@ -414,9 +518,9 @@ static void show_parameters(int snum, int allparameters, unsigned int parm_filte } if ((parm_filter & FLAG_WIZARD) && !(parm->flags & FLAG_WIZARD)) continue; - + if ((parm_filter & FLAG_ADVANCED) && !(parm->flags & FLAG_ADVANCED)) continue; - + if (heading && heading != last_heading) { printf("%s\n", _(heading)); last_heading = heading; @@ -443,7 +547,7 @@ static void write_config(FILE *f, bool show_defaults) fprintf(f, "# Samba config file created using SWAT\n"); fprintf(f, "# from %s (%s)\n", cgi_remote_host(), cgi_remote_addr()); fprintf(f, "# Date: %s\n\n", current_timestring(ctx, False)); - + lp_dump(f, show_defaults, iNumNonAutoPrintServices); TALLOC_FREE(ctx); @@ -475,7 +579,7 @@ static int save_reload(int snum) } write_config(f, False); - if (snum) + if (snum >= 0) lp_dump_one(f, False, snum); fclose(f); @@ -487,7 +591,25 @@ static int save_reload(int snum) return 0; } iNumNonAutoPrintServices = lp_numservices(); - load_printers(); + if (pcap_cache_loaded()) { + struct tevent_context *ev_ctx; + struct messaging_context *msg_ctx; + + ev_ctx = s3_tevent_context_init(NULL); + if (ev_ctx == NULL) { + printf("s3_tevent_context_init() failed\n"); + return 0; + } + msg_ctx = messaging_init(ev_ctx, ev_ctx); + if (msg_ctx == NULL) { + printf("messaging_init() failed\n"); + return 0; + } + + load_printers(ev_ctx, msg_ctx); + + talloc_free(ev_ctx); + } return 1; } @@ -553,7 +675,7 @@ static void image_link(const char *name, const char *hlink, const char *src) static void show_main_buttons(void) { char *p; - + if ((p = cgi_user_name()) && strcmp(p, "root")) { printf(_("Logged in as %s"), p); printf("

\n"); @@ -595,7 +717,7 @@ static void ViewModeBoxes(int mode) ****************************************************************************/ static void welcome_page(void) { - if (file_exist("help/welcome.html", NULL)) { + if (file_exist("help/welcome.html")) { include_html("help/welcome.html"); } else { include_html("help/welcome-no-samba-doc.html"); @@ -608,13 +730,20 @@ static void welcome_page(void) static void viewconfig_page(void) { int full_view=0; + const char form_name[] = "viewconfig"; + + if (!verify_xsrf_token(form_name)) { + goto output_page; + } if (cgi_variable("full_view")) { full_view = 1; } +output_page: printf("

%s

\n", _("Current Config")); printf("
\n"); + print_xsrf_token(cgi_user_name(), cgi_user_pass(), form_name); if (full_view) { printf("\n", _("Normal View")); @@ -634,18 +763,25 @@ static void viewconfig_page(void) static void wizard_params_page(void) { unsigned int parm_filter = FLAG_WIZARD; + const char form_name[] = "wizard_params"; /* Here we first set and commit all the parameters that were selected in the previous screen. */ printf("

%s

\n", _("Wizard Parameter Edit Page")); + if (!verify_xsrf_token(form_name)) { + goto output_page; + } + if (cgi_variable("Commit")) { commit_parameters(GLOBAL_SECTION_SNUM); - save_reload(0); + save_reload(-1); } +output_page: printf("\n"); + print_xsrf_token(cgi_user_name(), cgi_user_pass(), form_name); if (have_write_access) { printf("\n"); @@ -653,7 +789,7 @@ static void wizard_params_page(void) printf("\n"); printf("

\n"); - + printf("\n"); show_parameters(GLOBAL_SECTION_SNUM, 1, parm_filter, 0); printf("
\n"); @@ -666,7 +802,7 @@ static void wizard_params_page(void) static void rewritecfg_file(void) { commit_parameters(GLOBAL_SECTION_SNUM); - save_reload(0); + save_reload(-1); printf("

%s

\n", _("Note: smb.conf file has been read and rewritten")); } @@ -681,6 +817,11 @@ static void wizard_page(void) int have_home = -1; int HomeExpo = 0; int SerType = 0; + const char form_name[] = "wizard"; + + if (!verify_xsrf_token(form_name)) { + goto output_page; + } if (cgi_variable("Rewrite")) { (void) rewritecfg_file(); @@ -700,7 +841,7 @@ static void wizard_page(void) /* Plain text passwords are too badly broken - use encrypted passwords only */ lp_do_parameter( GLOBAL_SECTION_SNUM, "encrypt passwords", "Yes"); - + switch ( SerType ){ case 0: /* Stand-alone Server */ @@ -754,12 +895,12 @@ static void wizard_page(void) } commit_parameters(GLOBAL_SECTION_SNUM); - save_reload(0); + save_reload(-1); } else { /* Now determine smb.conf WINS settings */ - if (lp_wins_support()) + if (lp_we_are_a_wins_server()) winstype = 1; if (lp_wins_server_list() && strlen(*lp_wins_server_list())) winstype = 2; @@ -767,14 +908,16 @@ static void wizard_page(void) /* Do we have a homes share? */ have_home = lp_servicenumber(HOMES_NAME); } - if ((winstype == 2) && lp_wins_support()) + if ((winstype == 2) && lp_we_are_a_wins_server()) winstype = 3; role = lp_server_role(); - + +output_page: /* Here we go ... */ printf("

%s

\n", _("Samba Configuration Wizard")); printf("\n"); + print_xsrf_token(cgi_user_name(), cgi_user_pass(), form_name); if (have_write_access) { printf("%s\n", _("The \"Rewrite smb.conf file\" button will clear the smb.conf file of all default values and of comments.")); @@ -810,7 +953,7 @@ static void wizard_page(void) const char **wins_servers = lp_wins_server_list(); for(i = 0; wins_servers[i]; i++) printf("%s ", wins_servers[i]); } - + printf("\">\n"); if (winstype == 3) { printf("%s\n", _("Error: WINS Server Mode and WINS Support both set in smb.conf")); @@ -820,14 +963,14 @@ static void wizard_page(void) printf(" Yes", (have_home == -1) ? "" : "checked "); printf(" No", (have_home == -1 ) ? "checked" : ""); printf("\n"); - + /* Enable this when we are ready .... * printf("%s: \n", _("Is Print Server")); * printf(" Yes"); * printf(" No"); * printf("\n"); */ - + printf(""); printf("
"); @@ -843,12 +986,17 @@ static void globals_page(void) { unsigned int parm_filter = FLAG_BASIC; int mode = 0; + const char form_name[] = "globals"; printf("

%s

\n", _("Global Parameters")); + if (!verify_xsrf_token(form_name)) { + goto output_page; + } + if (cgi_variable("Commit")) { commit_parameters(GLOBAL_SECTION_SNUM); - save_reload(0); + save_reload(-1); } if ( cgi_variable("ViewMode") ) @@ -858,7 +1006,9 @@ static void globals_page(void) if ( cgi_variable("AdvMode")) mode = 1; +output_page: printf("\n"); + print_xsrf_token(cgi_user_name(), cgi_user_pass(), form_name); ViewModeBoxes( mode ); switch ( mode ) { @@ -898,21 +1048,27 @@ static void shares_page(void) int mode = 0; unsigned int parm_filter = FLAG_BASIC; size_t converted_size; + const char form_name[] = "shares"; + + printf("

%s

\n", _("Share Parameters")); + + if (!verify_xsrf_token(form_name)) { + goto output_page; + } if (share) snum = lp_servicenumber(share); - printf("

%s

\n", _("Share Parameters")); if (cgi_variable("Commit") && snum >= 0) { commit_parameters(snum); - save_reload(0); + save_reload(-1); snum = lp_servicenumber(share); } if (cgi_variable("Delete") && snum >= 0) { lp_remove_service(snum); - save_reload(0); + save_reload(-1); share = NULL; snum = -1; } @@ -928,10 +1084,6 @@ static void shares_page(void) } } - printf("\n"); - - printf("\n"); - if ( cgi_variable("ViewMode") ) mode = atoi(cgi_variable_nonull("ViewMode")); if ( cgi_variable("BasicMode")) @@ -939,6 +1091,12 @@ static void shares_page(void) if ( cgi_variable("AdvMode")) mode = 1; +output_page: + printf("\n"); + print_xsrf_token(cgi_user_name(), cgi_user_pass(), form_name); + + printf("
\n"); + ViewModeBoxes( mode ); switch ( mode ) { case 0: @@ -956,11 +1114,11 @@ static void shares_page(void) for (i=0;i%s\n", (share && strcmp(share,s)==0)?"SELECTED":"", utf8_s, utf8_s); - SAFE_FREE(utf8_s); + TALLOC_FREE(utf8_s); } } printf("\n"); @@ -1011,7 +1169,7 @@ static bool change_password(const char *remote_machine, const char *user_name, printf("%s\n

", _("password change in demo mode rejected")); return False; } - + if (remote_machine != NULL) { ret = remote_password_change(remote_machine, user_name, old_passwd, new_passwd, &err_str); @@ -1025,7 +1183,7 @@ static bool change_password(const char *remote_machine, const char *user_name, printf("%s\n

", _("Can't setup password database vectors.")); return False; } - + ret = local_password_change(user_name, local_flags, new_passwd, &err_str, &msg_str); @@ -1108,7 +1266,6 @@ static void chg_passwd(void) local_flags |= (cgi_variable(DELETE_USER_FLAG) ? LOCAL_DELETE_USER : 0); local_flags |= (cgi_variable(ENABLE_USER_FLAG) ? LOCAL_ENABLE_USER : 0); local_flags |= (cgi_variable(DISABLE_USER_FLAG) ? LOCAL_DISABLE_USER : 0); - rslt = change_password(host, cgi_variable_nonull(SWAT_USER), @@ -1118,14 +1275,12 @@ static void chg_passwd(void) if(cgi_variable(CHG_S_PASSWD_FLAG)) { printf("

"); if (rslt == True) { - printf(_(" The passwd for '%s' has been changed."), cgi_variable_nonull(SWAT_USER)); - printf("\n"); + printf("%s\n", _(" The passwd has been changed.")); } else { - printf(_(" The passwd for '%s' has NOT been changed."), cgi_variable_nonull(SWAT_USER)); - printf("\n"); + printf("%s\n", _(" The passwd has NOT been changed.")); } } - + return; } @@ -1135,20 +1290,15 @@ static void chg_passwd(void) static void passwd_page(void) { const char *new_name = cgi_user_name(); - - /* - * After the first time through here be nice. If the user - * changed the User box text to another users name, remember it. - */ - if (cgi_variable(SWAT_USER)) { - new_name = cgi_variable_nonull(SWAT_USER); - } + const char passwd_form[] = "passwd"; + const char rpasswd_form[] = "rpasswd"; if (!new_name) new_name = ""; printf("

%s

\n", _("Server Password Management")); printf("\n"); + print_xsrf_token(cgi_user_name(), cgi_user_pass(), passwd_form); printf("
\n"); @@ -1188,14 +1338,16 @@ static void passwd_page(void) * 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. */ - if ((cgi_variable(CHG_S_PASSWD_FLAG)) || (cgi_variable(ADD_USER_FLAG)) || (cgi_variable(DELETE_USER_FLAG)) || - (cgi_variable(DISABLE_USER_FLAG)) || (cgi_variable(ENABLE_USER_FLAG))) { + if (verify_xsrf_token(passwd_form) && + ((cgi_variable(CHG_S_PASSWD_FLAG)) || (cgi_variable(ADD_USER_FLAG)) || (cgi_variable(DELETE_USER_FLAG)) || + (cgi_variable(DISABLE_USER_FLAG)) || (cgi_variable(ENABLE_USER_FLAG)))) { chg_passwd(); } printf("

%s

\n", _("Client/Server Password Management")); printf("\n"); + print_xsrf_token(cgi_user_name(), cgi_user_pass(), rpasswd_form); printf("
\n"); @@ -1228,7 +1380,7 @@ static void passwd_page(void) * 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)) { + if (verify_xsrf_token(passwd_form) && cgi_variable(CHG_R_PASSWD_FLAG)) { chg_passwd(); } @@ -1245,30 +1397,27 @@ static void printers_page(void) int i; int mode = 0; unsigned int parm_filter = FLAG_BASIC; + const char form_name[] = "printers"; + + if (!verify_xsrf_token(form_name)) { + goto output_page; + } if (share) snum = lp_servicenumber(share); - printf("

%s

\n", _("Printer Parameters")); - - printf("

%s

\n", _("Important Note:")); - printf(_("Printer names marked with [*] in the Choose Printer drop-down box ")); - printf(_("are autoloaded printers from ")); - printf("%s\n", _("Printcap Name")); - printf("%s\n", _("Attempting to delete these printers from SWAT will have no effect.")); - if (cgi_variable("Commit") && snum >= 0) { commit_parameters(snum); if (snum >= iNumNonAutoPrintServices) save_reload(snum); else - save_reload(0); + save_reload(-1); snum = lp_servicenumber(share); } if (cgi_variable("Delete") && snum >= 0) { lp_remove_service(snum); - save_reload(0); + save_reload(-1); share = NULL; snum = -1; } @@ -1285,8 +1434,6 @@ static void printers_page(void) } } - printf("\n"); - if ( cgi_variable("ViewMode") ) mode = atoi(cgi_variable_nonull("ViewMode")); if ( cgi_variable("BasicMode")) @@ -1294,6 +1441,19 @@ static void printers_page(void) if ( cgi_variable("AdvMode")) mode = 1; +output_page: + printf("

%s

\n", _("Printer Parameters")); + + printf("

%s

\n", _("Important Note:")); + printf("%s",_("Printer names marked with [*] in the Choose Printer drop-down box ")); + printf("%s",_("are autoloaded printers from ")); + printf("%s\n", _("Printcap Name")); + printf("%s\n", _("Attempting to delete these printers from SWAT will have no effect.")); + + + printf("\n"); + print_xsrf_token(cgi_user_name(), cgi_user_pass(), form_name); + ViewModeBoxes( mode ); switch ( mode ) { case 0: @@ -1395,7 +1555,7 @@ const char *lang_msg_rotate(TALLOC_CTX *ctx, const char *msgid) }; TALLOC_CTX *frame = talloc_stackframe(); - fault_setup(NULL); + fault_setup(); umask(S_IWGRP | S_IWOTH); #if defined(HAVE_SET_AUTH_PARAMETERS) @@ -1410,13 +1570,15 @@ const char *lang_msg_rotate(TALLOC_CTX *ctx, const char *msgid) /* we don't want any SIGPIPE messages */ BlockSignals(True,SIGPIPE); - dbf = x_fopen("/dev/null", O_WRONLY, 0); - if (!dbf) dbf = x_stderr; + debug_set_logfile("/dev/null"); /* we don't want stderr screwing us up */ close(2); open("/dev/null", O_WRONLY); + setup_logging("swat", DEBUG_FILE); + load_case_tables(); + pc = poptGetContext("swat", argc, (const char **) argv, long_options, 0); /* Parse command line options */ @@ -1425,13 +1587,30 @@ const char *lang_msg_rotate(TALLOC_CTX *ctx, const char *msgid) poptFreeContext(pc); - load_case_tables(); - - setup_logging(argv[0],False); + /* This should set a more apporiate log file */ load_config(True); + reopen_logs(); load_interfaces(); iNumNonAutoPrintServices = lp_numservices(); - load_printers(); + if (pcap_cache_loaded()) { + struct tevent_context *ev_ctx; + struct messaging_context *msg_ctx; + + ev_ctx = s3_tevent_context_init(NULL); + if (ev_ctx == NULL) { + printf("s3_tevent_context_init() failed\n"); + return 0; + } + msg_ctx = messaging_init(ev_ctx, ev_ctx); + if (msg_ctx == NULL) { + printf("messaging_init() failed\n"); + return 0; + } + + load_printers(ev_ctx, msg_ctx); + + talloc_free(ev_ctx); + } cgi_setup(get_dyn_SWATDIR(), !demo_mode); @@ -1439,7 +1618,7 @@ const char *lang_msg_rotate(TALLOC_CTX *ctx, const char *msgid) cgi_load_variables(); - if (!file_exist(get_dyn_CONFIGFILE(), NULL)) { + if (!file_exist(get_dyn_CONFIGFILE())) { have_read_access = True; have_write_access = True; } else {