Refactoring and review comments
including verifying the project_slug
This commit is contained in:
parent
54eb6260e7
commit
a4f2de7964
|
@ -11,16 +11,19 @@ module Gitlab
|
||||||
class CreateIssueHandler < BaseHandler
|
class CreateIssueHandler < BaseHandler
|
||||||
include ReplyProcessing
|
include ReplyProcessing
|
||||||
|
|
||||||
HANDLER_REGEX = /\A.+-(?<project_id>.+)-(?<incoming_email_token>.+)-issue\z/.freeze
|
HANDLER_REGEX = /\A#{HANDLER_ACTION_BASE_REGEX}-issue\z/.freeze
|
||||||
HANDLER_REGEX_LEGACY = /\A(?<project_path>[^\+]*)\+(?<incoming_email_token>.*)\z/.freeze
|
HANDLER_REGEX_LEGACY = /\A(?<project_path>[^\+]*)\+(?<incoming_email_token>.*)\z/.freeze
|
||||||
|
|
||||||
def initialize(mail, mail_key)
|
def initialize(mail, mail_key)
|
||||||
super(mail, mail_key)
|
super(mail, mail_key)
|
||||||
|
|
||||||
if matched = HANDLER_REGEX.match(mail_key.to_s)
|
if !mail_key&.include?('/') && (matched = HANDLER_REGEX.match(mail_key.to_s))
|
||||||
@project_id, @incoming_email_token = matched.captures
|
@project_slug = matched[:project_slug]
|
||||||
|
@project_id = matched[:project_id]&.to_i
|
||||||
|
@incoming_email_token = matched[:incoming_email_token]
|
||||||
elsif matched = HANDLER_REGEX_LEGACY.match(mail_key.to_s)
|
elsif matched = HANDLER_REGEX_LEGACY.match(mail_key.to_s)
|
||||||
@project_path, @incoming_email_token = matched.captures
|
@project_path = matched[:project_path]
|
||||||
|
@incoming_email_token = matched[:incoming_email_token]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -45,18 +48,8 @@ module Gitlab
|
||||||
end
|
end
|
||||||
# rubocop: enable CodeReuse/ActiveRecord
|
# rubocop: enable CodeReuse/ActiveRecord
|
||||||
|
|
||||||
def project
|
|
||||||
@project ||= if project_id
|
|
||||||
Project.find_by_id(project_id)
|
|
||||||
else
|
|
||||||
Project.find_by_full_path(project_path)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
attr_reader :project_id, :project_path, :incoming_email_token
|
|
||||||
|
|
||||||
def create_issue
|
def create_issue
|
||||||
Issues::CreateService.new(
|
Issues::CreateService.new(
|
||||||
project,
|
project,
|
||||||
|
|
|
@ -12,16 +12,19 @@ module Gitlab
|
||||||
class CreateMergeRequestHandler < BaseHandler
|
class CreateMergeRequestHandler < BaseHandler
|
||||||
include ReplyProcessing
|
include ReplyProcessing
|
||||||
|
|
||||||
HANDLER_REGEX = /\A.+-(?<project_id>.+)-(?<incoming_email_token>.+)-merge-request\z/.freeze
|
HANDLER_REGEX = /\A#{HANDLER_ACTION_BASE_REGEX}-merge-request\z/.freeze
|
||||||
HANDLER_REGEX_LEGACY = /\A(?<project_path>[^\+]*)\+merge-request\+(?<incoming_email_token>.*)/.freeze
|
HANDLER_REGEX_LEGACY = /\A(?<project_path>[^\+]*)\+merge-request\+(?<incoming_email_token>.*)/.freeze
|
||||||
|
|
||||||
def initialize(mail, mail_key)
|
def initialize(mail, mail_key)
|
||||||
super(mail, mail_key)
|
super(mail, mail_key)
|
||||||
|
|
||||||
if matched = HANDLER_REGEX.match(mail_key.to_s)
|
if !mail_key&.include?('/') && (matched = HANDLER_REGEX.match(mail_key.to_s))
|
||||||
@project_id, @incoming_email_token = matched.captures
|
@project_slug = matched[:project_slug]
|
||||||
|
@project_id = matched[:project_id]&.to_i
|
||||||
|
@incoming_email_token = matched[:incoming_email_token]
|
||||||
elsif matched = HANDLER_REGEX_LEGACY.match(mail_key.to_s)
|
elsif matched = HANDLER_REGEX_LEGACY.match(mail_key.to_s)
|
||||||
@project_path, @incoming_email_token = matched.captures
|
@project_path = matched[:project_path]
|
||||||
|
@incoming_email_token = matched[:incoming_email_token]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -47,22 +50,12 @@ module Gitlab
|
||||||
end
|
end
|
||||||
# rubocop: enable CodeReuse/ActiveRecord
|
# rubocop: enable CodeReuse/ActiveRecord
|
||||||
|
|
||||||
def project
|
|
||||||
@project ||= if project_id
|
|
||||||
Project.find_by_id(project_id)
|
|
||||||
else
|
|
||||||
Project.find_by_full_path(project_path)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def metrics_params
|
def metrics_params
|
||||||
super.merge(includes_patches: patch_attachments.any?)
|
super.merge(includes_patches: patch_attachments.any?)
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
attr_reader :project_id, :project_path, :incoming_email_token
|
|
||||||
|
|
||||||
def build_merge_request
|
def build_merge_request
|
||||||
MergeRequests::BuildService.new(project, author, merge_request_params).execute
|
MergeRequests::BuildService.new(project, author, merge_request_params).execute
|
||||||
end
|
end
|
||||||
|
|
|
@ -6,14 +6,29 @@ module Gitlab
|
||||||
module ReplyProcessing
|
module ReplyProcessing
|
||||||
private
|
private
|
||||||
|
|
||||||
|
HANDLER_ACTION_BASE_REGEX = /(?<project_slug>.+)-(?<project_id>\d+)-(?<incoming_email_token>.+)/.freeze
|
||||||
|
|
||||||
|
attr_reader :project_id, :project_slug, :project_path, :incoming_email_token
|
||||||
|
|
||||||
def author
|
def author
|
||||||
raise NotImplementedError
|
raise NotImplementedError
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# rubocop:disable Gitlab/ModuleWithInstanceVariables
|
||||||
def project
|
def project
|
||||||
raise NotImplementedError
|
return @project if instance_variable_defined?(:@project)
|
||||||
|
|
||||||
|
if project_id
|
||||||
|
@project = Project.find_by_id(project_id)
|
||||||
|
@project = nil unless valid_project_slug?(@project)
|
||||||
|
else
|
||||||
|
@project = Project.find_by_full_path(project_path)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@project
|
||||||
|
end
|
||||||
|
# rubocop:enable Gitlab/ModuleWithInstanceVariables
|
||||||
|
|
||||||
def message
|
def message
|
||||||
@message ||= process_message
|
@message ||= process_message
|
||||||
end
|
end
|
||||||
|
@ -58,6 +73,10 @@ module Gitlab
|
||||||
|
|
||||||
raise invalid_exception, msg
|
raise invalid_exception, msg
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def valid_project_slug?(found_project)
|
||||||
|
project_slug == found_project.full_path_slug
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -23,7 +23,7 @@ module Gitlab
|
||||||
end
|
end
|
||||||
|
|
||||||
def can_handle?
|
def can_handle?
|
||||||
@reply_token.present?
|
reply_token.present?
|
||||||
end
|
end
|
||||||
|
|
||||||
def execute
|
def execute
|
||||||
|
|
|
@ -27,9 +27,10 @@ describe Gitlab::Email::Handler::CreateIssueHandler do
|
||||||
let(:mail) { Mail::Message.new(email_raw) }
|
let(:mail) { Mail::Message.new(email_raw) }
|
||||||
|
|
||||||
it "matches the new format" do
|
it "matches the new format" do
|
||||||
handler = described_class.new(mail, "h5bp-html5-boilerplate-#{project.project_id}-#{user.incoming_email_token}-issue")
|
handler = described_class.new(mail, "gitlabhq-gitlabhq-#{project.project_id}-#{user.incoming_email_token}-issue")
|
||||||
|
|
||||||
expect(handler.instance_variable_get(:@project_id).to_i).to eq project.project_id
|
expect(handler.instance_variable_get(:@project_id)).to eq project.project_id
|
||||||
|
expect(handler.instance_variable_get(:@project_slug)).to eq project.full_path_slug
|
||||||
expect(handler.instance_variable_get(:@incoming_email_token)).to eq user.incoming_email_token
|
expect(handler.instance_variable_get(:@incoming_email_token)).to eq user.incoming_email_token
|
||||||
expect(handler.can_handle?).to be_truthy
|
expect(handler.can_handle?).to be_truthy
|
||||||
end
|
end
|
||||||
|
|
|
@ -31,9 +31,10 @@ describe Gitlab::Email::Handler::CreateMergeRequestHandler do
|
||||||
let(:mail) { Mail::Message.new(email_raw) }
|
let(:mail) { Mail::Message.new(email_raw) }
|
||||||
|
|
||||||
it "matches the new format" do
|
it "matches the new format" do
|
||||||
handler = described_class.new(mail, "h5bp-html5-boilerplate-#{project.project_id}-#{user.incoming_email_token}-merge-request")
|
handler = described_class.new(mail, "gitlabhq-gitlabhq-#{project.project_id}-#{user.incoming_email_token}-merge-request")
|
||||||
|
|
||||||
expect(handler.instance_variable_get(:@project_id).to_i).to eq project.project_id
|
expect(handler.instance_variable_get(:@project_id)).to eq project.project_id
|
||||||
|
expect(handler.instance_variable_get(:@project_slug)).to eq project.full_path_slug
|
||||||
expect(handler.instance_variable_get(:@incoming_email_token)).to eq user.incoming_email_token
|
expect(handler.instance_variable_get(:@incoming_email_token)).to eq user.incoming_email_token
|
||||||
expect(handler.can_handle?).to be_truthy
|
expect(handler.can_handle?).to be_truthy
|
||||||
end
|
end
|
||||||
|
|
|
@ -19,7 +19,7 @@ describe Gitlab::Email::Handler do
|
||||||
|
|
||||||
describe 'regexps are set properly' do
|
describe 'regexps are set properly' do
|
||||||
let(:addresses) do
|
let(:addresses) do
|
||||||
%W(sent_notification_key#{Gitlab::IncomingEmail::UNSUBSCRIBE_SUFFIX} sent_notification_key path-to-project-project_id-user_email_token-merge-request path-to-project-user_email_token-issue) +
|
%W(sent_notification_key#{Gitlab::IncomingEmail::UNSUBSCRIBE_SUFFIX} sent_notification_key path-to-project-123-user_email_token-merge-request path-to-project-123-user_email_token-issue) +
|
||||||
%W(sent_notification_key#{Gitlab::IncomingEmail::UNSUBSCRIBE_SUFFIX_LEGACY} sent_notification_key path/to/project+merge-request+user_email_token path/to/project+user_email_token)
|
%W(sent_notification_key#{Gitlab::IncomingEmail::UNSUBSCRIBE_SUFFIX_LEGACY} sent_notification_key path/to/project+merge-request+user_email_token path/to/project+user_email_token)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue