StatusView: clear MSB on calculated conversation_id

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.
This commit is contained in:
Hélène 2022-08-07 20:37:17 +02:00 committed by FloatingGhost
parent 62e179f446
commit b9bb093600
2 changed files with 14 additions and 3 deletions

View file

@ -57,8 +57,19 @@ defp get_replied_to_activities(activities) do
end) end)
end end
defp get_context_id(%{data: %{"context" => context}}) when is_binary(context), # DEPRECATED This field seems to be a left-over from the StatusNet era.
do: :erlang.crc32(context) # 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 defp get_context_id(_), do: nil

View file

@ -239,7 +239,7 @@ test "a note activity" do
object_data = Object.normalize(note, fetch: false).data object_data = Object.normalize(note, fetch: false).data
user = User.get_cached_by_ap_id(note.data["actor"]) 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}) status = StatusView.render("show.json", %{activity: note})