/
phx.gen.secret.ex
36 lines (28 loc) · 977 Bytes
/
phx.gen.secret.ex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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 |> 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