diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-01-29 18:08:47 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-01-29 18:08:47 +0000 |
commit | 6b9d3a4e8351e662c4586b24bb152de78ae9e3bf (patch) | |
tree | 883e9db60c047c54418fc1d2b1c5517f97e0f185 /app/services/spam | |
parent | 23288f62da73fb0e30d8e7ce306665e8fda1b932 (diff) | |
download | gitlab-ce-6b9d3a4e8351e662c4586b24bb152de78ae9e3bf.tar.gz |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app/services/spam')
-rw-r--r-- | app/services/spam/spam_check_service.rb | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/app/services/spam/spam_check_service.rb b/app/services/spam/spam_check_service.rb new file mode 100644 index 00000000000..d19ef03976f --- /dev/null +++ b/app/services/spam/spam_check_service.rb @@ -0,0 +1,68 @@ +# 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 |