Allow underscores in usernames.
authorhref <href@random.sh>
Wed, 12 Dec 2018 17:17:15 +0000 (18:17 +0100)
committerhref <href@random.sh>
Wed, 12 Dec 2018 17:57:33 +0000 (18:57 +0100)
Fixes #429.

config/config.md
lib/pleroma/formatter.ex
lib/pleroma/user.ex
test/formatter_test.exs

index dbbfa91948d3fb0e63ea631fff161767495642e1..e8e2cf6f835a66c8a965571e8f36bf1b22f66bf8 100644 (file)
@@ -63,6 +63,8 @@ This filter replaces the filename (not the path) of an upload. For complete obfu
   * "masto": Copy verbatim, as in Mastodon.
   * "noop": Don't copy the subject.
 * `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
 This section is used to configure Pleroma-FE, unless ``:managed_config`` in ``:instance`` is set to false.
index 5b03e9aeb7b469903d12284d5e096fc3df722b8e..1fea1c57a445977b40b38830f0ae2b92d1c4aee6 100644 (file)
@@ -18,7 +18,7 @@ defmodule Pleroma.Formatter do
   def parse_mentions(text) do
     # Modified from https://www.w3.org/TR/html5/forms.html#valid-e-mail-address
     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)
     |> List.flatten()
index e146b562cbc08a5ecdcc61a125144434b9a3fa1d..f10cdfbc8ee21b6c78eb147948af94ac88aa22c0 100644 (file)
@@ -11,6 +11,11 @@ defmodule Pleroma.User do
 
   @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
     field(:bio, :string)
     field(:email, :string)
@@ -77,7 +82,6 @@ defmodule Pleroma.User do
     }
   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
     params =
       params
@@ -117,7 +121,7 @@ defmodule Pleroma.User do
     struct
     |> cast(params, [:bio, :name, :avatar])
     |> unique_constraint(:nickname)
-    |> validate_format(:nickname, ~r/^[a-zA-Z\d]+$/)
+    |> validate_format(:nickname, local_nickname_regex())
     |> validate_length(:bio, max: 5000)
     |> validate_length(:name, min: 1, max: 100)
   end
@@ -134,7 +138,7 @@ defmodule Pleroma.User do
     struct
     |> cast(params, [:bio, :name, :follower_address, :avatar, :last_refreshed_at])
     |> unique_constraint(:nickname)
-    |> validate_format(:nickname, ~r/^[a-zA-Z\d]+$/)
+    |> validate_format(:nickname, local_nickname_regex())
     |> validate_length(:bio, max: 5000)
     |> validate_length(:name, max: 100)
     |> put_embed(:info, info_cng)
@@ -172,7 +176,7 @@ defmodule Pleroma.User do
       |> validate_confirmation(:password)
       |> unique_constraint(:email)
       |> unique_constraint(:nickname)
-      |> validate_format(:nickname, ~r/^[a-zA-Z\d]+$/)
+      |> validate_format(:nickname, local_nickname_regex())
       |> validate_format(:email, @email_regex)
       |> validate_length(:bio, max: 1000)
       |> validate_length(:name, min: 1, max: 100)
@@ -861,4 +865,12 @@ defmodule Pleroma.User do
     |> List.flatten()
     |> Enum.map(&String.downcase(&1))
   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
index abb9d882c849c1305ec40b2180fc1135a0bce365..428227d7826bcb4b0aab89e365ca3d0f280e7c3c 100644 (file)
@@ -109,13 +109,13 @@ defmodule Pleroma.FormatterTest do
 
   describe "add_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"})
 
       archaeme =
         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"})
@@ -130,7 +130,7 @@ defmodule Pleroma.FormatterTest do
       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='#{
           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
         }' class='mention' href='#{archaeme_remote.ap_id}'>@<span>archaeme</span></a></span>"