Insert string-hashtags in Pipeline
authorHaelwenn (lanodan) Monnier <contact@hacktivis.me>
Tue, 12 Jan 2021 08:30:22 +0000 (09:30 +0100)
committerHaelwenn (lanodan) Monnier <contact@hacktivis.me>
Thu, 1 Apr 2021 12:18:41 +0000 (14:18 +0200)
Cannot be done in Ecto schemas because only one type is allowed in arrays, and
needs to be done before the MRFs.

lib/pleroma/web/activity_pub/pipeline.ex
lib/pleroma/web/activity_pub/transmogrifier.ex
lib/pleroma/web/common_api.ex

index 0aa504e728cb45f5fbee2a012496e33da4cd311f..e184a937621595cd0444db0bc8f10949f4adc811 100644 (file)
@@ -42,23 +42,33 @@ defmodule Pleroma.Web.ActivityPub.Pipeline do
 
   def do_common_pipeline(%{__struct__: _}, _meta), do: {:error, :is_struct}
 
-  def do_common_pipeline(object, meta) do
-    with {_, {:ok, validated_object, meta}} <-
-           {:validate_object, @object_validator.validate(object, meta)},
-         {_, {:ok, mrfd_object, meta}} <-
-           {:mrf_object, @mrf.pipeline_filter(validated_object, meta)},
-         {_, {:ok, activity, meta}} <-
-           {:persist_object, @activity_pub.persist(mrfd_object, meta)},
-         {_, {:ok, activity, meta}} <-
-           {:execute_side_effects, @side_effects.handle(activity, meta)},
-         {_, {:ok, _}} <- {:federation, maybe_federate(activity, meta)} do
-      {:ok, activity, meta}
+  def do_common_pipeline(message, meta) do
+    with {_, {:ok, message, meta}} <- {:validate, @object_validator.validate(message, meta)},
+         {_, {:ok, message, meta}} <- {:fixup, validation_fixups(message, meta)},
+         {_, {:ok, message, meta}} <- {:mrf, @mrf.pipeline_filter(message, meta)},
+         {_, {:ok, message, meta}} <- {:persist, @activity_pub.persist(message, meta)},
+         {_, {:ok, message, meta}} <- {:side_effects, @side_effects.handle(message, meta)},
+         {_, {:ok, _}} <- {:federation, maybe_federate(message, meta)} do
+      {:ok, message, meta}
     else
-      {:mrf_object, {:reject, message, _}} -> {:reject, message}
+      {:mrf, {:reject, message, _}} -> {:reject, message}
       e -> {:error, e}
     end
   end
 
+  defp validation_fixups(message, meta) do
+    # Insert copy of hashtags as strings for the non-hashtag table indexing
+    message =
+      if message["tag"] do
+        tag = Object.hashtags(%Object{data: message}) ++ (message["tag"] || [])
+        Map.put(message, "tag", tag)
+      else
+        message
+      end
+
+    {:ok, message, meta}
+  end
+
   defp maybe_federate(%Object{}, _), do: {:ok, :not_federated}
 
   defp maybe_federate(%Activity{} = activity, meta) do
index 8c7d6a7478c28ada25aeb7baf55b9fed5c9d2471..4070ed14d09aa6c692dc75d2854b6c419dd07c1c 100644 (file)
@@ -564,7 +564,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
            Pipeline.common_pipeline(data, local: false) do
       {:ok, activity}
     else
-      {:error, {:validate_object, _}} = e ->
+      {:error, {:validate, _}} = e ->
         # Check if we have a create activity for this
         with {:ok, object_id} <- ObjectValidators.ObjectID.cast(data["object"]),
              %Activity{data: %{"actor" => actor}} <-
index b003e30c7b6fd84b56ede42da927f60efa60c585..895baebc9c4409670ddfe3cec5b4085c07a77787 100644 (file)
@@ -228,17 +228,7 @@ defmodule Pleroma.Web.CommonAPI do
       {:find_object, _} ->
         {:error, :not_found}
 
-      {:common_pipeline,
-       {
-         :error,
-         {
-           :validate_object,
-           {
-             :error,
-             changeset
-           }
-         }
-       }} = e ->
+      {:common_pipeline, {:error, {:validate, {:error, changeset}}}} = e ->
         if {:object, {"already liked by this actor", []}} in changeset.errors do
           {:ok, :already_liked}
         else