From 984e5a121aaccff6770399db193b123fff49adee Mon Sep 17 00:00:00 2001 From: Oneric Date: Tue, 8 Apr 2025 23:43:59 +0200 Subject: [PATCH] api/statuses: allow expires_in to override user-level status_ttl_default Fixes: https://akkoma.dev/AkkomaGang/akkoma/issues/898 --- .../controllers/status_controller.ex | 13 ++--- .../controllers/status_controller_test.exs | 51 +++++++++++++++++++ 2 files changed, 58 insertions(+), 6 deletions(-) diff --git a/lib/pleroma/web/mastodon_api/controllers/status_controller.ex b/lib/pleroma/web/mastodon_api/controllers/status_controller.ex index acb5f15a0..79d590a7b 100644 --- a/lib/pleroma/web/mastodon_api/controllers/status_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/status_controller.ex @@ -172,14 +172,15 @@ def create(%{assigns: %{user: user}, body_params: %{status: _} = params} = conn, |> put_application(conn) expires_in_seconds = - if is_nil(user.status_ttl_days), - do: nil, - else: 60 * 60 * 24 * user.status_ttl_days + Map.get(params, :expires_in) || + (user.status_ttl_days && 60 * 60 * 24 * user.status_ttl_days) params = - if is_nil(expires_in_seconds), - do: params, - else: Map.put(params, :expires_in, expires_in_seconds) + case expires_in_seconds do + nil -> params + 0 -> Map.delete(params, :expires_in) + _ -> Map.put(params, :expires_in, expires_in_seconds) + end with {:ok, activity} <- CommonAPI.post(user, params) do try_render(conn, "show.json", diff --git a/test/pleroma/web/mastodon_api/controllers/status_controller_test.exs b/test/pleroma/web/mastodon_api/controllers/status_controller_test.exs index 499596a53..1022aa5c6 100644 --- a/test/pleroma/web/mastodon_api/controllers/status_controller_test.exs +++ b/test/pleroma/web/mastodon_api/controllers/status_controller_test.exs @@ -162,6 +162,57 @@ test "automatically setting a post expiry if status_ttl_days is set" do ) end + test "API paramater overrides user status_ttl_days default" do + user = insert(:user, status_ttl_days: 1) + %{user: _user, token: _token, conn: conn} = oauth_access(["write:statuses"], user: user) + + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/statuses", %{ + "status" => "aa chikichiki banban", + "expires_in" => 2 * 60 * 60 + }) + + assert %{"id" => id} = json_response_and_validate_schema(conn, 200) + + activity = Activity.get_by_id_with_object(id) + {:ok, expires_at, _} = DateTime.from_iso8601(activity.data["expires_at"]) + + expiry_delay = Timex.diff(expires_at, DateTime.utc_now(), :minutes) + assert(expiry_delay in [120, 119]) + + assert_enqueued( + worker: Pleroma.Workers.PurgeExpiredActivity, + args: %{activity_id: id}, + scheduled_at: expires_at + ) + end + + test "API paramater can disable expiry from user-level status_ttl_default" do + user = insert(:user, status_ttl_days: 1) + %{user: _user, token: _token, conn: conn} = oauth_access(["write:statuses"], user: user) + + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/statuses", %{ + "status" => "aa chikichiki banban", + "expires_in" => 0 + }) + + assert %{"id" => id} = json_response_and_validate_schema(conn, 200) + + activity = Activity.get_by_id_with_object(id) + + refute activity.data["expires_at"] + + refute_enqueued( + worker: Pleroma.Workers.PurgeExpiredActivity, + args: %{activity_id: id} + ) + end + test "it fails to create a status if `expires_in` is less or equal than an hour", %{ conn: conn } do