Add option to restrict all users to local content
authorEgor Kislitsyn <egor@kislitsyn.com>
Tue, 11 Jun 2019 14:25:53 +0000 (21:25 +0700)
committerEgor Kislitsyn <egor@kislitsyn.com>
Tue, 11 Jun 2019 14:25:53 +0000 (21:25 +0700)
CHANGELOG.md
config/config.exs
docs/config.md
lib/pleroma/activity/search.ex
lib/pleroma/user/search.ex
test/activity_test.exs
test/user_test.exs

index d2900cc97bda2ab22296401c4dd4ff8ebbd68c74..7ecdfe93938877bde8881d46de6ae4fd75f73dc7 100644 (file)
@@ -28,7 +28,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
 - Configuration: `notify_email` option
 - Configuration: Media proxy `whitelist` option
 - Configuration: `report_uri` option
-- Configuration: `limit_unauthenticated_to_local_content` option
+- Configuration: `limit_to_local_content` option
 - Pleroma API: User subscriptions
 - Pleroma API: Healthcheck endpoint
 - Pleroma API: `/api/v1/pleroma/mascot` per-user frontend mascot configuration endpoints
index b73541213bd06aefe0979b6797c8127b36649a70..f866e8d2bda26be4ab6d2266615522d402071133 100644 (file)
@@ -245,7 +245,7 @@ config :pleroma, :instance,
   healthcheck: false,
   remote_post_retention_days: 90,
   skip_thread_containment: true,
-  limit_unauthenticated_to_local_content: true
+  limit_to_local_content: :unauthenticated
 
 config :pleroma, :markup,
   # XXX - unfortunately, inline images must be enabled by default right now, because
index b62b8049052faf0f98e8a49dbccbea255bc44be4..9e877fb51eebe7f4012344595710f299eb5f3552 100644 (file)
@@ -112,7 +112,8 @@ config :pleroma, Pleroma.Emails.Mailer,
 * `healthcheck`: If set to true, system data will be shown on ``/api/pleroma/healthcheck``.
 * `remote_post_retention_days`: The default amount of days to retain remote posts when pruning the database.
 * `skip_thread_containment`: Skip filter out broken threads. The default is `false`.
-* `limit_unauthenticated_to_local_content`: Limit unauthenticated users to search for local statutes and users only. The default is `true`.
+* `limit_to_local_content`: Limit unauthenticated users to search for local statutes and users only. Possible values: `:unauthenticated`, `:all` and `false`. The default is `:unauthenticated`.
+
 
 ## :logger
 * `backends`: `:console` is used to send logs to stdout, `{ExSyslogger, :ex_syslogger}` to log to syslog, and `Quack.Logger` to log to Slack
index 9ccedcd13397bbe862215b2b2e3ca0b22c6fc846..8cbb64cc4ea052bd5cc2c8235c179a9249d7b608 100644 (file)
@@ -56,18 +56,19 @@ defmodule Pleroma.Activity.Search do
     )
   end
 
-  # users can search everything
-  defp maybe_restrict_local(q, %User{}), do: q
+  defp maybe_restrict_local(q, user) do
+    limit = Pleroma.Config.get([:instance, :limit_to_local_content], :unauthenticated)
 
-  # unauthenticated users can only search local activities
-  defp maybe_restrict_local(q, _) do
-    if Pleroma.Config.get([:instance, :limit_unauthenticated_to_local_content], true) do
-      where(q, local: true)
-    else
-      q
+    case {limit, user} do
+      {:all, _} -> restrict_local(q)
+      {:unauthenticated, %User{}} -> q
+      {:unauthenticated, _} -> restrict_local(q)
+      {false, _} -> q
     end
   end
 
+  defp restrict_local(q), do: where(q, local: true)
+
   defp maybe_fetch(activities, user, search_query) do
     with true <- Regex.match?(~r/https?:/, search_query),
          {:ok, object} <- Fetcher.fetch_object_from_id(search_query),
index add6a0bbf63d33b4beffde0c694079ffe75b1dbc..f88dffa7be051b1201fb015ded60ce96239d0488 100644 (file)
@@ -28,16 +28,6 @@ defmodule Pleroma.User.Search do
     results
   end
 
-  defp maybe_resolve(true, %User{}, query) do
-    User.get_or_fetch(query)
-  end
-
-  defp maybe_resolve(true, _, query) do
-    unless restrict_local?(), do: User.get_or_fetch(query)
-  end
-
-  defp maybe_resolve(_, _, _), do: :noop
-
   defp search_query(query, for_user) do
     query
     |> union_query()
@@ -49,10 +39,6 @@ defmodule Pleroma.User.Search do
     |> maybe_restrict_local(for_user)
   end
 
