From a06e471db7d731b148184d17746cf75edd31f696 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Fri, 6 Nov 2026 18:59:56 +0200 Subject: [PATCH 1/8] Attempt at adding a last active field to tokens --- lib/pleroma/web/o_auth/token.ex | 9 +++++++++ lib/pleroma/web/o_auth/token_view.ex | 1 + lib/pleroma/web/plugs/o_auth_plug.ex | 1 + .../20170906152508_create_o_auth_token.exs | 1 + .../migrations/202611061856_add_token_activity.exs | 13 +++++++++++++ test/pleroma/web/o_auth/token_controller_test.exs | 2 +- 6 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 priv/repo/migrations/202611061856_add_token_activity.exs diff --git a/lib/pleroma/web/o_auth/token.ex b/lib/pleroma/web/o_auth/token.ex index d96425094..28f1f2dee 100644 --- a/lib/pleroma/web/o_auth/token.ex +++ b/lib/pleroma/web/o_auth/token.ex @@ -21,6 +21,7 @@ defmodule Pleroma.Web.OAuth.Token do field(:refresh_token, :string) field(:scopes, {:array, :string}, default: []) field(:valid_until, :naive_datetime_usec) + field(:last_active, :naive_datetime_usec) belongs_to(:user, User, type: FlakeId.Ecto.CompatType) belongs_to(:app, App) @@ -96,6 +97,14 @@ defmodule Pleroma.Web.OAuth.Token do |> validate_required([:valid_until]) end + defp update_activity() do + last_active = NaiveDateTime.utc_now() + + changeset + |> change(%{last_active: last_active}) + |> validate_required([:last_active]) + end + @spec create(App.t(), User.t(), map()) :: {:ok, Token.t()} | {:error, Ecto.Changeset.t()} def create(%App{} = app, %User{} = user, attrs \\ %{}) do with {:ok, token} <- do_create(app, user, attrs) do diff --git a/lib/pleroma/web/o_auth/token_view.ex b/lib/pleroma/web/o_auth/token_view.ex index ee54280ec..09e0a18bc 100644 --- a/lib/pleroma/web/o_auth/token_view.ex +++ b/lib/pleroma/web/o_auth/token_view.ex @@ -17,6 +17,7 @@ defmodule Pleroma.Web.OAuth.TokenView do %{ id: token_entry.id, valid_until: token_entry.valid_until, + last_active: token_entry.last_active, app_name: token_entry.app.client_name, scopes: token_entry.scopes, is_current_token: token_entry.id == current_token.id diff --git a/lib/pleroma/web/plugs/o_auth_plug.ex b/lib/pleroma/web/plugs/o_auth_plug.ex index b59ac9d3e..6f366d3cb 100644 --- a/lib/pleroma/web/plugs/o_auth_plug.ex +++ b/lib/pleroma/web/plugs/o_auth_plug.ex @@ -24,6 +24,7 @@ defmodule Pleroma.Web.Plugs.OAuthPlug do with {:ok, token_str} <- fetch_token_str(conn) do with {:ok, user, user_token} <- fetch_user_and_token(token_str), false <- Token.expired?(user_token) do + Token.update_activity() conn |> assign(:token, user_token) |> assign(:user, user) diff --git a/priv/repo/migrations/20170906152508_create_o_auth_token.exs b/priv/repo/migrations/20170906152508_create_o_auth_token.exs index 14ce55b5a..5b662a5a3 100644 --- a/priv/repo/migrations/20170906152508_create_o_auth_token.exs +++ b/priv/repo/migrations/20170906152508_create_o_auth_token.exs @@ -12,6 +12,7 @@ defmodule Pleroma.Repo.Migrations.CreateOAuthToken do add(:token, :string) add(:refresh_token, :string) add(:valid_until, :naive_datetime_usec) + add(:last_active, :naive_datetime_usec) timestamps() end diff --git a/priv/repo/migrations/202611061856_add_token_activity.exs b/priv/repo/migrations/202611061856_add_token_activity.exs new file mode 100644 index 000000000..98f4b0184 --- /dev/null +++ b/priv/repo/migrations/202611061856_add_token_activity.exs @@ -0,0 +1,13 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2022 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Repo.Migrations.AddTokenActivity do + use Ecto.Migration + + def change do + alter table(:oauth_tokens) do + add_if_not_exists(:last_active, :naive_datetime_usec) + end + 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 e41584cd0..75167c346 100644 --- a/test/pleroma/web/o_auth/token_controller_test.exs +++ b/test/pleroma/web/o_auth/token_controller_test.exs @@ -63,7 +63,7 @@ defmodule Pleroma.Web.OAuth.TokenControllerTest do |> Map.keys() assert Enum.sort(keys) == - Enum.sort(["id", "app_name", "valid_until", "scopes", "is_current_token"]) + Enum.sort(["id", "app_name", "valid_until", "scopes", "is_current_token", "last_active"]) end test "marks which token is being used for the request" do From a20b22f5a978509a2d264b1bedfa1dcb689d4ac0 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Fri, 6 Nov 2026 19:01:09 +0200 Subject: [PATCH 2/8] changelog --- changelog.d/token-activity.add | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/token-activity.add diff --git a/changelog.d/token-activity.add b/changelog.d/token-activity.add new file mode 100644 index 000000000..258f283eb --- /dev/null +++ b/changelog.d/token-activity.add @@ -0,0 +1 @@ +Added "last active at" field to OAuth token management From ae6e32c63516843e06bfba1412db72b8c0b7bd0f Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Fri, 6 Nov 2026 19:10:57 +0200 Subject: [PATCH 3/8] lint --- test/pleroma/web/o_auth/token_controller_test.exs | 9 ++++++++- 1 file changed, 8 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 75167c346..6b2b0aeec 100644 --- a/test/pleroma/web/o_auth/token_controller_test.exs +++ b/test/pleroma/web/o_auth/token_controller_test.exs @@ -63,7 +63,14 @@ defmodule Pleroma.Web.OAuth.TokenControllerTest do |> Map.keys() assert Enum.sort(keys) == - Enum.sort(["id", "app_name", "valid_until", "scopes", "is_current_token", "last_active"]) + Enum.sort([ + "id", + "app_name", + "valid_until", + "scopes", + "is_current_token", + "last_active" + ]) end test "marks which token is being used for the request" do From ff89b67d551663c82ae9c5e8cd603e89adc3d315 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Fri, 6 Nov 2026 19:16:15 +0200 Subject: [PATCH 4/8] lint --- lib/pleroma/web/plugs/o_auth_plug.ex | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/pleroma/web/plugs/o_auth_plug.ex b/lib/pleroma/web/plugs/o_auth_plug.ex index 6f366d3cb..e3035df0c 100644 --- a/lib/pleroma/web/plugs/o_auth_plug.ex +++ b/lib/pleroma/web/plugs/o_auth_plug.ex @@ -25,6 +25,7 @@ defmodule Pleroma.Web.Plugs.OAuthPlug do with {:ok, user, user_token} <- fetch_user_and_token(token_str), false <- Token.expired?(user_token) do Token.update_activity() + conn |> assign(:token, user_token) |> assign(:user, user) From 74ab1769d1280078591535514b579621f9e765a3 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Fri, 6 Nov 2026 19:26:24 +0200 Subject: [PATCH 5/8] lint? --- lib/pleroma/web/o_auth/token.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/web/o_auth/token.ex b/lib/pleroma/web/o_auth/token.ex index 28f1f2dee..d076d4a83 100644 --- a/lib/pleroma/web/o_auth/token.ex +++ b/lib/pleroma/web/o_auth/token.ex @@ -97,7 +97,7 @@ defmodule Pleroma.Web.OAuth.Token do |> validate_required([:valid_until]) end - defp update_activity() do + defp update_activity do last_active = NaiveDateTime.utc_now() changeset From 226135e2e1e2d24337f99e88a9e8452b129ecfa4 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Mon, 9 Nov 2026 16:23:19 +0200 Subject: [PATCH 6/8] i'm learning --- lib/pleroma/web/o_auth/token.ex | 8 +++++++- lib/pleroma/web/plugs/o_auth_plug.ex | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/pleroma/web/o_auth/token.ex b/lib/pleroma/web/o_auth/token.ex index d076d4a83..0c53f3938 100644 --- a/lib/pleroma/web/o_auth/token.ex +++ b/lib/pleroma/web/o_auth/token.ex @@ -97,12 +97,18 @@ defmodule Pleroma.Web.OAuth.Token do |> validate_required([:valid_until]) end - defp update_activity do + @spec update_activity(Token.t()) :: {:ok, Token.t()} | {:error, Ecto.Changeset.t()} + def update_activity(token) do last_active = NaiveDateTime.utc_now() + changeset = Ecto.Changeset.change(token) + changeset |> change(%{last_active: last_active}) |> validate_required([:last_active]) + |> Repo.insert() + + {: ok, token} end @spec create(App.t(), User.t(), map()) :: {:ok, Token.t()} | {:error, Ecto.Changeset.t()} diff --git a/lib/pleroma/web/plugs/o_auth_plug.ex b/lib/pleroma/web/plugs/o_auth_plug.ex index e3035df0c..4246a9c75 100644 --- a/lib/pleroma/web/plugs/o_auth_plug.ex +++ b/lib/pleroma/web/plugs/o_auth_plug.ex @@ -24,7 +24,7 @@ defmodule Pleroma.Web.Plugs.OAuthPlug do with {:ok, token_str} <- fetch_token_str(conn) do with {:ok, user, user_token} <- fetch_user_and_token(token_str), false <- Token.expired?(user_token) do - Token.update_activity() + Token.update_activity(user_token) conn |> assign(:token, user_token) From 02d6262a08d1829c00f04aeba96c3d9e17b67a33 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Mon, 9 Nov 2026 16:29:34 +0200 Subject: [PATCH 7/8] oops --- lib/pleroma/web/o_auth/token.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/web/o_auth/token.ex b/lib/pleroma/web/o_auth/token.ex index 0c53f3938..1457a7997 100644 --- a/lib/pleroma/web/o_auth/token.ex +++ b/lib/pleroma/web/o_auth/token.ex @@ -108,7 +108,7 @@ defmodule Pleroma.Web.OAuth.Token do |> validate_required([:last_active]) |> Repo.insert() - {: ok, token} + {:ok, token} end @spec create(App.t(), User.t(), map()) :: {:ok, Token.t()} | {:error, Ecto.Changeset.t()} From 4baafe313dcb24a3807c5c634e308fbab63153f4 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Mon, 9 Nov 2026 16:51:09 +0200 Subject: [PATCH 8/8] oc fixes --- lib/pleroma/web/o_auth/token.ex | 13 +++---------- .../20170906152508_create_o_auth_token.exs | 1 - ...ty.exs => 20261106185600_add_token_activity.exs} | 0 3 files changed, 3 insertions(+), 11 deletions(-) rename priv/repo/migrations/{202611061856_add_token_activity.exs => 20261106185600_add_token_activity.exs} (100%) diff --git a/lib/pleroma/web/o_auth/token.ex b/lib/pleroma/web/o_auth/token.ex index 1457a7997..50dd399ca 100644 --- a/lib/pleroma/web/o_auth/token.ex +++ b/lib/pleroma/web/o_auth/token.ex @@ -99,16 +99,9 @@ defmodule Pleroma.Web.OAuth.Token do @spec update_activity(Token.t()) :: {:ok, Token.t()} | {:error, Ecto.Changeset.t()} def update_activity(token) do - last_active = NaiveDateTime.utc_now() - - changeset = Ecto.Changeset.change(token) - - changeset - |> change(%{last_active: last_active}) - |> validate_required([:last_active]) - |> Repo.insert() - - {:ok, token} + token + |> Ecto.Changeset.change(last_active: NaiveDateTime.utc_now()) + |> Repo.update() end @spec create(App.t(), User.t(), map()) :: {:ok, Token.t()} | {:error, Ecto.Changeset.t()} diff --git a/priv/repo/migrations/20170906152508_create_o_auth_token.exs b/priv/repo/migrations/20170906152508_create_o_auth_token.exs index 5b662a5a3..14ce55b5a 100644 --- a/priv/repo/migrations/20170906152508_create_o_auth_token.exs +++ b/priv/repo/migrations/20170906152508_create_o_auth_token.exs @@ -12,7 +12,6 @@ defmodule Pleroma.Repo.Migrations.CreateOAuthToken do add(:token, :string) add(:refresh_token, :string) add(:valid_until, :naive_datetime_usec) - add(:last_active, :naive_datetime_usec) timestamps() end diff --git a/priv/repo/migrations/202611061856_add_token_activity.exs b/priv/repo/migrations/20261106185600_add_token_activity.exs similarity index 100% rename from priv/repo/migrations/202611061856_add_token_activity.exs rename to priv/repo/migrations/20261106185600_add_token_activity.exs