From 8156475ea501221c3ba1bf3280e8368b354839bc Mon Sep 17 00:00:00 2001 From: Lin Jen-Shin <godfat@godfat.org> Date: Thu, 7 Apr 2016 05:27:28 +0800 Subject: [PATCH] Report better errors. TODO: Enable skipped test --- app/workers/email_receiver_worker.rb | 2 ++ lib/gitlab/email/receiver.rb | 11 +++++++++-- spec/lib/gitlab/email/receiver_spec.rb | 25 ++++++++++++++++++++----- 3 files changed, 31 insertions(+), 7 deletions(-) diff --git a/app/workers/email_receiver_worker.rb b/app/workers/email_receiver_worker.rb index 64105dbc01d..544b23da85e 100644 --- a/app/workers/email_receiver_worker.rb +++ b/app/workers/email_receiver_worker.rb @@ -26,6 +26,8 @@ class EmailReceiverWorker case e when Gitlab::Email::Receiver::SentNotificationNotFoundError reason = "We couldn't figure out what the email is in reply to. Please create your comment through the web interface." + when Gitlab::Email::Receiver::ProjectNotFound + reason = "We couldn't find the project. Please check if there's any typo." when Gitlab::Email::Receiver::EmptyEmailError can_retry = true reason = "It appears that the email is blank. Make sure your reply is at the top of the email, we can't process inline replies." diff --git a/lib/gitlab/email/receiver.rb b/lib/gitlab/email/receiver.rb index 471d10a11a6..50c16da4ef6 100644 --- a/lib/gitlab/email/receiver.rb +++ b/lib/gitlab/email/receiver.rb @@ -5,6 +5,7 @@ module Gitlab class ProcessingError < StandardError; end class EmailUnparsableError < ProcessingError; end class SentNotificationNotFoundError < ProcessingError; end + class ProjectNotFound < ProcessingError; end class EmptyEmailError < ProcessingError; end class AutoGeneratedEmailError < ProcessingError; end class UserNotFoundError < ProcessingError; end @@ -25,10 +26,16 @@ module Gitlab process_create_note elsif message_project - process_create_issue + if message_sender.can?(:read_project, message_project) + process_create_issue + else # Must be private project without access + raise ProjectNotFound + end + elsif reply_key =~ %r{/|\+} + # Sent Notification reply_key would not have / or + + raise ProjectNotFound else - # TODO: could also be project not found raise SentNotificationNotFoundError end end diff --git a/spec/lib/gitlab/email/receiver_spec.rb b/spec/lib/gitlab/email/receiver_spec.rb index d1b52b9d086..c0fc18a9f83 100644 --- a/spec/lib/gitlab/email/receiver_spec.rb +++ b/spec/lib/gitlab/email/receiver_spec.rb @@ -210,10 +210,12 @@ describe Gitlab::Email::Receiver, lib: true do end context "something is wrong" do + before do + project + end + context "when the issue could not be saved" do before do - project - allow_any_instance_of(Issue).to receive(:persisted?).and_return(false) end @@ -225,11 +227,24 @@ describe Gitlab::Email::Receiver, lib: true do context "when the authentication_token token didn't match" do let!(:email_raw) { fixture_file("emails/wrong_authentication_token.eml") } - before do - project + it "raises an UserNotAuthorizedError" do + expect { receiver.execute }.to raise_error(Gitlab::Email::Receiver::UserNotAuthorizedError) end + end + + context "when project is private" do + let(:project) { create(:project, :private, namespace: namespace) } + + it "raises a ProjectNotFound if the user is not a member" do + expect { receiver.execute }.to raise_error(Gitlab::Email::Receiver::ProjectNotFound) + end + + it "raises a UserNotAuthorizedError if the user has no sufficient permission" do + skip("Find a role which can :read_project but can't :create_issue") + + project.update(group: create(:group)) + project.group.add_guest(user) - it "raises an UserNotAuthorizedError" do expect { receiver.execute }.to raise_error(Gitlab::Email::Receiver::UserNotAuthorizedError) end end -- GitLab