diff options
Diffstat (limited to 'test/web')
27 files changed, 1343 insertions, 451 deletions
| diff --git a/test/web/activity_pub/activity_pub_test.exs b/test/web/activity_pub/activity_pub_test.exs index 1e056b7ee..f743f380b 100644 --- a/test/web/activity_pub/activity_pub_test.exs +++ b/test/web/activity_pub/activity_pub_test.exs @@ -10,6 +10,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do    alias Pleroma.Object    alias Pleroma.User    alias Pleroma.Web.ActivityPub.ActivityPub +  alias Pleroma.Web.ActivityPub.Publisher    alias Pleroma.Web.ActivityPub.Utils    alias Pleroma.Web.CommonAPI @@ -461,6 +462,29 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do      refute Enum.member?(activities, activity_three.id)    end +  test "doesn't return activities from blocked domains" do +    domain = "dogwhistle.zone" +    domain_user = insert(:user, %{ap_id: "https://#{domain}/@pundit"}) +    note = insert(:note, %{data: %{"actor" => domain_user.ap_id}}) +    activity = insert(:note_activity, %{note: note}) +    user = insert(:user) +    {:ok, user} = User.block_domain(user, domain) + +    activities = +      ActivityPub.fetch_activities([], %{"blocking_user" => user, "skip_preload" => true}) + +    refute activity in activities + +    followed_user = insert(:user) +    ActivityPub.follow(user, followed_user) +    {:ok, repeat_activity, _} = CommonAPI.repeat(activity.id, followed_user) + +    activities = +      ActivityPub.fetch_activities([], %{"blocking_user" => user, "skip_preload" => true}) + +    refute repeat_activity in activities +  end +    test "doesn't return muted activities" do      activity_one = insert(:note_activity)      activity_two = insert(:note_activity) @@ -959,18 +983,21 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do            "in_reply_to_status_id" => private_activity_2.id          }) -      activities = ActivityPub.fetch_activities([user1.ap_id | user1.following]) +      activities = +        ActivityPub.fetch_activities([user1.ap_id | user1.following]) +        |> Enum.map(fn a -> a.id end)        private_activity_1 = Activity.get_by_ap_id_with_object(private_activity_1.data["id"]) -      assert [public_activity, private_activity_1, private_activity_3] == -               activities +      assert [public_activity.id, private_activity_1.id, private_activity_3.id] == activities        assert length(activities) == 3 -      activities = ActivityPub.contain_timeline(activities, user1) +      activities = +        ActivityPub.fetch_activities([user1.ap_id | user1.following], %{"user" => user1}) +        |> Enum.map(fn a -> a.id end) -      assert [public_activity, private_activity_1] == activities +      assert [public_activity.id, private_activity_1.id] == activities        assert length(activities) == 2      end    end @@ -978,7 +1005,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do    describe "update" do      test "it creates an update activity with the new user data" do        user = insert(:user) -      {:ok, user} = Pleroma.Web.WebFinger.ensure_keys_present(user) +      {:ok, user} = User.ensure_keys_present(user)        user_data = Pleroma.Web.ActivityPub.UserView.render("user.json", %{user: user})        {:ok, update} = @@ -1057,7 +1084,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do        actor = insert(:user)        inbox = "http://200.site/users/nick1/inbox" -      assert {:ok, _} = ActivityPub.publish_one(%{inbox: inbox, json: "{}", actor: actor, id: 1}) +      assert {:ok, _} = Publisher.publish_one(%{inbox: inbox, json: "{}", actor: actor, id: 1})        assert called(Instances.set_reachable(inbox))      end @@ -1070,7 +1097,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do        inbox = "http://200.site/users/nick1/inbox"        assert {:ok, _} = -               ActivityPub.publish_one(%{ +               Publisher.publish_one(%{                   inbox: inbox,                   json: "{}",                   actor: actor, @@ -1089,7 +1116,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do        inbox = "http://200.site/users/nick1/inbox"        assert {:ok, _} = -               ActivityPub.publish_one(%{ +               Publisher.publish_one(%{                   inbox: inbox,                   json: "{}",                   actor: actor, @@ -1107,8 +1134,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do        actor = insert(:user)        inbox = "http://404.site/users/nick1/inbox" -      assert {:error, _} = -               ActivityPub.publish_one(%{inbox: inbox, json: "{}", actor: actor, id: 1}) +      assert {:error, _} = Publisher.publish_one(%{inbox: inbox, json: "{}", actor: actor, id: 1})        assert called(Instances.set_unreachable(inbox))      end @@ -1120,8 +1146,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do        actor = insert(:user)        inbox = "http://connrefused.site/users/nick1/inbox" -      assert {:error, _} = -               ActivityPub.publish_one(%{inbox: inbox, json: "{}", actor: actor, id: 1}) +      assert {:error, _} = Publisher.publish_one(%{inbox: inbox, json: "{}", actor: actor, id: 1})        assert called(Instances.set_unreachable(inbox))      end @@ -1133,7 +1158,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do        actor = insert(:user)        inbox = "http://200.site/users/nick1/inbox" -      assert {:ok, _} = ActivityPub.publish_one(%{inbox: inbox, json: "{}", actor: actor, id: 1}) +      assert {:ok, _} = Publisher.publish_one(%{inbox: inbox, json: "{}", actor: actor, id: 1})        refute called(Instances.set_unreachable(inbox))      end @@ -1146,7 +1171,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do        inbox = "http://connrefused.site/users/nick1/inbox"        assert {:error, _} = -               ActivityPub.publish_one(%{ +               Publisher.publish_one(%{                   inbox: inbox,                   json: "{}",                   actor: actor, diff --git a/test/web/activity_pub/mrf/simple_policy_test.exs b/test/web/activity_pub/mrf/simple_policy_test.exs new file mode 100644 index 000000000..0fd68e103 --- /dev/null +++ b/test/web/activity_pub/mrf/simple_policy_test.exs @@ -0,0 +1,309 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2019 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do +  use Pleroma.DataCase +  import Pleroma.Factory +  alias Pleroma.Config +  alias Pleroma.Web.ActivityPub.MRF.SimplePolicy + +  setup do +    orig = Config.get!(:mrf_simple) + +    Config.put(:mrf_simple, +      media_removal: [], +      media_nsfw: [], +      federated_timeline_removal: [], +      report_removal: [], +      reject: [], +      accept: [], +      avatar_removal: [], +      banner_removal: [] +    ) + +    on_exit(fn -> +      Config.put(:mrf_simple, orig) +    end) +  end + +  describe "when :media_removal" do +    test "is empty" do +      Config.put([:mrf_simple, :media_removal], []) +      media_message = build_media_message() +      local_message = build_local_message() + +      assert SimplePolicy.filter(media_message) == {:ok, media_message} +      assert SimplePolicy.filter(local_message) == {:ok, local_message} +    end + +    test "has a matching host" do +      Config.put([:mrf_simple, :media_removal], ["remote.instance"]) +      media_message = build_media_message() +      local_message = build_local_message() + +      assert SimplePolicy.filter(media_message) == +               {:ok, +                media_message +                |> Map.put("object", Map.delete(media_message["object"], "attachment"))} + +      assert SimplePolicy.filter(local_message) == {:ok, local_message} +    end +  end + +  describe "when :media_nsfw" do +    test "is empty" do +      Config.put([:mrf_simple, :media_nsfw], []) +      media_message = build_media_message() +      local_message = build_local_message() + +      assert SimplePolicy.filter(media_message) == {:ok, media_message} +      assert SimplePolicy.filter(local_message) == {:ok, local_message} +    end + +    test "has a matching host" do +      Config.put([:mrf_simple, :media_nsfw], ["remote.instance"]) +      media_message = build_media_message() +      local_message = build_local_message() + +      assert SimplePolicy.filter(media_message) == +               {:ok, +                media_message +                |> put_in(["object", "tag"], ["foo", "nsfw"]) +                |> put_in(["object", "sensitive"], true)} + +      assert SimplePolicy.filter(local_message) == {:ok, local_message} +    end +  end + +  defp build_media_message do +    %{ +      "actor" => "https://remote.instance/users/bob", +      "type" => "Create", +      "object" => %{ +        "attachment" => [%{}], +        "tag" => ["foo"], +        "sensitive" => false +      } +    } +  end + +  describe "when :report_removal" do +    test "is empty" do +      Config.put([:mrf_simple, :report_removal], []) +      report_message = build_report_message() +      local_message = build_local_message() + +      assert SimplePolicy.filter(report_message) == {:ok, report_message} +      assert SimplePolicy.filter(local_message) == {:ok, local_message} +    end + +    test "has a matching host" do +      Config.put([:mrf_simple, :report_removal], ["remote.instance"]) +      report_message = build_report_message() +      local_message = build_local_message() + +      assert SimplePolicy.filter(report_message) == {:reject, nil} +      assert SimplePolicy.filter(local_message) == {:ok, local_message} +    end +  end + +  defp build_report_message do +    %{ +      "actor" => "https://remote.instance/users/bob", +      "type" => "Flag" +    } +  end + +  describe "when :federated_timeline_removal" do +    test "is empty" do +      Config.put([:mrf_simple, :federated_timeline_removal], []) +      {_, ftl_message} = build_ftl_actor_and_message() +      local_message = build_local_message() + +      assert SimplePolicy.filter(ftl_message) == {:ok, ftl_message} +      assert SimplePolicy.filter(local_message) == {:ok, local_message} +    end + +    test "has a matching host" do +      {actor, ftl_message} = build_ftl_actor_and_message() + +      ftl_message_actor_host = +        ftl_message +        |> Map.fetch!("actor") +        |> URI.parse() +        |> Map.fetch!(:host) + +      Config.put([:mrf_simple, :federated_timeline_removal], [ftl_message_actor_host]) +      local_message = build_local_message() + +      assert {:ok, ftl_message} = SimplePolicy.filter(ftl_message) +      assert actor.follower_address in ftl_message["to"] +      refute actor.follower_address in ftl_message["cc"] +      refute "https://www.w3.org/ns/activitystreams#Public" in ftl_message["to"] +      assert "https://www.w3.org/ns/activitystreams#Public" in ftl_message["cc"] + +      assert SimplePolicy.filter(local_message) == {:ok, local_message} +    end + +    test "has a matching host but only as:Public in to" do +      {_actor, ftl_message} = build_ftl_actor_and_message() + +      ftl_message_actor_host = +        ftl_message +        |> Map.fetch!("actor") +        |> URI.parse() +        |> Map.fetch!(:host) + +      ftl_message = Map.put(ftl_message, "cc", []) + +      Config.put([:mrf_simple, :federated_timeline_removal], [ftl_message_actor_host]) + +      assert {:ok, ftl_message} = SimplePolicy.filter(ftl_message) +      refute "https://www.w3.org/ns/activitystreams#Public" in ftl_message["to"] +      assert "https://www.w3.org/ns/activitystreams#Public" in ftl_message["cc"] +    end +  end + +  defp build_ftl_actor_and_message do +    actor = insert(:user) + +    {actor, +     %{ +       "actor" => actor.ap_id, +       "to" => ["https://www.w3.org/ns/activitystreams#Public", "http://foo.bar/baz"], +       "cc" => [actor.follower_address, "http://foo.bar/qux"] +     }} +  end + +  describe "when :reject" do +    test "is empty" do +      Config.put([:mrf_simple, :reject], []) + +      remote_message = build_remote_message() + +      assert SimplePolicy.filter(remote_message) == {:ok, remote_message} +    end + +    test "has a matching host" do +      Config.put([:mrf_simple, :reject], ["remote.instance"]) + +      remote_message = build_remote_message() + +      assert SimplePolicy.filter(remote_message) == {:reject, nil} +    end +  end + +  describe "when :accept" do +    test "is empty" do +      Config.put([:mrf_simple, :accept], []) + +      local_message = build_local_message() +      remote_message = build_remote_message() + +      assert SimplePolicy.filter(local_message) == {:ok, local_message} +      assert SimplePolicy.filter(remote_message) == {:ok, remote_message} +    end + +    test "is not empty but it doesn't have a matching host" do +      Config.put([:mrf_simple, :accept], ["non.matching.remote"]) + +      local_message = build_local_message() +      remote_message = build_remote_message() + +      assert SimplePolicy.filter(local_message) == {:ok, local_message} +      assert SimplePolicy.filter(remote_message) == {:reject, nil} +    end + +    test "has a matching host" do +      Config.put([:mrf_simple, :accept], ["remote.instance"]) + +      local_message = build_local_message() +      remote_message = build_remote_message() + +      assert SimplePolicy.filter(local_message) == {:ok, local_message} +      assert SimplePolicy.filter(remote_message) == {:ok, remote_message} +    end +  end + +  describe "when :avatar_removal" do +    test "is empty" do +      Config.put([:mrf_simple, :avatar_removal], []) + +      remote_user = build_remote_user() + +      assert SimplePolicy.filter(remote_user) == {:ok, remote_user} +    end + +    test "is not empty but it doesn't have a matching host" do +      Config.put([:mrf_simple, :avatar_removal], ["non.matching.remote"]) + +      remote_user = build_remote_user() + +      assert SimplePolicy.filter(remote_user) == {:ok, remote_user} +    end + +    test "has a matching host" do +      Config.put([:mrf_simple, :avatar_removal], ["remote.instance"]) + +      remote_user = build_remote_user() +      {:ok, filtered} = SimplePolicy.filter(remote_user) + +      refute filtered["icon"] +    end +  end + +  describe "when :banner_removal" do +    test "is empty" do +      Config.put([:mrf_simple, :banner_removal], []) + +      remote_user = build_remote_user() + +      assert SimplePolicy.filter(remote_user) == {:ok, remote_user} +    end + +    test "is not empty but it doesn't have a matching host" do +      Config.put([:mrf_simple, :banner_removal], ["non.matching.remote"]) + +      remote_user = build_remote_user() + +      assert SimplePolicy.filter(remote_user) == {:ok, remote_user} +    end + +    test "has a matching host" do +      Config.put([:mrf_simple, :banner_removal], ["remote.instance"]) + +      remote_user = build_remote_user() +      {:ok, filtered} = SimplePolicy.filter(remote_user) + +      refute filtered["image"] +    end +  end + +  defp build_local_message do +    %{ +      "actor" => "#{Pleroma.Web.base_url()}/users/alice", +      "to" => [], +      "cc" => [] +    } +  end + +  defp build_remote_message do +    %{"actor" => "https://remote.instance/users/bob"} +  end + +  defp build_remote_user do +    %{ +      "id" => "https://remote.instance/users/bob", +      "icon" => %{ +        "url" => "http://example.com/image.jpg", +        "type" => "Image" +      }, +      "image" => %{ +        "url" => "http://example.com/image.jpg", +        "type" => "Image" +      }, +      "type" => "Person" +    } +  end +end diff --git a/test/web/activity_pub/views/user_view_test.exs b/test/web/activity_pub/views/user_view_test.exs index 9fb9455d2..e6483db8b 100644 --- a/test/web/activity_pub/views/user_view_test.exs +++ b/test/web/activity_pub/views/user_view_test.exs @@ -2,11 +2,12 @@ defmodule Pleroma.Web.ActivityPub.UserViewTest do    use Pleroma.DataCase    import Pleroma.Factory +  alias Pleroma.User    alias Pleroma.Web.ActivityPub.UserView    test "Renders a user, including the public key" do      user = insert(:user) -    {:ok, user} = Pleroma.Web.WebFinger.ensure_keys_present(user) +    {:ok, user} = User.ensure_keys_present(user)      result = UserView.render("user.json", %{user: user}) @@ -18,7 +19,7 @@ defmodule Pleroma.Web.ActivityPub.UserViewTest do    test "Does not add an avatar image if the user hasn't set one" do      user = insert(:user) -    {:ok, user} = Pleroma.Web.WebFinger.ensure_keys_present(user) +    {:ok, user} = User.ensure_keys_present(user)      result = UserView.render("user.json", %{user: user})      refute result["icon"] @@ -32,7 +33,7 @@ defmodule Pleroma.Web.ActivityPub.UserViewTest do          }        ) -    {:ok, user} = Pleroma.Web.WebFinger.ensure_keys_present(user) +    {:ok, user} = User.ensure_keys_present(user)      result = UserView.render("user.json", %{user: user})      assert result["icon"]["url"] == "https://someurl" @@ -42,7 +43,7 @@ defmodule Pleroma.Web.ActivityPub.UserViewTest do    describe "endpoints" do      test "local users have a usable endpoints structure" do        user = insert(:user) -      {:ok, user} = Pleroma.Web.WebFinger.ensure_keys_present(user) +      {:ok, user} = User.ensure_keys_present(user)        result = UserView.render("user.json", %{user: user}) @@ -58,7 +59,7 @@ defmodule Pleroma.Web.ActivityPub.UserViewTest do      test "remote users have an empty endpoints structure" do        user = insert(:user, local: false) -      {:ok, user} = Pleroma.Web.WebFinger.ensure_keys_present(user) +      {:ok, user} = User.ensure_keys_present(user)        result = UserView.render("user.json", %{user: user}) @@ -68,7 +69,7 @@ defmodule Pleroma.Web.ActivityPub.UserViewTest do      test "instance users do not expose oAuth endpoints" do        user = insert(:user, nickname: nil, local: true) -      {:ok, user} = Pleroma.Web.WebFinger.ensure_keys_present(user) +      {:ok, user} = User.ensure_keys_present(user)        result = UserView.render("user.json", %{user: user}) diff --git a/test/web/activity_pub/visibilty_test.exs b/test/web/activity_pub/visibilty_test.exs index 24b96c4aa..e2584f635 100644 --- a/test/web/activity_pub/visibilty_test.exs +++ b/test/web/activity_pub/visibilty_test.exs @@ -95,4 +95,26 @@ defmodule Pleroma.Web.ActivityPub.VisibilityTest do      refute Visibility.visible_for_user?(private, unrelated)      refute Visibility.visible_for_user?(direct, unrelated)    end + +  test "doesn't die when the user doesn't exist", +       %{ +         direct: direct, +         user: user +       } do +    Repo.delete(user) +    Cachex.clear(:user_cache) +    refute Visibility.is_private?(direct) +  end + +  test "get_visibility", %{ +    public: public, +    private: private, +    direct: direct, +    unlisted: unlisted +  } do +    assert Visibility.get_visibility(public) == "public" +    assert Visibility.get_visibility(private) == "private" +    assert Visibility.get_visibility(direct) == "direct" +    assert Visibility.get_visibility(unlisted) == "unlisted" +  end  end diff --git a/test/web/admin_api/admin_api_controller_test.exs b/test/web/admin_api/admin_api_controller_test.exs index f433f6be2..c15c67e31 100644 --- a/test/web/admin_api/admin_api_controller_test.exs +++ b/test/web/admin_api/admin_api_controller_test.exs @@ -5,11 +5,13 @@  defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do    use Pleroma.Web.ConnCase +  alias Pleroma.Activity    alias Pleroma.User    alias Pleroma.UserInviteToken +  alias Pleroma.Web.CommonAPI    import Pleroma.Factory -  describe "/api/pleroma/admin/user" do +  describe "/api/pleroma/admin/users" do      test "Delete" do        admin = insert(:user, info: %{is_admin: true})        user = insert(:user) @@ -18,7 +20,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do          build_conn()          |> assign(:user, admin)          |> put_req_header("accept", "application/json") -        |> delete("/api/pleroma/admin/user?nickname=#{user.nickname}") +        |> delete("/api/pleroma/admin/users?nickname=#{user.nickname}")        assert json_response(conn, 200) == user.nickname      end @@ -30,7 +32,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do          build_conn()          |> assign(:user, admin)          |> put_req_header("accept", "application/json") -        |> post("/api/pleroma/admin/user", %{ +        |> post("/api/pleroma/admin/users", %{            "nickname" => "lain",            "email" => "lain@example.org",            "password" => "test" @@ -75,7 +77,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do      end    end -  describe "/api/pleroma/admin/user/follow" do +  describe "/api/pleroma/admin/users/follow" do      test "allows to force-follow another user" do        admin = insert(:user, info: %{is_admin: true})        user = insert(:user) @@ -84,7 +86,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        build_conn()        |> assign(:user, admin)        |> put_req_header("accept", "application/json") -      |> post("/api/pleroma/admin/user/follow", %{ +      |> post("/api/pleroma/admin/users/follow", %{          "follower" => follower.nickname,          "followed" => user.nickname        }) @@ -96,7 +98,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do      end    end -  describe "/api/pleroma/admin/user/unfollow" do +  describe "/api/pleroma/admin/users/unfollow" do      test "allows to force-unfollow another user" do        admin = insert(:user, info: %{is_admin: true})        user = insert(:user) @@ -107,7 +109,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        build_conn()        |> assign(:user, admin)        |> put_req_header("accept", "application/json") -      |> post("/api/pleroma/admin/user/unfollow", %{ +      |> post("/api/pleroma/admin/users/unfollow", %{          "follower" => follower.nickname,          "followed" => user.nickname        }) @@ -191,7 +193,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do      end    end -  describe "/api/pleroma/admin/permission_group" do +  describe "/api/pleroma/admin/users/:nickname/permission_group" do      test "GET is giving user_info" do        admin = insert(:user, info: %{is_admin: true}) @@ -199,7 +201,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do          build_conn()          |> assign(:user, admin)          |> put_req_header("accept", "application/json") -        |> get("/api/pleroma/admin/permission_group/#{admin.nickname}") +        |> get("/api/pleroma/admin/users/#{admin.nickname}/permission_group/")        assert json_response(conn, 200) == %{                 "is_admin" => true, @@ -215,7 +217,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do          build_conn()          |> assign(:user, admin)          |> put_req_header("accept", "application/json") -        |> post("/api/pleroma/admin/permission_group/#{user.nickname}/admin") +        |> post("/api/pleroma/admin/users/#{user.nickname}/permission_group/admin")        assert json_response(conn, 200) == %{                 "is_admin" => true @@ -230,7 +232,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do          build_conn()          |> assign(:user, admin)          |> put_req_header("accept", "application/json") -        |> delete("/api/pleroma/admin/permission_group/#{user.nickname}/admin") +        |> delete("/api/pleroma/admin/users/#{user.nickname}/permission_group/admin")        assert json_response(conn, 200) == %{                 "is_admin" => false @@ -238,7 +240,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do      end    end -  describe "PUT /api/pleroma/admin/activation_status" do +  describe "PUT /api/pleroma/admin/users/:nickname/activation_status" do      setup %{conn: conn} do        admin = insert(:user, info: %{is_admin: true}) @@ -255,7 +257,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        conn =          conn -        |> put("/api/pleroma/admin/activation_status/#{user.nickname}", %{status: false}) +        |> put("/api/pleroma/admin/users/#{user.nickname}/activation_status", %{status: false})        user = User.get_cached_by_id(user.id)        assert user.info.deactivated == true @@ -267,7 +269,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        conn =          conn -        |> put("/api/pleroma/admin/activation_status/#{user.nickname}", %{status: true}) +        |> put("/api/pleroma/admin/users/#{user.nickname}/activation_status", %{status: true})        user = User.get_cached_by_id(user.id)        assert user.info.deactivated == false @@ -280,7 +282,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        conn =          conn          |> assign(:user, user) -        |> put("/api/pleroma/admin/activation_status/#{user.nickname}", %{status: false}) +        |> put("/api/pleroma/admin/users/#{user.nickname}/activation_status", %{status: false})        assert json_response(conn, :forbidden)      end @@ -309,7 +311,9 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        conn =          conn          |> assign(:user, user) -        |> post("/api/pleroma/admin/email_invite?email=#{recipient_email}&name=#{recipient_name}") +        |> post( +          "/api/pleroma/admin/users/email_invite?email=#{recipient_email}&name=#{recipient_name}" +        )        assert json_response(conn, :no_content) @@ -341,13 +345,13 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        conn =          conn          |> assign(:user, non_admin_user) -        |> post("/api/pleroma/admin/email_invite?email=foo@bar.com&name=JD") +        |> post("/api/pleroma/admin/users/email_invite?email=foo@bar.com&name=JD")        assert json_response(conn, :forbidden)      end    end -  describe "POST /api/pleroma/admin/email_invite, with invalid config" do +  describe "POST /api/pleroma/admin/users/email_invite, with invalid config" do      setup do        [user: insert(:user, info: %{is_admin: true})]      end @@ -367,7 +371,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        conn =          conn          |> assign(:user, user) -        |> post("/api/pleroma/admin/email_invite?email=foo@bar.com&name=JD") +        |> post("/api/pleroma/admin/users/email_invite?email=foo@bar.com&name=JD")        assert json_response(conn, :internal_server_error)      end @@ -387,25 +391,25 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        conn =          conn          |> assign(:user, user) -        |> post("/api/pleroma/admin/email_invite?email=foo@bar.com&name=JD") +        |> post("/api/pleroma/admin/users/email_invite?email=foo@bar.com&name=JD")        assert json_response(conn, :internal_server_error)      end    end -  test "/api/pleroma/admin/invite_token" do +  test "/api/pleroma/admin/users/invite_token" do      admin = insert(:user, info: %{is_admin: true})      conn =        build_conn()        |> assign(:user, admin)        |> put_req_header("accept", "application/json") -      |> get("/api/pleroma/admin/invite_token") +      |> get("/api/pleroma/admin/users/invite_token")      assert conn.status == 200    end -  test "/api/pleroma/admin/password_reset" do +  test "/api/pleroma/admin/users/:nickname/password_reset" do      admin = insert(:user, info: %{is_admin: true})      user = insert(:user) @@ -413,7 +417,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        build_conn()        |> assign(:user, admin)        |> put_req_header("accept", "application/json") -      |> get("/api/pleroma/admin/password_reset?nickname=#{user.nickname}") +      |> get("/api/pleroma/admin/users/#{user.nickname}/password_reset")      assert conn.status == 200    end @@ -822,7 +826,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do               }    end -  describe "GET /api/pleroma/admin/invite_token" do +  describe "GET /api/pleroma/admin/users/invite_token" do      setup do        admin = insert(:user, info: %{is_admin: true}) @@ -834,7 +838,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do      end      test "without options", %{conn: conn} do -      conn = get(conn, "/api/pleroma/admin/invite_token") +      conn = get(conn, "/api/pleroma/admin/users/invite_token")        token = json_response(conn, 200)        invite = UserInviteToken.find_by_token!(token) @@ -846,7 +850,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do      test "with expires_at", %{conn: conn} do        conn = -        get(conn, "/api/pleroma/admin/invite_token", %{ +        get(conn, "/api/pleroma/admin/users/invite_token", %{            "invite" => %{"expires_at" => Date.to_string(Date.utc_today())}          }) @@ -861,7 +865,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do      test "with max_use", %{conn: conn} do        conn = -        get(conn, "/api/pleroma/admin/invite_token", %{ +        get(conn, "/api/pleroma/admin/users/invite_token", %{            "invite" => %{"max_use" => 150}          }) @@ -875,7 +879,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do      test "with max use and expires_at", %{conn: conn} do        conn = -        get(conn, "/api/pleroma/admin/invite_token", %{ +        get(conn, "/api/pleroma/admin/users/invite_token", %{            "invite" => %{"max_use" => 150, "expires_at" => Date.to_string(Date.utc_today())}          }) @@ -888,7 +892,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do      end    end -  describe "GET /api/pleroma/admin/invites" do +  describe "GET /api/pleroma/admin/users/invites" do      setup do        admin = insert(:user, info: %{is_admin: true}) @@ -900,7 +904,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do      end      test "no invites", %{conn: conn} do -      conn = get(conn, "/api/pleroma/admin/invites") +      conn = get(conn, "/api/pleroma/admin/users/invites")        assert json_response(conn, 200) == %{"invites" => []}      end @@ -908,7 +912,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do      test "with invite", %{conn: conn} do        {:ok, invite} = UserInviteToken.create_invite() -      conn = get(conn, "/api/pleroma/admin/invites") +      conn = get(conn, "/api/pleroma/admin/users/invites")        assert json_response(conn, 200) == %{                 "invites" => [ @@ -926,7 +930,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do      end    end -  describe "POST /api/pleroma/admin/revoke_invite" do +  describe "POST /api/pleroma/admin/users/revoke_invite" do      test "with token" do        admin = insert(:user, info: %{is_admin: true})        {:ok, invite} = UserInviteToken.create_invite() @@ -934,7 +938,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        conn =          build_conn()          |> assign(:user, admin) -        |> post("/api/pleroma/admin/revoke_invite", %{"token" => invite.token}) +        |> post("/api/pleroma/admin/users/revoke_invite", %{"token" => invite.token})        assert json_response(conn, 200) == %{                 "expires_at" => nil, @@ -947,4 +951,329 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do               }      end    end + +  describe "GET /api/pleroma/admin/reports/:id" do +    setup %{conn: conn} do +      admin = insert(:user, info: %{is_admin: true}) + +      %{conn: assign(conn, :user, admin)} +    end + +    test "returns report by its id", %{conn: conn} do +      [reporter, target_user] = insert_pair(:user) +      activity = insert(:note_activity, user: target_user) + +      {:ok, %{id: report_id}} = +        CommonAPI.report(reporter, %{ +          "account_id" => target_user.id, +          "comment" => "I feel offended", +          "status_ids" => [activity.id] +        }) + +      response = +        conn +        |> get("/api/pleroma/admin/reports/#{report_id}") +        |> json_response(:ok) + +      assert response["id"] == report_id +    end + +    test "returns 404 when report id is invalid", %{conn: conn} do +      conn = get(conn, "/api/pleroma/admin/reports/test") + +      assert json_response(conn, :not_found) == "Not found" +    end +  end + +  describe "PUT /api/pleroma/admin/reports/:id" do +    setup %{conn: conn} do +      admin = insert(:user, info: %{is_admin: true}) +      [reporter, target_user] = insert_pair(:user) +      activity = insert(:note_activity, user: target_user) + +      {:ok, %{id: report_id}} = +        CommonAPI.report(reporter, %{ +          "account_id" => target_user.id, +          "comment" => "I feel offended", +          "status_ids" => [activity.id] +        }) + +      %{conn: assign(conn, :user, admin), id: report_id} +    end + +    test "mark report as resolved", %{conn: conn, id: id} do +      response = +        conn +        |> put("/api/pleroma/admin/reports/#{id}", %{"state" => "resolved"}) +        |> json_response(:ok) + +      assert response["state"] == "resolved" +    end + +    test "closes report", %{conn: conn, id: id} do +      response = +        conn +        |> put("/api/pleroma/admin/reports/#{id}", %{"state" => "closed"}) +        |> json_response(:ok) + +      assert response["state"] == "closed" +    end + +    test "returns 400 when state is unknown", %{conn: conn, id: id} do +      conn = +        conn +        |> put("/api/pleroma/admin/reports/#{id}", %{"state" => "test"}) + +      assert json_response(conn, :bad_request) == "Unsupported state" +    end + +    test "returns 404 when report is not exist", %{conn: conn} do +      conn = +        conn +        |> put("/api/pleroma/admin/reports/test", %{"state" => "closed"}) + +      assert json_response(conn, :not_found) == "Not found" +    end +  end + +  describe "GET /api/pleroma/admin/reports" do +    setup %{conn: conn} do +      admin = insert(:user, info: %{is_admin: true}) + +      %{conn: assign(conn, :user, admin)} +    end + +    test "returns empty response when no reports created", %{conn: conn} do +      response = +        conn +        |> get("/api/pleroma/admin/reports") +        |> json_response(:ok) + +      assert Enum.empty?(response["reports"]) +    end + +    test "returns reports", %{conn: conn} do +      [reporter, target_user] = insert_pair(:user) +      activity = insert(:note_activity, user: target_user) + +      {:ok, %{id: report_id}} = +        CommonAPI.report(reporter, %{ +          "account_id" => target_user.id, +          "comment" => "I feel offended", +          "status_ids" => [activity.id] +        }) + +      response = +        conn +        |> get("/api/pleroma/admin/reports") +        |> json_response(:ok) + +      [report] = response["reports"] + +      assert length(response["reports"]) == 1 +      assert report["id"] == report_id +    end + +    test "returns reports with specified state", %{conn: conn} do +      [reporter, target_user] = insert_pair(:user) +      activity = insert(:note_activity, user: target_user) + +      {:ok, %{id: first_report_id}} = +        CommonAPI.report(reporter, %{ +          "account_id" => target_user.id, +          "comment" => "I feel offended", +          "status_ids" => [activity.id] +        }) + +      {:ok, %{id: second_report_id}} = +        CommonAPI.report(reporter, %{ +          "account_id" => target_user.id, +          "comment" => "I don't like this user" +        }) + +      CommonAPI.update_report_state(second_report_id, "closed") + +      response = +        conn +        |> get("/api/pleroma/admin/reports", %{ +          "state" => "open" +        }) +        |> json_response(:ok) + +      [open_report] = response["reports"] + +      assert length(response["reports"]) == 1 +      assert open_report["id"] == first_report_id + +      response = +        conn +        |> get("/api/pleroma/admin/reports", %{ +          "state" => "closed" +        }) +        |> json_response(:ok) + +      [closed_report] = response["reports"] + +      assert length(response["reports"]) == 1 +      assert closed_report["id"] == second_report_id + +      response = +        conn +        |> get("/api/pleroma/admin/reports", %{ +          "state" => "resolved" +        }) +        |> json_response(:ok) + +      assert Enum.empty?(response["reports"]) +    end + +    test "returns 403 when requested by a non-admin" do +      user = insert(:user) + +      conn = +        build_conn() +        |> assign(:user, user) +        |> get("/api/pleroma/admin/reports") + +      assert json_response(conn, :forbidden) == %{"error" => "User is not admin."} +    end + +    test "returns 403 when requested by anonymous" do +      conn = +        build_conn() +        |> get("/api/pleroma/admin/reports") + +      assert json_response(conn, :forbidden) == %{"error" => "Invalid credentials."} +    end +  end + +  describe "POST /api/pleroma/admin/reports/:id/respond" do +    setup %{conn: conn} do +      admin = insert(:user, info: %{is_admin: true}) + +      %{conn: assign(conn, :user, admin)} +    end + +    test "returns created dm", %{conn: conn} do +      [reporter, target_user] = insert_pair(:user) +      activity = insert(:note_activity, user: target_user) + +      {:ok, %{id: report_id}} = +        CommonAPI.report(reporter, %{ +          "account_id" => target_user.id, +          "comment" => "I feel offended", +          "status_ids" => [activity.id] +        }) + +      response = +        conn +        |> post("/api/pleroma/admin/reports/#{report_id}/respond", %{ +          "status" => "I will check it out" +        }) +        |> json_response(:ok) + +      recipients = Enum.map(response["mentions"], & &1["username"]) + +      assert conn.assigns[:user].nickname in recipients +      assert reporter.nickname in recipients +      assert response["content"] == "I will check it out" +      assert response["visibility"] == "direct" +    end + +    test "returns 400 when status is missing", %{conn: conn} do +      conn = post(conn, "/api/pleroma/admin/reports/test/respond") + +      assert json_response(conn, :bad_request) == "Invalid parameters" +    end + +    test "returns 404 when report id is invalid", %{conn: conn} do +      conn = +        post(conn, "/api/pleroma/admin/reports/test/respond", %{ +          "status" => "foo" +        }) + +      assert json_response(conn, :not_found) == "Not found" +    end +  end + +  describe "PUT /api/pleroma/admin/statuses/:id" do +    setup %{conn: conn} do +      admin = insert(:user, info: %{is_admin: true}) +      activity = insert(:note_activity) + +      %{conn: assign(conn, :user, admin), id: activity.id} +    end + +    test "toggle sensitive flag", %{conn: conn, id: id} do +      response = +        conn +        |> put("/api/pleroma/admin/statuses/#{id}", %{"sensitive" => "true"}) +        |> json_response(:ok) + +      assert response["sensitive"] + +      response = +        conn +        |> put("/api/pleroma/admin/statuses/#{id}", %{"sensitive" => "false"}) +        |> json_response(:ok) + +      refute response["sensitive"] +    end + +    test "change visibility flag", %{conn: conn, id: id} do +      response = +        conn +        |> put("/api/pleroma/admin/statuses/#{id}", %{"visibility" => "public"}) +        |> json_response(:ok) + +      assert response["visibility"] == "public" + +      response = +        conn +        |> put("/api/pleroma/admin/statuses/#{id}", %{"visibility" => "private"}) +        |> json_response(:ok) + +      assert response["visibility"] == "private" + +      response = +        conn +        |> put("/api/pleroma/admin/statuses/#{id}", %{"visibility" => "unlisted"}) +        |> json_response(:ok) + +      assert response["visibility"] == "unlisted" +    end + +    test "returns 400 when visibility is unknown", %{conn: conn, id: id} do +      conn = +        conn +        |> put("/api/pleroma/admin/statuses/#{id}", %{"visibility" => "test"}) + +      assert json_response(conn, :bad_request) == "Unsupported visibility" +    end +  end + +  describe "DELETE /api/pleroma/admin/statuses/:id" do +    setup %{conn: conn} do +      admin = insert(:user, info: %{is_admin: true}) +      activity = insert(:note_activity) + +      %{conn: assign(conn, :user, admin), id: activity.id} +    end + +    test "deletes status", %{conn: conn, id: id} do +      conn +      |> delete("/api/pleroma/admin/statuses/#{id}") +      |> json_response(:ok) + +      refute Activity.get_by_id(id) +    end + +    test "returns error when status is not exist", %{conn: conn} do +      conn = +        conn +        |> delete("/api/pleroma/admin/statuses/test") + +      assert json_response(conn, :bad_request) == "Could not delete" +    end +  end  end diff --git a/test/web/common_api/common_api_test.exs b/test/web/common_api/common_api_test.exs index a5b07c446..696060fb1 100644 --- a/test/web/common_api/common_api_test.exs +++ b/test/web/common_api/common_api_test.exs @@ -87,6 +87,28 @@ defmodule Pleroma.Web.CommonAPITest do        assert object.data["content"] == "<p><b>2hu</b></p>alert('xss')"      end + +    test "it does not allow replies to direct messages that are not direct messages themselves" do +      user = insert(:user) + +      {:ok, activity} = CommonAPI.post(user, %{"status" => "suya..", "visibility" => "direct"}) + +      assert {:ok, _} = +               CommonAPI.post(user, %{ +                 "status" => "suya..", +                 "visibility" => "direct", +                 "in_reply_to_status_id" => activity.id +               }) + +      Enum.each(["public", "private", "unlisted"], fn visibility -> +        assert {:error, {:private_to_public, _}} = +                 CommonAPI.post(user, %{ +                   "status" => "suya..", +                   "visibility" => visibility, +                   "in_reply_to_status_id" => activity.id +                 }) +      end) +    end    end    describe "reactions" do @@ -239,10 +261,41 @@ defmodule Pleroma.Web.CommonAPITest do                 data: %{                   "type" => "Flag",                   "content" => ^comment, -                 "object" => [^target_ap_id, ^activity_ap_id] +                 "object" => [^target_ap_id, ^activity_ap_id], +                 "state" => "open"                 }               } = flag_activity      end + +    test "updates report state" do +      [reporter, target_user] = insert_pair(:user) +      activity = insert(:note_activity, user: target_user) + +      {:ok, %Activity{id: report_id}} = +        CommonAPI.report(reporter, %{ +          "account_id" => target_user.id, +          "comment" => "I feel offended", +          "status_ids" => [activity.id] +        }) + +      {:ok, report} = CommonAPI.update_report_state(report_id, "resolved") + +      assert report.data["state"] == "resolved" +    end + +    test "does not update report state when state is unsupported" do +      [reporter, target_user] = insert_pair(:user) +      activity = insert(:note_activity, user: target_user) + +      {:ok, %Activity{id: report_id}} = +        CommonAPI.report(reporter, %{ +          "account_id" => target_user.id, +          "comment" => "I feel offended", +          "status_ids" => [activity.id] +        }) + +      assert CommonAPI.update_report_state(report_id, "test") == {:error, "Unsupported state"} +    end    end    describe "reblog muting" do @@ -257,14 +310,14 @@ defmodule Pleroma.Web.CommonAPITest do      test "add a reblog mute", %{muter: muter, muted: muted} do        {:ok, muter} = CommonAPI.hide_reblogs(muter, muted) -      assert Pleroma.User.showing_reblogs?(muter, muted) == false +      assert User.showing_reblogs?(muter, muted) == false      end      test "remove a reblog mute", %{muter: muter, muted: muted} do        {:ok, muter} = CommonAPI.hide_reblogs(muter, muted)        {:ok, muter} = CommonAPI.show_reblogs(muter, muted) -      assert Pleroma.User.showing_reblogs?(muter, muted) == true +      assert User.showing_reblogs?(muter, muted) == true      end    end  end diff --git a/test/web/fallback_test.exs b/test/web/fallback_test.exs new file mode 100644 index 000000000..cc78b3ae1 --- /dev/null +++ b/test/web/fallback_test.exs @@ -0,0 +1,52 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.FallbackTest do +  use Pleroma.Web.ConnCase +  import Pleroma.Factory + +  test "GET /registration/:token", %{conn: conn} do +    assert conn +           |> get("/registration/foo") +           |> html_response(200) =~ "<!--server-generated-meta-->" +  end + +  test "GET /:maybe_nickname_or_id", %{conn: conn} do +    user = insert(:user) + +    assert conn +           |> get("/foo") +           |> html_response(200) =~ "<!--server-generated-meta-->" + +    refute conn +           |> get("/" <> user.nickname) +           |> html_response(200) =~ "<!--server-generated-meta-->" +  end + +  test "GET /api*path", %{conn: conn} do +    assert conn +           |> get("/api/foo") +           |> json_response(404) == %{"error" => "Not implemented"} +  end + +  test "GET /*path", %{conn: conn} do +    assert conn +           |> get("/foo") +           |> html_response(200) =~ "<!--server-generated-meta-->" + +    assert conn +           |> get("/foo/bar") +           |> html_response(200) =~ "<!--server-generated-meta-->" +  end + +  test "OPTIONS /*path", %{conn: conn} do +    assert conn +           |> options("/foo") +           |> response(204) == "" + +    assert conn +           |> options("/foo/bar") +           |> response(204) == "" +  end +end diff --git a/test/web/federator_test.exs b/test/web/federator_test.exs index 52729eb50..0f43bc8f2 100644 --- a/test/web/federator_test.exs +++ b/test/web/federator_test.exs @@ -58,7 +58,7 @@ defmodule Pleroma.Web.FederatorTest do    describe "Targets reachability filtering in `publish`" do      test_with_mock "it federates only to reachable instances via AP", -                   Federator, +                   Pleroma.Web.ActivityPub.Publisher,                     [:passthrough],                     [] do        user = insert(:user) @@ -88,13 +88,18 @@ defmodule Pleroma.Web.FederatorTest do        {:ok, _activity} =          CommonAPI.post(user, %{"status" => "HI @nick1@domain.com, @nick2@domain2.com!"}) -      assert called(Federator.publish_single_ap(%{inbox: inbox1, unreachable_since: dt})) +      assert called( +               Pleroma.Web.ActivityPub.Publisher.publish_one(%{ +                 inbox: inbox1, +                 unreachable_since: dt +               }) +             ) -      refute called(Federator.publish_single_ap(%{inbox: inbox2})) +      refute called(Pleroma.Web.ActivityPub.Publisher.publish_one(%{inbox: inbox2}))      end      test_with_mock "it federates only to reachable instances via Websub", -                   Federator, +                   Pleroma.Web.Websub,                     [:passthrough],                     [] do        user = insert(:user) @@ -122,17 +127,17 @@ defmodule Pleroma.Web.FederatorTest do        {:ok, _activity} = CommonAPI.post(user, %{"status" => "HI"})        assert called( -               Federator.publish_single_websub(%{ +               Pleroma.Web.Websub.publish_one(%{                   callback: sub2.callback,                   unreachable_since: dt                 })               ) -      refute called(Federator.publish_single_websub(%{callback: sub1.callback})) +      refute called(Pleroma.Web.Websub.publish_one(%{callback: sub1.callback}))      end      test_with_mock "it federates only to reachable instances via Salmon", -                   Federator, +                   Pleroma.Web.Salmon,                     [:passthrough],                     [] do        user = insert(:user) @@ -162,13 +167,13 @@ defmodule Pleroma.Web.FederatorTest do          CommonAPI.post(user, %{"status" => "HI @nick1@domain.com, @nick2@domain2.com!"})        assert called( -               Federator.publish_single_salmon(%{ +               Pleroma.Web.Salmon.publish_one(%{                   recipient: remote_user2,                   unreachable_since: dt                 })               ) -      refute called(Federator.publish_single_websub(%{recipient: remote_user1})) +      refute called(Pleroma.Web.Salmon.publish_one(%{recipient: remote_user1}))      end    end diff --git a/test/web/http_sigs/http_sig_test.exs b/test/web/http_sigs/http_sig_test.exs deleted file mode 100644 index c4d2eaf78..000000000 --- a/test/web/http_sigs/http_sig_test.exs +++ /dev/null @@ -1,194 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/> -# SPDX-License-Identifier: AGPL-3.0-only - -# http signatures -# Test data from https://tools.ietf.org/html/draft-cavage-http-signatures-08#appendix-C -defmodule Pleroma.Web.HTTPSignaturesTest do -  use Pleroma.DataCase -  alias Pleroma.Web.HTTPSignatures -  import Pleroma.Factory -  import Tesla.Mock - -  setup do -    mock(fn env -> apply(HttpRequestMock, :request, [env]) end) -    :ok -  end - -  @public_key hd(:public_key.pem_decode(File.read!("test/web/http_sigs/pub.key"))) -              |> :public_key.pem_entry_decode() - -  @headers %{ -    "(request-target)" => "post /foo?param=value&pet=dog", -    "host" => "example.com", -    "date" => "Thu, 05 Jan 2014 21:31:40 GMT", -    "content-type" => "application/json", -    "digest" => "SHA-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE=", -    "content-length" => "18" -  } - -  @default_signature """ -  keyId="Test",algorithm="rsa-sha256",signature="jKyvPcxB4JbmYY4mByyBY7cZfNl4OW9HpFQlG7N4YcJPteKTu4MWCLyk+gIr0wDgqtLWf9NLpMAMimdfsH7FSWGfbMFSrsVTHNTk0rK3usrfFnti1dxsM4jl0kYJCKTGI/UWkqiaxwNiKqGcdlEDrTcUhhsFsOIo8VhddmZTZ8w=" -  """ - -  @basic_signature """ -  keyId="Test",algorithm="rsa-sha256",headers="(request-target) host date",signature="HUxc9BS3P/kPhSmJo+0pQ4IsCo007vkv6bUm4Qehrx+B1Eo4Mq5/6KylET72ZpMUS80XvjlOPjKzxfeTQj4DiKbAzwJAb4HX3qX6obQTa00/qPDXlMepD2JtTw33yNnm/0xV7fQuvILN/ys+378Ysi082+4xBQFwvhNvSoVsGv4=" -  """ - -  @all_headers_signature """ -  keyId="Test",algorithm="rsa-sha256",headers="(request-target) host date content-type digest content-length",signature="Ef7MlxLXoBovhil3AlyjtBwAL9g4TN3tibLj7uuNB3CROat/9KaeQ4hW2NiJ+pZ6HQEOx9vYZAyi+7cmIkmJszJCut5kQLAwuX+Ms/mUFvpKlSo9StS2bMXDBNjOh4Auj774GFj4gwjS+3NhFeoqyr/MuN6HsEnkvn6zdgfE2i0=" -  """ - -  test "split up a signature" do -    expected = %{ -      "keyId" => "Test", -      "algorithm" => "rsa-sha256", -      "signature" => -        "jKyvPcxB4JbmYY4mByyBY7cZfNl4OW9HpFQlG7N4YcJPteKTu4MWCLyk+gIr0wDgqtLWf9NLpMAMimdfsH7FSWGfbMFSrsVTHNTk0rK3usrfFnti1dxsM4jl0kYJCKTGI/UWkqiaxwNiKqGcdlEDrTcUhhsFsOIo8VhddmZTZ8w=", -      "headers" => ["date"] -    } - -    assert HTTPSignatures.split_signature(@default_signature) == expected -  end - -  test "validates the default case" do -    signature = HTTPSignatures.split_signature(@default_signature) -    assert HTTPSignatures.validate(@headers, signature, @public_key) -  end - -  test "validates the basic case" do -    signature = HTTPSignatures.split_signature(@basic_signature) -    assert HTTPSignatures.validate(@headers, signature, @public_key) -  end - -  test "validates the all-headers case" do -    signature = HTTPSignatures.split_signature(@all_headers_signature) -    assert HTTPSignatures.validate(@headers, signature, @public_key) -  end - -  test "it contructs a signing string" do -    expected = "date: Thu, 05 Jan 2014 21:31:40 GMT\ncontent-length: 18" -    assert expected == HTTPSignatures.build_signing_string(@headers, ["date", "content-length"]) -  end - -  test "it validates a conn" do -    public_key_pem = -      "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnGb42rPZIapY4Hfhxrgn\nxKVJczBkfDviCrrYaYjfGxawSw93dWTUlenCVTymJo8meBlFgIQ70ar4rUbzl6GX\nMYvRdku072d1WpglNHXkjKPkXQgngFDrh2sGKtNB/cEtJcAPRO8OiCgPFqRtMiNM\nc8VdPfPdZuHEIZsJ/aUM38EnqHi9YnVDQik2xxDe3wPghOhqjxUM6eLC9jrjI+7i\naIaEygUdyst9qVg8e2FGQlwAeS2Eh8ygCxn+bBlT5OyV59jSzbYfbhtF2qnWHtZy\nkL7KOOwhIfGs7O9SoR2ZVpTEQ4HthNzainIe/6iCR5HGrao/T8dygweXFYRv+k5A\nPQIDAQAB\n-----END PUBLIC KEY-----\n" - -    [public_key] = :public_key.pem_decode(public_key_pem) - -    public_key = -      public_key -      |> :public_key.pem_entry_decode() - -    conn = %{ -      req_headers: [ -        {"host", "localtesting.pleroma.lol"}, -        {"connection", "close"}, -        {"content-length", "2316"}, -        {"user-agent", "http.rb/2.2.2 (Mastodon/2.1.0.rc3; +http://mastodon.example.org/)"}, -        {"date", "Sun, 10 Dec 2017 14:23:49 GMT"}, -        {"digest", "SHA-256=x/bHADMW8qRrq2NdPb5P9fl0lYpKXXpe5h5maCIL0nM="}, -        {"content-type", "application/activity+json"}, -        {"(request-target)", "post /users/demiurge/inbox"}, -        {"signature", -         "keyId=\"http://mastodon.example.org/users/admin#main-key\",algorithm=\"rsa-sha256\",headers=\"(request-target) user-agent host date digest content-type\",signature=\"i0FQvr51sj9BoWAKydySUAO1RDxZmNY6g7M62IA7VesbRSdFZZj9/fZapLp6YSuvxUF0h80ZcBEq9GzUDY3Chi9lx6yjpUAS2eKb+Am/hY3aswhnAfYd6FmIdEHzsMrpdKIRqO+rpQ2tR05LwiGEHJPGS0p528NvyVxrxMT5H5yZS5RnxY5X2HmTKEgKYYcvujdv7JWvsfH88xeRS7Jlq5aDZkmXvqoR4wFyfgnwJMPLel8P/BUbn8BcXglH/cunR0LUP7sflTxEz+Rv5qg+9yB8zgBsB4C0233WpcJxjeD6Dkq0EcoJObBR56F8dcb7NQtUDu7x6xxzcgSd7dHm5w==\""} -      ] -    } - -    assert HTTPSignatures.validate_conn(conn, public_key) -  end - -  test "it validates a conn and fetches the key" do -    conn = %{ -      params: %{"actor" => "http://mastodon.example.org/users/admin"}, -      req_headers: [ -        {"host", "localtesting.pleroma.lol"}, -        {"x-forwarded-for", "127.0.0.1"}, -        {"connection", "close"}, -        {"content-length", "2307"}, -        {"user-agent", "http.rb/2.2.2 (Mastodon/2.1.0.rc3; +http://mastodon.example.org/)"}, -        {"date", "Sun, 11 Feb 2018 17:12:01 GMT"}, -        {"digest", "SHA-256=UXsAnMtR9c7mi1FOf6HRMtPgGI1yi2e9nqB/j4rZ99I="}, -        {"content-type", "application/activity+json"}, -        {"signature", -         "keyId=\"http://mastodon.example.org/users/admin#main-key\",algorithm=\"rsa-sha256\",headers=\"(request-target) user-agent host date digest content-type\",signature=\"qXKqpQXUpC3d9bZi2ioEeAqP8nRMD021CzH1h6/w+LRk4Hj31ARJHDwQM+QwHltwaLDUepshMfz2WHSXAoLmzWtvv7xRwY+mRqe+NGk1GhxVZ/LSrO/Vp7rYfDpfdVtkn36LU7/Bzwxvvaa4ZWYltbFsRBL0oUrqsfmJFswNCQIG01BB52BAhGSCORHKtQyzo1IZHdxl8y80pzp/+FOK2SmHkqWkP9QbaU1qTZzckL01+7M5btMW48xs9zurEqC2sM5gdWMQSZyL6isTV5tmkTZrY8gUFPBJQZgihK44v3qgfWojYaOwM8ATpiv7NG8wKN/IX7clDLRMA8xqKRCOKw==\""}, -        {"(request-target)", "post /users/demiurge/inbox"} -      ] -    } - -    assert HTTPSignatures.validate_conn(conn) -  end - -  test "validate this" do -    conn = %{ -      params: %{"actor" => "https://niu.moe/users/rye"}, -      req_headers: [ -        {"x-forwarded-for", "149.202.73.191"}, -        {"host", "testing.pleroma.lol"}, -        {"x-cluster-client-ip", "149.202.73.191"}, -        {"connection", "upgrade"}, -        {"content-length", "2396"}, -        {"user-agent", "http.rb/3.0.0 (Mastodon/2.2.0; +https://niu.moe/)"}, -        {"date", "Sun, 18 Feb 2018 20:31:51 GMT"}, -        {"digest", "SHA-256=dzH+vLyhxxALoe9RJdMl4hbEV9bGAZnSfddHQzeidTU="}, -        {"content-type", "application/activity+json"}, -        {"signature", -         "keyId=\"https://niu.moe/users/rye#main-key\",algorithm=\"rsa-sha256\",headers=\"(request-target) user-agent host date digest content-type\",signature=\"wtxDg4kIpW7nsnUcVJhBk6SgJeDZOocr8yjsnpDRqE52lR47SH6X7G16r7L1AUJdlnbfx7oqcvomoIJoHB3ghP6kRnZW6MyTMZ2jPoi3g0iC5RDqv6oAmDSO14iw6U+cqZbb3P/odS5LkbThF0UNXcfenVNfsKosIJycFjhNQc54IPCDXYq/7SArEKJp8XwEgzmiC2MdxlkVIUSTQYfjM4EG533cwlZocw1mw72e5mm/owTa80BUZAr0OOuhoWARJV9btMb02ZyAF6SCSoGPTA37wHyfM1Dk88NHf7Z0Aov/Fl65dpRM+XyoxdkpkrhDfH9qAx4iuV2VEWddQDiXHA==\""}, -        {"(request-target)", "post /inbox"} -      ] -    } - -    assert HTTPSignatures.validate_conn(conn) -  end - -  test "validate this too" do -    conn = %{ -      params: %{"actor" => "https://niu.moe/users/rye"}, -      req_headers: [ -        {"x-forwarded-for", "149.202.73.191"}, -        {"host", "testing.pleroma.lol"}, -        {"x-cluster-client-ip", "149.202.73.191"}, -        {"connection", "upgrade"}, -        {"content-length", "2342"}, -        {"user-agent", "http.rb/3.0.0 (Mastodon/2.2.0; +https://niu.moe/)"}, -        {"date", "Sun, 18 Feb 2018 21:44:46 GMT"}, -        {"digest", "SHA-256=vS8uDOJlyAu78cF3k5EzrvaU9iilHCX3chP37gs5sS8="}, -        {"content-type", "application/activity+json"}, -        {"signature", -         "keyId=\"https://niu.moe/users/rye#main-key\",algorithm=\"rsa-sha256\",headers=\"(request-target) user-agent host date digest content-type\",signature=\"IN6fHD8pLiDEf35dOaRHzJKc1wBYh3/Yq0ItaNGxUSbJTd2xMjigZbcsVKzvgYYjglDDN+disGNeD+OBKwMqkXWaWe/lyMc9wHvCH5NMhpn/A7qGLY8yToSt4vh8ytSkZKO6B97yC+Nvy6Fz/yMbvKtFycIvSXCq417cMmY6f/aG+rtMUlTbKO5gXzC7SUgGJCtBPCh1xZzu5/w0pdqdjO46ePNeR6JyJSLLV4hfo3+p2n7SRraxM4ePVCUZqhwS9LPt3Zdhy3ut+IXCZgMVIZggQFM+zXLtcXY5HgFCsFQr5WQDu+YkhWciNWtKFnWfAsnsg5sC330lZ/0Z8Z91yA==\""}, -        {"(request-target)", "post /inbox"} -      ] -    } - -    assert HTTPSignatures.validate_conn(conn) -  end - -  test "it generates a signature" do -    user = insert(:user) -    assert HTTPSignatures.sign(user, %{host: "mastodon.example.org"}) =~ "keyId=\"" -  end - -  test "this too" do -    conn = %{ -      params: %{"actor" => "https://mst3k.interlinked.me/users/luciferMysticus"}, -      req_headers: [ -        {"host", "soc.canned-death.us"}, -        {"user-agent", "http.rb/3.0.0 (Mastodon/2.2.0; +https://mst3k.interlinked.me/)"}, -        {"date", "Sun, 11 Mar 2018 12:19:36 GMT"}, -        {"digest", "SHA-256=V7Hl6qDK2m8WzNsjzNYSBISi9VoIXLFlyjF/a5o1SOc="}, -        {"content-type", "application/activity+json"}, -        {"signature", -         "keyId=\"https://mst3k.interlinked.me/users/luciferMysticus#main-key\",algorithm=\"rsa-sha256\",headers=\"(request-target) user-agent host date digest content-type\",signature=\"CTYdK5a6lYMxzmqjLOpvRRASoxo2Rqib2VrAvbR5HaTn80kiImj15pCpAyx8IZp53s0Fn/y8MjCTzp+absw8kxx0k2sQAXYs2iy6xhdDUe7iGzz+XLAEqLyZIZfecynaU2nb3Z2XnFDjhGjR1vj/JP7wiXpwp6o1dpDZj+KT2vxHtXuB9585V+sOHLwSB1cGDbAgTy0jx/2az2EGIKK2zkw1KJuAZm0DDMSZalp/30P8dl3qz7DV2EHdDNfaVtrs5BfbDOZ7t1hCcASllzAzgVGFl0BsrkzBfRMeUMRucr111ZG+c0BNOEtJYOHSyZsSSdNknElggCJekONYMYk5ZA==\""}, -        {"x-forwarded-for", "2607:5300:203:2899::31:1337"}, -        {"x-forwarded-host", "soc.canned-death.us"}, -        {"x-forwarded-server", "soc.canned-death.us"}, -        {"connection", "Keep-Alive"}, -        {"content-length", "2006"}, -        {"(request-target)", "post /inbox"} -      ] -    } - -    assert HTTPSignatures.validate_conn(conn) -  end -end diff --git a/test/web/http_sigs/priv.key b/test/web/http_sigs/priv.key deleted file mode 100644 index 425518a06..000000000 --- a/test/web/http_sigs/priv.key +++ /dev/null @@ -1,15 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIICXgIBAAKBgQDCFENGw33yGihy92pDjZQhl0C36rPJj+CvfSC8+q28hxA161QF -NUd13wuCTUcq0Qd2qsBe/2hFyc2DCJJg0h1L78+6Z4UMR7EOcpfdUE9Hf3m/hs+F -UR45uBJeDK1HSFHD8bHKD6kv8FPGfJTotc+2xjJwoYi+1hqp1fIekaxsyQIDAQAB -AoGBAJR8ZkCUvx5kzv+utdl7T5MnordT1TvoXXJGXK7ZZ+UuvMNUCdN2QPc4sBiA -QWvLw1cSKt5DsKZ8UETpYPy8pPYnnDEz2dDYiaew9+xEpubyeW2oH4Zx71wqBtOK -kqwrXa/pzdpiucRRjk6vE6YY7EBBs/g7uanVpGibOVAEsqH1AkEA7DkjVH28WDUg -f1nqvfn2Kj6CT7nIcE3jGJsZZ7zlZmBmHFDONMLUrXR/Zm3pR5m0tCmBqa5RK95u -412jt1dPIwJBANJT3v8pnkth48bQo/fKel6uEYyboRtA5/uHuHkZ6FQF7OUkGogc -mSJluOdc5t6hI1VsLn0QZEjQZMEOWr+wKSMCQQCC4kXJEsHAve77oP6HtG/IiEn7 -kpyUXRNvFsDE0czpJJBvL/aRFUJxuRK91jhjC68sA7NsKMGg5OXb5I5Jj36xAkEA -gIT7aFOYBFwGgQAQkWNKLvySgKbAZRTeLBacpHMuQdl1DfdntvAyqpAZ0lY0RKmW -G6aFKaqQfOXKCyWoUiVknQJAXrlgySFci/2ueKlIE1QqIiLSZ8V8OlpFLRnb1pzI -7U1yQXnTAEFYM560yJlzUpOb1V4cScGd365tiSMvxLOvTA== ------END RSA PRIVATE KEY----- diff --git a/test/web/http_sigs/pub.key b/test/web/http_sigs/pub.key deleted file mode 100644 index b3bbf6cb9..000000000 --- a/test/web/http_sigs/pub.key +++ /dev/null @@ -1,6 +0,0 @@ ------BEGIN PUBLIC KEY----- -MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDCFENGw33yGihy92pDjZQhl0C3 -6rPJj+CvfSC8+q28hxA161QFNUd13wuCTUcq0Qd2qsBe/2hFyc2DCJJg0h1L78+6 -Z4UMR7EOcpfdUE9Hf3m/hs+FUR45uBJeDK1HSFHD8bHKD6kv8FPGfJTotc+2xjJw -oYi+1hqp1fIekaxsyQIDAQAB ------END PUBLIC KEY----- diff --git a/test/web/mastodon_api/account_view_test.exs b/test/web/mastodon_api/account_view_test.exs index a24f2a050..aaf2261bb 100644 --- a/test/web/mastodon_api/account_view_test.exs +++ b/test/web/mastodon_api/account_view_test.exs @@ -55,7 +55,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do        fields: [],        bot: false,        source: %{ -        note: "", +        note: "valid html",          sensitive: false,          pleroma: %{}        }, @@ -120,7 +120,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do        fields: [],        bot: true,        source: %{ -        note: "", +        note: user.bio,          sensitive: false,          pleroma: %{}        }, @@ -209,7 +209,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do        fields: [],        bot: true,        source: %{ -        note: "", +        note: user.bio,          sensitive: false,          pleroma: %{}        }, diff --git a/test/web/mastodon_api/mastodon_api_controller_test.exs b/test/web/mastodon_api/mastodon_api_controller_test.exs index 505e45010..1d9f5a816 100644 --- a/test/web/mastodon_api/mastodon_api_controller_test.exs +++ b/test/web/mastodon_api/mastodon_api_controller_test.exs @@ -16,6 +16,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do    alias Pleroma.Web.CommonAPI    alias Pleroma.Web.MastodonAPI.FilterView    alias Pleroma.Web.OAuth.App +  alias Pleroma.Web.OAuth.Token    alias Pleroma.Web.OStatus    alias Pleroma.Web.Push    alias Pleroma.Web.TwitterAPI.TwitterAPI @@ -80,6 +81,19 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do      end)    end +  test "the public timeline when public is set to false", %{conn: conn} do +    public = Pleroma.Config.get([:instance, :public]) +    Pleroma.Config.put([:instance, :public], false) + +    on_exit(fn -> +      Pleroma.Config.put([:instance, :public], public) +    end) + +    assert conn +           |> get("/api/v1/timelines/public", %{"local" => "False"}) +           |> json_response(403) == %{"error" => "This resource requires authentication."} +  end +    test "posting a status", %{conn: conn} do      user = insert(:user) @@ -432,7 +446,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do    end    test "verify_credentials default scope unlisted", %{conn: conn} do -    user = insert(:user, %{info: %Pleroma.User.Info{default_scope: "unlisted"}}) +    user = insert(:user, %{info: %User.Info{default_scope: "unlisted"}})      conn =        conn @@ -572,6 +586,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do        assert response = json_response(conn, 200)        assert response["phrase"] == filter.phrase        assert response["context"] == filter.context +      assert response["irreversible"] == false        assert response["id"] != nil        assert response["id"] != ""      end @@ -1307,7 +1322,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do    describe "locked accounts" do      test "/api/v1/follow_requests works" do -      user = insert(:user, %{info: %Pleroma.User.Info{locked: true}}) +      user = insert(:user, %{info: %User.Info{locked: true}})        other_user = insert(:user)        {:ok, _activity} = ActivityPub.follow(other_user, user) @@ -1352,7 +1367,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do      end      test "verify_credentials", %{conn: conn} do -      user = insert(:user, %{info: %Pleroma.User.Info{default_scope: "private"}}) +      user = insert(:user, %{info: %User.Info{default_scope: "private"}})        conn =          conn @@ -1364,7 +1379,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do      end      test "/api/v1/follow_requests/:id/reject works" do -      user = insert(:user, %{info: %Pleroma.User.Info{locked: true}}) +      user = insert(:user, %{info: %User.Info{locked: true}})        other_user = insert(:user)        {:ok, _activity} = ActivityPub.follow(other_user, user) @@ -1440,6 +1455,72 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do      assert object.data["actor"] == User.ap_id(user)    end +  test "mascot upload", %{conn: conn} do +    user = insert(:user) + +    non_image_file = %Plug.Upload{ +      content_type: "audio/mpeg", +      path: Path.absname("test/fixtures/sound.mp3"), +      filename: "sound.mp3" +    } + +    conn = +      conn +      |> assign(:user, user) +      |> put("/api/v1/pleroma/mascot", %{"file" => non_image_file}) + +    assert json_response(conn, 415) + +    file = %Plug.Upload{ +      content_type: "image/jpg", +      path: Path.absname("test/fixtures/image.jpg"), +      filename: "an_image.jpg" +    } + +    conn = +      build_conn() +      |> assign(:user, user) +      |> put("/api/v1/pleroma/mascot", %{"file" => file}) + +    assert %{"id" => _, "type" => image} = json_response(conn, 200) +  end + +  test "mascot retrieving", %{conn: conn} do +    user = insert(:user) +    # When user hasn't set a mascot, we should just get pleroma tan back +    conn = +      conn +      |> assign(:user, user) +      |> get("/api/v1/pleroma/mascot") + +    assert %{"url" => url} = json_response(conn, 200) +    assert url =~ "pleroma-fox-tan-smol" + +    # When a user sets their mascot, we should get that back +    file = %Plug.Upload{ +      content_type: "image/jpg", +      path: Path.absname("test/fixtures/image.jpg"), +      filename: "an_image.jpg" +    } + +    conn = +      build_conn() +      |> assign(:user, user) +      |> put("/api/v1/pleroma/mascot", %{"file" => file}) + +    assert json_response(conn, 200) + +    user = User.get_cached_by_id(user.id) + +    conn = +      build_conn() +      |> assign(:user, user) +      |> get("/api/v1/pleroma/mascot") + +    assert %{"url" => url, "type" => "image"} = json_response(conn, 200) +    assert url =~ "an_image" +  end +    test "hashtag timeline", %{conn: conn} do      following = insert(:user) @@ -2114,7 +2195,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do          |> get("/api/v1/pleroma/accounts/#{user.id}/favourites")          |> json_response(:ok) -      assert length(anonymous_response) == 0 +      assert Enum.empty?(anonymous_response)      end      test "does not return others' favorited DM when user is not one of recipients", %{ @@ -2138,7 +2219,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do          |> get("/api/v1/pleroma/accounts/#{user.id}/favourites")          |> json_response(:ok) -      assert length(response) == 0 +      assert Enum.empty?(response)      end      test "paginates favorites using since_id and max_id", %{ @@ -3215,4 +3296,129 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do      replied_to_user = User.get_by_ap_id(replied_to.data["actor"])      assert reblogged_activity["reblog"]["in_reply_to_account_id"] == replied_to_user.id    end + +  describe "create account by app" do +    setup do +      enabled = Pleroma.Config.get([:app_account_creation, :enabled]) +      max_requests = Pleroma.Config.get([:app_account_creation, :max_requests]) +      interval = Pleroma.Config.get([:app_account_creation, :interval]) + +      Pleroma.Config.put([:app_account_creation, :enabled], true) +      Pleroma.Config.put([:app_account_creation, :max_requests], 5) +      Pleroma.Config.put([:app_account_creation, :interval], 1) + +      on_exit(fn -> +        Pleroma.Config.put([:app_account_creation, :enabled], enabled) +        Pleroma.Config.put([:app_account_creation, :max_requests], max_requests) +        Pleroma.Config.put([:app_account_creation, :interval], interval) +      end) + +      :ok +    end + +    test "Account registration via Application", %{conn: conn} do +      conn = +        conn +        |> post("/api/v1/apps", %{ +          client_name: "client_name", +          redirect_uris: "urn:ietf:wg:oauth:2.0:oob", +          scopes: "read, write, follow" +        }) + +      %{ +        "client_id" => client_id, +        "client_secret" => client_secret, +        "id" => _, +        "name" => "client_name", +        "redirect_uri" => "urn:ietf:wg:oauth:2.0:oob", +        "vapid_key" => _, +        "website" => nil +      } = json_response(conn, 200) + +      conn = +        conn +        |> post("/oauth/token", %{ +          grant_type: "client_credentials", +          client_id: client_id, +          client_secret: client_secret +        }) + +      assert %{"access_token" => token, "refresh_token" => refresh, "scope" => scope} = +               json_response(conn, 200) + +      assert token +      token_from_db = Repo.get_by(Token, token: token) +      assert token_from_db +      assert refresh +      assert scope == "read write follow" + +      conn = +        build_conn() +        |> put_req_header("authorization", "Bearer " <> token) +        |> post("/api/v1/accounts", %{ +          username: "lain", +          email: "lain@example.org", +          password: "PlzDontHackLain", +          agreement: true +        }) + +      %{ +        "access_token" => token, +        "created_at" => _created_at, +        "scope" => _scope, +        "token_type" => "Bearer" +      } = json_response(conn, 200) + +      token_from_db = Repo.get_by(Token, token: token) +      assert token_from_db +      token_from_db = Repo.preload(token_from_db, :user) +      assert token_from_db.user + +      assert token_from_db.user.info.confirmation_pending +    end + +    test "rate limit", %{conn: conn} do +      app_token = insert(:oauth_token, user: nil) + +      conn = +        put_req_header(conn, "authorization", "Bearer " <> app_token.token) +        |> Map.put(:remote_ip, {15, 15, 15, 15}) + +      for i <- 1..5 do +        conn = +          conn +          |> post("/api/v1/accounts", %{ +            username: "#{i}lain", +            email: "#{i}lain@example.org", +            password: "PlzDontHackLain", +            agreement: true +          }) + +        %{ +          "access_token" => token, +          "created_at" => _created_at, +          "scope" => _scope, +          "token_type" => "Bearer" +        } = json_response(conn, 200) + +        token_from_db = Repo.get_by(Token, token: token) +        assert token_from_db +        token_from_db = Repo.preload(token_from_db, :user) +        assert token_from_db.user + +        assert token_from_db.user.info.confirmation_pending +      end + +      conn = +        conn +        |> post("/api/v1/accounts", %{ +          username: "6lain", +          email: "6lain@example.org", +          password: "PlzDontHackLain", +          agreement: true +        }) + +      assert json_response(conn, 403) == %{"error" => "Rate limit exceeded."} +    end +  end  end diff --git a/test/web/mongooseim/mongoose_im_controller_test.exs b/test/web/mongooseim/mongoose_im_controller_test.exs new file mode 100644 index 000000000..eb83999bb --- /dev/null +++ b/test/web/mongooseim/mongoose_im_controller_test.exs @@ -0,0 +1,59 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.MongooseIMController do +  use Pleroma.Web.ConnCase +  import Pleroma.Factory + +  test "/user_exists", %{conn: conn} do +    _user = insert(:user, nickname: "lain") +    _remote_user = insert(:user, nickname: "alice", local: false) + +    res = +      conn +      |> get(mongoose_im_path(conn, :user_exists), user: "lain") +      |> json_response(200) + +    assert res == true + +    res = +      conn +      |> get(mongoose_im_path(conn, :user_exists), user: "alice") +      |> json_response(404) + +    assert res == false + +    res = +      conn +      |> get(mongoose_im_path(conn, :user_exists), user: "bob") +      |> json_response(404) + +    assert res == false +  end + +  test "/check_password", %{conn: conn} do +    user = insert(:user, password_hash: Comeonin.Pbkdf2.hashpwsalt("cool")) + +    res = +      conn +      |> get(mongoose_im_path(conn, :check_password), user: user.nickname, pass: "cool") +      |> json_response(200) + +    assert res == true + +    res = +      conn +      |> get(mongoose_im_path(conn, :check_password), user: user.nickname, pass: "uncool") +      |> json_response(403) + +    assert res == false + +    res = +      conn +      |> get(mongoose_im_path(conn, :check_password), user: "nobody", pass: "cool") +      |> json_response(404) + +    assert res == false +  end +end diff --git a/test/web/node_info_test.exs b/test/web/node_info_test.exs index 2fc42b7cc..be1173513 100644 --- a/test/web/node_info_test.exs +++ b/test/web/node_info_test.exs @@ -7,6 +7,22 @@ defmodule Pleroma.Web.NodeInfoTest do    import Pleroma.Factory +  test "GET /.well-known/nodeinfo", %{conn: conn} do +    links = +      conn +      |> get("/.well-known/nodeinfo") +      |> json_response(200) +      |> Map.fetch!("links") + +    Enum.each(links, fn link -> +      href = Map.fetch!(link, "href") + +      conn +      |> get(href) +      |> json_response(200) +    end) +  end +    test "nodeinfo shows staff accounts", %{conn: conn} do      moderator = insert(:user, %{local: true, info: %{is_moderator: true}})      admin = insert(:user, %{local: true, info: %{is_admin: true}}) @@ -32,70 +48,6 @@ defmodule Pleroma.Web.NodeInfoTest do               result["metadata"]["restrictedNicknames"]    end -  test "returns 404 when federation is disabled", %{conn: conn} do -    instance = -      Application.get_env(:pleroma, :instance) -      |> Keyword.put(:federating, false) - -    Application.put_env(:pleroma, :instance, instance) - -    conn -    |> get("/.well-known/nodeinfo") -    |> json_response(404) - -    conn -    |> get("/nodeinfo/2.1.json") -    |> json_response(404) - -    instance = -      Application.get_env(:pleroma, :instance) -      |> Keyword.put(:federating, true) - -    Application.put_env(:pleroma, :instance, instance) -  end - -  test "returns 200 when federation is enabled", %{conn: conn} do -    conn -    |> get("/.well-known/nodeinfo") -    |> json_response(200) - -    conn -    |> get("/nodeinfo/2.1.json") -    |> json_response(200) -  end - -  test "returns 404 when federation is disabled (nodeinfo 2.0)", %{conn: conn} do -    instance = -      Application.get_env(:pleroma, :instance) -      |> Keyword.put(:federating, false) - -    Application.put_env(:pleroma, :instance, instance) - -    conn -    |> get("/.well-known/nodeinfo") -    |> json_response(404) - -    conn -    |> get("/nodeinfo/2.0.json") -    |> json_response(404) - -    instance = -      Application.get_env(:pleroma, :instance) -      |> Keyword.put(:federating, true) - -    Application.put_env(:pleroma, :instance, instance) -  end - -  test "returns 200 when federation is enabled (nodeinfo 2.0)", %{conn: conn} do -    conn -    |> get("/.well-known/nodeinfo") -    |> json_response(200) - -    conn -    |> get("/nodeinfo/2.0.json") -    |> json_response(200) -  end -    test "returns software.repository field in nodeinfo 2.1", %{conn: conn} do      conn      |> get("/.well-known/nodeinfo") diff --git a/test/web/oauth/oauth_controller_test.exs b/test/web/oauth/oauth_controller_test.exs index cb6836983..1c04ac9ad 100644 --- a/test/web/oauth/oauth_controller_test.exs +++ b/test/web/oauth/oauth_controller_test.exs @@ -614,6 +614,27 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do        assert token.scopes == ["scope1", "scope2"]      end +    test "issue a token for client_credentials grant type" do +      app = insert(:oauth_app, scopes: ["read", "write"]) + +      conn = +        build_conn() +        |> post("/oauth/token", %{ +          "grant_type" => "client_credentials", +          "client_id" => app.client_id, +          "client_secret" => app.client_secret +        }) + +      assert %{"access_token" => token, "refresh_token" => refresh, "scope" => scope} = +               json_response(conn, 200) + +      assert token +      token_from_db = Repo.get_by(Token, token: token) +      assert token_from_db +      assert refresh +      assert scope == "read write" +    end +      test "rejects token exchange with invalid client credentials" do        user = insert(:user)        app = insert(:oauth_app) @@ -644,7 +665,7 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do        password = "testpassword"        user = insert(:user, password_hash: Comeonin.Pbkdf2.hashpwsalt(password)) -      info_change = Pleroma.User.Info.confirmation_changeset(user.info, :unconfirmed) +      info_change = Pleroma.User.Info.confirmation_changeset(user.info, need_confirmation: true)        {:ok, user} =          user diff --git a/test/web/oauth/token/utils_test.exs b/test/web/oauth/token/utils_test.exs new file mode 100644 index 000000000..20e338cab --- /dev/null +++ b/test/web/oauth/token/utils_test.exs @@ -0,0 +1,53 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.OAuth.Token.UtilsTest do +  use Pleroma.DataCase +  alias Pleroma.Web.OAuth.Token.Utils +  import Pleroma.Factory + +  describe "fetch_app/1" do +    test "returns error when credentials is invalid" do +      assert {:error, :not_found} = +               Utils.fetch_app(%Plug.Conn{params: %{"client_id" => 1, "client_secret" => "x"}}) +    end + +    test "returns App by params credentails" do +      app = insert(:oauth_app) + +      assert {:ok, load_app} = +               Utils.fetch_app(%Plug.Conn{ +                 params: %{"client_id" => app.client_id, "client_secret" => app.client_secret} +               }) + +      assert load_app == app +    end + +    test "returns App by header credentails" do +      app = insert(:oauth_app) +      header = "Basic " <> Base.encode64("#{app.client_id}:#{app.client_secret}") + +      conn = +        %Plug.Conn{} +        |> Plug.Conn.put_req_header("authorization", header) + +      assert {:ok, load_app} = Utils.fetch_app(conn) +      assert load_app == app +    end +  end + +  describe "format_created_at/1" do +    test "returns formatted created at" do +      token = insert(:oauth_token) +      date = Utils.format_created_at(token) + +      token_date = +        token.inserted_at +        |> DateTime.from_naive!("Etc/UTC") +        |> DateTime.to_unix() + +      assert token_date == date +    end +  end +end diff --git a/test/web/oauth/token_test.exs b/test/web/oauth/token_test.exs index ad2a49f09..3c07309b7 100644 --- a/test/web/oauth/token_test.exs +++ b/test/web/oauth/token_test.exs @@ -69,4 +69,17 @@ defmodule Pleroma.Web.OAuth.TokenTest do      assert tokens == 2    end + +  test "deletes expired tokens" do +    insert(:oauth_token, valid_until: Timex.shift(Timex.now(), days: -3)) +    insert(:oauth_token, valid_until: Timex.shift(Timex.now(), days: -3)) +    t3 = insert(:oauth_token) +    t4 = insert(:oauth_token, valid_until: Timex.shift(Timex.now(), minutes: 10)) +    {tokens, _} = Token.delete_expired_tokens() +    assert tokens == 2 +    available_tokens = Pleroma.Repo.all(Token) + +    token_ids = available_tokens |> Enum.map(& &1.id) +    assert token_ids == [t3.id, t4.id] +  end  end diff --git a/test/web/ostatus/activity_representer_test.exs b/test/web/ostatus/activity_representer_test.exs index a4bb68c4d..16ee02abb 100644 --- a/test/web/ostatus/activity_representer_test.exs +++ b/test/web/ostatus/activity_representer_test.exs @@ -67,37 +67,31 @@ defmodule Pleroma.Web.OStatus.ActivityRepresenterTest do    end    test "a reply note" do -    note = insert(:note_activity) -    answer = insert(:note_activity) -    object = answer.data["object"] -    object = Map.put(object, "inReplyTo", note.data["object"]["id"]) - -    data = %{answer.data | "object" => object} -    answer = %{answer | data: data} - -    note_object = Object.get_by_ap_id(note.data["object"]["id"]) +    user = insert(:user) +    note_object = insert(:note) +    _note = insert(:note_activity, %{note: note_object}) +    object = insert(:note, %{data: %{"inReplyTo" => note_object.data["id"]}}) +    answer = insert(:note_activity, %{note: object})      Repo.update!(        Object.change(note_object, %{data: Map.put(note_object.data, "external_url", "someurl")})      ) -    user = User.get_cached_by_ap_id(answer.data["actor"]) -      expected = """      <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>      <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb> -    <id>#{answer.data["object"]["id"]}</id> +    <id>#{object.data["id"]}</id>      <title>New note by #{user.nickname}</title> -    <content type="html">#{answer.data["object"]["content"]}</content> -    <published>#{answer.data["object"]["published"]}</published> -    <updated>#{answer.data["object"]["published"]}</updated> +    <content type="html">#{object.data["content"]}</content> +    <published>#{object.data["published"]}</published> +    <updated>#{object.data["published"]}</updated>      <ostatus:conversation ref="#{answer.data["context"]}">#{answer.data["context"]}</ostatus:conversation>      <link ref="#{answer.data["context"]}" rel="ostatus:conversation" />      <summary>2hu</summary> -    <link type="application/atom+xml" href="#{answer.data["object"]["id"]}" rel="self" /> -    <link type="text/html" href="#{answer.data["object"]["id"]}" rel="alternate" /> +    <link type="application/atom+xml" href="#{object.data["id"]}" rel="self" /> +    <link type="text/html" href="#{object.data["id"]}" rel="alternate" />      <category term="2hu"/> -    <thr:in-reply-to ref="#{note.data["object"]["id"]}" href="someurl" /> +    <thr:in-reply-to ref="#{note_object.data["id"]}" href="someurl" />      <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>      <link name="2hu" rel="emoji" href="corndog.png" />      """ diff --git a/test/web/ostatus/ostatus_test.exs b/test/web/ostatus/ostatus_test.exs index 2916caf8d..f6be16862 100644 --- a/test/web/ostatus/ostatus_test.exs +++ b/test/web/ostatus/ostatus_test.exs @@ -355,7 +355,7 @@ defmodule Pleroma.Web.OStatusTest do        {:ok, user} = OStatus.find_or_make_user(uri) -      user = Pleroma.User.get_cached_by_id(user.id) +      user = User.get_cached_by_id(user.id)        assert user.name == "Constance Variable"        assert user.nickname == "lambadalambda@social.heldscal.la"        assert user.local == false @@ -374,7 +374,7 @@ defmodule Pleroma.Web.OStatusTest do        {:ok, user} = OStatus.find_or_make_user(uri)        assert user.info == -               %Pleroma.User.Info{ +               %User.Info{                   id: user.info.id,                   ap_enabled: false,                   background: %{}, @@ -407,7 +407,7 @@ defmodule Pleroma.Web.OStatusTest do        {:ok, user} = OStatus.find_or_make_user(uri)        old_name = user.name        old_bio = user.bio -      change = Ecto.Changeset.change(user, %{avatar: nil, bio: nil, old_name: nil}) +      change = Ecto.Changeset.change(user, %{avatar: nil, bio: nil, name: nil})        {:ok, user} = Repo.update(change)        refute user.avatar diff --git a/test/web/rich_media/helpers_test.exs b/test/web/rich_media/helpers_test.exs index 60d93768f..53b0596f5 100644 --- a/test/web/rich_media/helpers_test.exs +++ b/test/web/rich_media/helpers_test.exs @@ -1,6 +1,7 @@  defmodule Pleroma.Web.RichMedia.HelpersTest do    use Pleroma.DataCase +  alias Pleroma.Object    alias Pleroma.Web.CommonAPI    import Pleroma.Factory @@ -59,4 +60,43 @@ defmodule Pleroma.Web.RichMedia.HelpersTest do      Pleroma.Config.put([:rich_media, :enabled], false)    end + +  test "refuses to crawl URLs from posts marked sensitive" do +    user = insert(:user) + +    {:ok, activity} = +      CommonAPI.post(user, %{ +        "status" => "http://example.com/ogp", +        "sensitive" => true +      }) + +    %Object{} = object = Object.normalize(activity) + +    assert object.data["sensitive"] + +    Pleroma.Config.put([:rich_media, :enabled], true) + +    assert %{} = Pleroma.Web.RichMedia.Helpers.fetch_data_for_activity(activity) + +    Pleroma.Config.put([:rich_media, :enabled], false) +  end + +  test "refuses to crawl URLs from posts tagged NSFW" do +    user = insert(:user) + +    {:ok, activity} = +      CommonAPI.post(user, %{ +        "status" => "http://example.com/ogp #nsfw" +      }) + +    %Object{} = object = Object.normalize(activity) + +    assert object.data["sensitive"] + +    Pleroma.Config.put([:rich_media, :enabled], true) + +    assert %{} = Pleroma.Web.RichMedia.Helpers.fetch_data_for_activity(activity) + +    Pleroma.Config.put([:rich_media, :enabled], false) +  end  end diff --git a/test/web/salmon/salmon_test.exs b/test/web/salmon/salmon_test.exs index 7532578ca..e86e76fe9 100644 --- a/test/web/salmon/salmon_test.exs +++ b/test/web/salmon/salmon_test.exs @@ -5,9 +5,12 @@  defmodule Pleroma.Web.Salmon.SalmonTest do    use Pleroma.DataCase    alias Pleroma.Activity +  alias Pleroma.Keys    alias Pleroma.Repo    alias Pleroma.User +  alias Pleroma.Web.Federator.Publisher    alias Pleroma.Web.Salmon +  import Mock    import Pleroma.Factory    @magickey "RSA.pu0s-halox4tu7wmES1FVSx6u-4wc0YrUFXcqWXZG4-27UmbCOpMQftRCldNRfyA-qLbz-eqiwQhh-1EwUvjsD4cYbAHNGHwTvDOyx5AKthQUP44ykPv7kjKGh3DWKySJvcs9tlUG87hlo7AvnMo9pwRS_Zz2CacQ-MKaXyDepk=.AQAB" @@ -32,12 +35,6 @@ defmodule Pleroma.Web.Salmon.SalmonTest do      assert Salmon.decode_and_validate(@wrong_magickey, salmon) == :error    end -  test "generates an RSA private key pem" do -    {:ok, key} = Salmon.generate_rsa_pem() -    assert is_binary(key) -    assert Regex.match?(~r/RSA/, key) -  end -    test "it encodes a magic key from a public key" do      key = Salmon.decode_key(@magickey)      magic_key = Salmon.encode_key(key) @@ -49,18 +46,10 @@ defmodule Pleroma.Web.Salmon.SalmonTest do      _key = Salmon.decode_key(@magickey_friendica)    end -  test "returns a public and private key from a pem" do -    pem = File.read!("test/fixtures/private_key.pem") -    {:ok, private, public} = Salmon.keys_from_pem(pem) - -    assert elem(private, 0) == :RSAPrivateKey -    assert elem(public, 0) == :RSAPublicKey -  end -    test "encodes an xml payload with a private key" do      doc = File.read!("test/fixtures/incoming_note_activity.xml")      pem = File.read!("test/fixtures/private_key.pem") -    {:ok, private, public} = Salmon.keys_from_pem(pem) +    {:ok, private, public} = Keys.keys_from_pem(pem)      # Let's try a roundtrip.      {:ok, salmon} = Salmon.encode(private, doc) @@ -77,7 +66,10 @@ defmodule Pleroma.Web.Salmon.SalmonTest do               "RSA.uzg6r1peZU0vXGADWxGJ0PE34WvmhjUmydbX5YYdOiXfODVLwCMi1umGoqUDm-mRu4vNEdFBVJU1CpFA7dKzWgIsqsa501i2XqElmEveXRLvNRWFB6nG03Q5OUY2as8eE54BJm0p20GkMfIJGwP6TSFb-ICp3QjzbatuSPJ6xCE=.AQAB"    end -  test "it pushes an activity to remote accounts it's addressed to" do +  test_with_mock "it pushes an activity to remote accounts it's addressed to", +                 Publisher, +                 [:passthrough], +                 [] do      user_data = %{        info: %{          salmon: "http://test-example.org/salmon" @@ -100,12 +92,10 @@ defmodule Pleroma.Web.Salmon.SalmonTest do      {:ok, activity} = Repo.insert(%Activity{data: activity_data, recipients: activity_data["to"]})      user = User.get_cached_by_ap_id(activity.data["actor"]) -    {:ok, user} = Pleroma.Web.WebFinger.ensure_keys_present(user) +    {:ok, user} = User.ensure_keys_present(user) -    poster = fn url, _data, _headers -> -      assert url == "http://test-example.org/salmon" -    end +    Salmon.publish(user, activity) -    Salmon.publish(user, activity, poster) +    assert called(Publisher.enqueue_one(Salmon, %{recipient: mentioned_user}))    end  end diff --git a/test/web/twitter_api/twitter_api_controller_test.exs b/test/web/twitter_api/twitter_api_controller_test.exs index 90718cfb4..e194f14fb 100644 --- a/test/web/twitter_api/twitter_api_controller_test.exs +++ b/test/web/twitter_api/twitter_api_controller_test.exs @@ -1094,7 +1094,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do    describe "GET /api/account/confirm_email/:id/:token" do      setup do        user = insert(:user) -      info_change = User.Info.confirmation_changeset(user.info, :unconfirmed) +      info_change = User.Info.confirmation_changeset(user.info, need_confirmation: true)        {:ok, user} =          user @@ -1145,7 +1145,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do        end        user = insert(:user) -      info_change = User.Info.confirmation_changeset(user.info, :unconfirmed) +      info_change = User.Info.confirmation_changeset(user.info, need_confirmation: true)        {:ok, user} =          user diff --git a/test/web/twitter_api/util_controller_test.exs b/test/web/twitter_api/util_controller_test.exs index 56474447b..2cd82b3e7 100644 --- a/test/web/twitter_api/util_controller_test.exs +++ b/test/web/twitter_api/util_controller_test.exs @@ -141,7 +141,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do      test "it returns the managed config", %{conn: conn} do        Pleroma.Config.put([:instance, :managed_config], false) -      Pleroma.Config.put([:fe], theme: "rei-ayanami-towel") +      Pleroma.Config.put([:frontend_configurations, :pleroma_fe], %{theme: "asuka-hospital"})        response =          conn @@ -157,29 +157,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do          |> get("/api/statusnet/config.json")          |> json_response(:ok) -      assert response["site"]["pleromafe"] -    end - -    test "if :pleroma, :fe is false, it returns the new style config settings", %{conn: conn} do -      Pleroma.Config.put([:instance, :managed_config], true) -      Pleroma.Config.put([:fe, :theme], "rei-ayanami-towel") -      Pleroma.Config.put([:frontend_configurations, :pleroma_fe], %{theme: "asuka-hospital"}) - -      response = -        conn -        |> get("/api/statusnet/config.json") -        |> json_response(:ok) - -      assert response["site"]["pleromafe"]["theme"] == "rei-ayanami-towel" - -      Pleroma.Config.put([:fe], false) - -      response = -        conn -        |> get("/api/statusnet/config.json") -        |> json_response(:ok) - -      assert response["site"]["pleromafe"]["theme"] == "asuka-hospital" +      assert response["site"]["pleromafe"] == %{"theme" => "asuka-hospital"}      end    end @@ -251,4 +229,22 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do      assert conn.status in [200, 503]    end + +  describe "POST /api/pleroma/disable_account" do +    test "it returns HTTP 200", %{conn: conn} do +      user = insert(:user) + +      response = +        conn +        |> assign(:user, user) +        |> post("/api/pleroma/disable_account", %{"password" => "test"}) +        |> json_response(:ok) + +      assert response == %{"status" => "success"} + +      user = User.get_cached_by_id(user.id) + +      assert user.info.deactivated == true +    end +  end  end diff --git a/test/web/views/error_view_test.exs b/test/web/views/error_view_test.exs index d529fd2c3..3857d585f 100644 --- a/test/web/views/error_view_test.exs +++ b/test/web/views/error_view_test.exs @@ -4,6 +4,7 @@  defmodule Pleroma.Web.ErrorViewTest do    use Pleroma.Web.ConnCase, async: true +  import ExUnit.CaptureLog    # Bring render/3 and render_to_string/3 for testing custom views    import Phoenix.View @@ -13,17 +14,23 @@ defmodule Pleroma.Web.ErrorViewTest do    end    test "render 500.json" do -    assert render(Pleroma.Web.ErrorView, "500.json", []) == -             %{errors: %{detail: "Internal server error", reason: "nil"}} +    assert capture_log(fn -> +             assert render(Pleroma.Web.ErrorView, "500.json", []) == +                      %{errors: %{detail: "Internal server error", reason: "nil"}} +           end) =~ "[error] Internal server error: nil"    end    test "render any other" do -    assert render(Pleroma.Web.ErrorView, "505.json", []) == -             %{errors: %{detail: "Internal server error", reason: "nil"}} +    assert capture_log(fn -> +             assert render(Pleroma.Web.ErrorView, "505.json", []) == +                      %{errors: %{detail: "Internal server error", reason: "nil"}} +           end) =~ "[error] Internal server error: nil"    end    test "render 500.json with reason" do -    assert render(Pleroma.Web.ErrorView, "500.json", reason: "test reason") == -             %{errors: %{detail: "Internal server error", reason: "\"test reason\""}} +    assert capture_log(fn -> +             assert render(Pleroma.Web.ErrorView, "500.json", reason: "test reason") == +                      %{errors: %{detail: "Internal server error", reason: "\"test reason\""}} +           end) =~ "[error] Internal server error: \"test reason\""    end  end diff --git a/test/web/web_finger/web_finger_test.exs b/test/web/web_finger/web_finger_test.exs index 6b20d8d56..335c95b18 100644 --- a/test/web/web_finger/web_finger_test.exs +++ b/test/web/web_finger/web_finger_test.exs @@ -105,19 +105,4 @@ defmodule Pleroma.Web.WebFingerTest do        assert template == "http://status.alpicola.com/main/xrd?uri={uri}"      end    end - -  describe "ensure_keys_present" do -    test "it creates keys for a user and stores them in info" do -      user = insert(:user) -      refute is_binary(user.info.keys) -      {:ok, user} = WebFinger.ensure_keys_present(user) -      assert is_binary(user.info.keys) -    end - -    test "it doesn't create keys if there already are some" do -      user = insert(:user, %{info: %{keys: "xxx"}}) -      {:ok, user} = WebFinger.ensure_keys_present(user) -      assert user.info.keys == "xxx" -    end -  end  end diff --git a/test/web/websub/websub_controller_test.exs b/test/web/websub/websub_controller_test.exs index 1e69ed01a..f79745d58 100644 --- a/test/web/websub/websub_controller_test.exs +++ b/test/web/websub/websub_controller_test.exs @@ -5,7 +5,6 @@  defmodule Pleroma.Web.Websub.WebsubControllerTest do    use Pleroma.Web.ConnCase    import Pleroma.Factory -  alias Pleroma.Activity    alias Pleroma.Repo    alias Pleroma.Web.Websub    alias Pleroma.Web.Websub.WebsubClientSubscription @@ -52,7 +51,7 @@ defmodule Pleroma.Web.Websub.WebsubControllerTest do    end    describe "websub_incoming" do -    test "handles incoming feed updates", %{conn: conn} do +    test "accepts incoming feed updates", %{conn: conn} do        websub = insert(:websub_client_subscription)        doc = "some stuff"        signature = Websub.sign(websub.secret, doc) @@ -64,8 +63,6 @@ defmodule Pleroma.Web.Websub.WebsubControllerTest do          |> post("/push/subscriptions/#{websub.id}", doc)        assert response(conn, 200) == "OK" - -      assert length(Repo.all(Activity)) == 1      end      test "rejects incoming feed updates with the wrong signature", %{conn: conn} do @@ -80,8 +77,6 @@ defmodule Pleroma.Web.Websub.WebsubControllerTest do          |> post("/push/subscriptions/#{websub.id}", doc)        assert response(conn, 500) == "Error" - -      assert Enum.empty?(Repo.all(Activity))      end    end  end | 
