summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatricio Cano <suprnova32@gmail.com>2016-07-20 20:15:17 -0500
committerPatricio Cano <suprnova32@gmail.com>2016-07-26 15:18:07 -0500
commit8f04cf0eadbcde7fc5d1c970741e30ca8b97967d (patch)
tree4eac04baa5093bc4fd97691e2d6219d09810b55f
parentf7807c5b68b59f6a5b984ee64a6c82a3bd993d92 (diff)
downloadgitlab-ce-8f04cf0eadbcde7fc5d1c970741e30ca8b97967d.tar.gz
Refactor `SpamCheckService` to make it cleaner and clearer.
-rw-r--r--CHANGELOG1
-rw-r--r--app/controllers/projects/issues_controller.rb8
-rw-r--r--app/services/issues/create_service.rb5
-rw-r--r--app/services/issues/spam_check_service.rb25
-rw-r--r--app/services/spam_check_service.rb28
-rw-r--r--lib/api/issues.rb10
6 files changed, 38 insertions, 39 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 27e68431488..6a5b887b16e 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -93,7 +93,6 @@ v 8.10.0
- Fix viewing notification settings when a project is pending deletion
- Updated compare dropdown menus to use GL dropdown
- Redirects back to issue after clicking login link
- - Submit issues created via the WebUI by non project members to Akismet !5333
- All created issues, API or WebUI, can be submitted to Akismet for spam check !5333
- Eager load award emoji on notes
- Allow to define manual actions/builds on Pipelines and Environments
diff --git a/app/controllers/projects/issues_controller.rb b/app/controllers/projects/issues_controller.rb
index b527dd0f4f2..f11e3fac959 100644
--- a/app/controllers/projects/issues_controller.rb
+++ b/app/controllers/projects/issues_controller.rb
@@ -81,15 +81,9 @@ class Projects::IssuesController < Projects::ApplicationController
def create
@issue = Issues::CreateService.new(project, current_user, issue_params.merge({ request: request })).execute
- if @issue.nil?
- @issue = @project.issues.new
- flash[:notice] = 'Your issue has been recognized as spam and has been discarded.'
- render :new and return
- end
-
respond_to do |format|
format.html do
- if @issue.valid?
+ if @issue.errors.empty? && @issue.valid?
redirect_to issue_path(@issue)
else
render :new
diff --git a/app/services/issues/create_service.rb b/app/services/issues/create_service.rb
index 496ea5a86a2..1085a1b93b8 100644
--- a/app/services/issues/create_service.rb
+++ b/app/services/issues/create_service.rb
@@ -6,8 +6,9 @@ module Issues
issue = project.issues.new(params.except(:label_ids, :request))
issue.author = params[:author] || current_user
- if Issues::SpamCheckService.new(project, current_user, params).spam_detected?
- return nil
+ if SpamCheckService.new(project, current_user, params).spam_detected?
+ issue.errors.add(:base, 'Your issue has been recognized as spam and has been discarded.')
+ return issue
end
if issue.save
diff --git a/app/services/issues/spam_check_service.rb b/app/services/issues/spam_check_service.rb
deleted file mode 100644
index b8d4e37faf5..00000000000
--- a/app/services/issues/spam_check_service.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-module Issues
- class SpamCheckService < BaseService
- include Gitlab::AkismetHelper
-
- def spam_detected?
- text = [params[:title], params[:description]].reject(&:blank?).join("\n")
- request = params[:request]
-
- if request
- if check_for_spam?(project) && is_spam?(request.env, current_user, text)
- attrs = {
- user_id: current_user.id,
- project_id: project.id,
- title: params[:title],
- description: params[:description]
- }
- create_spam_log(project, current_user, attrs, request.env, api: false)
- return true
- end
- end
-
- false
- end
- end
-end
diff --git a/app/services/spam_check_service.rb b/app/services/spam_check_service.rb
new file mode 100644
index 00000000000..6768047aa63
--- /dev/null
+++ b/app/services/spam_check_service.rb
@@ -0,0 +1,28 @@
+class SpamCheckService
+ include Gitlab::AkismetHelper
+
+ attr_accessor :subject, :current_user, :params
+
+ def initialize(subject, user, params = {})
+ @subject, @current_user, @params = subject, user, params.dup
+ end
+
+ def spam_detected?
+ request = params[:request]
+ return false unless request || check_for_spam?(subject)
+
+ text = [params[:title], params[:description]].reject(&:blank?).join("\n")
+
+ return false unless is_spam?(request.env, current_user, text)
+
+ attrs = {
+ user_id: current_user.id,
+ project_id: subject.id,
+ title: params[:title],
+ description: params[:description]
+ }
+ create_spam_log(subject, current_user, attrs, request.env, api: false)
+
+ true
+ end
+end
diff --git a/lib/api/issues.rb b/lib/api/issues.rb
index 787d416b960..21b9eb367e7 100644
--- a/lib/api/issues.rb
+++ b/lib/api/issues.rb
@@ -160,11 +160,13 @@ module API
issue = ::Issues::CreateService.new(project, current_user, attrs.merge({ request: request })).execute
- if issue.nil?
- render_api_error!({ error: 'Spam detected' }, 400)
- end
-
if issue.valid?
+ # Need to check if id is nil here, because if issue is spam, errors
+ # get added, but Rails still thinks it's valid, but it is never saved
+ # so id will be nil
+ if issue.id.nil?
+ render_api_error!({ error: 'Spam detected' }, 400)
+ end
# Find or create labels and attach to issue. Labels are valid because
# we already checked its name, so there can't be an error here
if params[:labels].present?