Project

General

Profile

« Previous | Next » 

Revision 09b32d70

Added by Marc Dequènes about 15 years ago

  • ID 09b32d703dd0a5924155082fd7743e536fd8231f

[evol] sign outgoing mails, and lot's of fixes and code improvement in mail handling (related to signing, crypting, and preparing/chaining the two)

View differences:

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