]> code.citadel.org Git - citadel.git/blobdiff - webcit/webcit.c
*** empty log message ***
[citadel.git] / webcit / webcit.c
index 6eb0b2914908aa350e6cf911aee2160fd29f847e..464069c71ec3b082e666f0b4edcbd1b19ba9b8d3 100644 (file)
@@ -107,7 +107,7 @@ void addurls(char *url)
                        ++ptr;
                strcpy(ptr, "");
 
-               u->url_data = malloc(strlen(up) + 1);
+               u->url_data = malloc(strlen(up) + 2);
                strcpy(u->url_data, up);
                u->url_data[b] = 0;
                unescape_input(u->url_data);
@@ -158,7 +158,7 @@ void wprintf(const char *format,...)
        char wbuf[4096];
 
        va_start(arg_ptr, format);
-       vsprintf(wbuf, format, arg_ptr);
+       vsnprintf(wbuf, sizeof wbuf, format, arg_ptr);
        va_end(arg_ptr);
 
        client_write(wbuf, strlen(wbuf));
@@ -175,10 +175,17 @@ void wprintf(const char *format,...)
 void wDumpContent(int print_standard_html_footer)
 {
        if (print_standard_html_footer) {
+               wprintf("</DIV>\n");    /* end of "text" div */
+       
+               /* NAVBAR 
+               wprintf("<div id=\"navbar\">");
+               wprintf("FIXME the navbar should go here, dude...\n");
+               wprintf("</div>\n");
+                */
+
                do_template("trailing");
        }
 
-
 }
 
 
@@ -224,7 +231,7 @@ void escputs1(char *strbuf, int nbsp, int nolinebreaks)
        char *buf;
 
        if (strbuf == NULL) return;
-       buf = malloc(2 * strlen(strbuf));
+       buf = malloc( (3 * strlen(strbuf)) + SIZ );
        stresc(buf, strbuf, nbsp, nolinebreaks);
        wprintf("%s", buf);
        free(buf);
