Commit 95419679 authored by Patricio Cano's avatar Patricio Cano

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.
parent 640e485c
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
...@@ -8,6 +8,7 @@ class Issue < ActiveRecord::Base ...@@ -8,6 +8,7 @@ class Issue < ActiveRecord::Base
include Taskable include Taskable
include Spammable include Spammable
include FasterCacheKeys include FasterCacheKeys
include AkismetSubmittable
DueDateStruct = Struct.new(:title, :name).freeze DueDateStruct = Struct.new(:title, :name).freeze
NoDueDate = DueDateStruct.new('No Due Date', '0').freeze NoDueDate = DueDateStruct.new('No Due Date', '0').freeze
......
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
...@@ -15,6 +15,7 @@ module Issues ...@@ -15,6 +15,7 @@ module Issues
notification_service.new_issue(issue, current_user) notification_service.new_issue(issue, current_user)
todo_service.new_issue(issue, current_user) todo_service.new_issue(issue, current_user)
event_service.open_issue(issue, current_user) event_service.open_issue(issue, current_user)
user_agent_detail_service(issue, request).create
issue.create_cross_references!(current_user) issue.create_cross_references!(current_user)
execute_hooks(issue, 'open') execute_hooks(issue, 'open')
end end
...@@ -27,5 +28,9 @@ module Issues ...@@ -27,5 +28,9 @@ module Issues
def spam_check_service def spam_check_service
SpamCheckService.new(project, current_user, params) SpamCheckService.new(project, current_user, params)
end end
def user_agent_detail_service(issue, request)
UserAgentDetailService.new(issue, request)
end
end end
end end
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
class CreateUserAgentDetails < ActiveRecord::Migration
def change
create_table :user_agent_details do |t|
t.string :user_agent, null: false
t.string :ip_address, null: false
t.integer :subject_id, null: false
t.string :subject_type, null: false
t.timestamps null: false
end
end
end
...@@ -999,6 +999,15 @@ ActiveRecord::Schema.define(version: 20160810142633) do ...@@ -999,6 +999,15 @@ ActiveRecord::Schema.define(version: 20160810142633) do
add_index "u2f_registrations", ["key_handle"], name: "index_u2f_registrations_on_key_handle", using: :btree add_index "u2f_registrations", ["key_handle"], name: "index_u2f_registrations_on_key_handle", using: :btree
add_index "u2f_registrations", ["user_id"], name: "index_u2f_registrations_on_user_id", using: :btree add_index "u2f_registrations", ["user_id"], name: "index_u2f_registrations_on_user_id", using: :btree
create_table "user_agent_details", force: :cascade do |t|
t.string "user_agent", null: false
t.string "ip_address", null: false
t.integer "subject_id", null: false
t.string "subject_type", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "users", force: :cascade do |t| create_table "users", force: :cascade do |t|
t.string "email", default: "", null: false t.string "email", default: "", null: false
t.string "encrypted_password", default: "", null: false t.string "encrypted_password", default: "", null: false
......
...@@ -300,6 +300,26 @@ describe Projects::IssuesController do ...@@ -300,6 +300,26 @@ describe Projects::IssuesController do
expect(spam_logs[0].title).to eq('Spam Title') expect(spam_logs[0].title).to eq('Spam Title')
end end
end end
context 'user agent details are saved' do
before do
request.env['action_dispatch.remote_ip'] = '127.0.0.1'
end
def post_new_issue
sign_in(user)
project = create(:empty_project, :public)
post :create, {
namespace_id: project.namespace.to_param,
project_id: project.to_param,
issue: { title: 'Title', description: 'Description' }
}
end
it 'creates a user agent detail' do
expect{ post_new_issue }.to change(UserAgentDetail, :count)
end
end
end end
describe "DELETE #destroy" do describe "DELETE #destroy" do
......
FactoryGirl.define do
factory :user_agent_detail do
ip_address '127.0.0.1'
user_agent 'AppleWebKit/537.36'
trait :on_issue do
association :subject, factory: :issue
end
end
end
require 'rails_helper'
describe UserAgentDetail, type: :model do
describe '.submittable?' do
it 'should be submittable' do
detail = create(:user_agent_detail, :on_issue)
expect(detail.submittable?).to be_truthy
end
end
describe '.valid?' do
it 'should be valid with a subject' do
detail = create(:user_agent_detail, :on_issue)
expect(detail).to be_valid
end
it 'should not be valid without a subject' do
detail = build(:user_agent_detail)
expect(detail).not_to be_valid
end
end
end
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