diff options
| -rw-r--r-- | CHANGELOG.md | 3 | ||||
| -rw-r--r-- | lib/mix/tasks/pleroma/user.ex | 19 | ||||
| -rw-r--r-- | lib/pleroma/user.ex | 13 | ||||
| -rw-r--r-- | lib/pleroma/user/info.ex | 2 | ||||
| -rw-r--r-- | test/tasks/user_test.exs | 27 | ||||
| -rw-r--r-- | test/user_test.exs | 18 | 
6 files changed, 80 insertions, 2 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index b0e849285..b3d8e1e0c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).  - [Prometheus](https://prometheus.io/) metrics  - Support for Mastodon's remote interaction  - Mix Tasks: `mix pleroma.database remove_embedded_objects` +- Mix Tasks: `mix pleroma.user toggle_confirmed`  - Federation: Support for reports  - Configuration: `safe_dm_mentions` option  - Configuration: `link_name` option @@ -98,7 +99,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).  - Mastodon API: Make `irreversible` field default to `false` [`POST /api/v1/filters`]  ## Removed -- Configuration: `config :pleroma, :fe` in favor of the more flexible `config :pleroma, :frontend_configurations`  +- Configuration: `config :pleroma, :fe` in favor of the more flexible `config :pleroma, :frontend_configurations`  ## [0.9.9999] - 2019-04-05  ### Security diff --git a/lib/mix/tasks/pleroma/user.ex b/lib/mix/tasks/pleroma/user.ex index d130ff8c9..25fc40ea7 100644 --- a/lib/mix/tasks/pleroma/user.ex +++ b/lib/mix/tasks/pleroma/user.ex @@ -77,6 +77,10 @@ defmodule Mix.Tasks.Pleroma.User do    ## Delete tags from a user.        mix pleroma.user untag NICKNAME TAGS + +  ## Toggle confirmation of the user's account. + +      mix pleroma.user toggle_confirmed NICKNAME    """    def run(["new", nickname, email | rest]) do      {options, [], []} = @@ -388,6 +392,21 @@ defmodule Mix.Tasks.Pleroma.User do      end    end +  def run(["toggle_confirmed", nickname]) do +    Common.start_pleroma() + +    with %User{} = user <- User.get_cached_by_nickname(nickname) do +      {:ok, user} = User.toggle_confirmation(user) + +      message = if user.info.confirmation_pending, do: "needs", else: "doesn't need" + +      Mix.shell().info("#{nickname} #{message} confirmation.") +    else +      _ -> +        Mix.shell().error("No local user #{nickname}") +    end +  end +    defp set_moderator(user, value) do      info_cng = User.Info.admin_api_update(user.info, %{is_moderator: value}) diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index c6a562a61..1aa966dfc 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -1378,4 +1378,17 @@ defmodule Pleroma.User do    def showing_reblogs?(%User{} = user, %User{} = target) do      target.ap_id not in user.info.muted_reblogs    end + +  @spec toggle_confirmation(User.t()) :: {:ok, User.t()} | {:error, Changeset.t()} +  def toggle_confirmation(%User{} = user) do +    need_confirmation? = !user.info.confirmation_pending + +    info_changeset = +      User.Info.confirmation_changeset(user.info, need_confirmation: need_confirmation?) + +    user +    |> change() +    |> put_embed(:info, info_changeset) +    |> update_and_set_cache() +  end  end diff --git a/lib/pleroma/user/info.ex b/lib/pleroma/user/info.ex index 5a50ee639..5f0cefc00 100644 --- a/lib/pleroma/user/info.ex +++ b/lib/pleroma/user/info.ex @@ -212,7 +212,7 @@ defmodule Pleroma.User.Info do      ])    end -  @spec confirmation_changeset(Info.t(), keyword()) :: Ecto.Changerset.t() +  @spec confirmation_changeset(Info.t(), keyword()) :: Changeset.t()    def confirmation_changeset(info, opts) do      need_confirmation? = Keyword.get(opts, :need_confirmation) diff --git a/test/tasks/user_test.exs b/test/tasks/user_test.exs index eaf4ecf84..1f97740be 100644 --- a/test/tasks/user_test.exs +++ b/test/tasks/user_test.exs @@ -338,4 +338,31 @@ defmodule Mix.Tasks.Pleroma.UserTest do        assert message == "User #{nickname} statuses deleted."      end    end + +  describe "running toggle_confirmed" do +    test "user is confirmed" do +      %{id: id, nickname: nickname} = insert(:user, info: %{confirmation_pending: false}) + +      assert :ok = Mix.Tasks.Pleroma.User.run(["toggle_confirmed", nickname]) +      assert_received {:mix_shell, :info, [message]} +      assert message == "#{nickname} needs confirmation." + +      user = Repo.get(User, id) +      assert user.info.confirmation_pending +      assert user.info.confirmation_token +    end + +    test "user is not confirmed" do +      %{id: id, nickname: nickname} = +        insert(:user, info: %{confirmation_pending: true, confirmation_token: "some token"}) + +      assert :ok = Mix.Tasks.Pleroma.User.run(["toggle_confirmed", nickname]) +      assert_received {:mix_shell, :info, [message]} +      assert message == "#{nickname} doesn't need confirmation." + +      user = Repo.get(User, id) +      refute user.info.confirmation_pending +      refute user.info.confirmation_token +    end +  end  end diff --git a/test/user_test.exs b/test/user_test.exs index 0b65e89e9..f256396c0 100644 --- a/test/user_test.exs +++ b/test/user_test.exs @@ -1204,4 +1204,22 @@ defmodule Pleroma.UserTest do      assert Map.get(user_show, "followers_count") == 2    end + +  describe "toggle_confirmation/1" do +    test "if user is confirmed" do +      user = insert(:user, info: %{confirmation_pending: false}) +      {:ok, user} = User.toggle_confirmation(user) + +      assert user.info.confirmation_pending +      assert user.info.confirmation_token +    end + +    test "if user is unconfirmed" do +      user = insert(:user, info: %{confirmation_pending: true, confirmation_token: "some token"}) +      {:ok, user} = User.toggle_confirmation(user) + +      refute user.info.confirmation_pending +      refute user.info.confirmation_token +    end +  end  end  | 
