See #5957. CLI command to generate hashed password from cleartext password

This commit is contained in:
Simon Unge 2023-01-23 09:45:50 -08:00
parent 9db9db46cc
commit 67bc94ed16
3 changed files with 104 additions and 0 deletions

View File

@ -0,0 +1,46 @@
## This Source Code Form is subject to the terms of the Mozilla Public
## License, v. 2.0. If a copy of the MPL was not distributed with this
## file, You can obtain one at https://mozilla.org/MPL/2.0/.
##
## Copyright (c) 2007-2023 VMware, Inc. or its affiliates. All rights reserved.
defmodule RabbitMQ.CLI.Ctl.Commands.HashPasswordCommand do
@behaviour RabbitMQ.CLI.CommandBehaviour
use RabbitMQ.CLI.Core.MergesNoDefaults
def run([cleartextpassword], %{node: node_name}) do
r =
:rabbit_misc.rpc_call(
node_name,
:rabbit_password,
:hash,
[cleartextpassword]
)
Base.encode64(r)
end
def validate(args, _options) when length(args) > 1 do
{:validation_failure, :too_many_args}
end
def validate(args, _options) when length(args) < 1 do
{:validation_failure, :not_enough_args}
end
def validate([""], _options) do
{:bad_argument, "password cannot be an empty string"}
end
def validate([_arg], _options) do
:ok
end
use RabbitMQ.CLI.DefaultOutput
def usage, do: "hash_password <cleartext_password>"
def banner([arg], _options),
do: "Will hash password #{arg}"
end

View File

@ -0,0 +1,51 @@
## This Source Code Form is subject to the terms of the Mozilla Public
## License, v. 2.0. If a copy of the MPL was not distributed with this
## file, You can obtain one at https://mozilla.org/MPL/2.0/.
##
## Copyright (c) 2007-2020 VMware, Inc. or its affiliates. All rights reserved.
defmodule HashPasswordCommandTest do
use ExUnit.Case, async: false
import TestHelper
@command RabbitMQ.CLI.Ctl.Commands.HashPasswordCommand
setup_all do
RabbitMQ.CLI.Core.Distribution.start()
:ok
end
setup context do
on_exit(context, fn -> delete_user(context[:user]) end)
{:ok, opts: %{node: get_rabbit_hostname()}}
end
test "validate: too many arguments", context do
assert @command.validate(["foo", "bar"], context[:opts]) ==
{:validation_failure, :too_many_args}
end
test "validate: too few arguments", context do
assert @command.validate([], context[:opts]) == {:validation_failure, :not_enough_args}
end
test "validate: empty string", context do
assert @command.validate([""], context[:opts]) ==
{:bad_argument, "password cannot be an empty string"}
end
@tag user: "someone", password: "hashed_password"
test "run: successfully create user with a hashed password from cli cmd", context do
hashed_pwd = @command.run([context[:password]], context[:opts])
add_user_hashed_password(context[:user], hashed_pwd)
assert {:ok, _} = authenticate_user(context[:user], context[:password])
end
@tag user: "someone", password: "hashed_password"
test "run: Create user with a hashed password from cli cmd, use hashed pwd as cleartest password",
context do
hashed_pwd = @command.run([context[:password]], context[:opts])
add_user_hashed_password(context[:user], hashed_pwd)
assert {:refused, _, _, _} = authenticate_user(context[:user], hashed_pwd)
end
end

View File

@ -73,6 +73,13 @@ defmodule TestHelper do
])
end
def add_user_hashed_password(name, hash_password) do
:rpc.call(get_rabbit_hostname(), :rabbit_auth_backend_internal, :put_user, [
%{:name => name, :password_hash => hash_password, :tags => "administrator"},
"acting-user"
])
end
def delete_user(name) do
:rpc.call(get_rabbit_hostname(), :rabbit_auth_backend_internal, :delete_user, [
name,