From: adam Date: Thu, 8 Jul 2004 09:11:06 +0000 (+0000) Subject: fix two really bad SMTP protocol bugs X-Git-Url: http://git.megacz.com/?a=commitdiff_plain;h=ecb08e51a1dbd43e1689614317d3966dc4db7354;p=org.ibex.mail.git fix two really bad SMTP protocol bugs darcs-hash:20040708091106-5007d-4b608aeae9306f070224d77956ab28e4939a30c8.gz --- diff --git a/src/org/ibex/mail/protocol/SMTP.java b/src/org/ibex/mail/protocol/SMTP.java index d6e397a..9ebb15a 100644 --- a/src/org/ibex/mail/protocol/SMTP.java +++ b/src/org/ibex/mail/protocol/SMTP.java @@ -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();