Merge branch 'main' into glitch-soc/merge-upstream
Conflicts: - `.env.production.sample`: Upstream added new configuration options, uncommented by default. Commented them. - `Gemfile.lock`: Upstream updated dependencies textually close to glitch-soc-specific dependencies. Updated those upstream dependencies.
This commit is contained in:
@@ -13,7 +13,20 @@ class ActivityPub::FetchRemoteStatusService < BaseService
|
||||
end
|
||||
end
|
||||
|
||||
return if !(supported_context? && expected_type?) || actor_id.nil? || !trustworthy_attribution?(@json['id'], actor_id)
|
||||
return unless supported_context?
|
||||
|
||||
actor_id = nil
|
||||
activity_json = nil
|
||||
|
||||
if expected_object_type?
|
||||
actor_id = value_or_id(first_of_value(@json['attributedTo']))
|
||||
activity_json = { 'type' => 'Create', 'actor' => actor_id, 'object' => @json }
|
||||
elsif expected_activity_type?
|
||||
actor_id = value_or_id(first_of_value(@json['actor']))
|
||||
activity_json = @json
|
||||
end
|
||||
|
||||
return if activity_json.nil? || !trustworthy_attribution?(@json['id'], actor_id)
|
||||
|
||||
actor = ActivityPub::TagManager.instance.uri_to_resource(actor_id, Account)
|
||||
actor = ActivityPub::FetchRemoteAccountService.new.call(actor_id, id: true) if actor.nil? || needs_update?(actor)
|
||||
@@ -25,14 +38,6 @@ class ActivityPub::FetchRemoteStatusService < BaseService
|
||||
|
||||
private
|
||||
|
||||
def activity_json
|
||||
{ 'type' => 'Create', 'actor' => actor_id, 'object' => @json }
|
||||
end
|
||||
|
||||
def actor_id
|
||||
value_or_id(first_of_value(@json['attributedTo']))
|
||||
end
|
||||
|
||||
def trustworthy_attribution?(uri, attributed_to)
|
||||
return false if uri.nil? || attributed_to.nil?
|
||||
Addressable::URI.parse(uri).normalized_host.casecmp(Addressable::URI.parse(attributed_to).normalized_host).zero?
|
||||
@@ -42,7 +47,11 @@ class ActivityPub::FetchRemoteStatusService < BaseService
|
||||
super(@json)
|
||||
end
|
||||
|
||||
def expected_type?
|
||||
def expected_activity_type?
|
||||
equals_or_includes_any?(@json['type'], %w(Create Announce))
|
||||
end
|
||||
|
||||
def expected_object_type?
|
||||
equals_or_includes_any?(@json['type'], ActivityPub::Activity::Create::SUPPORTED_TYPES + ActivityPub::Activity::Create::CONVERTED_TYPES)
|
||||
end
|
||||
|
||||
|
@@ -2,6 +2,7 @@
|
||||
|
||||
class FetchOEmbedService
|
||||
ENDPOINT_CACHE_EXPIRES_IN = 24.hours.freeze
|
||||
URL_REGEX = /(=(http[s]?(%3A|:)(\/\/|%2F%2F)))([^&]*)/i.freeze
|
||||
|
||||
attr_reader :url, :options, :format, :endpoint_url
|
||||
|
||||
@@ -65,10 +66,12 @@ class FetchOEmbedService
|
||||
end
|
||||
|
||||
def cache_endpoint!
|
||||
return unless URL_REGEX.match?(@endpoint_url)
|
||||
|
||||
url_domain = Addressable::URI.parse(@url).normalized_host
|
||||
|
||||
endpoint_hash = {
|
||||
endpoint: @endpoint_url.gsub(/(=(http[s]?(%3A|:)(\/\/|%2F%2F)))([^&]*)/i, '={url}'),
|
||||
endpoint: @endpoint_url.gsub(URL_REGEX, '={url}'),
|
||||
format: @format,
|
||||
}
|
||||
|
||||
|
25
app/services/remove_from_followers_service.rb
Normal file
25
app/services/remove_from_followers_service.rb
Normal file
@@ -0,0 +1,25 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class RemoveFromFollowersService < BaseService
|
||||
include Payloadable
|
||||
|
||||
def call(source_account, target_accounts)
|
||||
source_account.passive_relationships.where(account_id: target_accounts).find_each do |follow|
|
||||
follow.destroy
|
||||
|
||||
if source_account.local? && !follow.account.local? && follow.account.activitypub?
|
||||
create_notification(follow)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def create_notification(follow)
|
||||
ActivityPub::DeliveryWorker.perform_async(build_json(follow), follow.target_account_id, follow.account.inbox_url)
|
||||
end
|
||||
|
||||
def build_json(follow)
|
||||
Oj.dump(serialize_payload(follow, ActivityPub::RejectFollowSerializer))
|
||||
end
|
||||
end
|
Reference in New Issue
Block a user