From dbkr at freenetproject.org Sun Feb 4 16:03:01 2007 From: dbkr at freenetproject.org (dbkr at freenetproject.org) Date: Sun, 4 Feb 2007 16:03:01 +0000 (UTC) Subject: [Freemail] r11669 - trunk/apps/Freemail/src/freemail Message-ID: <20070204160301.544A420AFA7@emu.freenetproject.org> Author: dbkr Date: 2007-02-04 16:03:00 +0000 (Sun, 04 Feb 2007) New Revision: 11669 Modified: trunk/apps/Freemail/src/freemail/RTSFetcher.java Log: Resolve #1080 (unprocessed rts files are stored with a colon in the path). Modified: trunk/apps/Freemail/src/freemail/RTSFetcher.java =================================================================== --- trunk/apps/Freemail/src/freemail/RTSFetcher.java 2007-02-04 14:41:35 UTC (rev 11668) +++ trunk/apps/Freemail/src/freemail/RTSFetcher.java 2007-02-04 16:03:00 UTC (rev 11669) @@ -103,7 +103,7 @@ System.out.println("Maximum attempts at handling RTS reached - deleting RTS"); files[i].delete(); } else { - File newname = new File(this.contact_dir, RTS_UNPROC_PREFIX + ":" + tries); + File newname = new File(this.contact_dir, parts[0] + "," + tries); files[i].renameTo(newname); } } From dbkr at freenetproject.org Sun Feb 4 16:03:30 2007 From: dbkr at freenetproject.org (dbkr at freenetproject.org) Date: Sun, 4 Feb 2007 16:03:30 +0000 (UTC) Subject: [Freemail] r11670 - trunk/apps/Freemail/src/freemail Message-ID: <20070204160330.B42F420AFA7@emu.freenetproject.org> Author: dbkr Date: 2007-02-04 16:03:30 +0000 (Sun, 04 Feb 2007) New Revision: 11670 Modified: trunk/apps/Freemail/src/freemail/SlotManager.java Log: Trivial: Typo in comment. Modified: trunk/apps/Freemail/src/freemail/SlotManager.java =================================================================== --- trunk/apps/Freemail/src/freemail/SlotManager.java 2007-02-04 16:03:00 UTC (rev 11669) +++ trunk/apps/Freemail/src/freemail/SlotManager.java 2007-02-04 16:03:30 UTC (rev 11670) @@ -28,7 +28,7 @@ * ones still need to be checked, which ones are used and which have expired. */ public abstract class SlotManager { - // how long we should keep checking a slot for which a successibe slot has + // how long we should keep checking a slot for which a successive slot has // had a message retrieved on private static final long SLOT_LIFETIME = 7 * 24 * 60 * 60 * 1000; private static final int DEFAULT_POLL_AHEAD = 3; From dbkr at freenetproject.org Sun Feb 4 16:22:49 2007 From: dbkr at freenetproject.org (dbkr at freenetproject.org) Date: Sun, 4 Feb 2007 16:22:49 +0000 (UTC) Subject: [Freemail] r11671 - trunk/apps/Freemail/src/freemail Message-ID: <20070204162249.E46C69BBFF@emu.freenetproject.org> Author: dbkr Date: 2007-02-04 16:22:49 +0000 (Sun, 04 Feb 2007) New Revision: 11671 Modified: trunk/apps/Freemail/src/freemail/RTSFetcher.java Log: Resolve #1081 (RTSFetcher.handle_rts fails to delete tmp files in some cases) Modified: trunk/apps/Freemail/src/freemail/RTSFetcher.java =================================================================== --- trunk/apps/Freemail/src/freemail/RTSFetcher.java 2007-02-04 16:03:30 UTC (rev 11670) +++ trunk/apps/Freemail/src/freemail/RTSFetcher.java 2007-02-04 16:22:49 UTC (rev 11671) @@ -304,6 +304,7 @@ File msfile = fcpcli.fetch(their_mailsite); if (msfile == null) { // oh well, try again in a bit + rtsfile.delete(); return false; } @@ -367,6 +368,8 @@ try { mailsite_furi = new FreenetURI(our_mailsite_keybody); } catch (MalformedURLException mfe) { + msfile.delete(); + rtsfile.delete(); return false; } String our_subdomain = Base32.encode(mailsite_furi.getKeyBody().getBytes()); From dbkr at freenetproject.org Sun Feb 4 16:34:02 2007 From: dbkr at freenetproject.org (dbkr at freenetproject.org) Date: Sun, 4 Feb 2007 16:34:02 +0000 (UTC) Subject: [Freemail] r11672 - trunk/apps/Freemail/src/freemail/imap Message-ID: <20070204163402.E996220B244@emu.freenetproject.org> Author: dbkr Date: 2007-02-04 16:34:02 +0000 (Sun, 04 Feb 2007) New Revision: 11672 Modified: trunk/apps/Freemail/src/freemail/imap/IMAPHandler.java Log: Resolve #1088 (imap function login causes NPE without arguments) and same for other imap commands. Modified: trunk/apps/Freemail/src/freemail/imap/IMAPHandler.java =================================================================== --- trunk/apps/Freemail/src/freemail/imap/IMAPHandler.java 2007-02-04 16:22:49 UTC (rev 11671) +++ trunk/apps/Freemail/src/freemail/imap/IMAPHandler.java 2007-02-04 16:34:02 UTC (rev 11672) @@ -128,7 +128,11 @@ } private void handle_login(IMAPMessage msg) { - if (msg.args.length < 2) return; + if (msg.args == null || msg.args.length < 2) { + this.reply(msg, "BAD Not enough arguments"); + return; + } + if (AccountManager.authenticate(trimQuotes(msg.args[0]), trimQuotes(msg.args[1]))) { this.inbox = new MessageBank(trimQuotes(msg.args[0])); @@ -165,10 +169,10 @@ return; } - if (msg.args.length < 1) { + if (msg.args != null && msg.args.length < 1) { refname = null; mbname = null; - } else if (msg.args.length < 2) { + } else if (msg.args != null && msg.args.length < 2) { refname = msg.args[0]; mbname = null; } else { @@ -251,7 +255,7 @@ return; } - if (msg.args.length < 1) { + if (msg.args == null || msg.args.length < 1) { this.reply(msg, "NO What mailbox?"); return; } @@ -698,7 +702,7 @@ } public void handle_store(IMAPMessage msg) { - if (msg.args.length < 2) { + if (msg.args == null || msg.args.length < 2) { this.reply(msg, "BAD Not enough arguments"); return; } @@ -859,7 +863,7 @@ return; } - if (msg.args.length < 2) { + if (msg.args == null || msg.args.length < 2) { this.reply(msg, "BAD Not enough arguments"); return; } @@ -932,7 +936,7 @@ return; } - if (msg.args.length < 1) { + if (msg.args == null || msg.args.length < 1) { this.reply(msg, "NO Not enough arguments"); return; } @@ -978,7 +982,7 @@ return; } - if (msg.args.length < 1) { + if (msg.args == null || msg.args.length < 1) { this.reply(msg, "NO Not enough arguments"); return; } @@ -1012,7 +1016,7 @@ return; } - if (msg.args.length < 2) { + if (msg.args == null || msg.args.length < 2) { this.reply(msg, "NO Not enough arguments"); return; } @@ -1068,7 +1072,7 @@ } private void handle_append(IMAPMessage msg) { - if (msg.args.length < 3) { + if (msg.args == null || msg.args.length < 3) { this.reply(msg, "NO Not enough arguments"); return; } From dbkr at freenetproject.org Sun Feb 4 16:42:57 2007 From: dbkr at freenetproject.org (dbkr at freenetproject.org) Date: Sun, 4 Feb 2007 16:42:57 +0000 (UTC) Subject: [Freemail] r11673 - trunk/apps/Freemail/src/freemail Message-ID: <20070204164257.2A7A720B245@emu.freenetproject.org> Author: dbkr Date: 2007-02-04 16:42:56 +0000 (Sun, 04 Feb 2007) New Revision: 11673 Modified: trunk/apps/Freemail/src/freemail/SlotManager.java Log: Resolve #1087 (Slot props file format error leads to mail fetcher thread exception), and almost certainly the dreaded #844 ( Short SHA-256 sum causes ArrayIndexOutOfBoundsException)! Hooray! Modified: trunk/apps/Freemail/src/freemail/SlotManager.java =================================================================== --- trunk/apps/Freemail/src/freemail/SlotManager.java 2007-02-04 16:34:02 UTC (rev 11672) +++ trunk/apps/Freemail/src/freemail/SlotManager.java 2007-02-04 16:42:56 UTC (rev 11673) @@ -122,7 +122,7 @@ Slot s = (Slot)e.nextElement(); buf.append(s.slot); if (s.time_added > 0) - buf.append(",").append(Long.toString(s.time_added)); + buf.append("=").append(Long.toString(s.time_added)); } this.cb.saveSlots(buf.toString(), this.userdata); } From dbkr at freenetproject.org Sun Feb 4 16:53:49 2007 From: dbkr at freenetproject.org (dbkr at freenetproject.org) Date: Sun, 4 Feb 2007 16:53:49 +0000 (UTC) Subject: [Freemail] r11674 - trunk/apps/Freemail/src/freemail/imap Message-ID: <20070204165349.D13229BBE4@emu.freenetproject.org> Author: dbkr Date: 2007-02-04 16:53:47 +0000 (Sun, 04 Feb 2007) New Revision: 11674 Modified: trunk/apps/Freemail/src/freemail/imap/IMAPHandler.java Log: Add debugging to try and catch #1090 (Accessing Freemail with Thunderbird gives error Bad Number). Modified: trunk/apps/Freemail/src/freemail/imap/IMAPHandler.java =================================================================== --- trunk/apps/Freemail/src/freemail/imap/IMAPHandler.java 2007-02-04 16:42:56 UTC (rev 11673) +++ trunk/apps/Freemail/src/freemail/imap/IMAPHandler.java 2007-02-04 16:53:47 UTC (rev 11674) @@ -337,7 +337,7 @@ try { from = Integer.parseInt(parts[0]); } catch (NumberFormatException nfe) { - this.reply(msg, "BAD Bad number"); + this.reply(msg, "BAD Bad number: "+parts[0]+". Please report this error!"); return; } if (parts.length < 2) { @@ -348,7 +348,7 @@ try { to = Integer.parseInt(parts[1]); } catch (NumberFormatException nfe) { - this.reply(msg, "BAD Bad number"); + this.reply(msg, "BAD Bad number: "+parts[0]+". Please report this error!"); return; } } @@ -411,7 +411,7 @@ try { from = Integer.parseInt(parts[0]); } catch (NumberFormatException nfe) { - this.reply(msg, "BAD Bad number"); + this.reply(msg, "BAD Bad number: "+parts[0]+". Please report this error!"); return; } if (parts.length < 2) { @@ -423,7 +423,7 @@ try { to = Integer.parseInt(parts[1]); } catch (NumberFormatException nfe) { - this.reply(msg, "BAD Bad number"); + this.reply(msg, "BAD Bad number: "+parts[0]+". Please report this error!"); return; } } From dbkr at freenetproject.org Sun Feb 4 17:05:10 2007 From: dbkr at freenetproject.org (dbkr at freenetproject.org) Date: Sun, 4 Feb 2007 17:05:10 +0000 (UTC) Subject: [Freemail] r11676 - trunk/apps/Freemail/src/freemail Message-ID: <20070204170510.A98459BC1E@emu.freenetproject.org> Author: dbkr Date: 2007-02-04 17:05:08 +0000 (Sun, 04 Feb 2007) New Revision: 11676 Modified: trunk/apps/Freemail/src/freemail/Freemail.java Log: Help text was wrong. Modified: trunk/apps/Freemail/src/freemail/Freemail.java =================================================================== --- trunk/apps/Freemail/src/freemail/Freemail.java 2007-02-04 17:03:08 UTC (rev 11675) +++ trunk/apps/Freemail/src/freemail/Freemail.java 2007-02-04 17:05:08 UTC (rev 11676) @@ -126,7 +126,7 @@ AccountManager.Create(account); // by default, we'll not setup NIM now real mode works //AccountManager.setupNIM(account); - System.out.println("Account created for "+account+". You may now set a password with --passwd "); + System.out.println("Account created for "+account+". You may now set a password with --passwd "); //System.out.println("For the time being, you address is "+account+"@nim.freemail"); } catch (IOException ioe) { System.out.println("Couldn't create account. Please check write access to Freemail's working directory. If you want to overwrite your account, delete the appropriate directory manually in 'data' first. Freemail will intentionally not overwrite it. Error: "+ioe.getMessage()); From dbkr at freenetproject.org Sun Feb 4 18:33:02 2007 From: dbkr at freenetproject.org (Dave Baker) Date: Sun, 4 Feb 2007 18:33:02 +0000 Subject: [Freemail] Freemail Updates Message-ID: <200702041833.02864.dbkr@freenetproject.org> Hi, This afternoon I've found some time to look at Freemail, and found there were some bug waiting for me in Mantis. I've now fixed, or at least added debugging to trap, these bugs. This has almost certainly fixed the evil bug that mangled the mail slots and caused exceptions. I think this should have fixed a number of bugs, so I'd like to ask you all to please test the current version of Freemail (from http://downloads.freenetproject.org/alpha/Freemail/Freemail.jar or current SVN). I'd like to release a new version some time soon, although I'd like to make sure it's as bug-free as possible. My address is still dbkr at dbkr.freemail, so any mails in that direction would be welcome for testing. Thanks! Dave From dbkr at freenetproject.org Mon Feb 12 22:19:31 2007 From: dbkr at freenetproject.org (dbkr at freenetproject.org) Date: Mon, 12 Feb 2007 22:19:31 +0000 (UTC) Subject: [Freemail] r11765 - trunk/apps/Freemail/src/freemail/utils Message-ID: <20070212221931.A9E7B9BB7C@emu.freenetproject.org> Author: dbkr Date: 2007-02-12 22:19:30 +0000 (Mon, 12 Feb 2007) New Revision: 11765 Modified: trunk/apps/Freemail/src/freemail/utils/DateStringFactory.java Log: After a lengthy battle with Java's Date classes, I gather it's necessary to set the TimeZone on the SimpleDateFormat rather than just the Calendar. Modified: trunk/apps/Freemail/src/freemail/utils/DateStringFactory.java =================================================================== --- trunk/apps/Freemail/src/freemail/utils/DateStringFactory.java 2007-02-12 20:45:43 UTC (rev 11764) +++ trunk/apps/Freemail/src/freemail/utils/DateStringFactory.java 2007-02-12 22:19:30 UTC (rev 11765) @@ -32,6 +32,10 @@ private static final Calendar cal = Calendar.getInstance(gmt); private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); + { + sdf.setTimeZone(gmt); + } + public static String getKeyString() { return getOffsetKeyString(0); } From dbkr at freenetproject.org Wed Feb 14 21:18:08 2007 From: dbkr at freenetproject.org (dbkr at freenetproject.org) Date: Wed, 14 Feb 2007 21:18:08 +0000 (UTC) Subject: [Freemail] r11793 - trunk/apps/Freemail Message-ID: <20070214211808.9BEC49BBB9@emu.freenetproject.org> Author: dbkr Date: 2007-02-14 21:18:05 +0000 (Wed, 14 Feb 2007) New Revision: 11793 Modified: trunk/apps/Freemail/ Log: Add build, lib and deps dirs to svn:ignore. Property changes on: trunk/apps/Freemail ___________________________________________________________________ Name: svn:ignore + build lib deps From dbkr at freenetproject.org Thu Feb 15 21:33:55 2007 From: dbkr at freenetproject.org (dbkr at freenetproject.org) Date: Thu, 15 Feb 2007 21:33:55 +0000 (UTC) Subject: [Freemail] r11804 - trunk/apps/Freemail/src/freemail/utils Message-ID: <20070215213355.94B689BBB9@emu.freenetproject.org> Author: dbkr Date: 2007-02-15 21:33:54 +0000 (Thu, 15 Feb 2007) New Revision: 11804 Modified: trunk/apps/Freemail/src/freemail/utils/DateStringFactory.java Log: Static initialiser block was what I wanted. Modified: trunk/apps/Freemail/src/freemail/utils/DateStringFactory.java =================================================================== --- trunk/apps/Freemail/src/freemail/utils/DateStringFactory.java 2007-02-15 19:40:47 UTC (rev 11803) +++ trunk/apps/Freemail/src/freemail/utils/DateStringFactory.java 2007-02-15 21:33:54 UTC (rev 11804) @@ -32,7 +32,7 @@ private static final Calendar cal = Calendar.getInstance(gmt); private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); - { + static { sdf.setTimeZone(gmt); } From dbkr at freenetproject.org Thu Feb 15 23:06:26 2007 From: dbkr at freenetproject.org (dbkr at freenetproject.org) Date: Thu, 15 Feb 2007 23:06:26 +0000 (UTC) Subject: [Freemail] r11805 - trunk/apps/Freemail/src/freemail Message-ID: <20070215230626.0CCF09BBB8@emu.freenetproject.org> Author: dbkr Date: 2007-02-15 23:06:25 +0000 (Thu, 15 Feb 2007) New Revision: 11805 Added: trunk/apps/Freemail/src/freemail/MailHeaderFilter.java Modified: trunk/apps/Freemail/src/freemail/OutboundContact.java Log: Filter the headers on the mail we send to remove the user agent and the timezone we're in. Added: trunk/apps/Freemail/src/freemail/MailHeaderFilter.java =================================================================== --- trunk/apps/Freemail/src/freemail/MailHeaderFilter.java (rev 0) +++ trunk/apps/Freemail/src/freemail/MailHeaderFilter.java 2007-02-15 23:06:25 UTC (rev 11805) @@ -0,0 +1,139 @@ +/* + * MailHeaderFilter.java + * This file is part of Freemail, copyright (C) 2006 Dave Baker + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + * USA + * + */ + +/* + * MailHeaderFilter - A class to parse an Email message line by line + * and strip out information we'd rather not send + */ + +package freemail; + +import java.io.BufferedReader; +import java.io.IOException; +import java.lang.StringBuffer; +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.TimeZone; +import java.util.Calendar; +import java.text.ParseException; + +class MailHeaderFilter { + private final BufferedReader reader; + private final StringBuffer buffer; + private boolean foundEnd; + private static final SimpleDateFormat sdf; + private static final TimeZone gmt; + private static final Calendar cal; + + static { + sdf = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z"); + gmt = TimeZone.getTimeZone("GMT"); + cal = Calendar.getInstance(gmt); + } + + public MailHeaderFilter(BufferedReader rdr) { + this.reader = rdr; + this.buffer = new StringBuffer(); + this.foundEnd = false; + } + + public String readHeader() throws IOException { + String retval = null; + + while (retval == null) { + if (this.foundEnd) { + return this.flush(); + } + + String line = this.reader.readLine(); + if (line == null) { + System.out.println("Warning - reached end of message file before reaching end of headers! This shouldn't happen!"); + throw new IOException("Header filter reached end of message file before reaching end of headers"); + } + + if (line.length() == 0) { + // end of the headers + this.foundEnd = true; + retval = this.flush(); + } else if (line.startsWith(" ") || line.startsWith("\t")) { + // continuation of the previous header + this.buffer.append("\r\n"+line.trim()); + } else { + retval = this.flush(); + this.buffer.append(line); + } + } + return retval; + } + + // this is called once a header is in the buffer + // if the header is invalid or filtered out entirely, + // return null. Otherwise return the filtered header. + private String flush() { + if (this.buffer.length() == 0) return null; + + String[] bits = this.buffer.toString().split(": ", 2); + this.buffer.delete(0, this.buffer.length()); + + // invalid header - ditch it. + if (bits.length < 2) return null; + + bits[1] = this.filterHeader(bits[0], bits[1]); + if (bits[1] == null) return null; + + return bits[0]+": "+bits[1]; + } + + private String filterHeader(String name, String val) { + // simple blacklist filter for now + // a whitelist filter is probably excessive + if (name.equalsIgnoreCase("Date")) { + // the norm is to put the sender's local time here, with the sender's local time offset + // at the end. Rather than giving away what time zone we're in, parse the date in + // and return it as a GMT time. + + Date d = null; + try { + d = sdf.parse(val); + } catch (ParseException pe) { + // ...the compiler whinges unless we catch this exception... + System.out.println("Warning: couldn't parse date: "+val+" (caught exception)"); + return null; + } + // but the docs don't say that it throws it, but says that it return null + // http://java.sun.com/j2se/1.5.0/docs/api/java/text/SimpleDateFormat.html#parse(java.lang.String, java.text.ParsePosition) + if (d == null) { + // invalid date - ditch the header + System.out.println("Warning: couldn't parse date: "+val+" (got null)"); + return null; + } + cal.setTime(d); + cal.setTimeZone(gmt); + return sdf.format(cal.getTime()); + } else if (name.equalsIgnoreCase("User-Agent")) { + // might as well hide this + return null; + } else { + return val; + } + } +} Modified: trunk/apps/Freemail/src/freemail/OutboundContact.java =================================================================== --- trunk/apps/Freemail/src/freemail/OutboundContact.java 2007-02-15 21:33:54 UTC (rev 11804) +++ trunk/apps/Freemail/src/freemail/OutboundContact.java 2007-02-15 23:06:25 UTC (rev 11805) @@ -32,6 +32,7 @@ import java.net.MalformedURLException; import java.math.BigInteger; import java.security.SecureRandom; +import java.io.PrintWriter; import freemail.utils.EmailAddress; import freemail.utils.PropsFile; @@ -513,30 +514,35 @@ QueuedMessage qm = new QueuedMessage(uid); File msg; - FileOutputStream fos; + PrintWriter pw; try { msg = File.createTempFile("ogm", "msg", Freemail.getTempDir()); - fos = new FileOutputStream(msg); + pw = new PrintWriter(new FileOutputStream(msg)); } catch (IOException ioe) { System.out.println("IO Error encountered whilst trying to send message: "+ioe.getMessage()+" Will try again soon"); return false; } - FileInputStream fis; try { - fos.write(new String("id="+uid+"\r\n\r\n").getBytes()); - - fis = new FileInputStream(body); + pw.print("id="+uid+"\r\n\r\n"); - byte[] buf = new byte[1024]; - int read; - while ( (read = fis.read(buf)) > 0) { - fos.write(buf, 0, read); + BufferedReader br = new BufferedReader(new FileReader(body)); + MailHeaderFilter filter = new MailHeaderFilter(br); + + String chunk; + while ( (chunk = filter.readHeader()) != null ) { + pw.print(chunk+"\r\n"); } + pw.print("\r\n"); - fis.close(); - fos.close(); + // Headers are done, copy the rest + while ( (chunk = br.readLine()) != null ) { + pw.print(chunk+"\r\n"); + } + + pw.close(); + br.close(); } catch (IOException ioe) { System.out.println("IO Error encountered whilst trying to send message: "+ioe.getMessage()+" Will try again soon"); qm.delete();