X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fstatic.c;h=34a656ee2b6058ed3203c4fc5d70cf9ad816dd98;hb=c73091a2ae896b6be5aa94b911c1c89d76a85688;hp=11b868ad5f56578214a9f1da1b0351f6ace2d5a6;hpb=c06d1f8100fedb4b90c04ab6aefca49262d7a48e;p=citadel.git diff --git a/webcit/static.c b/webcit/static.c index 11b868ad5..34a656ee2 100644 --- a/webcit/static.c +++ b/webcit/static.c @@ -17,17 +17,67 @@ #include "webcit.h" #include "webserver.h" - -HashList *StaticFilemappings[4] = {NULL, NULL, NULL, NULL}; +unsigned char OnePixelGif[37] = { + 0x47, + 0x49, + 0x46, + 0x38, + 0x37, + 0x61, + 0x01, + 0x00, + 0x01, + 0x00, + 0x80, + 0x00, + 0x00, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0x2c, + 0x00, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x01, + 0x00, + 0x00, + 0x02, + 0x02, + 0x44, + 0x01, + 0x00, + 0x3b +}; + + +HashList *StaticFilemappings[5] = {NULL, NULL, NULL, NULL, NULL}; /* - { - lprintf(9, "Suspicious request. Ignoring."); - hprintf("HTTP/1.1 404 Security check failed\r\n"); - hprintf("Content-Type: text/plain\r\n\r\n"); - wc_printf("You have sent a malformed or invalid request.\r\n"); - end_burst(); - } + { + syslog(LOG_DEBUG, "Suspicious request. Ignoring."); + hprintf("HTTP/1.1 404 Security check failed\r\n"); + hprintf("Content-Type: text/plain\r\n\r\n"); + wc_printf("You have sent a malformed or invalid request.\r\n"); + end_burst(); + } */ + + +void output_error_pic(const char *ErrMsg1, const char *ErrMsg2) +{ + hprintf("HTTP/1.1 200 %s\r\n", ErrMsg1); + hprintf("Content-Type: image/gif\r\n"); + hprintf("x-webcit-errormessage: %s\r\n", ErrMsg2); + begin_burst(); + StrBufPlain(WC->WBuf, (const char *)OnePixelGif, sizeof(OnePixelGif)); + end_burst(); +} + /* * dump out static pages from disk */ @@ -36,40 +86,52 @@ void output_static(const char *what) int fd; struct stat statbuf; off_t bytes; - off_t count = 0; const char *content_type; int len; const char *Err; + len = strlen (what); + content_type = GuessMimeByFilename(what, len); fd = open(what, O_RDONLY); if (fd <= 0) { - lprintf(9, "output_static('%s') [%s] -- NOT FOUND --\n", what, ChrPtr(WC->Hdr->this_page)); - hprintf("HTTP/1.1 404 %s\r\n", strerror(errno)); - hprintf("Content-Type: text/plain\r\n"); - begin_burst(); - wc_printf("Cannot open %s: %s\r\n", what, strerror(errno)); - end_burst(); - } else { - len = strlen (what); - content_type = GuessMimeByFilename(what, len); - - if (fstat(fd, &statbuf) == -1) { - lprintf(9, "output_static('%s') -- FSTAT FAILED --\n", what); + syslog(LOG_INFO, "output_static('%s') [%s] -- NOT FOUND --\n", what, ChrPtr(WC->Hdr->this_page)); + if (strstr(content_type, "image/") != NULL) + { + output_error_pic("the file you requsted is gone.", strerror(errno)); + } + else + { hprintf("HTTP/1.1 404 %s\r\n", strerror(errno)); hprintf("Content-Type: text/plain\r\n"); begin_burst(); - wc_printf("Cannot fstat %s: %s\n", what, strerror(errno)); + wc_printf("Cannot open %s: %s\r\n", what, strerror(errno)); end_burst(); + } + } else { + if (fstat(fd, &statbuf) == -1) { + syslog(LOG_INFO, "output_static('%s') -- FSTAT FAILED --\n", what); + if (strstr(content_type, "image/") != NULL) + { + output_error_pic("Stat failed!", strerror(errno)); + } + else + { + hprintf("HTTP/1.1 404 %s\r\n", strerror(errno)); + hprintf("Content-Type: text/plain\r\n"); + begin_burst(); + wc_printf("Cannot fstat %s: %s\n", what, strerror(errno)); + end_burst(); + } + if (fd > 0) close(fd); return; } - count = 0; bytes = statbuf.st_size; if (StrBufReadBLOB(WC->WBuf, &fd, 1, bytes, &Err) < 0) { if (fd > 0) close(fd); - lprintf(9, "output_static('%s') -- FREAD FAILED (%s) --\n", what, strerror(errno)); + syslog(LOG_INFO, "output_static('%s') -- FREAD FAILED (%s) --\n", what, strerror(errno)); hprintf("HTTP/1.1 500 internal server error \r\n"); hprintf("Content-Type: text/plain\r\n"); end_burst(); @@ -78,9 +140,6 @@ void output_static(const char *what) close(fd); -#ifndef TECH_PREVIEW - lprintf(9, "output_static('%s') %s\n", what, content_type); -#endif http_transmit_thing(content_type, 2); } if (yesbstr("force_close_session")) { @@ -102,16 +161,23 @@ int LoadStaticDir(const char *DirName, HashList *DirList, const char *RelDir) struct dirent *filedir_entry; int d_type = 0; int d_namelen; - int d_without_ext; int istoplevel; + if (IsEmptyStr(DirName)) + { + return 0; + } + filedir = opendir (DirName); - if (filedir == NULL) { + if (filedir == NULL) + { return 0; } d = (struct dirent *)malloc(offsetof(struct dirent, d_name) + PATH_MAX + 1); - if (d == NULL) { + if (d == NULL) + { + closedir(filedir); return 0; } @@ -123,9 +189,14 @@ int LoadStaticDir(const char *DirName, HashList *DirList, const char *RelDir) while ((readdir_r(filedir, d, &filedir_entry) == 0) && (filedir_entry != NULL)) { - char *PStart; -#ifdef _DIRENT_HAVE_D_NAMELEN - d_namelen = filedir_entry->d_namelen; +#ifdef _DIRENT_HAVE_D_NAMLEN + d_namelen = filedir_entry->d_namlen; + +#else + d_namelen = strlen(filedir_entry->d_name); +#endif + +#ifdef _DIRENT_HAVE_D_TYPE d_type = filedir_entry->d_type; #else @@ -138,11 +209,8 @@ int LoadStaticDir(const char *DirName, HashList *DirList, const char *RelDir) #define IFTODT(mode) (((mode) & 0170000) >> 12) #define DTTOIF(dirtype) ((dirtype) << 12) #endif - d_namelen = strlen(filedir_entry->d_name); d_type = DT_UNKNOWN; #endif - d_without_ext = d_namelen; - if ((d_namelen > 1) && filedir_entry->d_name[d_namelen - 1] == '~') continue; /* Ignore backup files... */ @@ -160,7 +228,7 @@ int LoadStaticDir(const char *DirName, HashList *DirList, const char *RelDir) char path[PATH_MAX]; snprintf(path, PATH_MAX, "%s/%s", DirName, filedir_entry->d_name); - if (stat(path, &s) == 0) { + if (lstat(path, &s) == 0) { d_type = IFTODT(s.st_mode); } } @@ -186,7 +254,6 @@ int LoadStaticDir(const char *DirName, HashList *DirList, const char *RelDir) break; case DT_LNK: /* TODO: check whether its a file or a directory */ case DT_REG: - PStart = filedir_entry->d_name; FileName = NewStrBufDup(Dir); if (ChrPtr(FileName) [ StrLength(FileName) - 1] != '/') StrBufAppendBufPlain(FileName, "/", 1, 0); @@ -200,7 +267,7 @@ int LoadStaticDir(const char *DirName, HashList *DirList, const char *RelDir) StrBufAppendBufPlain(OneWebName, filedir_entry->d_name, d_namelen, 0); Put(DirList, SKEY(OneWebName), FileName, HFreeStrBuf); - /* lprintf(9, "[%s | %s]\n", ChrPtr(OneWebName), ChrPtr(FileName)); */ + /* syslog(LOG_DEBUG, "[%s | %s]\n", ChrPtr(OneWebName), ChrPtr(FileName)); */ break; default: break; @@ -229,29 +296,35 @@ void output_flat_static(void) (vFile != NULL)) { File = (StrBuf*) vFile; - output_static(ChrPtr(vFile)); + output_static(ChrPtr(File)); } } -extern void do_404(void); - void output_static_safe(HashList *DirList) { wcsession *WCC = WC; void *vFile; StrBuf *File; + const char *MimeType; if (GetHash(DirList, SKEY(WCC->Hdr->HR.ReqLine), &vFile) && (vFile != NULL)) { File = (StrBuf*) vFile; - output_static(ChrPtr(vFile)); + output_static(ChrPtr(File)); } else { - lprintf(1, "output_static_safe() file %s not found. \n", + syslog(LOG_INFO, "output_static_safe() file %s not found. \n", ChrPtr(WCC->Hdr->HR.ReqLine)); -///TODO: detect image & output blank image - do_404(); + MimeType = GuessMimeByFilename(SKEY(WCC->Hdr->HR.ReqLine)); + if (strstr(MimeType, "image/") != NULL) + { + output_error_pic("the file you requested isn't known to our cache", "maybe reload webcit?"); + } + else + { + do_404(); + } } } void output_static_0(void) @@ -268,7 +341,7 @@ void output_static_2(void) } void output_static_3(void) { - output_static_safe(StaticFilemappings[3]); + output_static_safe(StaticFilemappings[4]); } @@ -285,7 +358,16 @@ void robots_txt(void) { begin_burst(); wc_printf("User-agent: *\r\n" - "Disallow:\r\n" + "Disallow: /printmsg\r\n" + "Disallow: /msgheaders\r\n" + "Disallow: /groupdav\r\n" + "Disallow: /do_template\r\n" + "Disallow: /static\r\n" + "Disallow: /display_page\r\n" + "Disallow: /readnew\r\n" + "Disallow: /display_enter\r\n" + "Disallow: /skip\r\n" + "Disallow: /ungoto\r\n" "Sitemap: %s/sitemap.xml\r\n" "\r\n" , @@ -304,6 +386,7 @@ ServerStartModule_STATIC StaticFilemappings[1] = NewHash(1, NULL); StaticFilemappings[2] = NewHash(1, NULL); StaticFilemappings[3] = NewHash(1, NULL); + StaticFilemappings[4] = NewHash(1, NULL); } void ServerShutdownModule_STATIC @@ -313,6 +396,7 @@ ServerShutdownModule_STATIC DeleteHash(&StaticFilemappings[1]); DeleteHash(&StaticFilemappings[2]); DeleteHash(&StaticFilemappings[3]); + DeleteHash(&StaticFilemappings[4]); } @@ -324,6 +408,7 @@ InitModule_STATIC LoadStaticDir(static_dirs[1], StaticFilemappings[1], ""); LoadStaticDir(static_dirs[2], StaticFilemappings[2], ""); LoadStaticDir(static_dirs[3], StaticFilemappings[3], ""); + LoadStaticDir(static_dirs[4], StaticFilemappings[4], ""); WebcitAddUrlHandler(HKEY("robots.txt"), "", 0, robots_txt, ANONYMOUS|COOKIEUNNEEDED|ISSTATIC|LOGCHATTY); WebcitAddUrlHandler(HKEY("favicon.ico"), "", 0, output_flat_static, ANONYMOUS|COOKIEUNNEEDED|ISSTATIC|LOGCHATTY); @@ -331,4 +416,5 @@ InitModule_STATIC WebcitAddUrlHandler(HKEY("static.local"), "", 0, output_static_1, ANONYMOUS|COOKIEUNNEEDED|ISSTATIC|LOGCHATTY); WebcitAddUrlHandler(HKEY("tinymce"), "", 0, output_static_2, ANONYMOUS|COOKIEUNNEEDED|ISSTATIC|LOGCHATTY); WebcitAddUrlHandler(HKEY("tiny_mce"), "", 0, output_static_2, ANONYMOUS|COOKIEUNNEEDED|ISSTATIC|LOGCHATTY); + WebcitAddUrlHandler(HKEY("epiceditor"), "", 0, output_static_3, ANONYMOUS|COOKIEUNNEEDED|ISSTATIC|LOGCHATTY); }