Author: dbkr
Date: 2006-08-03 23:47:12 +0000 (Thu, 03 Aug 2006)
New Revision: 9875
Modified:
trunk/apps/Freemail/src/freemail/AccountManager.java
trunk/apps/Freemail/src/freemail/Freemail.java
trunk/apps/Freemail/src/freemail/InboundContact.java
trunk/apps/Freemail/src/freemail/MailMessage.java
trunk/apps/Freemail/src/freemail/Postman.java
trunk/apps/Freemail/src/freemail/RTSFetcher.java
trunk/apps/Freemail/src/freemail/utils/EmailAddress.java
Log:
'From' checking
Modified: trunk/apps/Freemail/src/freemail/AccountManager.java
===================================================================
--- trunk/apps/Freemail/src/freemail/AccountManager.java 2006-08-03
21:37:33 UTC (rev 9874)
+++ trunk/apps/Freemail/src/freemail/AccountManager.java 2006-08-03
23:47:12 UTC (rev 9875)
@@ -37,7 +37,7 @@
private static final int ASYM_KEY_CERTAINTY = 80;
public static final String MAILSITE_SUFFIX = "mailsite";
- public static final String MAILSITE_VERSION = "1";
+ public static final String MAILSITE_VERSION = "-1";
public static void Create(String username) throws IOException {
Modified: trunk/apps/Freemail/src/freemail/Freemail.java
===================================================================
--- trunk/apps/Freemail/src/freemail/Freemail.java 2006-08-03 21:37:33 UTC
(rev 9874)
+++ trunk/apps/Freemail/src/freemail/Freemail.java 2006-08-03 23:47:12 UTC
(rev 9875)
@@ -118,7 +118,7 @@
e.printStackTrace();
return;
}
- System.out.println("Your short Freemail address is:
'anything"+alias+".freemail'. Your long address will continue to work.");
+ System.out.println("Your short Freemail address is:
'anything@"+alias+".freemail'. Your long address will continue to work.");
return;
}
Modified: trunk/apps/Freemail/src/freemail/InboundContact.java
===================================================================
--- trunk/apps/Freemail/src/freemail/InboundContact.java 2006-08-03
21:37:33 UTC (rev 9874)
+++ trunk/apps/Freemail/src/freemail/InboundContact.java 2006-08-03
23:47:12 UTC (rev 9875)
@@ -7,11 +7,15 @@
import java.io.PrintStream;
import java.io.IOException;
import java.io.FileNotFoundException;
+import java.net.MalformedURLException;
import freemail.FreenetURI;
import freemail.utils.PropsFile;
+import freemail.utils.EmailAddress;
import freemail.fcp.HighLevelFCPClient;
+import org.archive.util.Base32;
+
public class InboundContact extends Postman implements SlotSaveCallback {
private static final String IBCT_PROPSFILE = "props";
// how many slots should we poll past the last occupied one?
@@ -137,6 +141,47 @@
this.ibct_props.put("slots", s);
}
+ public boolean validateFrom(EmailAddress from) throws IOException {
+ String sd = from.getSubDomain();
+
+ if (from.is_ssk_address()) {
+ return
Base32.encode(this.ibct_dir.getName().getBytes()).equalsIgnoreCase(sd);
+ } else {
+ // try to fetch that KSK redirect address
+ HighLevelFCPClient cli = new HighLevelFCPClient();
+
+ // quick sanity check
+ if (sd.indexOf("\r") > 0 || sd.indexOf("\n") > 0)
return false;
+
+ File result =
cli.fetch("KSK@"+sd+MailSite.ALIAS_SUFFIX);
+
+ if (result == null) {
+ // we just received the message so we can
assume our
+ // network connection is healthy, and the
mailsite
+ // ought to be easily retrievable, so fail.
+ // If this proves to be an issue, change it.
+ return false;
+ }
+ if (result.length() > 512) {
+ result.delete();
+ return false;
+ }
+ BufferedReader br = new BufferedReader(new
FileReader(result));
+
+ String line = br.readLine();
+ br.close();
+ result.delete();
+ FreenetURI furi;
+ try {
+ furi = new FreenetURI(line);
+ } catch (MalformedURLException mfue) {
+ return false;
+ }
+ return
this.ibct_dir.getName().equals(furi.getKeyBody());
+ }
+ }
+
+
private class MessageLog {
private static final String LOGFILE = "log";
private final File logfile;
Modified: trunk/apps/Freemail/src/freemail/MailMessage.java
===================================================================
--- trunk/apps/Freemail/src/freemail/MailMessage.java 2006-08-03 21:37:33 UTC
(rev 9874)
+++ trunk/apps/Freemail/src/freemail/MailMessage.java 2006-08-03 23:47:12 UTC
(rev 9875)
@@ -78,6 +78,45 @@
return buf.toString();
}
+ public String[] getHeadersAsArray(String name) {
+ Vector hdrs = new Vector();
+
+ Enumeration e = this.headers.elements();
+
+ while (e.hasMoreElements()) {
+ MailMessageHeader h = (MailMessageHeader)
e.nextElement();
+
+ if (h.name.equalsIgnoreCase(name)) {
+ hdrs.add(h.val);
+ }
+ }
+
+ String[] retval = new String[hdrs.size()];
+
+ e = hdrs.elements();
+
+ int i = 0;
+ while (e.hasMoreElements()) {
+ retval[i] = (String)e.nextElement();
+ i++;
+ }
+
+ return retval;
+ }
+
+ public void removeHeader(String name, String val) {
+ int i;
+
+ for (i = 0; i < this.headers.size(); i++) {
+ MailMessageHeader h = (MailMessageHeader)
this.headers.elementAt(i);
+
+ if (h.name.equalsIgnoreCase(name) &&
h.val.equalsIgnoreCase(val)) {
+ this.headers.remove(i);
+ i--;
+ }
+ }
+ }
+
public PrintStream writeHeadersAndGetStream() throws
FileNotFoundException {
this.os = new FileOutputStream(this.file);
this.ps = new PrintStream(this.os);
Modified: trunk/apps/Freemail/src/freemail/Postman.java
===================================================================
--- trunk/apps/Freemail/src/freemail/Postman.java 2006-08-03 21:37:33 UTC
(rev 9874)
+++ trunk/apps/Freemail/src/freemail/Postman.java 2006-08-03 23:47:12 UTC
(rev 9875)
@@ -9,6 +9,8 @@
import java.io.PrintStream;
import java.io.IOException;
+import freemail.utils.EmailAddress;
+
/** A postman is any class that delivers mail to an inbox. Simple,
* if not politically correct.
*/
@@ -26,6 +28,20 @@
newmsg.readHeaders(brdr);
+ // validate the from header - or headers. There could be
several.
+ String[] froms = newmsg.getHeadersAsArray("From");
+
+ int i;
+ for (i = 0; i < froms.length; i++) {
+ EmailAddress addr = new EmailAddress(froms[i]);
+
+ if (!this.validateFrom(addr)) {
+ newmsg.removeHeader("From", froms[i]);
+ newmsg.addHeader("From", "**SPOOFED!**
"+froms[i]);
+ }
+ }
+
+
PrintStream ps = newmsg.writeHeadersAndGetStream();
String line;
@@ -136,4 +152,9 @@
}
return null;
}
+
+ public boolean validateFrom(EmailAddress from) throws IOException {
+ // override me!
+ return true;
+ }
}
Modified: trunk/apps/Freemail/src/freemail/RTSFetcher.java
===================================================================
--- trunk/apps/Freemail/src/freemail/RTSFetcher.java 2006-08-03 21:37:33 UTC
(rev 9874)
+++ trunk/apps/Freemail/src/freemail/RTSFetcher.java 2006-08-03 23:47:12 UTC
(rev 9875)
@@ -31,6 +31,8 @@
import freenet.support.io.LineReadingInputStream;
import freenet.support.io.TooLongException;
+import org.archive.util.Base32;
+
public class RTSFetcher implements SlotSaveCallback {
private String rtskey;
private File contact_dir;
@@ -339,8 +341,15 @@
}
String our_domain_alias = this.accprops.get("domain_alias");
+ FreenetURI mailsite_furi;
+ try {
+ mailsite_furi = new FreenetURI(our_mailsite_keybody);
+ } catch (MalformedURLException mfe) {
+ return false;
+ }
+ String our_subdomain =
Base32.encode(mailsite_furi.getKeyBody().getBytes());
- if (!rtsprops.get("to").equals(our_mailsite_keybody) &&
our_domain_alias != null && !rtsprops.get("to").equals(our_domain_alias)) {
+ if (!rtsprops.get("to").equalsIgnoreCase(our_subdomain) &&
our_domain_alias != null && !rtsprops.get("to").equals(our_domain_alias)) {
System.out.println("Recieved an RTS message that was
not intended for the recipient. Discarding.");
msfile.delete();
rtsfile.delete();
Modified: trunk/apps/Freemail/src/freemail/utils/EmailAddress.java
===================================================================
--- trunk/apps/Freemail/src/freemail/utils/EmailAddress.java 2006-08-03
21:37:33 UTC (rev 9874)
+++ trunk/apps/Freemail/src/freemail/utils/EmailAddress.java 2006-08-03
23:47:12 UTC (rev 9875)
@@ -95,13 +95,8 @@
public String getMailpageKey() {
if (this.is_ssk_address()) {
- System.out.println("detected ssk address");
-
return "USK@"+new String
(Base32.decode(this.getSubDomain()))+"/"+AccountManager.MAILSITE_SUFFIX+"/"+AccountManager.MAILSITE_VERSION+"/"+MailSite.MAILPAGE;
} else {
- System.out.println("detected ksk address");
-
System.out.println("KSK@"+this.getSubDomain()+MailSite.ALIAS_SUFFIX);
-
return "KSK@"+this.getSubDomain()+MailSite.ALIAS_SUFFIX;
}
}