Revision 09b32d70
Added by Marc Dequènes over 15 years ago
- ID 09b32d703dd0a5924155082fd7743e536fd8231f
lib/tmail_extra.rb | ||
---|---|---|
def verify_pgp_signature
|
||
return nil unless is_pgp_signed?
|
||
|
||
# using RAW part, without any decoding
|
||
# remove last EOL due to MIME protocol and properly convert all EOL to CRLF
|
||
content = parts[0].raw.chomp.gsub(/\r?\n/, "\r\n")
|
||
content = parts[0].to_rfc3156
|
||
sig = pgp_signature()
|
||
|
||
sig_check = nil
|
||
sigs_check = nil
|
||
GPGME.verify(sig, content) do |signature|
|
||
sig_check = signature
|
||
sigs_check ||= []
|
||
sigs_check << signature
|
||
end
|
||
|
||
sig_check
|
||
sigs_check
|
||
end
|
||
|
||
def is_pgp_encrypted?
|
||
... | ... | |
parts[1].body
|
||
end
|
||
|
||
def decrypt(&passphrase_callback)
|
||
def pgp_decrypt(&passphrase_callback)
|
||
return nil unless is_pgp_encrypted?
|
||
protocol_version = pgp_crypt_info()["Version"].to_i
|
||
raise NotImplementedError, "pgp-encrypted protocol version #{protocol_version} is not implemented" unless protocol_version == 1
|
||
|
||
encrypted_data = pgp_encrypted_part()
|
||
passphrase_callback_wrapper = Proc.new do |hook, uid_hint, passphrase_info, prev_was_bad, fd|
|
||
# sending key
|
||
io = IO.for_fd(fd, 'w')
|
||
io.puts hook.call(uid_hint, passphrase_info, prev_was_bad)
|
||
io.flush
|
||
end
|
||
GPGME.decrypt(encrypted_data, {:passphrase_callback => passphrase_callback_wrapper, :passphrase_callback_value => passphrase_callback, :textmode => true})
|
||
GPGME.decrypt(encrypted_data, {:passphrase_callback => method(:gpg_passphrase_callback_wrapper),
|
||
:passphrase_callback_value => passphrase_callback, :textmode => true})
|
||
end
|
||
|
||
def pgp_crypt(fingerprint)
|
||
GPGME.encrypt([gpg_key(fingerprint)], self.to_s, {:armor => true, :always_trust => true})
|
||
end
|
||
|
||
def pgp_sign(signers_id, &passphrase_callback)
|
||
signers = signers_id.collect{|key_id| gpg_key(key_id) }
|
||
GPGME.sign(self.to_rfc3156, {:signers => signers, :passphrase_callback => method(:gpg_passphrase_callback_wrapper),
|
||
:passphrase_callback_value => passphrase_callback, :armor => true})
|
||
end
|
||
|
||
def to_rfc3156
|
||
# using RAW part, without any decoding
|
||
# remove last EOL due to MIME protocol and properly convert all EOL to CRLF
|
||
raw.chomp.gsub(/\r?\n/, "\r\n")
|
||
end
|
||
|
||
protected
|
||
|
||
def gpg_key(fingerprint)
|
||
gpg = GPGME::Ctx.new
|
||
gpg.get_key(fingerprint)
|
||
end
|
||
|
||
def gpg_passphrase_callback_wrapper(hook, uid_hint, passphrase_info, prev_was_bad, fd)
|
||
# sending key
|
||
io = IO.for_fd(fd, 'w')
|
||
io.puts hook.call(uid_hint, passphrase_info, prev_was_bad)
|
||
io.flush
|
||
end
|
||
|
||
def raw
|
||
@port.read_all
|
||
end
|
Also available in: Unified diff
[evol] sign outgoing mails, and lot's of fixes and code improvement in mail handling (related to signing, crypting, and preparing/chaining the two)