Do not serve RSS/Atom feeds when instance is private
authorMark Felder <feld@FreeBSD.org>
Mon, 31 Aug 2020 20:58:21 +0000 (15:58 -0500)
committerrinpatch <rinpatch@sdf.org>
Tue, 8 Sep 2020 17:21:34 +0000 (20:21 +0300)
lib/pleroma/web/feed/tag_controller.ex
lib/pleroma/web/feed/user_controller.ex
lib/pleroma/web/metadata/feed.ex
test/web/feed/tag_controller_test.exs
test/web/feed/user_controller_test.exs

index 39b2a766a503cc25ff8715e435d18ec6917f1c82..e090dd625f8c2972a5bd0d1f4ea1516ca1c61aa9 100644 (file)
@@ -9,7 +9,15 @@ defmodule Pleroma.Web.Feed.TagController do
   alias Pleroma.Web.ActivityPub.ActivityPub
   alias Pleroma.Web.Feed.FeedView
 
-  def feed(conn, %{"tag" => raw_tag} = params) do
+  def feed(conn, params) do
+    if Pleroma.Config.get!([:instance, :public]) do
+      render_feed(conn, params)
+    else
+      render_error(conn, :not_found, "Not found")
+    end
+  end
+
+  def render_feed(conn, %{"tag" => raw_tag} = params) do
     {format, tag} = parse_tag(raw_tag)
 
     activities =
index 9cd334a3350257f325a493a3b414460c1faeeb34..595889b9d31ebaf16c197b83248947184ca2e4e2 100644 (file)
@@ -37,7 +37,15 @@ defmodule Pleroma.Web.Feed.UserController do
     end
   end
 
-  def feed(conn, %{"nickname" => nickname} = params) do
+  def feed(conn, params) do
+    if Pleroma.Config.get!([:instance, :public]) do
+      render_feed(conn, params)
+    else
+      errors(conn, {:error, :not_found})
+    end
+  end
+
+  def render_feed(conn, %{"nickname" => nickname} = params) do
     format = get_format(conn)
 
     format =
index bd1459a171f2eaf782f4d1d5c5cbcd19ddf80d76..dfe391b56163842b0802c6273a5d1dee07504cb1 100644 (file)
@@ -11,13 +11,17 @@ defmodule Pleroma.Web.Metadata.Providers.Feed do
 
   @impl Provider
   def build_tags(%{user: user}) do
-    [
-      {:link,
-       [
-         rel: "alternate",
-         type: "application/atom+xml",
-         href: Helpers.user_feed_path(Endpoint, :feed, user.nickname) <> ".atom"
-       ], []}
-    ]
+    if Pleroma.Config.get!([:instance, :public]) do
+      [
+        {:link,
+         [
+           rel: "alternate",
+           type: "application/atom+xml",
+           href: Helpers.user_feed_path(Endpoint, :feed, user.nickname) <> ".atom"
+         ], []}
+      ]
+    else
+      []
+    end
   end
 end
index 3c29cd94fadd501cfb4c8ffdaade5909f7229e3c..868e4096511320a93668f0fbdbf66064e0d1914b 100644 (file)
@@ -181,4 +181,17 @@ defmodule Pleroma.Web.Feed.TagControllerTest do
              'yeah #PleromaArt'
            ]
   end
+
+  describe "private instance" do
+    setup do: clear_config([:instance, :public])
+
+    test "returns 404 for tags feed", %{conn: conn} do
+      Config.put([:instance, :public], false)
+
+      conn
+      |> put_req_header("accept", "application/rss+xml")
+      |> get(tag_feed_path(conn, :feed, "pleromaart"))
+      |> response(404)
+    end
+  end
 end
index 0d2a619674d053039c8df113126f95fc9e75985f..9a5610baa9bd78ae47cbfe3ef8e232e81dad7030 100644 (file)
@@ -246,4 +246,20 @@ defmodule Pleroma.Web.Feed.UserControllerTest do
       assert response == ~S({"error":"Not found"})
     end
   end
+
+  describe "private instance" do
+    setup do: clear_config([:instance, :public])
+
+    test "returns 404 for user feed", %{conn: conn} do
+      Config.put([:instance, :public], false)
+      user = insert(:user)
+
+      {:ok, _} = CommonAPI.post(user, %{status: "test"})
+
+      assert conn
+             |> put_req_header("accept", "application/atom+xml")
+             |> get(user_feed_path(conn, :feed, user.nickname))
+             |> response(404)
+    end
+  end
 end