sup

A curses threads-with-tags style email client

sup.git

git clone https://supmua.dev/git/sup/
commit 534d85c189215862abca271ec2434ae7385ae016
parent 30a229908669936e26158d380a92011e7642cef5
Author: wmorgan <wmorgan@5c8cc53c-5e98-4d25-b20a-d8db53a31250>
Date:   Sat, 15 Sep 2007 05:25:30 +0000

cryptosig improvements

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

Diffstat:
M Manifest.txt | 1 +
M lib/sup.rb | 2 ++
A lib/sup/crypto.rb | 47 +++++++++++++++++++++++++++++++++++++++++++++++
M lib/sup/message.rb | 27 ++++-----------------------
4 files changed, 54 insertions(+), 23 deletions(-)
diff --git a/Manifest.txt b/Manifest.txt
@@ -20,6 +20,7 @@ lib/sup/account.rb
 lib/sup/buffer.rb
 lib/sup/colormap.rb
 lib/sup/contact.rb
+lib/sup/crypto.rb
 lib/sup/draft.rb
 lib/sup/hook.rb
 lib/sup/imap.rb
diff --git a/lib/sup.rb b/lib/sup.rb
@@ -112,6 +112,7 @@ module Redwood
     Redwood::UpdateManager.new
     Redwood::PollManager.new
     Redwood::SuicideManager.new Redwood::SUICIDE_FN
+    Redwood::CryptoManager.new
   end
 
   def finish
@@ -236,6 +237,7 @@ require "sup/contact"
 require "sup/tagger"
 require "sup/draft"
 require "sup/poll"
+require "sup/crypto"
 require "sup/modes/scroll-mode"
 require "sup/modes/text-mode"
 require "sup/modes/line-cursor-mode"
diff --git a/lib/sup/crypto.rb b/lib/sup/crypto.rb
@@ -0,0 +1,47 @@
+module Redwood
+
+class CryptoManager
+  include Singleton
+
+  def initialize
+    @mutex = Mutex.new
+    self.class.i_am_the_instance self
+
+    @cmd = `which gpg`.chomp
+    @cmd = `which pgp`.chomp unless @cmd =~ /\S/
+    @cmd = nil unless @cmd =~ /\S/
+  end
+
+  def verify payload, signature # both RubyMail::Message objects
+    return unknown unless @cmd
+
+    payload_fn = File.open("payload", "w") # Tempfile.new "redwood.payload"
+    signature_fn = File.open("signature", "w") #Tempfile.new "redwood.signature"
+
+    payload_fn.write payload.to_s.gsub(/(^|[^\r])\n/, "\\1\r\n").gsub(/^MIME-Version: .*\r\n/, "")
+    payload_fn.close
+
+    signature_fn.write signature.decode
+    signature_fn.close
+
+    cmd = "#{@cmd} --quiet --batch --no-verbose --verify --logger-fd 1 #{signature_fn.path} #{payload_fn.path} 2> /dev/null"
+
+    #Redwood::log "gpg: running: #{cmd}"
+    gpg_output = `#{cmd}`
+    #Redwood::log "got output: #{gpg_output.inspect}"
+    lines = gpg_output.split(/\n/)
+
+    if gpg_output =~ /^gpg: (.* signature from .*$)/
+      $? == 0 ? [:valid, $1, lines] : [:invalid, $1, lines]
+    else
+      unknown
+    end
+  end
+
+private
+
+  def unknown
+    [:unknown, "Unable to determine validity of cryptographic signature", []]
+  end
+end
+end
diff --git a/lib/sup/message.rb b/lib/sup/message.rb
@@ -124,38 +124,19 @@ EOS
     end
 
     def status
-      @status, @description = verify unless @status
+      verify
       @status
     end
 
     def description
-      @status, @description = verify unless @status
+      verify
       @description
     end
 
 private
 
     def verify
-      payload = Tempfile.new "redwood.payload"
-      signature = Tempfile.new "redwood.signature"
-
-      payload.write @payload.to_s.gsub(/(^|[^\r])\n/, "\\1\r\n")
-      payload.close
-
-      signature.write @signature.decode
-      signature.close
-
-      cmd = "gpg --quiet --batch --no-verbose --verify --logger-fd 1 #{signature.path} #{payload.path} 2> /dev/null"
-      #Redwood::log "gpg: running: #{cmd}"
-      gpg_output = `#{cmd}`
-      #Redwood::log "got output: #{gpg_output.inspect}"
-      @lines = gpg_output.split(/\n/)
-
-      if gpg_output =~ /^gpg: (.* signature from .*$)/
-        $? == 0 ? [:valid, $1] : [:invalid, $1]
-      else
-        [:unknown, "Unable to determine validity of cryptographic signature"]
-      end
+      @status, @description, @lines = CryptoManager.verify(@payload, @signature) unless @status
     end
   end
 
@@ -394,7 +375,7 @@ private
     end
 
     payload, signature = m.body
-    if payload.multipart? || signature.multipart?
+    if signature.multipart?
       Redwood::log "warning: multipart/signed with payload multipart #{payload.multipart?} and signature multipart #{signature.multipart?}"
       return
     end