]> code.citadel.org Git - citadel.git/blobdiff - webcit/webcit.c
* Insert a newline between </div> and <div id="text">
[citadel.git] / webcit / webcit.c
index 914484cef50c3b6dccdf88916f48ae68e5dc558d..a9825b0a37d352b666b82e8083eb5955862d7417 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,10 +158,10 @@ 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);
 
-       write(WC->http_sock, wbuf, strlen(wbuf));
+       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");
        }
 
-
 }
 
 
@@ -186,7 +193,7 @@ void wDumpContent(int print_standard_html_footer)
  * Copy a string, escaping characters which have meaning in HTML.  If
  * nbsp is nonzero, spaces are converted to non-breaking spaces.
  */
-void stresc(char *target, char *strbuf, int nbsp)
+void stresc(char *target, char *strbuf, int nbsp, int nolinebreaks)
 {
        int a;
        strcpy(target, "");
@@ -208,24 +215,31 @@ void stresc(char *target, char *strbuf, int nbsp)
                        strcat(target, ">");
                else if (strbuf[a] == QU)
                        strcat(target, "\"");
-               else if ((strbuf[a] == 32) && (nbsp == 1)) {
+               else if ((strbuf[a] == 32) && (nbsp == 1))
                        strcat(target, "&nbsp;");
-               } else {
+               else if ((strbuf[a] == '\n') && (nolinebreaks))
+                       strcat(target, "");     /* nothing */
+               else if ((strbuf[a] == '\r') && (nolinebreaks))
+                       strcat(target, "");     /* nothing */
+               else
                        strncat(target, &strbuf[a], 1);
-               }
        }
 }
 
-void escputs1(char *strbuf, int nbsp)
+void escputs1(char *strbuf, int nbsp, int nolinebreaks)
 {
-       char buf[1024];
-       stresc(buf, strbuf, nbsp);
+       char *buf;
+
+       if (strbuf == NULL) return;
+       buf = malloc( (3 * strlen(strbuf)) + SIZ );
+       stresc(buf, strbuf, nbsp, nolinebreaks);
        wprintf("%s", buf);
+       free(buf);
 }
 
 void escputs(char *strbuf)
 {
-       escputs1(strbuf, 0);
+       escputs1(strbuf, 0, 0);
 }
 
 /*
@@ -295,45 +309,64 @@ void jsescputs(char *strbuf)
        wprintf("%s", outbuf);
 }
 
+/*
+ * Copy a string, escaping characters for message text hold
+ */
+void msgesc(char *target, char *strbuf)
+{
+       int a;
+       strcpy(target, "");
+
+       for (a = 0; a < strlen(strbuf); ++a) {
+               if (strbuf[a] == '\'') 
+                       strcat(target, "\\'");
+               else if (strbuf[a] == '\n')
+                       strcat(target, " ");
+               else if (strbuf[a] == '\r')
+                       strcat(target, " ");
+               else {
+                       strncat(target, &strbuf[a], 1);
+               }
+       }
+}
+
+void msgescputs(char *strbuf) {
+       char *outbuf;
+
+       if (strbuf == NULL) return;
+       outbuf = malloc( (3 * strlen(strbuf)) + SIZ);
+       msgesc(outbuf, strbuf);
+       wprintf("%s", outbuf);
+       free(outbuf);
+}
+
 
 
 
 /*
  * 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
                );
@@ -347,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=\"text\">\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, "");
-       }       
+       }
 }
 
 
@@ -453,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"
@@ -463,7 +509,7 @@ void http_transmit_thing(char *thing, size_t length, char *content_type,
                (long) length,
                SERVER
        );
-       write(WC->http_sock, thing, (size_t)length);
+       client_write(thing, (size_t)length);
 }
 
 
@@ -478,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) {
@@ -501,6 +546,8 @@ void output_static(char *what)
                        strcpy(content_type, "image/x-icon");
                else if (!strncasecmp(&what[strlen(what) - 5], ".html", 5))
                        strcpy(content_type, "text/html");
+               else if (!strncasecmp(&what[strlen(what) - 4], ".htm", 4))
+                       strcpy(content_type, "text/html");
                else if (!strncasecmp(&what[strlen(what) - 4], ".wml", 4))
                        strcpy(content_type, "text/vnd.wap.wml");
                else if (!strncasecmp(&what[strlen(what) - 5], ".wmls", 5))
@@ -510,14 +557,16 @@ void output_static(char *what)
                else if (!strncasecmp(&what[strlen(what) - 6], ".wmlsc", 6))
                        strcpy(content_type, "application/vnd.wap.wmlscriptc");
                else if (!strncasecmp(&what[strlen(what) - 5], ".wbmp", 5))
-                       wprintf("Content-type: image/vnd.wap.wbmp");
+                       strcpy(content_type, "image/vnd.wap.wbmp");
+               else if (!strncasecmp(&what[strlen(what) - 3], ".js", 3))
+                       strcpy(content_type, "text/javascript");
                else
-                       wprintf("Content-type: application/octet-stream");
+                       strcpy(content_type, "application/octet-stream");
 
                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);
 
@@ -544,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);
@@ -564,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",
@@ -591,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);
@@ -601,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]);
@@ -625,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");
@@ -646,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=\"text\">\n");
        escputs(messagetext);
 
-       wprintf("<HR>\n");
+       wprintf("<hr />\n");
        wDumpContent(1);
 }
 
@@ -661,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);
 }
 
@@ -702,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);
 }
@@ -798,7 +849,7 @@ void session_loop(struct httprequest *req)
        char buf[SIZ];
        int a, b;
        int ContentLength = 0;
-       int BytesRead;
+       int BytesRead = 0;
        char ContentType[512];
        char *content;
        char *content_end;
@@ -821,6 +872,7 @@ void session_loop(struct httprequest *req)
 
        WC->upload_length = 0;
        WC->upload = NULL;
+       WC->vars = NULL;
 
        WC->is_wap = 0;
 
@@ -836,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);
                }
@@ -866,6 +918,7 @@ void session_loop(struct httprequest *req)
                                ContentType, ContentLength);
                body_start = strlen(content);
 
+/***** old version
                BytesRead = 0;
                while (BytesRead < ContentLength) {
                        a=read(WC->http_sock, &content[BytesRead+body_start],
@@ -873,6 +926,10 @@ void session_loop(struct httprequest *req)
                        if (a <= 0) BytesRead = ContentLength;
                        else BytesRead += a;
                }
+*******/
+
+               /* Now we're daring and read it all at once. */
+               client_read(WC->http_sock, &content[BytesRead+body_start], ContentLength);
 
                if (!strncasecmp(ContentType,
                              "application/x-www-form-urlencoded", 33)) {
@@ -1051,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")) {
@@ -1182,7 +1237,7 @@ void session_loop(struct httprequest *req)
        } else if (!strcasecmp(action, "select_user_to_edit")) {
                select_user_to_edit(NULL, NULL);
        } else if (!strcasecmp(action, "display_edituser")) {
-               display_edituser(NULL);
+               display_edituser(NULL, 0);
        } else if (!strcasecmp(action, "edituser")) {
                edituser();
        } else if (!strcasecmp(action, "create_user")) {
@@ -1219,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. */