Added support for Allowed by default filters in addition to Denied by default
authorMatthew Mondor <mmondor@pulsar-zone.net>
Tue, 15 Feb 2005 22:30:22 +0000 (22:30 +0000)
committerMatthew Mondor <mmondor@pulsar-zone.net>
Tue, 15 Feb 2005 22:30:22 +0000 (22:30 +0000)
ones

mmsoftware/mmmail/scripts/upgrade-0.0.24.sql
mmsoftware/mmmail/src/mmsmtpd/mmsmtpd.c
mmsoftware/mmmail/src/mmsmtpd/mmsmtpd.h

index d667eff..c0e6dc3 100644 (file)
@@ -1,4 +1,4 @@
-# $Id: upgrade-0.0.24.sql,v 1.13 2004/12/03 17:29:54 mmondor Exp $
+# $Id: upgrade-0.0.24.sql,v 1.14 2005/02/15 22:30:22 mmondor Exp $
 #
 # You should execute this script if you are upgrading mmmail from 0.0.21 or
 # later to 0.0.24 or later. This adds the new mail_file field for those using
@@ -10,6 +10,7 @@
 ALTER TABLE mail MODIFY COLUMN mail_data longtext;
 ALTER TABLE mail ADD COLUMN mail_file varchar(255);
 ALTER TABLE box ADD COLUMN box_filter tinyint(1) NOT NULL default '0';
+ALTER TABLE box ADD COLUMN box_filter_type char(1) NOT NULL default 'D';
 ALTER TABLE box ADD COLUMN box_description varchar(64) NOT NULL default '';
 
 ALTER TABLE user MODIFY user_id varchar(32) NOT NULL;
