FEATURE: Clean up `PostReplyKey` records.
* Default retention of 90 days.
This commit is contained in:
parent
8da2d8df3d
commit
36a7028f19
|
@ -0,0 +1,14 @@
|
||||||
|
module Jobs
|
||||||
|
class CleanUpPostReplyKeys < Jobs::Scheduled
|
||||||
|
every 1.day
|
||||||
|
|
||||||
|
def execute(_)
|
||||||
|
return if SiteSetting.disallow_reply_by_email_after_days <= 0
|
||||||
|
|
||||||
|
PostReplyKey.where(
|
||||||
|
"created_at < ?",
|
||||||
|
SiteSetting.disallow_reply_by_email_after_days.days.ago
|
||||||
|
).delete_all
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -1565,6 +1565,7 @@ en:
|
||||||
unsubscribe_via_email_footer: "Attach an unsubscribe via email mailto: link to the footer of sent emails"
|
unsubscribe_via_email_footer: "Attach an unsubscribe via email mailto: link to the footer of sent emails"
|
||||||
|
|
||||||
delete_email_logs_after_days: "Delete email logs after (N) days. 0 to keep indefinitely"
|
delete_email_logs_after_days: "Delete email logs after (N) days. 0 to keep indefinitely"
|
||||||
|
disallow_reply_by_email_after_days: "Disallow reply by email after (N) days. 0 to keep indefinitely"
|
||||||
max_emails_per_day_per_user: "Maximum number of emails to send users per day. 0 to disable the limit"
|
max_emails_per_day_per_user: "Maximum number of emails to send users per day. 0 to disable the limit"
|
||||||
enable_staged_users: "Automatically create staged users when processing incoming emails."
|
enable_staged_users: "Automatically create staged users when processing incoming emails."
|
||||||
maximum_staged_users_per_email: "Maximum number of staged users created when processing an incoming email."
|
maximum_staged_users_per_email: "Maximum number of staged users created when processing an incoming email."
|
||||||
|
@ -2554,7 +2555,7 @@ en:
|
||||||
text_body_template: |
|
text_body_template: |
|
||||||
We're sorry, but your email message to %{destination} (titled %{former_title}) didn't work.
|
We're sorry, but your email message to %{destination} (titled %{former_title}) didn't work.
|
||||||
|
|
||||||
For security reasons we only accept replies to original notifications for 90 days. Please [visit the topic](%{short_url}) to continue the conversation.
|
For security reasons we only accept replies to original notifications for %{number_of_days} days. Please [visit the topic](%{short_url}) to continue the conversation.
|
||||||
|
|
||||||
email_reject_topic_not_found:
|
email_reject_topic_not_found:
|
||||||
title: "Email Reject Topic Not Found"
|
title: "Email Reject Topic Not Found"
|
||||||
|
|
|
@ -816,6 +816,9 @@ email:
|
||||||
default: true
|
default: true
|
||||||
unsubscribe_via_email_footer:
|
unsubscribe_via_email_footer:
|
||||||
default: false
|
default: false
|
||||||
|
disallow_reply_by_email_after_days:
|
||||||
|
default: 90
|
||||||
|
shadowed_by_global: true
|
||||||
delete_email_logs_after_days:
|
delete_email_logs_after_days:
|
||||||
default: 90
|
default: 90
|
||||||
shadowed_by_global: true
|
shadowed_by_global: true
|
||||||
|
|
|
@ -85,6 +85,7 @@ module Email
|
||||||
|
|
||||||
if message_template == :email_reject_old_destination
|
if message_template == :email_reject_old_destination
|
||||||
template_args[:short_url] = e.message
|
template_args[:short_url] = e.message
|
||||||
|
template_args[:number_of_days] = SiteSetting.disallow_reply_by_email_after_days
|
||||||
end
|
end
|
||||||
|
|
||||||
if message_template
|
if message_template
|
||||||
|
|
|
@ -171,8 +171,12 @@ module Email
|
||||||
|
|
||||||
raise first_exception if first_exception
|
raise first_exception if first_exception
|
||||||
|
|
||||||
if post = find_related_post(force: true)
|
post = find_related_post(force: true)
|
||||||
if Guardian.new(user).can_see_post?(post) && post.created_at < 90.days.ago
|
|
||||||
|
if post && Guardian.new(user).can_see_post?(post)
|
||||||
|
num_of_days = SiteSetting.disallow_reply_by_email_after_days
|
||||||
|
|
||||||
|
if num_of_days > 0 && post.created_at < num_of_days.days.ago
|
||||||
raise OldDestinationError.new("#{Discourse.base_url}/p/#{post.id}")
|
raise OldDestinationError.new("#{Discourse.base_url}/p/#{post.id}")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -161,4 +161,27 @@ describe Email::Processor do
|
||||||
expect { Email::Processor.process!(email) }.to_not change { EmailLog.count }
|
expect { Email::Processor.process!(email) }.to_not change { EmailLog.count }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe 'when replying to a post that is too old' do
|
||||||
|
let(:mail) { file_from_fixtures("old_destination.eml", "emails").read }
|
||||||
|
|
||||||
|
it 'rejects the email with the right response' do
|
||||||
|
SiteSetting.disallow_reply_by_email_after_days = 2
|
||||||
|
|
||||||
|
topic = Fabricate(:topic, id: 424242)
|
||||||
|
post = Fabricate(:post, topic: topic, id: 123456, created_at: 3.days.ago)
|
||||||
|
|
||||||
|
processor = Email::Processor.new(mail)
|
||||||
|
processor.process!
|
||||||
|
|
||||||
|
rejection_raw = ActionMailer::Base.deliveries.first.body.to_s
|
||||||
|
|
||||||
|
expect(rejection_raw).to eq(I18n.t("system_messages.email_reject_old_destination.text_body_template",
|
||||||
|
destination: '["reply+4f97315cc828096c9cb34c6f1a0d6fe8@bar.com"]',
|
||||||
|
former_title: 'Some Old Post',
|
||||||
|
short_url: "#{Discourse.base_url}/p/#{post.id}",
|
||||||
|
number_of_days: 2
|
||||||
|
))
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -79,10 +79,28 @@ describe Email::Receiver do
|
||||||
end
|
end
|
||||||
|
|
||||||
it "raises an OldDestinationError when notification is too old" do
|
it "raises an OldDestinationError when notification is too old" do
|
||||||
topic = Fabricate(:topic, id: 424242)
|
SiteSetting.disallow_reply_by_email_after_days = 2
|
||||||
post = Fabricate(:post, topic: topic, id: 123456, created_at: 1.year.ago)
|
|
||||||
|
|
||||||
expect { process(:old_destination) }.to raise_error(Email::Receiver::OldDestinationError)
|
topic = Fabricate(:topic, id: 424242)
|
||||||
|
post = Fabricate(:post, topic: topic, id: 123456)
|
||||||
|
|
||||||
|
expect { process(:old_destination) }.to raise_error(
|
||||||
|
Email::Receiver::BadDestinationAddress
|
||||||
|
)
|
||||||
|
|
||||||
|
IncomingEmail.destroy_all
|
||||||
|
post.update!(created_at: 3.days.ago)
|
||||||
|
|
||||||
|
expect { process(:old_destination) }.to raise_error(
|
||||||
|
Email::Receiver::OldDestinationError
|
||||||
|
)
|
||||||
|
|
||||||
|
SiteSetting.disallow_reply_by_email_after_days = 0
|
||||||
|
IncomingEmail.destroy_all
|
||||||
|
|
||||||
|
expect { process(:old_destination) }.to raise_error(
|
||||||
|
Email::Receiver::BadDestinationAddress
|
||||||
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
it "raises a BouncerEmailError when email is a bounced email" do
|
it "raises a BouncerEmailError when email is a bounced email" do
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
Return-Path: <staged@bar.com>
|
Return-Path: <staged@bar.com>
|
||||||
From: Foo Bar <staged@bar.com>
|
From: Foo Bar <staged@bar.com>
|
||||||
To: wat@bar.com
|
To: reply+4f97315cc828096c9cb34c6f1a0d6fe8@bar.com
|
||||||
Cc: foofoo@bar.com
|
Cc: foofoo@bar.com
|
||||||
Date: Fri, 15 Jan 2018 00:12:43 +0100
|
Date: Fri, 15 Jan 2018 00:12:43 +0100
|
||||||
Message-ID: <999@foo.bar.mail>
|
Message-ID: <999@foo.bar.mail>
|
||||||
|
@ -8,5 +8,6 @@ In-Reply-To: <topic/424242/123456@test.localhost>
|
||||||
Mime-Version: 1.0
|
Mime-Version: 1.0
|
||||||
Content-Type: text/plain
|
Content-Type: text/plain
|
||||||
Content-Transfer-Encoding: 7bit
|
Content-Transfer-Encoding: 7bit
|
||||||
|
Subject: Some Old Post
|
||||||
|
|
||||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
RSpec.describe Jobs::CleanUpPostReplyKeys do
|
||||||
|
it 'removes old post_reply_keys' do
|
||||||
|
freeze_time
|
||||||
|
|
||||||
|
reply_key1 = Fabricate(:post_reply_key, created_at: 1.day.ago)
|
||||||
|
reply_key2 = Fabricate(:post_reply_key, created_at: 2.days.ago)
|
||||||
|
Fabricate(:post_reply_key, created_at: 3.days.ago)
|
||||||
|
|
||||||
|
SiteSetting.disallow_reply_by_email_after_days = 0
|
||||||
|
|
||||||
|
expect { Jobs::CleanUpPostReplyKeys.new.execute({}) }
|
||||||
|
.to change { PostReplyKey.count }.by(0)
|
||||||
|
|
||||||
|
SiteSetting.disallow_reply_by_email_after_days = 2
|
||||||
|
|
||||||
|
expect { Jobs::CleanUpPostReplyKeys.new.execute({}) }
|
||||||
|
.to change { PostReplyKey.count }.by(-1)
|
||||||
|
|
||||||
|
expect(PostReplyKey.all).to contain_exactly(
|
||||||
|
reply_key1, reply_key2
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue