summaryrefslogtreecommitdiff
path: root/app/models/concerns/spammable.rb
diff options
context:
space:
mode:
authorPatricio Cano <suprnova32@gmail.com>2016-07-28 19:02:56 -0500
committerPatricio Cano <suprnova32@gmail.com>2016-08-15 13:18:15 -0500
commit722fc84e3d4785fb3a9db5f1c7d2aabad22e8e01 (patch)
treebc87237d15d15216cb6b59af27eee36278e7b962 /app/models/concerns/spammable.rb
parent95419679f23f0628d1885dd9656cc159e9d55ea9 (diff)
downloadgitlab-ce-722fc84e3d4785fb3a9db5f1c7d2aabad22e8e01.tar.gz
Complete refactor of the `Spammable` concern and tests:
- Merged `AkismetSubmittable` into `Spammable` - Clean up `SpamCheckService` - Added tests for `Spammable` - Added submit (ham or spam) options to `AkismetHelper`
Diffstat (limited to 'app/models/concerns/spammable.rb')
-rw-r--r--app/models/concerns/spammable.rb58
1 files changed, 56 insertions, 2 deletions
diff --git a/app/models/concerns/spammable.rb b/app/models/concerns/spammable.rb
index 3b8e6df2da9..bbf6a3e0be3 100644
--- a/app/models/concerns/spammable.rb
+++ b/app/models/concerns/spammable.rb
@@ -1,16 +1,70 @@
module Spammable
extend ActiveSupport::Concern
+ include Gitlab::AkismetHelper
+
+ module ClassMethods
+ def attr_spammable(*attrs)
+ attrs.each do |attr|
+ spammable_attrs << attr.to_s
+ end
+ end
+ end
included do
+ has_one :user_agent_detail, as: :subject, dependent: :destroy
attr_accessor :spam
after_validation :check_for_spam, on: :create
+
+ cattr_accessor :spammable_attrs, instance_accessor: false do
+ []
+ end
+ end
+
+ def can_be_submitted?
+ if user_agent_detail
+ user_agent_detail.submittable?
+ else
+ false
+ end
+ end
+
+ def submit_ham
+ return unless akismet_enabled? && can_be_submitted?
+ ham!(user_agent_detail, spammable_text, creator)
+ end
+
+ def submit_spam
+ return unless akismet_enabled? && can_be_submitted?
+ spam!(user_agent_detail, spammable_text, creator)
+ end
+
+ def spam?(env, user)
+ is_spam?(env, user, spammable_text)
end
- def spam?
+ def spam_detected?
@spam
end
def check_for_spam
- self.errors.add(:base, "Your #{self.class.name.underscore} has been recognized as spam and has been discarded.") if spam?
+ self.errors.add(:base, "Your #{self.class.name.underscore} has been recognized as spam and has been discarded.") if spam_detected?
+ end
+
+ private
+
+ def spammable_text
+ result = []
+ self.class.spammable_attrs.each do |entry|
+ result << self.send(entry)
+ end
+ result.reject(&:blank?).join("\n")
+ end
+
+ def creator
+ if self.author_id
+ User.find(self.author_id)
+ elsif self.creator_id
+ User.find(self.creator_id)
+ end
end
end