buflen --;
}
- for (a = 0; a < buflen; ++a) {
+ a = 0;
+ while (a < buflen) {
if (buf[a] == '+')
buf[a] = ' ';
if (buf[a] == '%') {
buflen -=2;
}
+ a++;
}
}
escputs1(strbuf, 0, 0);
}
-/**
- * \brief Escape a string for feeding out as a URL.
- * \param outbuf the output buffer
- * \param strbuf the input buffer
- */
-void urlesc(char *outbuf, char *strbuf)
-{
- int a, b, c, len, eclen, olen;
- char *ec = " +#&;`'|*?-~<>^()[]{}/$\"\\";
-
- strcpy(outbuf, "");
- len = strlen(strbuf);
- eclen = strlen(ec);
- olen = 0;
- for (a = 0; a < len; ++a) {
- c = 0;
- for (b = 0; b < eclen; ++b) {
- if (strbuf[a] == ec[b])
- c = 1;
- }
- if (c == 1) {
- sprintf(&outbuf[olen], "%%%02x", strbuf[a]);
- olen += 3;
- }
- else
- outbuf[olen ++] = strbuf[a];
- }
- outbuf[olen] = '\0';
-}
/**
* \brief urlescape buffer and print it to the client
{
char outbuf[SIZ];
- urlesc(outbuf, strbuf);
+ urlesc(outbuf, SIZ, strbuf);
wprintf("%s", outbuf);
}
target[0]='\0';
len = strlen (strbuf);
send = strbuf + len;
+ tend = target + tlen;
sptr = strbuf;
tptr = target;
target[0]='\0';
len = strlen (strbuf);
send = strbuf + len;
+ tend = target + tlen;
sptr = strbuf;
tptr = target;
/** check for ImportantMessages (these display in a div overlaying the main screen) */
if (!IsEmptyStr(WC->ImportantMessage)) {
- wprintf("<div id=\"important_message\">\n");
- wprintf("<span class=\"imsg\">"
- "%s</span><br />\n", WC->ImportantMessage);
- wprintf("</div>\n");
- wprintf("<script type=\"text/javascript\">\n"
- " setTimeout('hide_imsg_popup()', 3000); \n"
+ wprintf("<div id=\"important_message\">\n"
+ "<span class=\"imsg\">");
+ escputs(WC->ImportantMessage);
+ wprintf("</span><br />\n"
+ "</div>\n"
+ "<script type=\"text/javascript\">\n"
+ " setTimeout('hide_imsg_popup()', 5000); \n"
"</script>\n");
- safestrncpy(WC->ImportantMessage, "", sizeof WC->ImportantMessage);
+ WC->ImportantMessage[0] = 0;
}
if ( (WC->logged_in) && (!unset_cookies) ) {
FILE *fp;
struct stat statbuf;
off_t bytes;
+ off_t count = 0;
+ size_t res;
char *bigbuffer;
char content_type[128];
int len;
fp = fopen(what, "rb");
if (fp == NULL) {
lprintf(9, "output_static('%s') -- NOT FOUND --\n", what);
- wprintf("HTTP/1.1 404 %s\n", strerror(errno));
+ wprintf("HTTP/1.1 404 %s\r\n", strerror(errno));
wprintf("Content-Type: text/plain\r\n");
wprintf("\r\n");
- wprintf("Cannot open %s: %s\n", what, strerror(errno));
+ wprintf("Cannot open %s: %s\r\n", what, strerror(errno));
} else {
len = strlen (what);
if (!strncasecmp(&what[len - 4], ".gif", 4))
else
safestrncpy(content_type, "application/octet-stream", sizeof content_type);
- fstat(fileno(fp), &statbuf);
+ if (fstat(fileno(fp), &statbuf) == -1) {
+ lprintf(9, "output_static('%s') -- FSTAT FAILED --\n", what);
+ wprintf("HTTP/1.1 404 %s\r\n", strerror(errno));
+ wprintf("Content-Type: text/plain\r\n");
+ wprintf("\r\n");
+ wprintf("Cannot fstat %s: %s\n", what, strerror(errno));
+ return;
+ }
+
+ count = 0;
bytes = statbuf.st_size;
- bigbuffer = malloc(bytes + 2);
- fread(bigbuffer, bytes, 1, fp);
+ if ((bigbuffer = malloc(bytes + 2)) == NULL) {
+ lprintf(9, "output_static('%s') -- MALLOC FAILED (%s) --\n", what, strerror(errno));
+ wprintf("HTTP/1.1 500 internal server error\r\n");
+ wprintf("Content-Type: text/plain\r\n");
+ wprintf("\r\n");
+ return;
+ }
+ while (count < bytes) {
+ if ((res = fread(bigbuffer + count, 1, bytes - count, fp)) == 0) {
+ lprintf(9, "output_static('%s') -- FREAD FAILED (%s) %zu bytes of %zu --\n", what, strerror(errno), bytes - count, bytes);
+ wprintf("HTTP/1.1 500 internal server error \r\n");
+ wprintf("Content-Type: text/plain\r\n");
+ wprintf("\r\n");
+ return;
+ }
+ count += res;
+ }
+
fclose(fp);
lprintf(9, "output_static('%s') %s\n", what, content_type);
wprintf("\">");
wprintf(_("Make this my start page"));
wprintf("</a>");
-/*
+#ifdef TECH_PREVIEW
wprintf("<br/><a href=\"rss?room=");
urlescputs(WC->wc_roomname);
wprintf("\" title=\"RSS 2.0 feed for ");
escputs(WC->wc_roomname);
wprintf("\"><img alt=\"RSS\" border=\"0\" src=\"static/xml_button.gif\"/></a>\n");
-*/
+#endif
}
if (ContentLength > 0) {
content = malloc(ContentLength + SIZ);
memset(content, 0, ContentLength + SIZ);
- sprintf(content, "Content-type: %s\n"
+ snprintf(content, ContentLength + SIZ, "Content-type: %s\n"
"Content-length: %d\n\n",
ContentType, ContentLength);
body_start = strlen(content);
if (!WC->connected) {
if (!strcasecmp(ctdlhost, "uds")) {
/* unix domain socket */
- sprintf(buf, "%s/citadel.socket", ctdlport);
+ snprintf(buf, SIZ, "%s/citadel.socket", ctdlport);
WC->serv_sock = uds_connectsock(buf);
}
else {
}
/** This needs to run early */
+#ifdef TECH_PREVIEW
if (!strcasecmp(action, "rss")) {
display_rss(bstr("room"), request_method);
goto SKIP_ALL_THIS_CRAP;
}
+#endif
/**
* The GroupDAV stuff relies on HTTP authentication instead of
} else if (!strcasecmp(action, "editinfo")) {
save_edit(_("Room info"), "EINF 1", 1);
} else if (!strcasecmp(action, "display_editbio")) {
- sprintf(buf, "RBIO %s", WC->wc_fullname);
+ snprintf(buf, SIZ, "RBIO %s", WC->wc_fullname);
display_edit(_("Your bio"), "NOOP", buf, "editbio", 3);
} else if (!strcasecmp(action, "editbio")) {
save_edit(_("Your bio"), "EBIO", 0);
delete_room();
} else if (!strcasecmp(action, "validate")) {
validate();
+ /* The users photo display / upload facility */
} else if (!strcasecmp(action, "display_editpic")) {
display_graphics_upload(_("your photo"),
"UIMG 0|_userpic_",
"editpic");
} else if (!strcasecmp(action, "editpic")) {
do_graphics_upload("UIMG 1|_userpic_");
+ /* room picture dispay / upload facility */
} else if (!strcasecmp(action, "display_editroompic")) {
display_graphics_upload(_("the icon for this room"),
"UIMG 0|_roompic_",
"editroompic");
} else if (!strcasecmp(action, "editroompic")) {
do_graphics_upload("UIMG 1|_roompic_");
+ /* the greetingpage hello pic */
+ } else if (!strcasecmp(action, "display_edithello")) {
+ display_graphics_upload(_("the Greetingpicture for the login prompt"),
+ "UIMG 0|hello.gif",
+ "edithellopic");
+ } else if (!strcasecmp(action, "edithellopic")) {
+ do_graphics_upload("UIMG 1|hello.gif");
+ /* the logoff banner */
+ } else if (!strcasecmp(action, "display_editgoodbyepic")) {
+ display_graphics_upload(_("the Logoff banner picture"),
+ "UIMG 0|goodbuye.gif",
+ "editgoodbuyepic");
+ } else if (!strcasecmp(action, "editgoodbuyepic")) {
+ do_graphics_upload("UIMG 1|goodbuye.gif");
+
} else if (!strcasecmp(action, "delete_floor")) {
delete_floor();
} else if (!strcasecmp(action, "rename_floor")) {
} else if (!strcasecmp(action, "create_floor")) {
create_floor();
} else if (!strcasecmp(action, "display_editfloorpic")) {
- sprintf(buf, "UIMG 0|_floorpic_|%s",
+ snprintf(buf, SIZ, "UIMG 0|_floorpic_|%s",
bstr("which_floor"));
display_graphics_upload(_("the icon for this floor"),
buf,
"editfloorpic");
} else if (!strcasecmp(action, "editfloorpic")) {
- sprintf(buf, "UIMG 1|_floorpic_|%s",
+ snprintf(buf, SIZ, "UIMG 1|_floorpic_|%s",
bstr("which_floor"));
do_graphics_upload(buf);
} else if (!strcasecmp(action, "display_reg")) {