sup

A curses threads-with-tags style email client

sup.git

git clone https://supmua.dev/git/sup/
commit b57bc5299cc99dd7182b0b27329ace13affca779
parent d31f8a6db0ff26151d3fad00025c6f6b478f15b1
Author: wmorgan <wmorgan@5c8cc53c-5e98-4d25-b20a-d8db53a31250>
Date:   Sun, 28 Oct 2007 03:07:26 +0000

fix (i think) the infamous spaces-in-message-ids problem

git-svn-id: svn://rubyforge.org/var/svn/sup/trunk@637 5c8cc53c-5e98-4d25-b20a-d8db53a31250

Diffstat:
M lib/sup/index.rb | 2 +-
M lib/sup/message.rb | 25 ++++++++++++++-----------
2 files changed, 15 insertions(+), 12 deletions(-)
diff --git a/lib/sup/index.rb b/lib/sup/index.rb
@@ -305,7 +305,7 @@ EOS
       "from" => doc[:from],
       "to" => doc[:to],
       "message-id" => doc[:message_id],
-      "references" => doc[:refs],
+      "references" => doc[:refs].split(/\s+/).map { |x| "<#{x}>" }.join(" "),
     }
 
     Message.new :source => source, :source_info => doc[:source_info].to_i, 
diff --git a/lib/sup/message.rb b/lib/sup/message.rb
@@ -55,17 +55,17 @@ class Message
 
   def parse_header header
     header.each { |k, v| header[k.downcase] = v }
-
+    
     @from = PersonManager.person_for header["from"]
 
-    @id = header["message-id"]
-    if @id
-      id.gsub!(/\s+/, "")
-    else
-      @id = "sup-faked-" + Digest::MD5.hexdigest(raw_header)
-      Redwood::log "faking message-id for message from #@from: #@id"
-    end
-
+    @id =
+      if header["message-id"]
+        sanitize_message_id header["message-id"]
+      else
+        "sup-faked-" + Digest::MD5.hexdigest(raw_header)
+        Redwood::log "faking message-id for message from #@from: #@id"
+      end
+    
     date = header["date"]
     @date =
       case date
@@ -86,8 +86,9 @@ class Message
     @to = PersonManager.people_for header["to"]
     @cc = PersonManager.people_for header["cc"]
     @bcc = PersonManager.people_for header["bcc"]
-    @refs = (header["references"] || "").gsub(/[<>]/, "").split(/\s+/).flatten
-    @replytos = (header["in-reply-to"] || "").scan(/<(.*?)>/).flatten
+    @refs = (header["references"] || "").scan(/<(.+?)>/).map { |x| sanitize_message_id x.first }
+    @replytos = (header["in-reply-to"] || "").scan(/<(.+?)>/).map { |x| sanitize_message_id x.first }
+
     @replyto = PersonManager.person_for header["reply-to"]
     @list_address =
       if header["list-post"]
@@ -109,6 +110,8 @@ class Message
     @source.fn_for_offset @source_info
   end
 
+  def sanitize_message_id mid; mid.gsub(/\s/, "") end
+
   def save index
     index.sync_message self if @dirty
     @dirty = false