summaryrefslogtreecommitdiff
path: root/app/services
diff options
context:
space:
mode:
authorPatricio Cano <suprnova32@gmail.com>2016-08-09 12:43:47 -0500
committerPatricio Cano <suprnova32@gmail.com>2016-08-15 17:20:57 -0500
commit5994c11910822463faeabb7b5f11d6529036db9d (patch)
treea80a8ffea4d4ef868790aab627abfcaa1c982d10 /app/services
parent43e756d4eafd79f4d2f366b646ebb94af78b5a4c (diff)
downloadgitlab-ce-5994c11910822463faeabb7b5f11d6529036db9d.tar.gz
Further refactor and syntax fixes.
Diffstat (limited to 'app/services')
-rw-r--r--app/services/akismet_service.rb59
-rw-r--r--app/services/ham_service.rb26
-rw-r--r--app/services/issues/create_service.rb4
-rw-r--r--app/services/spam_service.rb76
-rw-r--r--app/services/system_note_service.rb17
-rw-r--r--app/services/user_agent_detail_service.rb1
6 files changed, 104 insertions, 79 deletions
diff --git a/app/services/akismet_service.rb b/app/services/akismet_service.rb
index c09663bce85..5c60addbe7c 100644
--- a/app/services/akismet_service.rb
+++ b/app/services/akismet_service.rb
@@ -1,33 +1,26 @@
class AkismetService
- attr_accessor :spammable
+ attr_accessor :owner, :text, :options
- def initialize(spammable)
- @spammable = spammable
+ def initialize(owner, text, options = {})
+ @owner = owner
+ @text = text
+ @options = options
end
- def client_ip(env)
- env['action_dispatch.remote_ip'].to_s
- end
-
- def user_agent(env)
- env['HTTP_USER_AGENT']
- end
-
- def is_spam?(environment)
- ip_address = client_ip(environment)
- user_agent = user_agent(environment)
+ def is_spam?
+ return false unless akismet_enabled?
params = {
type: 'comment',
- text: spammable.spammable_text,
+ text: text,
created_at: DateTime.now,
- author: spammable.owner.name,
- author_email: spammable.owner.email,
- referrer: environment['HTTP_REFERER'],
+ author: owner.name,
+ author_email: owner.email,
+ referrer: options[:referrer],
}
begin
- is_spam, is_blatant = akismet_client.check(ip_address, user_agent, params)
+ is_spam, is_blatant = akismet_client.check(options[:ip_address], options[:user_agent], params)
is_spam || is_blatant
rescue => e
Rails.logger.error("Unable to connect to Akismet: #{e}, skipping check")
@@ -35,16 +28,18 @@ class AkismetService
end
end
- def ham!
+ def submit_ham
+ return false unless akismet_enabled?
+
params = {
type: 'comment',
- text: spammable.text,
- author: spammable.user.name,
- author_email: spammable.user.email
+ text: text,
+ author: owner.name,
+ author_email: owner.email
}
begin
- akismet_client.submit_ham(spammable.source_ip, spammable.user_agent, params)
+ akismet_client.submit_ham(options[:ip_address], options[:user_agent], params)
true
rescue => e
Rails.logger.error("Unable to connect to Akismet: #{e}, skipping!")
@@ -52,16 +47,18 @@ class AkismetService
end
end
- def spam!
+ def submit_spam
+ return false unless akismet_enabled?
+
params = {
type: 'comment',
- text: spammable.spammable_text,
- author: spammable.owner.name,
- author_email: spammable.owner.email
+ text: text,
+ author: owner.name,
+ author_email: owner.email
}
begin
- akismet_client.submit_spam(spammable.user_agent_detail.ip_address, spammable.user_agent_detail.user_agent, params)
+ akismet_client.submit_spam(options[:ip_address], options[:user_agent], params)
true
rescue => e
Rails.logger.error("Unable to connect to Akismet: #{e}, skipping!")
@@ -75,4 +72,8 @@ class AkismetService
@akismet_client ||= ::Akismet::Client.new(current_application_settings.akismet_api_key,
Gitlab.config.gitlab.url)
end
+
+ def akismet_enabled?
+ current_application_settings.akismet_enabled
+ end
end
diff --git a/app/services/ham_service.rb b/app/services/ham_service.rb
new file mode 100644
index 00000000000..b0e1799b489
--- /dev/null
+++ b/app/services/ham_service.rb
@@ -0,0 +1,26 @@
+class HamService
+ attr_accessor :spam_log
+
+ def initialize(spam_log)
+ @spam_log = spam_log
+ end
+
+ def mark_as_ham!
+ if akismet.submit_ham
+ spam_log.update_attribute(:submitted_as_ham, true)
+ else
+ false
+ end
+ end
+
+ private
+
+ def akismet
+ @akismet ||= AkismetService.new(
+ spam_log.user,
+ spam_log.text,
+ ip_address: spam_log.source_ip,
+ user_agent: spam_log.user_agent
+ )
+ end
+end
diff --git a/app/services/issues/create_service.rb b/app/services/issues/create_service.rb
index 67125d5c0e4..65550ab8ec6 100644
--- a/app/services/issues/create_service.rb
+++ b/app/services/issues/create_service.rb
@@ -8,7 +8,7 @@ module Issues
@issue = project.issues.new(params)
@issue.author = params[:author] || current_user
- @issue.spam = spam_service.check(@api, @request)
+ @issue.spam = spam_service.check(@api)
if @issue.save
@issue.update_attributes(label_ids: label_params)
@@ -26,7 +26,7 @@ module Issues
private
def spam_service
- SpamService.new(@issue)
+ SpamService.new(@issue, @request)
end
def user_agent_detail_service
diff --git a/app/services/spam_service.rb b/app/services/spam_service.rb
index ad60de368aa..48903291799 100644
--- a/app/services/spam_service.rb
+++ b/app/services/spam_service.rb
@@ -1,61 +1,75 @@
class SpamService
- attr_accessor :spammable
+ attr_accessor :spammable, :request, :options
- def initialize(spammable)
+ def initialize(spammable, request = nil)
@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 check(api, request)
- return false unless request && spammable.check_for_spam?
- return false unless akismet.is_spam?(request.env)
+ def check(api = false)
+ return false unless request && check_for_spam?
- create_spam_log(api, request)
+ return false unless akismet.is_spam?
+
+ create_spam_log(api)
true
end
- def mark_as_spam!(current_user)
- return false unless akismet_enabled? && spammable.can_be_submitted?
- if akismet.spam!
- spammable.user_agent_detail.update_attribute(:submitted, true)
+ def mark_as_spam!
+ return false unless spammable.submittable_as_spam?
- if spammable.is_a?(Issuable)
- SystemNoteService.submit_spam(spammable, spammable.project, current_user)
- end
- true
+ if akismet.submit_spam
+ spammable.user_agent_detail.update_attribute(:submitted, true)
else
false
end
end
- def mark_as_ham!
- return false unless spammable.is_a?(SpamLog)
+ private
- if akismet.ham!
- spammable.update_attribute(:submitted_as_ham, true)
- true
- else
- false
- end
+ def akismet
+ @akismet ||= AkismetService.new(
+ spammable_owner,
+ spammable.spammable_text,
+ options
+ )
end
- private
+ def spammable_owner
+ @user ||= User.find(spammable_owner_id)
+ end
- def akismet
- @akismet ||= AkismetService.new(spammable)
+ def spammable_owner_id
+ @owner_id ||=
+ if spammable.respond_to?(:author_id)
+ spammable.author_id
+ elsif spammable.respond_to?(:creator_id)
+ spammable.creator_id
+ end
end
- def akismet_enabled?
- current_application_settings.akismet_enabled
+ def check_for_spam?
+ spammable.check_for_spam?
end
- def create_spam_log(api, request)
+ def create_spam_log(api)
SpamLog.create(
{
- user_id: spammable.owner_id,
+ user_id: spammable_owner_id,
title: spammable.spam_title,
description: spammable.spam_description,
- source_ip: akismet.client_ip(request.env),
- user_agent: akismet.user_agent(request.env),
+ source_ip: options[:ip_address],
+ user_agent: options[:user_agent],
noteable_type: spammable.class.to_s,
via_api: api
}
diff --git a/app/services/system_note_service.rb b/app/services/system_note_service.rb
index 35c9ce909e6..e13dc9265b8 100644
--- a/app/services/system_note_service.rb
+++ b/app/services/system_note_service.rb
@@ -395,23 +395,6 @@ module SystemNoteService
create_note(noteable: noteable, project: project, author: author, note: body)
end
- # Called when Issuable is submitted as spam
- #
- # noteable - Noteable object
- # project - Project owning noteable
- # author - User performing the change
- #
- # Example Note text:
- #
- # "Issue submitted as spam."
- #
- # Returns the created Note object
- def submit_spam(noteable, project, author)
- body = "Submitted this #{noteable.class.to_s.downcase} as spam"
-
- create_note(noteable: noteable, project: project, author: author, note: body)
- end
-
private
def notes_for_mentioner(mentioner, noteable, notes)
diff --git a/app/services/user_agent_detail_service.rb b/app/services/user_agent_detail_service.rb
index c07e2ca12a6..a1ee3df5fe1 100644
--- a/app/services/user_agent_detail_service.rb
+++ b/app/services/user_agent_detail_service.rb
@@ -7,6 +7,7 @@ class UserAgentDetailService
def create
return unless request
+
spammable.create_user_agent_detail(user_agent: request.env['HTTP_USER_AGENT'], ip_address: request.env['action_dispatch.remote_ip'].to_s)
end
end