8 self.class.i_am_the_instance self
10 @cmd = `which gpg`.chomp
11 @cmd = `which pgp`.chomp unless @cmd =~ /\S/
12 @cmd = nil unless @cmd =~ /\S/
15 def verify payload, signature # both RubyMail::Message objects
16 return unknown unless @cmd
18 payload_fn = Tempfile.new "redwood.payload"
19 payload_fn.write payload.to_s.gsub(/(^|[^\r])\n/, "\\1\r\n").gsub(/^MIME-Version: .*\r\n/, "")
22 signature_fn = Tempfile.new "redwood.signature"
23 signature_fn.write signature.decode
26 cmd = "#{@cmd} --quiet --batch --no-verbose --verify --logger-fd 1 #{signature_fn.path} #{payload_fn.path} 2> /dev/null"
28 #Redwood::log "gpg: running: #{cmd}"
30 #Redwood::log "got output: #{gpg_output.inspect}"
31 lines = gpg_output.split(/\n/)
33 if gpg_output =~ /^gpg: (.* signature from .*$)/
34 $? == 0 ? [:valid, $1, lines] : [:invalid, $1, lines]
43 [:unknown, "Unable to determine validity of cryptographic signature", lines]