<%= for scope <- @available_scopes do %>
- <%# Note: using hidden input with `unchecked_value` in order to distinguish user's empty selection from `scope` param being omitted %>
+ <% # Note: using hidden input with `unchecked_value` in order to distinguish user's empty selection from `scope` param being omitted %>
<%= if scope in @scopes do %>
<%= checkbox @form, :"scope_#{scope}", value: scope in @scopes && scope, checked_value: scope, unchecked_value: "", name: "authorization[scope][]" %>
diff --git a/lib/pleroma/web/web_finger/web_finger_controller.ex b/lib/pleroma/web/web_finger/web_finger_controller.ex
index 021df9bc5..8a291e28e 100644
--- a/lib/pleroma/web/web_finger/web_finger_controller.ex
+++ b/lib/pleroma/web/web_finger/web_finger_controller.ex
@@ -41,5 +41,10 @@ defmodule Pleroma.Web.WebFinger.WebFingerController do
end
end
+ # Default to JSON when no format is specified or format is not recognized
+ def webfinger(%{assigns: %{format: _format}} = conn, %{"resource" => _resource} = params) do
+ webfinger(put_in(conn.assigns.format, "json"), params)
+ end
+
def webfinger(conn, _params), do: send_resp(conn, 400, "Bad Request")
end
diff --git a/lib/pleroma/workers/mute_expire_worker.ex b/lib/pleroma/workers/mute_expire_worker.ex
index 8356a775d..9a04fc486 100644
--- a/lib/pleroma/workers/mute_expire_worker.ex
+++ b/lib/pleroma/workers/mute_expire_worker.ex
@@ -5,9 +5,13 @@
defmodule Pleroma.Workers.MuteExpireWorker do
use Oban.Worker, queue: :background
+ alias Pleroma.User
+
@impl true
- def perform(%Job{args: %{"op" => "unmute_user", "muter_id" => muter_id, "mutee_id" => mutee_id}}) do
- Pleroma.User.unmute(muter_id, mutee_id)
+ def perform(%Job{
+ args: %{"op" => "unmute_user", "muter_id" => muter_id, "mutee_id" => mutee_id}
+ }) do
+ User.unmute(muter_id, mutee_id)
:ok
end
@@ -18,6 +22,17 @@ defmodule Pleroma.Workers.MuteExpireWorker do
:ok
end
+ def perform(%Job{
+ args: %{"op" => "unblock_user", "blocker_id" => blocker_id, "blocked_id" => blocked_id}
+ }) do
+ Pleroma.Web.CommonAPI.unblock(
+ User.get_cached_by_id(blocked_id),
+ User.get_cached_by_id(blocker_id)
+ )
+
+ :ok
+ end
+
@impl true
def timeout(_job), do: :timer.seconds(5)
end
diff --git a/mix.exs b/mix.exs
index 808a2b12c..971084f94 100644
--- a/mix.exs
+++ b/mix.exs
@@ -37,22 +37,13 @@ defmodule Pleroma.Mixfile do
pleroma: [
include_executables_for: [:unix],
applications: [ex_syslogger: :load, syslog: :load, eldap: :transient],
- steps: [:assemble, &put_otp_version/1, ©_files/1, ©_nginx_config/1],
+ steps: [:assemble, ©_files/1, ©_nginx_config/1],
config_providers: [{Pleroma.Config.ReleaseRuntimeProvider, []}]
]
]
]
end
- def put_otp_version(%{path: target_path} = release) do
- File.write!(
- Path.join([target_path, "OTP_VERSION"]),
- Pleroma.OTPVersion.version()
- )
-
- release
- end
-
def copy_files(%{path: target_path} = release) do
File.cp_r!("./rel/files", target_path)
release
@@ -213,7 +204,7 @@ defmodule Pleroma.Mixfile do
{:poison, "~> 3.0", only: :test},
{:ex_doc, "~> 0.22", only: :dev, runtime: false},
{:ex_machina, "~> 2.4", only: :test},
- {:credo, "~> 1.6", only: [:dev, :test], runtime: false},
+ {:credo, "~> 1.7", only: [:dev, :test], runtime: false},
{:mock, "~> 0.3.5", only: :test},
{:covertool, "~> 2.0", only: :test},
{:hackney, "~> 1.18.0", override: true},
@@ -236,7 +227,7 @@ defmodule Pleroma.Mixfile do
"ecto.rollback": ["pleroma.ecto.rollback"],
"ecto.setup": ["ecto.create", "ecto.migrate", "run priv/repo/seeds.exs"],
"ecto.reset": ["ecto.drop", "ecto.setup"],
- test: ["ecto.create --quiet", "ecto.migrate", "test"],
+ test: ["ecto.create --quiet", "ecto.migrate", "test --warnings-as-errors"],
docs: ["pleroma.docs", "docs"],
analyze: ["credo --strict --only=warnings,todo,fixme,consistency,readability"],
copyright: &add_copyright/1,
diff --git a/mix.lock b/mix.lock
index 9b53ede62..f7f37b7e1 100644
--- a/mix.lock
+++ b/mix.lock
@@ -23,7 +23,7 @@
"cowboy": {:hex, :cowboy, "2.12.0", "f276d521a1ff88b2b9b4c54d0e753da6c66dd7be6c9fca3d9418b561828a3731", [:make, :rebar3], [{:cowlib, "2.13.0", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "8a7abe6d183372ceb21caa2709bec928ab2b72e18a3911aa1771639bef82651e"},
"cowboy_telemetry": {:hex, :cowboy_telemetry, "0.4.0", "f239f68b588efa7707abce16a84d0d2acf3a0f50571f8bb7f56a15865aae820c", [:rebar3], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7d98bac1ee4565d31b62d59f8823dfd8356a169e7fcbb83831b8a5397404c9de"},
"cowlib": {:hex, :cowlib, "2.13.0", "db8f7505d8332d98ef50a3ef34b34c1afddec7506e4ee4dd4a3a266285d282ca", [:make, :rebar3], [], "hexpm", "e1e1284dc3fc030a64b1ad0d8382ae7e99da46c3246b815318a4b848873800a4"},
- "credo": {:hex, :credo, "1.7.7", "771445037228f763f9b2afd612b6aa2fd8e28432a95dbbc60d8e03ce71ba4446", [:mix], [{:bunt, "~> 0.2.1 or ~> 1.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "8bc87496c9aaacdc3f90f01b7b0582467b69b4bd2441fe8aae3109d843cc2f2e"},
+ "credo": {:hex, :credo, "1.7.12", "9e3c20463de4b5f3f23721527fcaf16722ec815e70ff6c60b86412c695d426c1", [:mix], [{:bunt, "~> 0.2.1 or ~> 1.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "8493d45c656c5427d9c729235b99d498bd133421f3e0a683e5c1b561471291e5"},
"crontab": {:hex, :crontab, "1.1.8", "2ce0e74777dfcadb28a1debbea707e58b879e6aa0ffbf9c9bb540887bce43617", [:mix], [{:ecto, "~> 1.0 or ~> 2.0 or ~> 3.0", [hex: :ecto, repo: "hexpm", optional: true]}], "hexpm"},
"custom_base": {:hex, :custom_base, "0.2.1", "4a832a42ea0552299d81652aa0b1f775d462175293e99dfbe4d7dbaab785a706", [:mix], [], "hexpm", "8df019facc5ec9603e94f7270f1ac73ddf339f56ade76a721eaa57c1493ba463"},
"db_connection": {:hex, :db_connection, "2.7.0", "b99faa9291bb09892c7da373bb82cba59aefa9b36300f6145c5f201c7adf48ec", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "dcf08f31b2701f857dfc787fbad78223d61a32204f217f15e881dd93e4bdd3ff"},
diff --git a/priv/repo/migrations/20240904142434_assign_app_user.exs b/priv/repo/migrations/20240904142434_assign_app_user.exs
index 11bec529b..74740220d 100644
--- a/priv/repo/migrations/20240904142434_assign_app_user.exs
+++ b/priv/repo/migrations/20240904142434_assign_app_user.exs
@@ -1,20 +1,24 @@
defmodule Pleroma.Repo.Migrations.AssignAppUser do
use Ecto.Migration
+ import Ecto.Query
+
alias Pleroma.Repo
alias Pleroma.Web.OAuth.App
alias Pleroma.Web.OAuth.Token
def up do
- Repo.all(Token)
- |> Enum.group_by(fn x -> Map.get(x, :app_id) end)
- |> Enum.each(fn {_app_id, tokens} ->
- token =
- Enum.filter(tokens, fn x -> not is_nil(x.user_id) end)
- |> List.first()
-
+ Token
+ |> where([t], not is_nil(t.user_id))
+ |> group_by([t], t.app_id)
+ |> select([t], %{app_id: t.app_id, id: min(t.id)})
+ |> order_by(asc: :app_id)
+ |> Repo.stream()
+ |> Stream.each(fn %{id: id} ->
+ token = Token.Query.get_by_id(id) |> Repo.one()
App.maybe_update_owner(token)
end)
+ |> Stream.run()
end
def down, do: :ok
diff --git a/test/fixtures/warnings/otp_version/21.1 b/test/fixtures/warnings/otp_version/21.1
deleted file mode 100644
index 90cd64c4f..000000000
--- a/test/fixtures/warnings/otp_version/21.1
+++ /dev/null
@@ -1 +0,0 @@
-21.1
\ No newline at end of file
diff --git a/test/fixtures/warnings/otp_version/22.1 b/test/fixtures/warnings/otp_version/22.1
deleted file mode 100644
index d9b314368..000000000
--- a/test/fixtures/warnings/otp_version/22.1
+++ /dev/null
@@ -1 +0,0 @@
-22.1
\ No newline at end of file
diff --git a/test/fixtures/warnings/otp_version/22.4 b/test/fixtures/warnings/otp_version/22.4
deleted file mode 100644
index 1da8ccd28..000000000
--- a/test/fixtures/warnings/otp_version/22.4
+++ /dev/null
@@ -1 +0,0 @@
-22.4
\ No newline at end of file
diff --git a/test/fixtures/warnings/otp_version/23.0 b/test/fixtures/warnings/otp_version/23.0
deleted file mode 100644
index 4266d8634..000000000
--- a/test/fixtures/warnings/otp_version/23.0
+++ /dev/null
@@ -1 +0,0 @@
-23.0
\ No newline at end of file
diff --git a/test/pleroma/otp_version_test.exs b/test/pleroma/otp_version_test.exs
deleted file mode 100644
index 21701d5a8..000000000
--- a/test/pleroma/otp_version_test.exs
+++ /dev/null
@@ -1,42 +0,0 @@
-# Pleroma: A lightweight social networking server
-# Copyright © 2017-2022 Pleroma Authors
-# SPDX-License-Identifier: AGPL-3.0-only
-
-defmodule Pleroma.OTPVersionTest do
- use ExUnit.Case, async: true
-
- alias Pleroma.OTPVersion
-
- describe "check/1" do
- test "22.4" do
- assert OTPVersion.get_version_from_files(["test/fixtures/warnings/otp_version/22.4"]) ==
- "22.4"
- end
-
- test "22.1" do
- assert OTPVersion.get_version_from_files(["test/fixtures/warnings/otp_version/22.1"]) ==
- "22.1"
- end
-
- test "21.1" do
- assert OTPVersion.get_version_from_files(["test/fixtures/warnings/otp_version/21.1"]) ==
- "21.1"
- end
-
- test "23.0" do
- assert OTPVersion.get_version_from_files(["test/fixtures/warnings/otp_version/23.0"]) ==
- "23.0"
- end
-
- test "with nonexistent file" do
- assert OTPVersion.get_version_from_files([
- "test/fixtures/warnings/otp_version/non-exising",
- "test/fixtures/warnings/otp_version/22.4"
- ]) == "22.4"
- end
-
- test "empty paths" do
- assert OTPVersion.get_version_from_files([]) == nil
- end
- end
-end
diff --git a/test/pleroma/user_test.exs b/test/pleroma/user_test.exs
index 176e70ef9..44e2d0d65 100644
--- a/test/pleroma/user_test.exs
+++ b/test/pleroma/user_test.exs
@@ -2669,8 +2669,12 @@ defmodule Pleroma.UserTest do
assert {:ok, user} = User.update_last_active_at(user)
- assert user.last_active_at >= test_started_at
- assert user.last_active_at <= NaiveDateTime.truncate(NaiveDateTime.utc_now(), :second)
+ assert NaiveDateTime.compare(user.last_active_at, test_started_at) in [:gt, :eq]
+
+ assert NaiveDateTime.compare(
+ user.last_active_at,
+ NaiveDateTime.truncate(NaiveDateTime.utc_now(), :second)
+ ) in [:lt, :eq]
last_active_at =
NaiveDateTime.utc_now()
@@ -2682,10 +2686,15 @@ defmodule Pleroma.UserTest do
|> cast(%{last_active_at: last_active_at}, [:last_active_at])
|> User.update_and_set_cache()
- assert user.last_active_at == last_active_at
+ assert NaiveDateTime.compare(user.last_active_at, last_active_at) == :eq
+
assert {:ok, user} = User.update_last_active_at(user)
- assert user.last_active_at >= test_started_at
- assert user.last_active_at <= NaiveDateTime.truncate(NaiveDateTime.utc_now(), :second)
+ assert NaiveDateTime.compare(user.last_active_at, test_started_at) in [:gt, :eq]
+
+ assert NaiveDateTime.compare(
+ user.last_active_at,
+ NaiveDateTime.truncate(NaiveDateTime.utc_now(), :second)
+ ) in [:lt, :eq]
end
test "active_user_count/1" do
diff --git a/test/pleroma/web/common_api_test.exs b/test/pleroma/web/common_api_test.exs
index 73230a58c..6b5d31537 100644
--- a/test/pleroma/web/common_api_test.exs
+++ b/test/pleroma/web/common_api_test.exs
@@ -111,6 +111,17 @@ defmodule Pleroma.Web.CommonAPITest do
end
end
+ test "add expiring block", %{blocker: blocker, blocked: blocked} do
+ {:ok, _} = CommonAPI.block(blocked, blocker, %{expires_in: 60})
+ assert User.blocks?(blocker, blocked)
+
+ worker = Pleroma.Workers.MuteExpireWorker
+ args = %{"op" => "unblock_user", "blocker_id" => blocker.id, "blocked_id" => blocked.id}
+
+ assert :ok = perform_job(worker, args)
+ refute User.blocks?(blocker, blocked)
+ end
+
test "it blocks and does not federate if outgoing blocks are disabled", %{
blocker: blocker,
blocked: blocked
diff --git a/test/pleroma/web/plugs/user_tracking_plug_test.exs b/test/pleroma/web/plugs/user_tracking_plug_test.exs
index 742f04fea..cd9c66448 100644
--- a/test/pleroma/web/plugs/user_tracking_plug_test.exs
+++ b/test/pleroma/web/plugs/user_tracking_plug_test.exs
@@ -21,8 +21,12 @@ defmodule Pleroma.Web.Plugs.UserTrackingPlugTest do
|> assign(:user, user)
|> UserTrackingPlug.call(%{})
- assert user.last_active_at >= test_started_at
- assert user.last_active_at <= NaiveDateTime.truncate(NaiveDateTime.utc_now(), :second)
+ assert NaiveDateTime.compare(user.last_active_at, test_started_at) in [:gt, :eq]
+
+ assert NaiveDateTime.compare(
+ user.last_active_at,
+ NaiveDateTime.truncate(NaiveDateTime.utc_now(), :second)
+ ) in [:lt, :eq]
end
test "doesn't update last_active_at if it was updated recently", %{conn: conn} do
@@ -38,7 +42,7 @@ defmodule Pleroma.Web.Plugs.UserTrackingPlugTest do
|> assign(:user, user)
|> UserTrackingPlug.call(%{})
- assert user.last_active_at == last_active_at
+ assert NaiveDateTime.compare(user.last_active_at, last_active_at) == :eq
end
test "skips updating last_active_at if user ID is nil", %{conn: conn} do
diff --git a/test/pleroma/web/web_finger/web_finger_controller_test.exs b/test/pleroma/web/web_finger/web_finger_controller_test.exs
index 80e072163..be44e3a8b 100644
--- a/test/pleroma/web/web_finger/web_finger_controller_test.exs
+++ b/test/pleroma/web/web_finger/web_finger_controller_test.exs
@@ -5,7 +5,6 @@
defmodule Pleroma.Web.WebFinger.WebFingerControllerTest do
use Pleroma.Web.ConnCase
- import ExUnit.CaptureLog
import Pleroma.Factory
import Tesla.Mock
@@ -55,6 +54,26 @@ defmodule Pleroma.Web.WebFinger.WebFingerControllerTest do
]
end
+ test "Webfinger defaults to JSON when no Accept header is provided" do
+ user =
+ insert(:user,
+ ap_id: "https://hyrule.world/users/zelda",
+ also_known_as: ["https://mushroom.kingdom/users/toad"]
+ )
+
+ response =
+ build_conn()
+ |> get("/.well-known/webfinger?resource=acct:#{user.nickname}@localhost")
+ |> json_response(200)
+
+ assert response["subject"] == "acct:#{user.nickname}@localhost"
+
+ assert response["aliases"] == [
+ "https://hyrule.world/users/zelda",
+ "https://mushroom.kingdom/users/toad"
+ ]
+ end
+
test "reach user on tld, while pleroma is running on subdomain" do
clear_config([Pleroma.Web.Endpoint, :url, :host], "sub.example.com")
@@ -109,16 +128,25 @@ defmodule Pleroma.Web.WebFinger.WebFingerControllerTest do
assert result == "Couldn't find user"
end
- test "Sends a 404 when invalid format" do
- user = insert(:user)
+ test "Returns JSON when format is not supported" do
+ user =
+ insert(:user,
+ ap_id: "https://hyrule.world/users/zelda",
+ also_known_as: ["https://mushroom.kingdom/users/toad"]
+ )
- assert capture_log(fn ->
- assert_raise Phoenix.NotAcceptableError, fn ->
- build_conn()
- |> put_req_header("accept", "text/html")
- |> get("/.well-known/webfinger?resource=acct:#{user.nickname}@localhost")
- end
- end) =~ "no supported media type in accept header"
+ response =
+ build_conn()
+ |> put_req_header("accept", "text/html")
+ |> get("/.well-known/webfinger?resource=acct:#{user.nickname}@localhost")
+ |> json_response(200)
+
+ assert response["subject"] == "acct:#{user.nickname}@localhost"
+
+ assert response["aliases"] == [
+ "https://hyrule.world/users/zelda",
+ "https://mushroom.kingdom/users/toad"
+ ]
end
test "Sends a 400 when resource param is missing" do
diff --git a/test/test_helper.exs b/test/test_helper.exs
index 94661353b..dc6c05a74 100644
--- a/test/test_helper.exs
+++ b/test/test_helper.exs
@@ -2,8 +2,6 @@
# Copyright © 2017-2022 Pleroma Authors
# SPDX-License-Identifier: AGPL-3.0-only
-Code.put_compiler_option(:warnings_as_errors, true)
-
ExUnit.configure(capture_log: true, max_cases: System.schedulers_online())
ExUnit.start(exclude: [:federated])