Author: dbkr
Date: 2008-04-12 22:33:18 +0000 (Sat, 12 Apr 2008)
New Revision: 19254

Modified:
   trunk/apps/Freemail/src/freemail/MailHeaderFilter.java
Log:
Whitelist header filter


Modified: trunk/apps/Freemail/src/freemail/MailHeaderFilter.java
===================================================================
--- trunk/apps/Freemail/src/freemail/MailHeaderFilter.java      2008-04-12 
18:52:08 UTC (rev 19253)
+++ trunk/apps/Freemail/src/freemail/MailHeaderFilter.java      2008-04-12 
22:33:18 UTC (rev 19254)
@@ -34,6 +34,8 @@
 import java.util.TimeZone;
 import java.text.ParseException;
 import java.util.Locale;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;

 import freemail.utils.Logger;

@@ -43,6 +45,7 @@
        private boolean foundEnd;
        private static final SimpleDateFormat sdf;
        private static final TimeZone gmt;
+       private static final Pattern messageIdPattern = 
Pattern.compile("<?([^\\@])*\\@([^>]*)>?");

        static {
                sdf = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z", 
Locale.US);
@@ -104,8 +107,7 @@
        }

        private String filterHeader(String name, String val) {
-               // simple blacklist filter for now
-               // a whitelist filter is probably excessive
+               // Whitelist filter
                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
@@ -133,14 +135,40 @@
                                strDate = sdf.format(d);
                        }
                        return strDate;
-               } else if (name.equalsIgnoreCase("User-Agent")) {
-                       // might as well hide this
+               } else if (name.equalsIgnoreCase("Message-ID")) {
+                       // We want to keep message-ids for in-reply-to and 
hence message threading to work, but we need to make sure the
+                       // mail client hasn't put in a real hostname, as some 
have been known to.
+                       Matcher m = messageIdPattern.matcher(val);
+                       if (!m.matches() || m.groupCount() < 2) {
+                               // couldn't make any sense of it, so just drop 
it
+                               return null;
+                       } else {
+                               if (m.group(2).endsWith("freemail")) {
+                                       // okay, the hostname part ends with 
freemail, so it's a fake Freemail domain and not a real one
+                                       return val;
+                               } else {
+                                       // It's something else, so just replace 
it with 'freemail', although this might not actually be any more
+                                       // useful than dropping it, since the 
mail client will be looking for the unmangled header.
+                                       return "<"+m.group(1)+"@freemail>";
+                               }
+                               
+                       }
+               } else if (name.equalsIgnoreCase("From")) {
+                       return val;
+               } else if (name.equalsIgnoreCase("To")) {
+                       return val;
+               } else if (name.equalsIgnoreCase("Subject")) {
+                       return val;
+               } else if (name.equalsIgnoreCase("MIME-Version")) {
+                       return val;
+               } else if (name.equalsIgnoreCase("Content-Type")) {
+                       return val;
+               } else if (name.equalsIgnoreCase("Content-Transfer-Encoding")) {
+                       return val;
+               } else if (name.equalsIgnoreCase("In-Reply-To")) {
+                       return val;
+               } else {
                        return null;
-               } else if (name.equalsIgnoreCase("Received")) {
-                       // may give away local address
-                       return null;
-               } else {
-                       return val;
                }
        }
 }


Reply via email to