diff options
| -rw-r--r-- | docs/API/differences_in_mastoapi_responses.md | 2 | ||||
| -rw-r--r-- | docs/clients.md | 2 | ||||
| -rw-r--r-- | lib/pleroma/plugs/federating_plug.ex | 18 | ||||
| -rw-r--r-- | lib/pleroma/plugs/static_fe_plug.ex | 5 | ||||
| -rw-r--r-- | lib/pleroma/web/activity_pub/activity_pub_controller.ex | 69 | ||||
| -rw-r--r-- | lib/pleroma/web/ostatus/ostatus_controller.ex | 2 | ||||
| -rw-r--r-- | lib/pleroma/web/router.ex | 3 | ||||
| -rw-r--r-- | lib/pleroma/web/twitter_api/controllers/remote_follow_controller.ex | 2 | ||||
| -rw-r--r-- | lib/pleroma/web/twitter_api/controllers/util_controller.ex | 2 | ||||
| -rw-r--r-- | test/plugs/oauth_plug_test.exs | 2 | ||||
| -rw-r--r-- | test/web/activity_pub/activity_pub_controller_test.exs | 75 | ||||
| -rw-r--r-- | test/web/activity_pub/publisher_test.exs | 4 | ||||
| -rw-r--r-- | test/web/feed/user_controller_test.exs | 133 | ||||
| -rw-r--r-- | test/web/ostatus/ostatus_controller_test.exs | 29 | ||||
| -rw-r--r-- | test/web/static_fe/static_fe_controller_test.exs | 119 | ||||
| -rw-r--r-- | test/web/twitter_api/remote_follow_controller_test.exs | 6 | ||||
| -rw-r--r-- | test/web/twitter_api/util_controller_test.exs | 37 | 
17 files changed, 324 insertions, 186 deletions
diff --git a/docs/API/differences_in_mastoapi_responses.md b/docs/API/differences_in_mastoapi_responses.md index 06de90f71..476a4a2bf 100644 --- a/docs/API/differences_in_mastoapi_responses.md +++ b/docs/API/differences_in_mastoapi_responses.md @@ -180,7 +180,7 @@ Post here request with grant_type=refresh_token to obtain new access token. Retu  ## Account Registration  `POST /api/v1/accounts` -Has theses additionnal parameters (which are the same as in Pleroma-API): +Has theses additional parameters (which are the same as in Pleroma-API):      * `fullname`: optional      * `bio`: optional      * `captcha_solution`: optional, contains provider-specific captcha solution, diff --git a/docs/clients.md b/docs/clients.md index 8ac9ad3de..1eae0f0c6 100644 --- a/docs/clients.md +++ b/docs/clients.md @@ -1,5 +1,5 @@  # Pleroma Clients -Note: Additionnal clients may be working but theses are officially supporting Pleroma. +Note: Additional clients may be working but theses are officially supporting Pleroma.  Feel free to contact us to be added to this list!  ## Desktop diff --git a/lib/pleroma/plugs/federating_plug.ex b/lib/pleroma/plugs/federating_plug.ex index d3943586d..c6d622ce4 100644 --- a/lib/pleroma/plugs/federating_plug.ex +++ b/lib/pleroma/plugs/federating_plug.ex @@ -10,14 +10,20 @@ defmodule Pleroma.Web.FederatingPlug do    end    def call(conn, _opts) do -    if Pleroma.Config.get([:instance, :federating]) do +    if federating?() do        conn      else -      conn -      |> put_status(404) -      |> Phoenix.Controller.put_view(Pleroma.Web.ErrorView) -      |> Phoenix.Controller.render("404.json") -      |> halt() +      fail(conn)      end    end + +  def federating?, do: Pleroma.Config.get([:instance, :federating]) + +  def fail(conn) do +    conn +    |> put_status(404) +    |> Phoenix.Controller.put_view(Pleroma.Web.ErrorView) +    |> Phoenix.Controller.render("404.json") +    |> halt() +  end  end diff --git a/lib/pleroma/plugs/static_fe_plug.ex b/lib/pleroma/plugs/static_fe_plug.ex index deebe4879..10843b4c8 100644 --- a/lib/pleroma/plugs/static_fe_plug.ex +++ b/lib/pleroma/plugs/static_fe_plug.ex @@ -21,6 +21,9 @@ defmodule Pleroma.Plugs.StaticFEPlug do    defp enabled?, do: Pleroma.Config.get([:static_fe, :enabled], false)    defp accepts_html?(conn) do -    conn |> get_req_header("accept") |> List.first() |> String.contains?("text/html") +    conn +    |> get_req_header("accept") +    |> List.first() +    |> String.contains?("text/html")    end  end diff --git a/lib/pleroma/web/activity_pub/activity_pub_controller.ex b/lib/pleroma/web/activity_pub/activity_pub_controller.ex index 779de0e4d..525e61360 100644 --- a/lib/pleroma/web/activity_pub/activity_pub_controller.ex +++ b/lib/pleroma/web/activity_pub/activity_pub_controller.ex @@ -18,19 +18,32 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubController do    alias Pleroma.Web.ActivityPub.UserView    alias Pleroma.Web.ActivityPub.Utils    alias Pleroma.Web.ActivityPub.Visibility +  alias Pleroma.Web.FederatingPlug    alias Pleroma.Web.Federator    require Logger    action_fallback(:errors) +  # Note: some of the following actions (like :update_inbox) may be server-to-server as well +  @client_to_server_actions [ +    :whoami, +    :read_inbox, +    :outbox, +    :update_outbox, +    :upload_media, +    :followers, +    :following +  ] + +  plug(FederatingPlug when action not in @client_to_server_actions) +    plug(      Pleroma.Plugs.Cache,      [query_params: false, tracking_fun: &__MODULE__.track_object_fetch/2]      when action in [:activity, :object]    ) -  plug(Pleroma.Web.FederatingPlug when action in [:inbox, :relay])    plug(:set_requester_reachable when action in [:inbox])    plug(:relay_active? when action in [:relay]) @@ -128,10 +141,14 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubController do    # GET /relay/following    def following(%{assigns: %{relay: true}} = conn, _params) do -    conn -    |> put_resp_content_type("application/activity+json") -    |> put_view(UserView) -    |> render("following.json", %{user: Relay.get_actor()}) +    if FederatingPlug.federating?() do +      conn +      |> put_resp_content_type("application/activity+json") +      |> put_view(UserView) +      |> render("following.json", %{user: Relay.get_actor()}) +    else +      FederatingPlug.fail(conn) +    end    end    def following(%{assigns: %{user: for_user}} = conn, %{"nickname" => nickname, "page" => page}) do @@ -165,10 +182,14 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubController do    # GET /relay/followers    def followers(%{assigns: %{relay: true}} = conn, _params) do -    conn -    |> put_resp_content_type("application/activity+json") -    |> put_view(UserView) -    |> render("followers.json", %{user: Relay.get_actor()}) +    if FederatingPlug.federating?() do +      conn +      |> put_resp_content_type("application/activity+json") +      |> put_view(UserView) +      |> render("followers.json", %{user: Relay.get_actor()}) +    else +      FederatingPlug.fail(conn) +    end    end    def followers(%{assigns: %{user: for_user}} = conn, %{"nickname" => nickname, "page" => page}) do @@ -255,8 +276,16 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubController do      json(conn, "ok")    end -  # only accept relayed Creates -  def inbox(conn, %{"type" => "Create"} = params) do +  # POST /relay/inbox -or- POST /internal/fetch/inbox +  def inbox(conn, params) do +    if params["type"] == "Create" && FederatingPlug.federating?() do +      post_inbox_relayed_create(conn, params) +    else +      post_inbox_fallback(conn, params) +    end +  end + +  defp post_inbox_relayed_create(conn, params) do      Logger.debug(        "Signature missing or not from author, relayed Create message, fetching object from source"      ) @@ -266,7 +295,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubController do      json(conn, "ok")    end -  def inbox(conn, params) do +  defp post_inbox_fallback(conn, params) do      headers = Enum.into(conn.req_headers, %{})      if String.contains?(headers["signature"], params["actor"]) do @@ -314,7 +343,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubController do    def whoami(_conn, _params), do: {:error, :not_found}    def read_inbox( -        %{assigns: %{user: %{nickname: nickname} = user}} = conn, +        %{assigns: %{user: %User{nickname: nickname} = user}} = conn,          %{"nickname" => nickname, "page" => page?} = params        )        when page? in [true, "true"] do @@ -337,7 +366,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubController do      })    end -  def read_inbox(%{assigns: %{user: %{nickname: nickname} = user}} = conn, %{ +  def read_inbox(%{assigns: %{user: %User{nickname: nickname} = user}} = conn, %{          "nickname" => nickname        }) do      with {:ok, user} <- User.ensure_keys_present(user) do @@ -356,7 +385,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubController do      |> json(err)    end -  def read_inbox(%{assigns: %{user: %{nickname: as_nickname}}} = conn, %{ +  def read_inbox(%{assigns: %{user: %User{nickname: as_nickname}}} = conn, %{          "nickname" => nickname        }) do      err = @@ -370,7 +399,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubController do      |> json(err)    end -  def handle_user_activity(user, %{"type" => "Create"} = params) do +  def handle_user_activity(%User{} = user, %{"type" => "Create"} = params) do      object =        params["object"]        |> Map.merge(Map.take(params, ["to", "cc"])) @@ -386,7 +415,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubController do      })    end -  def handle_user_activity(user, %{"type" => "Delete"} = params) do +  def handle_user_activity(%User{} = user, %{"type" => "Delete"} = params) do      with %Object{} = object <- Object.normalize(params["object"]),           true <- user.is_moderator || user.ap_id == object.data["actor"],           {:ok, delete} <- ActivityPub.delete(object) do @@ -396,7 +425,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubController do      end    end -  def handle_user_activity(user, %{"type" => "Like"} = params) do +  def handle_user_activity(%User{} = user, %{"type" => "Like"} = params) do      with %Object{} = object <- Object.normalize(params["object"]),           {:ok, activity, _object} <- ActivityPub.like(user, object) do        {:ok, activity} @@ -434,7 +463,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubController do      end    end -  def update_outbox(%{assigns: %{user: user}} = conn, %{"nickname" => nickname} = _) do +  def update_outbox(%{assigns: %{user: %User{} = user}} = conn, %{"nickname" => nickname}) do      err =        dgettext("errors", "can't update outbox of %{nickname} as %{as_nickname}",          nickname: nickname, @@ -492,7 +521,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubController do    - HTTP Code: 201 Created    - HTTP Body: ActivityPub object to be inserted into another's `attachment` field    """ -  def upload_media(%{assigns: %{user: user}} = conn, %{"file" => file} = data) do +  def upload_media(%{assigns: %{user: %User{} = user}} = conn, %{"file" => file} = data) do      with {:ok, object} <-             ActivityPub.upload(               file, diff --git a/lib/pleroma/web/ostatus/ostatus_controller.ex b/lib/pleroma/web/ostatus/ostatus_controller.ex index c443c888c..e3f42b5c4 100644 --- a/lib/pleroma/web/ostatus/ostatus_controller.ex +++ b/lib/pleroma/web/ostatus/ostatus_controller.ex @@ -16,6 +16,8 @@ defmodule Pleroma.Web.OStatus.OStatusController do    alias Pleroma.Web.Metadata.PlayerView    alias Pleroma.Web.Router +  plug(Pleroma.Web.FederatingPlug) +    plug(      RateLimiter,      [name: :ap_routes, params: ["uuid"]] when action in [:object, :activity] diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index 980242c68..5f3a06caa 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -541,6 +541,7 @@ defmodule Pleroma.Web.Router do      get("/mailer/unsubscribe/:token", Mailer.SubscriptionController, :unsubscribe)    end +  # Server to Server (S2S) AP interactions    pipeline :activitypub do      plug(:accepts, ["activity+json", "json"])      plug(Pleroma.Web.Plugs.HTTPSignaturePlug) @@ -554,6 +555,7 @@ defmodule Pleroma.Web.Router do      get("/users/:nickname/outbox", ActivityPubController, :outbox)    end +  # Client to Server (C2S) AP interactions    pipeline :activitypub_client do      plug(:accepts, ["activity+json", "json"])      plug(:fetch_session) @@ -568,6 +570,7 @@ defmodule Pleroma.Web.Router do      plug(Pleroma.Plugs.EnsureUserKeyPlug)    end +  # Note: propagate _any_ updates to `@client_to_server_actions` in `ActivityPubController`    scope "/", Pleroma.Web.ActivityPub do      pipe_through([:activitypub_client]) diff --git a/lib/pleroma/web/twitter_api/controllers/remote_follow_controller.ex b/lib/pleroma/web/twitter_api/controllers/remote_follow_controller.ex index fbf31c7eb..89da760da 100644 --- a/lib/pleroma/web/twitter_api/controllers/remote_follow_controller.ex +++ b/lib/pleroma/web/twitter_api/controllers/remote_follow_controller.ex @@ -16,6 +16,8 @@ defmodule Pleroma.Web.TwitterAPI.RemoteFollowController do    @status_types ["Article", "Event", "Note", "Video", "Page", "Question"] +  plug(Pleroma.Web.FederatingPlug) +    # Note: follower can submit the form (with password auth) not being signed in (having no token)    plug(      OAuthScopesPlug, diff --git a/lib/pleroma/web/twitter_api/controllers/util_controller.ex b/lib/pleroma/web/twitter_api/controllers/util_controller.ex index bca0e26eb..537f9f778 100644 --- a/lib/pleroma/web/twitter_api/controllers/util_controller.ex +++ b/lib/pleroma/web/twitter_api/controllers/util_controller.ex @@ -17,6 +17,8 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do    alias Pleroma.Web.CommonAPI    alias Pleroma.Web.WebFinger +  plug(Pleroma.Web.FederatingPlug when action == :remote_subscribe) +    plug(      OAuthScopesPlug,      %{scopes: ["follow", "write:follows"]} diff --git a/test/plugs/oauth_plug_test.exs b/test/plugs/oauth_plug_test.exs index 8534a5c13..f74c068cd 100644 --- a/test/plugs/oauth_plug_test.exs +++ b/test/plugs/oauth_plug_test.exs @@ -38,7 +38,7 @@ defmodule Pleroma.Plugs.OAuthPlugTest do      assert conn.assigns[:user] == opts[:user]    end -  test "with valid token(downcase) in url parameters, it assings the user", opts do +  test "with valid token(downcase) in url parameters, it assigns the user", opts do      conn =        :get        |> build_conn("/?access_token=#{opts[:token]}") diff --git a/test/web/activity_pub/activity_pub_controller_test.exs b/test/web/activity_pub/activity_pub_controller_test.exs index 9151034da..04800b7ea 100644 --- a/test/web/activity_pub/activity_pub_controller_test.exs +++ b/test/web/activity_pub/activity_pub_controller_test.exs @@ -25,9 +25,9 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do      :ok    end -  clear_config_all([:instance, :federating], -    do: Pleroma.Config.put([:instance, :federating], true) -  ) +  clear_config_all([:instance, :federating]) do +    Pleroma.Config.put([:instance, :federating], true) +  end    describe "/relay" do      clear_config([:instance, :allow_relay]) @@ -577,7 +577,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do      end    end -  describe "/users/:nickname/outbox" do +  describe "GET /users/:nickname/outbox" do      test "it will not bomb when there is no activity", %{conn: conn} do        user = insert(:user) @@ -614,7 +614,9 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do        assert response(conn, 200) =~ announce_activity.data["object"]      end +  end +  describe "POST /users/:nickname/outbox" do      test "it rejects posts from other users", %{conn: conn} do        data = File.read!("test/fixtures/activitypub-client-post-activity.json") |> Poison.decode!()        user = insert(:user) @@ -775,7 +777,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do        assert result["first"]["orderedItems"] == [user.ap_id]      end -    test "it returns returns a uri if the user has 'hide_followers' set", %{conn: conn} do +    test "it returns a uri if the user has 'hide_followers' set", %{conn: conn} do        user = insert(:user)        user_two = insert(:user, hide_followers: true)        User.follow(user, user_two) @@ -1008,7 +1010,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do      end    end -  describe "Additionnal ActivityPub C2S endpoints" do +  describe "Additional ActivityPub C2S endpoints" do      test "/api/ap/whoami", %{conn: conn} do        user = insert(:user) @@ -1047,4 +1049,65 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do        assert object["actor"] == user.ap_id      end    end + +  describe "when instance is not federating," do +    clear_config([:instance, :federating]) do +      Pleroma.Config.put([:instance, :federating], false) +    end + +    test "returns 404 for GET routes", %{conn: conn} do +      user = insert(:user) +      conn = put_req_header(conn, "accept", "application/json") + +      get_uris = [ +        "/users/#{user.nickname}", +        "/internal/fetch", +        "/relay", +        "/relay/following", +        "/relay/followers" +      ] + +      for get_uri <- get_uris do +        conn +        |> get(get_uri) +        |> json_response(404) + +        conn +        |> assign(:user, user) +        |> get(get_uri) +        |> json_response(404) +      end +    end + +    test "returns 404 for activity-related POST routes", %{conn: conn} do +      user = insert(:user) + +      conn = +        conn +        |> assign(:valid_signature, true) +        |> put_req_header("content-type", "application/activity+json") + +      post_activity_data = +        "test/fixtures/mastodon-post-activity.json" +        |> File.read!() +        |> Poison.decode!() + +      post_activity_uris = [ +        "/inbox", +        "/relay/inbox", +        "/users/#{user.nickname}/inbox" +      ] + +      for post_activity_uri <- post_activity_uris do +        conn +        |> post(post_activity_uri, post_activity_data) +        |> json_response(404) + +        conn +        |> assign(:user, user) +        |> post(post_activity_uri, post_activity_data) +        |> json_response(404) +      end +    end +  end  end diff --git a/test/web/activity_pub/publisher_test.exs b/test/web/activity_pub/publisher_test.exs index 3404848d4..da26b13f7 100644 --- a/test/web/activity_pub/publisher_test.exs +++ b/test/web/activity_pub/publisher_test.exs @@ -23,6 +23,10 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do      :ok    end +  clear_config_all([:instance, :federating]) do +    Pleroma.Config.put([:instance, :federating], true) +  end +    describe "gather_webfinger_links/1" do      test "it returns links" do        user = insert(:user) diff --git a/test/web/feed/user_controller_test.exs b/test/web/feed/user_controller_test.exs index 19a019060..00712ab5a 100644 --- a/test/web/feed/user_controller_test.exs +++ b/test/web/feed/user_controller_test.exs @@ -8,66 +8,78 @@ defmodule Pleroma.Web.Feed.UserControllerTest do    import Pleroma.Factory    import SweetXml +  alias Pleroma.Config    alias Pleroma.Object    alias Pleroma.User -  clear_config([:feed]) - -  test "gets a feed", %{conn: conn} do -    Pleroma.Config.put( -      [:feed, :post_title], -      %{max_length: 10, omission: "..."} -    ) - -    activity = insert(:note_activity) - -    note = -      insert(:note, -        data: %{ -          "content" => "This is :moominmamma: note ", -          "attachment" => [ -            %{ -              "url" => [%{"mediaType" => "image/png", "href" => "https://pleroma.gov/image.png"}] -            } -          ], -          "inReplyTo" => activity.data["id"] -        } -      ) +  clear_config_all([:instance, :federating]) do +    Config.put([:instance, :federating], true) +  end -    note_activity = insert(:note_activity, note: note) -    user = User.get_cached_by_ap_id(note_activity.data["actor"]) +  describe "feed" do +    clear_config([:feed]) -    note2 = -      insert(:note, -        user: user, -        data: %{"content" => "42 This is :moominmamma: note ", "inReplyTo" => activity.data["id"]} +    test "gets a feed", %{conn: conn} do +      Config.put( +        [:feed, :post_title], +        %{max_length: 10, omission: "..."}        ) -    _note_activity2 = insert(:note_activity, note: note2) -    object = Object.normalize(note_activity) +      activity = insert(:note_activity) + +      note = +        insert(:note, +          data: %{ +            "content" => "This is :moominmamma: note ", +            "attachment" => [ +              %{ +                "url" => [ +                  %{"mediaType" => "image/png", "href" => "https://pleroma.gov/image.png"} +                ] +              } +            ], +            "inReplyTo" => activity.data["id"] +          } +        ) + +      note_activity = insert(:note_activity, note: note) +      user = User.get_cached_by_ap_id(note_activity.data["actor"]) -    resp = -      conn -      |> put_req_header("content-type", "application/atom+xml") -      |> get(user_feed_path(conn, :feed, user.nickname)) -      |> response(200) +      note2 = +        insert(:note, +          user: user, +          data: %{ +            "content" => "42 This is :moominmamma: note ", +            "inReplyTo" => activity.data["id"] +          } +        ) -    activity_titles = -      resp -      |> SweetXml.parse() -      |> SweetXml.xpath(~x"//entry/title/text()"l) +      _note_activity2 = insert(:note_activity, note: note2) +      object = Object.normalize(note_activity) -    assert activity_titles == ['42 This...', 'This is...'] -    assert resp =~ object.data["content"] -  end +      resp = +        conn +        |> put_req_header("content-type", "application/atom+xml") +        |> get(user_feed_path(conn, :feed, user.nickname)) +        |> response(200) -  test "returns 404 for a missing feed", %{conn: conn} do -    conn = -      conn -      |> put_req_header("content-type", "application/atom+xml") -      |> get(user_feed_path(conn, :feed, "nonexisting")) +      activity_titles = +        resp +        |> SweetXml.parse() +        |> SweetXml.xpath(~x"//entry/title/text()"l) -    assert response(conn, 404) +      assert activity_titles == ['42 This...', 'This is...'] +      assert resp =~ object.data["content"] +    end + +    test "returns 404 for a missing feed", %{conn: conn} do +      conn = +        conn +        |> put_req_header("content-type", "application/atom+xml") +        |> get(user_feed_path(conn, :feed, "nonexisting")) + +      assert response(conn, 404) +    end    end    describe "feed_redirect" do @@ -248,4 +260,29 @@ defmodule Pleroma.Web.Feed.UserControllerTest do        assert response == %{"error" => "Not found"}      end    end + +  describe "feed_redirect (depending on federation enabled state)" do +    setup %{conn: conn} do +      user = insert(:user) +      conn = put_req_header(conn, "accept", "application/json") + +      %{conn: conn, user: user} +    end + +    clear_config([:instance, :federating]) + +    test "renders if instance is federating", %{conn: conn, user: user} do +      Config.put([:instance, :federating], true) + +      conn = get(conn, "/users/#{user.nickname}") +      assert json_response(conn, 200) +    end + +    test "renders 404 if instance is NOT federating", %{conn: conn, user: user} do +      Config.put([:instance, :federating], false) + +      conn = get(conn, "/users/#{user.nickname}") +      assert json_response(conn, 404) +    end +  end  end diff --git a/test/web/ostatus/ostatus_controller_test.exs b/test/web/ostatus/ostatus_controller_test.exs index 2051841c2..725ab1785 100644 --- a/test/web/ostatus/ostatus_controller_test.exs +++ b/test/web/ostatus/ostatus_controller_test.exs @@ -277,4 +277,33 @@ defmodule Pleroma.Web.OStatus.OStatusControllerTest do               |> response(404)      end    end + +  describe "when instance is not federating," do +    clear_config([:instance, :federating]) do +      Pleroma.Config.put([:instance, :federating], false) +    end + +    test "returns 404 for GET routes", %{conn: conn} do +      conn = put_req_header(conn, "accept", "application/json") + +      note_activity = insert(:note_activity, local: true) +      [_, activity_uuid] = hd(Regex.scan(~r/.+\/([\w-]+)$/, note_activity.data["id"])) + +      object = Object.normalize(note_activity) +      [_, object_uuid] = hd(Regex.scan(~r/.+\/([\w-]+)$/, object.data["id"])) + +      get_uris = [ +        "/activities/#{activity_uuid}", +        "/objects/#{object_uuid}", +        "/notice/#{note_activity.id}", +        "/notice/#{note_activity.id}/embed_player" +      ] + +      for get_uri <- get_uris do +        conn +        |> get(get_uri) +        |> json_response(404) +      end +    end +  end  end diff --git a/test/web/static_fe/static_fe_controller_test.exs b/test/web/static_fe/static_fe_controller_test.exs index 2ce8f9fa3..11facab99 100644 --- a/test/web/static_fe/static_fe_controller_test.exs +++ b/test/web/static_fe/static_fe_controller_test.exs @@ -1,56 +1,42 @@  defmodule Pleroma.Web.StaticFE.StaticFEControllerTest do    use Pleroma.Web.ConnCase +    alias Pleroma.Activity +  alias Pleroma.Config    alias Pleroma.Web.ActivityPub.Transmogrifier    alias Pleroma.Web.CommonAPI    import Pleroma.Factory    clear_config_all([:static_fe, :enabled]) do -    Pleroma.Config.put([:static_fe, :enabled], true) +    Config.put([:static_fe, :enabled], true)    end -  describe "user profile page" do -    test "just the profile as HTML", %{conn: conn} do -      user = insert(:user) - -      conn = -        conn -        |> put_req_header("accept", "text/html") -        |> get("/users/#{user.nickname}") - -      assert html_response(conn, 200) =~ user.nickname -    end +  setup %{conn: conn} do +    conn = put_req_header(conn, "accept", "text/html") +    user = insert(:user) -    test "renders json unless there's an html accept header", %{conn: conn} do -      user = insert(:user) +    %{conn: conn, user: user} +  end -      conn = -        conn -        |> put_req_header("accept", "application/json") -        |> get("/users/#{user.nickname}") +  describe "user profile html" do +    test "just the profile as HTML", %{conn: conn, user: user} do +      conn = get(conn, "/users/#{user.nickname}") -      assert json_response(conn, 200) +      assert html_response(conn, 200) =~ user.nickname      end      test "404 when user not found", %{conn: conn} do -      conn = -        conn -        |> put_req_header("accept", "text/html") -        |> get("/users/limpopo") +      conn = get(conn, "/users/limpopo")        assert html_response(conn, 404) =~ "not found"      end -    test "profile does not include private messages", %{conn: conn} do -      user = insert(:user) +    test "profile does not include private messages", %{conn: conn, user: user} do        CommonAPI.post(user, %{"status" => "public"})        CommonAPI.post(user, %{"status" => "private", "visibility" => "private"}) -      conn = -        conn -        |> put_req_header("accept", "text/html") -        |> get("/users/#{user.nickname}") +      conn = get(conn, "/users/#{user.nickname}")        html = html_response(conn, 200) @@ -58,14 +44,10 @@ defmodule Pleroma.Web.StaticFE.StaticFEControllerTest do        refute html =~ ">private<"      end -    test "pagination", %{conn: conn} do -      user = insert(:user) +    test "pagination", %{conn: conn, user: user} do        Enum.map(1..30, fn i -> CommonAPI.post(user, %{"status" => "test#{i}"}) end) -      conn = -        conn -        |> put_req_header("accept", "text/html") -        |> get("/users/#{user.nickname}") +      conn = get(conn, "/users/#{user.nickname}")        html = html_response(conn, 200) @@ -75,15 +57,11 @@ defmodule Pleroma.Web.StaticFE.StaticFEControllerTest do        refute html =~ ">test1<"      end -    test "pagination, page 2", %{conn: conn} do -      user = insert(:user) +    test "pagination, page 2", %{conn: conn, user: user} do        activities = Enum.map(1..30, fn i -> CommonAPI.post(user, %{"status" => "test#{i}"}) end)        {:ok, a11} = Enum.at(activities, 11) -      conn = -        conn -        |> put_req_header("accept", "text/html") -        |> get("/users/#{user.nickname}?max_id=#{a11.id}") +      conn = get(conn, "/users/#{user.nickname}?max_id=#{a11.id}")        html = html_response(conn, 200) @@ -94,15 +72,11 @@ defmodule Pleroma.Web.StaticFE.StaticFEControllerTest do      end    end -  describe "notice rendering" do -    test "single notice page", %{conn: conn} do -      user = insert(:user) +  describe "notice html" do +    test "single notice page", %{conn: conn, user: user} do        {:ok, activity} = CommonAPI.post(user, %{"status" => "testing a thing!"}) -      conn = -        conn -        |> put_req_header("accept", "text/html") -        |> get("/notice/#{activity.id}") +      conn = get(conn, "/notice/#{activity.id}")        html = html_response(conn, 200)        assert html =~ "<header>" @@ -110,8 +84,7 @@ defmodule Pleroma.Web.StaticFE.StaticFEControllerTest do        assert html =~ "testing a thing!"      end -    test "shows the whole thread", %{conn: conn} do -      user = insert(:user) +    test "shows the whole thread", %{conn: conn, user: user} do        {:ok, activity} = CommonAPI.post(user, %{"status" => "space: the final frontier"})        CommonAPI.post(user, %{ @@ -119,70 +92,47 @@ defmodule Pleroma.Web.StaticFE.StaticFEControllerTest do          "in_reply_to_status_id" => activity.id        }) -      conn = -        conn -        |> put_req_header("accept", "text/html") -        |> get("/notice/#{activity.id}") +      conn = get(conn, "/notice/#{activity.id}")        html = html_response(conn, 200)        assert html =~ "the final frontier"        assert html =~ "voyages"      end -    test "redirect by AP object ID", %{conn: conn} do -      user = insert(:user) - +    test "redirect by AP object ID", %{conn: conn, user: user} do        {:ok, %Activity{data: %{"object" => object_url}}} =          CommonAPI.post(user, %{"status" => "beam me up"}) -      conn = -        conn -        |> put_req_header("accept", "text/html") -        |> get(URI.parse(object_url).path) +      conn = get(conn, URI.parse(object_url).path)        assert html_response(conn, 302) =~ "redirected"      end -    test "redirect by activity ID", %{conn: conn} do -      user = insert(:user) - +    test "redirect by activity ID", %{conn: conn, user: user} do        {:ok, %Activity{data: %{"id" => id}}} =          CommonAPI.post(user, %{"status" => "I'm a doctor, not a devops!"}) -      conn = -        conn -        |> put_req_header("accept", "text/html") -        |> get(URI.parse(id).path) +      conn = get(conn, URI.parse(id).path)        assert html_response(conn, 302) =~ "redirected"      end      test "404 when notice not found", %{conn: conn} do -      conn = -        conn -        |> put_req_header("accept", "text/html") -        |> get("/notice/88c9c317") +      conn = get(conn, "/notice/88c9c317")        assert html_response(conn, 404) =~ "not found"      end -    test "404 for private status", %{conn: conn} do -      user = insert(:user) - +    test "404 for private status", %{conn: conn, user: user} do        {:ok, activity} =          CommonAPI.post(user, %{"status" => "don't show me!", "visibility" => "private"}) -      conn = -        conn -        |> put_req_header("accept", "text/html") -        |> get("/notice/#{activity.id}") +      conn = get(conn, "/notice/#{activity.id}")        assert html_response(conn, 404) =~ "not found"      end -    test "302 for remote cached status", %{conn: conn} do -      user = insert(:user) - +    test "302 for remote cached status", %{conn: conn, user: user} do        message = %{          "@context" => "https://www.w3.org/ns/activitystreams",          "to" => user.follower_address, @@ -199,10 +149,7 @@ defmodule Pleroma.Web.StaticFE.StaticFEControllerTest do        assert {:ok, activity} = Transmogrifier.handle_incoming(message) -      conn = -        conn -        |> put_req_header("accept", "text/html") -        |> get("/notice/#{activity.id}") +      conn = get(conn, "/notice/#{activity.id}")        assert html_response(conn, 302) =~ "redirected"      end diff --git a/test/web/twitter_api/remote_follow_controller_test.exs b/test/web/twitter_api/remote_follow_controller_test.exs index 80a42989d..73062f18f 100644 --- a/test/web/twitter_api/remote_follow_controller_test.exs +++ b/test/web/twitter_api/remote_follow_controller_test.exs @@ -5,8 +5,10 @@  defmodule Pleroma.Web.TwitterAPI.RemoteFollowControllerTest do    use Pleroma.Web.ConnCase +  alias Pleroma.Config    alias Pleroma.User    alias Pleroma.Web.CommonAPI +    import ExUnit.CaptureLog    import Pleroma.Factory @@ -15,6 +17,10 @@ defmodule Pleroma.Web.TwitterAPI.RemoteFollowControllerTest do      :ok    end +  clear_config_all([:instance, :federating]) do +    Config.put([:instance, :federating], true) +  end +    clear_config([:instance])    clear_config([:frontend_configurations, :pleroma_fe])    clear_config([:user, :deny_follow_blocked]) diff --git a/test/web/twitter_api/util_controller_test.exs b/test/web/twitter_api/util_controller_test.exs index d464ce215..9d757b5ef 100644 --- a/test/web/twitter_api/util_controller_test.exs +++ b/test/web/twitter_api/util_controller_test.exs @@ -6,6 +6,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do    use Pleroma.Web.ConnCase    use Oban.Testing, repo: Pleroma.Repo +  alias Pleroma.Config    alias Pleroma.Tests.ObanHelpers    alias Pleroma.User @@ -178,7 +179,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do    describe "GET /api/statusnet/config" do      test "it returns config in xml format", %{conn: conn} do -      instance = Pleroma.Config.get(:instance) +      instance = Config.get(:instance)        response =          conn @@ -195,12 +196,12 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do      end      test "it returns config in json format", %{conn: conn} do -      instance = Pleroma.Config.get(:instance) -      Pleroma.Config.put([:instance, :managed_config], true) -      Pleroma.Config.put([:instance, :registrations_open], false) -      Pleroma.Config.put([:instance, :invites_enabled], true) -      Pleroma.Config.put([:instance, :public], false) -      Pleroma.Config.put([:frontend_configurations, :pleroma_fe], %{theme: "asuka-hospital"}) +      instance = Config.get(:instance) +      Config.put([:instance, :managed_config], true) +      Config.put([:instance, :registrations_open], false) +      Config.put([:instance, :invites_enabled], true) +      Config.put([:instance, :public], false) +      Config.put([:frontend_configurations, :pleroma_fe], %{theme: "asuka-hospital"})        response =          conn @@ -234,7 +235,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do      end      test "returns the state of safe_dm_mentions flag", %{conn: conn} do -      Pleroma.Config.put([:instance, :safe_dm_mentions], true) +      Config.put([:instance, :safe_dm_mentions], true)        response =          conn @@ -243,7 +244,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do        assert response["site"]["safeDMMentionsEnabled"] == "1" -      Pleroma.Config.put([:instance, :safe_dm_mentions], false) +      Config.put([:instance, :safe_dm_mentions], false)        response =          conn @@ -254,8 +255,8 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do      end      test "it returns the managed config", %{conn: conn} do -      Pleroma.Config.put([:instance, :managed_config], false) -      Pleroma.Config.put([:frontend_configurations, :pleroma_fe], %{theme: "asuka-hospital"}) +      Config.put([:instance, :managed_config], false) +      Config.put([:frontend_configurations, :pleroma_fe], %{theme: "asuka-hospital"})        response =          conn @@ -264,7 +265,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do        refute response["site"]["pleromafe"] -      Pleroma.Config.put([:instance, :managed_config], true) +      Config.put([:instance, :managed_config], true)        response =          conn @@ -287,7 +288,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do          }        ] -      Pleroma.Config.put(:frontend_configurations, config) +      Config.put(:frontend_configurations, config)        response =          conn @@ -320,7 +321,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do      clear_config([:instance, :healthcheck])      test "returns 503 when healthcheck disabled", %{conn: conn} do -      Pleroma.Config.put([:instance, :healthcheck], false) +      Config.put([:instance, :healthcheck], false)        response =          conn @@ -331,7 +332,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do      end      test "returns 200 when healthcheck enabled and all ok", %{conn: conn} do -      Pleroma.Config.put([:instance, :healthcheck], true) +      Config.put([:instance, :healthcheck], true)        with_mock Pleroma.Healthcheck,          system_info: fn -> %Pleroma.Healthcheck{healthy: true} end do @@ -351,7 +352,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do      end      test "returns 503 when healthcheck enabled and health is false", %{conn: conn} do -      Pleroma.Config.put([:instance, :healthcheck], true) +      Config.put([:instance, :healthcheck], true)        with_mock Pleroma.Healthcheck,          system_info: fn -> %Pleroma.Healthcheck{healthy: false} end do @@ -426,6 +427,10 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do    end    describe "POST /main/ostatus - remote_subscribe/2" do +    clear_config([:instance, :federating]) do +      Config.put([:instance, :federating], true) +    end +      test "renders subscribe form", %{conn: conn} do        user = insert(:user)  | 
