mix format
[akkoma] / lib / pleroma / user / info.ex
index 45a39924b94853a377244d06ba2106fc6650b741..ca1282d02beb518435f0059e2113ce6879e93381 100644 (file)
@@ -49,7 +49,7 @@ defmodule Pleroma.User.Info do
     field(:mascot, :map, default: nil)
     field(:emoji, {:array, :map}, default: [])
     field(:pleroma_settings_store, :map, default: %{})
-    field(:fields, {:array, :map}, default: [])
+    field(:fields, {:array, :map}, default: nil)
     field(:raw_fields, {:array, :map}, default: [])
 
     field(:notification_settings, :map,
@@ -242,6 +242,8 @@ 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 +328,16 @@ 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)
@@ -422,7 +434,7 @@ defmodule Pleroma.User.Info do
 
   # ``fields`` is an array of mastodon profile field, containing ``{"name": "…", "value": "…"}``.
   # For example: [{"name": "Pronoun", "value": "she/her"}, …]
-  def fields(%{fields: [], source_data: %{"attachment" => attachment}}) do
+  def fields(%{fields: nil, source_data: %{"attachment" => attachment}}) do
     limit = Pleroma.Config.get([:instance, :max_remote_account_fields], 0)
 
     attachment
@@ -431,6 +443,8 @@ defmodule Pleroma.User.Info do
     |> Enum.take(limit)
   end
 
+  def fields(%{fields: nil}), do: []
+
   def fields(%{fields: fields}), do: fields
 
   def follow_information_update(info, params) do