# credo:disable-for-next-line Credo.Check.Readability.MaxLineLength
@email_regex ~r/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/
+ @url_regex ~r/^https?:\/\/[^\s]{1,256}$/
@strict_local_nickname_regex ~r/^[a-zA-Z\d]+$/
@extended_local_nickname_regex ~r/^[a-zA-Z\d_-]+$/
:hide_follows_count,
:hide_favorites,
:allow_following_move,
+ :also_known_as,
:background,
:show_role,
:skip_thread_containment,
:pleroma_settings_store,
:discoverable,
:actor_type,
- :also_known_as,
:accepts_chat_messages
]
)
|> unique_constraint(:nickname)
|> validate_format(:nickname, local_nickname_regex())
+ |> validate_also_known_as()
|> validate_length(:bio, max: bio_limit)
|> validate_length(:name, min: 1, max: name_limit)
|> validate_inclusion(:actor_type, ["Person", "Service"])
|> Map.put(:bio, HTML.filter_tags(user.bio, filter))
|> Map.put(:fields, fields)
end
+
+ defp validate_also_known_as(changeset) do
+ validate_change(changeset, :also_known_as, fn :also_known_as, also_known_as ->
+ case Enum.all?(also_known_as, fn a -> Regex.match?(@url_regex, a) end) do
+ true -> []
+ false -> [also_known_as: "Invalid ap_id format. Must be a URL."]
+ end
+ end)
+ end
end