37 lines
995 B
Elixir
37 lines
995 B
Elixir
|
defmodule Mix.Tasks.Phx.Gen.Secret do
|
||
|
@shortdoc "Generates a secret"
|
||
|
|
||
|
@moduledoc """
|
||
|
Generates a secret and prints it to the terminal.
|
||
|
|
||
|
$ mix phx.gen.secret [length]
|
||
|
|
||
|
By default, mix phx.gen.secret generates a key 64 characters long.
|
||
|
|
||
|
The minimum value for `length` is 32.
|
||
|
"""
|
||
|
use Mix.Task
|
||
|
|
||
|
@doc false
|
||
|
def run([]), do: run(["64"])
|
||
|
def run([int]), do: int |> parse!() |> random_string() |> Mix.shell().info()
|
||
|
def run([_|_]), do: invalid_args!()
|
||
|
|
||
|
defp parse!(int) do
|
||
|
case Integer.parse(int) do
|
||
|
{int, ""} -> int
|
||
|
_ -> invalid_args!()
|
||
|
end
|
||
|
end
|
||
|
|
||
|
defp random_string(length) when length > 31 do
|
||
|
:crypto.strong_rand_bytes(length) |> Base.encode64(padding: false) |> binary_part(0, length)
|
||
|
end
|
||
|
defp random_string(_), do: Mix.raise "The secret should be at least 32 characters long"
|
||
|
|
||
|
@spec invalid_args!() :: no_return()
|
||
|
defp invalid_args! do
|
||
|
Mix.raise "mix phx.gen.secret expects a length as integer or no argument at all"
|
||
|
end
|
||
|
end
|