Fix directory permission checks
authorWilfried Goesgens <dothebart@citadel.org>
Thu, 1 Jan 2015 15:32:48 +0000 (16:32 +0100)
committerWilfried Goesgens <dothebart@citadel.org>
Thu, 1 Jan 2015 15:32:48 +0000 (16:32 +0100)
  - on citserver start check whether all our required directories are present, if not create them.
  - only create digest spool files if we actualy need them, and only remove them once we sent it.

citadel/include/citadel_dirs.h
citadel/modules/network/serv_netmail.c
citadel/modules/network/serv_netspool.c
citadel/utillib/citadel_dirs.c
citadel/utils/setup.c

index 407c1dee0145ef54ef22c549ef52b9a610b1fce5..db669ba9b85b16f78f1b597cce46d122dec014e8 100644 (file)
@@ -62,13 +62,13 @@ extern char file_funambol_msg[PATH_MAX];
 extern void calc_dirs_n_files(int relh, int home, const char *relhome, char  *ctdldir, int dbg);
 
 
-extern void create_run_directories(long UID, long GUID);
+extern int create_run_directories(long UID, long GUID);
 
 extern size_t assoc_file_name(char *buf, 
                            size_t n,
                            struct ctdlroom *qrbuf, 
                            const char *prefix);
 
-extern FILE *create_digest_file(struct ctdlroom *room);
+extern FILE *create_digest_file(struct ctdlroom *room, int forceCreate);
 extern void remove_digest_file(struct ctdlroom *room);
 #endif /* __CITADEL_DIRS_H */
index a1938c64cbcfbe949d31c5c4df14d7bd081a47df..c4038869f7613a414fad4ab8de92bbfd62cf41bc 100644 (file)
@@ -237,13 +237,24 @@ void network_process_digest(SpoolControl *sc, struct CtdlMessage *omsg, long *de
 
        struct CtdlMessage *msg = NULL;
 
-       /*
-        * Process digest recipients
-        */
-       if ((sc->Users[digestrecp] == NULL)||
-           (sc->digestfp == NULL))
+       if (sc->Users[digestrecp] == NULL)
                return;
 
+       /* If there are digest recipients, we have to build a digest */
+       if (sc->digestfp == NULL) {
+               
+               sc->digestfp = create_digest_file(&sc->room, 1);
+
+               if (sc->digestfp == NULL)
+                       return;
+
+               sc->haveDigest = ftell(sc->digestfp) > 0;
+               if (!sc->haveDigest) {
+                       fprintf(sc->digestfp, "Content-type: text/plain\n\n");
+               }
+               sc->haveDigest = 1;
+       }
+
        msg = CM_Duplicate(omsg);
        if (msg != NULL) {
                sc->haveDigest = 1;
index 500d931bf0c57cce635bb116a0283449fe8956ac..8347fa150f970597a3af4678a749b9382fd8a79e 100644 (file)
@@ -353,16 +353,6 @@ void network_spoolout_room(SpoolControl *sc)
 
        syslog(LOG_INFO, "Networking started for <%s>\n", CCC->room.QRname);
 
-       /* If there are digest recipients, we have to build a digest */
-       if (sc->Users[digestrecp] != NULL) {
-               
-               sc->digestfp = create_digest_file(&sc->room);
-               sc->haveDigest = ftell(sc->digestfp) > 0;
-               if (!sc->haveDigest) {
-                       fprintf(sc->digestfp, "Content-type: text/plain\n\n");
-               }
-       }
-
        CalcListID(sc);
 
        /* remember where we started... */
@@ -394,7 +384,7 @@ void network_spoolout_room(SpoolControl *sc)
 
 
        /* If we wrote a digest, deliver it and then close it */
-       if (sc->digestfp != NULL) {
+       if (sc->Users[digestrecp] != NULL) {
                time_t now = time(NULL);
                time_t secs_today = now % (24 * 60 * 60);
                long delta = 0;
@@ -404,25 +394,31 @@ void network_spoolout_room(SpoolControl *sc)
                        delta = (24 * 60 * 60) - delta;
                }
 
-               if (sc->haveDigest     &&
-                   (secs_today < 300) && 
-                   (delta < 300) )
+               if ((secs_today < 300) && 
+                   (delta < 300))
                {
-                       last_digest_delivery = now;
-                       fprintf(sc->digestfp,
-                               " -----------------------------------"
-                               "------------------------------------"
-                               "-------\n"
-                               "You are subscribed to the '%s' "
-                               "list.\n"
-                               "To post to the list: %s\n",
-                               CCC->room.QRname, buf
-                               );
-                       network_deliver_digest(sc);     /* deliver */
+                       if (sc->digestfp == NULL) {
+                               sc->digestfp = create_digest_file(&sc->room, 0);
+                       }
+                       if (sc->digestfp != NULL) {
+                               last_digest_delivery = now;
+                               fprintf(sc->digestfp,
+                                       " -----------------------------------"
+                                       "------------------------------------"
+                                       "-------\n"
+                                       "You are subscribed to the '%s' "
+                                       "list.\n"
+                                       "To post to the list: %s\n",
+                                       CCC->room.QRname, buf
+                                       );
+                               network_deliver_digest(sc);     /* deliver */
+                               remove_digest_file(&sc->room);
+                       }
                }
+       }
+       if (sc->digestfp != NULL) {
                fclose(sc->digestfp);
                sc->digestfp = NULL;
-               remove_digest_file(&sc->room);
        }
 
        /* Now rewrite the config file */
index 3b0afc1b6ca66b6dae715a5f0ac68afb20bdea96..71d4d6e1ca898885e08fab710590a4356618cb17 100644 (file)
 #include <limits.h>
 #include <time.h>
 #include <errno.h>
+#include <syslog.h>
 #include <libcitadel.h>
 #include "citadel.h"
+#include "citadel_dirs.h"
 
 /* our directories... */
 char ctdl_home_directory[PATH_MAX] = "";
@@ -376,24 +378,31 @@ void remove_digest_file(struct ctdlroom *room)
                 ctdl_netdigest_dir,
                 room->QRnumber);
        StripSlashes(buf, 0);
-       fprintf(stderr, "----> %s \n", buf);
        unlink(buf);
 }
 
