summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorPatricio Cano <suprnova32@gmail.com>2016-07-27 19:03:06 -0500
committerPatricio Cano <suprnova32@gmail.com>2016-08-15 13:17:58 -0500
commit95419679f23f0628d1885dd9656cc159e9d55ea9 (patch)
tree4ec924b2f7dfbfd9e0390065d430c9daff8984bb /app
parent640e485c6aa19f8fca1be7fc45e7f65da4469fbd (diff)
downloadgitlab-ce-95419679f23f0628d1885dd9656cc159e9d55ea9.tar.gz
Lay the ground works to submit information to Akismet
- New concern `AkismetSubmittable` to allow issues and other `Spammable` models to be submitted to Akismet. - New model `UserAgentDetail` to store information needed for Akismet. - Services needed for their creation and tests.
Diffstat (limited to 'app')
-rw-r--r--app/models/concerns/akismet_submittable.rb15
-rw-r--r--app/models/issue.rb1
-rw-r--r--app/models/user_agent_detail.rb16
-rw-r--r--app/services/issues/create_service.rb5
-rw-r--r--app/services/user_agent_detail_service.rb12
5 files changed, 49 insertions, 0 deletions
diff --git a/app/models/concerns/akismet_submittable.rb b/app/models/concerns/akismet_submittable.rb
new file mode 100644
index 00000000000..17821688941
--- /dev/null
+++ b/app/models/concerns/akismet_submittable.rb
@@ -0,0 +1,15 @@
+module AkismetSubmittable
+ extend ActiveSupport::Concern
+
+ included do
+ has_one :user_agent_detail, as: :subject
+ end
+
+ def can_be_submitted?
+ if user_agent_detail
+ user_agent_detail.submittable?
+ else
+ false
+ end
+ end
+end
diff --git a/app/models/issue.rb b/app/models/issue.rb
index d62ffb21467..6c2635498e5 100644
--- a/app/models/issue.rb
+++ b/app/models/issue.rb
@@ -8,6 +8,7 @@ class Issue < ActiveRecord::Base
include Taskable
include Spammable
include FasterCacheKeys
+ include AkismetSubmittable
DueDateStruct = Struct.new(:title, :name).freeze
NoDueDate = DueDateStruct.new('No Due Date', '0').freeze
diff --git a/app/models/user_agent_detail.rb b/app/models/user_agent_detail.rb
new file mode 100644
index 00000000000..6d76dff20e3
--- /dev/null
+++ b/app/models/user_agent_detail.rb
@@ -0,0 +1,16 @@
+class UserAgentDetail < ActiveRecord::Base
+ belongs_to :subject, polymorphic: true
+
+ validates :user_agent,
+ presence: true
+ validates :ip_address,
+ presence: true
+ validates :subject_id,
+ presence: true
+ validates :subject_type,
+ presence: true
+
+ def submittable?
+ user_agent.present? && ip_address.present?
+ end
+end
diff --git a/app/services/issues/create_service.rb b/app/services/issues/create_service.rb
index 5e2de2ccf64..8e9d74103c7 100644
--- a/app/services/issues/create_service.rb
+++ b/app/services/issues/create_service.rb
@@ -15,6 +15,7 @@ module Issues
notification_service.new_issue(issue, current_user)
todo_service.new_issue(issue, current_user)
event_service.open_issue(issue, current_user)
+ user_agent_detail_service(issue, request).create
issue.create_cross_references!(current_user)
execute_hooks(issue, 'open')
end
@@ -27,5 +28,9 @@ module Issues
def spam_check_service
SpamCheckService.new(project, current_user, params)
end
+
+ def user_agent_detail_service(issue, request)
+ UserAgentDetailService.new(issue, request)
+ end
end
end
diff --git a/app/services/user_agent_detail_service.rb b/app/services/user_agent_detail_service.rb
new file mode 100644
index 00000000000..dd995955be3
--- /dev/null
+++ b/app/services/user_agent_detail_service.rb
@@ -0,0 +1,12 @@
+class UserAgentDetailService
+ attr_accessor :subject, :request
+
+ def initialize(subject, request)
+ @subject, @request = subject, request
+ end
+
+ def create
+ return unless request
+ subject.create_user_agent_detail(user_agent: request.env['HTTP_USER_AGENT'], ip_address: request.env['action_dispatch.remote_ip'].to_s)
+ end
+end