From 8a1dc0de92c8c99bd6216281355be829cbcfb21f Mon Sep 17 00:00:00 2001 From: Jorty Date: Thu, 28 Jun 2018 20:24:51 -0400 Subject: Refactor Mix tasks 1. Move Mix tasks into a `pleroma` namespace, to avoid collisions with dependent packages. 2. Rename and condense tasks into two `pleroma.user` and `pleroma.gen.instance` tasks for consistency with Hex and Phoenix. 3. Add additional functionality to the tasks to make them more user-friendly. Arguments with sensible defaults were demoted to flags and in the interactive `generate_config` (renamed to `pleroma.gen.instance`), flags were added to allow non-interactive use, though interactive use remains the primary interface. That task also now prompts the user for database parameters. 4. Documentation has been added to both tasks such that `mix help` now shows useful information. 5. Finally, use of IO.puts in tasks has been replaced with Mix.shell() equivalents to make the behavior more consistent with Mix tasks in other packages, and such that variables like MIX_QUIET are respected. The only exception is in `mix pleroma.user reset_password`, wherein the URL must always be printed regardless of the value of MIX_QUIET since that's its entire purpose. --- lib/mix/tasks/deactivate_user.ex | 13 -- lib/mix/tasks/fix_ap_users.ex | 28 ----- lib/mix/tasks/generate_config.ex | 39 ------ lib/mix/tasks/generate_password_reset.ex | 27 ---- lib/mix/tasks/make_moderator.ex | 30 ----- lib/mix/tasks/pleroma/gen_instance.ex | 161 ++++++++++++++++++++++++ lib/mix/tasks/pleroma/sample_config.eex | 30 +++++ lib/mix/tasks/pleroma/sample_psql.eex | 9 ++ lib/mix/tasks/pleroma/user.ex | 207 +++++++++++++++++++++++++++++++ lib/mix/tasks/register_user.ex | 22 ---- lib/mix/tasks/rm_user.ex | 13 -- lib/mix/tasks/sample_config.eex | 26 ---- lib/mix/tasks/sample_psql.eex | 9 -- lib/mix/tasks/set_locked.ex | 30 ----- 14 files changed, 407 insertions(+), 237 deletions(-) delete mode 100644 lib/mix/tasks/deactivate_user.ex delete mode 100644 lib/mix/tasks/fix_ap_users.ex delete mode 100644 lib/mix/tasks/generate_config.ex delete mode 100644 lib/mix/tasks/generate_password_reset.ex delete mode 100644 lib/mix/tasks/make_moderator.ex create mode 100644 lib/mix/tasks/pleroma/gen_instance.ex create mode 100644 lib/mix/tasks/pleroma/sample_config.eex create mode 100644 lib/mix/tasks/pleroma/sample_psql.eex create mode 100644 lib/mix/tasks/pleroma/user.ex delete mode 100644 lib/mix/tasks/register_user.ex delete mode 100644 lib/mix/tasks/rm_user.ex delete mode 100644 lib/mix/tasks/sample_config.eex delete mode 100644 lib/mix/tasks/sample_psql.eex delete mode 100644 lib/mix/tasks/set_locked.ex (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/deactivate_user.ex b/lib/mix/tasks/deactivate_user.ex deleted file mode 100644 index 96b3db6e4..000000000 --- a/lib/mix/tasks/deactivate_user.ex +++ /dev/null @@ -1,13 +0,0 @@ -defmodule Mix.Tasks.DeactivateUser do - use Mix.Task - alias Pleroma.User - - @shortdoc "Toggle deactivation status for a user" - def run([nickname]) do - Mix.Task.run("app.start") - - with user <- User.get_by_nickname(nickname) do - User.deactivate(user) - end - end -end diff --git a/lib/mix/tasks/fix_ap_users.ex b/lib/mix/tasks/fix_ap_users.ex deleted file mode 100644 index 7e970850e..000000000 --- a/lib/mix/tasks/fix_ap_users.ex +++ /dev/null @@ -1,28 +0,0 @@ -defmodule Mix.Tasks.FixApUsers do - use Mix.Task - import Ecto.Query - alias Pleroma.{Repo, User} - - @shortdoc "Grab all ap users again" - def run([]) do - Mix.Task.run("app.start") - - q = - from( - u in User, - where: fragment("? @> ?", u.info, ^%{"ap_enabled" => true}), - where: u.local == false - ) - - users = Repo.all(q) - - Enum.each(users, fn user -> - try do - IO.puts("Fetching #{user.nickname}") - Pleroma.Web.ActivityPub.Transmogrifier.upgrade_user_from_ap_id(user.ap_id, false) - rescue - e -> IO.inspect(e) - end - end) - end -end diff --git a/lib/mix/tasks/generate_config.ex b/lib/mix/tasks/generate_config.ex deleted file mode 100644 index 70a110561..000000000 --- a/lib/mix/tasks/generate_config.ex +++ /dev/null @@ -1,39 +0,0 @@ -defmodule Mix.Tasks.GenerateConfig do - use Mix.Task - - @shortdoc "Generates a new config" - def run(_) do - IO.puts("Answer a few questions to generate a new config\n") - IO.puts("--- THIS WILL OVERWRITE YOUR config/generated_config.exs! ---\n") - domain = IO.gets("What is your domain name? (e.g. pleroma.soykaf.com): ") |> String.trim() - name = IO.gets("What is the name of your instance? (e.g. Pleroma/Soykaf): ") |> String.trim() - email = IO.gets("What's your admin email address: ") |> String.trim() - - secret = :crypto.strong_rand_bytes(64) |> Base.encode64() |> binary_part(0, 64) - dbpass = :crypto.strong_rand_bytes(64) |> Base.encode64() |> binary_part(0, 64) - - resultSql = EEx.eval_file("lib/mix/tasks/sample_psql.eex", dbpass: dbpass) - - result = - EEx.eval_file( - "lib/mix/tasks/sample_config.eex", - domain: domain, - email: email, - name: name, - secret: secret, - dbpass: dbpass - ) - - IO.puts( - "\nWriting config to config/generated_config.exs.\n\nCheck it and configure your database, then copy it to either config/dev.secret.exs or config/prod.secret.exs" - ) - - File.write("config/generated_config.exs", result) - - IO.puts( - "\nWriting setup_db.psql, please run it as postgre superuser, i.e.: sudo su postgres -c 'psql -f config/setup_db.psql'" - ) - - File.write("config/setup_db.psql", resultSql) - end -end diff --git a/lib/mix/tasks/generate_password_reset.ex b/lib/mix/tasks/generate_password_reset.ex deleted file mode 100644 index 6bf640150..000000000 --- a/lib/mix/tasks/generate_password_reset.ex +++ /dev/null @@ -1,27 +0,0 @@ -defmodule Mix.Tasks.GeneratePasswordReset do - use Mix.Task - alias Pleroma.User - - @shortdoc "Generate password reset link for user" - def run([nickname]) do - Mix.Task.run("app.start") - - with %User{local: true} = user <- User.get_by_nickname(nickname), - {:ok, token} <- Pleroma.PasswordResetToken.create_token(user) do - IO.puts("Generated password reset token for #{user.nickname}") - - IO.puts( - "Url: #{ - Pleroma.Web.Router.Helpers.util_url( - Pleroma.Web.Endpoint, - :show_password_reset, - token.token - ) - }" - ) - else - _ -> - IO.puts("No local user #{nickname}") - end - end -end diff --git a/lib/mix/tasks/make_moderator.ex b/lib/mix/tasks/make_moderator.ex deleted file mode 100644 index a454a958e..000000000 --- a/lib/mix/tasks/make_moderator.ex +++ /dev/null @@ -1,30 +0,0 @@ -defmodule Mix.Tasks.SetModerator do - use Mix.Task - import Mix.Ecto - alias Pleroma.{Repo, User} - - @shortdoc "Set moderator status" - def run([nickname | rest]) do - Application.ensure_all_started(:pleroma) - - moderator = - case rest do - [moderator] -> moderator == "true" - _ -> true - end - - with %User{local: true} = user <- User.get_by_nickname(nickname) do - info = - user.info - |> Map.put("is_moderator", !!moderator) - - cng = User.info_changeset(user, %{info: info}) - {:ok, user} = User.update_and_set_cache(cng) - - IO.puts("Moderator status of #{nickname}: #{user.info["is_moderator"]}") - else - _ -> - IO.puts("No local user #{nickname}") - end - end -end diff --git a/lib/mix/tasks/pleroma/gen_instance.ex b/lib/mix/tasks/pleroma/gen_instance.ex new file mode 100644 index 000000000..94f2220b1 --- /dev/null +++ b/lib/mix/tasks/pleroma/gen_instance.ex @@ -0,0 +1,161 @@ +defmodule Mix.Tasks.Pleroma.Gen.Instance do + use Mix.Task + + @shortdoc "Generates the configuration for a new instance" + @moduledoc """ + Generates the configuration for a new instance. + + If any options are left unspecified, you will be prompted interactively. This + means the simplest invocation would be + + mix pleroma.gen.instance + + ## Options + + - `-f`, `--force` - overwrite any output files + - `-o PATH`, `--output PATH` - the output file for the generated configuration + - `--output-psql PATH` - the output file for the generated PostgreSQL setup + - `--domain DOMAIN` - the domain of your instance + - `--instance-name INSTANCE_NAME` - the name of your instance + - `--admin-email ADMIN_EMAIL` - the email address of the instance admin + - `--dbhost HOSTNAME` - the hostname of the PostgreSQL database to use + - `--dbname DBNAME` - the name of the database to use + - `--dbuser DBUSER` - the user (aka role) to use for the database connection + - `--dbpass DBPASS` - the password to use for the database connection + """ + + def run(rest) do + {options, [], []} = + OptionParser.parse( + rest, + strict: [ + force: :boolean, + output: :string, + output_psql: :string, + domain: :string, + instance_name: :string, + admin_email: :string, + dbhost: :string, + dbname: :string, + dbuser: :string, + dbpass: :string + ], + aliases: [ + o: :output, + f: :force + ] + ) + + paths = + [config_path, psql_path] = [ + Keyword.get(options, :output, "config/generated_config.exs"), + Keyword.get(options, :output_psql, "config/setup_db.psql") + ] + + will_overwrite = Enum.filter(paths, &File.exists?/1) + proceed? = Enum.empty?(will_overwrite) or Keyword.get(options, :force, false) + + unless not proceed? do + domain = + Keyword.get(options, :domain) || + Mix.shell().prompt("What domain will your instance use? (e.g. pleroma.soykaf.com)") + |> String.trim() + + name = + Keyword.get(options, :name) || + Mix.shell().prompt("What is the name of your instance? (e.g. Pleroma/Soykaf)") + |> String.trim() + + email = + Keyword.get(options, :admin_email) || + Mix.shell().prompt("What is your admin email address?") + |> String.trim() + + dbhost = + Keyword.get(options, :dbhost) || + case Mix.shell().prompt("What is the hostname of your database? [localhost]") do + "\n" -> "localhost" + dbhost -> dbhost |> String.trim() + end + + dbname = + Keyword.get(options, :dbname) || + case Mix.shell().prompt("What is the name of your database? [pleroma_dev]") do + "\n" -> "pleroma_dev" + dbname -> dbname |> String.trim() + end + + dbuser = + Keyword.get(options, :dbuser) || + case Mix.shell().prompt("What is the user used to connect to your database? [pleroma]") do + "\n" -> "pleroma" + dbuser -> dbuser |> String.trim() + end + + dbpass = + Keyword.get(options, :dbpass) || + case Mix.shell().prompt( + "What is the password used to connect to your database? [autogenerated]" + ) do + "\n" -> :crypto.strong_rand_bytes(64) |> Base.encode64() |> binary_part(0, 64) + dbpass -> dbpass |> String.trim() + end + + secret = :crypto.strong_rand_bytes(64) |> Base.encode64() |> binary_part(0, 64) + + result_config = + EEx.eval_file( + "sample_config.eex" |> Path.expand(__DIR__), + domain: domain, + email: email, + name: name, + dbhost: dbhost, + dbname: dbname, + dbuser: dbuser, + dbpass: dbpass, + version: Pleroma.Mixfile.project() |> Keyword.get(:version), + secret: secret + ) + + result_psql = + EEx.eval_file( + "sample_psql.eex" |> Path.expand(__DIR__), + dbname: dbname, + dbuser: dbuser, + dbpass: dbpass + ) + + Mix.shell().info( + "Writing config to #{config_path}. You should rename it to config/prod.secret.exs or config/dev.secret.exs." + ) + + File.write(config_path, result_config) + Mix.shell().info("Writing #{psql_path}.") + File.write(psql_path, result_psql) + + Mix.shell().info( + "\n" <> + """ + To get started: + 1. Verify the contents of the generated files. + 2. Run `sudo -u postgres psql -f #{escape_sh_path(psql_path)}`. + """ <> + if config_path in ["config/dev.secret.exs", "config/prod.secret.exs"] do + "" + else + "3. Run `mv #{escape_sh_path(config_path)} 'config/prod.secret.exs'`." + end + ) + else + Mix.shell().error( + "The task would have overwritten the following files:\n" <> + (Enum.map(paths, &"- #{&1}\n") |> Enum.join("")) <> + "Rerun with `--force` to overwrite them." + ) + end + end + + defp escape_sh_path(path) do + ~S(') <> String.replace(path, ~S('), ~S(\')) <> ~S(') + end +end diff --git a/lib/mix/tasks/pleroma/sample_config.eex b/lib/mix/tasks/pleroma/sample_config.eex new file mode 100644 index 000000000..066939981 --- /dev/null +++ b/lib/mix/tasks/pleroma/sample_config.eex @@ -0,0 +1,30 @@ +# Pleroma instance configuration + +# NOTE: This file should not be committed to a repo or otherwise made public +# without removing sensitive information. + +use Mix.Config + +config :pleroma, Pleroma.Web.Endpoint, + url: [host: "<%= domain %>", scheme: "https", port: 443], + secret_key_base: "<%= secret %>" + +config :pleroma, :instance, + name: "<%= name %>", + email: "<%= email %>", + limit: 5000, + registrations_open: true, + dedupe_media: false + +config :pleroma, :media_proxy, + enabled: false, + redirect_on_failure: true + #base_url: "https://cache.pleroma.social" + +config :pleroma, Pleroma.Repo, + adapter: Ecto.Adapters.Postgres, + username: "<%= dbuser %>", + password: "<%= dbpass %>", + database: "<%= dbname %>", + hostname: "<%= dbhost %>", + pool_size: 10 diff --git a/lib/mix/tasks/pleroma/sample_psql.eex b/lib/mix/tasks/pleroma/sample_psql.eex new file mode 100644 index 000000000..66f76752f --- /dev/null +++ b/lib/mix/tasks/pleroma/sample_psql.eex @@ -0,0 +1,9 @@ +CREATE USER <%= dbuser %> WITH ENCRYPTED PASSWORD '<%= dbpass %>' CREATEDB; +-- in case someone runs this second time accidentally +ALTER USER <%= dbuser %> WITH ENCRYPTED PASSWORD '<%= dbpass %>' CREATEDB; +CREATE DATABASE <%= dbname %>; +ALTER DATABASE <%= dbname %> OWNER TO <%= dbuser %>; +\c <%= dbname %>; +--Extensions made by ecto.migrate that need superuser access +CREATE EXTENSION IF NOT EXISTS citext; +CREATE EXTENSION IF NOT EXISTS pg_trgm; diff --git a/lib/mix/tasks/pleroma/user.ex b/lib/mix/tasks/pleroma/user.ex new file mode 100644 index 000000000..c20fecaa1 --- /dev/null +++ b/lib/mix/tasks/pleroma/user.ex @@ -0,0 +1,207 @@ +defmodule Mix.Tasks.Pleroma.User do + use Mix.Task + alias Pleroma.{Repo, User} + + @shortdoc "Manages Pleroma users" + @moduledoc """ + Manages Pleroma users. + + ## Create a new user. + + mix pleroma.user new NICKNAME EMAIL [OPTION...] + + Options: + - `--name NAME` - the user's name (i.e., "Lain Iwakura") + - `--bio BIO` - the user's bio + - `--password PASSWORD` - the user's password + - `--moderator`/`--no-moderator` - whether the user is a moderator + + ## Delete the user's account. + + mix pleroma.user rm NICKNAME + + ## Deactivate or activate the user's account. + + mix pleroma.user toggle_activated NICKNAME + + ## Create a password reset link. + + mix pleroma.user reset_password NICKNAME + + ## Set the value of the given user's settings. + + mix pleroma.user set NICKNAME [OPTION...] + + Options: + - `--locked`/`--no-locked` - whether the user's account is locked + - `--moderator`/`--no-moderator` - whether the user is a moderator + """ + + def run(["new", nickname, email | rest]) do + {options, [], []} = + OptionParser.parse( + rest, + strict: [ + name: :string, + bio: :string, + password: :string, + moderator: :boolean + ] + ) + + name = Keyword.get(options, :name, nickname) + bio = Keyword.get(options, :bio, "") + + {password, generated_password?} = + case Keyword.get(options, :password) do + nil -> + {:crypto.strong_rand_bytes(16) |> Base.encode64(), true} + + password -> + {password, false} + end + + moderator? = Keyword.get(options, :moderator, false) + + Mix.shell().info(""" + A user will be created with the following information: + - nickname: #{nickname} + - email: #{email} + - password: #{ + if(generated_password?, do: "[generated; a reset link will be created]", else: password) + } + - name: #{name} + - bio: #{bio} + - moderator: #{if(moderator?, do: "true", else: "false")} + """) + + proceed? = Mix.shell().yes?("Continue?") + + unless not proceed? do + Mix.Task.run("app.start") + + params = + %{ + nickname: nickname, + email: email, + password: password, + password_confirmation: password, + name: name, + bio: bio + } + |> IO.inspect() + + user = User.register_changeset(%User{}, params) + Repo.insert!(user) + + Mix.shell().info("User #{nickname} created") + + if moderator? do + run(["set", nickname, "--moderator"]) + end + + if generated_password? do + run(["reset_password", nickname]) + end + else + Mix.shell().info("User will not be created.") + end + end + + def run(["rm", nickname]) do + Mix.Task.run("app.start") + + with %User{local: true} = user <- User.get_by_nickname(nickname) do + User.delete(user) + end + + Mix.shell().info("User #{nickname} deleted.") + end + + def run(["toggle_activated", nickname]) do + Mix.Task.run("app.start") + + with user <- User.get_by_nickname(nickname) do + User.deactivate(user) + end + end + + def run(["reset_password", nickname]) do + Mix.Task.run("app.start") + + with %User{local: true} = user <- User.get_by_nickname(nickname), + {:ok, token} <- Pleroma.PasswordResetToken.create_token(user) do + Mix.shell().info("Generated password reset token for #{user.nickname}") + + IO.puts( + "URL: #{ + Pleroma.Web.Router.Helpers.util_url( + Pleroma.Web.Endpoint, + :show_password_reset, + token.token + ) + }" + ) + else + _ -> + Mix.shell().error("No local user #{nickname}") + end + end + + def run(["set", nickname | rest]) do + {options, [], []} = + OptionParser.parse( + rest, + strict: [ + moderator: :boolean, + locked: :boolean + ] + ) + + case Keyword.get(options, :moderator) do + nil -> nil + value -> set_moderator(nickname, value) + end + + case Keyword.get(options, :locked) do + nil -> nil + value -> set_locked(nickname, value) + end + end + + defp set_moderator(nickname, value) do + Application.ensure_all_started(:pleroma) + + with %User{local: true} = user <- User.get_by_nickname(nickname) do + info = + user.info + |> Map.put("is_moderator", value) + + cng = User.info_changeset(user, %{info: info}) + {:ok, user} = User.update_and_set_cache(cng) + + Mix.shell().info("Moderator status of #{nickname}: #{user.info["is_moderator"]}") + else + _ -> + Mix.shell().error("No local user #{nickname}") + end + end + + defp set_locked(nickname, value) do + Mix.Ecto.ensure_started(Repo, []) + + with %User{local: true} = user <- User.get_by_nickname(nickname) do + info = + user.info + |> Map.put("locked", value) + + cng = User.info_changeset(user, %{info: info}) + user = Repo.update!(cng) + + IO.puts("Locked status of #{nickname}: #{user.info["locked"]}") + else + _ -> + IO.puts("No local user #{nickname}") + end + end +end diff --git a/lib/mix/tasks/register_user.ex b/lib/mix/tasks/register_user.ex deleted file mode 100644 index e74721c49..000000000 --- a/lib/mix/tasks/register_user.ex +++ /dev/null @@ -1,22 +0,0 @@ -defmodule Mix.Tasks.RegisterUser do - use Mix.Task - alias Pleroma.{Repo, User} - - @shortdoc "Register user" - def run([name, nickname, email, bio, password]) do - Mix.Task.run("app.start") - - params = %{ - name: name, - nickname: nickname, - email: email, - password: password, - password_confirmation: password, - bio: bio - } - - user = User.register_changeset(%User{}, params) - - Repo.insert!(user) - end -end diff --git a/lib/mix/tasks/rm_user.ex b/lib/mix/tasks/rm_user.ex deleted file mode 100644 index 27521b745..000000000 --- a/lib/mix/tasks/rm_user.ex +++ /dev/null @@ -1,13 +0,0 @@ -defmodule Mix.Tasks.RmUser do - use Mix.Task - alias Pleroma.User - - @shortdoc "Permanently delete a user" - def run([nickname]) do - Mix.Task.run("app.start") - - with %User{local: true} = user <- User.get_by_nickname(nickname) do - User.delete(user) - end - end -end diff --git a/lib/mix/tasks/sample_config.eex b/lib/mix/tasks/sample_config.eex deleted file mode 100644 index 6db36fa09..000000000 --- a/lib/mix/tasks/sample_config.eex +++ /dev/null @@ -1,26 +0,0 @@ -use Mix.Config - -config :pleroma, Pleroma.Web.Endpoint, - url: [host: "<%= domain %>", scheme: "https", port: 443], - secret_key_base: "<%= secret %>" - -config :pleroma, :instance, - name: "<%= name %>", - email: "<%= email %>", - limit: 5000, - registrations_open: true, - dedupe_media: false - -config :pleroma, :media_proxy, - enabled: false, - redirect_on_failure: true - #base_url: "https://cache.pleroma.social" - -# Configure your database -config :pleroma, Pleroma.Repo, - adapter: Ecto.Adapters.Postgres, - username: "pleroma", - password: "<%= dbpass %>", - database: "pleroma_dev", - hostname: "localhost", - pool_size: 10 diff --git a/lib/mix/tasks/sample_psql.eex b/lib/mix/tasks/sample_psql.eex deleted file mode 100644 index bc22f166c..000000000 --- a/lib/mix/tasks/sample_psql.eex +++ /dev/null @@ -1,9 +0,0 @@ -CREATE USER pleroma WITH ENCRYPTED PASSWORD '<%= dbpass %>' CREATEDB; --- in case someone runs this second time accidentally -ALTER USER pleroma WITH ENCRYPTED PASSWORD '<%= dbpass %>' CREATEDB; -CREATE DATABASE pleroma_dev; -ALTER DATABASE pleroma_dev OWNER TO pleroma; -\c pleroma_dev; ---Extensions made by ecto.migrate that need superuser access -CREATE EXTENSION IF NOT EXISTS citext; -CREATE EXTENSION IF NOT EXISTS pg_trgm; diff --git a/lib/mix/tasks/set_locked.ex b/lib/mix/tasks/set_locked.ex deleted file mode 100644 index 2b3b18b09..000000000 --- a/lib/mix/tasks/set_locked.ex +++ /dev/null @@ -1,30 +0,0 @@ -defmodule Mix.Tasks.SetLocked do - use Mix.Task - import Mix.Ecto - alias Pleroma.{Repo, User} - - @shortdoc "Set locked status" - def run([nickname | rest]) do - ensure_started(Repo, []) - - locked = - case rest do - [locked] -> locked == "true" - _ -> true - end - - with %User{local: true} = user <- User.get_by_nickname(nickname) do - info = - user.info - |> Map.put("locked", !!locked) - - cng = User.info_changeset(user, %{info: info}) - user = Repo.update!(cng) - - IO.puts("locked status of #{nickname}: #{user.info["locked"]}") - else - _ -> - IO.puts("No local user #{nickname}") - end - end -end -- cgit v1.2.3 From ba6e3eba33f16bdd2fede086d5fb5c86201cb57b Mon Sep 17 00:00:00 2001 From: Jorty Date: Thu, 23 Aug 2018 12:37:20 -0400 Subject: Move invite task to pleroma namespace Some other minor changes were made to make it consistent with the behavior of other tasks both within Pleroma and the conventions set by dependencies such as Phoenix. Namely, the task is named `gen.invite` and `IO.puts` has been replaced with references to `Mix.shell()` where appropriate. --- lib/mix/tasks/generate_invite_token.ex | 25 ------------------------- lib/mix/tasks/pleroma/gen_invite.ex | 24 ++++++++++++++++++++++++ 2 files changed, 24 insertions(+), 25 deletions(-) delete mode 100644 lib/mix/tasks/generate_invite_token.ex create mode 100644 lib/mix/tasks/pleroma/gen_invite.ex (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/generate_invite_token.ex b/lib/mix/tasks/generate_invite_token.ex deleted file mode 100644 index c4daa9a6c..000000000 --- a/lib/mix/tasks/generate_invite_token.ex +++ /dev/null @@ -1,25 +0,0 @@ -defmodule Mix.Tasks.GenerateInviteToken do - use Mix.Task - - @shortdoc "Generate invite token for user" - def run([]) do - Mix.Task.run("app.start") - - with {:ok, token} <- Pleroma.UserInviteToken.create_token() do - IO.puts("Generated user invite token") - - IO.puts( - "Url: #{ - Pleroma.Web.Router.Helpers.redirect_url( - Pleroma.Web.Endpoint, - :registration_page, - token.token - ) - }" - ) - else - _ -> - IO.puts("Error creating token") - end - end -end diff --git a/lib/mix/tasks/pleroma/gen_invite.ex b/lib/mix/tasks/pleroma/gen_invite.ex new file mode 100644 index 000000000..0aa028f1e --- /dev/null +++ b/lib/mix/tasks/pleroma/gen_invite.ex @@ -0,0 +1,24 @@ +defmodule Mix.Tasks.Pleroma.Gen.Invite do + use Mix.Task + + @shortdoc "Generates a user invite token" + def run([]) do + Mix.Task.run("app.start") + + with {:ok, token} <- Pleroma.UserInviteToken.create_token() do + Mix.shell().info("Generated user invite token") + + url = + Pleroma.Web.Router.Helpers.redirect_url( + Pleroma.Web.Endpoint, + :registration_page, + token.token + ) + + IO.puts("URL: #{url}") + else + _ -> + Mix.shell().error("Could not create invite token.") + end + end +end -- cgit v1.2.3 From 5f91d6b8592f601553355e2c94832c90afe17d66 Mon Sep 17 00:00:00 2001 From: rinpatch Date: Sat, 1 Dec 2018 18:33:53 +0300 Subject: Fix toggle_deactivated to reactivate a deactivated user --- lib/mix/tasks/pleroma/user.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/user.ex b/lib/mix/tasks/pleroma/user.ex index c20fecaa1..c7c69ed01 100644 --- a/lib/mix/tasks/pleroma/user.ex +++ b/lib/mix/tasks/pleroma/user.ex @@ -122,7 +122,7 @@ defmodule Mix.Tasks.Pleroma.User do Mix.Task.run("app.start") with user <- User.get_by_nickname(nickname) do - User.deactivate(user) + User.deactivate(user, !user.info["deactivated"]) end end -- cgit v1.2.3 From 6f174cbb7100bc5ae6a0eba4e7e926704ee11dc3 Mon Sep 17 00:00:00 2001 From: rinpatch Date: Sat, 1 Dec 2018 18:34:26 +0300 Subject: Delete reactivate user task --- lib/mix/tasks/reactivate_user.ex | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 lib/mix/tasks/reactivate_user.ex (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/reactivate_user.ex b/lib/mix/tasks/reactivate_user.ex deleted file mode 100644 index a30d3ac8b..000000000 --- a/lib/mix/tasks/reactivate_user.ex +++ /dev/null @@ -1,19 +0,0 @@ -defmodule Mix.Tasks.ReactivateUser do - use Mix.Task - alias Pleroma.User - - @moduledoc """ - Reactivate a user - - Usage: ``mix reactivate_user `` - - Example: ``mix reactivate_user lain`` - """ - def run([nickname]) do - Mix.Task.run("app.start") - - with user <- User.get_by_nickname(nickname) do - User.deactivate(user, false) - end - end -end -- cgit v1.2.3 From ae82852330105edb681d131fd33cf35557c8614c Mon Sep 17 00:00:00 2001 From: rinpatch Date: Sat, 1 Dec 2018 18:55:52 +0300 Subject: Move set_admin task to lib/mix/tasks/pleroma/user.ex --- lib/mix/tasks/pleroma/user.ex | 26 ++++++++++++++++++++++++++ lib/mix/tasks/set_admin.ex | 32 -------------------------------- 2 files changed, 26 insertions(+), 32 deletions(-) delete mode 100644 lib/mix/tasks/set_admin.ex (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/user.ex b/lib/mix/tasks/pleroma/user.ex index c7c69ed01..9aa569b2a 100644 --- a/lib/mix/tasks/pleroma/user.ex +++ b/lib/mix/tasks/pleroma/user.ex @@ -15,6 +15,7 @@ defmodule Mix.Tasks.Pleroma.User do - `--bio BIO` - the user's bio - `--password PASSWORD` - the user's password - `--moderator`/`--no-moderator` - whether the user is a moderator + - `--admin`/`--no-admin` - whether the user is an admin ## Delete the user's account. @@ -35,6 +36,7 @@ defmodule Mix.Tasks.Pleroma.User do Options: - `--locked`/`--no-locked` - whether the user's account is locked - `--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 @@ -154,6 +156,7 @@ defmodule Mix.Tasks.Pleroma.User do rest, strict: [ moderator: :boolean, + admin: :boolean, locked: :boolean ] ) @@ -167,6 +170,11 @@ defmodule Mix.Tasks.Pleroma.User do nil -> nil value -> set_locked(nickname, value) end + + case Keyword.get(options, :admin) do + nil -> nil + value -> set_admin(nickname, value) + end end defp set_moderator(nickname, value) do @@ -187,6 +195,24 @@ defmodule Mix.Tasks.Pleroma.User do end end + defp set_admin(nickname, value) do + Application.ensure_all_started(:pleroma) + + with %User{local: true} = user <- User.get_by_nickname(nickname) do + info = + user.info + |> Map.put("is_admin", value) + + cng = User.info_changeset(user, %{info: info}) + {:ok, user} = User.update_and_set_cache(cng) + + Mix.shell().info("Admin status of #{nickname}: #{user.info["is_admin"]}") + else + _ -> + Mix.shell().error("No local user #{nickname}") + end + end + defp set_locked(nickname, value) do Mix.Ecto.ensure_started(Repo, []) diff --git a/lib/mix/tasks/set_admin.ex b/lib/mix/tasks/set_admin.ex deleted file mode 100644 index d5ccf261b..000000000 --- a/lib/mix/tasks/set_admin.ex +++ /dev/null @@ -1,32 +0,0 @@ -defmodule Mix.Tasks.SetAdmin do - use Mix.Task - alias Pleroma.User - - @doc """ - Sets admin status - Usage: set_admin nickname [true|false] - """ - def run([nickname | rest]) do - Application.ensure_all_started(:pleroma) - - status = - case rest do - [status] -> status == "true" - _ -> true - end - - with %User{local: true} = user <- User.get_by_nickname(nickname) do - info = - user.info - |> Map.put("is_admin", !!status) - - cng = User.info_changeset(user, %{info: info}) - {:ok, user} = User.update_and_set_cache(cng) - - IO.puts("Admin status of #{nickname}: #{user.info["is_admin"]}") - else - _ -> - IO.puts("No local user #{nickname}") - end - end -end -- cgit v1.2.3 From a8ef6b1190aff949140e0c79603d833668647a31 Mon Sep 17 00:00:00 2001 From: Rin Toshaka Date: Sun, 2 Dec 2018 09:36:31 +0100 Subject: Add admin option to pleroma.user new. Add user existence checking to toggle_activated --- lib/mix/tasks/pleroma/user.ex | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/user.ex b/lib/mix/tasks/pleroma/user.ex index 9aa569b2a..40d920866 100644 --- a/lib/mix/tasks/pleroma/user.ex +++ b/lib/mix/tasks/pleroma/user.ex @@ -47,7 +47,8 @@ defmodule Mix.Tasks.Pleroma.User do name: :string, bio: :string, password: :string, - moderator: :boolean + moderator: :boolean, + admin: :boolean ] ) @@ -64,6 +65,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,6 +77,7 @@ 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?") @@ -102,9 +105,14 @@ 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 + else Mix.shell().info("User will not be created.") end @@ -115,16 +123,22 @@ defmodule Mix.Tasks.Pleroma.User do 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") - with user <- User.get_by_nickname(nickname) do + with %User{local: true} = 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 local user #{nickname}") end end -- cgit v1.2.3 From 31b3ac05accd3bc56f6663fad554ad67baf0c549 Mon Sep 17 00:00:00 2001 From: Rin Toshaka Date: Sun, 2 Dec 2018 10:01:17 +0100 Subject: Lint fix --- lib/mix/tasks/pleroma/user.ex | 1 - 1 file changed, 1 deletion(-) (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/user.ex b/lib/mix/tasks/pleroma/user.ex index 40d920866..d7a6be844 100644 --- a/lib/mix/tasks/pleroma/user.ex +++ b/lib/mix/tasks/pleroma/user.ex @@ -112,7 +112,6 @@ defmodule Mix.Tasks.Pleroma.User do if generated_password? do run(["reset_password", nickname]) end - else Mix.shell().info("User will not be created.") end -- cgit v1.2.3 From 7983b0bdfe40c88d159af2f0562d96e8812c31e3 Mon Sep 17 00:00:00 2001 From: Rin Toshaka Date: Sun, 2 Dec 2018 18:05:59 +0100 Subject: Move unsubscribe user task to pleroma/user.ex. Delete unsubscribe_user.ex. Fix pleroma.user toggle_activated to work not only on local users. --- lib/mix/tasks/pleroma/user.ex | 33 +++++++++++++++++++++++++++++++-- lib/mix/tasks/unsubscribe_user.ex | 38 -------------------------------------- 2 files changed, 31 insertions(+), 40 deletions(-) delete mode 100644 lib/mix/tasks/unsubscribe_user.ex (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/user.ex b/lib/mix/tasks/pleroma/user.ex index d7a6be844..d7e172994 100644 --- a/lib/mix/tasks/pleroma/user.ex +++ b/lib/mix/tasks/pleroma/user.ex @@ -132,12 +132,12 @@ defmodule Mix.Tasks.Pleroma.User do def run(["toggle_activated", nickname]) do Mix.Task.run("app.start") - with %User{local: true} = 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 local user #{nickname}") + Mix.shell().error("No user #{nickname}") end end @@ -163,6 +163,35 @@ defmodule Mix.Tasks.Pleroma.User do end end + def run(["unsubscribe", nickname]) do + Mix.Task.run("app.start") + + 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 {options, [], []} = OptionParser.parse( diff --git a/lib/mix/tasks/unsubscribe_user.ex b/lib/mix/tasks/unsubscribe_user.ex deleted file mode 100644 index 62ea61a5c..000000000 --- a/lib/mix/tasks/unsubscribe_user.ex +++ /dev/null @@ -1,38 +0,0 @@ -defmodule Mix.Tasks.UnsubscribeUser do - use Mix.Task - alias Pleroma.{User, Repo} - require Logger - - @moduledoc """ - Deactivate and Unsubscribe local users from a user - - Usage: ``mix unsubscribe_user `` - - Example: ``mix unsubscribe_user lain`` - """ - def run([nickname]) do - Mix.Task.run("app.start") - - with %User{} = user <- User.get_by_nickname(nickname) do - Logger.info("Deactivating #{user.nickname}") - User.deactivate(user) - - {:ok, friends} = User.get_friends(user) - - Enum.each(friends, fn friend -> - user = Repo.get(User, user.id) - - Logger.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 - Logger.info("Successfully unsubscribed all followers from #{user.nickname}") - end - end - end -end -- cgit v1.2.3 From faf1f2b304d8b2a7e26856e767002f3fcf46d67c Mon Sep 17 00:00:00 2001 From: Rin Toshaka Date: Sun, 2 Dec 2018 19:18:06 +0100 Subject: Move gen.instance to instance.ex --- lib/mix/tasks/pleroma/gen_instance.ex | 161 --------------------------------- lib/mix/tasks/pleroma/instance.ex | 164 ++++++++++++++++++++++++++++++++++ 2 files changed, 164 insertions(+), 161 deletions(-) delete mode 100644 lib/mix/tasks/pleroma/gen_instance.ex create mode 100644 lib/mix/tasks/pleroma/instance.ex (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/gen_instance.ex b/lib/mix/tasks/pleroma/gen_instance.ex deleted file mode 100644 index 94f2220b1..000000000 --- a/lib/mix/tasks/pleroma/gen_instance.ex +++ /dev/null @@ -1,161 +0,0 @@ -defmodule Mix.Tasks.Pleroma.Gen.Instance do - use Mix.Task - - @shortdoc "Generates the configuration for a new instance" - @moduledoc """ - Generates the configuration for a new instance. - - If any options are left unspecified, you will be prompted interactively. This - means the simplest invocation would be - - mix pleroma.gen.instance - - ## Options - - - `-f`, `--force` - overwrite any output files - - `-o PATH`, `--output PATH` - the output file for the generated configuration - - `--output-psql PATH` - the output file for the generated PostgreSQL setup - - `--domain DOMAIN` - the domain of your instance - - `--instance-name INSTANCE_NAME` - the name of your instance - - `--admin-email ADMIN_EMAIL` - the email address of the instance admin - - `--dbhost HOSTNAME` - the hostname of the PostgreSQL database to use - - `--dbname DBNAME` - the name of the database to use - - `--dbuser DBUSER` - the user (aka role) to use for the database connection - - `--dbpass DBPASS` - the password to use for the database connection - """ - - def run(rest) do - {options, [], []} = - OptionParser.parse( - rest, - strict: [ - force: :boolean, - output: :string, - output_psql: :string, - domain: :string, - instance_name: :string, - admin_email: :string, - dbhost: :string, - dbname: :string, - dbuser: :string, - dbpass: :string - ], - aliases: [ - o: :output, - f: :force - ] - ) - - paths = - [config_path, psql_path] = [ - Keyword.get(options, :output, "config/generated_config.exs"), - Keyword.get(options, :output_psql, "config/setup_db.psql") - ] - - will_overwrite = Enum.filter(paths, &File.exists?/1) - proceed? = Enum.empty?(will_overwrite) or Keyword.get(options, :force, false) - - unless not proceed? do - domain = - Keyword.get(options, :domain) || - Mix.shell().prompt("What domain will your instance use? (e.g. pleroma.soykaf.com)") - |> String.trim() - - name = - Keyword.get(options, :name) || - Mix.shell().prompt("What is the name of your instance? (e.g. Pleroma/Soykaf)") - |> String.trim() - - email = - Keyword.get(options, :admin_email) || - Mix.shell().prompt("What is your admin email address?") - |> String.trim() - - dbhost = - Keyword.get(options, :dbhost) || - case Mix.shell().prompt("What is the hostname of your database? [localhost]") do - "\n" -> "localhost" - dbhost -> dbhost |> String.trim() - end - - dbname = - Keyword.get(options, :dbname) || - case Mix.shell().prompt("What is the name of your database? [pleroma_dev]") do - "\n" -> "pleroma_dev" - dbname -> dbname |> String.trim() - end - - dbuser = - Keyword.get(options, :dbuser) || - case Mix.shell().prompt("What is the user used to connect to your database? [pleroma]") do - "\n" -> "pleroma" - dbuser -> dbuser |> String.trim() - end - - dbpass = - Keyword.get(options, :dbpass) || - case Mix.shell().prompt( - "What is the password used to connect to your database? [autogenerated]" - ) do - "\n" -> :crypto.strong_rand_bytes(64) |> Base.encode64() |> binary_part(0, 64) - dbpass -> dbpass |> String.trim() - end - - secret = :crypto.strong_rand_bytes(64) |> Base.encode64() |> binary_part(0, 64) - - result_config = - EEx.eval_file( - "sample_config.eex" |> Path.expand(__DIR__), - domain: domain, - email: email, - name: name, - dbhost: dbhost, - dbname: dbname, - dbuser: dbuser, - dbpass: dbpass, - version: Pleroma.Mixfile.project() |> Keyword.get(:version), - secret: secret - ) - - result_psql = - EEx.eval_file( - "sample_psql.eex" |> Path.expand(__DIR__), - dbname: dbname, - dbuser: dbuser, - dbpass: dbpass - ) - - Mix.shell().info( - "Writing config to #{config_path}. You should rename it to config/prod.secret.exs or config/dev.secret.exs." - ) - - File.write(config_path, result_config) - Mix.shell().info("Writing #{psql_path}.") - File.write(psql_path, result_psql) - - Mix.shell().info( - "\n" <> - """ - To get started: - 1. Verify the contents of the generated files. - 2. Run `sudo -u postgres psql -f #{escape_sh_path(psql_path)}`. - """ <> - if config_path in ["config/dev.secret.exs", "config/prod.secret.exs"] do - "" - else - "3. Run `mv #{escape_sh_path(config_path)} 'config/prod.secret.exs'`." - end - ) - else - Mix.shell().error( - "The task would have overwritten the following files:\n" <> - (Enum.map(paths, &"- #{&1}\n") |> Enum.join("")) <> - "Rerun with `--force` to overwrite them." - ) - end - end - - defp escape_sh_path(path) do - ~S(') <> String.replace(path, ~S('), ~S(\')) <> ~S(') - end -end diff --git a/lib/mix/tasks/pleroma/instance.ex b/lib/mix/tasks/pleroma/instance.ex new file mode 100644 index 000000000..639893985 --- /dev/null +++ b/lib/mix/tasks/pleroma/instance.ex @@ -0,0 +1,164 @@ +defmodule Mix.Tasks.Pleroma.Instance do + use Mix.Task + alias Pleroma.{Repo, User} + + @shortdoc "Manages Pleroma instance" + @moduledoc """ + Manages Pleroma instance. + + ## Generate a new instance. + + mix pleroma.instance new [OPTION...] + + If any options are left unspecified, you will be prompted interactively + + ## Options + + - `-f`, `--force` - overwrite any output files + - `-o PATH`, `--output PATH` - the output file for the generated configuration + - `--output-psql PATH` - the output file for the generated PostgreSQL setup + - `--domain DOMAIN` - the domain of your instance + - `--instance-name INSTANCE_NAME` - the name of your instance + - `--admin-email ADMIN_EMAIL` - the email address of the instance admin + - `--dbhost HOSTNAME` - the hostname of the PostgreSQL database to use + - `--dbname DBNAME` - the name of the database to use + - `--dbuser DBUSER` - the user (aka role) to use for the database connection + - `--dbpass DBPASS` - the password to use for the database connection + """ + + def run(["new" | rest]) do + {options, [], []} = + OptionParser.parse( + rest, + strict: [ + force: :boolean, + output: :string, + output_psql: :string, + domain: :string, + instance_name: :string, + admin_email: :string, + dbhost: :string, + dbname: :string, + dbuser: :string, + dbpass: :string + ], + aliases: [ + o: :output, + f: :force + ] + ) + + paths = + [config_path, psql_path] = [ + Keyword.get(options, :output, "config/generated_config.exs"), + Keyword.get(options, :output_psql, "config/setup_db.psql") + ] + + will_overwrite = Enum.filter(paths, &File.exists?/1) + proceed? = Enum.empty?(will_overwrite) or Keyword.get(options, :force, false) + + unless not proceed? do + domain = + Keyword.get(options, :domain) || + Mix.shell().prompt("What domain will your instance use? (e.g. pleroma.soykaf.com)") + |> String.trim() + + name = + Keyword.get(options, :name) || + Mix.shell().prompt("What is the name of your instance? (e.g. Pleroma/Soykaf)") + |> String.trim() + + email = + Keyword.get(options, :admin_email) || + Mix.shell().prompt("What is your admin email address?") + |> String.trim() + + dbhost = + Keyword.get(options, :dbhost) || + case Mix.shell().prompt("What is the hostname of your database? [localhost]") do + "\n" -> "localhost" + dbhost -> dbhost |> String.trim() + end + + dbname = + Keyword.get(options, :dbname) || + case Mix.shell().prompt("What is the name of your database? [pleroma_dev]") do + "\n" -> "pleroma_dev" + dbname -> dbname |> String.trim() + end + + dbuser = + Keyword.get(options, :dbuser) || + case Mix.shell().prompt("What is the user used to connect to your database? [pleroma]") do + "\n" -> "pleroma" + dbuser -> dbuser |> String.trim() + end + + dbpass = + Keyword.get(options, :dbpass) || + case Mix.shell().prompt( + "What is the password used to connect to your database? [autogenerated]" + ) do + "\n" -> :crypto.strong_rand_bytes(64) |> Base.encode64() |> binary_part(0, 64) + dbpass -> dbpass |> String.trim() + end + + secret = :crypto.strong_rand_bytes(64) |> Base.encode64() |> binary_part(0, 64) + + result_config = + EEx.eval_file( + "sample_config.eex" |> Path.expand(__DIR__), + domain: domain, + email: email, + name: name, + dbhost: dbhost, + dbname: dbname, + dbuser: dbuser, + dbpass: dbpass, + version: Pleroma.Mixfile.project() |> Keyword.get(:version), + secret: secret + ) + + result_psql = + EEx.eval_file( + "sample_psql.eex" |> Path.expand(__DIR__), + dbname: dbname, + dbuser: dbuser, + dbpass: dbpass + ) + + Mix.shell().info( + "Writing config to #{config_path}. You should rename it to config/prod.secret.exs or config/dev.secret.exs." + ) + + File.write(config_path, result_config) + Mix.shell().info("Writing #{psql_path}.") + File.write(psql_path, result_psql) + + Mix.shell().info( + "\n" <> + """ + To get started: + 1. Verify the contents of the generated files. + 2. Run `sudo -u postgres psql -f #{escape_sh_path(psql_path)}`. + """ <> + if config_path in ["config/dev.secret.exs", "config/prod.secret.exs"] do + "" + else + "3. Run `mv #{escape_sh_path(config_path)} 'config/prod.secret.exs'`." + end + ) + else + Mix.shell().error( + "The task would have overwritten the following files:\n" <> + (Enum.map(paths, &"- #{&1}\n") |> Enum.join("")) <> + "Rerun with `--force` to overwrite them." + ) + end + end + + defp escape_sh_path(path) do + ~S(') <> String.replace(path, ~S('), ~S(\')) <> ~S(') + end +end + -- cgit v1.2.3 From cbe22deb510317bca811cc2df30d5cd7e892e4b5 Mon Sep 17 00:00:00 2001 From: Rin Toshaka Date: Sun, 2 Dec 2018 19:20:50 +0100 Subject: Lint fix --- lib/mix/tasks/pleroma/instance.ex | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/instance.ex b/lib/mix/tasks/pleroma/instance.ex index 639893985..8c728625a 100644 --- a/lib/mix/tasks/pleroma/instance.ex +++ b/lib/mix/tasks/pleroma/instance.ex @@ -7,7 +7,7 @@ defmodule Mix.Tasks.Pleroma.Instance do Manages Pleroma instance. ## Generate a new instance. - + mix pleroma.instance new [OPTION...] If any options are left unspecified, you will be prompted interactively @@ -161,4 +161,3 @@ defmodule Mix.Tasks.Pleroma.Instance do ~S(') <> String.replace(path, ~S('), ~S(\')) <> ~S(') end end - -- cgit v1.2.3 From d924b6cd3da7ad96c522f9de45eb8f7453e0f53a Mon Sep 17 00:00:00 2001 From: Rin Toshaka Date: Sun, 2 Dec 2018 20:04:33 +0100 Subject: Refactor copypasta to a private function in instance.ex --- lib/mix/tasks/pleroma/instance.ex | 74 ++++++++++++++++++++------------------- 1 file changed, 38 insertions(+), 36 deletions(-) (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/instance.ex b/lib/mix/tasks/pleroma/instance.ex index 8c728625a..b3e0f99df 100644 --- a/lib/mix/tasks/pleroma/instance.ex +++ b/lib/mix/tasks/pleroma/instance.ex @@ -59,49 +59,37 @@ defmodule Mix.Tasks.Pleroma.Instance do unless not proceed? do domain = - Keyword.get(options, :domain) || - Mix.shell().prompt("What domain will your instance use? (e.g. pleroma.soykaf.com)") - |> String.trim() + get_option( + options, + :domain, + "What domain will your instance use? (e.g pleroma.soykaf.com)" + ) name = - Keyword.get(options, :name) || - Mix.shell().prompt("What is the name of your instance? (e.g. Pleroma/Soykaf)") - |> String.trim() - - email = - Keyword.get(options, :admin_email) || - Mix.shell().prompt("What is your admin email address?") - |> String.trim() - - dbhost = - Keyword.get(options, :dbhost) || - case Mix.shell().prompt("What is the hostname of your database? [localhost]") do - "\n" -> "localhost" - dbhost -> dbhost |> String.trim() - end + get_option(options, :name, "What is the name of your instance? (e.g. Pleroma/Soykaf)") - dbname = - Keyword.get(options, :dbname) || - case Mix.shell().prompt("What is the name of your database? [pleroma_dev]") do - "\n" -> "pleroma_dev" - dbname -> dbname |> String.trim() - end + email = get_option(options, :admin_email, "What is your admin email address?") + + dbhost = get_option(options, :dbhost, "What is the hostname of your database?", "localhost") + + dbname = get_option(options, :dbname, "What is the name of your database?", "pleroma_dev") dbuser = - Keyword.get(options, :dbuser) || - case Mix.shell().prompt("What is the user used to connect to your database? [pleroma]") do - "\n" -> "pleroma" - dbuser -> dbuser |> String.trim() - end + get_option( + options, + :dbuser, + "What is the user used to connect to your database?", + "pleroma" + ) dbpass = - Keyword.get(options, :dbpass) || - case Mix.shell().prompt( - "What is the password used to connect to your database? [autogenerated]" - ) do - "\n" -> :crypto.strong_rand_bytes(64) |> Base.encode64() |> binary_part(0, 64) - dbpass -> dbpass |> String.trim() - end + get_option( + options, + :dbpass, + "What is the password used to connect to your database?", + :crypto.strong_rand_bytes(64) |> Base.encode64() |> binary_part(0, 64), + "autogenerated" + ) secret = :crypto.strong_rand_bytes(64) |> Base.encode64() |> binary_part(0, 64) @@ -160,4 +148,18 @@ defmodule Mix.Tasks.Pleroma.Instance do defp escape_sh_path(path) do ~S(') <> String.replace(path, ~S('), ~S(\')) <> ~S(') end + + defp get_option(options, opt, prompt, def \\ nil, defname \\ nil) do + Keyword.get(options, opt) || + case Mix.shell().prompt("#{prompt} [#{defname || def}]") do + "\n" -> + case def do + nil -> get_option(options, opt, prompt, def) + def -> def + end + + opt -> + opt |> String.trim() + end + end end -- cgit v1.2.3 From 57c71f846880083d8a78247f433713963c284ab9 Mon Sep 17 00:00:00 2001 From: Rin Toshaka Date: Sun, 2 Dec 2018 20:26:15 +0100 Subject: Move generate_invite to user.ex --- lib/mix/tasks/pleroma/gen_invite.ex | 24 ------------------------ lib/mix/tasks/pleroma/instance.ex | 3 ++- lib/mix/tasks/pleroma/user.ex | 24 ++++++++++++++++++++++++ 3 files changed, 26 insertions(+), 25 deletions(-) delete mode 100644 lib/mix/tasks/pleroma/gen_invite.ex (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/gen_invite.ex b/lib/mix/tasks/pleroma/gen_invite.ex deleted file mode 100644 index 0aa028f1e..000000000 --- a/lib/mix/tasks/pleroma/gen_invite.ex +++ /dev/null @@ -1,24 +0,0 @@ -defmodule Mix.Tasks.Pleroma.Gen.Invite do - use Mix.Task - - @shortdoc "Generates a user invite token" - def run([]) do - Mix.Task.run("app.start") - - with {:ok, token} <- Pleroma.UserInviteToken.create_token() do - Mix.shell().info("Generated user invite token") - - url = - Pleroma.Web.Router.Helpers.redirect_url( - Pleroma.Web.Endpoint, - :registration_page, - token.token - ) - - IO.puts("URL: #{url}") - else - _ -> - Mix.shell().error("Could not create invite token.") - end - end -end diff --git a/lib/mix/tasks/pleroma/instance.ex b/lib/mix/tasks/pleroma/instance.ex index b3e0f99df..05653c238 100644 --- a/lib/mix/tasks/pleroma/instance.ex +++ b/lib/mix/tasks/pleroma/instance.ex @@ -6,7 +6,7 @@ defmodule Mix.Tasks.Pleroma.Instance do @moduledoc """ Manages Pleroma instance. - ## Generate a new instance. + ## Generate a new instance config. mix pleroma.instance new [OPTION...] @@ -145,6 +145,7 @@ defmodule Mix.Tasks.Pleroma.Instance do end end + defp escape_sh_path(path) do ~S(') <> String.replace(path, ~S('), ~S(\')) <> ~S(') end diff --git a/lib/mix/tasks/pleroma/user.ex b/lib/mix/tasks/pleroma/user.ex index d7e172994..c23c5cdf3 100644 --- a/lib/mix/tasks/pleroma/user.ex +++ b/lib/mix/tasks/pleroma/user.ex @@ -16,6 +16,10 @@ defmodule Mix.Tasks.Pleroma.User do - `--password PASSWORD` - the user's password - `--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. @@ -255,6 +259,26 @@ defmodule Mix.Tasks.Pleroma.User do end end + def run(["invite"]) do + Mix.Task.run("app.start") + + with {:ok, token} <- Pleroma.UserInviteToken.create_token() do + Mix.shell().info("Generated user invite token") + + url = + Pleroma.Web.Router.Helpers.redirect_url( + Pleroma.Web.Endpoint, + :registration_page, + token.token + ) + + IO.puts(url) + else + _ -> + Mix.shell().error("Could not create invite token.") + end + + end defp set_locked(nickname, value) do Mix.Ecto.ensure_started(Repo, []) -- cgit v1.2.3 From 03b2d1016d25ab2b17a5a511249b4df59c4743fd Mon Sep 17 00:00:00 2001 From: Rin Toshaka Date: Sun, 2 Dec 2018 20:27:49 +0100 Subject: F O R M A T I N G --- lib/mix/tasks/pleroma/instance.ex | 1 - lib/mix/tasks/pleroma/user.ex | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/instance.ex b/lib/mix/tasks/pleroma/instance.ex index 05653c238..6a85880bf 100644 --- a/lib/mix/tasks/pleroma/instance.ex +++ b/lib/mix/tasks/pleroma/instance.ex @@ -145,7 +145,6 @@ defmodule Mix.Tasks.Pleroma.Instance do end end - defp escape_sh_path(path) do ~S(') <> String.replace(path, ~S('), ~S(\')) <> ~S(') end diff --git a/lib/mix/tasks/pleroma/user.ex b/lib/mix/tasks/pleroma/user.ex index c23c5cdf3..39825762d 100644 --- a/lib/mix/tasks/pleroma/user.ex +++ b/lib/mix/tasks/pleroma/user.ex @@ -16,7 +16,7 @@ defmodule Mix.Tasks.Pleroma.User do - `--password PASSWORD` - the user's password - `--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 @@ -276,9 +276,9 @@ defmodule Mix.Tasks.Pleroma.User do else _ -> Mix.shell().error("Could not create invite token.") + end end - end defp set_locked(nickname, value) do Mix.Ecto.ensure_started(Repo, []) -- cgit v1.2.3 From 6396f1b58f69b727e801df4b52a32c47da08e517 Mon Sep 17 00:00:00 2001 From: Rin Toshaka Date: Tue, 4 Dec 2018 19:00:45 +0100 Subject: change new to gen in instance.ex . Refactor user.ex --- lib/mix/tasks/pleroma/instance.ex | 4 +- lib/mix/tasks/pleroma/user.ex | 98 +++++++++++++++++---------------------- 2 files changed, 44 insertions(+), 58 deletions(-) (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/instance.ex b/lib/mix/tasks/pleroma/instance.ex index 6a85880bf..eb578644d 100644 --- a/lib/mix/tasks/pleroma/instance.ex +++ b/lib/mix/tasks/pleroma/instance.ex @@ -8,7 +8,7 @@ defmodule Mix.Tasks.Pleroma.Instance do ## Generate a new instance config. - mix pleroma.instance new [OPTION...] + mix pleroma.instance gen [OPTION...] If any options are left unspecified, you will be prompted interactively @@ -26,7 +26,7 @@ defmodule Mix.Tasks.Pleroma.Instance do - `--dbpass DBPASS` - the password to use for the database connection """ - def run(["new" | rest]) do + def run(["gen" | rest]) do {options, [], []} = OptionParser.parse( rest, diff --git a/lib/mix/tasks/pleroma/user.ex b/lib/mix/tasks/pleroma/user.ex index 39825762d..68c6bd2b6 100644 --- a/lib/mix/tasks/pleroma/user.ex +++ b/lib/mix/tasks/pleroma/user.ex @@ -197,6 +197,8 @@ defmodule Mix.Tasks.Pleroma.User do end def run(["set", nickname | rest]) do + Application.ensure_all_started(:pleroma) + {options, [], []} = OptionParser.parse( rest, @@ -207,56 +209,58 @@ defmodule Mix.Tasks.Pleroma.User do ] ) - case Keyword.get(options, :moderator) do - nil -> nil - value -> set_moderator(nickname, value) - end - - case Keyword.get(options, :locked) do - nil -> nil - value -> set_locked(nickname, value) - end - - case Keyword.get(options, :admin) do - nil -> nil - value -> set_admin(nickname, value) - end - end - - defp set_moderator(nickname, value) do - Application.ensure_all_started(:pleroma) - with %User{local: true} = user <- User.get_by_nickname(nickname) do - info = - user.info - |> Map.put("is_moderator", value) + case Keyword.get(options, :moderator) do + nil -> nil + value -> set_moderator(user, value) + end - cng = User.info_changeset(user, %{info: info}) - {:ok, user} = User.update_and_set_cache(cng) + case Keyword.get(options, :locked) do + nil -> nil + value -> set_locked(user, value) + end - Mix.shell().info("Moderator status of #{nickname}: #{user.info["is_moderator"]}") + 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_admin(nickname, value) do - Application.ensure_all_started(:pleroma) + defp set_moderator(user, value) do + info = + user.info + |> Map.put("is_moderator", value) - with %User{local: true} = user <- User.get_by_nickname(nickname) do - info = - user.info - |> Map.put("is_admin", value) + cng = User.info_changeset(user, %{info: info}) + {:ok, user} = User.update_and_set_cache(cng) - cng = User.info_changeset(user, %{info: info}) - {:ok, user} = User.update_and_set_cache(cng) + Mix.shell().info("Moderator status of #{user.nickname}: #{user.info["is_moderator"]}") + end - Mix.shell().info("Admin status of #{nickname}: #{user.info["is_admin"]}") - else - _ -> - Mix.shell().error("No local user #{nickname}") - end + defp set_admin(user, value) do + info = + user.info + |> Map.put("is_admin", value) + + cng = User.info_changeset(user, %{info: info}) + {:ok, user} = User.update_and_set_cache(cng) + + Mix.shell().info("Admin status of #{user.nickname}: #{user.info["is_admin"]}") + end + + defp set_locked(user, value) do + info = + user.info + |> Map.put("locked", value) + + cng = User.info_changeset(user, %{info: info}) + user = Repo.update!(cng) + + IO.puts("Locked status of #{user.nickname}: #{user.info["locked"]}") end def run(["invite"]) do @@ -278,22 +282,4 @@ defmodule Mix.Tasks.Pleroma.User do Mix.shell().error("Could not create invite token.") end end - - defp set_locked(nickname, value) do - Mix.Ecto.ensure_started(Repo, []) - - with %User{local: true} = user <- User.get_by_nickname(nickname) do - info = - user.info - |> Map.put("locked", value) - - cng = User.info_changeset(user, %{info: info}) - user = Repo.update!(cng) - - IO.puts("Locked status of #{nickname}: #{user.info["locked"]}") - else - _ -> - IO.puts("No local user #{nickname}") - end - end end -- cgit v1.2.3 From 5427d2af3a1bd9a5b571375b4aca2ccd9042b3b9 Mon Sep 17 00:00:00 2001 From: Rin Toshaka Date: Wed, 5 Dec 2018 16:41:50 +0100 Subject: Update mix tasks since User.info.info_changeset is deprecated --- lib/mix/tasks/make_moderator.ex | 14 ++++++-------- lib/mix/tasks/set_admin.ex | 17 ++++++++--------- lib/mix/tasks/set_locked.ex | 18 ++++++++---------- 3 files changed, 22 insertions(+), 27 deletions(-) (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/make_moderator.ex b/lib/mix/tasks/make_moderator.ex index 15586dc30..9ea6c45c1 100644 --- a/lib/mix/tasks/make_moderator.ex +++ b/lib/mix/tasks/make_moderator.ex @@ -8,7 +8,7 @@ defmodule Mix.Tasks.SetModerator do """ use Mix.Task - import Mix.Ecto + import Ecto.Changeset alias Pleroma.{Repo, User} def run([nickname | rest]) do @@ -21,14 +21,12 @@ defmodule Mix.Tasks.SetModerator do end with %User{local: true} = user <- User.get_by_nickname(nickname) do - info = - user.info - |> Map.put("is_moderator", !!moderator) + info_cng = User.Info.admin_api_update(user.info, %{is_moderator: !!moderator}) + user_cng = Ecto.Changeset.change(user) + |> put_embed(:info, info_cng) + {:ok, user} = User.update_and_set_cache(user_cng) - cng = User.info_changeset(user, %{info: info}) - {:ok, user} = User.update_and_set_cache(cng) - - IO.puts("Moderator status of #{nickname}: #{user.info["is_moderator"]}") + IO.puts("Moderator status of #{nickname}: #{user.info.is_moderator}") else _ -> IO.puts("No local user #{nickname}") diff --git a/lib/mix/tasks/set_admin.ex b/lib/mix/tasks/set_admin.ex index d5ccf261b..9788e49b9 100644 --- a/lib/mix/tasks/set_admin.ex +++ b/lib/mix/tasks/set_admin.ex @@ -1,5 +1,6 @@ defmodule Mix.Tasks.SetAdmin do use Mix.Task + import Ecto.Changeset alias Pleroma.User @doc """ @@ -9,21 +10,19 @@ defmodule Mix.Tasks.SetAdmin do def run([nickname | rest]) do Application.ensure_all_started(:pleroma) - status = + admin = case rest do - [status] -> status == "true" + [admin] -> admin == "true" _ -> true end with %User{local: true} = user <- User.get_by_nickname(nickname) do - info = - user.info - |> Map.put("is_admin", !!status) + info_cng = User.Info.admin_api_update(user.info, %{is_admin: !!admin}) + user_cng = Ecto.Changeset.change(user) + |> put_embed(:info, info_cng) + {:ok, user} = User.update_and_set_cache(user_cng) - cng = User.info_changeset(user, %{info: info}) - {:ok, user} = User.update_and_set_cache(cng) - - IO.puts("Admin status of #{nickname}: #{user.info["is_admin"]}") + IO.puts("Admin status of #{nickname}: #{user.info.is_admin}") else _ -> IO.puts("No local user #{nickname}") diff --git a/lib/mix/tasks/set_locked.ex b/lib/mix/tasks/set_locked.ex index a154595ca..42d978599 100644 --- a/lib/mix/tasks/set_locked.ex +++ b/lib/mix/tasks/set_locked.ex @@ -8,13 +8,13 @@ defmodule Mix.Tasks.SetLocked do Example: ``mix set_locked lain`` """ - + use Mix.Task - import Mix.Ecto + import Ecto.Changeset alias Pleroma.{Repo, User} def run([nickname | rest]) do - ensure_started(Repo, []) + Application.ensure_all_started(:pleroma) locked = case rest do @@ -23,14 +23,12 @@ defmodule Mix.Tasks.SetLocked do end with %User{local: true} = user <- User.get_by_nickname(nickname) do - info = - user.info - |> Map.put("locked", !!locked) - - cng = User.info_changeset(user, %{info: info}) - user = Repo.update!(cng) + info_cng = User.Info.profile_update(user.info, %{locked: !!locked}) + user_cng = Ecto.Changeset.change(user) + |> put_embed(:info, info_cng) + {:ok, user} = User.update_and_set_cache(user_cng) - IO.puts("locked status of #{nickname}: #{user.info["locked"]}") + IO.puts("Locked status of #{nickname}: #{user.info.locked}") else _ -> IO.puts("No local user #{nickname}") -- cgit v1.2.3 From c3519132dfdcd5f59c0ebe99fa8ab4b764ac4982 Mon Sep 17 00:00:00 2001 From: Rin Toshaka Date: Wed, 5 Dec 2018 16:44:15 +0100 Subject: Sorry --- lib/mix/tasks/make_moderator.ex | 7 +++++-- lib/mix/tasks/set_admin.ex | 7 +++++-- lib/mix/tasks/set_locked.ex | 9 ++++++--- 3 files changed, 16 insertions(+), 7 deletions(-) (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/make_moderator.ex b/lib/mix/tasks/make_moderator.ex index 9ea6c45c1..8dc0a04dd 100644 --- a/lib/mix/tasks/make_moderator.ex +++ b/lib/mix/tasks/make_moderator.ex @@ -22,8 +22,11 @@ defmodule Mix.Tasks.SetModerator do with %User{local: true} = user <- User.get_by_nickname(nickname) do info_cng = User.Info.admin_api_update(user.info, %{is_moderator: !!moderator}) - user_cng = Ecto.Changeset.change(user) - |> put_embed(:info, info_cng) + + user_cng = + Ecto.Changeset.change(user) + |> put_embed(:info, info_cng) + {:ok, user} = User.update_and_set_cache(user_cng) IO.puts("Moderator status of #{nickname}: #{user.info.is_moderator}") diff --git a/lib/mix/tasks/set_admin.ex b/lib/mix/tasks/set_admin.ex index 9788e49b9..ac26516f1 100644 --- a/lib/mix/tasks/set_admin.ex +++ b/lib/mix/tasks/set_admin.ex @@ -18,8 +18,11 @@ defmodule Mix.Tasks.SetAdmin do with %User{local: true} = user <- User.get_by_nickname(nickname) do info_cng = User.Info.admin_api_update(user.info, %{is_admin: !!admin}) - user_cng = Ecto.Changeset.change(user) - |> put_embed(:info, info_cng) + + user_cng = + Ecto.Changeset.change(user) + |> put_embed(:info, info_cng) + {:ok, user} = User.update_and_set_cache(user_cng) IO.puts("Admin status of #{nickname}: #{user.info.is_admin}") diff --git a/lib/mix/tasks/set_locked.ex b/lib/mix/tasks/set_locked.ex index 42d978599..e93a63505 100644 --- a/lib/mix/tasks/set_locked.ex +++ b/lib/mix/tasks/set_locked.ex @@ -8,7 +8,7 @@ defmodule Mix.Tasks.SetLocked do Example: ``mix set_locked lain`` """ - + use Mix.Task import Ecto.Changeset alias Pleroma.{Repo, User} @@ -24,8 +24,11 @@ defmodule Mix.Tasks.SetLocked do with %User{local: true} = user <- User.get_by_nickname(nickname) do info_cng = User.Info.profile_update(user.info, %{locked: !!locked}) - user_cng = Ecto.Changeset.change(user) - |> put_embed(:info, info_cng) + + user_cng = + Ecto.Changeset.change(user) + |> put_embed(:info, info_cng) + {:ok, user} = User.update_and_set_cache(user_cng) IO.puts("Locked status of #{nickname}: #{user.info.locked}") -- cgit v1.2.3 From e8ba579efe7d9ca4be32c5aacf62be0de1ec09df Mon Sep 17 00:00:00 2001 From: Rin Toshaka Date: Wed, 5 Dec 2018 17:58:26 +0100 Subject: Switch from User.info_changeset because it is deprecated --- lib/mix/tasks/pleroma/user.ex | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/user.ex b/lib/mix/tasks/pleroma/user.ex index 68c6bd2b6..14ba60bf4 100644 --- a/lib/mix/tasks/pleroma/user.ex +++ b/lib/mix/tasks/pleroma/user.ex @@ -1,5 +1,6 @@ defmodule Mix.Tasks.Pleroma.User do use Mix.Task + import Ecto.Changeset alias Pleroma.{Repo, User} @shortdoc "Manages Pleroma users" @@ -235,10 +236,14 @@ defmodule Mix.Tasks.Pleroma.User do user.info |> Map.put("is_moderator", value) - cng = User.info_changeset(user, %{info: info}) - {:ok, user} = User.update_and_set_cache(cng) + info_cng = User.Info.admin_api_update(user.info, %{is_moderator: value}) + user_cng = + Ecto.Changeset.change(user) + |> put_embed(:info, info_cng) - Mix.shell().info("Moderator status of #{user.nickname}: #{user.info["is_moderator"]}") + {:ok, user} = User.update_and_set_cache(user_cng) + + Mix.shell().info("Moderator status of #{user.nickname}: #{user.info.is_moderator}") end defp set_admin(user, value) do @@ -246,10 +251,14 @@ defmodule Mix.Tasks.Pleroma.User do user.info |> Map.put("is_admin", value) - cng = User.info_changeset(user, %{info: info}) - {:ok, user} = User.update_and_set_cache(cng) + info_cng = User.Info.admin_api_update(user.info, %{is_admin: value}) + user_cng = + Ecto.Changeset.change(user) + |> put_embed(:info, info_cng) + + {:ok, user} = User.update_and_set_cache(user_cng) - Mix.shell().info("Admin status of #{user.nickname}: #{user.info["is_admin"]}") + Mix.shell().info("Admin status of #{user.nickname}: #{user.info.is_moderator}") end defp set_locked(user, value) do @@ -257,10 +266,14 @@ defmodule Mix.Tasks.Pleroma.User do user.info |> Map.put("locked", value) - cng = User.info_changeset(user, %{info: info}) - user = Repo.update!(cng) + info_cng = User.Info.user_upgrade(user.info, %{locked: value}) + user_cng = + Ecto.Changeset.change(user) + |> put_embed(:info, info_cng) + + {:ok, user} = User.update_and_set_cache(user_cng) - IO.puts("Locked status of #{user.nickname}: #{user.info["locked"]}") + Mix.shell().info("Locked status of #{user.nickname}: #{user.info.locked}") end def run(["invite"]) do -- cgit v1.2.3 From facfd03bc1f9ec2464fb0b78ece2c7d3162521db Mon Sep 17 00:00:00 2001 From: Rin Toshaka Date: Wed, 5 Dec 2018 18:11:59 +0100 Subject: Move relay tasks to relay.ex --- lib/mix/tasks/pleroma/relay.ex | 42 +++++++++++++++++++++++++++++++++++++++++ lib/mix/tasks/relay_follow.ex | 24 ----------------------- lib/mix/tasks/relay_unfollow.ex | 23 ---------------------- 3 files changed, 42 insertions(+), 47 deletions(-) create mode 100644 lib/mix/tasks/pleroma/relay.ex delete mode 100644 lib/mix/tasks/relay_follow.ex delete mode 100644 lib/mix/tasks/relay_unfollow.ex (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/relay.ex b/lib/mix/tasks/pleroma/relay.ex new file mode 100644 index 000000000..aa0232a32 --- /dev/null +++ b/lib/mix/tasks/pleroma/relay.ex @@ -0,0 +1,42 @@ +defmodule Mix.Tasks.Pleroma.Relay do + use Mix.Task + alias Pleroma.Web.ActivityPub.Relay + + @shortdoc "Manages remote relays" + @moduledoc """ + Manages remote relays + + ## Follow a remote relay + + ``mix pleroma.relay unfollow `` + + Example: ``mix pleroma.relay follow https://example.org/relay`` + + ## Unfollow a remote relay + + ``mix pleroma.relay unfollow `` + + Example: ``mix pleroma.relay unfollow https://example.org/relay`` + """ + def run(["follow", target]) do + Mix.Task.run("app.start") + + with {:ok, activity} <- Relay.follow(target) do + # put this task to sleep to allow the genserver to push out the messages + :timer.sleep(500) + else + {:error, e} -> Mix.shell().error("Error while following #{target}: #{inspect(e)}") + end + end + + def run(["unfollow", target]) do + Mix.Task.run("app.start") + + with {:ok, activity} <- Relay.follow(target) do + # put this task to sleep to allow the genserver to push out the messages + :timer.sleep(500) + else + {:error, e} -> Mix.shell().error("Error while following #{target}: #{inspect(e)}") + end + end +end diff --git a/lib/mix/tasks/relay_follow.ex b/lib/mix/tasks/relay_follow.ex deleted file mode 100644 index 85b1c024d..000000000 --- a/lib/mix/tasks/relay_follow.ex +++ /dev/null @@ -1,24 +0,0 @@ -defmodule Mix.Tasks.RelayFollow do - use Mix.Task - require Logger - alias Pleroma.Web.ActivityPub.Relay - - @shortdoc "Follows a remote relay" - @moduledoc """ - Follows a remote relay - - Usage: ``mix relay_follow `` - - Example: ``mix relay_follow https://example.org/relay`` - """ - def run([target]) do - Mix.Task.run("app.start") - - with {:ok, activity} <- Relay.follow(target) do - # put this task to sleep to allow the genserver to push out the messages - :timer.sleep(500) - else - {:error, e} -> Mix.shell().error("Error while following #{target}: #{inspect(e)}") - end - end -end diff --git a/lib/mix/tasks/relay_unfollow.ex b/lib/mix/tasks/relay_unfollow.ex deleted file mode 100644 index 237fb771c..000000000 --- a/lib/mix/tasks/relay_unfollow.ex +++ /dev/null @@ -1,23 +0,0 @@ -defmodule Mix.Tasks.RelayUnfollow do - use Mix.Task - require Logger - alias Pleroma.Web.ActivityPub.Relay - - @moduledoc """ - Unfollows a remote relay - - Usage: ``mix relay_follow `` - - Example: ``mix relay_follow https://example.org/relay`` - """ - def run([target]) do - Mix.Task.run("app.start") - - with {:ok, activity} <- Relay.follow(target) do - # put this task to sleep to allow the genserver to push out the messages - :timer.sleep(500) - else - {:error, e} -> Mix.shell().error("Error while following #{target}: #{inspect(e)}") - end - end -end -- cgit v1.2.3 From ffec96d8ccee6d51e3806d209ae176fb2c589beb Mon Sep 17 00:00:00 2001 From: Rin Toshaka Date: Wed, 5 Dec 2018 19:05:37 +0100 Subject: Everything should use Mix.Task.Run --- lib/mix/tasks/pleroma/user.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/user.ex b/lib/mix/tasks/pleroma/user.ex index 14ba60bf4..e2b9b6236 100644 --- a/lib/mix/tasks/pleroma/user.ex +++ b/lib/mix/tasks/pleroma/user.ex @@ -198,7 +198,7 @@ defmodule Mix.Tasks.Pleroma.User do end def run(["set", nickname | rest]) do - Application.ensure_all_started(:pleroma) + Mix.Task.run("app.start") {options, [], []} = OptionParser.parse( -- cgit v1.2.3 From dfc9c08796055c723fac11dd13eea90d340fa0ae Mon Sep 17 00:00:00 2001 From: Rin Toshaka Date: Wed, 5 Dec 2018 19:12:23 +0100 Subject: formating --- lib/mix/tasks/pleroma/relay.ex | 4 ++-- lib/mix/tasks/pleroma/user.ex | 21 ++++++++++++--------- 2 files changed, 14 insertions(+), 11 deletions(-) (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/relay.ex b/lib/mix/tasks/pleroma/relay.ex index aa0232a32..eaaded5cb 100644 --- a/lib/mix/tasks/pleroma/relay.ex +++ b/lib/mix/tasks/pleroma/relay.ex @@ -11,9 +11,9 @@ defmodule Mix.Tasks.Pleroma.Relay do ``mix pleroma.relay unfollow `` Example: ``mix pleroma.relay follow https://example.org/relay`` - + ## Unfollow a remote relay - + ``mix pleroma.relay unfollow `` Example: ``mix pleroma.relay unfollow https://example.org/relay`` diff --git a/lib/mix/tasks/pleroma/user.ex b/lib/mix/tasks/pleroma/user.ex index e2b9b6236..aa023aae8 100644 --- a/lib/mix/tasks/pleroma/user.ex +++ b/lib/mix/tasks/pleroma/user.ex @@ -237,9 +237,10 @@ defmodule Mix.Tasks.Pleroma.User do |> Map.put("is_moderator", value) info_cng = User.Info.admin_api_update(user.info, %{is_moderator: value}) - user_cng = - Ecto.Changeset.change(user) - |> put_embed(:info, info_cng) + + user_cng = + Ecto.Changeset.change(user) + |> put_embed(:info, info_cng) {:ok, user} = User.update_and_set_cache(user_cng) @@ -252,9 +253,10 @@ defmodule Mix.Tasks.Pleroma.User do |> Map.put("is_admin", value) info_cng = User.Info.admin_api_update(user.info, %{is_admin: value}) - user_cng = - Ecto.Changeset.change(user) - |> put_embed(:info, info_cng) + + user_cng = + Ecto.Changeset.change(user) + |> put_embed(:info, info_cng) {:ok, user} = User.update_and_set_cache(user_cng) @@ -267,9 +269,10 @@ defmodule Mix.Tasks.Pleroma.User do |> Map.put("locked", value) info_cng = User.Info.user_upgrade(user.info, %{locked: value}) - user_cng = - Ecto.Changeset.change(user) - |> put_embed(:info, info_cng) + + user_cng = + Ecto.Changeset.change(user) + |> put_embed(:info, info_cng) {:ok, user} = User.update_and_set_cache(user_cng) -- cgit v1.2.3 From 04a48286e69704bf83429b85dbcdb70863bdcff1 Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Thu, 6 Dec 2018 19:29:04 +0700 Subject: Add web push support --- lib/mix/tasks/generate_config.ex | 6 +++++- lib/mix/tasks/sample_config.eex | 6 ++++++ 2 files changed, 11 insertions(+), 1 deletion(-) (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/generate_config.ex b/lib/mix/tasks/generate_config.ex index 70a110561..58ce3113b 100644 --- a/lib/mix/tasks/generate_config.ex +++ b/lib/mix/tasks/generate_config.ex @@ -14,6 +14,8 @@ defmodule Mix.Tasks.GenerateConfig do resultSql = EEx.eval_file("lib/mix/tasks/sample_psql.eex", dbpass: dbpass) + {web_push_public_key, web_push_private_key} = :crypto.generate_key(:ecdh, :prime256v1) + result = EEx.eval_file( "lib/mix/tasks/sample_config.eex", @@ -21,7 +23,9 @@ defmodule Mix.Tasks.GenerateConfig do email: email, name: name, secret: secret, - dbpass: dbpass + dbpass: dbpass, + web_push_public_key: Base.url_encode64(web_push_public_key, padding: false), + web_push_private_key: Base.url_encode64(web_push_private_key, padding: false) ) IO.puts( diff --git a/lib/mix/tasks/sample_config.eex b/lib/mix/tasks/sample_config.eex index 3881ead26..f2272b10a 100644 --- a/lib/mix/tasks/sample_config.eex +++ b/lib/mix/tasks/sample_config.eex @@ -25,6 +25,12 @@ config :pleroma, Pleroma.Repo, hostname: "localhost", pool_size: 10 +# Configure web push notifications +config :web_push_encryption, :vapid_details, + subject: "mailto:<%= email %>", + public_key: "<%= web_push_public_key %>", + private_key: "<%= web_push_private_key %>" + # Configure S3 support if desired. # The public S3 endpoint is different depending on region and provider, # consult your S3 provider's documentation for details on what to use. -- cgit v1.2.3 From 3a84511df10b647f08d5ec2df789663b60646c02 Mon Sep 17 00:00:00 2001 From: Rin Toshaka Date: Thu, 6 Dec 2018 17:35:33 +0100 Subject: remove migrate_local_uploads.ex --- lib/mix/tasks/migrate_local_uploads.ex | 97 ---------------------------------- 1 file changed, 97 deletions(-) delete mode 100644 lib/mix/tasks/migrate_local_uploads.ex (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/migrate_local_uploads.ex b/lib/mix/tasks/migrate_local_uploads.ex deleted file mode 100644 index 8f9e210c0..000000000 --- a/lib/mix/tasks/migrate_local_uploads.ex +++ /dev/null @@ -1,97 +0,0 @@ -defmodule Mix.Tasks.MigrateLocalUploads do - use Mix.Task - import Mix.Ecto - alias Pleroma.{Upload, Uploaders.Local, Uploaders.S3} - require Logger - - @log_every 50 - @shortdoc "Migrate uploads from local to remote storage" - - def run([target_uploader | args]) do - delete? = Enum.member?(args, "--delete") - Application.ensure_all_started(:pleroma) - - local_path = Pleroma.Config.get!([Local, :uploads]) - uploader = Module.concat(Pleroma.Uploaders, target_uploader) - - unless Code.ensure_loaded?(uploader) do - raise("The uploader #{inspect(uploader)} is not an existing/loaded module.") - end - - target_enabled? = Pleroma.Config.get([Upload, :uploader]) == uploader - - unless target_enabled? do - Pleroma.Config.put([Upload, :uploader], uploader) - end - - Logger.info("Migrating files from local #{local_path} to #{to_string(uploader)}") - - if delete? do - Logger.warn( - "Attention: uploaded files will be deleted, hope you have backups! (--delete ; cancel with ^C)" - ) - - :timer.sleep(:timer.seconds(5)) - end - - uploads = - File.ls!(local_path) - |> Enum.map(fn id -> - root_path = Path.join(local_path, id) - - cond do - File.dir?(root_path) -> - files = for file <- File.ls!(root_path), do: {id, file, Path.join([root_path, file])} - - case List.first(files) do - {id, file, path} -> - {%Pleroma.Upload{id: id, name: file, path: id <> "/" <> file, tempfile: path}, - root_path} - - _ -> - nil - end - - File.exists?(root_path) -> - file = Path.basename(id) - [hash, ext] = String.split(id, ".") - {%Pleroma.Upload{id: hash, name: file, path: file, tempfile: root_path}, root_path} - - true -> - nil - end - end) - |> Enum.filter(& &1) - - total_count = length(uploads) - Logger.info("Found #{total_count} uploads") - - uploads - |> Task.async_stream( - fn {upload, root_path} -> - case Upload.store(upload, uploader: uploader, filters: [], size_limit: nil) do - {:ok, _} -> - if delete?, do: File.rm_rf!(root_path) - Logger.debug("uploaded: #{inspect(upload.path)} #{inspect(upload)}") - :ok - - error -> - Logger.error("failed to upload #{inspect(upload.path)}: #{inspect(error)}") - end - end, - timeout: 150_000 - ) - |> Stream.chunk_every(@log_every) - |> Enum.reduce(0, fn done, count -> - count = count + length(done) - Logger.info("Uploaded #{count}/#{total_count} files") - count - end) - - Logger.info("Done!") - end - - def run(_) do - Logger.error("Usage: migrate_local_uploads S3|Swift [--delete]") - end -end -- cgit v1.2.3 From 4a2a7ce636ac4616ec71665b4af4ee0ab884ac15 Mon Sep 17 00:00:00 2001 From: Rin Toshaka Date: Thu, 6 Dec 2018 18:00:24 +0100 Subject: Refactor common functions to common.ex --- lib/mix/tasks/pleroma/instance.ex | 34 ++++++++++------------------------ lib/mix/tasks/pleroma/relay.ex | 6 +++--- lib/mix/tasks/pleroma/user.ex | 16 ++++++++-------- 3 files changed, 21 insertions(+), 35 deletions(-) (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/instance.ex b/lib/mix/tasks/pleroma/instance.ex index eb578644d..88fc3ba75 100644 --- a/lib/mix/tasks/pleroma/instance.ex +++ b/lib/mix/tasks/pleroma/instance.ex @@ -1,6 +1,7 @@ defmodule Mix.Tasks.Pleroma.Instance do use Mix.Task alias Pleroma.{Repo, User} + alias Mix.Tasks.Pleroma.Common @shortdoc "Manages Pleroma instance" @moduledoc """ @@ -59,23 +60,23 @@ defmodule Mix.Tasks.Pleroma.Instance do unless not proceed? do domain = - get_option( + Common.get_option( options, :domain, "What domain will your instance use? (e.g pleroma.soykaf.com)" ) name = - get_option(options, :name, "What is the name of your instance? (e.g. Pleroma/Soykaf)") + Common.get_option(options, :name, "What is the name of your instance? (e.g. Pleroma/Soykaf)") - email = get_option(options, :admin_email, "What is your admin email address?") + email = Common.get_option(options, :admin_email, "What is your admin email address?") - dbhost = get_option(options, :dbhost, "What is the hostname of your database?", "localhost") + dbhost = Common.get_option(options, :dbhost, "What is the hostname of your database?", "localhost") - dbname = get_option(options, :dbname, "What is the name of your database?", "pleroma_dev") + dbname = Common.get_option(options, :dbname, "What is the name of your database?", "pleroma_dev") dbuser = - get_option( + Common.get_option( options, :dbuser, "What is the user used to connect to your database?", @@ -83,7 +84,7 @@ defmodule Mix.Tasks.Pleroma.Instance do ) dbpass = - get_option( + Common.get_option( options, :dbpass, "What is the password used to connect to your database?", @@ -128,12 +129,12 @@ defmodule Mix.Tasks.Pleroma.Instance do """ To get started: 1. Verify the contents of the generated files. - 2. Run `sudo -u postgres psql -f #{escape_sh_path(psql_path)}`. + 2. Run `sudo -u postgres psql -f #{Common.escape_sh_path(psql_path)}`. """ <> if config_path in ["config/dev.secret.exs", "config/prod.secret.exs"] do "" else - "3. Run `mv #{escape_sh_path(config_path)} 'config/prod.secret.exs'`." + "3. Run `mv #{Common.escape_sh_path(config_path)} 'config/prod.secret.exs'`." end ) else @@ -145,21 +146,6 @@ defmodule Mix.Tasks.Pleroma.Instance do end end - defp escape_sh_path(path) do - ~S(') <> String.replace(path, ~S('), ~S(\')) <> ~S(') - end - defp get_option(options, opt, prompt, def \\ nil, defname \\ nil) do - Keyword.get(options, opt) || - case Mix.shell().prompt("#{prompt} [#{defname || def}]") do - "\n" -> - case def do - nil -> get_option(options, opt, prompt, def) - def -> def - end - opt -> - opt |> String.trim() - end - end end diff --git a/lib/mix/tasks/pleroma/relay.ex b/lib/mix/tasks/pleroma/relay.ex index eaaded5cb..828c7cd3d 100644 --- a/lib/mix/tasks/pleroma/relay.ex +++ b/lib/mix/tasks/pleroma/relay.ex @@ -1,6 +1,7 @@ defmodule Mix.Tasks.Pleroma.Relay do use Mix.Task alias Pleroma.Web.ActivityPub.Relay + alias Mix.Tasks.Pleroma.Common @shortdoc "Manages remote relays" @moduledoc """ @@ -19,8 +20,7 @@ defmodule Mix.Tasks.Pleroma.Relay do Example: ``mix pleroma.relay unfollow https://example.org/relay`` """ def run(["follow", target]) do - Mix.Task.run("app.start") - + Common.start_pleroma with {:ok, activity} <- Relay.follow(target) do # put this task to sleep to allow the genserver to push out the messages :timer.sleep(500) @@ -30,7 +30,7 @@ defmodule Mix.Tasks.Pleroma.Relay do end def run(["unfollow", target]) do - Mix.Task.run("app.start") + Common.start_pleroma with {:ok, activity} <- Relay.follow(target) do # put this task to sleep to allow the genserver to push out the messages diff --git a/lib/mix/tasks/pleroma/user.ex b/lib/mix/tasks/pleroma/user.ex index aa023aae8..82f351456 100644 --- a/lib/mix/tasks/pleroma/user.ex +++ b/lib/mix/tasks/pleroma/user.ex @@ -2,6 +2,7 @@ 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 """ @@ -43,7 +44,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( @@ -88,7 +88,7 @@ defmodule Mix.Tasks.Pleroma.User do proceed? = Mix.shell().yes?("Continue?") unless not proceed? do - Mix.Task.run("app.start") + Common.start_pleroma() params = %{ @@ -123,7 +123,7 @@ 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) @@ -135,7 +135,7 @@ defmodule Mix.Tasks.Pleroma.User do end def run(["toggle_activated", nickname]) do - Mix.Task.run("app.start") + Common.start_pleroma() with %User{} = user <- User.get_by_nickname(nickname) do User.deactivate(user, !user.info["deactivated"]) @@ -147,7 +147,7 @@ defmodule Mix.Tasks.Pleroma.User do 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 @@ -169,7 +169,7 @@ defmodule Mix.Tasks.Pleroma.User do end def run(["unsubscribe", nickname]) do - Mix.Task.run("app.start") + Common.start_pleroma() with %User{} = user <- User.get_by_nickname(nickname) do Mix.shell().info("Deactivating #{user.nickname}") @@ -198,7 +198,7 @@ defmodule Mix.Tasks.Pleroma.User do end def run(["set", nickname | rest]) do - Mix.Task.run("app.start") + Common.start_pleroma() {options, [], []} = OptionParser.parse( @@ -280,7 +280,7 @@ defmodule Mix.Tasks.Pleroma.User do end def run(["invite"]) do - Mix.Task.run("app.start") + Common.start_pleroma() with {:ok, token} <- Pleroma.UserInviteToken.create_token() do Mix.shell().info("Generated user invite token") -- cgit v1.2.3 From ca7b46fb3ba576fb7e67eba02654e6df9299392a Mon Sep 17 00:00:00 2001 From: Rin Toshaka Date: Thu, 6 Dec 2018 18:01:28 +0100 Subject: Refactor common functions to common.ex --- lib/mix/tasks/pleroma/instance.ex | 15 +++++++++------ lib/mix/tasks/pleroma/relay.ex | 5 +++-- 2 files changed, 12 insertions(+), 8 deletions(-) (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/instance.ex b/lib/mix/tasks/pleroma/instance.ex index 88fc3ba75..e0ebb3f5e 100644 --- a/lib/mix/tasks/pleroma/instance.ex +++ b/lib/mix/tasks/pleroma/instance.ex @@ -67,13 +67,19 @@ defmodule Mix.Tasks.Pleroma.Instance do ) name = - Common.get_option(options, :name, "What is the name of your instance? (e.g. Pleroma/Soykaf)") + Common.get_option( + options, + :name, + "What is the name of your instance? (e.g. Pleroma/Soykaf)" + ) email = Common.get_option(options, :admin_email, "What is your admin email address?") - dbhost = Common.get_option(options, :dbhost, "What is the hostname of your database?", "localhost") + dbhost = + Common.get_option(options, :dbhost, "What is the hostname of your database?", "localhost") - dbname = Common.get_option(options, :dbname, "What is the name of your database?", "pleroma_dev") + dbname = + Common.get_option(options, :dbname, "What is the name of your database?", "pleroma_dev") dbuser = Common.get_option( @@ -145,7 +151,4 @@ defmodule Mix.Tasks.Pleroma.Instance do ) end end - - - end diff --git a/lib/mix/tasks/pleroma/relay.ex b/lib/mix/tasks/pleroma/relay.ex index 828c7cd3d..4aea52732 100644 --- a/lib/mix/tasks/pleroma/relay.ex +++ b/lib/mix/tasks/pleroma/relay.ex @@ -20,7 +20,8 @@ defmodule Mix.Tasks.Pleroma.Relay do Example: ``mix pleroma.relay unfollow https://example.org/relay`` """ def run(["follow", target]) do - Common.start_pleroma + Common.start_pleroma() + with {:ok, activity} <- Relay.follow(target) do # put this task to sleep to allow the genserver to push out the messages :timer.sleep(500) @@ -30,7 +31,7 @@ defmodule Mix.Tasks.Pleroma.Relay do end def run(["unfollow", target]) do - Common.start_pleroma + Common.start_pleroma() with {:ok, activity} <- Relay.follow(target) do # put this task to sleep to allow the genserver to push out the messages -- cgit v1.2.3 From 66313cda02d8c335a2c24c0b7ad64ba6cebc4df8 Mon Sep 17 00:00:00 2001 From: Rin Toshaka Date: Thu, 6 Dec 2018 18:16:51 +0100 Subject: Update instance.ex for web push --- lib/mix/tasks/pleroma/instance.ex | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/instance.ex b/lib/mix/tasks/pleroma/instance.ex index e0ebb3f5e..c66322707 100644 --- a/lib/mix/tasks/pleroma/instance.ex +++ b/lib/mix/tasks/pleroma/instance.ex @@ -99,6 +99,7 @@ defmodule Mix.Tasks.Pleroma.Instance do ) secret = :crypto.strong_rand_bytes(64) |> Base.encode64() |> binary_part(0, 64) + {web_push_public_key, web_push_private_key} = :crypto.generate_key(:ecdh, :prime256v1) result_config = EEx.eval_file( @@ -111,7 +112,9 @@ defmodule Mix.Tasks.Pleroma.Instance do dbuser: dbuser, dbpass: dbpass, version: Pleroma.Mixfile.project() |> Keyword.get(:version), - secret: secret + secret: secret, + web_push_public_key: Base.url_encode64(web_push_public_key, padding: false), + web_push_private_key: Base.url_encode64(web_push_private_key, padding: false) ) result_psql = -- cgit v1.2.3 From 71d5cf9ed86089bb2e5b280c462759590307b94d Mon Sep 17 00:00:00 2001 From: Rin Toshaka Date: Thu, 6 Dec 2018 18:25:39 +0100 Subject: Remove unused vars from user.ex --- lib/mix/tasks/pleroma/user.ex | 12 ------------ 1 file changed, 12 deletions(-) (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/user.ex b/lib/mix/tasks/pleroma/user.ex index 82f351456..12b5af774 100644 --- a/lib/mix/tasks/pleroma/user.ex +++ b/lib/mix/tasks/pleroma/user.ex @@ -232,10 +232,6 @@ defmodule Mix.Tasks.Pleroma.User do end defp set_moderator(user, value) do - info = - user.info - |> Map.put("is_moderator", value) - info_cng = User.Info.admin_api_update(user.info, %{is_moderator: value}) user_cng = @@ -248,10 +244,6 @@ defmodule Mix.Tasks.Pleroma.User do end defp set_admin(user, value) do - info = - user.info - |> Map.put("is_admin", value) - info_cng = User.Info.admin_api_update(user.info, %{is_admin: value}) user_cng = @@ -264,10 +256,6 @@ defmodule Mix.Tasks.Pleroma.User do end defp set_locked(user, value) do - info = - user.info - |> Map.put("locked", value) - info_cng = User.Info.user_upgrade(user.info, %{locked: value}) user_cng = -- cgit v1.2.3 From 1d11c4cf11e27992c6b79731015456a954307e8f Mon Sep 17 00:00:00 2001 From: Rin Toshaka Date: Fri, 7 Dec 2018 06:12:39 +0100 Subject: add common.ex --- lib/mix/tasks/pleroma/common.ex | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 lib/mix/tasks/pleroma/common.ex (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/common.ex b/lib/mix/tasks/pleroma/common.ex new file mode 100644 index 000000000..2e246c4b5 --- /dev/null +++ b/lib/mix/tasks/pleroma/common.ex @@ -0,0 +1,24 @@ +defmodule Mix.Tasks.Pleroma.Common do + @shortdoc "Common functions to be reused in mix tasks" + def start_pleroma do + Mix.Task.run("app.start") + end + + def get_option(options, opt, prompt, def \\ nil, defname \\ nil) do + Keyword.get(options, opt) || + case Mix.shell().prompt("#{prompt} [#{defname || def}]") do + "\n" -> + case def do + nil -> get_option(options, opt, prompt, def) + def -> def + end + + opt -> + opt |> String.trim() + end + end + + def escape_sh_path(path) do + ~S(') <> String.replace(path, ~S('), ~S(\')) <> ~S(') + end +end -- cgit v1.2.3 From 08e10a70ec8752b30010389c0f5e14105fc58c3e Mon Sep 17 00:00:00 2001 From: rinpatch Date: Fri, 7 Dec 2018 09:46:13 +0300 Subject: Rename def to defval --- lib/mix/tasks/pleroma/common.ex | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/common.ex b/lib/mix/tasks/pleroma/common.ex index 2e246c4b5..06893af05 100644 --- a/lib/mix/tasks/pleroma/common.ex +++ b/lib/mix/tasks/pleroma/common.ex @@ -4,13 +4,13 @@ defmodule Mix.Tasks.Pleroma.Common do Mix.Task.run("app.start") end - def get_option(options, opt, prompt, def \\ nil, defname \\ nil) do + def get_option(options, opt, prompt, defval \\ nil, defname \\ nil) do Keyword.get(options, opt) || - case Mix.shell().prompt("#{prompt} [#{defname || def}]") do + case Mix.shell().prompt("#{prompt} [#{defname || defval}]") do "\n" -> - case def do - nil -> get_option(options, opt, prompt, def) - def -> def + case defval do + nil -> get_option(options, opt, prompt, defval) + defval -> defval end opt -> -- cgit v1.2.3 From f6618138078f199ea34801ddee4f51cd6bae03e6 Mon Sep 17 00:00:00 2001 From: rinpatch Date: Fri, 7 Dec 2018 10:39:54 +0300 Subject: Add mix pleroma.user unsubscribe to mix doc --- lib/mix/tasks/pleroma/user.ex | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/user.ex b/lib/mix/tasks/pleroma/user.ex index 12b5af774..5299448c3 100644 --- a/lib/mix/tasks/pleroma/user.ex +++ b/lib/mix/tasks/pleroma/user.ex @@ -21,7 +21,7 @@ defmodule Mix.Tasks.Pleroma.User do ## Generate an invite link. - mix pleroma.user invite + mix pleroma.user invite ## Delete the user's account. @@ -30,6 +30,10 @@ defmodule Mix.Tasks.Pleroma.User do ## Deactivate or activate the user's account. 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. -- cgit v1.2.3 From f7e23aee9068664af4ed3c00dfe16878a73daa61 Mon Sep 17 00:00:00 2001 From: rinpatch Date: Fri, 7 Dec 2018 10:44:54 +0300 Subject: Oops --- lib/mix/tasks/pleroma/user.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/user.ex b/lib/mix/tasks/pleroma/user.ex index 5299448c3..590553443 100644 --- a/lib/mix/tasks/pleroma/user.ex +++ b/lib/mix/tasks/pleroma/user.ex @@ -30,7 +30,7 @@ defmodule Mix.Tasks.Pleroma.User do ## Deactivate or activate the user's account. mix pleroma.user toggle_activated NICKNAME - + ## Unsubscribe local users from user's account and deactivate it mix pleroma.user unsubscribe NICKNAME -- cgit v1.2.3 From 4e2250b1dd1661094a142382e75b359ab742e996 Mon Sep 17 00:00:00 2001 From: rinpatch Date: Fri, 7 Dec 2018 11:41:01 +0300 Subject: Fix a typo in relay.ex moduledoc --- lib/mix/tasks/pleroma/relay.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/relay.ex b/lib/mix/tasks/pleroma/relay.ex index 4aea52732..2502923af 100644 --- a/lib/mix/tasks/pleroma/relay.ex +++ b/lib/mix/tasks/pleroma/relay.ex @@ -9,7 +9,7 @@ defmodule Mix.Tasks.Pleroma.Relay do ## Follow a remote relay - ``mix pleroma.relay unfollow `` + ``mix pleroma.relay follow `` Example: ``mix pleroma.relay follow https://example.org/relay`` -- cgit v1.2.3 From a02e0c18bc0814817ece3495888c5cb03921ca2e Mon Sep 17 00:00:00 2001 From: Rin Toshaka Date: Fri, 7 Dec 2018 15:13:57 +0100 Subject: Mix Tasks: Add task uploads.ex for migrating local uploads. --- lib/mix/tasks/pleroma/uploads.ex | 98 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 lib/mix/tasks/pleroma/uploads.ex (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/uploads.ex b/lib/mix/tasks/pleroma/uploads.ex new file mode 100644 index 000000000..0783a0ccc --- /dev/null +++ b/lib/mix/tasks/pleroma/uploads.ex @@ -0,0 +1,98 @@ +defmodule Mix.Tasks.Pleroma.Uploads do + use Mix.Task + import Mix.Ecto + alias Pleroma.{Upload, Uploaders.Local, Uploaders.S3} + alias Mix.Tasks.Pleroma.Common + require Logger + + @log_every 50 + @shortdoc "Migrate uploads from local to remote storage" + @longdioc """ + Manages uploads + ## Migrate uploads from local to remote storage + + """ + + def run(["migrate_local", target_uploader | args]) do + delete? = Enum.member?(args, "--delete") + Common.start_pleroma() + local_path = Pleroma.Config.get!([Local, :uploads]) + uploader = Module.concat(Pleroma.Uploaders, target_uploader) + + unless Code.ensure_loaded?(uploader) do + raise("The uploader #{inspect(uploader)} is not an existing/loaded module.") + end + + target_enabled? = Pleroma.Config.get([Upload, :uploader]) == uploader + + unless target_enabled? do + Pleroma.Config.put([Upload, :uploader], uploader) + end + + Mix.shell().info("Migrating files from local #{local_path} to #{to_string(uploader)}") + + if delete? do + Mix.shell().info( + "Attention: uploaded files will be deleted, hope you have backups! (--delete ; cancel with ^C)" + ) + + :timer.sleep(:timer.seconds(5)) + end + + uploads = + File.ls!(local_path) + |> Enum.map(fn id -> + root_path = Path.join(local_path, id) + + cond do + File.dir?(root_path) -> + files = for file <- File.ls!(root_path), do: {id, file, Path.join([root_path, file])} + + case List.first(files) do + {id, file, path} -> + {%Pleroma.Upload{id: id, name: file, path: id <> "/" <> file, tempfile: path}, + root_path} + + _ -> + nil + end + + File.exists?(root_path) -> + file = Path.basename(id) + [hash, ext] = String.split(id, ".") + {%Pleroma.Upload{id: hash, name: file, path: file, tempfile: root_path}, root_path} + + true -> + nil + end + end) + |> Enum.filter(& &1) + + total_count = length(uploads) + Mix.shell().info("Found #{total_count} uploads") + + uploads + |> Task.async_stream( + fn {upload, root_path} -> + case Upload.store(upload, uploader: uploader, filters: [], size_limit: nil) do + {:ok, _} -> + if delete?, do: File.rm_rf!(root_path) + Logger.debug("uploaded: #{inspect(upload.path)} #{inspect(upload)}") + :ok + + error -> + Mix.shell().error("failed to upload #{inspect(upload.path)}: #{inspect(error)}") + end + end, + timeout: 150_000 + ) + |> Stream.chunk_every(@log_every) + |> Enum.reduce(0, fn done, count -> + count = count + length(done) + Mix.shell().info("Uploaded #{count}/#{total_count} files") + count + end) + + Mix.shell().info("Done!") + end +end -- cgit v1.2.3 From fd5c7b445f9911ab3d3cfb5ac06bfd6bb092b10a Mon Sep 17 00:00:00 2001 From: Rin Toshaka Date: Fri, 7 Dec 2018 19:19:14 +0100 Subject: Fix a typo --- lib/mix/tasks/pleroma/uploads.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/uploads.ex b/lib/mix/tasks/pleroma/uploads.ex index 0783a0ccc..0742ab378 100644 --- a/lib/mix/tasks/pleroma/uploads.ex +++ b/lib/mix/tasks/pleroma/uploads.ex @@ -7,7 +7,7 @@ defmodule Mix.Tasks.Pleroma.Uploads do @log_every 50 @shortdoc "Migrate uploads from local to remote storage" - @longdioc """ + @longdoc """ Manages uploads ## Migrate uploads from local to remote storage -- cgit v1.2.3 From 6c73136aeca26357b405058e338d8020dc0dfe4e Mon Sep 17 00:00:00 2001 From: Rin Toshaka Date: Sat, 8 Dec 2018 08:30:34 +0100 Subject: [#283] Mix Tasks: Fix a typo in relay.ex --- lib/mix/tasks/pleroma/relay.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/relay.ex b/lib/mix/tasks/pleroma/relay.ex index 2502923af..f4b7ff6a0 100644 --- a/lib/mix/tasks/pleroma/relay.ex +++ b/lib/mix/tasks/pleroma/relay.ex @@ -33,7 +33,7 @@ defmodule Mix.Tasks.Pleroma.Relay do def run(["unfollow", target]) do Common.start_pleroma() - with {:ok, activity} <- Relay.follow(target) do + with {:ok, activity} <- Relay.unfollow(target) do # put this task to sleep to allow the genserver to push out the messages :timer.sleep(500) else -- cgit v1.2.3 From 074fa790ba6282772cd8b2d40926032228d17c81 Mon Sep 17 00:00:00 2001 From: Maksim Pechnikov Date: Sun, 9 Dec 2018 12:12:48 +0300 Subject: fix compile warnings --- lib/mix/tasks/pleroma/common.ex | 2 +- lib/mix/tasks/pleroma/instance.ex | 1 - lib/mix/tasks/pleroma/relay.ex | 4 ++-- lib/mix/tasks/pleroma/uploads.ex | 8 +++---- lib/mix/tasks/pleroma/user.ex | 44 +++++++++++++++++++-------------------- 5 files changed, 28 insertions(+), 31 deletions(-) (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/common.ex b/lib/mix/tasks/pleroma/common.ex index 06893af05..36432c291 100644 --- a/lib/mix/tasks/pleroma/common.ex +++ b/lib/mix/tasks/pleroma/common.ex @@ -1,5 +1,5 @@ defmodule Mix.Tasks.Pleroma.Common do - @shortdoc "Common functions to be reused in mix tasks" + @doc "Common functions to be reused in mix tasks" def start_pleroma do Mix.Task.run("app.start") end diff --git a/lib/mix/tasks/pleroma/instance.ex b/lib/mix/tasks/pleroma/instance.ex index c66322707..3be856115 100644 --- a/lib/mix/tasks/pleroma/instance.ex +++ b/lib/mix/tasks/pleroma/instance.ex @@ -1,6 +1,5 @@ defmodule Mix.Tasks.Pleroma.Instance do use Mix.Task - alias Pleroma.{Repo, User} alias Mix.Tasks.Pleroma.Common @shortdoc "Manages Pleroma instance" diff --git a/lib/mix/tasks/pleroma/relay.ex b/lib/mix/tasks/pleroma/relay.ex index f4b7ff6a0..03586d6c3 100644 --- a/lib/mix/tasks/pleroma/relay.ex +++ b/lib/mix/tasks/pleroma/relay.ex @@ -22,7 +22,7 @@ defmodule Mix.Tasks.Pleroma.Relay do def run(["follow", target]) do Common.start_pleroma() - with {:ok, activity} <- Relay.follow(target) do + with {:ok, _activity} <- Relay.follow(target) do # put this task to sleep to allow the genserver to push out the messages :timer.sleep(500) else @@ -33,7 +33,7 @@ defmodule Mix.Tasks.Pleroma.Relay do def run(["unfollow", target]) do Common.start_pleroma() - with {:ok, activity} <- Relay.unfollow(target) do + with {:ok, _activity} <- Relay.unfollow(target) do # put this task to sleep to allow the genserver to push out the messages :timer.sleep(500) else diff --git a/lib/mix/tasks/pleroma/uploads.ex b/lib/mix/tasks/pleroma/uploads.ex index 0742ab378..45bfd254c 100644 --- a/lib/mix/tasks/pleroma/uploads.ex +++ b/lib/mix/tasks/pleroma/uploads.ex @@ -1,18 +1,16 @@ defmodule Mix.Tasks.Pleroma.Uploads do use Mix.Task - import Mix.Ecto - alias Pleroma.{Upload, Uploaders.Local, Uploaders.S3} + alias Pleroma.{Upload, Uploaders.Local} alias Mix.Tasks.Pleroma.Common require Logger @log_every 50 @shortdoc "Migrate uploads from local to remote storage" - @longdoc """ + @doc """ Manages uploads ## Migrate uploads from local to remote storage """ - def run(["migrate_local", target_uploader | args]) do delete? = Enum.member?(args, "--delete") Common.start_pleroma() @@ -59,7 +57,7 @@ defmodule Mix.Tasks.Pleroma.Uploads do File.exists?(root_path) -> file = Path.basename(id) - [hash, ext] = String.split(id, ".") + [hash, _ext] = String.split(id, ".") {%Pleroma.Upload{id: hash, name: file, path: file, tempfile: root_path}, root_path} true -> diff --git a/lib/mix/tasks/pleroma/user.ex b/lib/mix/tasks/pleroma/user.ex index 590553443..2675b021d 100644 --- a/lib/mix/tasks/pleroma/user.ex +++ b/lib/mix/tasks/pleroma/user.ex @@ -20,7 +20,7 @@ defmodule Mix.Tasks.Pleroma.User do - `--admin`/`--no-admin` - whether the user is an admin ## Generate an invite link. - + mix pleroma.user invite ## Delete the user's account. @@ -32,7 +32,7 @@ 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. @@ -235,6 +235,26 @@ defmodule Mix.Tasks.Pleroma.User do end end + def run(["invite"]) do + Common.start_pleroma() + + with {:ok, token} <- Pleroma.UserInviteToken.create_token() do + Mix.shell().info("Generated user invite token") + + url = + Pleroma.Web.Router.Helpers.redirect_url( + Pleroma.Web.Endpoint, + :registration_page, + token.token + ) + + IO.puts(url) + else + _ -> + Mix.shell().error("Could not create invite token.") + end + end + defp set_moderator(user, value) do info_cng = User.Info.admin_api_update(user.info, %{is_moderator: value}) @@ -270,24 +290,4 @@ defmodule Mix.Tasks.Pleroma.User do 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") - - url = - Pleroma.Web.Router.Helpers.redirect_url( - Pleroma.Web.Endpoint, - :registration_page, - token.token - ) - - IO.puts(url) - else - _ -> - Mix.shell().error("Could not create invite token.") - end - end end -- cgit v1.2.3 From cbe048bb3ffb8f74752e4668957fbf105cedbf62 Mon Sep 17 00:00:00 2001 From: Rin Toshaka Date: Sun, 9 Dec 2018 20:17:35 +0100 Subject: Mix tasks: improve uploads.ex moduledoc --- lib/mix/tasks/pleroma/uploads.ex | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/uploads.ex b/lib/mix/tasks/pleroma/uploads.ex index 0742ab378..d934bd6dc 100644 --- a/lib/mix/tasks/pleroma/uploads.ex +++ b/lib/mix/tasks/pleroma/uploads.ex @@ -6,11 +6,17 @@ defmodule Mix.Tasks.Pleroma.Uploads do require Logger @log_every 50 - @shortdoc "Migrate uploads from local to remote storage" - @longdoc """ - Manages uploads + @shortdoc "Manages uploads" + @moduledoc """ + Manages uploads. + ## Migrate uploads from local to remote storage + mix pleroma.uploads migrate_local TARGET_UPLOADER [OPTIONS...] + Options: + - `--delete` - delete local uploads after migrating them to the target uploader + + A list of avalible uploaders can be seen in config.exs """ def run(["migrate_local", target_uploader | args]) do -- cgit v1.2.3 From 993c8c8bd4e94985c647f4f9e927cbaa7148e6a0 Mon Sep 17 00:00:00 2001 From: rinpatch Date: Mon, 10 Dec 2018 08:03:17 +0300 Subject: Keep the shortdoc descriptive --- lib/mix/tasks/pleroma/uploads.ex | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/uploads.ex b/lib/mix/tasks/pleroma/uploads.ex index d934bd6dc..6ffc941c9 100644 --- a/lib/mix/tasks/pleroma/uploads.ex +++ b/lib/mix/tasks/pleroma/uploads.ex @@ -6,10 +6,8 @@ defmodule Mix.Tasks.Pleroma.Uploads do require Logger @log_every 50 - @shortdoc "Manages uploads" + @shortdoc "Migrates uploads from local to remote storage" @moduledoc """ - Manages uploads. - ## Migrate uploads from local to remote storage mix pleroma.uploads migrate_local TARGET_UPLOADER [OPTIONS...] Options: -- cgit v1.2.3 From e94c3442f4b88f4eedf4e4cc67e91a1375df6afd Mon Sep 17 00:00:00 2001 From: Maksim Pechnikov Date: Mon, 10 Dec 2018 09:39:57 +0300 Subject: updates --- lib/mix/tasks/pleroma/uploads.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/uploads.ex b/lib/mix/tasks/pleroma/uploads.ex index 45bfd254c..c6b840130 100644 --- a/lib/mix/tasks/pleroma/uploads.ex +++ b/lib/mix/tasks/pleroma/uploads.ex @@ -57,7 +57,7 @@ defmodule Mix.Tasks.Pleroma.Uploads do File.exists?(root_path) -> file = Path.basename(id) - [hash, _ext] = String.split(id, ".") + hash = Path.rootname(id) {%Pleroma.Upload{id: hash, name: file, path: file, tempfile: root_path}, root_path} true -> -- cgit v1.2.3 From a40ba3ba57158401583c5f80aaa78d80b4ca319f Mon Sep 17 00:00:00 2001 From: link0ff Date: Wed, 12 Dec 2018 22:30:16 +0200 Subject: Fix toggle_activated in mix task User --- lib/mix/tasks/pleroma/user.ex | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/user.ex b/lib/mix/tasks/pleroma/user.ex index 2675b021d..bcc3b9e50 100644 --- a/lib/mix/tasks/pleroma/user.ex +++ b/lib/mix/tasks/pleroma/user.ex @@ -142,8 +142,11 @@ defmodule Mix.Tasks.Pleroma.User do Common.start_pleroma() 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"]}") + {:ok, user} = User.deactivate(user, !user.info.deactivated) + + Mix.shell().info( + "Activation status of #{nickname}: #{if(user.info.deactivated, do: "de", else: "")}activated" + ) else _ -> Mix.shell().error("No user #{nickname}") -- cgit v1.2.3 From 51dd294c486474d453dbbd508995505017597bc2 Mon Sep 17 00:00:00 2001 From: link0ff Date: Wed, 12 Dec 2018 22:32:32 +0200 Subject: Allow to set both admin and moderator at the same time in mix task User --- lib/mix/tasks/pleroma/user.ex | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/user.ex b/lib/mix/tasks/pleroma/user.ex index bcc3b9e50..fe6e6935f 100644 --- a/lib/mix/tasks/pleroma/user.ex +++ b/lib/mix/tasks/pleroma/user.ex @@ -218,20 +218,23 @@ defmodule Mix.Tasks.Pleroma.User do ) 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(user, value) - end - - case Keyword.get(options, :admin) do - nil -> nil - value -> set_admin(user, value) - end + user = + case Keyword.get(options, :moderator) do + nil -> user + value -> set_moderator(user, value) + end + + user = + case Keyword.get(options, :locked) do + nil -> user + value -> set_locked(user, value) + end + + _user = + case Keyword.get(options, :admin) do + nil -> user + value -> set_admin(user, value) + end else _ -> Mix.shell().error("No local user #{nickname}") @@ -268,6 +271,7 @@ defmodule Mix.Tasks.Pleroma.User do {:ok, user} = User.update_and_set_cache(user_cng) Mix.shell().info("Moderator status of #{user.nickname}: #{user.info.is_moderator}") + user end defp set_admin(user, value) do @@ -279,7 +283,8 @@ defmodule Mix.Tasks.Pleroma.User do {:ok, user} = User.update_and_set_cache(user_cng) - Mix.shell().info("Admin status of #{user.nickname}: #{user.info.is_moderator}") + Mix.shell().info("Admin status of #{user.nickname}: #{user.info.is_admin}") + user end defp set_locked(user, value) do @@ -292,5 +297,6 @@ defmodule Mix.Tasks.Pleroma.User do {:ok, user} = User.update_and_set_cache(user_cng) Mix.shell().info("Locked status of #{user.nickname}: #{user.info.locked}") + user end end -- cgit v1.2.3 From 4a895a46d111286e5c6cf923b9fdb4e50115104a Mon Sep 17 00:00:00 2001 From: Rin Toshaka Date: Sat, 15 Dec 2018 11:00:54 +0100 Subject: Allow port specification in instance.ex --- lib/mix/tasks/pleroma/instance.ex | 16 ++++++++++------ lib/mix/tasks/pleroma/sample_config.eex | 2 +- 2 files changed, 11 insertions(+), 7 deletions(-) (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/instance.ex b/lib/mix/tasks/pleroma/instance.ex index 3be856115..02e1ce27d 100644 --- a/lib/mix/tasks/pleroma/instance.ex +++ b/lib/mix/tasks/pleroma/instance.ex @@ -58,12 +58,15 @@ defmodule Mix.Tasks.Pleroma.Instance do proceed? = Enum.empty?(will_overwrite) or Keyword.get(options, :force, false) unless not proceed? do - domain = - Common.get_option( - options, - :domain, - "What domain will your instance use? (e.g pleroma.soykaf.com)" - ) + [domain, port | _] = + String.split( + Common.get_option( + options, + :domain, + "What domain will your instance use? (e.g pleroma.soykaf.com)" + ), + ":" + ) ++ [443] name = Common.get_option( @@ -104,6 +107,7 @@ defmodule Mix.Tasks.Pleroma.Instance do EEx.eval_file( "sample_config.eex" |> Path.expand(__DIR__), domain: domain, + port: port, email: email, name: name, dbhost: dbhost, diff --git a/lib/mix/tasks/pleroma/sample_config.eex b/lib/mix/tasks/pleroma/sample_config.eex index 0cd572797..740b9f8d1 100644 --- a/lib/mix/tasks/pleroma/sample_config.eex +++ b/lib/mix/tasks/pleroma/sample_config.eex @@ -6,7 +6,7 @@ use Mix.Config config :pleroma, Pleroma.Web.Endpoint, - url: [host: "<%= domain %>", scheme: "https", port: 443], + url: [host: "<%= domain %>", scheme: "https", port: <%= port %>], secret_key_base: "<%= secret %>" config :pleroma, :instance, -- cgit v1.2.3 From 22d483d4f74ff404fd6ae0cd88d2e5bcc7cceaf6 Mon Sep 17 00:00:00 2001 From: link0ff Date: Sun, 16 Dec 2018 18:25:31 +0200 Subject: Use bindings dbuser and dbname in sample_psql.eex --- lib/mix/tasks/pleroma/sample_psql.eex | 6 +++--- lib/mix/tasks/pleroma/user.ex | 18 ++++++++---------- 2 files changed, 11 insertions(+), 13 deletions(-) (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/sample_psql.eex b/lib/mix/tasks/pleroma/sample_psql.eex index c89b34ef2..f0ac05e57 100644 --- a/lib/mix/tasks/pleroma/sample_psql.eex +++ b/lib/mix/tasks/pleroma/sample_psql.eex @@ -1,6 +1,6 @@ -CREATE USER pleroma WITH ENCRYPTED PASSWORD '<%= dbpass %>'; -CREATE DATABASE pleroma_dev OWNER pleroma; -\c pleroma_dev; +CREATE USER <%= dbuser %> WITH ENCRYPTED PASSWORD '<%= dbpass %>'; +CREATE DATABASE <%= dbname %> OWNER <%= dbuser %>; +\c <%= dbname %>; --Extensions made by ecto.migrate that need superuser access CREATE EXTENSION IF NOT EXISTS citext; CREATE EXTENSION IF NOT EXISTS pg_trgm; diff --git a/lib/mix/tasks/pleroma/user.ex b/lib/mix/tasks/pleroma/user.ex index fe6e6935f..3d30e3a81 100644 --- a/lib/mix/tasks/pleroma/user.ex +++ b/lib/mix/tasks/pleroma/user.ex @@ -94,16 +94,14 @@ defmodule Mix.Tasks.Pleroma.User do unless not proceed? do Common.start_pleroma() - params = - %{ - nickname: nickname, - email: email, - password: password, - password_confirmation: password, - name: name, - bio: bio - } - |> IO.inspect() + params = %{ + nickname: nickname, + email: email, + password: password, + password_confirmation: password, + name: name, + bio: bio + } user = User.register_changeset(%User{}, params) Repo.insert!(user) -- cgit v1.2.3 From b096e30cffc79a4adf12be88da412a290cd0d190 Mon Sep 17 00:00:00 2001 From: Ivan Tashkinov Date: Tue, 18 Dec 2018 17:13:52 +0300 Subject: [#114] Added email confirmation resend action. Added tests for registration, authentication, email confirmation, confirmation resending. Made admin methods create confirmed users. --- lib/mix/tasks/pleroma/user.ex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/user.ex b/lib/mix/tasks/pleroma/user.ex index 3d30e3a81..51086a443 100644 --- a/lib/mix/tasks/pleroma/user.ex +++ b/lib/mix/tasks/pleroma/user.ex @@ -103,8 +103,8 @@ defmodule Mix.Tasks.Pleroma.User do bio: bio } - user = User.register_changeset(%User{}, params) - Repo.insert!(user) + changeset = User.register_changeset(%User{}, params, confirmed: true) + {:ok, _user} = User.register(changeset) Mix.shell().info("User #{nickname} created") -- cgit v1.2.3 From 69ad1039ba6cb94ea0f6c9d2c7171bdab789651f Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Sun, 23 Dec 2018 20:05:55 +0000 Subject: mix tasks: add legal boilerplate --- lib/mix/tasks/pleroma/common.ex | 4 ++++ lib/mix/tasks/pleroma/instance.ex | 4 ++++ lib/mix/tasks/pleroma/relay.ex | 4 ++++ lib/mix/tasks/pleroma/uploads.ex | 4 ++++ lib/mix/tasks/pleroma/user.ex | 4 ++++ 5 files changed, 20 insertions(+) (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/common.ex b/lib/mix/tasks/pleroma/common.ex index 36432c291..48c0c1346 100644 --- a/lib/mix/tasks/pleroma/common.ex +++ b/lib/mix/tasks/pleroma/common.ex @@ -1,3 +1,7 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2018 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + defmodule Mix.Tasks.Pleroma.Common do @doc "Common functions to be reused in mix tasks" def start_pleroma do diff --git a/lib/mix/tasks/pleroma/instance.ex b/lib/mix/tasks/pleroma/instance.ex index 02e1ce27d..1ef40671c 100644 --- a/lib/mix/tasks/pleroma/instance.ex +++ b/lib/mix/tasks/pleroma/instance.ex @@ -1,3 +1,7 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2018 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + defmodule Mix.Tasks.Pleroma.Instance do use Mix.Task alias Mix.Tasks.Pleroma.Common diff --git a/lib/mix/tasks/pleroma/relay.ex b/lib/mix/tasks/pleroma/relay.ex index 03586d6c3..cbe23f82e 100644 --- a/lib/mix/tasks/pleroma/relay.ex +++ b/lib/mix/tasks/pleroma/relay.ex @@ -1,3 +1,7 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2018 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + defmodule Mix.Tasks.Pleroma.Relay do use Mix.Task alias Pleroma.Web.ActivityPub.Relay diff --git a/lib/mix/tasks/pleroma/uploads.ex b/lib/mix/tasks/pleroma/uploads.ex index 63299b2ae..f0eb13e1a 100644 --- a/lib/mix/tasks/pleroma/uploads.ex +++ b/lib/mix/tasks/pleroma/uploads.ex @@ -1,3 +1,7 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2018 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + defmodule Mix.Tasks.Pleroma.Uploads do use Mix.Task alias Pleroma.{Upload, Uploaders.Local} diff --git a/lib/mix/tasks/pleroma/user.ex b/lib/mix/tasks/pleroma/user.ex index 51086a443..217a52fdd 100644 --- a/lib/mix/tasks/pleroma/user.ex +++ b/lib/mix/tasks/pleroma/user.ex @@ -1,3 +1,7 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2018 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + defmodule Mix.Tasks.Pleroma.User do use Mix.Task import Ecto.Changeset -- cgit v1.2.3 From ab9cda315f2ee7b0a2a6e505eface5d7c65d50b4 Mon Sep 17 00:00:00 2001 From: spctrl Date: Sat, 29 Dec 2018 12:43:54 +0100 Subject: Change 'name' to 'instance_name' so option is used when running non-interactive --- lib/mix/tasks/pleroma/instance.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/instance.ex b/lib/mix/tasks/pleroma/instance.ex index 1ef40671c..0a2c891c0 100644 --- a/lib/mix/tasks/pleroma/instance.ex +++ b/lib/mix/tasks/pleroma/instance.ex @@ -75,7 +75,7 @@ defmodule Mix.Tasks.Pleroma.Instance do name = Common.get_option( options, - :name, + :instance_name, "What is the name of your instance? (e.g. Pleroma/Soykaf)" ) -- cgit v1.2.3 From 4aa977d3b3ad731465f83f2d382fe9d856995e90 Mon Sep 17 00:00:00 2001 From: spctrl Date: Fri, 4 Jan 2019 22:11:46 +0100 Subject: fix 486: Add option --assume-yes to allow it to work non-interactive --- lib/mix/tasks/pleroma/user.ex | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/user.ex b/lib/mix/tasks/pleroma/user.ex index 217a52fdd..c311d48e0 100644 --- a/lib/mix/tasks/pleroma/user.ex +++ b/lib/mix/tasks/pleroma/user.ex @@ -22,6 +22,7 @@ defmodule Mix.Tasks.Pleroma.User do - `--password PASSWORD` - the user's password - `--moderator`/`--no-moderator` - whether the user is a moderator - `--admin`/`--no-admin` - whether the user is an admin + - `-y`, `--assume-yes`/`--no-assume-yes` - whether to assume yes to all questions ## Generate an invite link. @@ -61,7 +62,11 @@ defmodule Mix.Tasks.Pleroma.User do bio: :string, password: :string, moderator: :boolean, - admin: :boolean + admin: :boolean, + assume_yes: :boolean + ], + aliases: [ + y: :assume_yes ] ) @@ -79,6 +84,7 @@ defmodule Mix.Tasks.Pleroma.User do moderator? = Keyword.get(options, :moderator, false) admin? = Keyword.get(options, :admin, false) + assume_yes? = Keyword.get(options, :assume_yes, false) Mix.shell().info(""" A user will be created with the following information: @@ -93,7 +99,7 @@ defmodule Mix.Tasks.Pleroma.User do - admin: #{if(admin?, do: "true", else: "false")} """) - proceed? = Mix.shell().yes?("Continue?") + proceed? = assume_yes? or Mix.shell().yes?("Continue?") unless not proceed? do Common.start_pleroma() -- cgit v1.2.3 From f94cc6d824cb2bdf4a41bc800d2bfc7d4f4dc23d Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Mon, 21 Jan 2019 01:16:41 +0100 Subject: Mix.Tasks.Pleroma.Instance: Generate signing_salt Closes: https://git.pleroma.social/pleroma/pleroma/issues/533 --- lib/mix/tasks/pleroma/instance.ex | 2 ++ lib/mix/tasks/pleroma/sample_config.eex | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/instance.ex b/lib/mix/tasks/pleroma/instance.ex index 0a2c891c0..1ba452275 100644 --- a/lib/mix/tasks/pleroma/instance.ex +++ b/lib/mix/tasks/pleroma/instance.ex @@ -105,6 +105,7 @@ defmodule Mix.Tasks.Pleroma.Instance do ) secret = :crypto.strong_rand_bytes(64) |> Base.encode64() |> binary_part(0, 64) + signing_salt = :crypto.strong_rand_bytes(8) |> Base.encode64() |> binary_part(0, 8) {web_push_public_key, web_push_private_key} = :crypto.generate_key(:ecdh, :prime256v1) result_config = @@ -120,6 +121,7 @@ defmodule Mix.Tasks.Pleroma.Instance do dbpass: dbpass, version: Pleroma.Mixfile.project() |> Keyword.get(:version), secret: secret, + signing_salt: signing_salt, web_push_public_key: Base.url_encode64(web_push_public_key, padding: false), web_push_private_key: Base.url_encode64(web_push_private_key, padding: false) ) diff --git a/lib/mix/tasks/pleroma/sample_config.eex b/lib/mix/tasks/pleroma/sample_config.eex index 740b9f8d1..1c935c0d8 100644 --- a/lib/mix/tasks/pleroma/sample_config.eex +++ b/lib/mix/tasks/pleroma/sample_config.eex @@ -7,7 +7,8 @@ use Mix.Config config :pleroma, Pleroma.Web.Endpoint, url: [host: "<%= domain %>", scheme: "https", port: <%= port %>], - secret_key_base: "<%= secret %>" + secret_key_base: "<%= secret %>", + signing_salt: "<%= signing_salt %>" config :pleroma, :instance, name: "<%= name %>", -- cgit v1.2.3 From 93e136d70b181fa271c2b4a5decd258f1287b1fa Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Mon, 4 Feb 2019 02:33:11 +0000 Subject: mix: add user tag/untag task --- lib/mix/tasks/pleroma/user.ex | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/user.ex b/lib/mix/tasks/pleroma/user.ex index c311d48e0..ffc45fd03 100644 --- a/lib/mix/tasks/pleroma/user.ex +++ b/lib/mix/tasks/pleroma/user.ex @@ -52,6 +52,14 @@ defmodule Mix.Tasks.Pleroma.User do - `--locked`/`--no-locked` - whether the user's account is locked - `--moderator`/`--no-moderator` - whether the user is a moderator - `--admin`/`--no-admin` - whether the user is an admin + + ## Add tags to a user. + + mix pleroma.user tag NICKNAME TAGS + + ## Delete tags from a user. + + mix pleroma.user untag NICKNAME TAGS """ def run(["new", nickname, email | rest]) do {options, [], []} = @@ -249,6 +257,32 @@ defmodule Mix.Tasks.Pleroma.User do end end + def run(["tag", nickname | tags]) do + Common.start_pleroma() + + with %User{} = user <- User.get_by_nickname(nickname) do + user = user |> User.tag(tags) + + Mix.shell().info("Tags of #{user.nickname}: #{inspect(tags)}") + else + _ -> + Mix.shell().error("Could not change user tags for #{nickname}") + end + end + + def run(["untag", nickname | tags]) do + Common.start_pleroma() + + with %User{} = user <- User.get_by_nickname(nickname) do + user = user |> User.untag(tags) + + Mix.shell().info("Tags of #{user.nickname}: #{inspect(tags)}") + else + _ -> + Mix.shell().error("Could not change user tags for #{nickname}") + end + end + def run(["invite"]) do Common.start_pleroma() -- cgit v1.2.3 From 8bcfac93a8586c12661427187ba8147dacc28c5b Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Sun, 3 Feb 2019 18:44:18 +0100 Subject: Make credo happy --- lib/mix/tasks/pleroma/user.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/user.ex b/lib/mix/tasks/pleroma/user.ex index ffc45fd03..5da3edfd2 100644 --- a/lib/mix/tasks/pleroma/user.ex +++ b/lib/mix/tasks/pleroma/user.ex @@ -211,7 +211,7 @@ defmodule Mix.Tasks.Pleroma.User do user = Repo.get(User, user.id) - if length(user.following) == 0 do + if Enum.empty?(user.following) do Mix.shell().info("Successfully unsubscribed all followers from #{user.nickname}") end else -- cgit v1.2.3 From bd9b5fffbcffed5d5cab238d5f3c36cf90edc881 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Wed, 6 Feb 2019 21:24:57 +0100 Subject: Mix.Tasks.Pleroma.Uploads: Fix typo in documentation --- lib/mix/tasks/pleroma/uploads.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/uploads.ex b/lib/mix/tasks/pleroma/uploads.ex index f0eb13e1a..460fa161b 100644 --- a/lib/mix/tasks/pleroma/uploads.ex +++ b/lib/mix/tasks/pleroma/uploads.ex @@ -20,7 +20,7 @@ defmodule Mix.Tasks.Pleroma.Uploads do - `--delete` - delete local uploads after migrating them to the target uploader - A list of avalible uploaders can be seen in config.exs + A list of available uploaders can be seen in config.exs """ def run(["migrate_local", target_uploader | args]) do delete? = Enum.member?(args, "--delete") -- cgit v1.2.3 From 6a6a5b3251f7137e30b687a9a8448e678446f8b0 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Sat, 9 Feb 2019 16:16:26 +0100 Subject: de-group alias/es --- lib/mix/tasks/pleroma/uploads.ex | 3 ++- lib/mix/tasks/pleroma/user.ex | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/uploads.ex b/lib/mix/tasks/pleroma/uploads.ex index 460fa161b..697ad1a7b 100644 --- a/lib/mix/tasks/pleroma/uploads.ex +++ b/lib/mix/tasks/pleroma/uploads.ex @@ -4,7 +4,8 @@ defmodule Mix.Tasks.Pleroma.Uploads do use Mix.Task - alias Pleroma.{Upload, Uploaders.Local} + alias Pleroma.Upload + alias Pleroma.Uploaders.Local alias Mix.Tasks.Pleroma.Common require Logger diff --git a/lib/mix/tasks/pleroma/user.ex b/lib/mix/tasks/pleroma/user.ex index 5da3edfd2..037e44716 100644 --- a/lib/mix/tasks/pleroma/user.ex +++ b/lib/mix/tasks/pleroma/user.ex @@ -5,7 +5,8 @@ defmodule Mix.Tasks.Pleroma.User do use Mix.Task import Ecto.Changeset - alias Pleroma.{Repo, User} + alias Pleroma.Repo + alias Pleroma.User alias Mix.Tasks.Pleroma.Common @shortdoc "Manages Pleroma users" -- cgit v1.2.3 From 6ca633ddd30e8330e47f6456fe16fa72506e2e13 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Sat, 9 Feb 2019 16:30:42 +0100 Subject: Mix.Tasks.Pleroma.Uploads: Disable Enum.reduce warning on line 100 (unsure) --- lib/mix/tasks/pleroma/uploads.ex | 1 + 1 file changed, 1 insertion(+) (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/uploads.ex b/lib/mix/tasks/pleroma/uploads.ex index 697ad1a7b..a01e61627 100644 --- a/lib/mix/tasks/pleroma/uploads.ex +++ b/lib/mix/tasks/pleroma/uploads.ex @@ -97,6 +97,7 @@ defmodule Mix.Tasks.Pleroma.Uploads do timeout: 150_000 ) |> Stream.chunk_every(@log_every) + # credo:disable-for-next-line Credo.Check.Warning.UnusedEnumOperation |> Enum.reduce(0, fn done, count -> count = count + length(done) Mix.shell().info("Uploaded #{count}/#{total_count} files") -- cgit v1.2.3 From d013b58e84f2c8213a5d26b1c3daf36e2f4807e5 Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Tue, 12 Mar 2019 22:04:08 +0700 Subject: add `mix pleroma.user delete_activities NICKNAME` task --- lib/mix/tasks/pleroma/user.ex | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/user.ex b/lib/mix/tasks/pleroma/user.ex index 037e44716..e232df14f 100644 --- a/lib/mix/tasks/pleroma/user.ex +++ b/lib/mix/tasks/pleroma/user.ex @@ -304,6 +304,18 @@ defmodule Mix.Tasks.Pleroma.User do end end + def run(["delete_activities", nickname]) do + Common.start_pleroma() + + with %User{local: true} = user <- User.get_by_nickname(nickname) do + User.delete_user_activities(user) + Mix.shell().info("User #{nickname} deleted.") + 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}) -- cgit v1.2.3 From 16e598ec11cb9178b9fc53a1ec4b649d97c5f3b8 Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Tue, 12 Mar 2019 22:12:05 +0700 Subject: fix wording --- lib/mix/tasks/pleroma/user.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/user.ex b/lib/mix/tasks/pleroma/user.ex index e232df14f..ec06d908a 100644 --- a/lib/mix/tasks/pleroma/user.ex +++ b/lib/mix/tasks/pleroma/user.ex @@ -309,7 +309,7 @@ defmodule Mix.Tasks.Pleroma.User do with %User{local: true} = user <- User.get_by_nickname(nickname) do User.delete_user_activities(user) - Mix.shell().info("User #{nickname} deleted.") + Mix.shell().info("User #{nickname} statuses deleted..") else _ -> Mix.shell().error("No local user #{nickname}") -- cgit v1.2.3 From a3a9cec4835738216800d2cebd295fb8dbf10f34 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Tue, 5 Mar 2019 03:52:23 +0100 Subject: [Credo] fix Credo.Check.Readability.AliasOrder --- lib/mix/tasks/pleroma/relay.ex | 2 +- lib/mix/tasks/pleroma/uploads.ex | 2 +- lib/mix/tasks/pleroma/user.ex | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/relay.ex b/lib/mix/tasks/pleroma/relay.ex index cbe23f82e..fbec473c5 100644 --- a/lib/mix/tasks/pleroma/relay.ex +++ b/lib/mix/tasks/pleroma/relay.ex @@ -4,8 +4,8 @@ defmodule Mix.Tasks.Pleroma.Relay do use Mix.Task - alias Pleroma.Web.ActivityPub.Relay alias Mix.Tasks.Pleroma.Common + alias Pleroma.Web.ActivityPub.Relay @shortdoc "Manages remote relays" @moduledoc """ diff --git a/lib/mix/tasks/pleroma/uploads.ex b/lib/mix/tasks/pleroma/uploads.ex index a01e61627..9ca123a9b 100644 --- a/lib/mix/tasks/pleroma/uploads.ex +++ b/lib/mix/tasks/pleroma/uploads.ex @@ -4,9 +4,9 @@ defmodule Mix.Tasks.Pleroma.Uploads do use Mix.Task + alias Mix.Tasks.Pleroma.Common alias Pleroma.Upload alias Pleroma.Uploaders.Local - alias Mix.Tasks.Pleroma.Common require Logger @log_every 50 diff --git a/lib/mix/tasks/pleroma/user.ex b/lib/mix/tasks/pleroma/user.ex index 037e44716..f6cca0d06 100644 --- a/lib/mix/tasks/pleroma/user.ex +++ b/lib/mix/tasks/pleroma/user.ex @@ -5,9 +5,9 @@ defmodule Mix.Tasks.Pleroma.User do use Mix.Task import Ecto.Changeset + alias Mix.Tasks.Pleroma.Common alias Pleroma.Repo alias Pleroma.User - alias Mix.Tasks.Pleroma.Common @shortdoc "Manages Pleroma users" @moduledoc """ -- cgit v1.2.3 From 4b73ca638ec8194e96b7d8199022f519b3499109 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Tue, 5 Mar 2019 06:07:21 +0100 Subject: =?UTF-8?q?[Credo][CI]=20Add=20readability=20as=20it=E2=80=99s=20f?= =?UTF-8?q?ixed?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/mix/tasks/pleroma/uploads.ex | 1 - 1 file changed, 1 deletion(-) (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/uploads.ex b/lib/mix/tasks/pleroma/uploads.ex index 9ca123a9b..106fcf443 100644 --- a/lib/mix/tasks/pleroma/uploads.ex +++ b/lib/mix/tasks/pleroma/uploads.ex @@ -20,7 +20,6 @@ defmodule Mix.Tasks.Pleroma.Uploads do Options: - `--delete` - delete local uploads after migrating them to the target uploader - A list of available uploaders can be seen in config.exs """ def run(["migrate_local", target_uploader | args]) do -- cgit v1.2.3 From 3dadaa4432b442d75b0ac0425aa05527d52f0e7a Mon Sep 17 00:00:00 2001 From: William Pearson Date: Sun, 20 Jan 2019 01:44:00 +0000 Subject: robots.txt Add default robots.txt that allows bots access to all paths. Add mix task to generate robots.txt taht allows bots access to no paths. Document custom emojis, MRF and static_dir static_dir documentation includes docs for the robots.txt Mix task. --- lib/mix/tasks/pleroma/robotstxt.ex | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 lib/mix/tasks/pleroma/robotstxt.ex (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/robotstxt.ex b/lib/mix/tasks/pleroma/robotstxt.ex new file mode 100644 index 000000000..2128e1cd6 --- /dev/null +++ b/lib/mix/tasks/pleroma/robotstxt.ex @@ -0,0 +1,32 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2019 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Mix.Tasks.Pleroma.RobotsTxt do + use Mix.Task + + @shortdoc "Generate robots.txt" + @moduledoc """ + Generates robots.txt + + ## Overwrite robots.txt to disallow all + + mix pleroma.robots_txt disallow_all + + This will write a robots.txt that will hide all paths on your instance + from search engines and other robots that obey robots.txt + + """ + def run(["disallow_all"]) do + static_dir = Pleroma.Config.get([:instance, :static_dir], "instance/static/") + + if !File.exists?(static_dir) do + File.mkdir_p!(static_dir) + end + + robots_txt_path = Path.join(static_dir, "robots.txt") + robots_txt_content = "User-Agent: *\nDisallow: /\n" + + File.write!(robots_txt_path, robots_txt_content, [:write]) + end +end -- cgit v1.2.3 From a14742f495fac78f4dfd7ab02f4c3ae5c7c37c3b Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Tue, 2 Apr 2019 16:30:11 +0700 Subject: add `user delete_activities` mix task --- lib/mix/tasks/pleroma/user.ex | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/user.ex b/lib/mix/tasks/pleroma/user.ex index 680422c19..62c9fceda 100644 --- a/lib/mix/tasks/pleroma/user.ex +++ b/lib/mix/tasks/pleroma/user.ex @@ -23,7 +23,7 @@ defmodule Mix.Tasks.Pleroma.User do - `--password PASSWORD` - the user's password - `--moderator`/`--no-moderator` - whether the user is a moderator - `--admin`/`--no-admin` - whether the user is an admin - - `-y`, `--assume-yes`/`--no-assume-yes` - whether to assume yes to all questions + - `-y`, `--assume-yes`/`--no-assume-yes` - whether to assume yes to all questions ## Generate an invite link. @@ -33,6 +33,10 @@ defmodule Mix.Tasks.Pleroma.User do mix pleroma.user rm NICKNAME + ## Delete the user's activities. + + mix pleroma.user delete_activities NICKNAME + ## Deactivate or activate the user's account. mix pleroma.user toggle_activated NICKNAME @@ -309,7 +313,7 @@ defmodule Mix.Tasks.Pleroma.User do with %User{local: true} = user <- User.get_by_nickname(nickname) do User.delete_user_activities(user) - Mix.shell().info("User #{nickname} statuses deleted..") + Mix.shell().info("User #{nickname} statuses deleted.") else _ -> Mix.shell().error("No local user #{nickname}") -- cgit v1.2.3 From 1b3d92192194baf6b431cd9f0ce58062d1b703d5 Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Tue, 2 Apr 2019 17:01:26 +0700 Subject: change `Repo.get(User, id)` => `User.get_by_id(id)` --- lib/mix/tasks/pleroma/user.ex | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/user.ex b/lib/mix/tasks/pleroma/user.ex index f6cca0d06..2487b4ab5 100644 --- a/lib/mix/tasks/pleroma/user.ex +++ b/lib/mix/tasks/pleroma/user.ex @@ -6,7 +6,6 @@ defmodule Mix.Tasks.Pleroma.User do use Mix.Task import Ecto.Changeset alias Mix.Tasks.Pleroma.Common - alias Pleroma.Repo alias Pleroma.User @shortdoc "Manages Pleroma users" @@ -23,7 +22,7 @@ defmodule Mix.Tasks.Pleroma.User do - `--password PASSWORD` - the user's password - `--moderator`/`--no-moderator` - whether the user is a moderator - `--admin`/`--no-admin` - whether the user is an admin - - `-y`, `--assume-yes`/`--no-assume-yes` - whether to assume yes to all questions + - `-y`, `--assume-yes`/`--no-assume-yes` - whether to assume yes to all questions ## Generate an invite link. @@ -202,7 +201,7 @@ defmodule Mix.Tasks.Pleroma.User do {:ok, friends} = User.get_friends(user) Enum.each(friends, fn friend -> - user = Repo.get(User, user.id) + user = User.get_by_id(user.id) Mix.shell().info("Unsubscribing #{friend.nickname} from #{user.nickname}") User.unfollow(user, friend) @@ -210,7 +209,7 @@ defmodule Mix.Tasks.Pleroma.User do :timer.sleep(500) - user = Repo.get(User, user.id) + user = User.get_by_id(user.id) if Enum.empty?(user.following) do Mix.shell().info("Successfully unsubscribed all followers from #{user.nickname}") -- cgit v1.2.3 From cd41584ac4a90a666f33786d967d37a619c67762 Mon Sep 17 00:00:00 2001 From: Sachin Joshi Date: Wed, 3 Apr 2019 00:54:16 +0545 Subject: Generate permissive or restrictive robots.txt in the config generator --- lib/mix/tasks/pleroma/instance.ex | 34 ++++++++++++++++++++++++++++++++++ lib/mix/tasks/pleroma/robots_txt.eex | 2 ++ 2 files changed, 36 insertions(+) create mode 100644 lib/mix/tasks/pleroma/robots_txt.eex (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/instance.ex b/lib/mix/tasks/pleroma/instance.ex index 1ba452275..8f8d86a11 100644 --- a/lib/mix/tasks/pleroma/instance.ex +++ b/lib/mix/tasks/pleroma/instance.ex @@ -81,6 +81,14 @@ defmodule Mix.Tasks.Pleroma.Instance do email = Common.get_option(options, :admin_email, "What is your admin email address?") + indexable = + Common.get_option( + options, + :indexable, + "Do you want search engines to index your site? (y/n)", + "y" + ) === "y" + dbhost = Common.get_option(options, :dbhost, "What is the hostname of your database?", "localhost") @@ -142,6 +150,8 @@ defmodule Mix.Tasks.Pleroma.Instance do Mix.shell().info("Writing #{psql_path}.") File.write(psql_path, result_psql) + write_robots_txt(indexable) + Mix.shell().info( "\n" <> """ @@ -163,4 +173,28 @@ defmodule Mix.Tasks.Pleroma.Instance do ) end end + + defp write_robots_txt(indexable) do + robots_txt = + EEx.eval_file( + Path.expand("robots_txt.eex", __DIR__), + indexable: indexable + ) + + static_dir = Pleroma.Config.get([:instance, :static_dir], "instance/static/") + + 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 + File.cp!(robots_txt_path, "#{robots_txt_path}.bak") + Mix.shell().info("Backing up existing robots.txt to #{robots_txt_path}.bak") + end + + File.write(robots_txt_path, robots_txt) + Mix.shell().info("Writing #{robots_txt_path}.") + end end diff --git a/lib/mix/tasks/pleroma/robots_txt.eex b/lib/mix/tasks/pleroma/robots_txt.eex new file mode 100644 index 000000000..1af3c47ee --- /dev/null +++ b/lib/mix/tasks/pleroma/robots_txt.eex @@ -0,0 +1,2 @@ +User-Agent: * +Disallow: <%= if indexable, do: "", else: "/" %> -- cgit v1.2.3 From 0484f3a8b1ae2103d1d756e5c09f2bdb218a7207 Mon Sep 17 00:00:00 2001 From: Alex S Date: Sat, 6 Apr 2019 16:58:22 +0700 Subject: generating tokens with mix --- lib/mix/tasks/pleroma/user.ex | 75 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 71 insertions(+), 4 deletions(-) (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/user.ex b/lib/mix/tasks/pleroma/user.ex index 0d0bea8c0..00a933292 100644 --- a/lib/mix/tasks/pleroma/user.ex +++ b/lib/mix/tasks/pleroma/user.ex @@ -7,6 +7,7 @@ defmodule Mix.Tasks.Pleroma.User do import Ecto.Changeset alias Mix.Tasks.Pleroma.Common alias Pleroma.User + alias Pleroma.UserInviteToken @shortdoc "Manages Pleroma users" @moduledoc """ @@ -26,7 +27,19 @@ defmodule Mix.Tasks.Pleroma.User do ## Generate an invite link. - mix pleroma.user invite + mix pleroma.user invite [OPTION...] + + Options: + - `--expire_date DATE` - last day on which token is active (e.g. "2019-04-05") + - `--max_use NUMBER` - maximum numbers of token use + + ## Generated invites list + + mix pleroma.user invites_list + + ## Revoke invite + + mix pleroma.user invite_revoke TOKEN OR TOKEN_ID ## Delete the user's account. @@ -287,11 +300,28 @@ defmodule Mix.Tasks.Pleroma.User do end end - def run(["invite"]) do + def run(["invite" | rest]) do + {options, [], []} = + OptionParser.parse(rest, + strict: [ + expire_date: :string, + max_use: :integer + ] + ) + + expire_at = + with expire_date when expire_date != nil <- Keyword.get(options, :expire_date) do + Date.from_iso8601!(expire_date) + end + + options = Keyword.put(options, :expire_at, expire_at) + Common.start_pleroma() - with {:ok, token} <- Pleroma.UserInviteToken.create_token() do - Mix.shell().info("Generated user invite token") + with {:ok, token} <- UserInviteToken.create_token(options) do + Mix.shell().info( + "Generated user invite token " <> String.replace(token.token_type, "_", " ") + ) url = Pleroma.Web.Router.Helpers.redirect_url( @@ -307,6 +337,43 @@ defmodule Mix.Tasks.Pleroma.User do end end + def run(["invites_list"]) do + Common.start_pleroma() + + Mix.shell().info("Invites list:") + + UserInviteToken.list_invites() + |> Enum.each(fn invite -> + expire_date = + case invite.expire_at do + nil -> nil + date -> " | Expire date: #{Date.to_string(date)}" + end + + using_info = + case invite.max_use do + nil -> nil + max_use -> " | Max use: #{max_use} Left use: #{max_use - invite.uses}" + end + + Mix.shell().info( + "ID: #{invite.id} | Token: #{invite.token} | Token type: #{invite.token_type} | Used: #{ + invite.used + }#{expire_date}#{using_info}" + ) + end) + end + + def run(["invite_revoke", token]) do + Common.start_pleroma() + + with {:ok, _} <- UserInviteToken.mark_as_used(token) do + Mix.shell().info("Invite for token #{token} was revoked.") + else + _ -> Mix.shell().error("No invite found with token #{token}") + end + end + def run(["delete_activities", nickname]) do Common.start_pleroma() -- cgit v1.2.3 From 47b07cec495528ce22f83ca56717cc74aa0096f3 Mon Sep 17 00:00:00 2001 From: Alex S Date: Sat, 6 Apr 2019 20:24:22 +0700 Subject: token -> invite renaming --- lib/mix/tasks/pleroma/user.ex | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/user.ex b/lib/mix/tasks/pleroma/user.ex index 00a933292..887f45029 100644 --- a/lib/mix/tasks/pleroma/user.ex +++ b/lib/mix/tasks/pleroma/user.ex @@ -315,19 +315,19 @@ defmodule Mix.Tasks.Pleroma.User do end options = Keyword.put(options, :expire_at, expire_at) - + options = Enum.into(options, %{}) Common.start_pleroma() - with {:ok, token} <- UserInviteToken.create_token(options) do + with {:ok, invite} <- UserInviteToken.create_invite(options) do Mix.shell().info( - "Generated user invite token " <> String.replace(token.token_type, "_", " ") + "Generated user invite token " <> String.replace(invite.invite_type, "_", " ") ) url = Pleroma.Web.Router.Helpers.redirect_url( Pleroma.Web.Endpoint, :registration_page, - token.token + invite.token ) IO.puts(url) @@ -367,7 +367,9 @@ defmodule Mix.Tasks.Pleroma.User do def run(["invite_revoke", token]) do Common.start_pleroma() - with {:ok, _} <- UserInviteToken.mark_as_used(token) do + invite = UserInviteToken.find_by_token!(token) + + with {:ok, _} <- UserInviteToken.update_invite(invite, %{used: true}) do Mix.shell().info("Invite for token #{token} was revoked.") else _ -> Mix.shell().error("No invite found with token #{token}") -- cgit v1.2.3 From ce8d45713287d8f1c413699385950f295085ee77 Mon Sep 17 00:00:00 2001 From: Alex S Date: Sat, 6 Apr 2019 22:38:35 +0700 Subject: little channges --- lib/mix/tasks/pleroma/user.ex | 58 +++++++++++++++++++++---------------------- 1 file changed, 29 insertions(+), 29 deletions(-) (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/user.ex b/lib/mix/tasks/pleroma/user.ex index 887f45029..80b07d1ac 100644 --- a/lib/mix/tasks/pleroma/user.ex +++ b/lib/mix/tasks/pleroma/user.ex @@ -30,16 +30,16 @@ defmodule Mix.Tasks.Pleroma.User do mix pleroma.user invite [OPTION...] Options: - - `--expire_date DATE` - last day on which token is active (e.g. "2019-04-05") - - `--max_use NUMBER` - maximum numbers of token use + - `--expire_at DATE` - last day on which token is active (e.g. "2019-04-05") + - `--max_use NUMBER` - maximum numbers of token uses - ## Generated invites list + ## List generated invites - mix pleroma.user invites_list + mix pleroma.user invites ## Revoke invite - mix pleroma.user invite_revoke TOKEN OR TOKEN_ID + mix pleroma.user revoke_invite TOKEN OR TOKEN_ID ## Delete the user's account. @@ -304,21 +304,24 @@ defmodule Mix.Tasks.Pleroma.User do {options, [], []} = OptionParser.parse(rest, strict: [ - expire_date: :string, + expire_at: :string, max_use: :integer ] ) - expire_at = - with expire_date when expire_date != nil <- Keyword.get(options, :expire_date) do - Date.from_iso8601!(expire_date) - end + options = + options + |> Keyword.update(:expire_at, {:ok, nil}, fn + nil -> {:ok, nil} + val -> Date.from_iso8601(val) + end) + |> Enum.into(%{}) - options = Keyword.put(options, :expire_at, expire_at) - options = Enum.into(options, %{}) Common.start_pleroma() - with {:ok, invite} <- UserInviteToken.create_invite(options) do + with {:ok, val} <- options[:expire_at], + options = Map.put(options, :expire_at, val), + {:ok, invite} <- UserInviteToken.create_invite(options) do Mix.shell().info( "Generated user invite token " <> String.replace(invite.invite_type, "_", " ") ) @@ -332,44 +335,41 @@ defmodule Mix.Tasks.Pleroma.User do IO.puts(url) else - _ -> - Mix.shell().error("Could not create invite token.") + error -> + Mix.shell().error("Could not create invite token: #{inspect(error)}") end end - def run(["invites_list"]) do + def run(["invites"]) do Common.start_pleroma() Mix.shell().info("Invites list:") UserInviteToken.list_invites() |> Enum.each(fn invite -> - expire_date = - case invite.expire_at do - nil -> nil - date -> " | Expire date: #{Date.to_string(date)}" + expire_info = + with expire_at when not is_nil(expire_at) <- invite.expire_at do + " | Expire at: #{Date.to_string(expire_at)}" end using_info = - case invite.max_use do - nil -> nil - max_use -> " | Max use: #{max_use} Left use: #{max_use - invite.uses}" + with max_use when not is_nil(max_use) <- invite.max_use do + " | Max use: #{max_use} Left use: #{max_use - invite.uses}" end Mix.shell().info( - "ID: #{invite.id} | Token: #{invite.token} | Token type: #{invite.token_type} | Used: #{ + "ID: #{invite.id} | Token: #{invite.token} | Token type: #{invite.invite_type} | Used: #{ invite.used - }#{expire_date}#{using_info}" + }#{expire_info}#{using_info}" ) end) end - def run(["invite_revoke", token]) do + def run(["revoke_invite", token]) do Common.start_pleroma() - invite = UserInviteToken.find_by_token!(token) - - with {:ok, _} <- UserInviteToken.update_invite(invite, %{used: true}) do + with {:ok, invite} <- UserInviteToken.find_by_token(token), + {:ok, _} <- UserInviteToken.update_invite(invite, %{used: true}) do Mix.shell().info("Invite for token #{token} was revoked.") else _ -> Mix.shell().error("No invite found with token #{token}") -- cgit v1.2.3 From 012bb5dcc9bfbf6f3ea210ec4e865f3adcea9dfd Mon Sep 17 00:00:00 2001 From: Alex S Date: Mon, 8 Apr 2019 16:01:28 +0700 Subject: renaming expire_at -> expires_at keyword style change --- lib/mix/tasks/pleroma/user.ex | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/user.ex b/lib/mix/tasks/pleroma/user.ex index 80b07d1ac..441168df2 100644 --- a/lib/mix/tasks/pleroma/user.ex +++ b/lib/mix/tasks/pleroma/user.ex @@ -30,7 +30,7 @@ defmodule Mix.Tasks.Pleroma.User do mix pleroma.user invite [OPTION...] Options: - - `--expire_at DATE` - last day on which token is active (e.g. "2019-04-05") + - `--expires_at DATE` - last day on which token is active (e.g. "2019-04-05") - `--max_use NUMBER` - maximum numbers of token uses ## List generated invites @@ -304,14 +304,14 @@ defmodule Mix.Tasks.Pleroma.User do {options, [], []} = OptionParser.parse(rest, strict: [ - expire_at: :string, + expires_at: :string, max_use: :integer ] ) options = options - |> Keyword.update(:expire_at, {:ok, nil}, fn + |> Keyword.update(:expires_at, {:ok, nil}, fn nil -> {:ok, nil} val -> Date.from_iso8601(val) end) @@ -319,8 +319,8 @@ defmodule Mix.Tasks.Pleroma.User do Common.start_pleroma() - with {:ok, val} <- options[:expire_at], - options = Map.put(options, :expire_at, val), + with {:ok, val} <- options[:expires_at], + options = Map.put(options, :expires_at, val), {:ok, invite} <- UserInviteToken.create_invite(options) do Mix.shell().info( "Generated user invite token " <> String.replace(invite.invite_type, "_", " ") @@ -348,8 +348,8 @@ defmodule Mix.Tasks.Pleroma.User do UserInviteToken.list_invites() |> Enum.each(fn invite -> expire_info = - with expire_at when not is_nil(expire_at) <- invite.expire_at do - " | Expire at: #{Date.to_string(expire_at)}" + with expires_at when not is_nil(expires_at) <- invite.expires_at do + " | Expires at: #{Date.to_string(expires_at)}" end using_info = -- cgit v1.2.3 From fe13a1d78c13fbe7b3027d442a6f6906440e5acc Mon Sep 17 00:00:00 2001 From: Alex S Date: Wed, 10 Apr 2019 17:57:41 +0700 Subject: adding notify_email setting for trigger emails --- lib/mix/tasks/pleroma/instance.ex | 17 +++++++++++++++-- lib/mix/tasks/pleroma/sample_config.eex | 2 +- 2 files changed, 16 insertions(+), 3 deletions(-) (limited to 'lib/mix/tasks') diff --git a/lib/mix/tasks/pleroma/instance.ex b/lib/mix/tasks/pleroma/instance.ex index 8f8d86a11..6cee8d630 100644 --- a/lib/mix/tasks/pleroma/instance.ex +++ b/lib/mix/tasks/pleroma/instance.ex @@ -24,10 +24,12 @@ defmodule Mix.Tasks.Pleroma.Instance do - `--domain DOMAIN` - the domain of your instance - `--instance-name INSTANCE_NAME` - the name of your instance - `--admin-email ADMIN_EMAIL` - the email address of the instance admin + - `--notify-email NOTIFY_EMAIL` - email address for notifications - `--dbhost HOSTNAME` - the hostname of the PostgreSQL database to use - `--dbname DBNAME` - the name of the database to use - `--dbuser DBUSER` - the user (aka role) to use for the database connection - `--dbpass DBPASS` - the password to use for the database connection + - `--indexable Y/N` - Allow/disallow indexing site by search engines """ def run(["gen" | rest]) do @@ -41,10 +43,12 @@ defmodule Mix.Tasks.Pleroma.Instance do domain: :string, instance_name: :string, admin_email: :string, + notify_email: :string, dbhost: :string, dbname: :string, dbuser: :string, - dbpass: :string + dbpass: :string, + indexable: :string ], aliases: [ o: :output, @@ -61,7 +65,7 @@ defmodule Mix.Tasks.Pleroma.Instance do will_overwrite = Enum.filter(paths, &File.exists?/1) proceed? = Enum.empty?(will_overwrite) or Keyword.get(options, :force, false) - unless not proceed? do + if proceed? do [domain, port | _] = String.split( Common.get_option( @@ -81,6 +85,14 @@ defmodule Mix.Tasks.Pleroma.Instance do email = Common.get_option(options, :admin_email, "What is your admin email address?") + notify_email = + Common.get_option( + options, + :notify_email, + "What email address do you want to use for sending email notifications?", + email + ) + indexable = Common.get_option( options, @@ -122,6 +134,7 @@ defmodule Mix.Tasks.Pleroma.Instance do domain: domain, port: port, email: email, + notify_email: notify_email, name: name, dbhost: dbhost, dbname: dbname, diff --git a/lib/mix/tasks/pleroma/sample_config.eex b/lib/mix/tasks/pleroma/sample_config.eex index 1c935c0d8..52bd57cb7 100644 --- a/lib/mix/tasks/pleroma/sample_config.eex +++ b/lib/mix/tasks/pleroma/sample_config.eex @@ -13,6 +13,7 @@ config :pleroma, Pleroma.Web.Endpoint, config :pleroma, :instance, name: "<%= name %>", email: "<%= email %>", + notify_email: "<%= notify_email %>", limit: 5000, registrations_open: true, dedupe_media: false @@ -75,4 +76,3 @@ config :web_push_encryption, :vapid_details, # storage_url: "https://swift-endpoint.prodider.com/v1/AUTH_/", # object_url: "https://cdn-endpoint.provider.com/" # - -- cgit v1.2.3