Allow dashes in domain name search

This commit is contained in:
FloatingGhost 2022-12-06 10:57:10 +00:00
parent 8e5a88edf7
commit b058df3faa
3 changed files with 36 additions and 3 deletions

View file

@ -62,6 +62,11 @@ defp maybe_add_uri_match(list, query) do
end end
end end
def sanitise_domain(domain) do
domain
|> String.replace(~r/[!-\,|@|?|<|>|[-`|{-~|\/|:|\s]+/, "")
end
defp format_query(query_string) do defp format_query(query_string) do
# Strip the beginning @ off if there is a query # Strip the beginning @ off if there is a query
query_string = String.trim_leading(query_string, "@") query_string = String.trim_leading(query_string, "@")
@ -69,7 +74,7 @@ defp format_query(query_string) do
with [name, domain] <- String.split(query_string, "@") do with [name, domain] <- String.split(query_string, "@") do
encoded_domain = encoded_domain =
domain domain
|> String.replace(~r/[!-\-|@|[-`|{-~|\/|:|\s]+/, "") |> sanitise_domain()
|> String.to_charlist() |> String.to_charlist()
|> :idna.encode() |> :idna.encode()
|> to_string() |> to_string()

View file

@ -0,0 +1,22 @@
defmodule Pleroma.User.SearchTest do
use Pleroma.DataCase
describe "sanitise_domain/1" do
test "should remove url-reserved characters" do
examples = [
["example.com", "example.com"],
["no spaces", "nospaces"],
["no@at", "noat"],
["dash-is-ok", "dash-is-ok"],
["underscore_not_so_much", "underscorenotsomuch"],
["no!", "no"],
["no?", "no"],
["a$b%s^o*l(u)t'e#l<y n>o/t", "absolutelynot"]
]
for [input, expected] <- examples do
assert Pleroma.User.Search.sanitise_domain(input) == expected
end
end
end
end

View file

@ -725,13 +725,19 @@ test "it should return public activities that reference a given hashtag" do
user = insert(:user) user = insert(:user)
other_user = insert(:user) other_user = insert(:user)
{:ok, normally_visible} = CommonAPI.post(other_user, %{status: "hello :)", visibility: "public"}) {:ok, normally_visible} =
CommonAPI.post(other_user, %{status: "hello :)", visibility: "public"})
{:ok, public} = CommonAPI.post(user, %{status: "maji #tenshi", visibility: "public"}) {:ok, public} = CommonAPI.post(user, %{status: "maji #tenshi", visibility: "public"})
{:ok, _unrelated} = CommonAPI.post(user, %{status: "dai #tensh", visibility: "public"}) {:ok, _unrelated} = CommonAPI.post(user, %{status: "dai #tensh", visibility: "public"})
{:ok, unlisted} = CommonAPI.post(user, %{status: "maji #tenshi", visibility: "unlisted"}) {:ok, unlisted} = CommonAPI.post(user, %{status: "maji #tenshi", visibility: "unlisted"})
{:ok, _private} = CommonAPI.post(user, %{status: "maji #tenshi", visibility: "private"}) {:ok, _private} = CommonAPI.post(user, %{status: "maji #tenshi", visibility: "private"})
activities = ActivityPub.fetch_activities([other_user.follower_address], %{followed_hashtags: [hashtag.id]}) activities =
ActivityPub.fetch_activities([other_user.follower_address], %{
followed_hashtags: [hashtag.id]
})
assert length(activities) == 3 assert length(activities) == 3
normal_id = normally_visible.id normal_id = normally_visible.id
public_id = public.id public_id = public.id