Merge remote-tracking branch 'origin/master' into gs-master
Conflicts: app/javascript/mastodon/locales/en.json app/javascript/mastodon/locales/ja.json app/javascript/mastodon/locales/pl.json app/views/accounts/_header.html.haml
This commit is contained in:
@@ -3,6 +3,8 @@
|
||||
class ActivityPub::FetchRemoteAccountService < BaseService
|
||||
include JsonLdHelper
|
||||
|
||||
SUPPORTED_TYPES = %w(Application Group Organization Person Service).freeze
|
||||
|
||||
# Should be called when uri has already been checked for locality
|
||||
# Does a WebFinger roundtrip on each call
|
||||
def call(uri, id: true, prefetched_body: nil)
|
||||
@@ -54,6 +56,6 @@ class ActivityPub::FetchRemoteAccountService < BaseService
|
||||
end
|
||||
|
||||
def expected_type?
|
||||
@json['type'] == 'Person'
|
||||
SUPPORTED_TYPES.include?(@json['type'])
|
||||
end
|
||||
end
|
||||
|
||||
@@ -43,7 +43,7 @@ class ActivityPub::FetchRemoteKeyService < BaseService
|
||||
end
|
||||
|
||||
def person?
|
||||
@json['type'] == 'Person'
|
||||
ActivityPub::FetchRemoteAccountService::SUPPORTED_TYPES.include?(@json['type'])
|
||||
end
|
||||
|
||||
def public_key?
|
||||
@@ -55,6 +55,6 @@ class ActivityPub::FetchRemoteKeyService < BaseService
|
||||
end
|
||||
|
||||
def confirmed_owner?
|
||||
@owner['type'] == 'Person' && value_or_id(@owner['publicKey']) == @json['id']
|
||||
ActivityPub::FetchRemoteAccountService::SUPPORTED_TYPES.include?(@owner['type']) && value_or_id(@owner['publicKey']) == @json['id']
|
||||
end
|
||||
end
|
||||
|
||||
@@ -22,6 +22,7 @@ class ActivityPub::ProcessAccountService < BaseService
|
||||
|
||||
create_account if @account.nil?
|
||||
update_account
|
||||
process_tags(@account)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -187,4 +188,31 @@ class ActivityPub::ProcessAccountService < BaseService
|
||||
def lock_options
|
||||
{ redis: Redis.current, key: "process_account:#{@uri}" }
|
||||
end
|
||||
|
||||
def process_tags(account)
|
||||
return if @json['tag'].blank?
|
||||
as_array(@json['tag']).each do |tag|
|
||||
case tag['type']
|
||||
when 'Emoji'
|
||||
process_emoji tag, account
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def process_emoji(tag, _account)
|
||||
return if skip_download?
|
||||
return if tag['name'].blank? || tag['icon'].blank? || tag['icon']['url'].blank?
|
||||
|
||||
shortcode = tag['name'].delete(':')
|
||||
image_url = tag['icon']['url']
|
||||
uri = tag['id']
|
||||
updated = tag['updated']
|
||||
emoji = CustomEmoji.find_by(shortcode: shortcode, domain: @account.domain)
|
||||
|
||||
return unless emoji.nil? || emoji.updated_at >= updated
|
||||
|
||||
emoji ||= CustomEmoji.new(domain: @account.domain, shortcode: shortcode, uri: uri)
|
||||
emoji.image_remote_url = image_url
|
||||
emoji.save
|
||||
end
|
||||
end
|
||||
|
||||
@@ -42,7 +42,7 @@ class FetchAtomService < BaseService
|
||||
elsif ['application/activity+json', 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"'].include?(response.mime_type)
|
||||
body = response.body_with_limit
|
||||
json = body_to_json(body)
|
||||
if supported_context?(json) && json['type'] == 'Person' && json['inbox'].present?
|
||||
if supported_context?(json) && ActivityPub::FetchRemoteAccountService::SUPPORTED_TYPES.include?(json['type']) && json['inbox'].present?
|
||||
[json['id'], { prefetched_body: body, id: true }, :activitypub]
|
||||
elsif supported_context?(json) && expected_type?(json)
|
||||
[json['id'], { prefetched_body: body, id: true }, :activitypub]
|
||||
|
||||
@@ -189,7 +189,7 @@ class ResolveAccountService < BaseService
|
||||
return @actor_json if defined?(@actor_json)
|
||||
|
||||
json = fetch_resource(actor_url, false)
|
||||
@actor_json = supported_context?(json) && json['type'] == 'Person' ? json : nil
|
||||
@actor_json = supported_context?(json) && ActivityPub::FetchRemoteAccountService::SUPPORTED_TYPES.include?(json['type']) ? json : nil
|
||||
end
|
||||
|
||||
def atom
|
||||
|
||||
@@ -17,7 +17,7 @@ class ResolveURLService < BaseService
|
||||
|
||||
def process_url
|
||||
case type
|
||||
when 'Person'
|
||||
when 'Application', 'Group', 'Organization', 'Person', 'Service'
|
||||
FetchRemoteAccountService.new.call(atom_url, body, protocol)
|
||||
when 'Note', 'Article', 'Image', 'Video'
|
||||
FetchRemoteStatusService.new.call(atom_url, body, protocol)
|
||||
|
||||
@@ -40,6 +40,27 @@ class UpdateRemoteProfileService < BaseService
|
||||
account.header_remote_url = ''
|
||||
account.header.destroy
|
||||
end
|
||||
|
||||
save_emojis(account) if remote_profile.emojis.present?
|
||||
end
|
||||
end
|
||||
|
||||
def save_emojis(parent)
|
||||
do_not_download = DomainBlock.find_by(domain: parent.account.domain)&.reject_media?
|
||||
|
||||
return if do_not_download
|
||||
|
||||
remote_account.emojis.each do |link|
|
||||
next unless link['href'] && link['name']
|
||||
|
||||
shortcode = link['name'].delete(':')
|
||||
emoji = CustomEmoji.find_by(shortcode: shortcode, domain: parent.account.domain)
|
||||
|
||||
next unless emoji.nil?
|
||||
|
||||
emoji = CustomEmoji.new(shortcode: shortcode, domain: parent.account.domain)
|
||||
emoji.image_remote_url = link['href']
|
||||
emoji.save
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user