X-Git-Url: http://git.squeep.com/?a=blobdiff_plain;f=lib%2Fmix%2Ftasks%2Fpleroma%2Fuser.ex;h=590553443fbdc298f47e13954d424abd4cbfea0c;hb=8764f646900f577add5cc606b433870633b2e4d5;hp=9aa569b2ae7d356156d05ec0728785bf4aaa227c;hpb=ae82852330105edb681d131fd33cf35557c8614c;p=akkoma diff --git a/lib/mix/tasks/pleroma/user.ex b/lib/mix/tasks/pleroma/user.ex index 9aa569b2a..590553443 100644 --- a/lib/mix/tasks/pleroma/user.ex +++ b/lib/mix/tasks/pleroma/user.ex @@ -1,6 +1,8 @@ defmodule Mix.Tasks.Pleroma.User do use Mix.Task + import Ecto.Changeset alias Pleroma.{Repo, User} + alias Mix.Tasks.Pleroma.Common @shortdoc "Manages Pleroma users" @moduledoc """ @@ -17,6 +19,10 @@ defmodule Mix.Tasks.Pleroma.User do - `--moderator`/`--no-moderator` - whether the user is a moderator - `--admin`/`--no-admin` - whether the user is an admin + ## Generate an invite link. + + mix pleroma.user invite + ## Delete the user's account. mix pleroma.user rm NICKNAME @@ -25,6 +31,10 @@ defmodule Mix.Tasks.Pleroma.User do mix pleroma.user toggle_activated NICKNAME + ## Unsubscribe local users from user's account and deactivate it + + mix pleroma.user unsubscribe NICKNAME + ## Create a password reset link. mix pleroma.user reset_password NICKNAME @@ -38,7 +48,6 @@ defmodule Mix.Tasks.Pleroma.User do - `--moderator`/`--no-moderator` - whether the user is a moderator - `--admin`/`--no-admin` - whether the user is an admin """ - def run(["new", nickname, email | rest]) do {options, [], []} = OptionParser.parse( @@ -47,7 +56,8 @@ defmodule Mix.Tasks.Pleroma.User do name: :string, bio: :string, password: :string, - moderator: :boolean + moderator: :boolean, + admin: :boolean ] ) @@ -64,6 +74,7 @@ defmodule Mix.Tasks.Pleroma.User do end moderator? = Keyword.get(options, :moderator, false) + admin? = Keyword.get(options, :admin, false) Mix.shell().info(""" A user will be created with the following information: @@ -75,12 +86,13 @@ defmodule Mix.Tasks.Pleroma.User do - name: #{name} - bio: #{bio} - moderator: #{if(moderator?, do: "true", else: "false")} + - admin: #{if(admin?, do: "true", else: "false")} """) proceed? = Mix.shell().yes?("Continue?") unless not proceed? do - Mix.Task.run("app.start") + Common.start_pleroma() params = %{ @@ -102,6 +114,10 @@ defmodule Mix.Tasks.Pleroma.User do run(["set", nickname, "--moderator"]) end + if admin? do + run(["set", nickname, "--admin"]) + end + if generated_password? do run(["reset_password", nickname]) end @@ -111,25 +127,31 @@ defmodule Mix.Tasks.Pleroma.User do end def run(["rm", nickname]) do - Mix.Task.run("app.start") + Common.start_pleroma() with %User{local: true} = user <- User.get_by_nickname(nickname) do User.delete(user) + Mix.shell().info("User #{nickname} deleted.") + else + _ -> + Mix.shell().error("No local user #{nickname}") end - - Mix.shell().info("User #{nickname} deleted.") end def run(["toggle_activated", nickname]) do - Mix.Task.run("app.start") + Common.start_pleroma() - with user <- User.get_by_nickname(nickname) do + with %User{} = user <- User.get_by_nickname(nickname) do User.deactivate(user, !user.info["deactivated"]) + Mix.shell().info("Activation status of #{nickname}: #{user.info["deactivated"]}") + else + _ -> + Mix.shell().error("No user #{nickname}") end end def run(["reset_password", nickname]) do - Mix.Task.run("app.start") + Common.start_pleroma() with %User{local: true} = user <- User.get_by_nickname(nickname), {:ok, token} <- Pleroma.PasswordResetToken.create_token(user) do @@ -150,7 +172,38 @@ defmodule Mix.Tasks.Pleroma.User do end end + def run(["unsubscribe", nickname]) do + Common.start_pleroma() + + with %User{} = user <- User.get_by_nickname(nickname) do + Mix.shell().info("Deactivating #{user.nickname}") + User.deactivate(user) + + {:ok, friends} = User.get_friends(user) + + Enum.each(friends, fn friend -> + user = Repo.get(User, user.id) + + Mix.shell().info("Unsubscribing #{friend.nickname} from #{user.nickname}") + User.unfollow(user, friend) + end) + + :timer.sleep(500) + + user = Repo.get(User, user.id) + + if length(user.following) == 0 do + Mix.shell().info("Successfully unsubscribed all followers from #{user.nickname}") + end + else + _ -> + Mix.shell().error("No user #{nickname}") + end + end + def run(["set", nickname | rest]) do + Common.start_pleroma() + {options, [], []} = OptionParser.parse( rest, @@ -161,73 +214,80 @@ defmodule Mix.Tasks.Pleroma.User do ] ) - case Keyword.get(options, :moderator) do - nil -> nil - value -> set_moderator(nickname, value) - end + with %User{local: true} = user <- User.get_by_nickname(nickname) do + case Keyword.get(options, :moderator) do + nil -> nil + value -> set_moderator(user, value) + end - case Keyword.get(options, :locked) do - nil -> nil - value -> set_locked(nickname, value) - end + case Keyword.get(options, :locked) do + nil -> nil + value -> set_locked(user, value) + end - case Keyword.get(options, :admin) do - nil -> nil - value -> set_admin(nickname, value) + case Keyword.get(options, :admin) do + nil -> nil + value -> set_admin(user, value) + end + else + _ -> + Mix.shell().error("No local user #{nickname}") end end - defp set_moderator(nickname, value) do - Application.ensure_all_started(:pleroma) + defp set_moderator(user, value) do + info_cng = User.Info.admin_api_update(user.info, %{is_moderator: value}) - with %User{local: true} = user <- User.get_by_nickname(nickname) do - info = - user.info - |> Map.put("is_moderator", value) + user_cng = + Ecto.Changeset.change(user) + |> put_embed(:info, info_cng) - cng = User.info_changeset(user, %{info: info}) - {:ok, user} = User.update_and_set_cache(cng) + {:ok, user} = User.update_and_set_cache(user_cng) - Mix.shell().info("Moderator status of #{nickname}: #{user.info["is_moderator"]}") - else - _ -> - Mix.shell().error("No local user #{nickname}") - end + Mix.shell().info("Moderator status of #{user.nickname}: #{user.info.is_moderator}") end - defp set_admin(nickname, value) do - Application.ensure_all_started(:pleroma) + defp set_admin(user, value) do + info_cng = User.Info.admin_api_update(user.info, %{is_admin: value}) - with %User{local: true} = user <- User.get_by_nickname(nickname) do - info = - user.info - |> Map.put("is_admin", value) + user_cng = + Ecto.Changeset.change(user) + |> put_embed(:info, info_cng) - cng = User.info_changeset(user, %{info: info}) - {:ok, user} = User.update_and_set_cache(cng) + {:ok, user} = User.update_and_set_cache(user_cng) - Mix.shell().info("Admin status of #{nickname}: #{user.info["is_admin"]}") - else - _ -> - Mix.shell().error("No local user #{nickname}") - end + Mix.shell().info("Admin status of #{user.nickname}: #{user.info.is_moderator}") end - defp set_locked(nickname, value) do - Mix.Ecto.ensure_started(Repo, []) + defp set_locked(user, value) do + info_cng = User.Info.user_upgrade(user.info, %{locked: value}) - with %User{local: true} = user <- User.get_by_nickname(nickname) do - info = - user.info - |> Map.put("locked", value) + user_cng = + Ecto.Changeset.change(user) + |> put_embed(:info, info_cng) + + {:ok, user} = User.update_and_set_cache(user_cng) + + Mix.shell().info("Locked status of #{user.nickname}: #{user.info.locked}") + end + + def run(["invite"]) do + Common.start_pleroma() + + with {:ok, token} <- Pleroma.UserInviteToken.create_token() do + Mix.shell().info("Generated user invite token") - cng = User.info_changeset(user, %{info: info}) - user = Repo.update!(cng) + url = + Pleroma.Web.Router.Helpers.redirect_url( + Pleroma.Web.Endpoint, + :registration_page, + token.token + ) - IO.puts("Locked status of #{nickname}: #{user.info["locked"]}") + IO.puts(url) else _ -> - IO.puts("No local user #{nickname}") + Mix.shell().error("Could not create invite token.") end end end