mirror of
https://github.com/bonfire-networks/bonfire-app.git
synced 2024-05-17 00:22:40 +00:00
46 lines
1.1 KiB
Elixir
Executable file
46 lines
1.1 KiB
Elixir
Executable file
defmodule Mix.Tasks.Bonfire.Secrets do
|
|
@shortdoc "Generates some secrets"
|
|
|
|
@moduledoc """
|
|
Generates secrets and prints to the terminal.
|
|
mix secrets [length]
|
|
By default, it generates keys 64 characters long.
|
|
The minimum value for `length` is 32.
|
|
"""
|
|
use Mix.Task
|
|
|
|
# for running as escript
|
|
def main(args) do
|
|
run(args)
|
|
end
|
|
|
|
@doc false
|
|
def run([]), do: run(["64"])
|
|
|
|
def run([int]),
|
|
do: int |> parse!() |> random_string() |> Kernel.<>("\r\n") |> IO.puts()
|
|
|
|
def run([int, iterate]), do: for(_ <- 1..parse!(iterate), do: run([int]))
|
|
def run(args), do: invalid_args!(args)
|
|
|
|
defp parse!(int) do
|
|
case Integer.parse(int) do
|
|
{int, ""} -> int
|
|
_ -> invalid_args!(int)
|
|
end
|
|
end
|
|
|
|
defp random_string(length) when length > 31 do
|
|
:crypto.strong_rand_bytes(length)
|
|
|> Base.encode64()
|
|
|> binary_part(0, length)
|
|
end
|
|
|
|
defp random_string(_),
|
|
do: raise("Secrets should be at least 32 characters long")
|
|
|
|
defp invalid_args!(args) do
|
|
raise "Expected a length as integer or no argument at all, got #{inspect(args)}"
|
|
end
|
|
end
|