/*
* $Id$
- */
-/**
- * \defgroup MainServer This is the main transaction loop of the web service. It maintains a
+ *
+ * This is the main transaction loop of the web service. It maintains a
* persistent session to the Citadel server, handling HTTP WebCit requests as
* they arrive and presenting a user interface.
- * \ingroup WebcitHttpServer
*/
-/*@{*/
+
#include "webcit.h"
#include "groupdav.h"
#include "webserver.h"
#include <stdio.h>
#include <stdarg.h>
-/**
+/*
* String to unset the cookie.
* Any date "in the past" will work, so I chose my birthday, right down to
* the exact minute. :)
{
char *up, *ptr;
char buf[SIZ];
- int a, b, len;
+ int a, b, len, n;
struct urlcontent *u;
up = url;
while (!IsEmptyStr(up)) {
/** locate the = sign */
- safestrncpy(buf, up, sizeof buf);
+ n = safestrncpy(buf, up, sizeof buf);
+ if (n < 0) /** hm, we exceeded the buffer... hmmm what todo now? */
+ n = -n;
b = (-1);
- for (a = 255; a >= 0; --a)
+ for (a = n; a >= 0; --a)
if (buf[a] == '=')
b = a;
if (b < 0)
/**
* \brief Output a piece of content to the web browser
*/
-void http_transmit_thing(char *thing, size_t length, char *content_type,
+void http_transmit_thing(char *thing, size_t length, const char *content_type,
int is_static) {
output_headers(0, 0, 0, 0, 0, is_static);
off_t count = 0;
size_t res;
char *bigbuffer;
- char content_type[128];
+ const char *content_type;
int len;
fp = fopen(what, "rb");
wprintf("Cannot open %s: %s\r\n", what, strerror(errno));
} else {
len = strlen (what);
- if (!strncasecmp(&what[len - 4], ".gif", 4))
- safestrncpy(content_type, "image/gif", sizeof content_type);
- else if (!strncasecmp(&what[len - 4], ".txt", 4))
- safestrncpy(content_type, "text/plain", sizeof content_type);
- else if (!strncasecmp(&what[len - 4], ".css", 4))
- safestrncpy(content_type, "text/css", sizeof content_type);
- else if (!strncasecmp(&what[len - 4], ".jpg", 4))
- safestrncpy(content_type, "image/jpeg", sizeof content_type);
- else if (!strncasecmp(&what[len - 4], ".png", 4))
- safestrncpy(content_type, "image/png", sizeof content_type);
- else if (!strncasecmp(&what[len - 4], ".ico", 4))
- safestrncpy(content_type, "image/x-icon", sizeof content_type);
- else if (!strncasecmp(&what[len - 5], ".html", 5))
- safestrncpy(content_type, "text/html", sizeof content_type);
- else if (!strncasecmp(&what[len - 4], ".htm", 4))
- safestrncpy(content_type, "text/html", sizeof content_type);
- else if (!strncasecmp(&what[len - 4], ".wml", 4))
- safestrncpy(content_type, "text/vnd.wap.wml", sizeof content_type);
- else if (!strncasecmp(&what[len - 5], ".wmls", 5))
- safestrncpy(content_type, "text/vnd.wap.wmlscript", sizeof content_type);
- else if (!strncasecmp(&what[len - 5], ".wmlc", 5))
- safestrncpy(content_type, "application/vnd.wap.wmlc", sizeof content_type);
- else if (!strncasecmp(&what[len - 6], ".wmlsc", 6))
- safestrncpy(content_type, "application/vnd.wap.wmlscriptc", sizeof content_type);
- else if (!strncasecmp(&what[len - 5], ".wbmp", 5))
- safestrncpy(content_type, "image/vnd.wap.wbmp", sizeof content_type);
- else if (!strncasecmp(&what[len - 3], ".js", 3))
- safestrncpy(content_type, "text/javascript", sizeof content_type);
- else
- safestrncpy(content_type, "application/octet-stream", sizeof content_type);
+ content_type = GuessMimeByFilename(what, len);
if (fstat(fileno(fp), &statbuf) == -1) {
lprintf(9, "output_static('%s') -- FSTAT FAILED --\n", what);
}
}
-
/**
* \brief When the browser requests an image file from the Citadel server,
* this function is called to transmit it.
char buf[SIZ];
char *xferbuf = NULL;
off_t bytes;
+ const char *MimeType;
serv_printf("OIMG %s|%s", bstr("name"), bstr("parm"));
serv_getln(buf, sizeof buf);
serv_puts("CLOS");
serv_getln(buf, sizeof buf);
+ MimeType = GuessMimeType (xferbuf, bytes);
/** Write it to the browser */
- http_transmit_thing(xferbuf, (size_t)bytes, "image/gif", 0);
+ if (!IsEmptyStr(MimeType))
+ {
+ http_transmit_thing(xferbuf,
+ (size_t)bytes,
+ MimeType,
+ 0);
+ free(xferbuf);
+ return;
+ }
+ /* hm... unknown mimetype? fallback to blank gif */
free(xferbuf);
+ }
- } else {
- /**
- * Instead of an ugly 404, send a 1x1 transparent GIF
- * when there's no such image on the server.
- */
- char blank_gif[SIZ];
- snprintf (blank_gif, SIZ, "%s%s", static_dirs[0], "/blank.gif");
- output_static(blank_gif);
- }
-
-
-
+
+ /**
+ * Instead of an ugly 404, send a 1x1 transparent GIF
+ * when there's no such image on the server.
+ */
+ char blank_gif[SIZ];
+ snprintf (blank_gif, SIZ, "%s%s", static_dirs[0], "/blank.gif");
+ output_static(blank_gif);
}
/**
do_listsub();
goto SKIP_ALL_THIS_CRAP;
}
-#ifdef WEBCIT_WITH_CALENDAR_SERVICE
if (!strcasecmp(action, "freebusy")) {
do_freebusy(cmd);
goto SKIP_ALL_THIS_CRAP;
}
-#endif
/**
* If we're not logged in, but we have HTTP Authentication data,
if (!strcasecmp(action, "image")) {
output_image();
+ } else if (!strcasecmp(action, "display_mime_icon")) {
+ display_mime_icon();
/**
* All functions handled below this point ... make sure we log in
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_",
+ "_userpic_",
"editpic");
} else if (!strcasecmp(action, "editpic")) {
- do_graphics_upload("UIMG 1|_userpic_");
+ do_graphics_upload("_userpic_");
+ /* room picture dispay / upload facility */
} else if (!strcasecmp(action, "display_editroompic")) {
display_graphics_upload(_("the icon for this room"),
- "UIMG 0|_roompic_",
+ "_roompic_",
"editroompic");
} else if (!strcasecmp(action, "editroompic")) {
- do_graphics_upload("UIMG 1|_roompic_");
+ do_graphics_upload("_roompic_");
+ /* the greetingpage hello pic */
+ } else if (!strcasecmp(action, "display_edithello")) {
+ display_graphics_upload(_("the Greetingpicture for the login prompt"),
+ "hello",
+ "edithellopic");
+ } else if (!strcasecmp(action, "edithellopic")) {
+ do_graphics_upload("hello");
+ /* the logoff banner */
+ } else if (!strcasecmp(action, "display_editgoodbyepic")) {
+ display_graphics_upload(_("the Logoff banner picture"),
+ "UIMG 0|%s|goodbuye",
+ "editgoodbuyepic");
+ } else if (!strcasecmp(action, "editgoodbuyepic")) {
+ do_graphics_upload("UIMG 1|%s|goodbuye");
+
} else if (!strcasecmp(action, "delete_floor")) {
delete_floor();
} else if (!strcasecmp(action, "rename_floor")) {
display_floorconfig(NULL);
} else if (!strcasecmp(action, "toggle_self_service")) {
toggle_self_service();
-#ifdef WEBCIT_WITH_CALENDAR_SERVICE
} else if (!strcasecmp(action, "display_edit_task")) {
display_edit_task();
} else if (!strcasecmp(action, "save_task")) {
respond_to_request();
} else if (!strcasecmp(action, "handle_rsvp")) {
handle_rsvp();
-#endif
} else if (!strcasecmp(action, "summary")) {
summary();
} else if (!strcasecmp(action, "summary_inner_div")) {
updatenote();
} else if (!strcasecmp(action, "display_room_directory")) {
display_room_directory();
+ } else if (!strcasecmp(action, "display_pictureview")) {
+ display_pictureview();
} else if (!strcasecmp(action, "download_file")) {
download_file(index[1]);
} else if (!strcasecmp(action, "upload_file")) {