X-Git-Url: https://code.citadel.org/?p=citadel.git;a=blobdiff_plain;f=webcit%2Fwebserver.c;h=612ac5d086507408efc3119001df8b84115bc917;hp=858f0b61e0aee2332196023cad3b619174fae366;hb=8f0a07617656512ca31a029814d04fc254ca9d33;hpb=d1dc3f670a90681177131b9fe656503c0f1a1147 diff --git a/webcit/webserver.c b/webcit/webserver.c index 858f0b61e..612ac5d08 100644 --- a/webcit/webserver.c +++ b/webcit/webserver.c @@ -3,7 +3,7 @@ * waiting on the specified port for incoming HTTP connections. When a * connection is established, it calls context_loop() from context_loop.c. * - * Copyright (c) 1996-2010 by the citadel.org developers. + * Copyright (c) 1996-2011 by the citadel.org developers. * This program is released under the terms of the GNU General Public License v3. * */ @@ -22,9 +22,10 @@ extern int verbosity; /* Logging level */ extern char static_icon_dir[PATH_MAX]; /* where should we find our mime icons */ int is_https = 0; /* Nonzero if I am an HTTPS service */ int follow_xff = 0; /* Follow X-Forwarded-For: header */ -int home_specified = 0; /* did the user specify a homedir? */ int DisableGzip = 0; -StrBuf *site_prefix = NULL; +struct redirector *redir = NULL; +char *default_landing_page = NULL; +int num_redir = 0; extern pthread_mutex_t SessionListMutex; extern pthread_key_t MyConKey; @@ -35,21 +36,19 @@ extern void graceful_shutdown_watcher(int signum); extern void graceful_shutdown(int signum); extern void start_daemon(char *pid_file); extern void webcit_calc_dirs_n_files(int relh, const char *basedir, int home, char *webcitdir, char *relhome); - +extern void worker_entry(void); extern void drop_root(uid_t UID); -char socket_dir[PATH_MAX]; /* where to talk to our citadel server */ - +char socket_dir[PATH_MAX]; /* where to talk to our citadel server */ char *server_cookie = NULL; /* our Cookie connection to the client */ int http_port = PORT_NUM; /* Port to listen on */ -char *ctdlhost = DEFAULT_HOST; /* our name */ -char *ctdlport = DEFAULT_PORT; /* our Port */ -int setup_wizard = 0; /* should we run the setup wizard? \todo */ -char wizard_filename[PATH_MAX]; /* where's the setup wizard? */ +char *ctdlhost = DEFAULT_HOST; /* Host name or IP address of Citadel server */ +char *ctdlport = DEFAULT_PORT; /* Port number of Citadel server */ +int setup_wizard = 0; /* should we run the setup wizard? */ +char wizard_filename[PATH_MAX]; /* location of file containing the last webcit version against which we ran setup wizard */ int running_as_daemon = 0; /* should we deamonize on startup? */ - /* #define DBG_PRINNT_HOOKS_AT_START */ #ifdef DBG_PRINNT_HOOKS_AT_START extern HashList *HandlerHash; @@ -66,6 +65,82 @@ extern int LoadTemplates; + +/* + * Handle redirects to legacy web servers + */ +void handle_redir(void) { + if (num_redir > 0) { + int i; + const char *req = ChrPtr(WC->Hdr->this_page); + if (!req) { + do_404(); + return; + } + if (req[0] == '/') ++req; + syslog(9, "handle_redir() called; redirect this: %s", req); + for (i=0; i= num_redir_alloc) { + if (num_redir_alloc == 0) { + num_redir_alloc = 10; + } + else { + num_redir_alloc = num_redir_alloc * 2; + } + redir = realloc(redir, sizeof(struct redirector) * num_redir_alloc ); + } + + extract_token(redir[num_redir].urlpart, buf, 0, '|', sizeof(redir[num_redir].urlpart)); + extract_token(redir[num_redir].redirect_to, buf, 1, '|', sizeof(redir[num_redir].redirect_to)); + WebcitAddUrlHandler(redir[num_redir].urlpart, strlen(redir[num_redir].urlpart), "", 0, handle_redir, ANONYMOUS|COOKIEUNNEEDED|ISSTATIC); + if (!strcasecmp(redir[num_redir].urlpart, "home")) { + default_landing_page = redir[num_redir].redirect_to ; + } + ++num_redir; + } + + } + fclose(fp); +} + + + /* * Here's where it all begins. */ @@ -80,7 +155,6 @@ int main(int argc, char **argv) char ip_addr[256]="*"; int relh=0; int home=0; - int home_specified=0; char relhome[PATH_MAX]=""; char webcitdir[PATH_MAX] = DATADIR; char *pidfile = NULL; @@ -112,14 +186,17 @@ int main(int argc, char **argv) /* Parse command line */ #ifdef HAVE_OPENSSL - while ((a = getopt(argc, argv, "u:h:i:p:t:T:B:x:dD:G:cfsS:Z")) != EOF) + while ((a = getopt(argc, argv, "u:h:i:p:t:T:B:x:dD:G:r:cfsS:Z")) != EOF) #else - while ((a = getopt(argc, argv, "u:h:i:p:t:T:B:x:dD:G:cfZ")) != EOF) + while ((a = getopt(argc, argv, "u:h:i:p:t:T:B:x:dD:G:r:cfZ")) != EOF) #endif switch (a) { case 'u': UID = atol(optarg); break; + case 'r': + load_redirs(optarg); + break; case 'h': hdir = strdup(optarg); relh=hdir[0]!='/'; @@ -130,7 +207,6 @@ int main(int argc, char **argv) safestrncpy(relhome, relhome, sizeof relhome); } /* free(hdir); TODO: SHOULD WE DO THIS? */ - home_specified = 1; home=1; break; case 'd': @@ -183,8 +259,7 @@ int main(int argc, char **argv) if (gethostname (&server_cookie[strlen(server_cookie)], 200) != 0) { - lprintf(2, "gethostname: %s\n", - strerror(errno)); + syslog(2, "gethostname: %s", strerror(errno)); free(server_cookie); } } @@ -216,6 +291,12 @@ int main(int argc, char **argv) return 1; } + /* Start the logger */ + openlog("webcit", + ( running_as_daemon ? (LOG_PID) : (LOG_PID | LOG_PERROR) ), + LOG_DAEMON + ); + if (optind < argc) { ctdlhost = argv[optind]; if (++optind < argc) @@ -235,32 +316,42 @@ int main(int argc, char **argv) LoadIconDir(static_icon_dir); /* Tell 'em who's in da house */ - lprintf(1, PACKAGE_STRING "\n"); - lprintf(1, "Copyright (C) 1996-2010 by the Citadel development team.\n" - "This software is distributed under the terms of the " - "GNU General Public License.\n\n" - ); - - - /* initialize the International Bright Young Thing */ + syslog(1, "%s", PACKAGE_STRING); + syslog(1, "Copyright (C) 1996-2011 by the citadel.org team"); + syslog(1, " "); + syslog(1, "This program is open source software: you can redistribute it and/or"); + syslog(1, "modify it under the terms of the GNU General Public License as published"); + syslog(1, "by the Free Software Foundation, either version 3 of the License, or"); + syslog(1, "(at your option) any later version."); + syslog(1, " "); + syslog(1, "This program is distributed in the hope that it will be useful,"); + syslog(1, "but WITHOUT ANY WARRANTY; without even the implied warranty of"); + syslog(1, "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the"); + syslog(1, "GNU General Public License for more details."); + syslog(1, " "); + syslog(1, "You should have received a copy of the GNU General Public License"); + syslog(1, "along with this program. If not, see ."); + syslog(1, " "); + + + /* initialize various subsystems */ initialise_modules(); - InitTemplateCache(); if (DumpTemplateI18NStrings) { FILE *fd; StrBufAppendBufPlain(I18nDump, HKEY("}\n"), 0); if (StrLength(I18nDump) < 50) { - lprintf(1, "********************************************************************************\n"); - lprintf(1, "* No strings found in templates! Are you sure they're there? *\n"); - lprintf(1, "********************************************************************************\n"); + syslog(1, "********************************************************************************\n"); + syslog(1, "* No strings found in templates! Are you sure they're there? *\n"); + syslog(1, "********************************************************************************\n"); return -1; } fd = fopen(I18nDumpFile, "w"); if (fd == NULL) { - lprintf(1, "********************************************************************************\n"); - lprintf(1, "* unable to open I18N dumpfile [%s] *\n", I18nDumpFile); - lprintf(1, "********************************************************************************\n"); + syslog(1, "********************************************************************************\n"); + syslog(1, "* unable to open I18N dumpfile [%s] *\n", I18nDumpFile); + syslog(1, "********************************************************************************\n"); return -1; } rv = fwrite(ChrPtr(I18nDump), 1, StrLength(I18nDump), fd); @@ -281,7 +372,7 @@ int main(int argc, char **argv) * wcsession struct to which the thread is currently bound. */ if (pthread_key_create(&MyConKey, NULL) != 0) { - lprintf(1, "Can't create TSD key: %s\n", strerror(errno)); + syslog(1, "Can't create TSD key: %s\n", strerror(errno)); } InitialiseSemaphores (); @@ -293,7 +384,7 @@ int main(int argc, char **argv) */ #ifdef HAVE_OPENSSL if (pthread_key_create(&ThreadSSL, NULL) != 0) { - lprintf(1, "Can't create TSD key: %s\n", strerror(errno)); + syslog(1, "Can't create TSD key: %s\n", strerror(errno)); } #endif @@ -304,11 +395,11 @@ int main(int argc, char **argv) */ if (!IsEmptyStr(uds_listen_path)) { - lprintf(2, "Attempting to create listener socket at %s...\n", uds_listen_path); + syslog(2, "Attempting to create listener socket at %s...\n", uds_listen_path); msock = webcit_uds_server(uds_listen_path, LISTEN_QUEUE_LENGTH); } else { - lprintf(2, "Attempting to bind to port %d...\n", http_port); + syslog(2, "Attempting to bind to port %d...\n", http_port); msock = webcit_tcp_server(ip_addr, http_port, LISTEN_QUEUE_LENGTH); } if (msock < 0) @@ -317,7 +408,7 @@ int main(int argc, char **argv) return -msock; } - lprintf(2, "Listening on socket %d\n", msock); + syslog(2, "Listening on socket %d\n", msock); signal(SIGPIPE, SIG_IGN); pthread_mutex_init(&SessionListMutex, NULL); @@ -343,7 +434,7 @@ int main(int argc, char **argv) /* Become a worker thread. More worker threads will be spawned as they are needed. */ worker_entry(); - ShutDownLibCitadel (); + ShutDownLibCitadel(); return 0; }