FIX: delete staged users when the incoming email is rejected

This commit is contained in:
Gerhard Schlager 2017-10-03 17:28:41 +02:00
parent bf22a94385
commit c0bb97b5cb
7 changed files with 127 additions and 10 deletions

View File

@ -80,7 +80,10 @@ class UserDestroyer
end end
end end
StaffActionLogger.new(@actor == user ? Discourse.system_user : @actor).log_user_deletion(user, opts.slice(:context)) unless opts[:quiet]
StaffActionLogger.new(@actor == user ? Discourse.system_user : @actor).log_user_deletion(user, opts.slice(:context))
end
MessageBus.publish "/file-change", ["refresh"], user_ids: [u.id] MessageBus.publish "/file-change", ["refresh"], user_ids: [u.id]
end end
end end

View File

@ -58,6 +58,7 @@ module Email
error = e.to_s error = e.to_s
error = e.class.name if error.blank? error = e.class.name if error.blank?
@incoming_email.update_columns(error: error) if @incoming_email @incoming_email.update_columns(error: error) if @incoming_email
delete_staged_users
raise raise
end end
end end
@ -752,6 +753,12 @@ module Email
message = SubscriptionMailer.send(action, user) message = SubscriptionMailer.send(action, user)
Email::Sender.new(message, :subscription).send Email::Sender.new(message, :subscription).send
end end
def delete_staged_users
@staged_users.each do |user|
UserDestroyer.new(Discourse.system_user).destroy(user, quiet: true) if user.posts.count == 0
end
end
end end
end end

View File

@ -648,10 +648,10 @@ describe Email::Receiver do
SiteSetting.enable_staged_users = true SiteSetting.enable_staged_users = true
end end
shared_examples "no staged users" do |email_name| shared_examples "no staged users" do |email_name, expected_exception|
it "does not create staged users" do it "does not create staged users" do
staged_user_count = User.where(staged: true).count staged_user_count = User.where(staged: true).count
process(email_name) rescue nil expect { process(email_name) }.to raise_error(expected_exception)
expect(User.where(staged: true).count).to eq(staged_user_count) expect(User.where(staged: true).count).to eq(staged_user_count)
end end
end end
@ -661,23 +661,23 @@ describe Email::Receiver do
ScreenedEmail.expects(:should_block?).with("screened@mail.com").returns(true) ScreenedEmail.expects(:should_block?).with("screened@mail.com").returns(true)
end end
include_examples "no staged users", :screened_email include_examples "no staged users", :screened_email, Email::Receiver::ScreenedEmailError
end end
context "when the mail is auto generated" do context "when the mail is auto generated" do
include_examples "no staged users", :auto_generated_header include_examples "no staged users", :auto_generated_header, Email::Receiver::AutoGeneratedEmailError
end end
context "when email is a bounced email" do context "when email is a bounced email" do
include_examples "no staged users", :bounced_email include_examples "no staged users", :bounced_email, Email::Receiver::BouncedEmailError
end end
context "when the body is blank" do context "when the body is blank" do
include_examples "no staged users", :no_body include_examples "no staged users", :no_body, Email::Receiver::NoBodyDetectedError
end end
context "when unsubscribe via email is not allowed" do context "when unsubscribe via email is not allowed" do
include_examples "no staged users", :unsubscribe_new_user include_examples "no staged users", :unsubscribe_new_user, Email::Receiver::UnsubscribeNotAllowed
end end
context "when email address is not on whitelist" do context "when email address is not on whitelist" do
@ -685,7 +685,7 @@ describe Email::Receiver do
SiteSetting.email_domains_whitelist = "example.com|bar.com" SiteSetting.email_domains_whitelist = "example.com|bar.com"
end end
include_examples "no staged users", :blacklist_whitelist_email include_examples "no staged users", :blacklist_whitelist_email, Email::Receiver::EmailNotAllowed
end end
context "when email address is on blacklist" do context "when email address is on blacklist" do
@ -693,7 +693,71 @@ describe Email::Receiver do
SiteSetting.email_domains_blacklist = "email.com|mail.com" SiteSetting.email_domains_blacklist = "email.com|mail.com"
end end
include_examples "no staged users", :blacklist_whitelist_email include_examples "no staged users", :blacklist_whitelist_email, Email::Receiver::EmailNotAllowed
end
context "when destinations aren't matching any of the incoming emails" do
include_examples "no staged users", :bad_destinations, Email::Receiver::BadDestinationAddress
end
context "when email is sent to category" do
context "when email is sent by a new user and category does not allow strangers" do
let!(:category) { Fabricate(:category, email_in: "category@foo.com", email_in_allow_strangers: false) }
include_examples "no staged users", :new_user, Email::Receiver::StrangersNotAllowedError
end
context "when email has no date" do
let!(:category) { Fabricate(:category, email_in: "category@foo.com", email_in_allow_strangers: true) }
include_examples "no staged users", :no_date, Email::Receiver::InvalidPost
end
end
context "email is a reply" do
let(:reply_key) { "4f97315cc828096c9cb34c6f1a0d6fe8" }
let(:category) { Fabricate(:category) }
let(:user) { Fabricate(:user, email: "discourse@bar.com") }
let(:topic) { create_topic(category: category, user: user) }
let(:post) { create_post(topic: topic, user: user) }
let!(:email_log) { Fabricate(:email_log, reply_key: reply_key, user: user, topic: topic, post: post) }
context "when the email address isn't matching the one we sent the notification to" do
include_examples "no staged users", :reply_user_not_matching, Email::Receiver::ReplyUserNotMatchingError
end
end
context "replying without key is allowed" do
let!(:group) { Fabricate(:group, incoming_email: "team@bar.com") }
let!(:topic) do
SiteSetting.find_related_post_with_key = false
process(:email_reply_1)
Topic.last
end
context "when the topic was deleted" do
before do
topic.update_columns(deleted_at: 1.day.ago)
end
include_examples "no staged users", :email_reply_staged, Email::Receiver::TopicNotFoundError
end
context "when the topic was closed" do
before do
topic.update_columns(closed: true)
end
include_examples "no staged users", :email_reply_staged, Email::Receiver::TopicClosedError
end
context "when they aren't allowed to like a post" do
before do
topic.update_columns(archived: true)
end
include_examples "no staged users", :email_reply_like, Email::Receiver::InvalidPostAction
end
end end
end end

