summaryrefslogtreecommitdiffstats
path: root/app/services/activitypub
diff options
context:
space:
mode:
authorEugen Rochko <eugen@zeonfederated.com>2019-03-30 02:12:06 +0100
committerGitHub <noreply@github.com>2019-03-30 02:12:06 +0100
commit1714ea597866556ef9dd21d5d382f1d9181e0924 (patch)
tree4cf231f724d1918790b31d53dbd5d1c8a2c80527 /app/services/activitypub
parent8fb69f1366577483f048bf4d69f610087da99cb1 (diff)
Add ActivityPub representation for identity proofs (#10414)
* Add ActivityPub representation for identity proofs * Add tests
Diffstat (limited to 'app/services/activitypub')
-rw-r--r--app/services/activitypub/process_account_service.rb28
1 files changed, 27 insertions, 1 deletions
diff --git a/app/services/activitypub/process_account_service.rb b/app/services/activitypub/process_account_service.rb
index 5e33084282d..6d0609ca04f 100644
--- a/app/services/activitypub/process_account_service.rb
+++ b/app/services/activitypub/process_account_service.rb
@@ -24,6 +24,7 @@ class ActivityPub::ProcessAccountService < BaseService
create_account if @account.nil?
update_account
process_tags
+ process_attachments
else
raise Mastodon::RaceConditionError
end
@@ -151,7 +152,7 @@ class ActivityPub::ProcessAccountService < BaseService
def property_values
return unless @json['attachment'].is_a?(Array)
- @json['attachment'].select { |attachment| attachment['type'] == 'PropertyValue' }.map { |attachment| attachment.slice('name', 'value') }
+ as_array(@json['attachment']).select { |attachment| attachment['type'] == 'PropertyValue' }.map { |attachment| attachment.slice('name', 'value') }
end
def mismatching_origin?(url)
@@ -231,6 +232,23 @@ class ActivityPub::ProcessAccountService < BaseService
end
end
+ def process_attachments
+ return if @json['attachment'].blank?
+
+ previous_proofs = @account.identity_proofs.to_a
+ current_proofs = []
+
+ as_array(@json['attachment']).each do |attachment|
+ next unless equals_or_includes?(attachment['type'], 'IdentityProof')
+ current_proofs << process_identity_proof(attachment)
+ end
+
+ previous_proofs.each do |previous_proof|
+ next if current_proofs.any? { |current_proof| current_proof.id == previous_proof.id }
+ previous_proof.delete
+ end
+ end
+
def process_emoji(tag)
return if skip_download?
return if tag['name'].blank? || tag['icon'].blank? || tag['icon']['url'].blank?
@@ -247,4 +265,12 @@ class ActivityPub::ProcessAccountService < BaseService
emoji.image_remote_url = image_url
emoji.save
end
+
+ def process_identity_proof(attachment)
+ provider = attachment['signatureAlgorithm']
+ provider_username = attachment['name']
+ token = attachment['signatureValue']
+
+ @account.identity_proofs.where(provider: provider, provider_username: provider_username).find_or_create_by(provider: provider, provider_username: provider_username, token: token)
+ end
end