2016-07-21 19:11:53 -04:00
|
|
|
module Spammable
|
|
|
|
extend ActiveSupport::Concern
|
2016-07-28 20:02:56 -04:00
|
|
|
include Gitlab::AkismetHelper
|
|
|
|
|
|
|
|
module ClassMethods
|
|
|
|
def attr_spammable(*attrs)
|
|
|
|
attrs.each do |attr|
|
|
|
|
spammable_attrs << attr.to_s
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2016-07-21 19:11:53 -04:00
|
|
|
|
|
|
|
included do
|
2016-07-28 20:02:56 -04:00
|
|
|
has_one :user_agent_detail, as: :subject, dependent: :destroy
|
2016-07-21 19:11:53 -04:00
|
|
|
attr_accessor :spam
|
|
|
|
after_validation :check_for_spam, on: :create
|
2016-07-28 20:02:56 -04:00
|
|
|
|
|
|
|
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)
|
2016-07-21 19:11:53 -04:00
|
|
|
end
|
|
|
|
|
2016-07-28 20:02:56 -04:00
|
|
|
def spam_detected?
|
2016-07-21 19:11:53 -04:00
|
|
|
@spam
|
|
|
|
end
|
|
|
|
|
|
|
|
def check_for_spam
|
2016-07-28 20:02:56 -04:00
|
|
|
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
|
2016-07-21 19:11:53 -04:00
|
|
|
end
|
|
|
|
end
|