@@ -327,7 +334,7 @@ void msgescputs(char *strbuf) {
        char *outbuf;
 
        if (strbuf == NULL) return;
-       outbuf = malloc(2 * strlen(strbuf));
+       outbuf = malloc( (3 * strlen(strbuf)) + SIZ);
        msgesc(outbuf, strbuf);
        wprintf("%s", outbuf);
        free(outbuf);
@@ -338,40 +345,28 @@ void msgescputs(char *strbuf) {
 
 /*
  * Output all that important stuff that the browser will want to see
- *
- * control codes:
- * 
- * Bits 0 and 1:
- * 0 = Nothing.  Do not display any leading HTTP or HTML.
- * 1 = HTTP headers plus the room banner
- * 2 = HTTP headers required to terminate the session (unset cookies)
- * 3 = HTTP and HTML headers, but no room banner
- *
- * Bit 2: Set to 1 to auto-refresh page every 30 seconds
- * Bit 3: suppress check for express messages
- * Bit 4: Allow browser to cache this document
- *
  */
-void output_headers(int controlcode)
-{
+void output_headers(   int do_httpheaders,     /* 1 = output HTTP headers                          */
+                       int do_htmlhead,        /* 1 = output HTML <head> section and <body> opener */
+
+                       int do_room_banner,     /* 0=no, 1=yes,                                     */
+                                               /* 2 = I'm going to embed my own, so don't open the */
+                                               /*     <div id="text"> either.                      */
+
+                       int unset_cookies,      /* 1 = session is terminating, so unset the cookies */
+                       int refresh30,          /* 1 = automatically refresh page every 30 seconds  */
+                       int suppress_check,     /* 1 = suppress check for instant messages          */
+                       int cache               /* 1 = allow browser to cache this page             */
+) {
        char cookie[SIZ];
-       int print_standard_html_head = 0;
-       int refresh30 = 0;
-       int suppress_check = 0;
-       int cache = 0;
        char httpnow[SIZ];
        char onload_fcn[SIZ];
        static int pageseq = 0;
-       print_standard_html_head        =       controlcode & 0x03;
-       refresh30                       =       ((controlcode & 0x04) >> 2);
-       suppress_check                  =       ((controlcode & 0x08) >> 3);
-       cache                           =       ((controlcode & 0x10) >> 4);
 
        wprintf("HTTP/1.0 200 OK\n");
-
        httpdate(httpnow, time(NULL));
 
-       if (print_standard_html_head > 0) {
+       if (do_httpheaders) {
                wprintf("Content-type: text/html\n"
                        "Server: %s\n", SERVER
                );
@@ -385,76 +380,84 @@ void output_headers(int controlcode)
        stuff_to_cookie(cookie, WC->wc_session, WC->wc_username,
                        WC->wc_password, WC->wc_roomname);
 
-       if (print_standard_html_head == 2) {
-               wprintf("Set-cookie: webcit=%s\n", unset);
+       if (unset_cookies) {
+               wprintf("Set-cookie: webcit=%s; path=/\n", unset);
        } else {
-               wprintf("Set-cookie: webcit=%s\n", cookie);
+               wprintf("Set-cookie: webcit=%s; path=/\n", cookie);
                if (server_cookie != NULL) {
                        wprintf("%s\n", server_cookie);
                }
        }
 
-       if (print_standard_html_head > 0) {
+       if (do_htmlhead) {
                wprintf("\n");
 
-               if (refresh30) svprintf("REFRESHTAG", WCS_STRING,
-                       "<META HTTP-EQUIV=\"refresh\" CONTENT=\"30\">\n");
-               else svprintf("REFRESHTAG", WCS_STRING,
-                       "<META HTTP-EQUIV=\"refresh\" CONTENT=\"500363689;\">\n");
+               if (refresh30) {
+                       svprintf("REFRESHTAG", WCS_STRING, "%s",
+                               "<meta http-equiv=\"refresh\" content=\"30\" />\n");
+               }
+               else {
+                       svprintf("REFRESHTAG", WCS_STRING, "%s",
+                               "<meta http-equiv=\"refresh\" content=\"500363689;\" />\n");
+               }
+
                /* script for checking for pages (not always launched) */
 
                sprintf(onload_fcn, "function onload_fcn() { \n");
-               if (!WC->outside_frameset_allowed) {
-                       strcat(onload_fcn, "  force_frameset();  \n");
-               }
                if (!suppress_check) if (WC->HaveExpressMessages) {
                        strcat(onload_fcn, "  launch_page_popup();  \n");
                        WC->HaveExpressMessages = 0;
                }
                strcat(onload_fcn, "} \n");
 
-               svprintf("PAGERSCRIPT", WCS_STRING,
-                       "<SCRIPT LANGUAGE=\"JavaScript\">\n"
+               svprintf("PAGERscript", WCS_STRING,
+                       "<script type=\"text/javascript\">\n"
                        "function launch_page_popup() {\n"
                        "pwin = window.open('/page_popup', 'CitaPage%d', "
                        "'toolbar=no,location=no,copyhistory=no,status=no,"
                        "scrollbars=yes,resizable=no,height=250,width=400');\n"
                        "}\n"
-                       "function force_frameset() { \n"
-                       " if (top.frames.length == 0) { \n"
-                       "  top.location.replace('/do_welcome'); \n"
-                       " } \n"
-                       "} \n"
+
                        "%s\n"
-                       "</SCRIPT>\n",
+                       "</script>\n",
                        ++pageseq,
                        onload_fcn
                );
                /* end script */
 
-
                do_template("head");
-               clear_local_substs();
 
                svprintf("extrabodyparms", WCS_STRING, "%s", 
                        "onload='onload_fcn();' ");
 
                do_template("background");
-               clear_local_substs();
        }
 
-       if (print_standard_html_head == 1) {
-               wprintf("<A NAME=\"TheTop\"></A>");
-               embed_room_banner(NULL);
+       /* ICONBAR */
+       if (do_htmlhead) {
+               if ( (WC->logged_in) && (!unset_cookies) ) {
+                       wprintf("<div id=\"iconbar\">");
+                       do_iconbar();
+                       wprintf("</div>\n");
+               }
+               if (do_room_banner == 1) {
+                       wprintf("<div id=\"banner\">\n");
+                       embed_room_banner(NULL);
+                       wprintf("</div>\n");
+               }
+       }
+
+       if (do_room_banner != 2) {
+               wprintf("<div id=\"content\">\n");
        }
 
        if (strlen(WC->ImportantMessage) > 0) {
                do_template("beginbox_nt");
                wprintf("<SPAN CLASS=\"errormsg\">"
-                       "%s</SPAN><BR>\n", WC->ImportantMessage);
+                       "%s</SPAN><br />\n", WC->ImportantMessage);
                do_template("endbox");
                strcpy(WC->ImportantMessage, "");
-       }       
+       }
 }
 
 
@@ -491,7 +494,12 @@ void check_for_express_messages()
  */
 void http_transmit_thing(char *thing, size_t length, char *content_type,
                         int is_static) {
-       output_headers(is_static ? 0x10 : 0x00);
+       if (is_static) {
+               output_headers(0, 0, 0, 0, 0, 0, 1);
+       }
+       else {
+               output_headers(0, 0, 0, 0, 0, 0, 0);
+       }
        wprintf("Content-type: %s\n"
                "Content-length: %ld\n"
                "Server: %s\n"
@@ -516,7 +524,6 @@ void output_static(char *what)
        char *bigbuffer;
        char content_type[SIZ];
 
-       lprintf(9, "output_static(%s)\n", what);
        sprintf(buf, "static/%s", what);
        fp = fopen(buf, "rb");
        if (fp == NULL) {
@@ -558,8 +565,8 @@ void output_static(char *what)
 
                fstat(fileno(fp), &statbuf);
                bytes = statbuf.st_size;
-               lprintf(3, "Static: %s, %ld bytes\n", what, bytes);
-               bigbuffer = malloc(bytes);
+               lprintf(3, "Static: %s, (%s; %ld bytes)\n", what, content_type, bytes);
+               bigbuffer = malloc(bytes + 2);
                fread(bigbuffer, bytes, 1, fp);
                fclose(fp);
 
@@ -586,7 +593,7 @@ void output_image()
        serv_gets(buf);
        if (buf[0] == '2') {
                bytes = extract_long(&buf[4], 0);
-               xferbuf = malloc(bytes);
+               xferbuf = malloc(bytes + 2);
 
                /* Read it from the server */
                read_server_binary(xferbuf, bytes);
@@ -606,7 +613,7 @@ void output_image()
 
                /*
                wprintf("HTTP/1.0 404 %s\n", &buf[4]);
-               output_headers(0);
+               output_headers(0, 0, 0, 0, 0, 0, 0);
                wprintf("Content-Type: text/plain\n"
                        "\n"
                        "Error retrieving image: %s\n",
@@ -633,9 +640,9 @@ void output_mimepart()
        serv_gets(buf);
        if (buf[0] == '2') {
                bytes = extract_long(&buf[4], 0);
-               content = malloc(bytes);
+               content = malloc(bytes + 2);
                extract(content_type, &buf[4], 3);
-               output_headers(0);
+               output_headers(0, 0, 0, 0, 0, 0, 0);
                read_server_binary(content, bytes);
                serv_puts("CLOS");
                serv_gets(buf);
@@ -643,7 +650,7 @@ void output_mimepart()
                free(content);
        } else {
                wprintf("HTTP/1.0 404 %s\n", &buf[4]);
-               output_headers(0);
+               output_headers(0, 0, 0, 0, 0, 0, 0);
                wprintf("Content-Type: text/plain\n");
                wprintf("\n");
                wprintf("Error retrieving part: %s\n", &buf[4]);
@@ -667,7 +674,7 @@ char *load_mimepart(long msgnum, char *partnum)
                bytes = extract_long(&buf[4], 0);
                extract(content_type, &buf[4], 3);
 
-               content = malloc(bytes + 1);
+               content = malloc(bytes + 2);
                read_server_binary(content, bytes);
 
                serv_puts("CLOS");
@@ -688,13 +695,15 @@ char *load_mimepart(long msgnum, char *partnum)
 void convenience_page(char *titlebarcolor, char *titlebarmsg, char *messagetext)
 {
        wprintf("HTTP/1.0 200 OK\n");
-       output_headers(1);
+       output_headers(1, 1, 2, 0, 0, 0, 0);
+       wprintf("<div id=\"banner\">\n");
        wprintf("<TABLE WIDTH=100%% BORDER=0 BGCOLOR=\"#%s\"><TR><TD>", titlebarcolor);
        wprintf("<SPAN CLASS=\"titlebar\">%s</SPAN>\n", titlebarmsg);
-       wprintf("</TD></TR></TABLE><BR>\n");
+       wprintf("</TD></TR></TABLE>\n");
+       wprintf("</div>\n<div id=\"content\">\n");
        escputs(messagetext);
 
-       wprintf("<HR>\n");
+       wprintf("<hr />\n");
        wDumpContent(1);
 }
 
@@ -703,7 +712,7 @@ void convenience_page(char *titlebarcolor, char *titlebarmsg, char *messagetext)
  * Display a blank page.
  */
 void blank_page(void) {
-       output_headers(7);
+       output_headers(1, 1, 0, 0, 1, 0, 0);
        wDumpContent(2);
 }
 
@@ -744,7 +753,7 @@ void change_start_page(void) {
 
        set_preference("startpage", bstr("startpage"));
 
-       output_headers(3);
+       output_headers(1, 1, 0, 0, 0, 0, 0);
        do_template("newstartpage");
        wDumpContent(1);
 }
@@ -863,6 +872,7 @@ void session_loop(struct httprequest *req)
 
        WC->upload_length = 0;
        WC->upload = NULL;
+       WC->vars = NULL;
 
        WC->is_wap = 0;
 
@@ -878,7 +888,7 @@ void session_loop(struct httprequest *req)
                hptr = hptr->next;
 
                if (!strncasecmp(buf, "Cookie: webcit=", 15)) {
-                       strcpy(cookie, &buf[15]);
+                       safestrncpy(cookie, &buf[15], sizeof cookie);
                        cookie_to_stuff(cookie, NULL,
                                      c_username, c_password, c_roomname);
                }
@@ -1098,10 +1108,8 @@ void session_loop(struct httprequest *req)
                display_enter();
        } else if (!strcasecmp(action, "post")) {
                post_message();
-       } else if (!strcasecmp(action, "delete_msg")) {
-               delete_msg();
-       } else if (!strcasecmp(action, "confirm_move_msg")) {
-               confirm_move_msg();
+       } else if (!strcasecmp(action, "do_stuff_to_one_msg")) {
+               do_stuff_to_one_msg();
        } else if (!strcasecmp(action, "move_msg")) {
                move_msg();
        } else if (!strcasecmp(action, "userlist")) {
@@ -1266,16 +1274,22 @@ void session_loop(struct httprequest *req)
                display_customize_iconbar();
        } else if (!strcasecmp(action, "commit_iconbar")) {
                commit_iconbar();
+       } else if (!strcasecmp(action, "set_room_policy")) {
+               set_room_policy();
+       } else if (!strcasecmp(action, "display_inetconf")) {
+               display_inetconf();
+       } else if (!strcasecmp(action, "save_inetconf")) {
+               save_inetconf();
        } else if (!strcasecmp(action, "diagnostics")) {
-               output_headers(1);
+               output_headers(1, 1, 1, 0, 0, 0, 0);
 
-               wprintf("You're in session %d<HR>\n", WC->wc_session);
-               wprintf("Command: <BR><PRE>\n");
+               wprintf("You're in session %d<hr />\n", WC->wc_session);
+               wprintf("Command: <br /><PRE>\n");
                escputs(cmd);
-               wprintf("</PRE><HR>\n");
-               wprintf("Variables: <BR><PRE>\n");
+               wprintf("</PRE><hr />\n");
+               wprintf("Variables: <br /><PRE>\n");
                dump_vars();
-               wprintf("</PRE><HR>\n");
+               wprintf("</PRE><hr />\n");
                wDumpContent(1);
        }
        /* When all else fais, display the main menu. */