From 19576adee6e0a5fb959f8506eb68e31be590fe94 Mon Sep 17 00:00:00 2001 From: Wilfried Goesgens Date: Thu, 1 Jan 2015 16:32:48 +0100 Subject: [PATCH] Fix directory permission checks - 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 | 4 +-- citadel/modules/network/serv_netmail.c | 21 ++++++++--- citadel/modules/network/serv_netspool.c | 48 ++++++++++++------------- citadel/utillib/citadel_dirs.c | 46 ++++++++++++++++++------ citadel/utils/setup.c | 6 +++- 5 files changed, 81 insertions(+), 44 deletions(-) diff --git a/citadel/include/citadel_dirs.h b/citadel/include/citadel_dirs.h index 407c1dee0..db669ba9b 100644 --- a/citadel/include/citadel_dirs.h +++ b/citadel/include/citadel_dirs.h @@ -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 */ diff --git a/citadel/modules/network/serv_netmail.c b/citadel/modules/network/serv_netmail.c index a1938c64c..c4038869f 100644 --- a/citadel/modules/network/serv_netmail.c +++ b/citadel/modules/network/serv_netmail.c @@ -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; diff --git a/citadel/modules/network/serv_netspool.c b/citadel/modules/network/serv_netspool.c index 500d931bf..8347fa150 100644 --- a/citadel/modules/network/serv_netspool.c +++ b/citadel/modules/network/serv_netspool.c @@ -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 */ diff --git a/citadel/utillib/citadel_dirs.c b/citadel/utillib/citadel_dirs.c index 3b0afc1b6..71d4d6e1c 100644 --- a/citadel/utillib/citadel_dirs.c +++ b/citadel/utillib/citadel_dirs.c @@ -19,8 +19,10 @@ #include #include #include +#include #include #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; } diff --git a/citadel/utils/setup.c b/citadel/utils/setup.c index 85288088c..ff65b2338 100644 --- a/citadel/utils/setup.c +++ b/citadel/utils/setup.c @@ -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); -- 2.30.2