Merge branch 'develop' into fix/disable-rate-limiter-for-socket-localhost
authorMaxim Filippov <colixer@gmail.com>
Tue, 17 Dec 2019 09:36:56 +0000 (12:36 +0300)
committerMaxim Filippov <colixer@gmail.com>
Tue, 17 Dec 2019 09:36:56 +0000 (12:36 +0300)
1  2 
CHANGELOG.md
test/plugs/rate_limiter_test.exs

diff --combined CHANGELOG.md
index 664c101a70b01b2358ce1f469132f81aae19eb45,c133cd9ec4f3335f9132c025f5822bb457ffe7c7..9681cb7e3af66a0c4b57c857a4be880e7a14b74f
@@@ -21,7 -21,6 +21,7 @@@ The format is based on [Keep a Changelo
  - Deprecated `User.Info` embedded schema (fields moved to `User`)
  - Store status data inside Flag activity
  - Deprecated (reorganized as `UserRelationship` entity) User fields with user AP IDs (`blocks`, `mutes`, `muted_reblogs`, `muted_notifications`, `subscribers`).
 +- Rate limiter is now disabled for localhost/socket (unless remoteip plug is enabled)
  <details>
    <summary>API Changes</summary>
  
@@@ -29,6 -28,7 +29,7 @@@
  - **Breaking:** Admin API: Return link alongside with token on password reset
  - **Breaking:** Admin API: `PUT /api/pleroma/admin/reports/:id` is now `PATCH /api/pleroma/admin/reports`, see admin_api.md for details
  - **Breaking:** `/api/pleroma/admin/users/invite_token` now uses `POST`, changed accepted params and returns full invite in json instead of only token string.
+ - **Breaking** replying to reports is now "report notes", enpoint changed from `POST /api/pleroma/admin/reports/:id/respond` to `POST /api/pleroma/admin/reports/:id/notes`
  - Admin API: Return `total` when querying for reports
  - Mastodon API: Return `pleroma.direct_conversation_id` when creating a direct message (`POST /api/v1/statuses`)
  - Admin API: Return link alongside with token on password reset
@@@ -84,6 -84,8 +85,8 @@@
  - ActivityPub: Configurable `type` field of the actors.
  - Mastodon API: `/api/v1/accounts/:id` has `source/pleroma/actor_type` field.
  - Mastodon API: `/api/v1/update_credentials` accepts `actor_type` field.
+ - Captcha: Support native provider
+ - Captcha: Enable by default
  </details>
  
  ### Fixed
index f3343abcab90a9874e87bef4c069818668fcdaa1,78f1ea9e46c83079c59667a7cf058cb9846ee0d5..06ffa7b7037476dae35822526982748855714354
@@@ -16,7 -16,6 +16,7 @@@ defmodule Pleroma.Plugs.RateLimiterTes
      test "config is required for plug to work" do
        limiter_name = :test_init
        Pleroma.Config.put([:rate_limit, limiter_name], {1, 1})
 +      Pleroma.Config.put([Pleroma.Web.Endpoint, :http, :ip], {8, 8, 8, 8})
  
        assert %{limits: {1, 1}, name: :test_init, opts: [name: :test_init]} ==
                 RateLimiter.init(name: limiter_name)
        assert nil == RateLimiter.init(name: :foo)
      end
  
 +    test "it is disabled for localhost" do
 +      limiter_name = :test_init
 +      Pleroma.Config.put([:rate_limit, limiter_name], {1, 1})
 +      Pleroma.Config.put([Pleroma.Web.Endpoint, :http, :ip], {127, 0, 0, 1})
 +      Pleroma.Config.put([Pleroma.Plugs.RemoteIp, :enabled], false)
 +
 +      assert RateLimiter.disabled?() == true
 +    end
 +
 +    test "it is disabled for socket" do
 +      limiter_name = :test_init
 +      Pleroma.Config.put([:rate_limit, limiter_name], {1, 1})
 +      Pleroma.Config.put([Pleroma.Web.Endpoint, :http, :ip], {:local, "/path/to/pleroma.sock"})
 +      Pleroma.Config.put([Pleroma.Plugs.RemoteIp, :enabled], false)
 +
 +      assert RateLimiter.disabled?() == true
 +    end
 +
 +    test "it is enabled for socket when remote ip is enabled" do
 +      limiter_name = :test_init
 +      Pleroma.Config.put([:rate_limit, limiter_name], {1, 1})
 +      Pleroma.Config.put([Pleroma.Web.Endpoint, :http, :ip], {:local, "/path/to/pleroma.sock"})
 +      Pleroma.Config.put([Pleroma.Plugs.RemoteIp, :enabled], true)
 +
 +      assert RateLimiter.disabled?() == false
 +    end
 +
      test "it restricts based on config values" do
        limiter_name = :test_opts
        scale = 80
        limit = 5
  
 +      Pleroma.Config.put([Pleroma.Web.Endpoint, :http, :ip], {8, 8, 8, 8})
        Pleroma.Config.put([:rate_limit, limiter_name], {scale, limit})
  
        opts = RateLimiter.init(name: limiter_name)
@@@ -90,7 -61,6 +90,7 @@@
        limiter_name = :test_bucket_name
  
        Pleroma.Config.put([:rate_limit, limiter_name], {1000, 5})
 +      Pleroma.Config.put([Pleroma.Web.Endpoint, :http, :ip], {8, 8, 8, 8})
  
        base_bucket_name = "#{limiter_name}:group1"
        opts = RateLimiter.init(name: limiter_name, bucket_name: base_bucket_name)
      test "`params` option allows different queries to be tracked independently" do
        limiter_name = :test_params
        Pleroma.Config.put([:rate_limit, limiter_name], {1000, 5})
 +      Pleroma.Config.put([Pleroma.Web.Endpoint, :http, :ip], {8, 8, 8, 8})
  
        opts = RateLimiter.init(name: limiter_name, params: ["id"])
  
      test "it supports combination of options modifying bucket name" do
        limiter_name = :test_options_combo
        Pleroma.Config.put([:rate_limit, limiter_name], {1000, 5})
 +      Pleroma.Config.put([Pleroma.Web.Endpoint, :http, :ip], {8, 8, 8, 8})
  
        base_bucket_name = "#{limiter_name}:group1"
        opts = RateLimiter.init(name: limiter_name, bucket_name: base_bucket_name, params: ["id"])
      test "are restricted based on remote IP" do
        limiter_name = :test_unauthenticated
        Pleroma.Config.put([:rate_limit, limiter_name], [{1000, 5}, {1, 10}])
 +      Pleroma.Config.put([Pleroma.Web.Endpoint, :http, :ip], {8, 8, 8, 8})
  
        opts = RateLimiter.init(name: limiter_name)
  
      test "can have limits seperate from unauthenticated connections" do
        limiter_name = :test_authenticated
  
-       scale = 1000
+       scale = 50
        limit = 5
-       Pleroma.Config.put([:rate_limit, limiter_name], [{1, 10}, {scale, limit}])
 +      Pleroma.Config.put([Pleroma.Web.Endpoint, :http, :ip], {8, 8, 8, 8})
+       Pleroma.Config.put([:rate_limit, limiter_name], [{1000, 1}, {scale, limit}])
  
        opts = RateLimiter.init(name: limiter_name)
  
  
        assert %{"error" => "Throttled"} = Phoenix.ConnTest.json_response(conn, :too_many_requests)
        assert conn.halted
-       Process.sleep(1550)
-       conn = conn(:get, "/") |> assign(:user, user)
-       conn = RateLimiter.call(conn, opts)
-       assert {1, 4} = RateLimiter.inspect_bucket(conn, limiter_name, opts)
-       refute conn.status == Plug.Conn.Status.code(:too_many_requests)
-       refute conn.resp_body
-       refute conn.halted
      end
  
      test "diffrerent users are counted independently" do
        limiter_name = :test_authenticated
        Pleroma.Config.put([:rate_limit, limiter_name], [{1, 10}, {1000, 5}])
 +      Pleroma.Config.put([Pleroma.Web.Endpoint, :http, :ip], {8, 8, 8, 8})
  
        opts = RateLimiter.init(name: limiter_name)