*** empty log message ***
authorMatthew Mondor <mmondor@pulsar-zone.net>
Wed, 8 Jan 2003 23:03:21 +0000 (23:03 +0000)
committerMatthew Mondor <mmondor@pulsar-zone.net>
Wed, 8 Jan 2003 23:03:21 +0000 (23:03 +0000)
mmsoftware/mmmail/ChangeLog
mmsoftware/mmmail/src/mmsmtpd/mmsmtpd.c
mmsoftware/mmmail/src/mmsmtpd/mmsmtpd.h

index f5acf42..d9a2dcc 100644 (file)
@@ -1,4 +1,4 @@
-$Id: ChangeLog,v 1.8 2003/01/08 20:57:46 mmondor Exp $
+$Id: ChangeLog,v 1.9 2003/01/08 23:03:21 mmondor Exp $
 
 
 
@@ -16,6 +16,11 @@ By     : Matthew Mondor
     and it's behavior changed accordingly, to resolve hostname's A record
     rather than the MX one. It was erroneous to expect SMTP servers to have
     valid MX records.
+  - The check_nofrom() function, used to check for a match within the
+    nofrom database table, would only match on a hostname basis if resolving
+    client hostnames was enabled and the address could resolve successfully.
+    It now will also always check if the IP address also matches no matter
+    what.
 * Important changes
   - When desired, it is important for frontend scripts to be able to generate
     required password hashes. This has not been easy with the previous method,
index 90fc54a..1745a1e 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: mmsmtpd.c,v 1.7 2003/01/08 20:57:46 mmondor Exp $ */
+/* $Id: mmsmtpd.c,v 1.8 2003/01/08 23:03:21 mmondor Exp $ */
 
 /*
  * Copyright (C) 2001-2003, Matthew Mondor
@@ -74,7 +74,7 @@
 
 MMCOPYRIGHT("@(#) Copyright (c) 2002-2003\n\
 \tMatthew Mondor. All rights reserved.\n");
-MMRCSID("$Id: mmsmtpd.c,v 1.7 2003/01/08 20:57:46 mmondor Exp $");
+MMRCSID("$Id: mmsmtpd.c,v 1.8 2003/01/08 23:03:21 mmondor Exp $");
 
 
 
@@ -617,8 +617,7 @@ all_mail(clientenv *clenv)
                /* Some systems use empty MAIL FROM like this, make sure
                 * that IP address or hostname is allowed to do this.
                 */
-               if (clenv->c_hostname) valid = check_nofrom(clenv->c_hostname);
-               else valid = check_nofrom(clenv->c_ipaddr);
+               valid = check_nofrom(clenv->c_ipaddr, clenv->c_hostname);
                if (valid) *addr = 0;
            } else
                valid = valid_address(clenv, addr, clenv->buffer,
@@ -1023,7 +1022,7 @@ WHERE alias_domain='%s'", args[1]);
                    if (row[0] && row[1]) {
                        mm_memcpy(pat, row[0], lengths[0]);
                        pat[lengths[0]] = 0;
-                       if ((cur = alias_match(oaddr, pat)) != -1) {
+                       if ((cur = best_match(oaddr, pat)) != -1) {
                            if (cur > max) {
                                /* Matches better, remember this one */
                                max = cur;
@@ -1053,12 +1052,17 @@ WHERE alias_domain='%s'", args[1]);
 }
 
 
+/* Depending on which is set of <addr> and/or <host>, returns TRUE if any
+ * of both matched an entry.
+ */
 static bool
-check_nofrom(const char *addr)
+check_nofrom(const char *addr, const char *host)
 {
     bool res = FALSE;
     MYSQL_RES *mysqlres;
 
+    if (addr == NULL && host == NULL) return (FALSE);
+
     if ((mysqlres = mmsql_query("SELECT * FROM nofrom", 20)) != NULL) {
        if ((mysql_num_rows(mysqlres)) > 0) {
            int cnt = 0;
@@ -1072,9 +1076,17 @@ check_nofrom(const char *addr)
 
                    mm_memcpy(pat, row[0], lengths[0]);
                    pat[lengths[0]] = 0;
-                   if ((alias_match(addr, pat)) != -1) {
-                       res = TRUE;
-                       break;
+                   if (addr) {
+                       if ((best_match(addr, pat)) != -1) {
+                           res = TRUE;
+                           break;
+                       }
+                   }
+                   if (host) {
+                       if ((best_match(host, pat)) != -1) {
+                           res = TRUE;
+                           break;
+                       }
                    }
                }
                cnt++;
@@ -1097,7 +1109,7 @@ check_nofrom(const char *addr)
  * the best match among a list of patterns.
  */
 static int
-alias_match(const char *str, const char *pat)
+best_match(const char *str, const char *pat)
 {           
     int lit = 0;
 
@@ -1113,7 +1125,7 @@ alias_match(const char *str, const char *pat)
     do {
        register int tmp;
 
-       if ((tmp = alias_match(str, pat + 1)) != -1) return (lit + tmp);
+       if ((tmp = best_match(str, pat + 1)) != -1) return (lit + tmp);
     } while (*str++);
 
     return (-1);
index 3da1b1d..346d86b 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: mmsmtpd.h,v 1.6 2003/01/04 09:31:55 mmondor Exp $ */
+/* $Id: mmsmtpd.h,v 1.7 2003/01/08 23:03:21 mmondor Exp $ */
 
 /*
  * Copyright (C) 2000-2003, Matthew Mondor
@@ -232,8 +232,8 @@ static bool init_clientenv(clientenv *, bool);
 static clientenv *free_clientenv(clientenv *);
 static void empty_rcpts(list *);
 static bool check_alias(char *);
-static bool check_nofrom(const char *);
-static int alias_match(const char *, const char *);
+static bool check_nofrom(const char *, const char *);
+static int best_match(const char *, const char *);
 static bool local_address(const char *, long *, long *, long *, long *);
 static void rfc_time(char *);
 static bool valid_address(clientenv *, char *, char *, int);