123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- # Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
- class SecureMailing::Backend::HandlerIncoming < SecureMailing::Backend::Handler
- attr_accessor :mail, :content_type
- def initialize(mail)
- super()
- @mail = mail
- @content_type = mail[:mail_instance].content_type
- end
- def process
- return if !process?
- initialize_article_preferences
- decrypt
- verify_signature
- log
- end
- def process?
- signed? || encrypted?
- end
- def initialize_article_preferences
- article_preferences[:security] = {
- type: type,
- sign: {
- success: false,
- comment: nil,
- },
- encryption: {
- success: false,
- comment: nil,
- }
- }
- end
- def article_preferences
- @article_preferences ||= begin
- key = :'x-zammad-article-preferences'
- mail[ key ] ||= {}
- mail[ key ]
- end
- end
- def signed?
- raise NotImplementedError
- end
- def encrypted?
- raise NotImplementedError
- end
- def decrypt
- raise NotImplementedError
- end
- def verify_signature
- raise NotImplementedError
- end
- def set_article_preferences(operation:, comment:, success: false)
- article_preferences[:security][operation] = {
- success: success,
- comment: comment,
- }
- end
- private
- def parse_decrypted_mail(decrypted_body)
- %w[Content-Type Content-Disposition Content-Transfer-Encoding Content-Description].each do |header|
- mail[:mail_instance].header[header] = nil
- end
- Channel::EmailParser.new.parse("#{mail[:mail_instance].header}#{decrypted_body}").each do |key, value|
- mail[key] = value
- end
- update_content_type
- end
- def update_content_type
- # By parsing the decrypted body, the content type might have changed.
- @content_type = mail[:mail_instance].content_type
- end
- def log
- %i[sign encryption].each do |action|
- result = log_result(action)
- next if result.blank?
- HttpLog.create(log_result(action))
- end
- end
- def log_result(action)
- result = article_preferences[:security][action]
- return if result.blank?
- if result[:success]
- status = 'success'
- elsif result[:comment].blank?
- # means not performed
- return
- else
- status = 'failed'
- end
- {
- direction: 'in',
- facility: type,
- url: "#{mail[:from]} -> #{mail[:to]}",
- status: status,
- ip: nil,
- request: {
- message_id: mail[:message_id],
- },
- response: article_preferences[:security],
- method: action,
- created_by_id: 1,
- updated_by_id: 1,
- }
- end
- end
|