]> git.cworth.org Git - sup/blobdiff - lib/sup/message.rb
Merge branch 'master' into next
[sup] / lib / sup / message.rb
index 965c10e53ac257748cf3a2466d79c9431783b3bc..c69b9e30327ff6e51d70b8b2395f47107c0dc68e 100644 (file)
@@ -127,6 +127,31 @@ class Message
     @list_unsubscribe = header["list-unsubscribe"]
   end
 
+  ## Expected index entry format:
+  ## :message_id, :subject => String
+  ## :date => Time
+  ## :refs, :replytos => Array of String
+  ## :from => Person
+  ## :to, :cc, :bcc => Array of Person
+  def load_from_index! entry
+    @id = entry[:message_id]
+    @from = entry[:from]
+    @date = entry[:date]
+    @subj = entry[:subject]
+    @to = entry[:to]
+    @cc = entry[:cc]
+    @bcc = entry[:bcc]
+    @refs = (@refs + entry[:refs]).uniq
+    @replytos = entry[:replytos]
+
+    @replyto = nil
+    @list_address = nil
+    @recipient_email = nil
+    @source_marked_read = false
+    @list_subscribe = nil
+    @list_unsubscribe = nil
+  end
+
   def add_ref ref
     @refs << ref
     @dirty = true
@@ -382,9 +407,13 @@ private
       return
     end
 
-    decryptedm, sig, notice = CryptoManager.decrypt payload
-    children = message_to_chunks(decryptedm, true) if decryptedm
-    [notice, sig, children].flatten.compact
+    notice, sig, decryptedm = CryptoManager.decrypt payload
+    if decryptedm # managed to decrypt
+      children = message_to_chunks(decryptedm, true)
+      [notice, sig, children]
+    else
+      [notice]
+    end
   end
 
   ## takes a RMail::Message, breaks it into Chunk:: classes.
@@ -405,20 +434,24 @@ private
 
       chunks
     elsif m.header.content_type == "message/rfc822"
-      payload = RMail::Parser.read(m.body)
-      from = payload.header.from.first ? payload.header.from.first.format : ""
-      to = payload.header.to.map { |p| p.format }.join(", ")
-      cc = payload.header.cc.map { |p| p.format }.join(", ")
-      subj = payload.header.subject
-      subj = subj ? Message.normalize_subj(payload.header.subject.gsub(/\s+/, " ").gsub(/\s+$/, "")) : subj
-      if Rfc2047.is_encoded? subj
-        subj = Rfc2047.decode_to $encoding, subj
+      if m.body
+        payload = RMail::Parser.read(m.body)
+        from = payload.header.from.first ? payload.header.from.first.format : ""
+        to = payload.header.to.map { |p| p.format }.join(", ")
+        cc = payload.header.cc.map { |p| p.format }.join(", ")
+        subj = payload.header.subject
+        subj = subj ? Message.normalize_subj(payload.header.subject.gsub(/\s+/, " ").gsub(/\s+$/, "")) : subj
+        if Rfc2047.is_encoded? subj
+          subj = Rfc2047.decode_to $encoding, subj
+        end
+        msgdate = payload.header.date
+        from_person = from ? Person.from_address(from) : nil
+        to_people = to ? Person.from_address_list(to) : nil
+        cc_people = cc ? Person.from_address_list(cc) : nil
+        [Chunk::EnclosedMessage.new(from_person, to_people, cc_people, msgdate, subj)] + message_to_chunks(payload, encrypted)
+      else
+        [Chunk::EnclosedMessage.new(nil, "")]
       end
-      msgdate = payload.header.date
-      from_person = from ? Person.from_address(from) : nil
-      to_people = to ? Person.from_address_list(to) : nil
-      cc_people = cc ? Person.from_address_list(cc) : nil
-      [Chunk::EnclosedMessage.new(from_person, to_people, cc_people, msgdate, subj)] + message_to_chunks(payload, encrypted)
     else
       filename =
         ## first, paw through the headers looking for a filename