Merge branch 'develop' of git.pleroma.social:pleroma/pleroma into alexgleason/pleroma...
authorlain <lain@soykaf.club>
Tue, 5 Jan 2021 12:33:57 +0000 (13:33 +0100)
committerlain <lain@soykaf.club>
Tue, 5 Jan 2021 12:33:57 +0000 (13:33 +0100)
lib/pleroma/web/endpoint.ex
lib/pleroma/web/plugs/confirm_user_plug.ex [new file with mode: 0644]
priv/repo/migrations/20201231185546_confirm_logged_in_users.exs [new file with mode: 0644]
test/pleroma/repo/migrations/confirm_logged_in_users_test.exs [new file with mode: 0644]
test/pleroma/web/plugs/confirm_user_plug_test.exs [new file with mode: 0644]

index f26542e888c435917c48b08d62664fc569d4aa5d..705035845d0921badfb112052351298ba39832ea 100644 (file)
@@ -169,6 +169,8 @@ defmodule Pleroma.Web.Endpoint do
 
   plug(MetricsExporterCaller)
 
+  plug(Pleroma.Web.Plugs.ConfirmUserPlug)
+
   plug(Pleroma.Web.Router)
 
   @doc """
diff --git a/lib/pleroma/web/plugs/confirm_user_plug.ex b/lib/pleroma/web/plugs/confirm_user_plug.ex
new file mode 100644 (file)
index 0000000..218068d
--- /dev/null
@@ -0,0 +1,30 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.Plugs.ConfirmUserPlug do
+  @moduledoc """
+  If a user has ever been granted an OAuth token, they are eligible to become
+  confirmed, regardless of the account_activation_required setting. This plug
+  will confirm a user if found.
+  """
+
+  alias Pleroma.User
+  import Plug.Conn
+
+  def init(opts), do: opts
+
+  def call(%{assigns: %{user: %User{confirmation_pending: true} = user}} = conn, _opts) do
+    with {:ok, user} <- confirm_user(user) do
+      assign(conn, :user, user)
+    end
+  end
+
+  def call(conn, _opts), do: conn
+
+  defp confirm_user(%User{} = user) do
+    user
+    |> User.confirmation_changeset(need_confirmation: false)
+    |> User.update_and_set_cache()
+  end
+end
diff --git a/priv/repo/migrations/20201231185546_confirm_logged_in_users.exs b/priv/repo/migrations/20201231185546_confirm_logged_in_users.exs
new file mode 100644 (file)
index 0000000..de2f351
--- /dev/null
@@ -0,0 +1,22 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Repo.Migrations.ConfirmLoggedInUsers do
+  use Ecto.Migration
+  import Ecto.Query
+  alias Pleroma.Repo
+  alias Pleroma.User
+  alias Pleroma.Web.OAuth.Token
+
+  def up do
+    User
+    |> where([u], u.confirmation_pending == true)
+    |> join(:inner, [u], t in Token, on: t.user_id == u.id)
+    |> Repo.update_all(set: [confirmation_pending: false])
+  end
+
+  def down do
+    :noop
+  end
+end
diff --git a/test/pleroma/repo/migrations/confirm_logged_in_users_test.exs b/test/pleroma/repo/migrations/confirm_logged_in_users_test.exs
new file mode 100644 (file)
index 0000000..f1fd891
--- /dev/null
@@ -0,0 +1,40 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Repo.Migrations.ConfirmLoggedInUsersTest do
+  alias Pleroma.Repo
+  alias Pleroma.User
+  use Pleroma.DataCase, async: true
+  import Ecto.Query
+  import Pleroma.Factory
+  import Pleroma.Tests.Helpers
+
+  setup_all do: require_migration("20201231185546_confirm_logged_in_users")
+
+  test "up/0 confirms unconfirmed but previously-logged-in users", %{migration: migration} do
+    insert_list(25, :oauth_token)
+    Repo.update_all(User, set: [confirmation_pending: true])
+    insert_list(5, :user, confirmation_pending: true)
+
+    count =
+      User
+      |> where(confirmation_pending: true)
+      |> Repo.aggregate(:count)
+
+    assert count == 30
+
+    assert {25, nil} == migration.up()
+
+    count =
+      User
+      |> where(confirmation_pending: true)
+      |> Repo.aggregate(:count)
+
+    assert count == 5
+  end
+
+  test "down/0 does nothing", %{migration: migration} do
+    assert :noop == migration.down()
+  end
+end
diff --git a/test/pleroma/web/plugs/confirm_user_plug_test.exs b/test/pleroma/web/plugs/confirm_user_plug_test.exs
new file mode 100644 (file)
index 0000000..43c1c28
--- /dev/null
@@ -0,0 +1,30 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.Plugs.ConfirmUserPlugTest do
+  use Pleroma.Web.ConnCase, async: true
+  alias Pleroma.User
+  alias Pleroma.Web.Plugs.ConfirmUserPlug
+  import Pleroma.Factory
+
+  test "it confirms an unconfirmed user", %{conn: conn} do
+    %User{id: user_id} = user = insert(:user, confirmation_pending: true)
+
+    conn =
+      conn
+      |> assign(:user, user)
+      |> ConfirmUserPlug.call(%{})
+
+    assert %Plug.Conn{assigns: %{user: %User{id: ^user_id, confirmation_pending: false}}} = conn
+    assert %User{confirmation_pending: false} = User.get_by_id(user_id)
+  end
+
+  test "it does nothing without an unconfirmed user", %{conn: conn} do
+    assert conn == ConfirmUserPlug.call(conn, %{})
+
+    user = insert(:user, confirmation_pending: false)
+    conn = assign(conn, :user, user)
+    assert conn == ConfirmUserPlug.call(conn, %{})
+  end
+end