Saving my place while we try something...
authorArt Cancro <ajc@citadel.org>
Wed, 8 Sep 2021 21:07:12 +0000 (21:07 +0000)
committerArt Cancro <ajc@citadel.org>
Wed, 8 Sep 2021 21:07:12 +0000 (21:07 +0000)
citadel/database_cleanup.sh
citadel/internet_addressing.c
citadel/modules/ctdlproto/serv_messages.c
citadel/modules/vcard/serv_vcard.c
libcitadel/lib/array.c

index 38b1fa3..7654946 100755 (executable)
@@ -45,6 +45,13 @@ if [ -x /usr/local/ctdlsupport/bin/db_dump ] ; then
        DUMP=/usr/local/ctdlsupport/bin/db_dump
        LOAD=/usr/local/ctdlsupport/bin/db_load
 
+# otherwise look in /usr/local
+elif [ -x /usr/local/bin/db_dump ] ; then
+       export PATH=/usr/local/bin:$PATH
+       RECOVER=/usr/local/bin/db_recover
+       DUMP=/usr/local/bin/db_dump
+       LOAD=/usr/local/bin/db_load
+
 # usual install
 else
        if test -f /usr/bin/db_dump; then 
index c19c4f8..6c46199 100644 (file)
@@ -396,9 +396,7 @@ int expand_aliases(char *name, char *aliases) {
        int a;
        char aaa[SIZ];
        int at = 0;
-       char node[64];
 
-       syslog(LOG_DEBUG, "internet_addressing: \x1b[34mexpand_aliases(%s)\x1b[0m", name);
        if (aliases) {
                int num_aliases = num_tokens(aliases, '\n');
                for (a=0; a<num_aliases; ++a) {
@@ -409,8 +407,7 @@ int expand_aliases(char *name, char *aliases) {
                                ++bar;
                                striplt(aaa);
                                striplt(bar);
-                               syslog(LOG_DEBUG, "\x1b[32malias #%d: compare <%s> to <%s>\x1b[0m", a, name, aaa);
-                               if (!strcasecmp(name, aaa)) {
+                               if ( (!IsEmptyStr(aaa)) && (!strcasecmp(name, aaa)) ) {
                                        syslog(LOG_DEBUG, "internet_addressing: global alias <%s> to <%s>", name, bar);
                                        strcpy(name, bar);
                                }
@@ -449,24 +446,17 @@ int expand_aliases(char *name, char *aliases) {
                }
        }
 
-       /* determine local or remote type, see citadel.h */
+       /* Is this a local or remote recipient? */
        at = haschar(name, '@');
-       if (at == 0) return(EA_LOCAL);          /* no @'s - local address */
-       if (at > 1) return(EA_ERROR);           /* >1 @'s - invalid address */
-       remove_any_whitespace_to_the_left_or_right_of_at_symbol(name);
-
-       /* figure out the delivery mode */
-       extract_token(node, name, 1, '@', sizeof node);
-
-       /* If there are one or more dots in the nodename, we assume that it
-        * is an FQDN and will attempt SMTP delivery to the Internet.
-        */
-       if (haschar(node, '.') > 0) {
-               return(EA_INTERNET);
+       if (at == 0) {
+               return(EA_LOCAL);                       /* no @'s = local address */
+       }
+       else if (at == 1) {
+               return(EA_INTERNET);                    /* one @ = internet address */
+       }
+       else {
+               return(EA_ERROR);                       /* more than one @ = badly formed address */
        }
-
-       /* If we get to this point it's an invalid node name */
-       return (EA_ERROR);
 }
 
 
@@ -506,16 +496,15 @@ Array *split_recps(char *addresses) {
        Array *recipients_array = array_new(256);               // no single recipient should be bigger than 256 bytes
 
        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);
+               if (!IsEmptyStr(this_address)) {
+                       array_append(recipients_array, this_address);
+               }
        }
 
        free(a);                                                // We don't need this buffer anymore.
@@ -545,8 +534,6 @@ struct recptypes *validate_recipients(char *supplied_recipients, const char *Rem
        char *org_recp;
        char this_recp[256];
 
-       syslog(LOG_DEBUG, "internet_addressing: \x1b[32mvalidate_recipients(%s) \x1b[0m", supplied_recipients);
-
        ret = (struct recptypes *) malloc(sizeof(struct recptypes));                    // Initialize
        if (ret == NULL) return(NULL);
        memset(ret, 0, sizeof(struct recptypes));                                       // set all values to null/zero
@@ -574,14 +561,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");
+       // 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");//crashes
+       // char *aliases = strdup("root|admin,eeeeee@example.com\nabuse|admin\neek|blat\nwoiwozerosf|wow\n"); //works
+       // char *aliases = strdup("root|admin,ajc@citadel.org");        // works
+       // char *aliases = strdup("root|admin,eeeeee@example.com");     // works
+       // char *aliases = strdup("root|admin,eeeeeee@example.com");    // crashes
+       char *aliases = strdup("root|admin,ignatius.t.foobar@uncensored.citadel.org");  // crashes on the first try
 
        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, aliases);
@@ -603,7 +593,9 @@ struct recptypes *validate_recipients(char *supplied_recipients, const char *Rem
                        }
                }
 
-               mailtype = expand_aliases(this_recp, aliases);          // do it ONCE again to handle alias expansions
+               syslog(LOG_DEBUG, "\x1b[7m%s\x1b[0m", this_recp);
+
+               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
                }
index af88c67..11d61e9 100644 (file)
@@ -490,18 +490,14 @@ void cmd_ent0(char *entargs) {
                        strcpy(bcc, "");
                }
 
-               TRACE;
                valid_to = validate_recipients(recp, NULL, 0);
-               TRACE;
                if (valid_to->num_error > 0) {
                        cprintf("%d %s\n", ERROR + NO_SUCH_USER, valid_to->errormsg);
                        free_recipients(valid_to);
                        return;
                }
 
-               TRACE;
                valid_cc = validate_recipients(cc, NULL, 0);
-               TRACE;
                if (valid_cc->num_error > 0) {
                        cprintf("%d %s\n", ERROR + NO_SUCH_USER, valid_cc->errormsg);
                        free_recipients(valid_to);
@@ -509,9 +505,7 @@ void cmd_ent0(char *entargs) {
                        return;
                }
 
-               TRACE;
                valid_bcc = validate_recipients(bcc, NULL, 0);
-               TRACE;
                if (valid_bcc->num_error > 0) {
                        cprintf("%d %s\n", ERROR + NO_SUCH_USER, valid_bcc->errormsg);
                        free_recipients(valid_to);
@@ -638,9 +632,7 @@ void cmd_ent0(char *entargs) {
                strcat(all_recps, bcc);
        }
        if (!IsEmptyStr(all_recps)) {
-               TRACE;
                valid = validate_recipients(all_recps, NULL, 0);
-               TRACE;
        }
        else {
                valid = NULL;
index 9b30840..413be56 100644 (file)
@@ -939,7 +939,7 @@ void check_get(void) {
                }
                else 
                {
-                       cprintf("500 REJECT noone here by that name.\n");
+                       cprintf("500 REJECT no one here by that name.\n");
                        
                        syslog(LOG_INFO, "vcard: sending 500 REJECT no one here by that name: %s", internet_addr);
                }
index a8adb29..1adc1fd 100644 (file)
@@ -61,12 +61,18 @@ void array_append(Array *arr, void *new_element) {
                arr->num_alloc = 1;
                arr->num_elements = 0;
                arr->the_elements = malloc(arr->element_size * arr->num_alloc);
+               if (arr->the_elements == NULL) {
+                       abort();
+               }
        }
 
        ++arr->num_elements;
        if (arr->num_elements > arr->num_alloc) {
                arr->num_alloc = arr->num_alloc * 2;            // whenever we exceed the buffer size, we double it.
                arr->the_elements = realloc(arr->the_elements, (arr->element_size * arr->num_alloc));
+               if (arr->the_elements == NULL) {
+                       abort();
+               }
        }
 
        memcpy((arr->the_elements + ( (arr->num_elements-1) * arr->element_size )), new_element, arr->element_size);
@@ -107,6 +113,10 @@ void array_delete_element_at(Array *arr, int index) {
                return;
        }
 
+       if (index < 0) {                                // If the supplied index is invalid, return quietly.
+               return;
+       }
+
        --arr->num_elements;
 
        if (index == arr->num_elements) {               // If we deleted the element at the end, there's no more to be done.