-  defp restrict_local? do
-    Pleroma.Config.get([:instance, :limit_unauthenticated_to_local_content], true)
-  end
-
   defp union_query(query) do
     fts_subquery = fts_search_subquery(query)
     trigram_subquery = trigram_search_subquery(query)
@@ -64,17 +50,30 @@ defmodule Pleroma.User.Search do
     from(s in subquery(q), order_by: s.search_type, distinct: s.id)
   end
 
-  # unauthenticated users can only search local activities
-  defp maybe_restrict_local(q, %User{}), do: q
+  defp maybe_resolve(true, user, query) do
+    case {limit(), user} do
+      {:all, _} -> :noop
+      {:unauthenticated, %User{}} -> User.get_or_fetch(query)
+      {:unauthenticated, _} -> :noop
+      {false, _} -> User.get_or_fetch(query)
+    end
+  end
 
-  defp maybe_restrict_local(q, _) do
-    if restrict_local?() do
-      where(q, [u], u.local == true)
-    else
-      q
+  defp maybe_resolve(_, _, _), do: :noop
+
+  defp maybe_restrict_local(q, user) do
+    case {limit(), user} do
+      {:all, _} -> restrict_local(q)
+      {:unauthenticated, %User{}} -> q
+      {:unauthenticated, _} -> restrict_local(q)
+      {false, _} -> q
     end
   end
 
+  defp limit, do: Pleroma.Config.get([:instance, :limit_to_local_content], :unauthenticated)
+
+  defp restrict_local(q), do: where(q, [u], u.local == true)
+
   defp boost_search_rank_query(query, nil), do: query
 
   defp boost_search_rank_query(query, for_user) do
index e56e39096e804f80ff789ccfba403d594e25a51b..7ba4363c863320ea2bb2f7fffb1a0a178d4f58be 100644 (file)
@@ -139,18 +139,25 @@ defmodule Pleroma.ActivityTest do
       assert [^local_activity] = Activity.search(nil, "find me")
     end
 
-    test "find all statuses for unauthenticated users when `limit_unauthenticated_to_local_content` is `false`",
+    test "find only local statuses for unauthenticated users  when `limit_to_local_content` is `:all`",
+         %{local_activity: local_activity} do
+      Pleroma.Config.put([:instance, :limit_to_local_content], :all)
+      assert [^local_activity] = Activity.search(nil, "find me")
+      Pleroma.Config.put([:instance, :limit_to_local_content], :unauthenticated)
+    end
+
+    test "find all statuses for unauthenticated users when `limit_to_local_content` is `false`",
          %{
            local_activity: local_activity,
            remote_activity: remote_activity
          } do
-      Pleroma.Config.put([:instance, :limit_unauthenticated_to_local_content], false)
+      Pleroma.Config.put([:instance, :limit_to_local_content], false)
 
       activities = Enum.sort_by(Activity.search(nil, "find me"), & &1.id)
 
       assert [^local_activity, ^remote_activity] = activities
 
-      Pleroma.Config.put([:instance, :limit_unauthenticated_to_local_content], true)
+      Pleroma.Config.put([:instance, :limit_to_local_content], :unauthenticated)
     end
   end
 end
index 8dd672173cf33412a3a49e0b4416595e87468603..473f545ff9ab782a6909c9c5c22ca08e04d8e324 100644 (file)
@@ -1099,8 +1099,20 @@ defmodule Pleroma.UserTest do
       assert [%{id: ^id}] = User.search("lain")
     end
 
-    test "find all users for unauthenticated users when `limit_unauthenticated_to_local_content` is `false`" do
-      Pleroma.Config.put([:instance, :limit_unauthenticated_to_local_content], false)
+    test "find only local users for authenticated users when `limit_to_local_content` is `:all`" do
+      Pleroma.Config.put([:instance, :limit_to_local_content], :all)
+
+      %{id: id} = insert(:user, %{name: "lain"})
+      insert(:user, %{name: "ebn", nickname: "lain@mastodon.social", local: false})
+      insert(:user, %{nickname: "lain@pleroma.soykaf.com", local: false})
+
+      assert [%{id: ^id}] = User.search("lain")
+
+      Pleroma.Config.put([:instance, :limit_to_local_content], :unauthenticated)
+    end
+
+    test "find all users for unauthenticated users when `limit_to_local_content` is `false`" do
+      Pleroma.Config.put([:instance, :limit_to_local_content], false)
 
       u1 = insert(:user, %{name: "lain"})
       u2 = insert(:user, %{name: "ebn", nickname: "lain@mastodon.social", local: false})
@@ -1114,7 +1126,7 @@ defmodule Pleroma.UserTest do
 
       assert [u1.id, u2.id, u3.id] == results
 
-      Pleroma.Config.put([:instance, :limit_unauthenticated_to_local_content], true)
+      Pleroma.Config.put([:instance, :limit_to_local_content], :unauthenticated)
     end
 
     test "finds a user whose name is nil" do