-FILE *create_digest_file(struct ctdlroom *room)
+FILE *create_digest_file(struct ctdlroom *room, int forceCreate)
 {
-       char buf[PATH_MAX];
+       struct stat stbuf;
+       char fn[PATH_MAX];
+       int exists;
        FILE *fp;
 
-       snprintf(buf, PATH_MAX, "%s/%ld.eml", 
+       snprintf(fn, PATH_MAX, "%s/%ld.eml", 
                 ctdl_netdigest_dir,
                 room->QRnumber);
-       StripSlashes(buf, 0);
-       fprintf(stderr, "----> %s \n", buf);
+       StripSlashes(fn, 0);
+
+       exists = stat(fn, &stbuf); 
+       if (!forceCreate && (exists == -1))
+               return NULL;
        
-       fp = fopen(buf, "w+");
+       fp = fopen(fn, "w+");
        if (fp == NULL) {
-
+               syslog(LOG_EMERG,
+                      "failed to create digest file %s: %s",
+                      fn,
+                      strerror(errno));
        }
        return fp;
 }
@@ -403,12 +412,29 @@ int create_dir(char *which, long ACCESS, long UID, long GID)
 {
        int rv;
        rv = mkdir(which, ACCESS);
-       if ((rv == -1) && (errno == EEXIST))
+       if ((rv == -1) && (errno != EEXIST)) {
+               syslog(LOG_EMERG,
+                      "failed to create directory %s: %s",
+                      which,
+                      strerror(errno));
                return rv;
+       }
        rv = chmod(which, ACCESS);
-       if (rv == -1)
+       if (rv == -1) {
+               syslog(LOG_EMERG,
+                      "failed to set permissions for directory %s: %s",
+                      which,
+                      strerror(errno));
                return rv;
+       }
        rv = chown(which, UID, GID);
+       if (rv == -1) {
+               syslog(LOG_EMERG,
+                      "failed to set owner for directory %s: %s",
+                      which,
+                      strerror(errno));
+               return rv;
+       }
        return rv;
 }
 
index 85288088cceaffa123718374f02cd3399945f334..ff65b23386a6ec7607983186f4795a466b6c1338 100644 (file)
@@ -1348,7 +1348,11 @@ int main(int argc, char *argv[])
                gid = pw->pw_gid;
        }
 
-       create_run_directories(atoi(configs[69]), gid);
+       if (create_run_directories(atoi(configs[69]), gid) != 0) {
+               display_error("%s\n",
+                             _("failed to create directories"));
+       }
+               
 
        activity = _("Reconfiguring Citadel server");
        progress(activity, 0, NUM_CONFIGS+3);