commit 510ee3480dd4d14fb069776b1a5926382491b676
parent 6c5d5466081e2480e44f2049a0ba29b9b6790332
Author: Hamish Downer <dmishd@gmail.com>
Date: Sun, 20 Feb 2011 19:51:55 +0000
Merge branch 'gpgme' into next
Resolved Conflicts:
lib/sup/crypto.rb
Diffstat:
1 file changed, 31 insertions(+), 15 deletions(-)
diff --git a/lib/sup/crypto.rb b/lib/sup/crypto.rb
@@ -106,15 +106,14 @@ EOS
begin
sig = GPGME.detach_sign(format_payload(payload), gpg_opts)
rescue GPGME::Error => exc
- info "Error while running gpg: #{exc.message}"
- raise Error, "GPG command failed. See log for details."
+ raise Error, gpgme_exc_msg(exc.message)
end
# if the key (or gpg-agent) is not available GPGME does not complain
# but just returns a zero length string. Let's catch that
if sig.length == 0
- info "GPG failed to generate signature: check that gpg-agent is running and your key is available."
- raise Error, "GPG command failed. See log for details."
+ raise Error, gpgme_exc_msg("GPG failed to generate signature: check that gpg-agent is running and your key is available.")
+ end
end
envelope = RMail::Message.new
@@ -141,15 +140,13 @@ EOS
begin
cipher = GPGME.encrypt(recipients, format_payload(payload), gpg_opts)
rescue GPGME::Error => exc
- info "Error while running gpg: #{exc.message}"
- raise Error, "GPG command failed. See log for details."
+ raise Error, gpgme_exc_msg(exc.message)
end
# if the key (or gpg-agent) is not available GPGME does not complain
# but just returns a zero length string. Let's catch that
if cipher.length == 0
- info "GPG failed to generate cipher text: check that gpg-agent is running and your key is available."
- raise Error, "GPG command failed. See log for details."
+ raise Error, gpgme_exc_msg("GPG failed to generate cipher text: check that gpg-agent is running and your key is available.")
end
encrypted_payload = RMail::Message.new
@@ -232,9 +229,13 @@ EOS
begin
ctx.verify(sig_data, signed_text_data, plain_data)
rescue GPGME::Error => exc
- return unknown_status exc.message
+ return unknown_status [gpgme_exc_msg(exc.message)]
+ end
+ begin
+ self.verified_ok? ctx.verify_result
+ rescue ArgumentError => exc
+ return unknown_status [gpgme_exc_msg(exc.message)]
end
- self.verified_ok? ctx.verify_result
end
## returns decrypted_message, status, desc, lines
@@ -250,10 +251,13 @@ EOS
begin
ctx.decrypt_verify(cipher_data, plain_data)
rescue GPGME::Error => exc
- info "Error while running gpg: #{exc.message}"
- return Chunk::CryptoNotice.new(:invalid, "This message could not be decrypted", exc.message)
+ return Chunk::CryptoNotice.new(:invalid, "This message could not be decrypted", gpgme_exc_msg(exc.message))
+ end
+ begin
+ sig = self.verified_ok? ctx.verify_result
+ rescue ArgumentError => exc
+ sig = unknown_status [gpgme_exc_msg(exc.message)]
end
- sig = self.verified_ok? ctx.verify_result
plain_data.seek(0, IO::SEEK_SET)
output = plain_data.read
output.force_encoding Encoding::ASCII_8BIT if output.respond_to? :force_encoding
@@ -309,6 +313,12 @@ private
Chunk::CryptoNotice.new :unknown, "Unable to determine validity of cryptographic signature", lines
end
+ def gpgme_exc_msg msg
+ err_msg = "Exception in GPGME call: #{msg}"
+ info err_msg
+ err_msg
+ end
+
## here's where we munge rmail output into the format that signed/encrypted
## PGP/GPG messages should be
def format_payload payload
@@ -330,8 +340,14 @@ private
ctx = GPGME::Ctx.new
begin
from_key = ctx.get_key(signature.fingerprint)
- first_sig = signature.to_s.sub(/from [0-9A-F]{16} /, 'from "') + '"'
- rescue EOFError
+ if GPGME::gpgme_err_code(signature.status) == GPGME::GPG_ERR_GENERAL
+ first_sig = "General error on signature verification for #{signature.fingerprint}"
+ elsif signature.to_s
+ first_sig = signature.to_s.sub(/from [0-9A-F]{16} /, 'from "') + '"'
+ else
+ first_sig = "Unknown error or empty signature"
+ end
+ rescue EOFError
from_key = nil
first_sig = "No public key available for #{signature.fingerprint}"
end