51 lines
1.5 KiB
Ruby
51 lines
1.5 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Gitlab
|
|
module Email
|
|
module Hook
|
|
class SmimeSignatureInterceptor
|
|
# Sign emails with SMIME if enabled
|
|
class << self
|
|
def delivering_email(message)
|
|
signed_message = Gitlab::Email::Smime::Signer.sign(
|
|
cert: certificate.cert,
|
|
key: certificate.key,
|
|
data: message.encoded)
|
|
|
|
signed_email = Mail.new(signed_message)
|
|
|
|
overwrite_body(message, signed_email)
|
|
overwrite_headers(message, signed_email)
|
|
end
|
|
|
|
private
|
|
|
|
def certificate
|
|
@certificate ||= Gitlab::Email::Smime::Certificate.from_files(key_path, cert_path)
|
|
end
|
|
|
|
def key_path
|
|
Gitlab.config.gitlab.email_smime.key_file
|
|
end
|
|
|
|
def cert_path
|
|
Gitlab.config.gitlab.email_smime.cert_file
|
|
end
|
|
|
|
def overwrite_body(message, signed_email)
|
|
# since this is a multipart email, assignment to nil is important,
|
|
# otherwise Message#body will add a new mail part
|
|
message.body = nil
|
|
message.body = signed_email.body.encoded
|
|
end
|
|
|
|
def overwrite_headers(message, signed_email)
|
|
message.content_disposition = signed_email.content_disposition
|
|
message.content_transfer_encoding = signed_email.content_transfer_encoding
|
|
message.content_type = signed_email.content_type
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|