X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fsysdep.c;h=1278b56259ea984b8bf3a6c4b5437bfe1544208f;hb=c73091a2ae896b6be5aa94b911c1c89d76a85688;hp=6c0efa49b918a1941eb5a3049fb88c7fa657386a;hpb=156d3eaa1b5d85cb70a79046bd874ab832df6ff1;p=citadel.git diff --git a/webcit/sysdep.c b/webcit/sysdep.c index 6c0efa49b..1278b5625 100644 --- a/webcit/sysdep.c +++ b/webcit/sysdep.c @@ -25,18 +25,7 @@ #include #include #include - -#if TIME_WITH_SYS_TIME -# include -# include -#else -# if HAVE_SYS_TIME_H -# include -# else -# include -# endif -#endif - +#include #include #include #include @@ -79,8 +68,11 @@ char ctdl_key_dir[PATH_MAX]=SSL_DIR; char file_crpt_file_key[PATH_MAX]=""; char file_crpt_file_csr[PATH_MAX]=""; char file_crpt_file_cer[PATH_MAX]=""; +char file_etc_mimelist[PATH_MAX]=""; const char editor_absolut_dir[PATH_MAX]=EDITORDIR; /* nailed to what configure gives us. */ + +char etc_dir[PATH_MAX]; char static_dir[PATH_MAX]; /* calculated on startup */ char static_local_dir[PATH_MAX]; /* calculated on startup */ char static_icon_dir[PATH_MAX]; /* where should we find our mime icons? */ @@ -92,6 +84,62 @@ char *static_dirs[]={ /* needs same sort order as the web mapping */ }; int ExitPipe[2]; +HashList *GZMimeBlackList = NULL; /* mimetypes which shouldn't be gzip compressed */ + +void LoadMimeBlacklist(void) +{ + StrBuf *MimeBlackLine; + IOBuffer IOB; + eReadState state; + + memset(&IOB, 0, sizeof(IOBuffer)); + IOB.fd = open(file_etc_mimelist, O_RDONLY); + + IOB.Buf = NewStrBuf(); + MimeBlackLine = NewStrBuf(); + GZMimeBlackList = NewHash(1, NULL); + + do + { + state = StrBufChunkSipLine(MimeBlackLine, &IOB); + + switch (state) + { + case eMustReadMore: + if (StrBuf_read_one_chunk_callback(IOB.fd, 0, &IOB) <= 0) + state = eReadFail; + break; + case eReadSuccess: + if ((StrLength(MimeBlackLine) > 1) && + (*ChrPtr(MimeBlackLine) != '#')) + { + Put(GZMimeBlackList, SKEY(MimeBlackLine), + (void*) 1, reference_free_handler); + } + FlushStrBuf(MimeBlackLine); + break; + case eReadFail: + break; + case eBufferNotEmpty: + break; + } + } + while (state != eReadFail); + + close(IOB.fd); + + FreeStrBuf(&IOB.Buf); + FreeStrBuf(&MimeBlackLine); +} + +void CheckGZipCompressionAllowed(const char *MimeType, long MLen) +{ + void *v; + wcsession *WCC = WC; + + if (WCC->Hdr->HR.gzip_ok) + WCC->Hdr->HR.gzip_ok = GetHash(GZMimeBlackList, MimeType, MLen, &v) == 0; +} void InitialiseSemaphores(void) { @@ -131,6 +179,8 @@ void end_critical_section(int which_one) void ShutDownWebcit(void) { + + DeleteHash(&GZMimeBlackList); free_zone_directory (); icaltimezone_release_zone_tab (); icalmemory_free_ring (); @@ -486,6 +536,15 @@ webcit_calc_dirs_n_files(int relh, const char *basedir, int home, char *webcitdi "%s/citadel.cer", ctdl_key_dir); + + basedir=ETCDIR; + COMPUTE_DIRECTORY(etc_dir); + StripSlashes(etc_dir, 1); + snprintf(file_etc_mimelist, + sizeof file_etc_mimelist, + "%s/nogz-mimetypes.txt", + etc_dir); + /* we should go somewhere we can leave our coredump, if enabled... */ syslog(LOG_INFO, "Changing directory to %s\n", socket_dir); if (chdir(webcitdir) != 0) { @@ -496,6 +555,9 @@ webcit_calc_dirs_n_files(int relh, const char *basedir, int home, char *webcitdi void drop_root(uid_t UID) { struct passwd pw, *pwp = NULL; +#ifdef HAVE_GETPWUID_R + char pwbuf[SIZ]; +#endif /* * Now that we've bound the sockets, change to the Citadel user id and its