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:
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