[#2301] Proper handling of `User.is_discoverable`: users appear in in-service search...
authorIvan Tashkinov <ivantashkinov@gmail.com>
Thu, 19 Nov 2020 16:30:02 +0000 (19:30 +0300)
committerIvan Tashkinov <ivantashkinov@gmail.com>
Thu, 19 Nov 2020 16:30:02 +0000 (19:30 +0300)
13 files changed:
CHANGELOG.md
docs/API/admin_api.md
docs/API/differences_in_mastoapi_responses.md
lib/pleroma/user/search.ex
lib/pleroma/web/activity_pub/views/user_view.ex
lib/pleroma/web/api_spec/operations/account_operation.ex
lib/pleroma/web/api_spec/schemas/account.ex
lib/pleroma/web/mastodon_api/controllers/account_controller.ex
lib/pleroma/web/metadata/providers/restrict_indexing.ex
test/pleroma/user_search_test.exs
test/pleroma/web/admin_api/search_test.exs
test/pleroma/web/metadata/providers/restrict_indexing_test.exs
test/pleroma/web/metadata_test.exs [deleted file]

index 8658d544099f7bae38c731b891ba59870b0aa502..6caed11237c50aa2ffe6380e6000510987110f1a 100644 (file)
@@ -34,6 +34,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
 
 ### Fixed
 
+- Users with `is_discoverable` field set to false (default value) will appear in in-service search results but be hidden from external services (search bots etc.).
+
 <details>
   <summary>API Changes</summary>
 - Mastodon API: Current user is now included in conversation if it's the only participant.
@@ -70,7 +72,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
 - Renamed `:await_up_timeout` in `:connections_pool` namespace to `:connect_timeout`, old name is deprecated.
 - Renamed `:timeout` in `pools` namespace to `:recv_timeout`, old name is deprecated.
 - The `discoverable` field in the `User` struct will now add a NOINDEX metatag to profile pages when false.
-- Users with the `discoverable` field set to false will not show up in searches.
+- Users with the `is_discoverable` field set to false will not show up in searches ([bug](https://git.pleroma.social/pleroma/pleroma/-/issues/2301)).
 - Minimum lifetime for ephmeral activities changed to 10 minutes and made configurable (`:min_lifetime` option).
 - Introduced optional dependencies on `ffmpeg`, `ImageMagick`, `exiftool` software packages. Please refer to `docs/installation/optional/media_graphics_packages.md`.
 - <details>
index 19ac6a65f51e0dc49f08f87246f0a0a77bf50885..266f8cef8e97ba546708d17dc07b9c2ebdeec697 100644 (file)
@@ -554,7 +554,7 @@ Response:
   * `show_role`
   * `skip_thread_containment`
   * `fields`
-  * `discoverable`
+  * `is_discoverable`
   * `actor_type`
 
 * Responses:
index 843496482905868a7d312d51215c40a3b8ef8987..6b0ad85d13bf13166885ddd01dd2c7b6ad0a0aa6 100644 (file)
@@ -84,7 +84,7 @@ Has these additional fields under the `pleroma` object:
 
 - `show_role`: boolean, nullable, true when the user wants his role (e.g admin, moderator) to be shown
 - `no_rich_text` - boolean, nullable, true when html tags are stripped from all statuses requested from the API
-- `discoverable`: boolean, true when the user allows discovery of the account in search results and other services.
+- `discoverable`: boolean, true when the user allows external services (search bots) etc. to index / list the account (regardless of this setting, user will still appear in regular search results)
 - `actor_type`: string, the type of this account.
 
 ## Conversations
@@ -207,7 +207,7 @@ Additional parameters can be added to the JSON body/Form data:
 - `skip_thread_containment` - if true, skip filtering out broken threads
 - `allow_following_move` - if true, allows automatically follow moved following accounts
 - `pleroma_background_image` - sets the background image of the user. Can be set to "" (an empty string) to reset.
-- `discoverable` - if true, discovery of this account in search results and other services is allowed.
+- `discoverable` - if true, external services (search bots) etc. are allowed to index / list the account (regardless of this setting, user will still appear in regular search results).
 - `actor_type` - the type of this account.
 - `accepts_chat_messages` - if false, this account will reject all chat messages.
 
index b54111090596e717d69e30082cbc5ed76f36911c..f1761ef032d1fe26455e24ebad287aa5bf66a5f9 100644 (file)
@@ -85,7 +85,6 @@ defmodule Pleroma.User.Search do
     |> base_query(following)
     |> filter_blocked_user(for_user)
     |> filter_invisible_users()
-    |> filter_non_discoverable_users()
     |> filter_internal_users()
     |> filter_blocked_domains(for_user)
     |> fts_search(query_string)
@@ -163,12 +162,6 @@ defmodule Pleroma.User.Search do
     from(q in query, where: q.invisible == false)
   end
 
-  defp filter_non_discoverable_users(query) do
-    # Note: commented out — can't do it with users being non-discoverable by default
-    # from(q in query, where: q.is_discoverable == true)
-    query
-  end
-
   defp filter_internal_users(query) do
     from(q in query, where: q.actor_type != "Application")
   end
index 4dc45cde344873d1f6d74a6b0c4b9783b3fde6ed..93c9f436c4acb70478dfe9919281c6e3c8662c13 100644 (file)
@@ -110,6 +110,7 @@ defmodule Pleroma.Web.ActivityPub.UserView do
       "endpoints" => endpoints,
       "attachment" => fields,
       "tag" => emoji_tags,
+      # Note: key name is indeed "discoverable" (not an error)
       "discoverable" => user.is_discoverable,
       "capabilities" => capabilities
     }
index 05595bc2a8ae9cc2d62c31de96223c8166af3a2a..280100c3d13edd68383d97394ff4f268fa8acc15 100644 (file)
@@ -624,7 +624,7 @@ defmodule Pleroma.Web.ApiSpec.AccountOperation do
           allOf: [BooleanLike],
           nullable: true,
           description:
-            "Discovery of this account in search results and other services is allowed."
+            "Discovery (listing, indexing) of this account by external services (search bots etc.) is allowed."
         },
         actor_type: ActorType
       },
