X-Git-Url: http://git.squeep.com/?a=blobdiff_plain;f=lib%2Fpleroma%2Fuser%2Fsearch.ex;h=cec59c372b835f76c2b54f0e68e814e6282c7366;hb=e2793744c5dced3ced98acb21a2ef2b13ab65ac9;hp=049e1a634d722dc333b22a8376da66fc191d53f0;hpb=5cf2c7422b006d477498af8d7618a0d6f7659290;p=akkoma diff --git a/lib/pleroma/user/search.ex b/lib/pleroma/user/search.ex index 049e1a634..cec59c372 100644 --- a/lib/pleroma/user/search.ex +++ b/lib/pleroma/user/search.ex @@ -1,5 +1,5 @@ # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors +# Copyright © 2017-2020 Pleroma Authors # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.User.Search do @@ -33,9 +33,15 @@ defmodule Pleroma.User.Search do # Strip the beginning @ off if there is a query query_string = String.trim_leading(query_string, "@") - with [name, domain] <- String.split(query_string, "@"), - formatted_domain <- String.replace(domain, ~r/[!-\-|@|[-`|{-~|\/|:|\s]+/, "") do - name <> "@" <> to_string(:idna.encode(formatted_domain)) + with [name, domain] <- String.split(query_string, "@") do + encoded_domain = + domain + |> String.replace(~r/[!-\-|@|[-`|{-~|\/|:|\s]+/, "") + |> String.to_charlist() + |> :idna.encode() + |> to_string() + + name <> "@" <> encoded_domain else _ -> query_string end @@ -45,6 +51,7 @@ defmodule Pleroma.User.Search do for_user |> base_query(following) |> filter_blocked_user(for_user) + |> filter_invisible_users() |> filter_blocked_domains(for_user) |> fts_search(query_string) |> trigram_rank(query_string) @@ -98,13 +105,17 @@ defmodule Pleroma.User.Search do defp base_query(_user, false), do: User defp base_query(user, true), do: User.get_followers_query(user) + defp filter_invisible_users(query) do + from(q in query, where: q.invisible == false) + end + defp filter_blocked_user(query, %User{} = blocker) do query - |> join(:left, [u], b in Pleroma.UserBlock, + |> join(:left, [u], b in Pleroma.UserRelationship, as: :blocks, - on: b.blocker_id == ^blocker.id and u.id == b.blockee_id + on: b.relationship_type == ^:block and b.source_id == ^blocker.id and u.id == b.target_id ) - |> where([blocks: b], is_nil(b.blockee_id)) + |> where([blocks: b], is_nil(b.target_id)) end defp filter_blocked_user(query, _), do: query