fix two really bad SMTP protocol bugs
authoradam <adam@megacz.com>
Thu, 8 Jul 2004 09:11:06 +0000 (09:11 +0000)
committeradam <adam@megacz.com>
Thu, 8 Jul 2004 09:11:06 +0000 (09:11 +0000)
darcs-hash:20040708091106-5007d-4b608aeae9306f070224d77956ab28e4939a30c8.gz

src/org/ibex/mail/protocol/SMTP.java

index d6e397a..9ebb15a 100644 (file)
@@ -30,6 +30,7 @@ public class SMTP {
             Address from = null;
             Vector to = new Vector();
             for(String command = conn.readln(); ; command = conn.readln()) try {
+                if (command == null) return;
                 String c = command.toUpperCase();
                 if (c.startsWith("HELO"))        { conn.println("250 HELO " + conn.vhost); from = null; to = new Vector();
                 } else if (c.startsWith("EHLO")) { conn.println("250");                    from = null; to = new Vector();
@@ -120,7 +121,10 @@ public class SMTP {
             return false;
         }
 
-        private static void check(String s) { if (s.startsWith("4")||s.startsWith("5")) throw new MailException(s); }
+        private static void check(String s, Connection conn) {
+            while (s.charAt(3) == '-') s = conn.readln();
+            if (s.startsWith("4")||s.startsWith("5")) throw new MailException(s);
+        }
         private static boolean attempt(final Message m, final InetAddress mx) {
             boolean accepted = false;
             Connection conn = null;
@@ -129,14 +133,14 @@ public class SMTP {
                 conn = new Connection(new Socket(mx, 25), InetAddress.getLocalHost().getHostName());
                 conn.setTimeout(60 * 1000);
                 Log.info(SMTP.Outgoing.class, "connected");
-                check(conn.readln());  // banner
-                conn.println("HELO " + conn.vhost);            check(conn.readln());
-                conn.println("MAIL FROM: " + m.envelopeFrom.user + "@" + m.envelopeFrom.host);  check(conn.readln());
-                conn.println("RCPT TO: "   + m.envelopeTo.user + "@" + m.envelopeTo.host);      check(conn.readln());
-                conn.println("DATA");                          check(conn.readln());
+                check(conn.readln(), conn);  // banner
+                conn.println("HELO " + conn.vhost);            check(conn.readln(), conn);
+                conn.println("MAIL FROM:<" + m.envelopeFrom.user + "@" + m.envelopeFrom.host+">");  check(conn.readln(), conn);
+                conn.println("RCPT TO:<"   + m.envelopeTo.user + "@" + m.envelopeTo.host+">");      check(conn.readln(), conn);
+                conn.println("DATA");                          check(conn.readln(), conn);
                 conn.println(m.toString());
                 conn.println(".");
-                check(conn.readln());
+                check(conn.readln(), conn);
                 Log.info(SMTP.Outgoing.class, "success: message accepted by " + mx);
                 accepted = true;
                 conn.close();