View File

@ -0,0 +1,13 @@
Return-Path: <four@foo.com>
From: Four <four@foo.com>
To: one@foo.com
Cc: team@bar.com
Subject: RE: Testing email threading
Date: Fri, 15 Jan 2016 00:12:43 +0100
Message-ID: <38@foo.bar.mail>
In-Reply-To: <34@foo.bar.mail>
Mime-Version: 1.0
Content-Type: text/plain
Content-Transfer-Encoding: 7bit
+1

View File

@ -0,0 +1,13 @@
Return-Path: <staged@foo.com>
From: Staged <staged@foo.com>
To: one@foo.com
Cc: team@bar.com, three@foo.com
Subject: RE: Testing email threading
Date: Fri, 15 Jan 2016 00:12:43 +0100
Message-ID: <35@foo.bar.mail>
In-Reply-To: <34@foo.bar.mail>
Mime-Version: 1.0
Content-Type: text/plain
Content-Transfer-Encoding: 7bit
This is email reply **2**.

10
spec/fixtures/emails/no_date.eml vendored Normal file
View File

@ -0,0 +1,10 @@
Return-Path: <discourse@bar.com>
From: Foo Bar <discourse@bar.com>
To: category@foo.com
Subject: This is a topic from a complete stranger
Message-ID: <31@foo.bar.mail>
Mime-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
Hey, this is a topic from a complete stranger ;)

View File

@ -45,6 +45,12 @@ describe UserDestroyer do
StaffActionLogger.any_instance.expects(:log_user_deletion).with(@user, anything).once StaffActionLogger.any_instance.expects(:log_user_deletion).with(@user, anything).once
destroy destroy
end end
it "should not log the action if quiet is true" do
expect {
UserDestroyer.new(@admin).destroy(@user, destroy_opts.merge(quiet: true))
}.to_not change { UserHistory.where(action: UserHistory.actions[:delete_user]).count }
end
end end
shared_examples "email block list" do shared_examples "email block list" do
@ -202,6 +208,7 @@ describe UserDestroyer do
# out of sync user_stat data shouldn't break UserDestroyer # out of sync user_stat data shouldn't break UserDestroyer
@user.user_stat.update_attribute(:post_count, 1) @user.user_stat.update_attribute(:post_count, 1)
end end
let(:destroy_opts) { {} }
subject(:destroy) { UserDestroyer.new(@user).destroy(@user, delete_posts: false) } subject(:destroy) { UserDestroyer.new(@user).destroy(@user, delete_posts: false) }
include_examples "successfully destroy a user" include_examples "successfully destroy a user"