Commit a033ad83 authored by Stan Hu's avatar Stan Hu

Merge branch 'cablett-organise-spam-code' into 'master'

Move SpamCheckService into spam folder

See merge request gitlab-org/gitlab!23915
parents fd4034b4 b5976140
...@@ -23,7 +23,7 @@ module SpamCheckMethods ...@@ -23,7 +23,7 @@ module SpamCheckMethods
# attribute values. # attribute values.
# rubocop:disable Gitlab/ModuleWithInstanceVariables # rubocop:disable Gitlab/ModuleWithInstanceVariables
def spam_check(spammable, user) def spam_check(spammable, user)
SpamCheckService.new( Spam::SpamCheckService.new(
spammable: spammable, spammable: spammable,
request: @request request: @request
).execute( ).execute(
......
# frozen_string_literal: true
module Spam
class SpamCheckService
include AkismetMethods
attr_accessor :spammable, :request, :options
attr_reader :spam_log
def initialize(spammable:, request:)
@spammable = spammable
@request = request
@options = {}
if @request
@options[:ip_address] = @request.env['action_dispatch.remote_ip'].to_s
@options[:user_agent] = @request.env['HTTP_USER_AGENT']
@options[:referrer] = @request.env['HTTP_REFERRER']
else
@options[:ip_address] = @spammable.ip_address
@options[:user_agent] = @spammable.user_agent
end
end
def execute(api: false, recaptcha_verified:, spam_log_id:, user_id:)
if recaptcha_verified
# If it's a request which is already verified through recaptcha,
# update the spam log accordingly.
SpamLog.verify_recaptcha!(user_id: user_id, id: spam_log_id)
else
# Otherwise, it goes to Akismet for spam check.
# If so, it assigns spammable object as "spam" and creates a SpamLog record.
possible_spam = check(api)
spammable.spam = possible_spam unless spammable.allow_possible_spam?
spammable.spam_log = spam_log
end
end
private
def check(api)
return unless request
return unless check_for_spam?
return unless akismet.spam?
create_spam_log(api)
true
end
def check_for_spam?
spammable.check_for_spam?
end
def create_spam_log(api)
@spam_log = SpamLog.create!(
{
user_id: spammable.author_id,
title: spammable.spam_title,
description: spammable.spam_description,
source_ip: options[:ip_address],
user_agent: options[:user_agent],
noteable_type: spammable.class.to_s,
via_api: api
}
)
end
end
end
# frozen_string_literal: true
class SpamCheckService
include AkismetMethods
attr_accessor :spammable, :request, :options
attr_reader :spam_log
def initialize(spammable:, request:)
@spammable = spammable
@request = request
@options = {}
if @request
@options[:ip_address] = @request.env['action_dispatch.remote_ip'].to_s
@options[:user_agent] = @request.env['HTTP_USER_AGENT']
@options[:referrer] = @request.env['HTTP_REFERRER']
else
@options[:ip_address] = @spammable.ip_address
@options[:user_agent] = @spammable.user_agent
end
end
def execute(api: false, recaptcha_verified:, spam_log_id:, user_id:)
if recaptcha_verified
# If it's a request which is already verified through recaptcha,
# update the spam log accordingly.
SpamLog.verify_recaptcha!(user_id: user_id, id: spam_log_id)
else
# Otherwise, it goes to Akismet for spam check.
# If so, it assigns spammable object as "spam" and creates a SpamLog record.
possible_spam = check(api)
spammable.spam = possible_spam unless spammable.allow_possible_spam?
spammable.spam_log = spam_log
end
end
private
def check(api)
return unless request
return unless check_for_spam?
return unless akismet.spam?
create_spam_log(api)
true
end
def check_for_spam?
spammable.check_for_spam?
end
def create_spam_log(api)
@spam_log = SpamLog.create!(
{
user_id: spammable.author_id,
title: spammable.spam_title,
description: spammable.spam_description,
source_ip: options[:ip_address],
user_agent: options[:user_agent],
noteable_type: spammable.class.to_s,
via_api: api
}
)
end
end
...@@ -389,7 +389,7 @@ describe API::Issues do ...@@ -389,7 +389,7 @@ describe API::Issues do
end end
before do before do
expect_next_instance_of(SpamCheckService) do |spam_service| expect_next_instance_of(Spam::SpamCheckService) do |spam_service|
expect(spam_service).to receive_messages(check_for_spam?: true) expect(spam_service).to receive_messages(check_for_spam?: true)
end end
expect_next_instance_of(AkismetService) do |akismet_service| expect_next_instance_of(AkismetService) do |akismet_service|
......
...@@ -194,7 +194,7 @@ describe API::Issues do ...@@ -194,7 +194,7 @@ describe API::Issues do
end end
before do before do
expect_next_instance_of(SpamCheckService) do |spam_service| expect_next_instance_of(Spam::SpamCheckService) do |spam_service|
expect(spam_service).to receive_messages(check_for_spam?: true) expect(spam_service).to receive_messages(check_for_spam?: true)
end end
expect_next_instance_of(AkismetService) do |akismet_service| expect_next_instance_of(AkismetService) do |akismet_service|
......
...@@ -385,7 +385,7 @@ describe Issues::CreateService do ...@@ -385,7 +385,7 @@ describe Issues::CreateService do
context 'when recaptcha was not verified' do context 'when recaptcha was not verified' do
before do before do
expect_next_instance_of(SpamCheckService) do |spam_service| expect_next_instance_of(Spam::SpamCheckService) do |spam_service|
expect(spam_service).to receive_messages(check_for_spam?: true) expect(spam_service).to receive_messages(check_for_spam?: true)
end end
end end
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
require 'spec_helper' require 'spec_helper'
describe SpamCheckService do describe Spam::SpamCheckService do
let(:fake_ip) { '1.2.3.4' } let(:fake_ip) { '1.2.3.4' }
let(:fake_user_agent) { 'fake-user-agent' } let(:fake_user_agent) { 'fake-user-agent' }
let(:fake_referrer) { 'fake-http-referrer' } let(:fake_referrer) { 'fake-http-referrer' }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment