From bcc8b1e2964f2763e9331d6260daa73b6651d0ea Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Thu, 5 Nov 2026 16:16:38 +0200 Subject: [PATCH 1/6] Mark currently accessing token in oauth token management API --- changelog.d/current_token.add | 1 + lib/pleroma/web/o_auth/token_controller.ex | 4 ++-- lib/pleroma/web/o_auth/token_view.ex | 5 +++-- .../pleroma/web/o_auth/token_controller_test.exs | 16 +++++++++++++++- 4 files changed, 21 insertions(+), 5 deletions(-) create mode 100644 changelog.d/current_token.add diff --git a/changelog.d/current_token.add b/changelog.d/current_token.add new file mode 100644 index 000000000..f8004ef7b --- /dev/null +++ b/changelog.d/current_token.add @@ -0,0 +1 @@ +OAuth token list API now includes property to signify which token is being used to access the API diff --git a/lib/pleroma/web/o_auth/token_controller.ex b/lib/pleroma/web/o_auth/token_controller.ex index 296b60510..5c92307da 100644 --- a/lib/pleroma/web/o_auth/token_controller.ex +++ b/lib/pleroma/web/o_auth/token_controller.ex @@ -26,11 +26,11 @@ defmodule Pleroma.Web.OAuth.TokenController do end end - def oauth_tokens(%{assigns: %{user: user}} = conn, _params) do + def oauth_tokens(%{assigns: %{user: user, token: current_token}} = conn, _params) do with oauth_tokens <- Token.get_user_tokens(user) do conn |> put_view(TokenView) - |> render("index.json", %{tokens: oauth_tokens}) + |> render("index.json", %{tokens: oauth_tokens, token: current_token}) end end diff --git a/lib/pleroma/web/o_auth/token_view.ex b/lib/pleroma/web/o_auth/token_view.ex index f9894399a..053ad748a 100644 --- a/lib/pleroma/web/o_auth/token_view.ex +++ b/lib/pleroma/web/o_auth/token_view.ex @@ -11,12 +11,13 @@ defmodule Pleroma.Web.OAuth.TokenView do |> Enum.filter(&Enum.any?/1) end - def render("show.json", %{token: token_entry}) do + def render("show.json", %{token: token_entry, current_token: current_token}) do %{ id: token_entry.id, valid_until: token_entry.valid_until, app_name: token_entry.app.client_name, - scopes: token_entry.scopes + scopes: token_entry.scopes, + is_current_token: token_entry.id == current_token.id } end end diff --git a/test/pleroma/web/o_auth/token_controller_test.exs b/test/pleroma/web/o_auth/token_controller_test.exs index 08acf27bf..c408c7c32 100644 --- a/test/pleroma/web/o_auth/token_controller_test.exs +++ b/test/pleroma/web/o_auth/token_controller_test.exs @@ -62,7 +62,21 @@ defmodule Pleroma.Web.OAuth.TokenControllerTest do |> hd() |> 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", "is_current_token"]) + end + + test "marks which token is being used for the request" do + %{conn: conn, user: user, token: current} = oauth_access(["read:security"]) + other = insert(:oauth_token, user: user) + + tokens = + conn + |> get("/api/oauth_tokens") + |> json_response(200) + |> Map.new(&{&1["id"], &1["is_current_token"]}) + + assert tokens[current.id] == true + assert tokens[other.id] == false end test "is allowed with the read scope" do From 573134ac6cf5ba51a47380cfe6f3967022a67b44 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Thu, 5 Nov 2026 16:25:43 +0200 Subject: [PATCH 2/6] mix format --- lib/pleroma/web/activity_pub/mrf/anti_followbot_policy.ex | 6 +++++- lib/pleroma/web/activity_pub/mrf/simple_policy.ex | 2 +- lib/pleroma/workers/mailer_worker.ex | 4 +++- .../web/activity_pub/mrf/force_mentions_in_content_test.exs | 6 +++++- test/pleroma/web/o_auth/token_controller_test.exs | 3 ++- 5 files changed, 16 insertions(+), 5 deletions(-) diff --git a/lib/pleroma/web/activity_pub/mrf/anti_followbot_policy.ex b/lib/pleroma/web/activity_pub/mrf/anti_followbot_policy.ex index 990ff31c9..72a71c25c 100644 --- a/lib/pleroma/web/activity_pub/mrf/anti_followbot_policy.ex +++ b/lib/pleroma/web/activity_pub/mrf/anti_followbot_policy.ex @@ -24,7 +24,11 @@ defmodule Pleroma.Web.ActivityPub.MRF.AntiFollowbotPolicy do defp score_displayname("fedibot"), do: 1.0 defp score_displayname(_), do: 0.0 - defp determine_if_followbot(%User{nickname: nickname, name: displayname, actor_type: actor_type}) do + defp determine_if_followbot(%User{ + nickname: nickname, + name: displayname, + actor_type: actor_type + }) do # nickname will be a binary string except when following a relay nick_score = if is_binary(nickname) do diff --git a/lib/pleroma/web/activity_pub/mrf/simple_policy.ex b/lib/pleroma/web/activity_pub/mrf/simple_policy.ex index b58d1c75a..e415a1da3 100644 --- a/lib/pleroma/web/activity_pub/mrf/simple_policy.ex +++ b/lib/pleroma/web/activity_pub/mrf/simple_policy.ex @@ -110,7 +110,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicy do end defp intersection(list1, list2) do - list1 -- list1 -- list2 + list1 -- (list1 -- list2) end defp check_followers_only(%{host: actor_host} = _actor_info, activity) do diff --git a/lib/pleroma/workers/mailer_worker.ex b/lib/pleroma/workers/mailer_worker.ex index b0259b191..9ef6a80c9 100644 --- a/lib/pleroma/workers/mailer_worker.ex +++ b/lib/pleroma/workers/mailer_worker.ex @@ -6,7 +6,9 @@ defmodule Pleroma.Workers.MailerWorker do use Oban.Worker, queue: :background @impl true - def perform(%Job{args: %{"op" => "email", "encoded_email" => encoded_email, "config" => config}}) do + def perform(%Job{ + args: %{"op" => "email", "encoded_email" => encoded_email, "config" => config} + }) do encoded_email |> Base.decode64!() |> :erlang.binary_to_term() diff --git a/test/pleroma/web/activity_pub/mrf/force_mentions_in_content_test.exs b/test/pleroma/web/activity_pub/mrf/force_mentions_in_content_test.exs index 811ef105c..97d63dc92 100644 --- a/test/pleroma/web/activity_pub/mrf/force_mentions_in_content_test.exs +++ b/test/pleroma/web/activity_pub/mrf/force_mentions_in_content_test.exs @@ -16,7 +16,11 @@ defmodule Pleroma.Web.ActivityPub.MRF.ForceMentionsInContentTest do test "adds mentions to post content" do [lain, coolboymew, dielan, hakui, fence] = [ - insert(:user, ap_id: "https://lain.com/users/lain", nickname: "lain@lain.com", local: false), + insert(:user, + ap_id: "https://lain.com/users/lain", + nickname: "lain@lain.com", + local: false + ), insert(:user, ap_id: "https://shitposter.club/users/coolboymew", nickname: "coolboymew@shitposter.club", diff --git a/test/pleroma/web/o_auth/token_controller_test.exs b/test/pleroma/web/o_auth/token_controller_test.exs index c408c7c32..e41584cd0 100644 --- a/test/pleroma/web/o_auth/token_controller_test.exs +++ b/test/pleroma/web/o_auth/token_controller_test.exs @@ -62,7 +62,8 @@ defmodule Pleroma.Web.OAuth.TokenControllerTest do |> hd() |> Map.keys() - assert Enum.sort(keys) == Enum.sort(["id", "app_name", "valid_until", "scopes", "is_current_token"]) + assert Enum.sort(keys) == + Enum.sort(["id", "app_name", "valid_until", "scopes", "is_current_token"]) end test "marks which token is being used for the request" do From dfc21dc1242e30c348a95e0835779c179933a5ec Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Thu, 5 Nov 2026 16:31:02 +0200 Subject: [PATCH 3/6] Revert "mix format" This reverts commit 573134ac6cf5ba51a47380cfe6f3967022a67b44. --- lib/pleroma/web/activity_pub/mrf/anti_followbot_policy.ex | 6 +----- lib/pleroma/web/activity_pub/mrf/simple_policy.ex | 2 +- lib/pleroma/workers/mailer_worker.ex | 4 +--- .../web/activity_pub/mrf/force_mentions_in_content_test.exs | 6 +----- test/pleroma/web/o_auth/token_controller_test.exs | 3 +-- 5 files changed, 5 insertions(+), 16 deletions(-) diff --git a/lib/pleroma/web/activity_pub/mrf/anti_followbot_policy.ex b/lib/pleroma/web/activity_pub/mrf/anti_followbot_policy.ex index 72a71c25c..990ff31c9 100644 --- a/lib/pleroma/web/activity_pub/mrf/anti_followbot_policy.ex +++ b/lib/pleroma/web/activity_pub/mrf/anti_followbot_policy.ex @@ -24,11 +24,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.AntiFollowbotPolicy do defp score_displayname("fedibot"), do: 1.0 defp score_displayname(_), do: 0.0 - defp determine_if_followbot(%User{ - nickname: nickname, - name: displayname, - actor_type: actor_type - }) do + defp determine_if_followbot(%User{nickname: nickname, name: displayname, actor_type: actor_type}) do # nickname will be a binary string except when following a relay nick_score = if is_binary(nickname) do diff --git a/lib/pleroma/web/activity_pub/mrf/simple_policy.ex b/lib/pleroma/web/activity_pub/mrf/simple_policy.ex index e415a1da3..b58d1c75a 100644 --- a/lib/pleroma/web/activity_pub/mrf/simple_policy.ex +++ b/lib/pleroma/web/activity_pub/mrf/simple_policy.ex @@ -110,7 +110,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicy do end defp intersection(list1, list2) do - list1 -- (list1 -- list2) + list1 -- list1 -- list2 end defp check_followers_only(%{host: actor_host} = _actor_info, activity) do diff --git a/lib/pleroma/workers/mailer_worker.ex b/lib/pleroma/workers/mailer_worker.ex index 9ef6a80c9..b0259b191 100644 --- a/lib/pleroma/workers/mailer_worker.ex +++ b/lib/pleroma/workers/mailer_worker.ex @@ -6,9 +6,7 @@ defmodule Pleroma.Workers.MailerWorker do use Oban.Worker, queue: :background @impl true - def perform(%Job{ - args: %{"op" => "email", "encoded_email" => encoded_email, "config" => config} - }) do + def perform(%Job{args: %{"op" => "email", "encoded_email" => encoded_email, "config" => config}}) do encoded_email |> Base.decode64!() |> :erlang.binary_to_term() diff --git a/test/pleroma/web/activity_pub/mrf/force_mentions_in_content_test.exs b/test/pleroma/web/activity_pub/mrf/force_mentions_in_content_test.exs index 97d63dc92..811ef105c 100644 --- a/test/pleroma/web/activity_pub/mrf/force_mentions_in_content_test.exs +++ b/test/pleroma/web/activity_pub/mrf/force_mentions_in_content_test.exs @@ -16,11 +16,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.ForceMentionsInContentTest do test "adds mentions to post content" do [lain, coolboymew, dielan, hakui, fence] = [ - insert(:user, - ap_id: "https://lain.com/users/lain", - nickname: "lain@lain.com", - local: false - ), + insert(:user, ap_id: "https://lain.com/users/lain", nickname: "lain@lain.com", local: false), insert(:user, ap_id: "https://shitposter.club/users/coolboymew", nickname: "coolboymew@shitposter.club", diff --git a/test/pleroma/web/o_auth/token_controller_test.exs b/test/pleroma/web/o_auth/token_controller_test.exs index e41584cd0..c408c7c32 100644 --- a/test/pleroma/web/o_auth/token_controller_test.exs +++ b/test/pleroma/web/o_auth/token_controller_test.exs @@ -62,8 +62,7 @@ defmodule Pleroma.Web.OAuth.TokenControllerTest do |> hd() |> Map.keys() - assert Enum.sort(keys) == - Enum.sort(["id", "app_name", "valid_until", "scopes", "is_current_token"]) + assert Enum.sort(keys) == Enum.sort(["id", "app_name", "valid_until", "scopes", "is_current_token"]) end test "marks which token is being used for the request" do From 22a2890f2b3fcb760c35c7579b589d1efce69b71 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Thu, 5 Nov 2026 16:31:58 +0200 Subject: [PATCH 4/6] manual lint --- test/pleroma/web/o_auth/token_controller_test.exs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/pleroma/web/o_auth/token_controller_test.exs b/test/pleroma/web/o_auth/token_controller_test.exs index c408c7c32..e41584cd0 100644 --- a/test/pleroma/web/o_auth/token_controller_test.exs +++ b/test/pleroma/web/o_auth/token_controller_test.exs @@ -62,7 +62,8 @@ defmodule Pleroma.Web.OAuth.TokenControllerTest do |> hd() |> Map.keys() - assert Enum.sort(keys) == Enum.sort(["id", "app_name", "valid_until", "scopes", "is_current_token"]) + assert Enum.sort(keys) == + Enum.sort(["id", "app_name", "valid_until", "scopes", "is_current_token"]) end test "marks which token is being used for the request" do From a614fcba79418166c72fceb40926f1cdd93bbaaf Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Thu, 5 Nov 2026 16:56:50 +0200 Subject: [PATCH 5/6] oops? --- lib/pleroma/web/o_auth/token_view.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/web/o_auth/token_view.ex b/lib/pleroma/web/o_auth/token_view.ex index 053ad748a..16fe75387 100644 --- a/lib/pleroma/web/o_auth/token_view.ex +++ b/lib/pleroma/web/o_auth/token_view.ex @@ -5,7 +5,7 @@ defmodule Pleroma.Web.OAuth.TokenView do use Pleroma.Web, :view - def render("index.json", %{tokens: tokens}) do + def render("index.json", %{tokens: tokens, current_token: current_token}) do tokens |> render_many(Pleroma.Web.OAuth.TokenView, "show.json") |> Enum.filter(&Enum.any?/1) From b748e8aea0e4121ba69723aca969a5105340b435 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Thu, 5 Nov 2026 17:31:33 +0200 Subject: [PATCH 6/6] fix --- lib/pleroma/web/o_auth/token_controller.ex | 2 +- lib/pleroma/web/o_auth/token_view.ex | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/pleroma/web/o_auth/token_controller.ex b/lib/pleroma/web/o_auth/token_controller.ex index 5c92307da..7df6b875b 100644 --- a/lib/pleroma/web/o_auth/token_controller.ex +++ b/lib/pleroma/web/o_auth/token_controller.ex @@ -30,7 +30,7 @@ defmodule Pleroma.Web.OAuth.TokenController do with oauth_tokens <- Token.get_user_tokens(user) do conn |> put_view(TokenView) - |> render("index.json", %{tokens: oauth_tokens, token: current_token}) + |> render("index.json", %{tokens: oauth_tokens, current_token: current_token}) end end diff --git a/lib/pleroma/web/o_auth/token_view.ex b/lib/pleroma/web/o_auth/token_view.ex index 16fe75387..ee54280ec 100644 --- a/lib/pleroma/web/o_auth/token_view.ex +++ b/lib/pleroma/web/o_auth/token_view.ex @@ -7,7 +7,9 @@ defmodule Pleroma.Web.OAuth.TokenView do def render("index.json", %{tokens: tokens, current_token: current_token}) do tokens - |> render_many(Pleroma.Web.OAuth.TokenView, "show.json") + |> render_many(Pleroma.Web.OAuth.TokenView, "show.json", %{ + current_token: current_token + }) |> Enum.filter(&Enum.any?/1) end