]> git.cworth.org Git - sup/commitdiff
cryptosig improvements
authorwmorgan <wmorgan@5c8cc53c-5e98-4d25-b20a-d8db53a31250>
Sat, 15 Sep 2007 05:25:30 +0000 (05:25 +0000)
committerwmorgan <wmorgan@5c8cc53c-5e98-4d25-b20a-d8db53a31250>
Sat, 15 Sep 2007 05:25:30 +0000 (05:25 +0000)
git-svn-id: svn://rubyforge.org/var/svn/sup/trunk@579 5c8cc53c-5e98-4d25-b20a-d8db53a31250

Manifest.txt
lib/sup.rb
lib/sup/crypto.rb [new file with mode: 0644]
lib/sup/message.rb

index 02628fc36df0a4a7a620f892a62b29b0e4c0999c..7e1af191357404337a28113525ec327c79d01df3 100644 (file)
@@ -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
index 7edc35bbf6f6bcdf8b8e4a2830434a3d749e5ae7..f1bada6b062a33bd0d1184fcdd33908a5edd6d8a 100644 (file)
@@ -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
new file mode 100644 (file)
index 0000000..4562412
--- /dev/null
@@ -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
index c92e2c218d1756d22f65c235421ac046f86600c2..cf3e826c292416bf771eb6350a35f7eaf04af6ad 100644 (file)
@@ -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