Fixes #3667 - No possibility to enforce auto response if one of the blocking auto response mail header exists.

This commit is contained in:
Dominik Klein 2021-07-26 12:30:56 +02:00 committed by Thorsten Eckel
parent 65db0d6dd3
commit c346d8b66b
2 changed files with 125 additions and 10 deletions

View file

@ -4,15 +4,18 @@ module Channel::Filter::AutoResponseCheck
def self.run(_channel, mail, _transaction_params) def self.run(_channel, mail, _transaction_params)
# if header is available, do not generate auto response header_is_auto_response_exists = mail.key?(:'x-zammad-is-auto-response')
mail[ :'x-zammad-send-auto-response' ] = false mail[ :'x-zammad-is-auto-response' ] = header_is_auto_response_exists ? ActiveModel::Type::Boolean.new.cast(mail[ :'x-zammad-is-auto-response' ]) : true
mail[ :'x-zammad-is-auto-response' ] = true
if !mail[ :'x-zammad-article-preferences' ] header_send_auto_response_exists = mail.key?(:'x-zammad-send-auto-response')
mail[ :'x-zammad-article-preferences' ] = {} mail[ :'x-zammad-send-auto-response' ] = header_send_auto_response_exists ? ActiveModel::Type::Boolean.new.cast(mail[ :'x-zammad-send-auto-response' ]) : !mail[ :'x-zammad-is-auto-response' ]
end
mail[ :'x-zammad-article-preferences' ]['send-auto-response'] = false mail[ :'x-zammad-article-preferences' ] ||= {}
mail[ :'x-zammad-article-preferences' ]['is-auto-response'] = true mail[ :'x-zammad-article-preferences' ]['send-auto-response'] = mail[ :'x-zammad-send-auto-response' ]
mail[ :'x-zammad-article-preferences' ]['is-auto-response'] = mail[ :'x-zammad-is-auto-response' ]
# Skip the auto response checks, if the header already exists.
return if header_is_auto_response_exists
# do not send an auto response if one of the following headers exists # do not send an auto response if one of the following headers exists
return if mail[ :'list-unsubscribe' ] && mail[ :'list-unsubscribe' ] =~ %r{...} return if mail[ :'list-unsubscribe' ] && mail[ :'list-unsubscribe' ] =~ %r{...}
@ -28,10 +31,10 @@ module Channel::Filter::AutoResponseCheck
return if message_id.match?(%r{@#{Regexp.quote(fqdn)}}i) return if message_id.match?(%r{@#{Regexp.quote(fqdn)}}i)
end end
mail[ :'x-zammad-send-auto-response' ] = true mail[ :'x-zammad-send-auto-response' ] = true if !header_send_auto_response_exists
mail[ :'x-zammad-is-auto-response' ] = false mail[ :'x-zammad-is-auto-response' ] = false
mail[ :'x-zammad-article-preferences' ]['send-auto-response'] = true mail[ :'x-zammad-article-preferences' ]['send-auto-response'] = mail[ :'x-zammad-send-auto-response' ]
mail[ :'x-zammad-article-preferences' ]['is-auto-response'] = false mail[ :'x-zammad-article-preferences' ]['is-auto-response'] = false
end end

View file

@ -0,0 +1,112 @@
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
require 'rails_helper'
RSpec.describe Channel::Filter::AutoResponseCheck, type: :channel_filter do
let(:mail) do
{
From: 'me@example.com'
}
end
shared_examples 'check auto response header' do |send_auto_response_state, is_auto_response_state|
let(:mail_auto_response) do
{
'x-zammad-send-auto-response': send_auto_response_state,
'x-zammad-is-auto-response': is_auto_response_state,
'x-zammad-article-preferences': {
'send-auto-response' => send_auto_response_state,
'is-auto-response' => is_auto_response_state
}
}
end
it 'check filter result' do
filter(mail)
expect(mail).to match(a_hash_including(mail_auto_response))
end
end
context 'with no blocking response header' do
include_examples 'check auto response header', true, false
end
context 'with no blocking response header and x-zammad-send-auto-response:false' do
let(:mail) do
{
'x-zammad-send-auto-response': 'false'
}
end
include_examples 'check auto response header', false, false
end
context 'with blocking auto response header' do
context 'with header precedence:list' do
let(:mail) do
{
precedence: 'list'
}
end
include_examples 'check auto response header', false, true
end
context 'with header precedence:list and x-zammad-send-auto-response:true' do
let(:mail) do
{
precedence: 'list',
'x-zammad-send-auto-response': 'true'
}
end
include_examples 'check auto response header', true, true
end
context 'with header precedence:list and x-zammad-send-auto-response:false' do
let(:mail) do
{
precedence: 'list',
'x-zammad-send-auto-response': 'false'
}
end
include_examples 'check auto response header', false, true
end
context 'with header precedence:list and x-zammad-is-auto-response:false' do
let(:mail) do
{
precedence: 'list',
'x-zammad-is-auto-response': 'false'
}
end
include_examples 'check auto response header', true, false
end
context 'with header precedence:list, x-zammad-is-auto-response:false and x-zammad-send-auto-response:false' do
let(:mail) do
{
precedence: 'list',
'x-zammad-is-auto-response': 'false',
'x-zammad-send-auto-response': 'false'
}
end
include_examples 'check auto response header', false, false
end
context 'with header precedence:list, x-zammad-is-auto-response:true and x-zammad-send-auto-response:true' do
let(:mail) do
{
precedence: 'list',
'x-zammad-is-auto-response': 'true',
'x-zammad-send-auto-response': 'true'
}
end
include_examples 'check auto response header', true, true
end
end
end