]> git.ipfire.org Git - thirdparty/mlmmj.git/commitdiff
subscription: use filedescriptors to check for subscription membership
authorBaptiste Daroussin <bapt@FreeBSD.org>
Thu, 28 Oct 2021 12:46:15 +0000 (14:46 +0200)
committerBaptiste Daroussin <bapt@FreeBSD.org>
Thu, 28 Oct 2021 12:49:57 +0000 (14:49 +0200)
include/subscriberfuncs.h
src/listcontrol.c
src/memory.c
src/mlmmj-bounce.c
src/mlmmj-process.c
src/mlmmj-sub.c
src/mlmmj-unsub.c
src/subscriberfuncs.c

index 647ea776e9fe2fa07e69000b287483d63588821d..68274bb20cbdcbe51edb96c75a9df18bd4363315 100644 (file)
 #ifndef SUBSCRIBERFUNC_H
 #define SUBSCRIBERFUNC_H
 
+#include <stdbool.h>
+#include "mlmmj.h"
+
 off_t find_subscriber(int fd, const char *address);
-int is_subbed_in(const char *subddirname, const char *address);
-enum subtype is_subbed(const char *listdir, const char *address, int both);
+bool is_subbed_in(int fd, const char *address);
+enum subtype is_subbed(struct mlmmj_list *list, const char *address, int both);
 int open_subscriber_directory(struct mlmmj_list *list, enum subtype typesub, const char **subdir);
 
 #endif /* SUBSCRIBERFUNC_H */
