diff options
| author | Alex Gleason <alex@alexgleason.me> | 2021-04-29 11:14:32 -0500 | 
|---|---|---|
| committer | Alex Gleason <alex@alexgleason.me> | 2021-04-29 11:14:32 -0500 | 
| commit | 762be6ce10d2145e8e31d42c5d1a0bab93dbe7b0 (patch) | |
| tree | 0416ef7020ba2b333cb223200d7108928f714fde /lib/mix/tasks | |
| parent | b7b05a074867c1444dd539d6d2331f6d5504f6e6 (diff) | |
| parent | 115673bce773f91630c3bd4fd2d0023f92bee163 (diff) | |
| download | pleroma-762be6ce10d2145e8e31d42c5d1a0bab93dbe7b0.tar.gz pleroma-762be6ce10d2145e8e31d42c5d1a0bab93dbe7b0.zip | |
Merge remote-tracking branch 'upstream/develop' into block-behavior
Diffstat (limited to 'lib/mix/tasks')
| -rw-r--r-- | lib/mix/tasks/pleroma/app.ex | 2 | ||||
| -rw-r--r-- | lib/mix/tasks/pleroma/benchmark.ex | 2 | ||||
| -rw-r--r-- | lib/mix/tasks/pleroma/config.ex | 51 | ||||
| -rw-r--r-- | lib/mix/tasks/pleroma/count_statuses.ex | 2 | ||||
| -rw-r--r-- | lib/mix/tasks/pleroma/database.ex | 80 | ||||
| -rw-r--r-- | lib/mix/tasks/pleroma/digest.ex | 2 | ||||
| -rw-r--r-- | lib/mix/tasks/pleroma/docs.ex | 2 | ||||
| -rw-r--r-- | lib/mix/tasks/pleroma/ecto.ex | 2 | ||||
| -rw-r--r-- | lib/mix/tasks/pleroma/ecto/migrate.ex | 2 | ||||
| -rw-r--r-- | lib/mix/tasks/pleroma/ecto/rollback.ex | 7 | ||||
| -rw-r--r-- | lib/mix/tasks/pleroma/email.ex | 8 | ||||
| -rw-r--r-- | lib/mix/tasks/pleroma/emoji.ex | 2 | ||||
| -rw-r--r-- | lib/mix/tasks/pleroma/frontend.ex | 2 | ||||
| -rw-r--r-- | lib/mix/tasks/pleroma/instance.ex | 13 | ||||
| -rw-r--r-- | lib/mix/tasks/pleroma/notification_settings.ex | 2 | ||||
| -rw-r--r-- | lib/mix/tasks/pleroma/openapi_spec.ex | 8 | ||||
| -rw-r--r-- | lib/mix/tasks/pleroma/refresh_counter_cache.ex | 2 | ||||
| -rw-r--r-- | lib/mix/tasks/pleroma/relay.ex | 2 | ||||
| -rw-r--r-- | lib/mix/tasks/pleroma/robots_txt.ex | 2 | ||||
| -rw-r--r-- | lib/mix/tasks/pleroma/uploads.ex | 2 | ||||
| -rw-r--r-- | lib/mix/tasks/pleroma/user.ex | 68 | 
21 files changed, 190 insertions, 73 deletions
| diff --git a/lib/mix/tasks/pleroma/app.ex b/lib/mix/tasks/pleroma/app.ex index 463e2449f..0bf7ffabc 100644 --- a/lib/mix/tasks/pleroma/app.ex +++ b/lib/mix/tasks/pleroma/app.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Mix.Tasks.Pleroma.App do diff --git a/lib/mix/tasks/pleroma/benchmark.ex b/lib/mix/tasks/pleroma/benchmark.ex index a607d5d4f..fdf99747a 100644 --- a/lib/mix/tasks/pleroma/benchmark.ex +++ b/lib/mix/tasks/pleroma/benchmark.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Mix.Tasks.Pleroma.Benchmark do diff --git a/lib/mix/tasks/pleroma/config.ex b/lib/mix/tasks/pleroma/config.ex index d7e2e97e7..22502a522 100644 --- a/lib/mix/tasks/pleroma/config.ex +++ b/lib/mix/tasks/pleroma/config.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Mix.Tasks.Pleroma.Config do @@ -27,7 +27,7 @@ defmodule Mix.Tasks.Pleroma.Config do        {opts, _} =          OptionParser.parse!(options, -          strict: [env: :string, delete: :boolean], +          strict: [env: :string, delete: :boolean, path: :string],            aliases: [d: :delete]          ) @@ -259,18 +259,43 @@ defmodule Mix.Tasks.Pleroma.Config do    defp migrate_from_db(opts) do      env = opts[:env] || Pleroma.Config.get(:env) +    filename = "#{env}.exported_from_db.secret.exs" +      config_path = -      if Pleroma.Config.get(:release) do -        :config_path -        |> Pleroma.Config.get() -        |> Path.dirname() -      else -        "config" +      cond do +        opts[:path] -> +          opts[:path] + +        Pleroma.Config.get(:release) -> +          :config_path +          |> Pleroma.Config.get() +          |> Path.dirname() + +        true -> +          "config"        end -      |> Path.join("#{env}.exported_from_db.secret.exs") +      |> Path.join(filename) -    file = File.open!(config_path, [:write, :utf8]) +    with {:ok, file} <- File.open(config_path, [:write, :utf8]) do +      write_config(file, config_path, opts) +      shell_info("Database configuration settings have been exported to #{config_path}") +    else +      _ -> +        shell_error("Impossible to save settings to this directory #{Path.dirname(config_path)}") +        tmp_config_path = Path.join(System.tmp_dir!(), filename) +        file = File.open!(tmp_config_path) + +        shell_info( +          "Saving database configuration settings to #{tmp_config_path}. Copy it to the #{ +            Path.dirname(config_path) +          } manually." +        ) +        write_config(file, tmp_config_path, opts) +    end +  end + +  defp write_config(file, path, opts) do      IO.write(file, config_header())      ConfigDB @@ -278,11 +303,7 @@ defmodule Mix.Tasks.Pleroma.Config do      |> Enum.each(&write_and_delete(&1, file, opts[:delete]))      :ok = File.close(file) -    System.cmd("mix", ["format", config_path]) - -    shell_info( -      "Database configuration settings have been exported to config/#{env}.exported_from_db.secret.exs" -    ) +    System.cmd("mix", ["format", path])    end    if Code.ensure_loaded?(Config.Reader) do diff --git a/lib/mix/tasks/pleroma/count_statuses.ex b/lib/mix/tasks/pleroma/count_statuses.ex index 8761d8f17..c29ea8567 100644 --- a/lib/mix/tasks/pleroma/count_statuses.ex +++ b/lib/mix/tasks/pleroma/count_statuses.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Mix.Tasks.Pleroma.CountStatuses do diff --git a/lib/mix/tasks/pleroma/database.ex b/lib/mix/tasks/pleroma/database.ex index 22151ce08..e7f4b67a4 100644 --- a/lib/mix/tasks/pleroma/database.ex +++ b/lib/mix/tasks/pleroma/database.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Mix.Tasks.Pleroma.Database do @@ -8,10 +8,13 @@ defmodule Mix.Tasks.Pleroma.Database do    alias Pleroma.Object    alias Pleroma.Repo    alias Pleroma.User +    require Logger    require Pleroma.Constants +    import Ecto.Query    import Mix.Pleroma +    use Mix.Task    @shortdoc "A collection of database related tasks" @@ -167,4 +170,79 @@ defmodule Mix.Tasks.Pleroma.Database do      end)      |> Stream.run()    end + +  def run(["set_text_search_config", tsconfig]) do +    start_pleroma() +    %{rows: [[tsc]]} = Ecto.Adapters.SQL.query!(Pleroma.Repo, "SHOW default_text_search_config;") +    shell_info("Current default_text_search_config: #{tsc}") + +    %{rows: [[db]]} = Ecto.Adapters.SQL.query!(Pleroma.Repo, "SELECT current_database();") +    shell_info("Update default_text_search_config: #{tsconfig}") + +    %{messages: msg} = +      Ecto.Adapters.SQL.query!( +        Pleroma.Repo, +        "ALTER DATABASE #{db} SET default_text_search_config = '#{tsconfig}';" +      ) + +    # non-exist config will not raise excpetion but only give >0 messages +    if length(msg) > 0 do +      shell_info("Error: #{inspect(msg, pretty: true)}") +    else +      rum_enabled = Pleroma.Config.get([:database, :rum_enabled]) +      shell_info("Recreate index, RUM: #{rum_enabled}") + +      # Note SQL below needs to be kept up-to-date with latest GIN or RUM index definition in future +      if rum_enabled do +        Ecto.Adapters.SQL.query!( +          Pleroma.Repo, +          "CREATE OR REPLACE FUNCTION objects_fts_update() RETURNS trigger AS $$ BEGIN +          new.fts_content := to_tsvector(new.data->>'content'); +          RETURN new; +          END +          $$ LANGUAGE plpgsql" +        ) + +        shell_info("Refresh RUM index") +        Ecto.Adapters.SQL.query!(Pleroma.Repo, "UPDATE objects SET updated_at = NOW();") +      else +        Ecto.Adapters.SQL.query!(Pleroma.Repo, "DROP INDEX IF EXISTS objects_fts;") + +        Ecto.Adapters.SQL.query!( +          Pleroma.Repo, +          "CREATE INDEX objects_fts ON objects USING gin(to_tsvector('#{tsconfig}', data->>'content')); " +        ) +      end + +      shell_info('Done.') +    end +  end + +  # Rolls back a specific migration (leaving subsequent migrations applied). +  # WARNING: imposes a risk of unrecoverable data loss — proceed at your own responsibility. +  # Based on https://stackoverflow.com/a/53825840 +  def run(["rollback", version]) do +    prompt = "SEVERE WARNING: this operation may result in unrecoverable data loss. Continue?" + +    if shell_prompt(prompt, "n") in ~w(Yn Y y) do +      {_, result, _} = +        Ecto.Migrator.with_repo(Pleroma.Repo, fn repo -> +          version = String.to_integer(version) +          re = ~r/^#{version}_.*\.exs/ +          path = Ecto.Migrator.migrations_path(repo) + +          with {_, "" <> file} <- {:find, Enum.find(File.ls!(path), &String.match?(&1, re))}, +               {_, [{mod, _} | _]} <- {:compile, Code.compile_file(Path.join(path, file))}, +               {_, :ok} <- {:rollback, Ecto.Migrator.down(repo, version, mod)} do +            {:ok, "Reversed migration: #{file}"} +          else +            {:find, _} -> {:error, "No migration found with version prefix: #{version}"} +            {:compile, e} -> {:error, "Problem compiling migration module: #{inspect(e)}"} +            {:rollback, e} -> {:error, "Problem reversing migration: #{inspect(e)}"} +          end +        end) + +      shell_info(inspect(result)) +    end +  end  end diff --git a/lib/mix/tasks/pleroma/digest.ex b/lib/mix/tasks/pleroma/digest.ex index cac148b88..f34fc839e 100644 --- a/lib/mix/tasks/pleroma/digest.ex +++ b/lib/mix/tasks/pleroma/digest.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Mix.Tasks.Pleroma.Digest do diff --git a/lib/mix/tasks/pleroma/docs.ex b/lib/mix/tasks/pleroma/docs.ex index ad5c37fc9..45cca1c74 100644 --- a/lib/mix/tasks/pleroma/docs.ex +++ b/lib/mix/tasks/pleroma/docs.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Mix.Tasks.Pleroma.Docs do diff --git a/lib/mix/tasks/pleroma/ecto.ex b/lib/mix/tasks/pleroma/ecto.ex index 3363cd45f..69564c61a 100644 --- a/lib/mix/tasks/pleroma/ecto.ex +++ b/lib/mix/tasks/pleroma/ecto.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-onl  defmodule Mix.Tasks.Pleroma.Ecto do diff --git a/lib/mix/tasks/pleroma/ecto/migrate.ex b/lib/mix/tasks/pleroma/ecto/migrate.ex index e903bd171..8d9f44e1c 100644 --- a/lib/mix/tasks/pleroma/ecto/migrate.ex +++ b/lib/mix/tasks/pleroma/ecto/migrate.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-onl  defmodule Mix.Tasks.Pleroma.Ecto.Migrate do diff --git a/lib/mix/tasks/pleroma/ecto/rollback.ex b/lib/mix/tasks/pleroma/ecto/rollback.ex index 3dba952cb..025ebaf19 100644 --- a/lib/mix/tasks/pleroma/ecto/rollback.ex +++ b/lib/mix/tasks/pleroma/ecto/rollback.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-onl  defmodule Mix.Tasks.Pleroma.Ecto.Rollback do @@ -20,7 +20,8 @@ defmodule Mix.Tasks.Pleroma.Ecto.Rollback do      start: :boolean,      quiet: :boolean,      log_sql: :boolean, -    migrations_path: :string +    migrations_path: :string, +    env: :string    ]    @moduledoc """ @@ -59,7 +60,7 @@ defmodule Mix.Tasks.Pleroma.Ecto.Rollback do      level = Logger.level()      Logger.configure(level: :info) -    if Pleroma.Config.get(:env) == :test do +    if opts[:env] == "test" do        Logger.info("Rollback succesfully")      else        {:ok, _, _} = diff --git a/lib/mix/tasks/pleroma/email.ex b/lib/mix/tasks/pleroma/email.ex index bc5facc09..4ce8c9b05 100644 --- a/lib/mix/tasks/pleroma/email.ex +++ b/lib/mix/tasks/pleroma/email.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Mix.Tasks.Pleroma.Email do @@ -33,12 +33,12 @@ defmodule Mix.Tasks.Pleroma.Email do      Pleroma.User.Query.build(%{        local: true, -      deactivated: false, -      confirmation_pending: true, +      is_active: true, +      is_confirmed: false,        invisible: false      })      |> Pleroma.Repo.chunk_stream(500) -    |> Stream.each(&Pleroma.User.try_send_confirmation_email(&1)) +    |> Stream.each(&Pleroma.User.maybe_send_confirmation_email(&1))      |> Stream.run()    end  end diff --git a/lib/mix/tasks/pleroma/emoji.ex b/lib/mix/tasks/pleroma/emoji.ex index 1750373f9..9ad4a7467 100644 --- a/lib/mix/tasks/pleroma/emoji.ex +++ b/lib/mix/tasks/pleroma/emoji.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Mix.Tasks.Pleroma.Emoji do diff --git a/lib/mix/tasks/pleroma/frontend.ex b/lib/mix/tasks/pleroma/frontend.ex index f15dbc38b..8334e0049 100644 --- a/lib/mix/tasks/pleroma/frontend.ex +++ b/lib/mix/tasks/pleroma/frontend.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Mix.Tasks.Pleroma.Frontend do diff --git a/lib/mix/tasks/pleroma/instance.ex b/lib/mix/tasks/pleroma/instance.ex index 853c4eaa2..da27a99d0 100644 --- a/lib/mix/tasks/pleroma/instance.ex +++ b/lib/mix/tasks/pleroma/instance.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Mix.Tasks.Pleroma.Instance do @@ -242,6 +242,13 @@ defmodule Mix.Tasks.Pleroma.Instance do            rum_enabled: rum_enabled          ) +      config_dir = Path.dirname(config_path) +      psql_dir = Path.dirname(psql_path) + +      [config_dir, psql_dir, static_dir, uploads_dir] +      |> Enum.reject(&File.exists?/1) +      |> Enum.map(&File.mkdir_p!/1) +        shell_info("Writing config to #{config_path}.")        File.write(config_path, result_config) @@ -275,10 +282,6 @@ defmodule Mix.Tasks.Pleroma.Instance do          indexable: indexable        ) -    unless File.exists?(static_dir) do -      File.mkdir_p!(static_dir) -    end -      robots_txt_path = Path.join(static_dir, "robots.txt")      if File.exists?(robots_txt_path) do diff --git a/lib/mix/tasks/pleroma/notification_settings.ex b/lib/mix/tasks/pleroma/notification_settings.ex index f99275de1..e16866b6a 100644 --- a/lib/mix/tasks/pleroma/notification_settings.ex +++ b/lib/mix/tasks/pleroma/notification_settings.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Mix.Tasks.Pleroma.NotificationSettings do diff --git a/lib/mix/tasks/pleroma/openapi_spec.ex b/lib/mix/tasks/pleroma/openapi_spec.ex new file mode 100644 index 000000000..8f719c58b --- /dev/null +++ b/lib/mix/tasks/pleroma/openapi_spec.ex @@ -0,0 +1,8 @@ +defmodule Mix.Tasks.Pleroma.OpenapiSpec do +  def run([path]) do +    # Load Pleroma application to get version info +    Application.load(:pleroma) +    spec = Pleroma.Web.ApiSpec.spec(server_specific: false) |> Jason.encode!() +    File.write(path, spec) +  end +end diff --git a/lib/mix/tasks/pleroma/refresh_counter_cache.ex b/lib/mix/tasks/pleroma/refresh_counter_cache.ex index efcbaa3b1..66eed8657 100644 --- a/lib/mix/tasks/pleroma/refresh_counter_cache.ex +++ b/lib/mix/tasks/pleroma/refresh_counter_cache.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Mix.Tasks.Pleroma.RefreshCounterCache do diff --git a/lib/mix/tasks/pleroma/relay.ex b/lib/mix/tasks/pleroma/relay.ex index bb808ca47..01e6b4279 100644 --- a/lib/mix/tasks/pleroma/relay.ex +++ b/lib/mix/tasks/pleroma/relay.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Mix.Tasks.Pleroma.Relay do diff --git a/lib/mix/tasks/pleroma/robots_txt.ex b/lib/mix/tasks/pleroma/robots_txt.ex index 24f08180e..2ae430761 100644 --- a/lib/mix/tasks/pleroma/robots_txt.ex +++ b/lib/mix/tasks/pleroma/robots_txt.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Mix.Tasks.Pleroma.RobotsTxt do diff --git a/lib/mix/tasks/pleroma/uploads.ex b/lib/mix/tasks/pleroma/uploads.ex index c47b7531e..333e9aa8e 100644 --- a/lib/mix/tasks/pleroma/uploads.ex +++ b/lib/mix/tasks/pleroma/uploads.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Mix.Tasks.Pleroma.Uploads do diff --git a/lib/mix/tasks/pleroma/user.ex b/lib/mix/tasks/pleroma/user.ex index 20fe6c6e4..53d5fc6d9 100644 --- a/lib/mix/tasks/pleroma/user.ex +++ b/lib/mix/tasks/pleroma/user.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Mix.Tasks.Pleroma.User do @@ -74,7 +74,7 @@ defmodule Mix.Tasks.Pleroma.User do          bio: bio        } -      changeset = User.register_changeset(%User{}, params, need_confirmation: false) +      changeset = User.register_changeset(%User{}, params, is_confirmed: true)        {:ok, _user} = User.register(changeset)        shell_info("User #{nickname} created") @@ -107,21 +107,6 @@ defmodule Mix.Tasks.Pleroma.User do      end    end -  def run(["toggle_activated", nickname]) do -    start_pleroma() - -    with %User{} = user <- User.get_cached_by_nickname(nickname) do -      {:ok, user} = User.deactivate(user, !user.deactivated) - -      shell_info( -        "Activation status of #{nickname}: #{if(user.deactivated, do: "de", else: "")}activated" -      ) -    else -      _ -> -        shell_error("No user #{nickname}") -    end -  end -    def run(["reset_password", nickname]) do      start_pleroma() @@ -156,20 +141,41 @@ defmodule Mix.Tasks.Pleroma.User do      end    end +  def run(["activate", nickname]) do +    start_pleroma() + +    with %User{} = user <- User.get_cached_by_nickname(nickname), +         false <- user.is_active do +      User.set_activation(user, true) +      :timer.sleep(500) + +      shell_info("Successfully activated #{nickname}") +    else +      true -> +        shell_info("User #{nickname} already activated") + +      _ -> +        shell_error("No user #{nickname}") +    end +  end +    def run(["deactivate", nickname]) do      start_pleroma() -    with %User{} = user <- User.get_cached_by_nickname(nickname) do -      shell_info("Deactivating #{user.nickname}") -      User.deactivate(user) +    with %User{} = user <- User.get_cached_by_nickname(nickname), +         true <- user.is_active do +      User.set_activation(user, false)        :timer.sleep(500)        user = User.get_cached_by_id(user.id)        if Enum.empty?(Enum.filter(User.get_friends(user), & &1.local)) do -        shell_info("Successfully unsubscribed all local followers from #{user.nickname}") +        shell_info("Successfully deactivated #{nickname} and unsubscribed all local followers")        end      else +      false -> +        shell_info("User #{nickname} already deactivated") +        _ ->          shell_error("No user #{nickname}")      end @@ -213,7 +219,7 @@ defmodule Mix.Tasks.Pleroma.User do        user =          case Keyword.get(options, :confirmed) do            nil -> user -          value -> set_confirmed(user, value) +          value -> set_confirmation(user, value)          end        user = @@ -351,7 +357,7 @@ defmodule Mix.Tasks.Pleroma.User do      with %User{} = user <- User.get_cached_by_nickname(nickname) do        {:ok, user} = User.confirm(user) -      message = if user.confirmation_pending, do: "needs", else: "doesn't need" +      message = if !user.is_confirmed, do: "needs", else: "doesn't need"        shell_info("#{nickname} #{message} confirmation.")      else @@ -365,7 +371,7 @@ defmodule Mix.Tasks.Pleroma.User do      Pleroma.User.Query.build(%{        local: true, -      deactivated: false, +      is_active: true,        is_moderator: false,        is_admin: false,        invisible: false @@ -373,7 +379,7 @@ defmodule Mix.Tasks.Pleroma.User do      |> Pleroma.Repo.chunk_stream(500, :batches)      |> Stream.each(fn users ->        users -      |> Enum.each(fn user -> User.need_confirmation(user, false) end) +      |> Enum.each(fn user -> User.set_confirmation(user, true) end)      end)      |> Stream.run()    end @@ -383,7 +389,7 @@ defmodule Mix.Tasks.Pleroma.User do      Pleroma.User.Query.build(%{        local: true, -      deactivated: false, +      is_active: true,        is_moderator: false,        is_admin: false,        invisible: false @@ -391,7 +397,7 @@ defmodule Mix.Tasks.Pleroma.User do      |> Pleroma.Repo.chunk_stream(500, :batches)      |> Stream.each(fn users ->        users -      |> Enum.each(fn user -> User.need_confirmation(user, true) end) +      |> Enum.each(fn user -> User.set_confirmation(user, false) end)      end)      |> Stream.run()    end @@ -420,7 +426,7 @@ defmodule Mix.Tasks.Pleroma.User do          shell_info(            "#{user.nickname} moderator: #{user.is_moderator}, admin: #{user.is_admin}, locked: #{              user.is_locked -          }, deactivated: #{user.deactivated}" +          }, is_active: #{user.is_active}"          )        end)      end) @@ -454,10 +460,10 @@ defmodule Mix.Tasks.Pleroma.User do      user    end -  defp set_confirmed(user, value) do -    {:ok, user} = User.need_confirmation(user, !value) +  defp set_confirmation(user, value) do +    {:ok, user} = User.set_confirmation(user, value) -    shell_info("Confirmation pending status of #{user.nickname}: #{user.confirmation_pending}") +    shell_info("Confirmation status of #{user.nickname}: #{user.is_confirmed}")      user    end  end | 
