Integrated the DKIM signer into serv_smtpclient, but disabled it
[citadel.git] / webcit / downloads.c
index aa777f40ba6533f3a3fe089affe84c90417367e9..9b7dde993c47f254174d3040a2540292ece34b3a 100644 (file)
@@ -1,4 +1,3 @@
-
 /*
  * Copyright (c) 1996-2012 by the citadel.org team
  *
  */
 
 #include "webcit.h"
-#include "webserver.h"
+
 
 CtxType CTX_FILELIST = CTX_NONE;
 
-extern void output_static(const char *What);
+extern void output_static(const charWhat);
 
-extern char *static_dirs[];
+extern charstatic_dirs[];
 
 typedef struct _FileListStruct {
        StrBuf *Filename;
@@ -29,8 +28,9 @@ typedef struct _FileListStruct {
        int Sequence;
 } FileListStruct;
 
-void FreeFiles(void *vFile) {
-       FileListStruct *F = (FileListStruct *) vFile;
+void FreeFiles(void *vFile)
+{
+       FileListStruct *F = (FileListStruct*) vFile;
        FreeStrBuf(&F->Filename);
        FreeStrBuf(&F->MimeType);
        FreeStrBuf(&F->Comment);
@@ -38,49 +38,57 @@ void FreeFiles(void *vFile) {
 }
 
 /* -------------------------------------------------------------------------------- */
-void tmplput_FILE_NAME(StrBuf * Target, WCTemplputParams * TP) {
-       FileListStruct *F = (FileListStruct *) CTX(CTX_FILELIST);
+void tmplput_FILE_NAME(StrBuf *Target, WCTemplputParams *TP)
+{
+       FileListStruct *F = (FileListStruct*) CTX(CTX_FILELIST);
        StrBufAppendTemplate(Target, TP, F->Filename, 0);
 }
-void tmplput_FILE_SIZE(StrBuf * Target, WCTemplputParams * TP) {
-       FileListStruct *F = (FileListStruct *) CTX(CTX_FILELIST);
+void tmplput_FILE_SIZE(StrBuf *Target, WCTemplputParams *TP)
+{
+       FileListStruct *F = (FileListStruct*) CTX(CTX_FILELIST);
        StrBufAppendPrintf(Target, "%ld", F->FileSize);
 }
-void tmplput_FILEMIMETYPE(StrBuf * Target, WCTemplputParams * TP) {
-       FileListStruct *F = (FileListStruct *) CTX(CTX_FILELIST);
+void tmplput_FILEMIMETYPE(StrBuf *Target, WCTemplputParams *TP)
+{
+       FileListStruct *F = (FileListStruct*) CTX(CTX_FILELIST);
        StrBufAppendTemplate(Target, TP, F->MimeType, 0);
 }
-void tmplput_FILE_COMMENT(StrBuf * Target, WCTemplputParams * TP) {
-       FileListStruct *F = (FileListStruct *) CTX(CTX_FILELIST);
+void tmplput_FILE_COMMENT(StrBuf *Target, WCTemplputParams *TP)
+{
+       FileListStruct *F = (FileListStruct*) CTX(CTX_FILELIST);
        StrBufAppendTemplate(Target, TP, F->Comment, 0);
 }
 
 /* -------------------------------------------------------------------------------- */
 
-int Conditional_FILE_ISPIC(StrBuf * Target, WCTemplputParams * TP) {
-       FileListStruct *F = (FileListStruct *) CTX(CTX_FILELIST);
+int Conditional_FILE_ISPIC(StrBuf *Target, WCTemplputParams *TP)
+{
+       FileListStruct *F = (FileListStruct*) CTX(CTX_FILELIST);
        return F->IsPic;
 }
 
 /* -------------------------------------------------------------------------------- */
-int CompareFilelistByMime(const void *vFile1, const void *vFile2) {
-       FileListStruct *File1 = (FileListStruct *) GetSearchPayload(vFile1);
-       FileListStruct *File2 = (FileListStruct *) GetSearchPayload(vFile2);
+int CompareFilelistByMime(const void *vFile1, const void *vFile2)
+{
+       FileListStruct *File1 = (FileListStruct*) GetSearchPayload(vFile1);
+       FileListStruct *File2 = (FileListStruct*) GetSearchPayload(vFile2);
 
        if (File1->IsPic != File2->IsPic)
                return File1->IsPic > File2->IsPic;
        return strcasecmp(ChrPtr(File1->MimeType), ChrPtr(File2->MimeType));
 }
-int CompareFilelistByMimeRev(const void *vFile1, const void *vFile2) {
-       FileListStruct *File1 = (FileListStruct *) GetSearchPayload(vFile1);
-       FileListStruct *File2 = (FileListStruct *) GetSearchPayload(vFile2);
+int CompareFilelistByMimeRev(const void *vFile1, const void *vFile2)
+{
+       FileListStruct *File1 = (FileListStruct*) GetSearchPayload(vFile1);
+       FileListStruct *File2 = (FileListStruct*) GetSearchPayload(vFile2);
        if (File1->IsPic != File2->IsPic)
                return File1->IsPic < File2->IsPic;
        return strcasecmp(ChrPtr(File2->MimeType), ChrPtr(File1->MimeType));
 }
-int GroupchangeFilelistByMime(const void *vFile1, const void *vFile2) {
-       FileListStruct *File1 = (FileListStruct *) vFile1;
-       FileListStruct *File2 = (FileListStruct *) vFile2;
+int GroupchangeFilelistByMime(const void *vFile1, const void *vFile2)
+{
+       FileListStruct *File1 = (FileListStruct*) vFile1;
+       FileListStruct *File2 = (FileListStruct*) vFile2;
 
        if (File1->IsPic != File2->IsPic)
                return File1->IsPic > File2->IsPic;
@@ -88,76 +96,88 @@ int GroupchangeFilelistByMime(const void *vFile1, const void *vFile2) {
 }
 
 
-int CompareFilelistByName(const void *vFile1, const void *vFile2) {
-       FileListStruct *File1 = (FileListStruct *) GetSearchPayload(vFile1);
-       FileListStruct *File2 = (FileListStruct *) GetSearchPayload(vFile2);
+int CompareFilelistByName(const void *vFile1, const void *vFile2)
+{
+       FileListStruct *File1 = (FileListStruct*) GetSearchPayload(vFile1);
+       FileListStruct *File2 = (FileListStruct*) GetSearchPayload(vFile2);
 
        if (File1->IsPic != File2->IsPic)
                return File1->IsPic > File2->IsPic;
        return strcasecmp(ChrPtr(File1->Filename), ChrPtr(File2->Filename));
 }
-int CompareFilelistByNameRev(const void *vFile1, const void *vFile2) {
-       FileListStruct *File1 = (FileListStruct *) GetSearchPayload(vFile1);
-       FileListStruct *File2 = (FileListStruct *) GetSearchPayload(vFile2);
+int CompareFilelistByNameRev(const void *vFile1, const void *vFile2)
+{
+       FileListStruct *File1 = (FileListStruct*) GetSearchPayload(vFile1);
+       FileListStruct *File2 = (FileListStruct*) GetSearchPayload(vFile2);
        if (File1->IsPic != File2->IsPic)
                return File1->IsPic < File2->IsPic;
        return strcasecmp(ChrPtr(File2->Filename), ChrPtr(File1->Filename));
 }
-int GroupchangeFilelistByName(const void *vFile1, const void *vFile2) {
-       FileListStruct *File1 = (FileListStruct *) vFile1;
-       FileListStruct *File2 = (FileListStruct *) vFile2;
+int GroupchangeFilelistByName(const void *vFile1, const void *vFile2)
+{
+       FileListStruct *File1 = (FileListStruct*) vFile1;
+       FileListStruct *File2 = (FileListStruct*) vFile2;
 
        return ChrPtr(File1->Filename)[0] != ChrPtr(File2->Filename)[0];
 }
 
 
-int CompareFilelistBySize(const void *vFile1, const void *vFile2) {
-       FileListStruct *File1 = (FileListStruct *) GetSearchPayload(vFile1);
-       FileListStruct *File2 = (FileListStruct *) GetSearchPayload(vFile2);
+int CompareFilelistBySize(const void *vFile1, const void *vFile2)
+{
+       FileListStruct *File1 = (FileListStruct*) GetSearchPayload(vFile1);
+       FileListStruct *File2 = (FileListStruct*) GetSearchPayload(vFile2);
        if (File1->FileSize == File2->FileSize)
                return 0;
        return (File1->FileSize > File2->FileSize);
 }
-int CompareFilelistBySizeRev(const void *vFile1, const void *vFile2) {
-       FileListStruct *File1 = (FileListStruct *) GetSearchPayload(vFile1);
-       FileListStruct *File2 = (FileListStruct *) GetSearchPayload(vFile2);
+int CompareFilelistBySizeRev(const void *vFile1, const void *vFile2)
+{
+       FileListStruct *File1 = (FileListStruct*) GetSearchPayload(vFile1);
+       FileListStruct *File2 = (FileListStruct*) GetSearchPayload(vFile2);
        if (File1->FileSize == File2->FileSize)
                return 0;
        return (File1->FileSize < File2->FileSize);
 }
-int GroupchangeFilelistBySize(const void *vFile1, const void *vFile2) {
+int GroupchangeFilelistBySize(const void *vFile1, const void *vFile2)
+{
        return 0;
 }
 
 
-int CompareFilelistByComment(const void *vFile1, const void *vFile2) {
-       FileListStruct *File1 = (FileListStruct *) GetSearchPayload(vFile1);
-       FileListStruct *File2 = (FileListStruct *) GetSearchPayload(vFile2);
+int CompareFilelistByComment(const void *vFile1, const void *vFile2)
+{
+       FileListStruct *File1 = (FileListStruct*) GetSearchPayload(vFile1);
+       FileListStruct *File2 = (FileListStruct*) GetSearchPayload(vFile2);
        return strcasecmp(ChrPtr(File1->Comment), ChrPtr(File2->Comment));
 }
-int CompareFilelistByCommentRev(const void *vFile1, const void *vFile2) {
-       FileListStruct *File1 = (FileListStruct *) GetSearchPayload(vFile1);
-       FileListStruct *File2 = (FileListStruct *) GetSearchPayload(vFile2);
+int CompareFilelistByCommentRev(const void *vFile1, const void *vFile2)
+{
+       FileListStruct *File1 = (FileListStruct*) GetSearchPayload(vFile1);
+       FileListStruct *File2 = (FileListStruct*) GetSearchPayload(vFile2);
        return strcasecmp(ChrPtr(File2->Comment), ChrPtr(File1->Comment));
 }
-int GroupchangeFilelistByComment(const void *vFile1, const void *vFile2) {
-       FileListStruct *File1 = (FileListStruct *) vFile1;
-       FileListStruct *File2 = (FileListStruct *) vFile2;
+int GroupchangeFilelistByComment(const void *vFile1, const void *vFile2)
+{
+       FileListStruct *File1 = (FileListStruct*) vFile1;
+       FileListStruct *File2 = (FileListStruct*) vFile2;
        return ChrPtr(File1->Comment)[9] != ChrPtr(File2->Comment)[0];
 }
 
 
-int CompareFilelistBySequence(const void *vFile1, const void *vFile2) {
-       FileListStruct *File1 = (FileListStruct *) GetSearchPayload(vFile1);
-       FileListStruct *File2 = (FileListStruct *) GetSearchPayload(vFile2);
-       return (File2->Sequence > File1->Sequence);
+int CompareFilelistBySequence(const void *vFile1, const void *vFile2)
+{
+       FileListStruct *File1 = (FileListStruct*) GetSearchPayload(vFile1);
+       FileListStruct *File2 = (FileListStruct*) GetSearchPayload(vFile2);
+       return (File2->Sequence >  File1->Sequence);
 }
-int GroupchangeFilelistBySequence(const void *vFile1, const void *vFile2) {
+int GroupchangeFilelistBySequence(const void *vFile1, const void *vFile2)
+{
        return 0;
 }
 
 /* -------------------------------------------------------------------------------- */
-HashList *LoadFileList(StrBuf * Target, WCTemplputParams * TP) {
+HashList* LoadFileList(StrBuf *Target, WCTemplputParams *TP)
+{
        FileListStruct *Entry;
        StrBuf *Buf;
        HashList *Files;
@@ -171,18 +191,19 @@ HashList *LoadFileList(StrBuf * Target, WCTemplputParams * TP) {
        memset(&SubTP, 0, sizeof(WCTemplputParams));
        serv_puts("RDIR");
        serv_getln(buf, sizeof buf);
-       if (buf[0] != '1')
-               return NULL;
+       if (buf[0] != '1') return NULL;
 
-       Buf = NewStrBuf();
+       Buf = NewStrBuf();             
        Files = NewHash(1, NULL);
-       while (!Done && (StrBuf_ServGetln(Buf) >= 0)) {
-               if ((StrLength(Buf) == 3) && !strcmp(ChrPtr(Buf), "000")) {
+       while (!Done && (StrBuf_ServGetln(Buf)>=0)) {
+               if ( (StrLength(Buf)==3) && 
+                   !strcmp(ChrPtr(Buf), "000")) 
+               {
                        Done = 1;
                        continue;
                }
 
-               Entry = (FileListStruct *) malloc(sizeof(FileListStruct));
+               Entry = (FileListStruct*) malloc(sizeof (FileListStruct));
                Entry->Filename = NewStrBufPlain(NULL, StrLength(Buf));
                Entry->MimeType = NewStrBufPlain(NULL, StrLength(Buf));
                Entry->Comment = NewStrBufPlain(NULL, StrLength(Buf));
@@ -208,13 +229,14 @@ HashList *LoadFileList(StrBuf * Target, WCTemplputParams * TP) {
        SortIt = RetrieveSort(&SubTP, NULL, 0, HKEY("fileunsorted"), 0);
        if (SortIt != NULL)
                SortByPayload(Files, SortIt);
-       else
+       else 
                SortByPayload(Files, CompareFilelistBySequence);
        FreeStrBuf(&Buf);
        return Files;
 }
 
-void display_mime_icon(void) {
+void display_mime_icon(void)
+{
        char FileBuf[SIZ];
        const char *FileName;
        char *MimeType;
@@ -224,13 +246,14 @@ void display_mime_icon(void) {
        FileName = GetIconFilename(MimeType, tlen);
 
        if (FileName == NULL)
-               snprintf(FileBuf, SIZ, "%s%s", static_dirs[0], "/webcit_icons/essen/16x16/file.png");
+               snprintf (FileBuf, SIZ, "%s%s", static_dirs[0], "/webcit_icons/essen/16x16/file.png");
        else
-               snprintf(FileBuf, SIZ, "%s%s", static_dirs[3], FileName);
+               snprintf (FileBuf, SIZ, "%s%s", static_dirs[3], FileName);
        output_static(FileBuf);
 }
 
-void download_file(void) {
+void download_file(void)
+{
        wcsession *WCC = WC;
        StrBuf *Buf;
        off_t bytes;
@@ -238,7 +261,7 @@ void download_file(void) {
 
        /* Setting to nonzero forces a MIME type of application/octet-stream */
        int force_download = 1;
-
+       
        Buf = NewStrBuf();
        StrBufExtract_token(Buf, WCC->Hdr->HR.ReqLine, 0, '/');
        StrBufUnescape(Buf, 1);
@@ -249,20 +272,20 @@ void download_file(void) {
                bytes = StrBufExtract_long(Buf, 0, '|');
                StrBufExtract_token(ContentType, Buf, 3, '|');
 
-               CheckGZipCompressionAllowed(SKEY(ContentType));
+               CheckGZipCompressionAllowed (SKEY(ContentType));
                if (force_download)
                        FlushStrBuf(ContentType);
 
                serv_read_binary_to_http(ContentType, bytes, 0, 0);
                serv_puts("CLOS");
                StrBuf_ServGetln(Buf);
-       }
-       else {
+       } else {
                StrBufCutLeft(Buf, 4);
                hprintf("HTTP/1.1 404 %s\n", ChrPtr(Buf));
                output_headers(0, 0, 0, 0, 0, 0);
                hprintf("Content-Type: text/plain\r\n");
-               wc_printf(_("An error occurred while retrieving this file: %s\n"), ChrPtr(Buf));
+               wc_printf(_("An error occurred while retrieving this file: %s\n"), 
+                       ChrPtr(Buf));
                end_burst();
        }
        FreeStrBuf(&ContentType);
@@ -271,11 +294,12 @@ void download_file(void) {
 
 
 
-void delete_file(void) {
+void delete_file(void)
+{
        const StrBuf *MimeType;
        StrBuf *Line;
        char buf[256];
-
+       
        safestrncpy(buf, bstr("file"), sizeof buf);
        unescape_input(buf);
        serv_printf("DELF %s", buf);
@@ -290,20 +314,24 @@ void delete_file(void) {
 
 
 
-void upload_file(void) {
+void upload_file(void)
+{
        const StrBuf *RetMimeType;
        const char *MimeType;
        StrBuf *Line;
        long bytes_transmitted = 0;
        long blocksize;
        const StrBuf *Desc;
-       wcsession *WCC = WC;    /* stack this for faster access (WC is a function) */
+       wcsession *WCC = WC;     /* stack this for faster access (WC is a function) */
 
-       MimeType = GuessMimeType(ChrPtr(WCC->upload), WCC->upload_length);
+       MimeType = GuessMimeType(ChrPtr(WCC->upload), WCC->upload_length); 
 
-       Desc = sbstr("description");
+               Desc = sbstr("description");
 
-       serv_printf("UOPN %s|%s|%s", ChrPtr(WCC->upload_filename), MimeType, ChrPtr(Desc));
+       serv_printf("UOPN %s|%s|%s", 
+                   ChrPtr(WCC->upload_filename), 
+                   MimeType, 
+                   ChrPtr(Desc));
        Line = NewStrBuf();
        StrBuf_ServGetln(Line);
        if (GetServerStatusMsg(Line, NULL, 1, 2) != 2) {
@@ -313,9 +341,11 @@ void upload_file(void) {
                return;
        }
 
-       while (bytes_transmitted < WCC->upload_length) {
+       while (bytes_transmitted < WCC->upload_length)
+       {
                blocksize = 4096;
-               if (blocksize > (WCC->upload_length - bytes_transmitted)) {
+               if (blocksize > (WCC->upload_length - bytes_transmitted))
+               {
                        blocksize = (WCC->upload_length - bytes_transmitted);
                }
                serv_printf("WRIT %ld", blocksize);
@@ -343,12 +373,13 @@ void upload_file(void) {
  * When the browser requests an image file from the Citadel server,
  * this function is called to transmit it.
  */
-void output_image(void) {
+void output_image(void)
+{
        StrBuf *Buf;
        wcsession *WCC = WC;
        off_t bytes;
        const char *MimeType;
-
+       
        Buf = NewStrBuf();
        serv_printf("OIMG %s|%s", bstr("name"), bstr("parm"));
        StrBuf_ServGetln(Buf);
@@ -358,17 +389,17 @@ void output_image(void) {
                bytes = StrBufExtract_long(Buf, 0, '|');
 
                /** Read it from the server */
-
+               
                rc = serv_read_binary(WCC->WBuf, bytes, Buf);
                serv_puts("CLOS");
                StrBuf_ServGetln(Buf);
-
+               
                if (rc > 0) {
-                       MimeType = GuessMimeType(ChrPtr(WCC->WBuf), StrLength(WCC->WBuf));
-
+                       MimeType = GuessMimeType (ChrPtr(WCC->WBuf), StrLength(WCC->WBuf));
                        /** Write it to the browser */
-                       if (!IsEmptyStr(MimeType)) {
-                               CheckGZipCompressionAllowed(MimeType, strlen(MimeType));
+                       if (!IsEmptyStr(MimeType))
+                       {
+                               CheckGZipCompressionAllowed (MimeType, strlen(MimeType));
                                http_transmit_thing(MimeType, 0);
                                FreeStrBuf(&Buf);
                                return;
@@ -376,37 +407,59 @@ void output_image(void) {
                }
                /* hm... unknown mimetype? fallback to blank gif */
        }
-       else {
+       else { 
                syslog(LOG_DEBUG, "OIMG failed: %s", ChrPtr(Buf));
        }
 
-
+       
        /*
         * Instead of an ugly 404, send a 1x1 transparent GIF
-        * when there's no such image on the server.
+        * when there's no such image on the server display blank
         */
-       StrBufPrintf(Buf, "%s%s", static_dirs[0], "/webcit_icons/blank.gif");
-       output_static(ChrPtr(Buf));
+       output_static(NULL);
        FreeStrBuf(&Buf);
 }
 
-void InitModule_DOWNLOAD(void) {
+void 
+InitModule_DOWNLOAD
+(void)
+{
        RegisterCTX(CTX_FILELIST);
 
-       RegisterIterator("ROOM:FILES", 0, NULL, LoadFileList, NULL, DeleteHash, CTX_FILELIST, CTX_NONE, IT_FLAG_DETECT_GROUPCHANGE);
+       RegisterIterator("ROOM:FILES", 0, NULL, LoadFileList,
+                        NULL, DeleteHash, CTX_FILELIST, CTX_NONE, 
+                        IT_FLAG_DETECT_GROUPCHANGE);
 
        RegisterSortFunc(HKEY("filemime"),
-                        NULL, 0, CompareFilelistByMime, CompareFilelistByMimeRev, GroupchangeFilelistByMime, CTX_FILELIST);
+                        NULL, 0,
+                        CompareFilelistByMime,
+                        CompareFilelistByMimeRev,
+                        GroupchangeFilelistByMime,
+                        CTX_FILELIST);
        RegisterSortFunc(HKEY("filename"),
-                        NULL, 0, CompareFilelistByName, CompareFilelistByNameRev, GroupchangeFilelistByName, CTX_FILELIST);
+                        NULL, 0,
+                        CompareFilelistByName,
+                        CompareFilelistByNameRev,
+                        GroupchangeFilelistByName,
+                        CTX_FILELIST);
        RegisterSortFunc(HKEY("filesize"),
-                        NULL, 0, CompareFilelistBySize, CompareFilelistBySizeRev, GroupchangeFilelistBySize, CTX_FILELIST);
+                        NULL, 0,
+                        CompareFilelistBySize,
+                        CompareFilelistBySizeRev,
+                        GroupchangeFilelistBySize,
+                        CTX_FILELIST);
        RegisterSortFunc(HKEY("filesubject"),
                         NULL, 0,
-                        CompareFilelistByComment, CompareFilelistByCommentRev, GroupchangeFilelistByComment, CTX_FILELIST);
+                        CompareFilelistByComment,
+                        CompareFilelistByCommentRev,
+                        GroupchangeFilelistByComment,
+                        CTX_FILELIST);
        RegisterSortFunc(HKEY("fileunsorted"),
                         NULL, 0,
-                        CompareFilelistBySequence, CompareFilelistBySequence, GroupchangeFilelistBySequence, CTX_FILELIST);
+                        CompareFilelistBySequence,
+                        CompareFilelistBySequence,
+                        GroupchangeFilelistBySequence,
+                        CTX_FILELIST);
 
        RegisterNamespace("FILE:NAME", 0, 2, tmplput_FILE_NAME, NULL, CTX_FILELIST);
        RegisterNamespace("FILE:SIZE", 0, 1, tmplput_FILE_SIZE, NULL, CTX_FILELIST);
@@ -416,7 +469,7 @@ void InitModule_DOWNLOAD(void) {
        RegisterConditional("COND:FILE:ISPIC", 0, Conditional_FILE_ISPIC, CTX_FILELIST);
 
        WebcitAddUrlHandler(HKEY("image"), "", 0, output_image, ANONYMOUS);
-       WebcitAddUrlHandler(HKEY("display_mime_icon"), "", 0, display_mime_icon, ANONYMOUS);
+       WebcitAddUrlHandler(HKEY("display_mime_icon"), "", 0, display_mime_icon , ANONYMOUS);
        WebcitAddUrlHandler(HKEY("download_file"), "", 0, download_file, NEED_URL);
        WebcitAddUrlHandler(HKEY("delete_file"), "", 0, delete_file, NEED_URL);
        WebcitAddUrlHandler(HKEY("upload_file"), "", 0, upload_file, 0);