truncate fields for remote users instead
authorSadposter <hannah+pleroma@coffee-and-dreams.uk>
Mon, 2 Sep 2019 11:15:21 +0000 (12:15 +0100)
committerSadposter <hannah+pleroma@coffee-and-dreams.uk>
Mon, 2 Sep 2019 11:15:21 +0000 (12:15 +0100)
lib/pleroma/user/info.ex
test/user_test.exs

index 779bfbc188a911c324d4ad006a616565c3ba2ad1..0beb2f721eb108495f00b2926158cde175e6716e 100644 (file)
@@ -242,6 +242,7 @@ defmodule Pleroma.User.Info do
   end
 
   def remote_user_creation(info, params) do
+    params = Map.put(params, "fields", Enum.map(params["fields"], &truncate_field/1))
     info
     |> cast(params, [
       :ap_enabled,
@@ -326,6 +327,12 @@ defmodule Pleroma.User.Info do
 
   defp valid_field?(_), do: false
 
+  defp truncate_field(%{"name" => name, "value" => value}) do
+    {name, _chopped} = String.split_at(name, Pleroma.Config.get([:instance, :account_field_name_length], 255))
+    {value, _chopped} = String.split_at(value, Pleroma.Config.get([:instance, :account_field_value_length], 255))
+    %{"name" => name, "value" => value}
+  end
+
   @spec confirmation_changeset(Info.t(), keyword()) :: Changeset.t()
   def confirmation_changeset(info, opts) do
     need_confirmation? = Keyword.get(opts, :need_confirmation)
index 2cbc1f5250f15c3856a1cb2e9633b1c5f5890beb..68a469fe3e22667ef8609a3dba5f808a591752ff 100644 (file)
@@ -1117,11 +1117,20 @@ defmodule Pleroma.UserTest do
     assert {:ok, _key} = User.get_public_key_for_ap_id("http://mastodon.example.org/users/admin")
   end
 
-  test "insert or update a user from given data" do
-    user = insert(:user, %{nickname: "nick@name.de"})
-    data = %{ap_id: user.ap_id <> "xxx", name: user.name, nickname: user.nickname}
+  describe "insert or update a user from given data" do
+    test "with normal data" do
+        user = insert(:user, %{nickname: "nick@name.de"})
+        data = %{ap_id: user.ap_id <> "xxx", name: user.name, nickname: user.nickname}
 
-    assert {:ok, %User{}} = User.insert_or_update_user(data)
+        assert {:ok, %User{}} = User.insert_or_update_user(data)
+    end
+
+    test "with overly long fields" do
+        current_max_length = Pleroma.Config.get([:instance, :account_field_value_length], 255)
+        user = insert(:user, nickname: "nickname@supergood.domain")
+        data = %{ap_id: user.ap_id, info: %{ fields: [%{"name" => "myfield", "value" => String.duplicate("h", current_max_length + 1)}] }}
+        assert {:ok, %User{}} = User.insert_or_update_user(data)
+    end
   end
 
   describe "per-user rich-text filtering" do