From: wmorgan Date: Sat, 15 Sep 2007 05:25:30 +0000 (+0000) Subject: cryptosig improvements X-Git-Url: https://git.cworth.org/git?a=commitdiff_plain;h=534d85c189215862abca271ec2434ae7385ae016;p=sup cryptosig improvements git-svn-id: svn://rubyforge.org/var/svn/sup/trunk@579 5c8cc53c-5e98-4d25-b20a-d8db53a31250 --- diff --git a/Manifest.txt b/Manifest.txt index 02628fc..7e1af19 100644 --- 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 index 7edc35b..f1bada6 100644 --- 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 new file mode 100644 index 0000000..4562412 --- /dev/null +++ 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 index c92e2c2..cf3e826 100644 --- 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