Well, it doesn't crash anymore, but it also doesn't work at all. Is that an improvement?
authorArt Cancro <ajc@citadel.org>
Wed, 8 Sep 2021 15:21:36 +0000 (15:21 +0000)
committerArt Cancro <ajc@citadel.org>
Wed, 8 Sep 2021 15:21:36 +0000 (15:21 +0000)
citadel/database.c
citadel/internet_addressing.c
citadel/ipcdef.h
citadel/modules/vcard/serv_vcard.c
citadel/room_ops.c
citadel/room_ops.h

index 37a9d79..45b5d27 100644 (file)
@@ -1,16 +1,14 @@
-/*
- * This is a data store backend for the Citadel server which uses Berkeley DB.
- *
- * Copyright (c) 1987-2021 by the citadel.org team
- *
- * This program is open source software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version 3.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- */
+// This is a data store backend for the Citadel server which uses Berkeley DB.
+//
+// Copyright (c) 1987-2021 by the citadel.org team
+//
+// This program is open source software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License version 3.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
 
 /*****************************************************************************
        Tunable configuration parameters for the Berkeley DB back end
@@ -39,7 +37,6 @@
 #endif
 
 #include <libcitadel.h>
-
 #include "ctdl_module.h"
 #include "control.h"
 #include "citserver.h"
@@ -548,10 +545,8 @@ static DBC *localcursor(int cdb) {
  */
 struct cdbdata *cdb_fetch(int cdb, const void *key, int keylen) {
 
-       syslog(LOG_DEBUG, "\x1b[35mdatabase: fetch from db %d a key of length %d\x1b[0m", cdb, keylen);
-
-       if (keylen == 0) {
-               abort();
+       if (keylen == 0) {              // key length zero is impossible
+               return(NULL);
        }
 
        struct cdbdata *tempcdb;
@@ -576,8 +571,7 @@ struct cdbdata *cdb_fetch(int cdb, const void *key, int keylen) {
                        curs = localcursor(cdb);
                        ret = curs->c_get(curs, &dkey, &dret, DB_SET);
                        cclose(curs);
-               }
-               while (ret == DB_LOCK_DEADLOCK);
+               } while (ret == DB_LOCK_DEADLOCK);
        }
 
        if ((ret != 0) && (ret != DB_NOTFOUND)) {
@@ -590,9 +584,8 @@ struct cdbdata *cdb_fetch(int cdb, const void *key, int keylen) {
        }
 
        tempcdb = (struct cdbdata *) malloc(sizeof(struct cdbdata));
-
        if (tempcdb == NULL) {
-               syslog(LOG_ERR, "db: cdb_fetch: Cannot allocate memory for tempcdb");
+               syslog(LOG_ERR, "db: cdb_fetch() cannot allocate memory for tempcdb: %m");
                cdb_abort();
                return NULL;    /* make it easier for static analysis... */
        }
@@ -707,17 +700,19 @@ void cdb_begin_transaction(void) {
 void cdb_end_transaction(void) {
        int i;
 
-       for (i = 0; i < MAXCDB; i++)
+       for (i = 0; i < MAXCDB; i++) {
                if (TSD->cursors[i] != NULL) {
                        syslog(LOG_WARNING, "db: cdb_end_transaction: WARNING: cursor %d still open at transaction end", i);
                        cclose(TSD->cursors[i]);
                        TSD->cursors[i] = NULL;
                }
+       }
 
        if (TSD->tid == NULL) {
                syslog(LOG_ERR, "db: cdb_end_transaction: ERROR: txcommit(NULL) !!");
                cdb_abort();
-       } else {
+       }
+       else {
                txcommit(TSD->tid);
        }
 
@@ -757,16 +752,15 @@ void cdb_trunc(int cdb) {
                                }
                                exit(CTDLEXIT_DB);
                        }
-               } else {
+               }
+               else {
                        /* txcommit(tid); */
                }
        }
 }
 
 
