@@ -63,6 +63,8 @@ This filter replaces the filename (not the path) of an upload. For complete obfu | |||||
* "masto": Copy verbatim, as in Mastodon. | * "masto": Copy verbatim, as in Mastodon. | ||||
* "noop": Don't copy the subject. | * "noop": Don't copy the subject. | ||||
* `always_show_subject_input`: When set to false, auto-hide the subject field when it's empty. | * `always_show_subject_input`: When set to false, auto-hide the subject field when it's empty. | ||||
* `extended_nickname_format`: Set to `true` to use extended local nicknames format (allows underscore). This will break federation with | |||||
older software for theses nicknames. | |||||
## :fe | ## :fe | ||||
This section is used to configure Pleroma-FE, unless ``:managed_config`` in ``:instance`` is set to false. | This section is used to configure Pleroma-FE, unless ``:managed_config`` in ``:instance`` is set to false. | ||||
@@ -18,7 +18,7 @@ defmodule Pleroma.Formatter do | |||||
def parse_mentions(text) do | def parse_mentions(text) do | ||||
# Modified from https://www.w3.org/TR/html5/forms.html#valid-e-mail-address | # Modified from https://www.w3.org/TR/html5/forms.html#valid-e-mail-address | ||||
regex = | 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])?)*/u | |||||
~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])?)*/u | |||||
Regex.scan(regex, text) | Regex.scan(regex, text) | ||||
|> List.flatten() | |> List.flatten() | ||||
@@ -11,6 +11,11 @@ defmodule Pleroma.User do | |||||
@type t :: %__MODULE__{} | @type t :: %__MODULE__{} | ||||
@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])?)*$/ | |||||
@strict_local_nickname_regex ~r/^[a-zA-Z\d]+$/ | |||||
@extended_local_nickname_regex ~r/^[a-zA-Z\d_]+$/ | |||||
schema "users" do | schema "users" do | ||||
field(:bio, :string) | field(:bio, :string) | ||||
field(:email, :string) | field(:email, :string) | ||||
@@ -77,7 +82,6 @@ defmodule Pleroma.User do | |||||
} | } | ||||
end | end | ||||
@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])?)*$/ | |||||
def remote_user_creation(params) do | def remote_user_creation(params) do | ||||
params = | params = | ||||
params | params | ||||
@@ -117,7 +121,7 @@ defmodule Pleroma.User do | |||||
struct | struct | ||||
|> cast(params, [:bio, :name, :avatar]) | |> cast(params, [:bio, :name, :avatar]) | ||||
|> unique_constraint(:nickname) | |> unique_constraint(:nickname) | ||||
|> validate_format(:nickname, ~r/^[a-zA-Z\d]+$/) | |||||
|> validate_format(:nickname, local_nickname_regex()) | |||||
|> validate_length(:bio, max: 5000) | |> validate_length(:bio, max: 5000) | ||||
|> validate_length(:name, min: 1, max: 100) | |> validate_length(:name, min: 1, max: 100) | ||||
end | end | ||||
@@ -134,7 +138,7 @@ defmodule Pleroma.User do | |||||
struct | struct | ||||
|> cast(params, [:bio, :name, :follower_address, :avatar, :last_refreshed_at]) | |> cast(params, [:bio, :name, :follower_address, :avatar, :last_refreshed_at]) | ||||
|> unique_constraint(:nickname) | |> unique_constraint(:nickname) | ||||
|> validate_format(:nickname, ~r/^[a-zA-Z\d]+$/) | |||||
|> validate_format(:nickname, local_nickname_regex()) | |||||
|> validate_length(:bio, max: 5000) | |> validate_length(:bio, max: 5000) | ||||
|> validate_length(:name, max: 100) | |> validate_length(:name, max: 100) | ||||
|> put_embed(:info, info_cng) | |> put_embed(:info, info_cng) | ||||
@@ -172,7 +176,7 @@ defmodule Pleroma.User do | |||||
|> validate_confirmation(:password) | |> validate_confirmation(:password) | ||||
|> unique_constraint(:email) | |> unique_constraint(:email) | ||||
|> unique_constraint(:nickname) | |> unique_constraint(:nickname) | ||||
|> validate_format(:nickname, ~r/^[a-zA-Z\d]+$/) | |||||
|> validate_format(:nickname, local_nickname_regex()) | |||||
|> validate_format(:email, @email_regex) | |> validate_format(:email, @email_regex) | ||||
|> validate_length(:bio, max: 1000) | |> validate_length(:bio, max: 1000) | ||||
|> validate_length(:name, min: 1, max: 100) | |> validate_length(:name, min: 1, max: 100) | ||||
@@ -861,4 +865,12 @@ defmodule Pleroma.User do | |||||
|> List.flatten() | |> List.flatten() | ||||
|> Enum.map(&String.downcase(&1)) | |> Enum.map(&String.downcase(&1)) | ||||
end | end | ||||
defp local_nickname_regex() do | |||||
if Pleroma.Config.get([:instance, :extended_nickname_format]) do | |||||
@extended_local_nickname_regex | |||||
else | |||||
@strict_local_nickname_regex | |||||
end | |||||
end | |||||
end | end |
@@ -109,13 +109,13 @@ defmodule Pleroma.FormatterTest do | |||||
describe "add_user_links" do | describe "add_user_links" do | ||||
test "gives a replacement for user links" do | test "gives a replacement for user links" do | ||||
text = "@gsimg According to @archaeme, that is @daggsy. Also hello @archaeme@archae.me" | |||||
text = "@gsimg According to @archa_eme_, that is @daggsy. Also hello @archaeme@archae.me" | |||||
gsimg = insert(:user, %{nickname: "gsimg"}) | gsimg = insert(:user, %{nickname: "gsimg"}) | ||||
archaeme = | archaeme = | ||||
insert(:user, %{ | insert(:user, %{ | ||||
nickname: "archaeme", | |||||
info: %Pleroma.User.Info{source_data: %{"url" => "https://archeme/@archaeme"}} | |||||
nickname: "archa_eme_", | |||||
info: %Pleroma.User.Info{source_data: %{"url" => "https://archeme/@archa_eme_"}} | |||||
}) | }) | ||||
archaeme_remote = insert(:user, %{nickname: "archaeme@archae.me"}) | archaeme_remote = insert(:user, %{nickname: "archaeme@archae.me"}) | ||||
@@ -130,7 +130,7 @@ defmodule Pleroma.FormatterTest do | |||||
expected_text = | expected_text = | ||||
"<span><a data-user='#{gsimg.id}' class='mention' href='#{gsimg.ap_id}'>@<span>gsimg</span></a></span> According to <span><a data-user='#{ | "<span><a data-user='#{gsimg.id}' class='mention' href='#{gsimg.ap_id}'>@<span>gsimg</span></a></span> According to <span><a data-user='#{ | ||||
archaeme.id | archaeme.id | ||||
}' class='mention' href='#{"https://archeme/@archaeme"}'>@<span>archaeme</span></a></span>, that is @daggsy. Also hello <span><a data-user='#{ | |||||
}' class='mention' href='#{"https://archeme/@archa_eme_"}'>@<span>archa_eme_</span></a></span>, that is @daggsy. Also hello <span><a data-user='#{ | |||||
archaeme_remote.id | archaeme_remote.id | ||||
}' class='mention' href='#{archaeme_remote.ap_id}'>@<span>archaeme</span></a></span>" | }' class='mention' href='#{archaeme_remote.ap_id}'>@<span>archaeme</span></a></span>" | ||||