X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fibex%2Fmail%2FMessage.java;h=9d91a18304ee32fae234e3f434fb147bf4619229;hb=31f6bfd3b57924e8c3d506592132e91e73145462;hp=b4db07e5dbcabb933edebf738f825df52ba3c474;hpb=73aabb0888eea91734fc408f8fbaf1e88a52fe13;p=org.ibex.mail.git diff --git a/src/org/ibex/mail/Message.java b/src/org/ibex/mail/Message.java index b4db07e..9d91a18 100644 --- a/src/org/ibex/mail/Message.java +++ b/src/org/ibex/mail/Message.java @@ -13,8 +13,9 @@ import java.util.*; import java.net.*; import java.io.*; -// FIXME: messages must NEVER contain 8-bit binary data; this is a violation of IMAP -// FIXME: RFC822 1,000-char limit per line [soft line limit (suggested): 78 chars / hard line limit: 998 chars] +// FIXME: body constraints (how to enforce?) +// - messages must NEVER contain 8-bit binary data; this is a violation of IMAP +// - RFC822 1,000-char limit per line [soft line limit (suggested): 78 chars / hard line limit: 998 chars] // FEATURE: PGP-signature-parsing // FEATURE: mailing list header parsing (?) @@ -43,12 +44,13 @@ public class Message extends MIME.Part { public static Message newMessage(Fountain in) throws Malformed { return new Message(in); } + /* public Message reply(Fountain in, Address from, boolean includeReInSubject) throws Malformed { - /* Address to = null; if (to==null) to = Address.parse(headers.get("reply-to")); if (to==null) to = Address.parse(headers.get("from")); if (to==null) to = envelopeFrom; + if (to==null) throw new Malformed("cannot reply to a message without a return address"); Message ret = newMessage(in, from, to); ret.headers.put("In-Reply-To", messageid); String references = headers.get("references"); @@ -56,10 +58,8 @@ public class Message extends MIME.Part { if (includeReInSubject && subject!=null && !subject.toLowerCase().trim().startsWith("re:")) headers.put("subject", "Re: "+subject); return ret; - */ - // FIXME - return null; } + */ // FIXME //public static Message newMessage(Headers headers, Fountain body, Address from, Address to) throws Malformed { @@ -90,6 +90,7 @@ public class Message extends MIME.Part { private Message(Fountain in) throws Malformed { super(in); + this.envelopeTo = headers.get("Envelope-To") != null ? Address.parse(headers.get("Envelope-To")) : null; this.envelopeFrom = headers.get("Return-Path") != null ? Address.parse(headers.get("Return-Path")) : null; this.to = headers.get("To") != null ? Address.parse(headers.get("To")) : this.envelopeTo; @@ -101,8 +102,9 @@ public class Message extends MIME.Part { this.bcc = Address.list(headers.get("Bcc")); this.date = parseDate(headers.get("Date")) == null ? new Date() : parseDate(headers.get("Date")); - if (this.messageid==null) - throw new RuntimeException("every RFC2822 message must have a Message-ID: header"); + // reenable this once whitelisting is moved out of javascript + //if (this.messageid==null) + //throw new RuntimeException("every RFC2822 message must have a Message-ID: header"); /* // synthesize a message-id if not provided @@ -131,17 +133,20 @@ public class Message extends MIME.Part { } */ + // Helpers ///////////////////////////////////////////////////////////////////////////// // http://www.jwz.org/doc/mid.html private static final Random random = new Random(); public static String generateFreshMessageId() { + return generateFreshMessageId(Base36.encode(System.currentTimeMillis())+'.'+ + Base36.encode(random.nextLong())); + } + public static String generateFreshMessageId(String seed) { StringBuffer ret = new StringBuffer(); ret.append('<'); - ret.append(Base36.encode(System.currentTimeMillis())); - ret.append('.'); - ret.append(Base36.encode(random.nextLong())); - ret.append('.'); + ret.append(seed); + ret.append('@'); try { ret.append(InetAddress.getLocalHost().getHostName()); } catch (UnknownHostException e) { /* DELIBERATE */ } ret.append('>'); return ret.toString(); @@ -158,8 +163,7 @@ public class Message extends MIME.Part { if (envelopeFrom==null || envelopeFrom.toString().equals("")) return null; Log.warn(Message.class, "bouncing message due to: " + reason); - Headers h = new Headers.Original(headers.getStream()); - h = h.set(new String[] { + Headers h = new Headers(headers, new String[] { "Envelope-To", envelopeFrom.toString(), "Return-Path", "<>", "From", "MAILER-DAEMON <>", @@ -168,6 +172,7 @@ public class Message extends MIME.Part { }); String error = + "\r\n"+ "Hi. This is the Ibex Mail Server. I'm afraid I wasn't able to deliver\r\n"+ "your message to the following addresses. This is a permanent error;\r\n"+ "I've given up. Sorry it didn't work out\r\n."+ @@ -179,7 +184,7 @@ public class Message extends MIME.Part { "\r\n"; try { - return newMessage(new Fountain.Concatenate(new Fountain.StringFountain(h.getString()+"\r\n"+error), getBody())); + return newMessage(Fountain.Util.concat(h, Fountain.Util.create(error), getBody())); } catch (Message.Malformed e) { Log.error(this, "caught Message.Malformed in Message.bounce(); this should never happen"); Log.error(this, e);