StatusView: clear MSB on calculated conversation_id
authorHélène <pleroma-dev@helene.moe>
Sun, 7 Aug 2022 18:37:17 +0000 (20:37 +0200)
committerFloatingGhost <hannah@coffee-and-dreams.uk>
Sun, 7 Aug 2022 19:47:59 +0000 (20:47 +0100)
This field seems to be a left-over from the StatusNet era.
If your application uses `pleroma.conversation_id`: this field is
deprecated.

It is currently stubbed instead by doing a CRC32 of the context, and
clearing the MSB to avoid overflow exceptions with signed integers on
the different clients using this field (Java/Kotlin code, mostly; see
Husky and probably other mobile clients.)

This should be removed in a future version of Pleroma. Pleroma-FE
currently depends on this field, as well.

lib/pleroma/web/mastodon_api/views/status_view.ex
test/pleroma/web/mastodon_api/views/status_view_test.exs

index f0ecf685ba11ab589233cf9acc91a07c0bd6083c..2153c757d611783d72a41045bb1498235628f5eb 100644 (file)
@@ -57,8 +57,19 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
     end)
   end
 
-  defp get_context_id(%{data: %{"context" => context}}) when is_binary(context),
-    do: :erlang.crc32(context)
+  # DEPRECATED This field seems to be a left-over from the StatusNet era.
+  # If your application uses `pleroma.conversation_id`: this field is deprecated.
+  # It is currently stubbed instead by doing a CRC32 of the context, and
+  # clearing the MSB to avoid overflow exceptions with signed integers on the
+  # different clients using this field (Java/Kotlin code, mostly; see Husky.)
+  # This should be removed in a future version of Pleroma. Pleroma-FE currently
+  # depends on this field, as well.
+  defp get_context_id(%{data: %{"context" => context}}) when is_binary(context) do
+    use Bitwise
+
+    :erlang.crc32(context)
+    |> band(bnot(0x8000_0000))
+  end
 
   defp get_context_id(_), do: nil
 
index 130de1b179bb55152c26dc6f7a781a361eee568f..e56d095c4c51fa0f9c8d3c11a6ddea1990272d07 100644 (file)
@@ -239,7 +239,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do
     object_data = Object.normalize(note, fetch: false).data
     user = User.get_cached_by_ap_id(note.data["actor"])
 
-    convo_id = :erlang.crc32(object_data["context"])
+    convo_id = :erlang.crc32(object_data["context"]) |> Bitwise.band(Bitwise.bnot(0x8000_0000))
 
     status = StatusView.render("show.json", %{activity: note})