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
 |