X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fwebcit.c;h=7220a5d7eae9eaf010e3bf3129cfa4e6563dfc10;hb=d120028b4c45f3c26d05186c8ba488fd2feef13f;hp=bdda202f69d3c7734ca518f4d7eae602e5883298;hpb=ae7836a788b07db74d31b532c21090ad8de417f4;p=citadel.git diff --git a/webcit/webcit.c b/webcit/webcit.c index bdda202f6..7220a5d7e 100644 --- a/webcit/webcit.c +++ b/webcit/webcit.c @@ -390,11 +390,8 @@ void output_headers( int do_httpheaders, /* 1 = output HTTP headers /* ICONBAR */ if (do_htmlhead) { - if (WC->HaveInstantMessages) { - wprintf("
\n"); - page_popup(); - wprintf("
\n"); - } + + /* check for ImportantMessages (these display in a div overlaying the main screen) */ if (strlen(WC->ImportantMessage) > 0) { wprintf("
\n"); wprintf("" @@ -405,11 +402,15 @@ void output_headers( int do_httpheaders, /* 1 = output HTTP headers "\n"); safestrncpy(WC->ImportantMessage, "", sizeof WC->ImportantMessage); } + if ( (WC->logged_in) && (!unset_cookies) ) { wprintf("
"); - do_iconbar(); - wprintf("
\n"); + do_selected_iconbar(); + /* check for instant messages (these display in a new window) + page_popup(); */ + wprintf("
"); } + if (do_room_banner == 1) { wprintf("
\n"); embed_room_banner(NULL, navbar_default); @@ -438,18 +439,6 @@ void http_redirect(char *whichpage) { -void check_for_instant_messages() -{ - char buf[SIZ]; - - serv_puts("NOOP"); - serv_getln(buf, sizeof buf); - if (buf[3] == '*') WC->HaveInstantMessages = 1; -} - - - - /* * Output a piece of content to the web browser */ @@ -832,17 +821,16 @@ void ajax_servcmd(void) begin_ajax_response(); - /* lprintf(9, "Sending cmd: %s\n", bstr("g_cmd")); */ serv_printf("%s", bstr("g_cmd")); serv_getln(buf, sizeof buf); - /* lprintf(9, " Response: %s\n", buf); */ + wprintf("%s\n", buf); if (buf[0] == '8') { serv_printf("\n\n000"); } if ((buf[0] == '1') || (buf[0] == '8')) { while (serv_getln(gcontent, sizeof gcontent), strcmp(gcontent, "000")) { - /* maybe do something with it? */ + wprintf("%s\n", gcontent); } wprintf("000"); } @@ -865,9 +853,42 @@ void ajax_servcmd(void) } end_ajax_response(); + + /* This is kind of an ugly hack, but this is the only place it can go. + * If the command was GEXP, then the instant messenger window must be + * running, so reset the "last_pager_check" watchdog timer so + * that page_popup() doesn't try to open it a second time. + */ + if (!strncasecmp(bstr("g_cmd"), "GEXP", 4)) { + WC->last_pager_check = time(NULL); + } } +/* + * Helper function for the asynchronous check to see if we need + * to open the instant messenger window. + */ +void seconds_since_last_gexp(void) +{ + char buf[256]; + + begin_ajax_response(); + if ( (time(NULL) - WC->last_pager_check) < 30) { + wprintf("NO\n"); + } + else { + serv_puts("NOOP"); + serv_getln(buf, sizeof buf); + if (buf[3] == '*') { + wprintf("YES"); + } + else { + wprintf("NO"); + } + } + end_ajax_response(); +} @@ -896,8 +917,8 @@ void session_loop(struct httprequest *req) char *content = NULL; char *content_end = NULL; struct httprequest *hptr; - char browser_host[SIZ]; - char user_agent[SIZ]; + char browser_host[256]; + char user_agent[256]; int body_start = 0; int is_static = 0; @@ -918,11 +939,11 @@ void session_loop(struct httprequest *req) safestrncpy(c_httpauth_string, "", sizeof c_httpauth_string); safestrncpy(c_httpauth_user, DEFAULT_HTTPAUTH_USER, sizeof c_httpauth_user); safestrncpy(c_httpauth_pass, DEFAULT_HTTPAUTH_PASS, sizeof c_httpauth_pass); + strcpy(browser_host, ""); WC->upload_length = 0; WC->upload = NULL; WC->vars = NULL; - WC->is_wap = 0; hptr = req; @@ -1002,6 +1023,13 @@ void session_loop(struct httprequest *req) else if (!strncasecmp(buf, "Host: ", 6)) { safestrncpy(WC->http_host, &buf[6], sizeof WC->http_host); } + else if (!strncasecmp(buf, "X-Forwarded-For: ", 17)) { + safestrncpy(browser_host, &buf[17], sizeof browser_host); + while (num_tokens(browser_host, ',') > 1) { + remove_token(browser_host, 0, ','); + } + striplt(browser_host); + } /* Only WAP gateways explicitly name this content-type */ else if (strstr(buf, "text/vnd.wap.wml")) { WC->is_wap = 1; @@ -1095,7 +1123,16 @@ void session_loop(struct httprequest *req) else { WC->connected = 1; serv_getln(buf, sizeof buf); /* get the server welcome message */ - locate_host(browser_host, WC->http_sock); + + /* From what host is our user connecting? Go with + * the host at the other end of the HTTP socket, + * unless we are following X-Forwarded-For: headers + * and such a header has already turned up something. + */ + if ( (!follow_xff) || (strlen(browser_host) == 0) ) { + locate_host(browser_host, WC->http_sock); + } + get_serv_info(browser_host, user_agent); if (serv_info.serv_rev_level < MINIMUM_CIT_VERSION) { wprintf(_("You are connected to a Citadel " @@ -1215,11 +1252,6 @@ void session_loop(struct httprequest *req) } } - /* - * If there are instant messages waiting, retrieve them for display. - */ - check_for_instant_messages(); - if (!strcasecmp(action, "image")) { output_image(); @@ -1249,10 +1281,20 @@ void session_loop(struct httprequest *req) display_main_menu(); } else if (!strcasecmp(action, "who")) { who(); + } else if (!strcasecmp(action, "sslg")) { + seconds_since_last_gexp(); } else if (!strcasecmp(action, "who_inner_html")) { begin_ajax_response(); who_inner_div(); end_ajax_response(); + } else if (!strcasecmp(action, "iconbar_ajax_menu")) { + begin_ajax_response(); + do_iconbar(); + end_ajax_response(); + } else if (!strcasecmp(action, "iconbar_ajax_rooms")) { + begin_ajax_response(); + do_iconbar_roomlist(); + end_ajax_response(); } else if (!strcasecmp(action, "knrooms")) { knrooms(); } else if (!strcasecmp(action, "gotonext")) { @@ -1283,6 +1325,8 @@ void session_loop(struct httprequest *req) embed_message(arg1); } else if (!strcasecmp(action, "printmsg")) { print_message(arg1); + } else if (!strcasecmp(action, "msgheaders")) { + display_headers(arg1); } else if (!strcasecmp(action, "display_enter")) { display_enter(); } else if (!strcasecmp(action, "post")) { @@ -1330,7 +1374,7 @@ void session_loop(struct httprequest *req) } else if (!strcasecmp(action, "editinfo")) { save_edit(_("Room info"), "EINF 1", 1); } else if (!strcasecmp(action, "display_editbio")) { - sprintf(buf, "RBIO %s", WC->wc_username); + sprintf(buf, "RBIO %s", WC->wc_fullname); display_edit(_("Your bio"), "NOOP", buf, "editbio", 3); } else if (!strcasecmp(action, "editbio")) { save_edit(_("Your bio"), "EBIO", 0); @@ -1451,8 +1495,6 @@ void session_loop(struct httprequest *req) begin_ajax_response(); summary_inner_div(); end_ajax_response(); - } else if (!strcasecmp(action, "iconbar")) { - do_iconbar(); } else if (!strcasecmp(action, "display_customize_iconbar")) { display_customize_iconbar(); } else if (!strcasecmp(action, "commit_iconbar")) { @@ -1475,6 +1517,8 @@ void session_loop(struct httprequest *req) recp_autocomplete(bstr("cc")); } else if (!strcasecmp(action, "bcc_autocomplete")) { recp_autocomplete(bstr("bcc")); + } else if (!strcasecmp(action, "set_floordiv_expanded")) { + set_floordiv_expanded(arg1); } else if (!strcasecmp(action, "diagnostics")) { output_headers(1, 1, 1, 0, 0, 0); wprintf("Session: %d
\n", WC->wc_session); @@ -1503,5 +1547,4 @@ SKIP_ALL_THIS_CRAP: free(WC->upload); WC->upload_length = 0; } - }