index ca79f0747861b93bb63e5d40022878369ffad247..684f6fc92e3287ee61d780344162d2a9674859c1 100644 (file)
@@ -127,7 +127,7 @@ defmodule Pleroma.Web.ApiSpec.Schemas.Account do
               discoverable: %Schema{
                 type: :boolean,
                 description:
-                  "whether the user allows discovery of the account in search results and other services."
+                  "whether the user allows indexing / listing of the account by external services (search engines etc.)."
               },
               no_rich_text: %Schema{
                 type: :boolean,
index 7ed4603a40f6f450d7832280f5977e2d2c568d49..7011b7eb15a94694d1575dd81cdcb8d35a26d7a7 100644 (file)
@@ -208,7 +208,9 @@ defmodule Pleroma.Web.MastodonAPI.AccountController do
         if bot, do: {:ok, "Service"}, else: {:ok, "Person"}
       end)
       |> Maps.put_if_present(:actor_type, params[:actor_type])
+      # Note: param name is indeed :locked (not an error)
       |> Maps.put_if_present(:is_locked, params[:locked])
+      # Note: param name is indeed :discoverable (not an error)
       |> Maps.put_if_present(:is_discoverable, params[:discoverable])
 
     # What happens here:
index 900c2434de216363fb9243a91a654d9f7619983d..a08a04b4a92f590e4b270dafc1b8b3f1b1d0d217 100644 (file)
@@ -6,7 +6,7 @@ defmodule Pleroma.Web.Metadata.Providers.RestrictIndexing do
   @behaviour Pleroma.Web.Metadata.Providers.Provider
 
   @moduledoc """
-  Restricts indexing of remote users.
+  Restricts indexing of remote and/or non-discoverable users.
   """
 
   @impl true
