2022-01-01 13:38:12 +00:00
|
|
|
# Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
|
2021-06-01 12:20:20 +00:00
|
|
|
|
2020-06-02 11:01:16 +00:00
|
|
|
class SecureMailing::SMIME::Retry < SecureMailing::Backend::Handler
|
|
|
|
|
|
|
|
def initialize(article)
|
2020-09-30 09:07:01 +00:00
|
|
|
super()
|
2020-06-02 11:01:16 +00:00
|
|
|
@article = article
|
|
|
|
end
|
|
|
|
|
|
|
|
def process
|
|
|
|
return existing_result if already_processed?
|
|
|
|
|
|
|
|
save_result if retry_succeeded?
|
|
|
|
retry_result
|
|
|
|
end
|
|
|
|
|
|
|
|
def signature_checked?
|
|
|
|
@signature_checked ||= existing_result&.dig('sign', 'success') || false
|
|
|
|
end
|
|
|
|
|
|
|
|
def decrypted?
|
|
|
|
@decrypted ||= existing_result&.dig('encryption', 'success') || false
|
|
|
|
end
|
|
|
|
|
|
|
|
def already_processed?
|
|
|
|
signature_checked? && decrypted?
|
|
|
|
end
|
|
|
|
|
|
|
|
def existing_result
|
|
|
|
@article.preferences['security']
|
|
|
|
end
|
|
|
|
|
|
|
|
def mail
|
|
|
|
@mail ||= begin
|
|
|
|
raw_mail = @article.as_raw.store_file.content
|
|
|
|
Channel::EmailParser.new.parse(raw_mail).tap do |parsed|
|
|
|
|
SecureMailing.incoming(parsed)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def retry_result
|
|
|
|
@retry_result ||= mail['x-zammad-article-preferences']['security']
|
|
|
|
end
|
|
|
|
|
|
|
|
def signature_found?
|
|
|
|
return false if signature_checked?
|
|
|
|
|
|
|
|
retry_result['sign']['success']
|
|
|
|
end
|
|
|
|
|
|
|
|
def decryption_succeeded?
|
|
|
|
return false if decrypted?
|
|
|
|
|
|
|
|
retry_result['encryption']['success']
|
|
|
|
end
|
|
|
|
|
|
|
|
def retry_succeeded?
|
|
|
|
return true if signature_found?
|
|
|
|
|
|
|
|
decryption_succeeded?
|
|
|
|
end
|
|
|
|
|
|
|
|
def save_result
|
|
|
|
save_decrypted if decryption_succeeded?
|
|
|
|
@article.preferences['security'] = retry_result
|
|
|
|
@article.save!
|
|
|
|
end
|
|
|
|
|
|
|
|
def save_decrypted
|
|
|
|
@article.content_type = mail['content_type']
|
|
|
|
@article.body = mail['body']
|
|
|
|
|
|
|
|
Store.remove(
|
|
|
|
object: 'Ticket::Article',
|
|
|
|
o_id: @article.id,
|
|
|
|
)
|
|
|
|
|
|
|
|
mail[:attachments]&.each do |attachment|
|
|
|
|
filename = attachment[:filename].force_encoding('utf-8')
|
|
|
|
if !filename.force_encoding('UTF-8').valid_encoding?
|
|
|
|
filename = filename.utf8_encode(fallback: :read_as_sanitized_binary)
|
|
|
|
end
|
|
|
|
Store.add(
|
|
|
|
object: 'Ticket::Article',
|
|
|
|
o_id: @article.id,
|
|
|
|
data: attachment[:data],
|
|
|
|
filename: filename,
|
|
|
|
preferences: attachment[:preferences],
|
|
|
|
created_by_id: @article.created_by_id,
|
|
|
|
)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|