summaryrefslogtreecommitdiff
blob: e6aab720418c59a8e5c3d725170cb23c4e292012 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
diff -ur -x '*.*orig' qmail-1.03.orig/qmail-smtpd.c qmail-1.03/qmail-smtpd.c
--- qmail-1.03.orig/qmail-smtpd.c	2003-09-01 21:51:08.000000000 -0700
+++ qmail-1.03/qmail-smtpd.c	2003-09-01 21:52:12.000000000 -0700
@@ -119,6 +119,7 @@
 void err_unimpl() { out("502 unimplemented (#5.5.1)\r\n"); }
 void err_size() { out("552 sorry, that message size exceeds my databytes limit (#5.3.4)\r\n"); }
 void err_syntax() { out("555 syntax error (#5.5.4)\r\n"); }
+void err_relay() { out("553 we don't relay (#5.7.1)\r\n"); }
 void err_wantmail() { out("503 MAIL first (#5.5.1)\r\n"); }
 void err_wantrcpt() { out("503 RCPT first (#5.5.1)\r\n"); }
 void err_noop() { out("250 ok\r\n"); }
@@ -374,6 +375,21 @@
   return r;
 }
 
+int addrrelay()
+{
+  int j;
+  j = addr.len;
+  while(--j >= 0)
+    if (addr.s[j] == '@') break;
+  if (j < 0) j = addr.len;
+  while(--j >= 0) {
+    if (addr.s[j] == '@') return 1;
+    if (addr.s[j] == '%') return 1;
+    if (addr.s[j] == '!') return 1;
+  }
+  return 0;
+}
+
 
 int seenmail = 0;
 int flagbarfbmf; /* defined if seenmail */
@@ -434,6 +450,7 @@
 void smtp_rcpt(arg) char *arg; {
   if (!seenmail) { err_wantmail(); return; }
   if (!addrparse(arg)) { err_syntax(); return; }
+  if (addrrelay()) { err_relay(); return; }
   if ((!flagbarfbmf) && (bmtok)) { flagbarfbmt = bmcheck(BMCHECK_BMT); }
   if (flagbarfbmf) {
     strerr_warn4("qmail-smtpd: badmailfrom: ",mailfrom.s," at ",remoteip,0);