53 lines
1.4 KiB
Ruby
53 lines
1.4 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Gitlab
|
|
module Email
|
|
class AttachmentUploader
|
|
attr_accessor :message
|
|
|
|
def initialize(message)
|
|
@message = message
|
|
end
|
|
|
|
def execute(upload_parent:, uploader_class:)
|
|
attachments = []
|
|
|
|
filter_signature_attachments(message).each do |attachment|
|
|
tmp = Tempfile.new("gitlab-email-attachment")
|
|
begin
|
|
File.open(tmp.path, "w+b") { |f| f.write attachment.body.decoded }
|
|
|
|
file = {
|
|
tempfile: tmp,
|
|
filename: attachment.filename,
|
|
content_type: attachment.content_type
|
|
}
|
|
|
|
uploader = UploadService.new(upload_parent, file, uploader_class).execute
|
|
attachments << uploader.to_h if uploader
|
|
ensure
|
|
tmp.close!
|
|
end
|
|
end
|
|
|
|
attachments
|
|
end
|
|
|
|
private
|
|
|
|
# If this is a signed message (e.g. S/MIME or PGP), remove the signature
|
|
# from the uploaded attachments
|
|
def filter_signature_attachments(message)
|
|
attachments = message.attachments
|
|
|
|
if message.content_type&.starts_with?('multipart/signed')
|
|
signature_protocol = message.content_type_parameters[:protocol]
|
|
|
|
attachments.delete_if { |attachment| attachment.content_type.starts_with?(signature_protocol) } if signature_protocol.present?
|
|
end
|
|
|
|
attachments
|
|
end
|
|
end
|
|
end
|
|
end
|