From 8945a3b534dbbbc622326caf37a52f3ebb9d5480 Mon Sep 17 00:00:00 2001 From: multiple creatures Date: Wed, 24 Jul 2019 19:37:00 -0500 Subject: [PATCH] moderation logger - add auto-reject reasons --- app/helpers/autoreject_helper.rb | 53 ++++++++++++++++++++++++-------- app/lib/activitypub/activity.rb | 2 +- 2 files changed, 41 insertions(+), 14 deletions(-) diff --git a/app/helpers/autoreject_helper.rb b/app/helpers/autoreject_helper.rb index 7f21a2116..e924bb217 100644 --- a/app/helpers/autoreject_helper.rb +++ b/app/helpers/autoreject_helper.rb @@ -12,7 +12,7 @@ module AutorejectHelper domain = uri.scan(/[\w\-]+\.[\w\-]+(?:\.[\w\-]+)*/).first blocks = DomainBlock.suspend - return true if blocks.where(domain: domain).or(blocks.where('domain LIKE ?', "%.#{domain}")).exists? + return :domain if blocks.where(domain: domain).or(blocks.where('domain LIKE ?', "%.#{domain}")).exists? return unless @json || @object @@ -21,8 +21,8 @@ module AutorejectHelper if @json oid = @json['id'] if oid - return true if ENV.fetch('REJECT_IF_ID_STARTS_WITH', '').split.any? { |r| oid.start_with?(r) } - return true if ENV.fetch('REJECT_IF_ID_CONTAINS', '').split.any? { |r| r.in?(oid) } + return :id_starts_with if ENV.fetch('REJECT_IF_ID_STARTS_WITH', '').split.any? { |r| oid.start_with?(r) } + return :id_contains if ENV.fetch('REJECT_IF_ID_CONTAINS', '').split.any? { |r| r.in?(oid) } end username = @json['preferredUsername'] || @json['username'] @@ -33,9 +33,9 @@ module AutorejectHelper unless username.blank? username.downcase! - return true if ENV.fetch('REJECT_IF_USERNAME_EQUALS', '').split.any? { |r| r == username } - return true if ENV.fetch('REJECT_IF_USERNAME_STARTS_WITH', '').split.any? { |r| username.start_with?(r) } - return true if ENV.fetch('REJECT_IF_USERNAME_CONTAINS', '').split.any? { |r| r.in?(username) } + return :username if ENV.fetch('REJECT_IF_USERNAME_EQUALS', '').split.any? { |r| r == username } + return :username_starts_with if ENV.fetch('REJECT_IF_USERNAME_STARTS_WITH', '').split.any? { |r| username.start_with?(r) } + return :username_contains if ENV.fetch('REJECT_IF_USERNAME_CONTAINS', '').split.any? { |r| r.in?(username) } end context = @json['@context'] unless @object && context @@ -47,24 +47,51 @@ module AutorejectHelper inline_context = context.find { |item| item.is_a?(Hash) } if inline_context keys = inline_context.keys - return true if ENV.fetch('REJECT_IF_CONTEXT_EQUALS', '').split.any? { |r| r.in?(keys) } - return true if ENV.fetch('REJECT_IF_CONTEXT_STARTS_WITH', '').split.any? { |r| keys.any? { |k| k.start_with?(r) } } - return true if ENV.fetch('REJECT_IF_CONTEXT_CONTAINS', '').split.any? { |r| keys.any? { |k| r.in?(k) } } + return :context if ENV.fetch('REJECT_IF_CONTEXT_EQUALS', '').split.any? { |r| r.in?(keys) } + return :context_starts_with if ENV.fetch('REJECT_IF_CONTEXT_STARTS_WITH', '').split.any? { |r| keys.any? { |k| k.start_with?(r) } } + return :context_contains if ENV.fetch('REJECT_IF_CONTEXT_CONTAINS', '').split.any? { |r| keys.any? { |k| r.in?(k) } } end end - false + nil + end + + def reject_reason(reason) + case reason + when :domain + "the origin domain is blocked" + when :id_starts_with + "the object's URI starts with a blocked phrase" + when :id_contains + "the object's URI contains a blocked phrase" + when :username + "the author's username is blocked" + when :username_starts_with + "the author's username starts with a blocked phrase" + when :username_contains + "the author's username contains a blocked phrase" + when :context + "the object's JSON-LD context has a key matching a blocked phrase" + when :context_starts_with + "the object's JSON-LD context has a key starting with a blocked phrase" + when :context_contains + "the object's JSON-LD context has a key containing a blocked phrase" + else + "of an undefined reason" + end end def autoreject?(uri = nil) return false if @options && @options[:imported] - if should_reject?(uri) + reason = should_reject?(uri) + if reason + reason = reject_reason(reason) if @json Rails.logger.info("Auto-rejected #{@json['id']} (#{@json['type']})") - LogWorker.perform_async("\xf0\x9f\x9a\xab Auto-rejected an incoming '#{@json['type']}#{@object && " #{@object['type']}".rstrip}' from #{@json['id']}.") + LogWorker.perform_async("\xf0\x9f\x9a\xab Auto-rejected an incoming '#{@json['type']}#{@object && " #{@object['type']}".rstrip}' from #{@json['id']} because #{reason}.") elsif uri Rails.logger.info("Auto-rejected #{uri}") - LogWorker.perform_async("\xf0\x9f\x9a\xab Auto-rejected a request to #{uri}.") + LogWorker.perform_async("\xf0\x9f\x9a\xab Auto-rejected a request to #{uri} because #{reason}.") end return true end diff --git a/app/lib/activitypub/activity.rb b/app/lib/activitypub/activity.rb index 783760daf..526230805 100644 --- a/app/lib/activitypub/activity.rb +++ b/app/lib/activitypub/activity.rb @@ -184,7 +184,7 @@ class ActivityPub::Activity def reject_payload! Rails.logger.info("Rejected #{@json['type']} activity #{@json['id']} from #{@account.uri}#{@options[:relayed_through_account] && "via #{@options[:relayed_through_account].uri}"}") - LogWorker.perform_async("\xf0\x9f\x9a\xab Auto-rejected an incoming '#{@json['type']}#{@object && " #{@object['type']}".rstrip}' from #{@json['id']} by #{@account.uri}#{@options[:relayed_through_account] && " via #{@options[:relayed_through_account].uri}"}.") + LogWorker.perform_async("\xf0\x9f\x9a\xab Auto-rejected an incoming '#{@json['type']}#{@object && " #{@object['type']}".rstrip}' from #{@json['id']} by #{@account.uri}#{@options[:relayed_through_account] && " via #{@options[:relayed_through_account].uri}"} because the object could not be validated.") nil end end