Merge branch 'bugfix/wrong-date-format' into 'develop'
[akkoma] / lib / mix / tasks / pleroma / instance.ex
index 639893985992fe8d5fb9c682fe1129dcfa68f8ad..1ba452275e376396ad0f15d9b6db05e2320c34c3 100644 (file)
@@ -1,14 +1,18 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
 defmodule Mix.Tasks.Pleroma.Instance do
   use Mix.Task
-  alias Pleroma.{Repo, User}
+  alias Mix.Tasks.Pleroma.Common
 
   @shortdoc "Manages Pleroma instance"
   @moduledoc """
   Manages Pleroma instance.
 
-  ## Generate a new instance.
-  
-    mix pleroma.instance new [OPTION...]
+  ## Generate a new instance config.
+
+    mix pleroma.instance gen [OPTION...]
 
   If any options are left unspecified, you will be prompted interactively
 
@@ -26,7 +30,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,57 +62,57 @@ defmodule Mix.Tasks.Pleroma.Instance do
     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()
+      [domain, port | _] =
+        String.split(
+          Common.get_option(
+            options,
+            :domain,
+            "What domain will your instance use? (e.g pleroma.soykaf.com)"
+          ),
+          ":"
+        ) ++ [443]
 
       name =
-        Keyword.get(options, :name) ||
-          Mix.shell().prompt("What is the name of your instance? (e.g. Pleroma/Soykaf)")
-          |> String.trim()
+        Common.get_option(
+          options,
+          :instance_name,
+          "What is the name of your instance? (e.g. Pleroma/Soykaf)"
+        )
 
-      email =
-        Keyword.get(options, :admin_email) ||
-          Mix.shell().prompt("What is your admin email address?")
-          |> String.trim()
+      email = Common.get_option(options, :admin_email, "What is your admin email address?")
 
       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
+        Common.get_option(options, :dbhost, "What is the hostname of your database?", "localhost")
 
       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
+        Common.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
+        Common.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
+        Common.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)
+      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 =
         EEx.eval_file(
           "sample_config.eex" |> Path.expand(__DIR__),
           domain: domain,
+          port: port,
           email: email,
           name: name,
           dbhost: dbhost,
@@ -116,7 +120,10 @@ defmodule Mix.Tasks.Pleroma.Instance do
           dbuser: dbuser,
           dbpass: dbpass,
           version: Pleroma.Mixfile.project() |> Keyword.get(:version),
-          secret: secret
+          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)
         )
 
       result_psql =
@@ -140,12 +147,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
@@ -156,9 +163,4 @@ defmodule Mix.Tasks.Pleroma.Instance do
       )
     end
   end
-
-  defp escape_sh_path(path) do
-    ~S(') <> String.replace(path, ~S('), ~S(\')) <> ~S(')
-  end
 end
-