1 defmodule Mix.Tasks.Pleroma.User do
3 alias Pleroma.{Repo, User}
5 @shortdoc "Manages Pleroma users"
11 mix pleroma.user new NICKNAME EMAIL [OPTION...]
14 - `--name NAME` - the user's name (i.e., "Lain Iwakura")
15 - `--bio BIO` - the user's bio
16 - `--password PASSWORD` - the user's password
17 - `--moderator`/`--no-moderator` - whether the user is a moderator
19 ## Delete the user's account.
21 mix pleroma.user rm NICKNAME
23 ## Deactivate or activate the user's account.
25 mix pleroma.user toggle_activated NICKNAME
27 ## Create a password reset link.
29 mix pleroma.user reset_password NICKNAME
31 ## Set the value of the given user's settings.
33 mix pleroma.user set NICKNAME [OPTION...]
36 - `--locked`/`--no-locked` - whether the user's account is locked
37 - `--moderator`/`--no-moderator` - whether the user is a moderator
40 def run(["new", nickname, email | rest]) do
52 name = Keyword.get(options, :name, nickname)
53 bio = Keyword.get(options, :bio, "")
55 {password, generated_password?} =
56 case Keyword.get(options, :password) do
58 {:crypto.strong_rand_bytes(16) |> Base.encode64(), true}
64 moderator? = Keyword.get(options, :moderator, false)
67 A user will be created with the following information:
68 - nickname: #{nickname}
71 if(generated_password?, do: "[generated; a reset link will be created]", else: password)
75 - moderator: #{if(moderator?, do: "true", else: "false")}
78 proceed? = Mix.shell().yes?("Continue?")
80 unless not proceed? do
81 Mix.Task.run("app.start")
88 password_confirmation: password,
94 user = User.register_changeset(%User{}, params)
97 Mix.shell().info("User #{nickname} created")
100 run(["set", nickname, "--moderator"])
103 if generated_password? do
104 run(["reset_password", nickname])
107 Mix.shell().info("User will not be created.")
111 def run(["rm", nickname]) do
112 Mix.Task.run("app.start")
114 with %User{local: true} = user <- User.get_by_nickname(nickname) do
118 Mix.shell().info("User #{nickname} deleted.")
121 def run(["toggle_activated", nickname]) do
122 Mix.Task.run("app.start")
124 with user <- User.get_by_nickname(nickname) do
125 User.deactivate(user)
129 def run(["reset_password", nickname]) do
130 Mix.Task.run("app.start")
132 with %User{local: true} = user <- User.get_by_nickname(nickname),
133 {:ok, token} <- Pleroma.PasswordResetToken.create_token(user) do
134 Mix.shell().info("Generated password reset token for #{user.nickname}")
138 Pleroma.Web.Router.Helpers.util_url(
139 Pleroma.Web.Endpoint,
140 :show_password_reset,
147 Mix.shell().error("No local user #{nickname}")
151 def run(["set", nickname | rest]) do
161 case Keyword.get(options, :moderator) do
163 value -> set_moderator(nickname, value)
166 case Keyword.get(options, :locked) do
168 value -> set_locked(nickname, value)
172 defp set_moderator(nickname, value) do
173 Application.ensure_all_started(:pleroma)
175 with %User{local: true} = user <- User.get_by_nickname(nickname) do
178 |> Map.put("is_moderator", value)
180 cng = User.info_changeset(user, %{info: info})
181 {:ok, user} = User.update_and_set_cache(cng)
183 Mix.shell().info("Moderator status of #{nickname}: #{user.info["is_moderator"]}")
186 Mix.shell().error("No local user #{nickname}")
190 defp set_locked(nickname, value) do
191 Mix.Ecto.ensure_started(Repo, [])
193 with %User{local: true} = user <- User.get_by_nickname(nickname) do
196 |> Map.put("locked", value)
198 cng = User.info_changeset(user, %{info: info})
199 user = Repo.update!(cng)
201 IO.puts("Locked status of #{nickname}: #{user.info["locked"]}")
204 IO.puts("No local user #{nickname}")