index d2a6c66..b0ba10c 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: mmsmtpd.c,v 1.64 2005/01/31 15:58:10 mmondor Exp $ */
+/* $Id: mmsmtpd.c,v 1.65 2005/02/15 22:30:22 mmondor Exp $ */
 
 /*
  * Copyright (C) 2001-2004, Matthew Mondor
@@ -80,7 +80,7 @@
 
 MMCOPYRIGHT("@(#) Copyright (c) 2001-2004\n\
 \tMatthew Mondor. All rights reserved.\n");
-MMRCSID("$Id: mmsmtpd.c,v 1.64 2005/01/31 15:58:10 mmondor Exp $");
+MMRCSID("$Id: mmsmtpd.c,v 1.65 2005/02/15 22:30:22 mmondor Exp $");
 
 
 
@@ -827,7 +827,7 @@ all_rcpt(clientenv *clenv)
     if (!relay) {
        /* Ensure to observe allow filters if any set for box */
        if (boxinfo.filter) {
-           if (!box_filter_allow(addr, clenv->from)) {
+           if (!box_filter_allow(addr, clenv->from, boxinfo.filter_type)) {
                reason = RCPT_FILTER;
                if (CONF.STATFAIL_FILTER)
                    mmstat(&clenv->pstat, STAT_UPDATE, 1,
@@ -1320,27 +1320,27 @@ best_match(const char *str, const char *pat)
 static bool
 local_address(struct box_info *boxinfo, const char *address)
 {
-    bool res = FALSE;
-    char line[1024];
-    MYSQL_RES *mysqlres;
-    MYSQL_ROW *row;
-    unsigned int fields;
-    unsigned long *lengths;
+    bool               res = FALSE;
+    char               line[1024];
+    MYSQL_RES          *mysqlres;
+    MYSQL_ROW          *row;
+    unsigned int       fields;
+    unsigned long      *lengths;
 
     /* Query mysql to see if this address exists, and get limits/status */
-    snprintf(line, 1023,
-            "SELECT box_max_size,box_size,box_max_msgs,box_msgs,box_filter "
-            "FROM box WHERE box_address='%s'", address);
+    (void) snprintf(line, 1023,
+            "SELECT box_max_size,box_size,box_max_msgs,box_msgs,box_filter,"
+            "box_filter_type FROM box WHERE box_address='%s'", address);
 
     if ((mysqlres = mmsql_query(line, mm_strlen(line))) != NULL) {
 
        if ((mysql_num_rows(mysqlres)) == 1
            && (row = (MYSQL_ROW *)mysql_fetch_row(mysqlres)) != NULL) {
-           if ((fields = mysql_num_fields(mysqlres)) == 5) {
+           if ((fields = mysql_num_fields(mysqlres)) == 6) {
                lengths = mysql_fetch_lengths(mysqlres);
                if (row[0] != NULL && row[1] != NULL && row[2] != NULL &&
-                       row[3] != NULL && row[4] != NULL) {
-                   int v;
+                       row[3] != NULL && row[4] != NULL && row[5] != NULL) {
+                   int v;
 
                    mm_memcpy(line, row[0], lengths[0]);
                    line[lengths[0]] = '\0';
@@ -1357,6 +1357,9 @@ local_address(struct box_info *boxinfo, const char *address)
                    mm_memcpy(line, row[4], lengths[4]);
                    v = atol(line);
                    boxinfo->filter = (v != 0 ? TRUE : FALSE);
+                   mm_memcpy(line, row[5], lengths[5]);
+                   line[lengths[5]] = '\0';
+                   boxinfo->filter_type = *line;
                    res = TRUE;
                } else
                    DEBUG_PRINTF("local_address", "row[x] == NULL");
@@ -1368,38 +1371,44 @@ local_address(struct box_info *boxinfo, const char *address)
     } else
        DEBUG_PRINTF("local_address", "mmsql_query(%s)", line);
 
-    return (res);
+    return res;
 }
 
 
 /* Verifies if mailbox <toaddr> filters allow <fromaddr> to post */
 static bool
-box_filter_allow(const char *toaddr, const char *fromaddr)
+box_filter_allow(const char *toaddr, const char *fromaddr, char filter_type)
 {
-    bool res = FALSE;
-    char query[1024];
-    MYSQL_RES *mysqlres;
+    bool       res = FALSE;
+    char       query[1024];
+    MYSQL_RES  *mysqlres;
 
     snprintf(query, 1023,
            "SELECT filter_allow FROM filter WHERE filter_address='%s'",
            toaddr);
     if ((mysqlres = mmsql_query(query, mm_strlen(query))) != NULL) {
        if ((mysql_num_rows(mysqlres)) > 0) {
-           char pat[64];
-           MYSQL_ROW *row;
-           unsigned long *lengths;
+           char                pat[64];
+           MYSQL_ROW           *row;
+           unsigned long       *lengths;
 
+           /*
+            * Filter types are 'A' (allow by default) and
+            * 'D' (deny by * default).
+            */
+           res = (filter_type == 'A' ? TRUE : FALSE);
            while ((row = (MYSQL_ROW *)mysql_fetch_row(mysqlres)) != NULL) {
                lengths = mysql_fetch_lengths(mysqlres);
                if (row[0] != NULL) {
-                   mm_memcpy(pat, row[0], lengths[0]);
+                   (void) mm_memcpy(pat, row[0], lengths[0]);
                    pat[lengths[0]] = '\0';
                    if (best_match(fromaddr, pat) != -1) {
-                       res = TRUE;
+                       res = (filter_type == 'D' ? TRUE : FALSE);
                        break;
                    }
                }
            }
+
        } else
            DEBUG_PRINTF("box_filter_allow", "mysql_num_rows()");
        mysqlres = mmsql_free_result(mysqlres);
index 5e95150..be3374b 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: mmsmtpd.h,v 1.27 2004/12/03 17:29:56 mmondor Exp $ */
+/* $Id: mmsmtpd.h,v 1.28 2005/02/15 22:30:22 mmondor Exp $ */
 
 /*
  * Copyright (C) 2001-2004, Matthew Mondor
@@ -204,6 +204,7 @@ typedef struct command {
 struct box_info {
     long max_size, size, max_msgs, msgs;
     bool filter;
+    char filter_type;
 };
 
 /* For fast command lookup */
@@ -278,7 +279,7 @@ static bool check_alias(char *);
 static bool check_nofrom(const char *, const char *);
 static int best_match(const char *, const char *);
 static bool local_address(struct box_info *, const char *);
-static bool box_filter_allow(const char *, const char *);
+static bool box_filter_allow(const char *, const char *, char);
 static void rfc_time(char *);
 static bool valid_address(clientenv *, char *, char *, int);
 static bool valid_host(clientenv *, char *, int, bool, bool);