index d5ab5a0035c875407a508b2aa7a48ae0da0e63d0..de1df2e9c362264295c492b44426e285d29934bd 100644 (file)
@@ -65,8 +65,8 @@ defmodule Pleroma.UserSearchTest do
       assert found_user.id == user.id
     end
 
-    # NOTE: as long as users are non-discoverable by default, we can't filter out most users: #2301
-    test "does NOT exclude non-discoverable users from results (as long as it's the default)" do
+    # Note: as in Mastodon, `is_discoverable` doesn't anyhow relate to user searchability
+    test "includes non-discoverable users in results" do
       insert(:user, %{nickname: "john 3000", is_discoverable: false})
       insert(:user, %{nickname: "john 3001"})
 
index 92a116c659e337fceed074396ed1476af6c7494b..9bc58640c7901c8e584ebaedba643cbeca6cdf2a 100644 (file)
@@ -203,6 +203,7 @@ defmodule Pleroma.Web.AdminAPI.SearchTest do
       assert count == 1
     end
 
+    # Note: as in Mastodon, `is_discoverable` doesn't anyhow relate to user searchability
     test "it returns non-discoverable users" do
       insert(:user)
       insert(:user, is_discoverable: false)
index 282d132c8104a672f52087fb52316d24c91de170..52399fdc80334de928f4b78396cd4c223f23ed5b 100644 (file)
@@ -18,7 +18,7 @@ defmodule Pleroma.Web.Metadata.Providers.RestrictIndexingTest do
              }) == []
     end
 
-    test "for local user when discoverable is false" do
+    test "for local user when `is_discoverable` is false" do
       assert Pleroma.Web.Metadata.Providers.RestrictIndexing.build_tags(%{
                user: %Pleroma.User{local: true, is_discoverable: false}
              }) == [{:meta, [name: "robots", content: "noindex, noarchive"], []}]
diff --git a/test/pleroma/web/metadata_test.exs b/test/pleroma/web/metadata_test.exs
deleted file mode 100644 (file)
index 8fb9465..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-# Pleroma: A lightweight social networking server
-# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
-# SPDX-License-Identifier: AGPL-3.0-only
-
-defmodule Pleroma.Web.MetadataTest do
-  use Pleroma.DataCase, async: true
-
-  import Pleroma.Factory
-
-  describe "restrict indexing remote users" do
-    test "for remote user" do
-      user = insert(:user, local: false)
-
-      assert Pleroma.Web.Metadata.build_tags(%{user: user}) =~
-               "<meta content=\"noindex, noarchive\" name=\"robots\">"
-    end
-
-    test "for local user" do
-      user = insert(:user, is_discoverable: false)
-
-      assert Pleroma.Web.Metadata.build_tags(%{user: user}) =~
-               "<meta content=\"noindex, noarchive\" name=\"robots\">"
-    end
-
-    test "for local user set to discoverable" do
-      user = insert(:user, is_discoverable: true)
-
-      refute Pleroma.Web.Metadata.build_tags(%{user: user}) =~
-               "<meta content=\"noindex, noarchive\" name=\"robots\">"
-    end
-  end
-
-  describe "no metadata for private instances" do
-    test "for local user set to discoverable" do
-      clear_config([:instance, :public], false)
-      user = insert(:user, bio: "This is my secret fedi account bio", is_discoverable: true)
-
-      assert "" = Pleroma.Web.Metadata.build_tags(%{user: user})
-    end
-
-    test "search exclusion metadata is included" do
-      clear_config([:instance, :public], false)
-      user = insert(:user, bio: "This is my secret fedi account bio", is_discoverable: false)
-
-      assert ~s(<meta content="noindex, noarchive" name="robots">) ==
-               Pleroma.Web.Metadata.build_tags(%{user: user})
-    end
-  end
-end