mandate published on notes
authorFloatingGhost <hannah@coffee-and-dreams.uk>
Fri, 9 Dec 2022 20:27:54 +0000 (20:27 +0000)
committerFloatingGhost <hannah@coffee-and-dreams.uk>
Fri, 9 Dec 2022 20:27:54 +0000 (20:27 +0000)
fixes #356

CHANGELOG.md
lib/mix/tasks/pleroma/search/meilisearch.ex
lib/pleroma/web/activity_pub/object_validators/article_note_page_validator.ex
test/fixtures/mastodon/note-without-published.json [new file with mode: 0644]
test/pleroma/web/activity_pub/object_validators/article_note_page_validator_test.exs

index eef3c53b8fe0347f0066b4051301a0f174243886..c0aa002a11d38a77a4282100183c725e55ecf229 100644 (file)
@@ -23,6 +23,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
 - Follow/Block/Mute imports now spin off into *n* tasks to avoid the oban timeout
 - Transient activities recieved from remote servers are no longer persisted in the database
 - Overhauled static-fe view for logged-out users
+- `published` is now a mandatory field in Note objects
 
 ## Removed
 - FollowBotPolicy
index 27a31afcf4a684f8d87dfb8daac2abe6a3c7a7e3..caeeb58d5f6ee39629b8a97ee55443ed5168512a 100644 (file)
@@ -60,7 +60,8 @@ defmodule Mix.Tasks.Pleroma.Search.Meilisearch do
             where:
               fragment("data->>'type' = 'Note'") and
                 (fragment("data->'to' \\? ?", ^Pleroma.Constants.as_public()) or
-                   fragment("data->'cc' \\? ?", ^Pleroma.Constants.as_public())),
+                   fragment("data->'cc' \\? ?", ^Pleroma.Constants.as_public())) and
+                fragment("data->>'published' IS NOT NULL"),
             order_by: [desc: fragment("data->'published'")]
           )
 
index 0d45421e2555cd64b39f6c3807b7fddb8d6454ca..0967f557ae46ce6be86d44e859fcea190a66a62b 100644 (file)
@@ -172,7 +172,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.ArticleNotePageValidator do
   defp validate_data(data_cng) do
     data_cng
     |> validate_inclusion(:type, ["Article", "Note", "Page"])
-    |> validate_required([:id, :actor, :attributedTo, :type, :context])
+    |> validate_required([:id, :actor, :attributedTo, :type, :context, :published])
     |> CommonValidations.validate_any_presence([:cc, :to])
     |> CommonValidations.validate_fields_match([:actor, :attributedTo])
     |> CommonValidations.validate_actor_presence()
diff --git a/test/fixtures/mastodon/note-without-published.json b/test/fixtures/mastodon/note-without-published.json
new file mode 100644 (file)
index 0000000..c721ece
--- /dev/null
@@ -0,0 +1,44 @@
+{
+   "@context" : [
+      "https://www.w3.org/ns/activitystreams",
+      "https://w3id.org/security/v1",
+      {
+         "Emoji" : "toot:Emoji",
+         "Hashtag" : "as:Hashtag",
+         "atomUri" : "ostatus:atomUri",
+         "conversation" : "ostatus:conversation",
+         "inReplyToAtomUri" : "ostatus:inReplyToAtomUri",
+         "manuallyApprovesFollowers" : "as:manuallyApprovesFollowers",
+         "movedTo" : "as:movedTo",
+         "ostatus" : "http://ostatus.org#",
+         "sensitive" : "as:sensitive",
+         "toot" : "http://joinmastodon.org/ns#"
+      }
+   ],
+   "atomUri" : "http://mastodon.example.org/users/admin/statuses/99541947525187367",
+   "attachment" : [
+      {
+         "mediaType" : "image/jpeg",
+         "name" : null,
+         "type" : "Document",
+         "url" : "http://mastodon.example.org/system/media_attachments/files/000/000/002/original/334ce029e7bfb920.jpg"
+      }
+   ],
+   "attributedTo" : "http://mastodon.example.org/users/admin",
+   "cc" : [
+      "http://mastodon.example.org/users/admin/followers"
+   ],
+   "content" : "<p>yeah.</p>",
+   "conversation" : "tag:mastodon.example.org,2018-02-17:objectId=59:objectType=Conversation",
+   "id" : "http://mastodon.example.org/users/admin/statuses/99541947525187367",
+   "inReplyTo" : null,
+   "inReplyToAtomUri" : null,
+   "sensitive" : false,
+   "summary" : null,
+   "tag" : [],
+   "to" : [
+      "https://www.w3.org/ns/activitystreams#Public"
+   ],
+   "type" : "Note",
+   "url" : "http://mastodon.example.org/@admin/99541947525187367"
+}
index 5b95ebc51f61877867ad1b76bd3327a4e85b9897..0ddc3c76d1525340153b8bd55b5f47d9f251a5f5 100644 (file)
@@ -28,6 +28,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.ArticleNotePageValidatorTest
         "to" => [user.follower_address],
         "cc" => [],
         "content" => "Hellow this is content.",
+        "published" => "2021-01-01T00:00:00Z",
         "context" => "xxx",
         "summary" => "a post"
       }
@@ -65,6 +66,12 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.ArticleNotePageValidatorTest
         ArticleNotePageValidator.cast_and_validate(note)
     end
 
+    test "a note without a published field should not validate", _ do
+      insert(:user, %{ap_id: "http://mastodon.example.org/users/admin"})
+      note = Jason.decode!(File.read!("test/fixtures/mastodon/note-without-published.json"))
+      %{valid?: false} = ArticleNotePageValidator.cast_and_validate(note)
+    end
+
     test "a note with an attachment should work", _ do
       insert(:user, %{ap_id: "https://owncast.localhost.localdomain/federation/user/streamer"})