-/*
- * compact (defragment) the database , possibly returning space back to the underlying filesystem
- */
+// compact (defragment) the database, possibly returning space back to the underlying filesystem
 void cdb_compact(void) {
        int ret;
        int i;
index db9e776..c19c4f8 100644 (file)
@@ -44,8 +44,8 @@
 #ifdef HAVE_ICONV
 #include <iconv.h>
 
-#if 0
 /* This is the non-define version in case it is needed for debugging */
+#if 0
 inline void FindNextEnd (char *bptr, char *end)
 {
        /* Find the next ?Q? */
@@ -392,31 +392,30 @@ enum {
 
 
 // Process alias and routing info for email addresses
-int expand_aliases(char *name) {
+int expand_aliases(char *name, char *aliases) {
        int a;
        char aaa[SIZ];
        int at = 0;
        char node[64];
-       char *t;
 
        syslog(LOG_DEBUG, "internet_addressing: \x1b[34mexpand_aliases(%s)\x1b[0m", name);
-
-       char *aliases = CtdlGetSysConfig(GLOBAL_ALIASES);       // First hit the Global Alias Table
        if (aliases) {
-               char *aptr = aliases;
-               while ((t = strtok_r(aptr, "\n", &aptr))) {
-                       char *bar = strchr(t, '|');
+               int num_aliases = num_tokens(aliases, '\n');
+               for (a=0; a<num_aliases; ++a) {
+                       extract_token(aaa, aliases, a, '\n', sizeof aaa);
+                       char *bar = strchr(aaa, '|');
                        if (bar) {
                                bar[0] = 0;
                                ++bar;
-                               if (!strcasecmp(name, t)) {
+                               striplt(aaa);
+                               striplt(bar);
+                               syslog(LOG_DEBUG, "\x1b[32malias #%d: compare <%s> to <%s>\x1b[0m", a, name, aaa);
+                               if (!strcasecmp(name, aaa)) {
                                        syslog(LOG_DEBUG, "internet_addressing: global alias <%s> to <%s>", name, bar);
                                        strcpy(name, bar);
                                }
                        }
                }
-
-               free(aliases);
                if (strchr(name, ',')) {
                        return(EA_MULTIPLE);
                }
@@ -476,9 +475,13 @@ Array *split_recps(char *addresses) {
 
        // Copy the supplied address list into our own memory space, because we are going to mangle it.
        char *a = malloc(strlen(addresses));
-       a[0] = 0;
+       if (a == NULL) {
+               syslog(LOG_ERR, "internet_addressing: malloc() failed: %m");
+               return(NULL);
+       }
 
        // Strip out anything in double quotes
+       a[0] = 0;
        int toggle = 0;
        int pos = 0;
        char *t;
@@ -501,12 +504,18 @@ Array *split_recps(char *addresses) {
 
        // Tokenize the recipients into an array
        Array *recipients_array = array_new(256);               // no single recipient should be bigger than 256 bytes
-       char *r = a;
-       while ((t = strtok_r(r, ",", &r))) {
-               striplt(t);                                     // strip leading and trailing whitespace
-               stripout(t, '(', ')');                          // remove any portion in parentheses
-               stripallbut(t, '<', '>');                       // if angle brackets are present, keep only what is inside them
-               array_append(recipients_array, t);
+
+       int num_addresses = num_tokens(a, ',');
+       syslog(LOG_DEBUG, "\x1b[35mEXTRACING: %d addresses from <%s>\x1b[0m", num_addresses, a);
+       for (int i=0; i<num_addresses; ++i) {
+               char this_address[256];
+               extract_token(this_address, a, i, ',', sizeof this_address);
+               syslog(LOG_DEBUG, "\x1b[35mEXTRACTED: <%s>\x1b[0m", this_address);
+               striplt(this_address);                          // strip leading and trailing whitespace
+               stripout(this_address, '(', ')');               // remove any portion in parentheses
+               stripallbut(this_address, '<', '>');            // if angle brackets are present, keep only what is inside them
+               syslog(LOG_DEBUG, "\x1b[35mPROCESSED: <%s>\x1b[0m", this_address);
+               array_append(recipients_array, this_address);
        }
 
        free(a);                                                // We don't need this buffer anymore.
@@ -565,13 +574,17 @@ struct recptypes *validate_recipients(char *supplied_recipients, const char *Rem
        ret->display_recp[0] = 0;
        ret->recptypes_magic = RECPTYPES_MAGIC;
 
+       //char *aliases = CtdlGetSysConfig(GLOBAL_ALIASES);     // First hit the Global Alias Table
+       char *aliases = strdup("root|admin,ajc@citadel.org,artcancro@gmail.com\n abuse|admin\n ajc|ajc@citadel.org\n");
+
        Array *recp_array = split_recps(supplied_recipients);
        int original_array_len = array_len(recp_array);
+       syslog(LOG_DEBUG, "\x1b[32moriginal_array_len=%d\x1b[0m", original_array_len);
        for (int r=0; r<array_len(recp_array); ++r) {
+               syslog(LOG_DEBUG, "\x1b[32m\x1b[7mrecipient #%d is %s \x1b[0m", r, (char *)array_get_element_at(recp_array, r) );
                org_recp = (char *)array_get_element_at(recp_array, r);
                strncpy(this_recp, org_recp, sizeof this_recp);
-
-               mailtype = expand_aliases(this_recp);
+               mailtype = expand_aliases(this_recp, aliases);
 
                // If an alias expanded to multiple recipients, strip off those recipients and append them
                // to the end of the array.  This loop will hit those again when it gets there.
@@ -590,7 +603,7 @@ struct recptypes *validate_recipients(char *supplied_recipients, const char *Rem
                        }
                }
 
-               mailtype = expand_aliases(this_recp);           // do it ONCE again to handle alias expansions
+               mailtype = expand_aliases(this_recp, aliases);          // do it ONCE again to handle alias expansions
                if (mailtype == EA_MULTIPLE) {
                        mailtype = EA_ERROR;                    // and fail if it wants to expand a second time
                }
@@ -721,6 +734,10 @@ struct recptypes *validate_recipients(char *supplied_recipients, const char *Rem
                }
        }
 
+       if (aliases != NULL) {          // ok, we're done with the global alias list now
+               free(aliases);
+       }
+
        if ( (ret->num_local + ret->num_internet + ret->num_room + ret->num_error) == 0) {
                ret->num_error = (-1);
                strcpy(ret->errormsg, "No recipients specified.");
index f155a6e..23897e4 100644 (file)
@@ -57,7 +57,6 @@ extern "C" {
 #define QR2_COLLABDEL  4               /* Anyone who can post can delete   */
 #define QR2_SUBJECTREQ 8               /* Subject strongly recommended */
 #define QR2_SMTP_PUBLIC        16              /* Listservice Subscribers may post */
-#define QR2_MODERATED  32              /* Listservice aide has to permit posts  */
 
 #define US_NEEDVALID   1               /* User needs to be validated       */
 #define US_EXTEDIT     2               /* Always use external editor       */
index d828dc7..9b30840 100644 (file)
@@ -927,7 +927,7 @@ void check_get(void) {
                char *argbuf = &cmdbuf[4];
                
                extract_token(internet_addr, argbuf, 0, '|', sizeof internet_addr);
-               rcpt = validate_recipients(internet_addr, NULL, CHECK_EXISTANCE);
+               rcpt = validate_recipients(internet_addr, NULL, CHECK_EXIST);
                if (    (rcpt != NULL) &&
                        (
                                (*rcpt->recp_local != '\0') ||
index 9adc4d6..29bb123 100644 (file)
@@ -57,7 +57,7 @@ int CtdlDoIHavePermissionToPostInThisRoom(
                snprintf(errmsgbuf, n, "Not logged in.");
                return (ERROR + NOT_LOGGED_IN);
        }
-       else if (PostPublic == CHECK_EXISTANCE) {
+       else if (PostPublic == CHECK_EXIST) {
                return (0);                                     // evaluate whether a recipient exists
        }
        else if (!(CC->logged_in)) {
@@ -65,14 +65,6 @@ int CtdlDoIHavePermissionToPostInThisRoom(
                        snprintf(errmsgbuf, n, "Not logged in.");
                        return (ERROR + NOT_LOGGED_IN);
                }
-               if (CC->room.QRflags2 & QR2_MODERATED) {
-                       snprintf(errmsgbuf, n, "Not logged in Moderation feature not yet implemented!");
-                       return (ERROR + NOT_LOGGED_IN);
-               }
-               // FIXME what was this?  AJC 2021
-               //if ((PostPublic != POST_LMTP) && (CC->room.QRflags2 & QR2_SMTP_PUBLIC) == 0) {
-                       //return CtdlNetconfigCheckRoomaccess(errmsgbuf, n, RemoteIdentifier);
-               //}
                return (0);
        }
 
index a9a77f9..d72300b 100644 (file)
@@ -12,7 +12,7 @@ void convert_room_name_macros(char *towhere, size_t maxlen);
 typedef enum _POST_TYPE{
        POST_LOGGED_IN,
        POST_EXTERNAL,
-       CHECK_EXISTANCE,
+       CHECK_EXIST,
        POST_LMTP
 } PostType;