]> cat aescling's git repositories - mastodon.git/commitdiff
Define missing JSON-LD properties (#4767)
authorEugen Rochko <eugen@zeonfederated.com>
Sat, 2 Sep 2017 12:01:23 +0000 (14:01 +0200)
committerGitHub <noreply@github.com>
Sat, 2 Sep 2017 12:01:23 +0000 (14:01 +0200)
Using _: property names is discouraged, as in the future,
canonicalization may throw an error when encountering that instead
of discarding it silently like it does now.

We are defining some ActivityStreams properties which we expect
to land in ActivityStreams eventually, to ensure that future versions
of Mastodon will remain compatible with this even once that happens.
Those would be `locked`, `sensitive` and `Hashtag`

We are defining a custom context inline for some properties which we
do not expect to land in any other context. `atomUri`, `inReplyToAtomUri`
and `conversation` are part of the custom defined OStatus context.

app/lib/activitypub/activity/create.rb
app/lib/activitypub/activity/delete.rb
app/lib/activitypub/adapter.rb
app/serializers/activitypub/actor_serializer.rb
app/serializers/activitypub/delete_serializer.rb
app/serializers/activitypub/note_serializer.rb
app/services/activitypub/fetch_remote_status_service.rb
app/services/activitypub/process_account_service.rb

index a6f1e60d938161be12eca055d6e285d9316acab6..081e805703886d05ffda107bb82969851e92fe94 100644 (file)
@@ -26,7 +26,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
 
   def find_existing_status
     status   = status_from_uri(object_uri)
-    status ||= Status.find_by(uri: @object['_:atomUri']) if @object['_:atomUri'].present?
+    status ||= Status.find_by(uri: @object['atomUri']) if @object['atomUri'].present?
     status
   end
 
@@ -43,7 +43,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
       sensitive: @object['sensitive'] || false,
       visibility: visibility_from_audience,
       thread: replied_to_status,
-      conversation: conversation_from_uri(@object['_:conversation']),
+      conversation: conversation_from_uri(@object['conversation']),
     }
   end
 
@@ -125,7 +125,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
       @replied_to_status = nil
     else
       @replied_to_status   = status_from_uri(in_reply_to_uri)
-      @replied_to_status ||= status_from_uri(@object['_:inReplyToAtomUri']) if @object['_:inReplyToAtomUri'].present?
+      @replied_to_status ||= status_from_uri(@object['inReplyToAtomUri']) if @object['inReplyToAtomUri'].present?
       @replied_to_status
     end
   end
index 9d804c86df7c4aff8db4698312ec47df41239b7b..4c6afb090274283d6de156ad8b9dbf2b51a5e13f 100644 (file)
@@ -17,7 +17,7 @@ class ActivityPub::Activity::Delete < ActivityPub::Activity
 
   def delete_note
     status   = Status.find_by(uri: object_uri, account: @account)
-    status ||= Status.find_by(uri: @object['_:atomUri'], account: @account) if @object.is_a?(Hash) && @object['_:atomUri'].present?
+    status ||= Status.find_by(uri: @object['atomUri'], account: @account) if @object.is_a?(Hash) && @object['atomUri'].present?
 
     delete_later!(object_uri)
 
index 92210579e807c9e39ea537f29a971b7769b3695b..fe4dddd38e0f6f10d4083318310e4f225545cd2e 100644 (file)
@@ -1,6 +1,24 @@
 # frozen_string_literal: true
 
 class ActivityPub::Adapter < ActiveModelSerializers::Adapter::Base
+  CONTEXT = {
+    '@context': [
+      'https://www.w3.org/ns/activitystreams',
+      'https://w3id.org/security/v1',
+
+      {
+        'locked'    => 'as:locked',
+        'sensitive' => 'as:sensitive',
+        'Hashtag'   => 'as:Hashtag',
+
+        'ostatus'          => 'http://ostatus.org#',
+        'atomUri'          => 'ostatus:atomUri',
+        'inReplyToAtomUri' => 'ostatus:inReplyToAtomUri',
+        'conversation'     => 'ostatus:conversation',
+      },
+    ],
+  }.freeze
+
   def self.default_key_transform
     :camel_lower
   end
@@ -11,7 +29,7 @@ class ActivityPub::Adapter < ActiveModelSerializers::Adapter::Base
 
   def serializable_hash(options = nil)
     options = serialization_options(options)
