SF.net SVN: tmda: [2094] trunk/tmda-cgi

[email protected] Wed, 11 Oct 2006 09:53:27 -0700
Newsgroups gmane.mail.spam.tmda.cvs
Message-ID <[email protected]>
Revision: 2094
          http://svn.sourceforge.net/tmda/?rev=2094&view=rev
Author:   lack
Date:     2006-10-11 09:53:24 -0700 (Wed, 11 Oct 2006)

Log Message:
-----------
Incorporated Jason's patch for malformed international headers, and cleaned up
some characterset logic.

Modified Paths:
--------------
    trunk/tmda-cgi/PendList.py
    trunk/tmda-cgi/View.py

Modified: trunk/tmda-cgi/PendList.py
===================================================================
--- trunk/tmda-cgi/PendList.py	2006-10-10 18:52:57 UTC (rev 2093)
+++ trunk/tmda-cgi/PendList.py	2006-10-11 16:53:24 UTC (rev 2094)
@@ -496,16 +496,20 @@
       if not MsgObj.msgobj["subject"]:
         Subject = "None"
       else:
-        # Decode internationalazed headers
+        # Try to decode internationalized headers
         value = ""
-        for decoded in email.Header.decode_header( MsgObj.msgobj["subject"] ):
-          if decoded[1]:
-            try:
-              value += Unicode.TranslateToUTF8(decoded[1], decoded[0], "strict")
-            except UnicodeError:
+        try:
+          for decoded in email.Header.decode_header( MsgObj.msgobj["subject"] ):
+            if decoded[1]:
+              try:
+                value += Unicode.TranslateToUTF8(decoded[1], decoded[0], "strict")
+              except UnicodeError:
+                value += Unicode.TranslateToUTF8(CharSet, decoded[0], "ignore")
+            else:
               value += Unicode.TranslateToUTF8(CharSet, decoded[0], "ignore")
-          else:
-            value += Unicode.TranslateToUTF8(CharSet, decoded[0], "ignore")
+        except email.errors.HeaderParseError:
+          # just return the undecoded string if we can't decode it
+          value = MsgObj.msgobj["subject"]
         Subject = value
         if len(Subject) > int(PVars[("PendingList", "CropSubject")]):
           Subject = \
@@ -519,16 +523,20 @@
       if not MsgObj.msgobj["from"]:
         From = ""
       else:
-        # Decode internationalazed headers
+        # Try to decode internationalized headers
         value = ""
-        for decoded in email.Header.decode_header( MsgObj.msgobj["from"] ):
-          if decoded[1]:
-            try:
-              value += Unicode.TranslateToUTF8(decoded[1], decoded[0], "strict")
-            except UnicodeError:
+        try:
+          for decoded in email.Header.decode_header( MsgObj.msgobj["from"] ):
+            if decoded[1]:
+              try:
+                value += Unicode.TranslateToUTF8(decoded[1], decoded[0], "strict")
+              except UnicodeError:
+                value += Unicode.TranslateToUTF8(CharSet, decoded[0], "ignore")
+            else:
               value += Unicode.TranslateToUTF8(CharSet, decoded[0], "ignore")
-          else:
-            value += Unicode.TranslateToUTF8(CharSet, decoded[0], "ignore")
+        except email.errors.HeaderParseError:
+          # just return the undecoded string if we can't decode it
+          value = MsgObj.msgobj["from"]
         From = value
         Temp = Address.search(From)
         if Temp:

Modified: trunk/tmda-cgi/View.py
===================================================================
--- trunk/tmda-cgi/View.py	2006-10-10 18:52:57 UTC (rev 2093)
+++ trunk/tmda-cgi/View.py	2006-10-11 16:53:24 UTC (rev 2094)
@@ -30,6 +30,7 @@
 import CgiUtil
 import MyCgiTb
 import Template
+import Unicode
 
 from TMDA import Defaults
 from TMDA import Errors
@@ -91,6 +92,7 @@
 
   # Get e-mail template
   T = Template.Template("view.html", PVars = PVars)
+  T["CharSet"] = "utf-8"
   T["EmailClass"] = PVars[("ViewPending", "EmailClass")]
 
   # Locate messages in pending dir
@@ -214,6 +216,8 @@
   Queue._addCache(PVars["MsgID"])
   Queue._saveCache()
 
+  CharSet = CgiUtil.FindCharSet(MsgObj)
+
   # Extract header row
   HeaderRow = T["HeaderRow"]
   if PVars[("ViewPending", "Headers")] == "all":
@@ -223,14 +227,20 @@
     # Generate all headers
     Headers = ""
     for (header, value) in MsgObj.msgobj.items():
-      Headers += header + ": " + value + "\n"
+      Headers += header + ": "
       # Decode internationalized headers
-      #for decoded in email.Header.decode_header( Line ):
-      #  Headers += decoded[0] + " "
-      #  if decoded[1]:
-      #    cset = email.Charset.Charset(decoded[1]).input_charset.split()
-      #    T["CharSet"] = cset[0]
-      #Headers += "\n"
+      try:
+        for decoded in email.Header.decode_header( value ):
+          if decoded[1]:
+            try:
+              Headers += Unicode.TranslateToUTF8(decoded[1], decoded[0], "strict")
+            except UnicodeError:
+              Headers += Unicode.TranslateToUTF8(CharSet, decoded[0], "ignore")
+          else:
+            Headers += Unicode.TranslateToUTF8(CharSet, decoded[0], "ignore")
+      except email.errors.HeaderParseError:
+        Headers += value
+      Headers += "\n"
     T["Headers"] = '<pre class="Headers">%s</pre>' % Headers
   else:
     # Remove all header block
@@ -241,11 +251,17 @@
       T["Name"]  = Header.capitalize()
       value = ""
       # Decode internationalazed headers
-      for decoded in email.Header.decode_header( MsgObj.msgobj[Header] ):
-        value += decoded[0] + " "
-        if decoded[1]:
-          cset = email.Charset.Charset(decoded[1]).input_charset.split()
-          T["CharSet"] = cset[0]
+      try:
+        for decoded in email.Header.decode_header( MsgObj.msgobj[Header] ):
+          if decoded[1]:
+            try:
+              value += Unicode.TranslateToUTF8(decoded[1], decoded[0], "strict")
+            except UnicodeError:
+              value += Unicode.TranslateToUTF8(CharSet, decoded[0], "ignore")
+          else:
+            value += Unicode.TranslateToUTF8(CharSet, decoded[0], "ignore")
+      except email.errors.HeaderParseError:
+        value += MsgObj.msgobj[Header]
       T["Value"] = CgiUtil.Escape(value)
       HeaderRow.Add()
 
@@ -354,10 +370,6 @@
     # Display the easily display-able parts
     if Type == "text/html":
       # Sterilize & display
-      # Check if there's a character set for this part.
-      if Part.get_content_charset():
-        cset = email.Charset.Charset(Part.get_content_charset()).input_charset.split()
-        T["CharSet"] = cset[0]
       try:
         T["Content"] = \
           CgiUtil.Sterilize(Part.get_payload(decode=1), Allow, Remove)
@@ -367,10 +379,6 @@
       except AttributeError:
         pass
     elif Type.startswith("text/"):
-      # Check if there's a character set for this part.
-      if Part.get_content_charset():
-        cset = email.Charset.Charset(Part.get_content_charset()).input_charset.split()
-        T["CharSet"] = cset[0]
       # Escape & display
       try:
         Str = Part.get_payload(decode=1).strip()


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.