Page MenuHomePhorge

No OneTemporary

Size
4 KB
Referenced Files
None
Subscribers
None
diff --git a/lib/pleroma/ecto_type/activity_pub/object_validators/map_of_string.ex b/lib/pleroma/ecto_type/activity_pub/object_validators/map_of_string.ex
index 6a971f27e..f365772ba 100644
--- a/lib/pleroma/ecto_type/activity_pub/object_validators/map_of_string.ex
+++ b/lib/pleroma/ecto_type/activity_pub/object_validators/map_of_string.ex
@@ -1,51 +1,25 @@
# Pleroma: A lightweight social networking server
# Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only
defmodule Pleroma.EctoType.ActivityPub.ObjectValidators.MapOfString do
use Ecto.Type
- def type, do: :map
-
- def cast(object) when is_map(object) do
- data =
- object
- |> Enum.reduce(%{}, fn
- {lang, value}, acc when is_binary(lang) and is_binary(value) ->
- if is_good_locale_code?(lang) do
- Map.put(acc, lang, value)
- else
- acc
- end
+ alias Pleroma.MultiLanguage
- _, acc ->
- acc
- end)
+ def type, do: :map
- if data == %{} do
- {:ok, nil}
- else
+ def cast(object) do
+ with {status, %{} = data} when status in [:modified, :ok] <- MultiLanguage.validate_map(object) do
{:ok, data}
- end
- end
-
- def cast(_), do: :error
-
- defp is_good_locale_code?(code) do
- code
- |> String.codepoints()
- |> Enum.all?(&valid_char?/1)
- end
+ else
+ {:modified, nil} -> {:ok, nil}
- # [a-zA-Z0-9-]
- defp valid_char?(char) do
- ("a" <= char and char <= "z") or
- ("A" <= char and char <= "Z") or
- ("0" <= char and char <= "9") or
- char == "-"
+ {:error, _} -> :error
+ end
end
def dump(data), do: {:ok, data}
def load(data), do: {:ok, data}
end
diff --git a/lib/pleroma/multi_language.ex b/lib/pleroma/multi_language.ex
index 0c02757ee..14d56cea1 100644
--- a/lib/pleroma/multi_language.ex
+++ b/lib/pleroma/multi_language.ex
@@ -1,48 +1,86 @@
# Pleroma: A lightweight social networking server
# Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only
defmodule Pleroma.MultiLanguage do
defp template(:multi), do: Pleroma.Config.get([__MODULE__, :template])
defp template(:single), do: Pleroma.Config.get([__MODULE__, :single_line_template])
defp sep(:multi), do: Pleroma.Config.get([__MODULE__, :separator])
defp sep(:single), do: Pleroma.Config.get([__MODULE__, :single_line_separator])
+ defp is_good_locale_code?(code) do
+ code
+ |> String.codepoints()
+ |> Enum.all?(&valid_char?/1)
+ end
+
+ # [a-zA-Z0-9-]
+ defp valid_char?(char) do
+ ("a" <= char and char <= "z") or
+ ("A" <= char and char <= "Z") or
+ ("0" <= char and char <= "9") or
+ char == "-"
+ end
+
+ def validate_map(%{} = object) do
+ {status, data} =
+ object
+ |> Enum.reduce({:ok, %{}}, fn
+ {lang, value}, {status, acc} when is_binary(lang) and is_binary(value) ->
+ if is_good_locale_code?(lang) do
+ {status, Map.put(acc, lang, value)}
+ else
+ {:modified, acc}
+ end
+
+ _, {_status, acc} ->
+ {:modified, acc}
+ end)
+
+ if data == %{} do
+ {status, nil}
+ else
+ {status, data}
+ end
+ end
+
+ def validate_map(_), do: {:error, nil}
+
def map_to_str(data, opts \\ []) do
map_to_str_impl(data, if(opts[:multiline], do: :multi, else: :single))
end
defp map_to_str_impl(data, mode) do
with ks <- Map.keys(data),
[_, _ | _] <- ks,
ks <- Enum.sort(ks) do
template = template(mode)
ks
|> Enum.map(fn lang ->
format_template(template, %{code: lang, content: data[lang]})
end)
|> Enum.join(sep(mode))
else
[lang] -> data[lang]
_ -> nil
end
end
def str_to_map(data) do
%{"und" => data}
end
def format_template(template, %{code: code, content: content}) do
template
|> String.replace(
["{code}", "{content}"],
fn
"{code}" -> code
"{content}" -> content
end,
global: true
)
end
end

File Metadata

Mime Type
text/x-diff
Expires
Fri, Aug 28, 12:48 PM (6 h, 53 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1736414
Default Alt Text
(4 KB)

Event Timeline