Automatically confirm logged-in users

This commit is contained in:
Alex Gleason 2020-12-31 12:13:08 -06:00
parent 70e8ef2c46
commit 64f0e96ff6
No known key found for this signature in database
GPG Key ID: 7211D1F99744FBB7
3 changed files with 62 additions and 0 deletions

View File

@ -169,6 +169,8 @@ def call(conn, opts) do
plug(MetricsExporterCaller) plug(MetricsExporterCaller)
plug(Pleroma.Web.Plugs.ConfirmUserPlug)
plug(Pleroma.Web.Router) plug(Pleroma.Web.Router)
@doc """ @doc """

View File

@ -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

View File

@ -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