-    serialized_hash = { '@context': [ActivityPub::TagManager::CONTEXT, 'https://w3id.org/security/v1'] }.merge(ActiveModelSerializers::Adapter::Attributes.new(serializer, instance_options).serializable_hash(options))
+    serialized_hash = CONTEXT.merge(ActiveModelSerializers::Adapter::Attributes.new(serializer, instance_options).serializable_hash(options))
     self.class.transform_key_casing!(serialized_hash, instance_options)
   end
 end
index a72ecee24bb3ca9725cec6ca7e870b7e86043446..f004dc326a9dd898412a4926b315a37039c49d20 100644 (file)
@@ -6,12 +6,10 @@ class ActivityPub::ActorSerializer < ActiveModel::Serializer
   attributes :id, :type, :following, :followers,
              :inbox, :outbox, :shared_inbox,
              :preferred_username, :name, :summary,
-             :url
+             :url, :locked
 
   has_one :public_key, serializer: ActivityPub::PublicKeySerializer
 
-  attribute :locked, key: '_:locked'
-
   class ImageSerializer < ActiveModel::Serializer
     include RoutingHelper
 
index a041c577b3ffcefabc7977d5ac66b4b759fd0803..87a43b95dc2f4578a2a60f3de027505fd7b7eeb4 100644 (file)
@@ -2,8 +2,7 @@
 
 class ActivityPub::DeleteSerializer < ActiveModel::Serializer
   class TombstoneSerializer < ActiveModel::Serializer
-    attributes :id, :type
-    attribute :atom_uri, key: '_:atomUri'
+    attributes :id, :type, :atom_uri
 
     def id
       ActivityPub::TagManager.instance.uri_for(object)
index 15031dfdc44767091977eff722b4a1bc451d3793..d42f5426395bf42bcd31e045cb43a4ab9f8aa954 100644 (file)
@@ -3,14 +3,13 @@
 class ActivityPub::NoteSerializer < ActiveModel::Serializer
   attributes :id, :type, :summary, :content,
              :in_reply_to, :published, :url,
-             :attributed_to, :to, :cc, :sensitive
+             :attributed_to, :to, :cc, :sensitive,
+             :atom_uri, :in_reply_to_atom_uri,
+             :conversation
 
   has_many :media_attachments, key: :attachment
   has_many :virtual_tags, key: :tag
 
-  attribute :atom_uri, key: '_:atomUri', if: :local?
-  attribute :in_reply_to_atom_uri, key: '_:inReplyToAtomUri'
-
   def id
     ActivityPub::TagManager.instance.uri_for(object)
   end
@@ -62,6 +61,8 @@ class ActivityPub::NoteSerializer < ActiveModel::Serializer
   end
 
   def atom_uri
+    return unless object.local?
+
     ::TagManager.instance.uri_for(object)
   end
 
@@ -71,6 +72,14 @@ class ActivityPub::NoteSerializer < ActiveModel::Serializer
     ::TagManager.instance.uri_for(object.thread)
   end
 
+  def conversation
+    if object.conversation.uri?
+      object.conversation.uri
+    else
+      TagManager.instance.unique_tag(object.conversation.created_at, object.conversation.id, 'Conversation')
+    end
+  end
+
   def local?
     object.account.local?
   end
index c114515cdd4e15c91299f0822c9fc61ec8e55436..68ca58d629d5d90a745aaa5714a401d66429791b 100644 (file)
@@ -25,8 +25,8 @@ class ActivityPub::FetchRemoteStatusService < BaseService
   def activity_json
     if %w(Note Article).include? @json['type']
       {
-        'type' => 'Create',
-        'actor' => first_of_value(@json['attributedTo']),
+        'type'   => 'Create',
+        'actor'  => first_of_value(@json['attributedTo']),
         'object' => @json,
       }
     else
index 99f9dbdc25a6c1f0f5283197b8d5737a9ca789e9..44798d051f69b5396126cdaa38fd4cdb5c77983e 100644 (file)
@@ -50,7 +50,7 @@ class ActivityPub::ProcessAccountService < BaseService
     @account.avatar_remote_url   = image_url('icon')
     @account.header_remote_url   = image_url('image')
     @account.public_key          = public_key || ''
-    @account.locked              = @json['_:locked'] || false
+    @account.locked              = @json['locked'] || false
     @account.save!
   end