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
Redwood::UpdateManager.new
Redwood::PollManager.new
Redwood::SuicideManager.new Redwood::SUICIDE_FN
+ Redwood::CryptoManager.new
end
def finish
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"
--- /dev/null
+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
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
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