From 690a9d257b27d08e1a928950fac8609d4177b5c5 Mon Sep 17 00:00:00 2001 From: Stefan Ritt Date: Wed, 22 Oct 2014 15:01:59 +0200 Subject: [PATCH] Modified verbosity model, fixed keep-alive bug, switched to Cache-control --- src/elogd.c | 250 ++++++++++++++++++++++++++-------------------------- 1 file changed, 125 insertions(+), 125 deletions(-) diff --git a/src/elogd.c b/src/elogd.c index e1fd7edb..0186f4e0 100755 --- a/src/elogd.c +++ b/src/elogd.c @@ -77,11 +77,15 @@ char rem_host_ip[256]; int _sock; BOOL use_keepalive, enable_execute = FALSE; BOOL fckedit_exist, image_magick_exist; -int _verbose, _current_message_id; +int _verbose_level, _current_message_id; int _logging_level, _ssl_flag; LOGBOOK *lb_list = NULL; +#define VERBOSE_URL 1 +#define VERBOSE_INFO 2 +#define VERBOSE_DEBUG 3 + #ifdef HAVE_SSL SSL *_ssl_con; #endif @@ -305,14 +309,14 @@ static BOOL chkext(const char *str, const char *ext) return TRUE; } -int is_verbose(void) +int get_verbose(void) { - return _verbose; + return _verbose_level; } void set_verbose(int v) { - _verbose = v; + _verbose_level = v; } /* workaround for some gcc versions bug for "%c" format (see strftime(3) */ @@ -938,7 +942,7 @@ int my_shell(char *cmd, char *result, int size) exit(EXIT_FAILURE); } } - } else if (is_verbose()) + } else if (get_verbose() >= VERBOSE_INFO) eprintf("Falling back to group \"%s\"\n", str); if (!getcfg("global", "Usr", str, sizeof(str)) || setuser(str) < 0) { @@ -951,14 +955,14 @@ int my_shell(char *cmd, char *result, int size) exit(EXIT_FAILURE); } } - } else if (is_verbose()) + } else if (get_verbose() >= VERBOSE_INFO) eprintf("Falling back to user \"%s\"\n", str); } /* execute shell with redirection to /tmp/elog-shell */ sprintf(str, "/bin/sh -c \"%s\" > /tmp/elog-shell 2>&1", cmd); - if (is_verbose()) { + if (get_verbose() >= VERBOSE_INFO) { efputs("Going to execute: "); efputs(str); efputs("\n"); @@ -1934,7 +1938,7 @@ void compose_email_header(LOGBOOK * lbs, char *subject, char *from, char *to, ch offset = (-(int) my_timezone()); if (ts->tm_isdst) offset += 3600; - if (is_verbose()) { + if (get_verbose() >= VERBOSE_INFO) { sprintf(str, "timezone: %d, offset: %d\n", (int) my_timezone(), (int) offset); efputs(str); } @@ -2054,7 +2058,7 @@ int sendmail(LOGBOOK * lbs, char *smtp_host, char *from, char *to, char *text, c memset(error, 0, error_size); - if (is_verbose()) + if (get_verbose() >= VERBOSE_INFO) eprintf("\n\nEmail from %s to %s, SMTP host %s:\n", from, to, smtp_host); sprintf(buffer, "Email from %s to ", from); strlcat(buffer, to, sizeof(buffer)); @@ -2092,7 +2096,7 @@ int sendmail(LOGBOOK * lbs, char *smtp_host, char *from, char *to, char *text, c str = xmalloc(strsize); recv_string(s, str, strsize, 10000); - if (is_verbose()) + if (get_verbose() >= VERBOSE_INFO) efputs(str); write_logfile(lbs, str); @@ -2100,7 +2104,7 @@ int sendmail(LOGBOOK * lbs, char *smtp_host, char *from, char *to, char *text, c do { str[0] = 0; recv_string(s, str, strsize, 300); - if (is_verbose()) + if (get_verbose() >= VERBOSE_INFO) efputs(str); write_logfile(lbs, str); } while (str[0]); @@ -2109,13 +2113,13 @@ int sendmail(LOGBOOK * lbs, char *smtp_host, char *from, char *to, char *text, c snprintf(str, strsize - 1, "EHLO %s\r\n", host_name); send(s, str, strlen(str), 0); - if (is_verbose()) + if (get_verbose() >= VERBOSE_INFO) efputs(str); write_logfile(lbs, str); do { recv_string(s, str, strsize, 3000); - if (is_verbose()) + if (get_verbose() >= VERBOSE_INFO) efputs(str); write_logfile(lbs, str); if (!check_smtp_error(str, 250, error, error_size)) @@ -2127,11 +2131,11 @@ int sendmail(LOGBOOK * lbs, char *smtp_host, char *from, char *to, char *text, c snprintf(str, strsize - 1, "HELO %s\r\n", host_name); send(s, str, strlen(str), 0); - if (is_verbose()) + if (get_verbose() >= VERBOSE_INFO) efputs(str); write_logfile(lbs, str); recv_string(s, str, strsize, 3000); - if (is_verbose()) + if (get_verbose() >= VERBOSE_INFO) efputs(str); write_logfile(lbs, str); if (!check_smtp_error(str, 250, error, error_size)) @@ -2143,7 +2147,7 @@ int sendmail(LOGBOOK * lbs, char *smtp_host, char *from, char *to, char *text, c snprintf(str, strsize - 1, "AUTH LOGIN\r\n"); send(s, str, strlen(str), 0); - if (is_verbose()) + if (get_verbose() >= VERBOSE_INFO) efputs(str); write_logfile(lbs, str); recv_string(s, str, strsize, 3000); @@ -2151,13 +2155,13 @@ int sendmail(LOGBOOK * lbs, char *smtp_host, char *from, char *to, char *text, c *strchr(str, '\r') = 0; if (atoi(str) != 334) { strcat(str, "\n"); - if (is_verbose()) + if (get_verbose() >= VERBOSE_INFO) efputs(str); write_logfile(lbs, str); } else { base64_decode(str + 4, decoded); strcat(decoded, "\n"); - if (is_verbose()) + if (get_verbose() >= VERBOSE_INFO) efputs(decoded); write_logfile(lbs, decoded); } @@ -2168,7 +2172,7 @@ int sendmail(LOGBOOK * lbs, char *smtp_host, char *from, char *to, char *text, c base64_encode((unsigned char *) decoded, (unsigned char *) str, strsize); strcat(str, "\r\n"); send(s, str, strlen(str), 0); - if (is_verbose()) + if (get_verbose() >= VERBOSE_INFO) efputs(decoded); write_logfile(lbs, decoded); recv_string(s, str, strsize, 3000); @@ -2176,7 +2180,7 @@ int sendmail(LOGBOOK * lbs, char *smtp_host, char *from, char *to, char *text, c *strchr(str, '\r') = 0; base64_decode(str + 4, decoded); strcat(decoded, "\n"); - if (is_verbose()) + if (get_verbose() >= VERBOSE_INFO) efputs(decoded); write_logfile(lbs, decoded); if (!check_smtp_error(str, 334, error, error_size)) @@ -2185,11 +2189,11 @@ int sendmail(LOGBOOK * lbs, char *smtp_host, char *from, char *to, char *text, c getcfg(lbs->name, "SMTP password", str, strsize); strcat(str, "\r\n"); send(s, str, strlen(str), 0); - if (is_verbose()) + if (get_verbose() >= VERBOSE_INFO) efputs(str); write_logfile(lbs, str); recv_string(s, str, strsize, 3000); - if (is_verbose()) + if (get_verbose() >= VERBOSE_INFO) efputs(str); write_logfile(lbs, str); if (!check_smtp_error(str, 235, error, error_size)) @@ -2198,11 +2202,11 @@ int sendmail(LOGBOOK * lbs, char *smtp_host, char *from, char *to, char *text, c snprintf(str, strsize - 1, "MAIL FROM: %s\r\n", from); send(s, str, strlen(str), 0); - if (is_verbose()) + if (get_verbose() >= VERBOSE_INFO) efputs(str); write_logfile(lbs, str); recv_string(s, str, strsize, 3000); - if (is_verbose()) + if (get_verbose() >= VERBOSE_INFO) efputs(str); write_logfile(lbs, str); @@ -2218,13 +2222,13 @@ int sendmail(LOGBOOK * lbs, char *smtp_host, char *from, char *to, char *text, c snprintf(str, strsize - 1, "RCPT TO: <%s>\r\n", list[i]); send(s, str, strlen(str), 0); - if (is_verbose()) + if (get_verbose() >= VERBOSE_INFO) efputs(str); write_logfile(lbs, str); /* increased timeout for SMTP servers with long alias lists */ recv_string(s, str, strsize, 30000); - if (is_verbose()) + if (get_verbose() >= VERBOSE_INFO) efputs(str); write_logfile(lbs, str); @@ -2234,11 +2238,11 @@ int sendmail(LOGBOOK * lbs, char *smtp_host, char *from, char *to, char *text, c snprintf(str, strsize - 1, "DATA\r\n"); send(s, str, strlen(str), 0); - if (is_verbose()) + if (get_verbose() >= VERBOSE_INFO) efputs(str); write_logfile(lbs, str); recv_string(s, str, strsize, 3000); - if (is_verbose()) + if (get_verbose() >= VERBOSE_INFO) efputs(str); write_logfile(lbs, str); if (!check_smtp_error(str, 354, error, error_size)) @@ -2258,11 +2262,11 @@ int sendmail(LOGBOOK * lbs, char *smtp_host, char *from, char *to, char *text, c } send(s, str, strlen(str), 0); - if (is_verbose()) + if (get_verbose() >= VERBOSE_INFO) efputs(str); write_logfile(lbs, str); recv_string(s, str, strsize, 10000); - if (is_verbose()) + if (get_verbose() >= VERBOSE_INFO) efputs(str); write_logfile(lbs, str); if (!check_smtp_error(str, 250, error, error_size)) @@ -2270,11 +2274,11 @@ int sendmail(LOGBOOK * lbs, char *smtp_host, char *from, char *to, char *text, c snprintf(str, strsize - 1, "QUIT\r\n"); send(s, str, strlen(str), 0); - if (is_verbose()) + if (get_verbose() >= VERBOSE_INFO) efputs(str); write_logfile(lbs, str); recv_string(s, str, strsize, 3000); - if (is_verbose()) + if (get_verbose() >= VERBOSE_INFO) efputs(str); write_logfile(lbs, str); if (!check_smtp_error(str, 221, error, error_size)) @@ -3886,7 +3890,7 @@ int parse_file(LOGBOOK *lbs, char *file_name) MD5_checksum(p, len, lbs->el_index[*lbs->n_el_index].md5_digest); if (lbs->el_index[*lbs->n_el_index].message_id > 0) { - if (is_verbose() > 1) { + if (get_verbose() >= VERBOSE_INFO) { eprintf(" ID %3d, %s, ofs %5d, %s, MD5=", lbs->el_index[*lbs->n_el_index].message_id, str, lbs->el_index[*lbs->n_el_index].offset, lbs->el_index[*lbs->n_el_index].in_reply_to ? "reply" : "thead"); @@ -3986,7 +3990,7 @@ int el_build_index(LOGBOOK * lbs, BOOL rebuild) /* get data directory */ strcpy(base_dir, lbs->data_dir); - if (is_verbose() > 1) { + if (get_verbose() >= VERBOSE_DEBUG) { /* show MD5 from config file */ load_config_section(lbs->name, &buffer, error_str); @@ -4013,7 +4017,7 @@ int el_build_index(LOGBOOK * lbs, BOOL rebuild) return EL_UPGRADE; } - if (is_verbose() > 1) + if (get_verbose() >= VERBOSE_DEBUG) eprintf("Entries:\n"); // move files to directories if (new layout to reduce number of files per directory) @@ -4039,7 +4043,7 @@ int el_build_index(LOGBOOK * lbs, BOOL rebuild) /* sort entries according to date */ qsort(lbs->el_index, *lbs->n_el_index, sizeof(EL_INDEX), eli_compare); - if (is_verbose() > 1) { + if (get_verbose() >= VERBOSE_DEBUG) { eprintf("After sort:\n"); for (i = 0; i < *lbs->n_el_index; i++) eprintf(" ID %3d, %s, ofs %5d\n", lbs->el_index[i].message_id, lbs->el_index[i].file_name, @@ -4171,7 +4175,7 @@ int el_index_logbooks() #endif if (j == 0) { - if (is_verbose()) + if (get_verbose() >= VERBOSE_INFO) eprintf("Created directory \"%s\"\n", str); } else { eprintf("el_index_logbooks: %s\n", strerror(errno)); @@ -4191,7 +4195,7 @@ int el_index_logbooks() /* check if other logbook uses the same directory */ for (j = 0; j < n; j++) if (strcmp(lb_list[j].data_dir, lb_list[n].data_dir) == 0) { - if (is_verbose()) + if (get_verbose() >= VERBOSE_INFO) eprintf("Logbook \"%s\" uses same directory as logbook \"%s\"\n", logbook, lb_list[j].name); lb_list[n].el_index = lb_list[j].el_index; lb_list[n].n_el_index = lb_list[j].n_el_index; @@ -4199,17 +4203,17 @@ int el_index_logbooks() } if (j == n) { - if (is_verbose()) + if (get_verbose() >= VERBOSE_INFO) eprintf("Indexing logbook \"%s\" in \"%s\" ... ", logbook, lb_list[n].data_dir); eflush(); status = el_build_index(&lb_list[n], FALSE); - if (is_verbose()) + if (get_verbose() >= VERBOSE_INFO) if (status == EL_SUCCESS) eprintf("ok\n"); } if (status == EL_EMPTY) { - if (is_verbose()) + if (get_verbose() >= VERBOSE_INFO) eprintf("Found empty logbook \"%s\"\n", logbook); } else if (status == EL_UPGRADE) { eprintf("Please upgrade data files in \"%s\" with the elconv program.\n", data_dir); @@ -7423,7 +7427,7 @@ void show_http_header(LOGBOOK * lbs, BOOL expires, char *cookie) if (expires) { rsprintf("Pragma: no-cache\r\n"); - rsprintf("Expires: Fri, 01 Jan 1983 00:00:00 GMT\r\n"); + rsprintf("Cache-control: private, max-age=0, no-cache, no-store\r\n"); } rsprintf("\r\n"); @@ -7440,8 +7444,8 @@ void show_plain_header(int size, char *file_name) rsprintf("Connection: Keep-Alive\r\n"); rsprintf("Keep-Alive: timeout=60, max=10\r\n"); } - // rsprintf("Pragma: no-cache\r\n"); - rsprintf("Expires: Fri, 01 Jan 1983 00:00:00 GMT\r\n"); + rsprintf("Pragma: no-cache\r\n"); + rsprintf("Cache-control: private, max-age=0, no-cache, no-store\r\n"); rsprintf("Content-Type: text/plain\r\n"); rsprintf("Content-disposition: attachment; filename=\"%s\"\r\n", file_name); if (size) @@ -8320,9 +8324,7 @@ int exist_file(char *file_name) void send_file_direct(char *file_name) { int fh, i, length, delta; - char str[MAX_PATH_LENGTH], dir[MAX_PATH_LENGTH], charset[80], format[80]; - time_t now; - struct tm *gmt; + char str[MAX_PATH_LENGTH], dir[MAX_PATH_LENGTH], charset[80]; getcwd(dir, sizeof(dir)); fh = open(file_name, O_RDONLY | O_BINARY); @@ -8338,14 +8340,9 @@ void send_file_direct(char *file_name) /* set expiration time to one day if no thumbnail */ if (isparam("thumb")) { rsprintf("Pragma: no-cache\r\n"); - rsprintf("Expires: Fri, 01 Jan 1983 00:00:00 GMT\r\n"); + rsprintf("Cache-control: private, max-age=0, no-cache, no-store\r\n"); } else { - time(&now); - now += (int) (3600 * 24); - gmt = gmtime(&now); - strcpy(format, "%A, %d-%b-%y %H:%M:%S GMT"); - strftime(str, sizeof(str), format, gmt); - rsprintf("Expires: %s\r\n", str); + rsprintf("Cache-control: public, max-age=86400\r\n"); } if (keep_alive) { @@ -15194,7 +15191,7 @@ int show_md5_page(LOGBOOK * lbs) rsprintf("Connection: close\r\n"); rsprintf("Content-Type: text/plain;charset=%s\r\n", DEFAULT_HTTP_CHARSET); rsprintf("Pragma: no-cache\r\n"); - rsprintf("Expires: Fri, 01 Jan 1983 00:00:00 GMT\r\n\r\n"); + rsprintf("Cache-control: private, max-age=0, no-cache, no-store\r\n\r\n"); /* calculate MD5 for logbook section in config file */ load_config_section(lbs->name, &buffer, error_str); @@ -15971,7 +15968,7 @@ void receive_config(LOGBOOK * lbs, char *server, char *error_str) /* check version */ p = strstr(buffer, "ELOG HTTP "); if (!p) { - if (is_verbose()) + if (get_verbose() >= VERBOSE_INFO) puts(buffer); sprintf(error_str, "Remote server is not an ELOG server"); xfree(buffer); @@ -15979,7 +15976,7 @@ void receive_config(LOGBOOK * lbs, char *server, char *error_str) } version = atoi(p + 10) * 100 + atoi(p + 12) * 10 + atoi(p + 14); if (version < 254) { - if (is_verbose()) + if (get_verbose() >= VERBOSE_INFO) puts(buffer); strlcpy(str, p + 10, 10); @@ -15994,7 +15991,7 @@ void receive_config(LOGBOOK * lbs, char *server, char *error_str) /* evaluate status */ p = strchr(buffer, ' '); if (p == NULL) { - if (is_verbose()) + if (get_verbose() >= VERBOSE_INFO) puts(buffer); xfree(buffer); *strchr(str, '?') = 0; @@ -16006,7 +16003,7 @@ void receive_config(LOGBOOK * lbs, char *server, char *error_str) p++; status = atoi(p); if (status == 401) { - if (is_verbose()) + if (get_verbose() >= VERBOSE_INFO) puts(buffer); xfree(buffer); eprintf("Please enter password to access remote elogd server: "); @@ -16014,7 +16011,7 @@ void receive_config(LOGBOOK * lbs, char *server, char *error_str) while (pwd[strlen(pwd) - 1] == '\n' || pwd[strlen(pwd) - 1] == '\r') pwd[strlen(pwd) - 1] = 0; } else if (status != 200) { - if (is_verbose()) + if (get_verbose() >= VERBOSE_INFO) puts(buffer); xfree(buffer); *strchr(str, '?') = 0; @@ -16027,7 +16024,7 @@ void receive_config(LOGBOOK * lbs, char *server, char *error_str) p = strstr(buffer, "\r\n\r\n"); if (p == NULL) { - if (is_verbose()) + if (get_verbose() >= VERBOSE_INFO) puts(buffer); xfree(buffer); sprintf(error_str, loc("Cannot receive \"%s\""), str); @@ -16509,7 +16506,7 @@ void synchronize_logbook(LOGBOOK * lbs, int mode, BOOL sync_all) } /* compare MD5s */ - if (is_verbose()) { + if (get_verbose() >= VERBOSE_INFO) { eprintf("CONFIG : "); for (j = 0; j < 16; j++) eprintf("%02X", digest[j]); @@ -16633,7 +16630,7 @@ void synchronize_logbook(LOGBOOK * lbs, int mode, BOOL sync_all) if (exist_remote && exist_cache) { /* compare MD5s */ - if (is_verbose()) { + if (get_verbose() >= VERBOSE_INFO) { eprintf("ID%-5d: ", message_id); for (j = 0; j < 16; j++) eprintf("%02X", lbs->el_index[i_msg].md5_digest[j]); @@ -16776,7 +16773,7 @@ void synchronize_logbook(LOGBOOK * lbs, int mode, BOOL sync_all) if (!equal_md5(md5_cache[i_cache].md5_digest, lbs->el_index[i_msg].md5_digest)) { /* compare MD5s */ - if (is_verbose()) { + if (get_verbose() >= VERBOSE_INFO) { eprintf("ID%-5d: ", message_id); for (j = 0; j < 16; j++) eprintf("%02X", lbs->el_index[i_msg].md5_digest[j]); @@ -16916,7 +16913,7 @@ void synchronize_logbook(LOGBOOK * lbs, int mode, BOOL sync_all) lbs->el_index[i_msg].md5_digest)) { /* compare MD5s */ - if (is_verbose()) { + if (get_verbose() >= VERBOSE_INFO) { eprintf("ID%-5d: ", message_id); for (j = 0; j < 16; j++) eprintf("%02X", lbs->el_index[i_msg].md5_digest[j]); @@ -17023,7 +17020,7 @@ void synchronize_logbook(LOGBOOK * lbs, int mode, BOOL sync_all) if (!equal_md5(md5_cache[i_cache].md5_digest, md5_remote[i_remote].md5_digest)) { /* compare MD5s */ - if (is_verbose()) { + if (get_verbose() >= VERBOSE_INFO) { eprintf("ID-%5: none", message_id); eprintf("\nCache : "); for (j = 0; j < 16; j++) @@ -23115,7 +23112,7 @@ void submit_elog(LOGBOOK * lbs) n = strbreak(list, (char (*)[1500]) mail_list, 200, ",", FALSE); - if (is_verbose()) + if (get_verbose() >= VERBOSE_INFO) eprintf("\n%s to %s\n\n", str, list); for (i = 0; i < n; i++) { @@ -23698,7 +23695,7 @@ int create_thumbnail(LOGBOOK * lbs, char *file_name) snprintf(str, sizeof(str), "SHELL \"%s\"", cmd); write_logfile(lbs, str); - if (is_verbose()) { + if (get_verbose() >= VERBOSE_INFO) { eprintf(str); eprintf("\n"); } @@ -26579,7 +26576,7 @@ void show_uploader_json(LOGBOOK *lbs) rsprintf("Server: ELOG HTTP %s-%s\r\n", VERSION, git_revision + 33); rsprintf("Accept-Ranges: bytes\r\n"); rsprintf("Pragma: no-cache\r\n"); - rsprintf("Expires: Fri, 01 Jan 1983 00:00:00 GMT\r\n"); + rsprintf("Cache-control: private, max-age=0, no-cache, no-store\r\n"); if (keep_alive) { rsprintf("Connection: Keep-Alive\r\n"); rsprintf("Keep-Alive: timeout=60, max=10\r\n"); @@ -27871,7 +27868,7 @@ void decode_post(char *logbook, LOGBOOK * lbs, const char *string, const char *b /* set attachment filename */ strlcpy(file_name, p, sizeof(file_name)); if (file_name[0]) { - if (is_verbose()) + if (get_verbose() >= VERBOSE_INFO) eprintf("decode_post: Found CSV/XML import file\n"); } @@ -27932,7 +27929,7 @@ void decode_post(char *logbook, LOGBOOK * lbs, const char *string, const char *b /* remove spaces */ btou(file_name); if (file_name[0]) { - if (is_verbose()) + if (get_verbose() >= VERBOSE_INFO) eprintf("decode_post: Found attachment %s\n", file_name); /* check filename for invalid characters */ if (strpbrk(file_name, ",;+=")) { @@ -28111,14 +28108,14 @@ int process_http_request(const char *request, int i_conn) if (!strchr(request, '\r')) return 0; - if (is_verbose() == 1) { + if (get_verbose() < VERBOSE_DEBUG) { strlcpy(str, request, sizeof(str)); if (strchr(str, '\r')) *strchr(str, '\r') = 0; if (strchr(str, '\n')) *strchr(str, '\n') = 0; eputs(str); - } else if (is_verbose() > 1) { + } else if (get_verbose() >= VERBOSE_DEBUG) { eputs("\n"); eputs(request); } @@ -28472,7 +28469,7 @@ int process_http_request(const char *request, int i_conn) for (i = 0; i < n; i++) { if (strieq(rem_host, host_list[i]) || strieq(rem_host_ip, host_list[i]) || strieq(host_list[i], "all")) { - if (is_verbose()) + if (get_verbose() >= VERBOSE_INFO) eprintf("Remote host \"%s\" matches \"%s\" in \"Hosts deny\". Access denied.\n", strieq(rem_host_ip, host_list[i]) ? rem_host_ip : rem_host, host_list[i]); authorized = 0; @@ -28481,7 +28478,7 @@ int process_http_request(const char *request, int i_conn) if (host_list[i][0] == '.') { if (strlen(rem_host) > strlen(host_list[i]) && strieq(host_list[i], rem_host + strlen(rem_host) - strlen(host_list[i]))) { - if (is_verbose()) + if (get_verbose() >= VERBOSE_INFO) eprintf("Remote host \"%s\" matches \"%s\" in \"Hosts deny\". Access denied.\n", rem_host, host_list[i]); authorized = 0; @@ -28493,7 +28490,7 @@ int process_http_request(const char *request, int i_conn) if (strlen(str) > strlen(host_list[i])) str[strlen(host_list[i])] = 0; if (strieq(host_list[i], str)) { - if (is_verbose()) + if (get_verbose() >= VERBOSE_INFO) eprintf("Remote host \"%s\" matches \"%s\" in \"Hosts deny\". Access denied.\n", rem_host_ip, host_list[i]); authorized = 0; @@ -28512,7 +28509,7 @@ int process_http_request(const char *request, int i_conn) for (i = 0; i < n; i++) { if (strieq(rem_host, host_list[i]) || strieq(rem_host_ip, host_list[i]) || strieq(host_list[i], "all")) { - if (is_verbose()) + if (get_verbose() >= VERBOSE_INFO) eprintf("Remote host \"%s\" matches \"%s\" in \"Hosts allow\". Access granted.\n", strieq(rem_host_ip, host_list[i]) ? rem_host_ip : rem_host, host_list[i]); authorized = 1; @@ -28521,7 +28518,7 @@ int process_http_request(const char *request, int i_conn) if (host_list[i][0] == '.') { if (strlen(rem_host) > strlen(host_list[i]) && strieq(host_list[i], rem_host + strlen(rem_host) - strlen(host_list[i]))) { - if (is_verbose()) + if (get_verbose() >= VERBOSE_INFO) eprintf("Remote host \"%s\" matches \"%s\" in \"Hosts allow\". Access granted.\n", rem_host, host_list[i]); authorized = 1; @@ -28533,7 +28530,7 @@ int process_http_request(const char *request, int i_conn) if (strlen(str) > strlen(host_list[i])) str[strlen(host_list[i])] = 0; if (strieq(host_list[i], str)) { - if (is_verbose()) + if (get_verbose() >= VERBOSE_INFO) eprintf("Remote host \"%s\" matches \"%s\" in \"Hosts allow\". Access granted.\n", rem_host_ip, host_list[i]); authorized = 1; @@ -28671,9 +28668,9 @@ void send_return(int _sock, const char *net_buffer) send(_sock, header_buffer, strlen(header_buffer), 0); send(_sock, p + 4, length, 0); #endif - if (is_verbose() == 1) { + if (get_verbose() < VERBOSE_DEBUG) { eprintf("Returned %d bytes\n", length); - } else if (is_verbose() == 2) { + } else if (get_verbose() >= VERBOSE_DEBUG) { if (strrchr(net_buffer, '/')) strlcpy(str, strrchr(net_buffer, '/') + 1, sizeof(str)); else @@ -28727,9 +28724,9 @@ void send_return(int _sock, const char *net_buffer) #endif } - if (is_verbose() == 1) { + if (get_verbose() < VERBOSE_DEBUG) { eprintf("Returned %d bytes\n", return_length); - } else if (is_verbose() == 2) { + } else if (get_verbose() == VERBOSE_DEBUG) { if (strrchr(net_buffer, '/')) strlcpy(str, strrchr(net_buffer, '/') + 1, sizeof(str)); else @@ -28934,7 +28931,7 @@ SSL_CTX *init_ssl(void) void server_loop(void) { - int status, i, n_error, broken, min, i_min, i_conn, more_requests; + int status, i, broken, min, i_min, i_conn, more_requests; char str[1000], logbook[256], logbook_enc[256]; char *pend; int lsock, len, flag, content_length, header_length; @@ -29059,7 +29056,7 @@ void server_loop(void) if (strchr(str, ' ')) *strchr(str, ' ') = 0; eprintf("revision %s\n", str); - if (is_verbose()) { + if (get_verbose() >= VERBOSE_INFO) { getcwd(str, sizeof(str)); if (strchr(config_file, DIR_SEPARATOR) == NULL) eprintf("Config file : %s%c%s\n", str, DIR_SEPARATOR, config_file); @@ -29148,7 +29145,7 @@ void server_loop(void) exit(EXIT_FAILURE); } } - } else if (is_verbose()) + } else if (get_verbose() >= VERBOSE_INFO) eprintf("Falling back to group \"%s\"\n", str); if (!getcfg("global", "Usr", str, sizeof(str)) || seteuser(str) < 0) { @@ -29161,7 +29158,7 @@ void server_loop(void) exit(EXIT_FAILURE); } } - } else if (is_verbose()) + } else if (get_verbose() >= VERBOSE_INFO) eprintf("Falling back to user \"%s\".\n", str); } #endif @@ -29218,11 +29215,11 @@ void server_loop(void) eprintf("Keep-alive disabled\n"); /* build logbook indices */ - if (!is_verbose() && !running_as_daemon) + if (get_verbose() == 0 && !running_as_daemon) eprintf("Indexing logbooks ... "); if (el_index_logbooks() != EL_SUCCESS) exit(EXIT_FAILURE); - if (!is_verbose() && !running_as_daemon) + if (get_verbose() == 0 && !running_as_daemon) eputs("done"); #ifndef HAVE_KRB5 @@ -29292,7 +29289,7 @@ void server_loop(void) _ssl_con = SSL_new(ssl_ctx); SSL_set_fd(_ssl_con, _sock); if (SSL_accept(_ssl_con) < 0) { - if (is_verbose()) + if (get_verbose() >= VERBOSE_INFO) eprintf("SSL_accept failed\n"); closesocket(_sock); ka_sock[i_conn] = 0; @@ -29348,25 +29345,29 @@ void server_loop(void) strcpy(remote_host[i_conn], (char *) inet_ntoa(rem_addr)); strcpy(rem_host, remote_host[i_conn]); + + if (get_verbose() == VERBOSE_URL) + eprintf("Open connection #%d on socket %d\n", i, _sock); + + /* start over */ + continue; } - else { - /* check if open connection received data */ - for (i = 0; i < N_MAX_CONNECTION; i++) - if (ka_sock[i] > 0 && FD_ISSET(ka_sock[i], &readfds)) - break; - if (i == N_MAX_CONNECTION) { - _sock = 0; - } else { - i_conn = i; - _sock = ka_sock[i_conn]; + /* check if open connection received data */ + for (i = 0; i < N_MAX_CONNECTION; i++) + if (ka_sock[i] > 0 && FD_ISSET(ka_sock[i], &readfds)) + break; + if (i == N_MAX_CONNECTION) { + _sock = 0; + } else { + i_conn = i; + _sock = ka_sock[i_conn]; #ifdef HAVE_SSL - _ssl_con = ka_ssl_con[i_conn]; + _ssl_con = ka_ssl_con[i_conn]; #endif - ka_time[i_conn] = (int) time(NULL); - memcpy(&rem_addr, &remote_addr[i_conn], sizeof(rem_addr)); - strcpy(rem_host, remote_host[i_conn]); - } + ka_time[i_conn] = (int) time(NULL); + memcpy(&rem_addr, &remote_addr[i_conn], sizeof(rem_addr)); + strcpy(rem_host, remote_host[i_conn]); } /* turn off keep_alive by default */ @@ -29381,7 +29382,6 @@ void server_loop(void) do { /* pipleline loop */ header_length = 0; - n_error = 0; broken = FALSE; return_length = -1; do { @@ -29401,6 +29401,9 @@ void server_loop(void) #endif i = recv(_sock, net_buffer + len, net_buffer_size - len, 0); + if (get_verbose() == VERBOSE_URL) + eprintf("Connection #%d received %d bytes on socket %d\n", i_conn, i, _sock); + } else break; @@ -29409,6 +29412,12 @@ void server_loop(void) broken = TRUE; break; } + /* abort if connection has been closed */ + if (i == 0) { + broken = TRUE; + break; + } + if (i > 0) len += i; @@ -29427,16 +29436,6 @@ void server_loop(void) net_buffer_size += 100000; } - /* abort if 100x received zero bytes */ - if (i == 0) { - n_error++; - if (n_error == 100) { - broken = TRUE; - break; - } - continue; - } - /* repeat until empty line received (fragmented TCP packets!) */ } while (strstr(net_buffer, "\r\n\r\n") == 0); } @@ -29547,7 +29546,7 @@ void server_loop(void) return_length = -1; break; } else { - if (strlen(net_buffer) > 0 && is_verbose()) { + if (strlen(net_buffer) > 0 && get_verbose() >= VERBOSE_INFO) { strcpy(str, "Received unknown HTTP command: "); strencode2(str, net_buffer, sizeof(str)); show_error(str); @@ -29558,14 +29557,14 @@ void server_loop(void) } while (1); if (broken) { - if (is_verbose()) - eprintf("TCP connection broken\n"); + if (get_verbose() >= VERBOSE_URL) + eprintf("TCP connection #%d on socket %d closed\n", i_conn, _sock); keep_alive = FALSE; break; } if (strncmp(net_buffer, "POST", 4) == 0 && len < header_length + content_length) { - if (is_verbose()) + if (get_verbose() >= VERBOSE_INFO) eprintf("Incomplete POST request\n"); keep_alive = FALSE; break; @@ -30237,10 +30236,11 @@ int main(int argc, char *argv[]) if (argv[i][0] == '-' && argv[i][1] == 'D') running_as_daemon = TRUE; else if (argv[i][0] == '-' && argv[i][1] == 'v') { - if (atoi(&argv[i][2]) > 0) - set_verbose(atoi(&argv[i][2])); - else - set_verbose(2); + if (i < argc-1 && atoi(argv[i+1]) > 0) { + set_verbose(atoi(argv[i+1])); + i++; + } else + set_verbose(VERBOSE_INFO); } else if (argv[i][0] == '-' && argv[i][1] == 'S') silent = TRUE; else if (argv[i][0] == '-' && argv[i][1] == 'k') @@ -30325,7 +30325,7 @@ int main(int argc, char *argv[]) printf(" -S be silent\n"); printf(" -s specify resource directory (themes, icons, ...)\n"); printf(" -t create/overwrite SMTP password in config file\n"); - printf(" -v debugging output\n"); + printf(" -v verbose output (1:URL, 2:INFO, 3:DEBUG)\n"); printf(" -x enable execution of shell commands\n\n"); #ifdef OS_WINNT printf("Windows service funtions:\n");