index ff34ae0255ed3e04acac495f829cbb6d555bb6c1..0db3618fe23429c6090e1d0c9dc370b6f340e7ca 100644 (file)
@@ -841,7 +841,7 @@ permit:
                }
                subonlyget = statctrl(list, "subonlyget");
                if(subonlyget) {
-                       if(is_subbed(list->dir, fromemails->emaillist[0], 0) ==
+                       if(is_subbed(list, fromemails->emaillist[0], 0) ==
                                        SUB_NONE) {
                                errno = 0;
                                log_error(LOG_ARGS, "A get request was sent"
index 461dfea71d2820adacbda186fca2e0eb123582f2..b8bc4600a110cbae1ae38abb62d700fb8dfc3fae 100644 (file)
@@ -1,5 +1,5 @@
 /* Copyright (C) 2004 Morten K. Poulsen <morten at afdelingp.dk>
-/* Copyright (C) 2021 Baptiste Daroussin <bapt@FreeBSD.org>
+ * Copyright (C) 2021 Baptiste Daroussin <bapt@FreeBSD.org>
  *
  * $Id$
  *
index 27e13fb97265d39a2681effe24766575cd97f9aa..7c1e6f2816478a618b045465afdcc37872cd51e9 100644 (file)
@@ -336,7 +336,7 @@ int main(int argc, char **argv)
        *a = '@';
 
        /* make sure it's a subscribed address */
-       if(is_subbed(list.dir, address, 0) == SUB_NONE) {
+       if(is_subbed(&list, address, 0) == SUB_NONE) {
                log_error(LOG_ARGS, "%s is bouncing but not subscribed?",
                                address);
                if(mailname)
index 88797a178fceecc0cf523d5b432fd92560f08e19..61e54e53ebb56102fe7cc715b9a12e851e954256 100644 (file)
@@ -961,7 +961,7 @@ int main(int argc, char **argv)
                        exit(EXIT_SUCCESS);
                }
                if(subonlypost) {
-                       foundaddr = (is_subbed(list.dir, posteraddr, 0) !=
+                       foundaddr = (is_subbed(&list, posteraddr, 0) !=
                                        SUB_NONE);
                } else if (modonlypost) {
                        foundaddr = is_moderator(list.dir, posteraddr, NULL);
index 828b8a25de62b963a5138527381f89cba6f760af..832a4438dc00a9bf5fb1fea616a6b797356169b3 100644 (file)
@@ -724,7 +724,7 @@ int main(int argc, char **argv)
                }
        }
 
-       subbed = is_subbed(list.dir, address, 1);
+       subbed = is_subbed(&list, address, 1);
 
        if(subbed == typesub) {
                if(!nogensubscribed)
index cbc6e1b016aba74ec1873c947db6998c74379320..b6f013c229877f7082a4b00eaa6af736d707280e 100644 (file)
@@ -431,7 +431,7 @@ int main(int argc, char **argv)
        int status;
        char *address = NULL;
        struct mlmmj_list list;
-       char *mlmmjsend, *bindir, *subdir, *subddirname;
+       char *mlmmjsend, *bindir;
        char *lowcaseaddr;
        enum subtype typesub = SUB_ALL;
        enum subreason reasonsub = SUB_ADMIN;
@@ -557,23 +557,10 @@ int main(int argc, char **argv)
        }
 
        if (typesub == SUB_ALL) {
-               subbed = is_subbed(list.dir, address, 0) != SUB_NONE;
+               subbed = is_subbed(&list, address, 0) != SUB_NONE;
        } else {
-               switch(typesub) {
-                       default:
-                       case SUB_NORMAL:
-                               subdir = "/subscribers.d/";
-                               break;
-                       case SUB_DIGEST:
-                               subdir = "/digesters.d/";
-                               break;
-                       case SUB_NOMAIL:
-                               subdir = "/nomailsubs.d/";
-                               break;
-               }
-               myasprintf(&subddirname, "%s%s", list.dir, subdir);
-               subbed = is_subbed_in(subddirname, address);
-               myfree(subddirname);
+               subbed = is_subbed_in(
+                   open_subscriber_directory(&list, typesub, NULL), address);
        }
 
        if(!subbed) {
index 4b963239a99488d0306223ab2086d076cf41fbfc..ee29b902622c7109eecd5e593fd714a476372637 100644 (file)
@@ -111,16 +111,19 @@ off_t find_subscriber(int fd, const char *address)
        return (off_t)-1;
 }
 
-int is_subbed_in(const char *subddirname, const char *address)
+bool
+is_subbed_in(int fd, const char *address)
 {
        int retval = 0, subread;
-       char *subreadname;
        off_t suboff;
        DIR *subddir;
        struct dirent *dp;
 
-       if((subddir = opendir(subddirname)) == NULL) {
-               log_error(LOG_ARGS, "Could not opendir(%s)", subddirname);
+       if (fd == -1)
+               return (false);
+
+       if((subddir = fdopendir(fd)) == NULL) {
+               log_error(LOG_ARGS, "Could not opendir()");
                exit(EXIT_FAILURE);
        }
 
@@ -130,17 +133,14 @@ int is_subbed_in(const char *subddirname, const char *address)
                if(!strcmp(dp->d_name, ".."))
                        continue;
 
-               subreadname = concatstr(2, subddirname, dp->d_name);
-               subread = open(subreadname, O_RDONLY);
+               subread = openat(fd, dp->d_name, O_RDONLY);
                if(subread < 0) {
-                       log_error(LOG_ARGS, "Could not open %s", subreadname);
-                       myfree(subreadname);
+                       log_error(LOG_ARGS, "Could not open %s", dp->d_name);
                        continue;
                }
 
                suboff = find_subscriber(subread, address);
                close(subread);
-               myfree(subreadname);
 
                if(suboff == -1) {
                        continue;
@@ -154,32 +154,26 @@ int is_subbed_in(const char *subddirname, const char *address)
        return retval;
 }
 
-enum subtype is_subbed(const char *listdir, const char *address, int both)
+enum subtype is_subbed(struct mlmmj_list *list, const char *address, int both)
 {
-       int retval;
-       char *subddirname;
+       int fd;
        enum subtype typesub = SUB_NONE;
-       
-       subddirname = concatstr(2, listdir, "/subscribers.d/");
-       retval = is_subbed_in(subddirname, address);
-       myfree(subddirname);
-       if (retval) {
+
+       fd = openat(list->fd, "subscribers.d", O_DIRECTORY|O_CLOEXEC);
+       if(is_subbed_in(fd, address)) {
                if (!both) return SUB_NORMAL;
                typesub = SUB_NORMAL;
        }
 
-       subddirname = concatstr(2, listdir, "/digesters.d/");
-       retval = is_subbed_in(subddirname, address);
-       myfree(subddirname);
-       if (retval) {
+       fd = openat(list->fd, "digesters.d", O_DIRECTORY|O_CLOEXEC);
+       if (is_subbed_in(fd, address)) {
                if (typesub == SUB_NORMAL) return SUB_BOTH;
                return SUB_DIGEST;
        }
 
-       subddirname = concatstr(2, listdir, "/nomailsubs.d/");
-       retval = is_subbed_in(subddirname, address);
-       myfree(subddirname);
-       if (retval) return SUB_NOMAIL;
+       fd = openat(list->fd, "nomailsubs.d", O_DIRECTORY|O_CLOEXEC);
+       if (is_subbed_in(fd, address))
+               return SUB_NOMAIL;
 
        return typesub;
 }