Merge branch 'develop' into 'develop'
[akkoma] / lib / mix / tasks / pleroma / instance.ex
index 6a85880bfcf2221717f8e2ebb0dc634ef70423a8..02e1ce27dfc6130abcf1fc551b4edb514ae18c86 100644 (file)
@@ -1,6 +1,6 @@
 defmodule Mix.Tasks.Pleroma.Instance do
   use Mix.Task
-  alias Pleroma.{Repo, User}
+  alias Mix.Tasks.Pleroma.Common
 
   @shortdoc "Manages Pleroma instance"
   @moduledoc """
@@ -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,
@@ -58,24 +58,33 @@ defmodule Mix.Tasks.Pleroma.Instance do
     proceed? = Enum.empty?(will_overwrite) or Keyword.get(options, :force, false)
 
     unless not proceed? do
-      domain =
-        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 =
-        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 +92,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?",
@@ -92,11 +101,13 @@ 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(
           "sample_config.eex" |> Path.expand(__DIR__),
           domain: domain,
+          port: port,
           email: email,
           name: name,
           dbhost: dbhost,
@@ -104,7 +115,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 =
@@ -128,12 +141,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
@@ -144,22 +157,4 @@ 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