91 lines
2.6 KiB
Ruby
91 lines
2.6 KiB
Ruby
class ApplicationMailer < ActionMailer::Base
|
|
default Rails.application.config.action_mailer.default_options
|
|
layout 'mailer'
|
|
|
|
private
|
|
|
|
def send_mail
|
|
@template ||= "#{self.class.name.underscore}/#{caller[0][/`([^']*)'/, 1]}"
|
|
headers['Message-ID'] = message_id
|
|
|
|
if @user.pgp_pubkey.present?
|
|
mail(to: @user.email, subject: "...", content_type: pgp_content_type) do |format|
|
|
format.text { render plain: pgp_content }
|
|
end
|
|
else
|
|
mail(to: @user.email, subject: @subject) do |format|
|
|
format.text { render @template }
|
|
end
|
|
end
|
|
end
|
|
|
|
def from_address
|
|
self.class.default[:from]
|
|
end
|
|
|
|
def from_domain
|
|
Mail::Address.new(from_address).domain
|
|
end
|
|
|
|
def message_id
|
|
@message_id ||= "#{SecureRandom.uuid}@#{from_domain}"
|
|
end
|
|
|
|
def boundary
|
|
@boundary ||= SecureRandom.hex(8)
|
|
end
|
|
|
|
def pgp_content_type
|
|
"multipart/encrypted; protocol=\"application/pgp-encrypted\"; boundary=\"------------#{boundary}\""
|
|
end
|
|
|
|
def pgp_nested_content
|
|
message_content = render_to_string(template: @template)
|
|
message_content_base64 = Base64.encode64(message_content)
|
|
nested_boundary = SecureRandom.hex(8)
|
|
|
|
<<~NESTED_CONTENT
|
|
Content-Type: multipart/mixed; boundary="------------#{nested_boundary}"; protected-headers="v1"
|
|
Subject: #{@subject}
|
|
From: <#{from_address}>
|
|
To: #{@user.display_name || @user.cn} <#{@user.email}>
|
|
Message-ID: <#{message_id}>
|
|
|
|
--------------#{nested_boundary}
|
|
Content-Type: text/plain; charset=UTF-8; format=flowed
|
|
Content-Transfer-Encoding: base64
|
|
|
|
#{message_content_base64}
|
|
|
|
--------------#{nested_boundary}--
|
|
NESTED_CONTENT
|
|
end
|
|
|
|
def pgp_content
|
|
encrypted_content = UserManager::PgpEncrypt.call(user: @user, text: pgp_nested_content)
|
|
encrypted_base64 = Base64.encode64(encrypted_content.to_s)
|
|
|
|
<<~EMAIL_CONTENT
|
|
This is an OpenPGP/MIME encrypted message (RFC 4880 and 3156)
|
|
--------------#{boundary}
|
|
Content-Type: application/pgp-encrypted
|
|
Content-Description: PGP/MIME version identification
|
|
|
|
Version: 1
|
|
|
|
--------------#{boundary}
|
|
Content-Type: application/octet-stream; name="encrypted.asc"
|
|
Content-Description: OpenPGP encrypted message
|
|
Content-Disposition: inline; filename="encrypted.asc"
|
|
|
|
-----BEGIN PGP MESSAGE-----
|
|
|
|
#{encrypted_base64}
|
|
|
|
-----END PGP MESSAGE-----
|
|
|
|
--------------#{boundary}--
|
|
EMAIL_CONTENT
|
|
end
|
|
end
|