Merge pull request 'OAuth: require security scopes for /api/oauth_tokens' (#8013) from lambadalambda/pleroma:fix/oauth-tokens-scopes into develop
Reviewed-on: https://git.pleroma.social/pleroma/pleroma/pulls/8013
This commit is contained in:
commit
745926189f
4 changed files with 50 additions and 22 deletions
1
changelog.d/oauth-tokens-scopes.security
Normal file
1
changelog.d/oauth-tokens-scopes.security
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
Require the read:security and write:security scopes to list and revoke OAuth tokens (HTTP Basic auth no longer works for these endpoints)
|
||||||
|
|
@ -780,6 +780,7 @@ Emoji reactions work a lot like favourites do. They make it possible to react to
|
||||||
### Retrieve a list of active sessions for the user
|
### Retrieve a list of active sessions for the user
|
||||||
* Method: `GET`
|
* Method: `GET`
|
||||||
* Authentication: required
|
* Authentication: required
|
||||||
|
* OAuth scope: `read:security`
|
||||||
* Params: none
|
* Params: none
|
||||||
* Response: JSON
|
* Response: JSON
|
||||||
* Example response:
|
* Example response:
|
||||||
|
|
@ -808,8 +809,9 @@ Emoji reactions work a lot like favourites do. They make it possible to react to
|
||||||
### Revoke a user session by its ID
|
### Revoke a user session by its ID
|
||||||
* Method: `DELETE`
|
* Method: `DELETE`
|
||||||
* Authentication: required
|
* Authentication: required
|
||||||
|
* OAuth scope: `write:security`
|
||||||
* Params: none
|
* Params: none
|
||||||
* Response: HTTP 200 on success, 500 on error
|
* Response: HTTP 201 on success, 500 on error
|
||||||
|
|
||||||
## `/api/v1/pleroma/settings/:app`
|
## `/api/v1/pleroma/settings/:app`
|
||||||
### Gets settings for some application
|
### Gets settings for some application
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,8 @@ defmodule Pleroma.Web.OAuth.TokenController do
|
||||||
require Logger
|
require Logger
|
||||||
|
|
||||||
plug(:skip_auth when action == :confirm_email)
|
plug(:skip_auth when action == :confirm_email)
|
||||||
plug(:skip_plug, OAuthScopesPlug when action in [:oauth_tokens, :revoke_token])
|
plug(OAuthScopesPlug, %{scopes: ["read:security"]} when action == :oauth_tokens)
|
||||||
|
plug(OAuthScopesPlug, %{scopes: ["write:security"]} when action == :revoke_token)
|
||||||
|
|
||||||
action_fallback(:errors)
|
action_fallback(:errors)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -52,36 +52,60 @@ defmodule Pleroma.Web.OAuth.TokenControllerTest do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "GET /api/oauth_tokens" do
|
describe "GET /api/oauth_tokens" do
|
||||||
setup do
|
test "renders list" do
|
||||||
token = insert(:oauth_token) |> Repo.preload(:user)
|
%{conn: conn} = oauth_access(["read:security"])
|
||||||
|
|
||||||
%{token: token}
|
|
||||||
end
|
|
||||||
|
|
||||||
test "renders list", %{token: token} do
|
|
||||||
response =
|
|
||||||
build_conn()
|
|
||||||
|> assign(:user, token.user)
|
|
||||||
|> get("/api/oauth_tokens")
|
|
||||||
|
|
||||||
keys =
|
keys =
|
||||||
json_response(response, 200)
|
conn
|
||||||
|
|> get("/api/oauth_tokens")
|
||||||
|
|> json_response(200)
|
||||||
|> hd()
|
|> hd()
|
||||||
|> Map.keys()
|
|> Map.keys()
|
||||||
|
|
||||||
assert Enum.sort(keys) == Enum.sort(["id", "app_name", "valid_until", "scopes"])
|
assert Enum.sort(keys) == Enum.sort(["id", "app_name", "valid_until", "scopes"])
|
||||||
end
|
end
|
||||||
|
|
||||||
test "revoke token", %{token: token} do
|
test "is allowed with the read scope" do
|
||||||
response =
|
%{conn: conn} = oauth_access(["read"])
|
||||||
build_conn()
|
|
||||||
|> assign(:user, token.user)
|
|
||||||
|> delete("/api/oauth_tokens/#{token.id}")
|
|
||||||
|
|
||||||
tokens = Token.get_user_tokens(token.user)
|
assert [_] = conn |> get("/api/oauth_tokens") |> json_response(200)
|
||||||
|
end
|
||||||
|
|
||||||
assert tokens == []
|
test "is forbidden without read:security" do
|
||||||
assert response.status == 201
|
%{conn: conn} = oauth_access(["profile", "read:accounts", "write:security"])
|
||||||
|
|
||||||
|
assert %{"error" => "Insufficient permissions: read:security."} =
|
||||||
|
conn |> get("/api/oauth_tokens") |> json_response(403)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "DELETE /api/oauth_tokens/:id" do
|
||||||
|
test "revokes the token" do
|
||||||
|
%{conn: conn, user: user, token: token} = oauth_access(["write:security"])
|
||||||
|
other = insert(:oauth_token, user: user)
|
||||||
|
|
||||||
|
conn = delete(conn, "/api/oauth_tokens/#{other.id}")
|
||||||
|
|
||||||
|
assert conn.status == 201
|
||||||
|
assert [%Token{id: id}] = Token.get_user_tokens(user)
|
||||||
|
assert id == token.id
|
||||||
|
end
|
||||||
|
|
||||||
|
test "is allowed with the write scope" do
|
||||||
|
%{conn: conn, user: user} = oauth_access(["write"])
|
||||||
|
other = insert(:oauth_token, user: user)
|
||||||
|
|
||||||
|
assert delete(conn, "/api/oauth_tokens/#{other.id}").status == 201
|
||||||
|
end
|
||||||
|
|
||||||
|
test "is forbidden without write:security" do
|
||||||
|
%{conn: conn, user: user} = oauth_access(["profile", "read", "write:accounts"])
|
||||||
|
other = insert(:oauth_token, user: user)
|
||||||
|
|
||||||
|
assert %{"error" => "Insufficient permissions: write:security."} =
|
||||||
|
conn |> delete("/api/oauth_tokens/#{other.id}") |> json_response(403)
|
||||||
|
|
||||||
|
assert length(Token.get_user_tokens(user)) == 2
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue