Add read to topic permissions

Part of rabbitmq/rabbitmq-server#1085
This commit is contained in:
Arnaud Cogoluègnes 2017-01-23 10:12:03 +01:00
parent cbab77e34c
commit 57f2eff218
6 changed files with 26 additions and 24 deletions

View File

@ -29,25 +29,25 @@ defmodule RabbitMQ.CLI.Ctl.Commands.SetTopicPermissionsCommand do
def validate([], _) do
{:validation_failure, :not_enough_args}
end
def validate([_|_] = args, _) when length(args) < 3 do
def validate([_|_] = args, _) when length(args) < 4 do
{:validation_failure, :not_enough_args}
end
def validate([_|_] = args, _) when length(args) > 3 do
def validate([_|_] = args, _) when length(args) > 4 do
{:validation_failure, :too_many_args}
end
def validate(_, _), do: :ok
def run([user, exchange, pattern], %{node: node_name, vhost: vhost}) do
def run([user, exchange, writePerm, readPerm], %{node: node_name, vhost: vhost}) do
:rabbit_misc.rpc_call(node_name,
:rabbit_auth_backend_internal,
:set_topic_permissions,
[user, vhost, exchange, pattern, Helpers.cli_acting_user()]
[user, vhost, exchange, writePerm, readPerm, Helpers.cli_acting_user()]
)
end
def usage, do: "set_topic_permissions [-p <vhost>] <user> <exchange> <pattern>"
def usage, do: "set_topic_permissions [-p <vhost>] <user> <exchange> <write> <read>"
def banner([user, exchange, _], %{vhost: vhost}), do: "Setting topic permissions on \"#{exchange}\" for user \"#{user}\" in vhost \"#{vhost}\" ..."
def banner([user, exchange, _, _], %{vhost: vhost}), do: "Setting topic permissions on \"#{exchange}\" for user \"#{user}\" in vhost \"#{vhost}\" ..."
end

View File

@ -39,8 +39,8 @@ defmodule ClearTopicPermissionsTest do
end
setup context do
set_topic_permissions(@user, @specific_vhost, "amq.topic", "^a")
set_topic_permissions(@user, @specific_vhost, "topic1", "^a")
set_topic_permissions(@user, @specific_vhost, "amq.topic", "^a", "^b")
set_topic_permissions(@user, @specific_vhost, "topic1", "^a", "^b")
{
:ok,
opts: %{node: get_rabbit_hostname, vhost: context[:vhost]}

View File

@ -32,8 +32,8 @@ defmodule ListTopicPermissionsCommandTest do
add_vhost(@vhost)
add_user(@user, @password)
set_topic_permissions(@user, @vhost, "amq.topic", "^a")
set_topic_permissions(@user, @vhost, "topic1", "^a")
set_topic_permissions(@user, @vhost, "amq.topic", "^a", "^b")
set_topic_permissions(@user, @vhost, "topic1", "^a", "^b")
on_exit([], fn ->
clear_topic_permissions(@user, @vhost)
@ -82,8 +82,8 @@ defmodule ListTopicPermissionsCommandTest do
permissions = @command.run([], Map.merge(context[:opts], %{vhost: @vhost}))
assert Enum.count(permissions) == 2
assert Enum.sort(permissions) == [
[user: @user, exchange: "amq.topic", pattern: "^a"],
[user: @user, exchange: "topic1", pattern: "^a"]
[user: @user, exchange: "amq.topic", write: "^a", read: "^b"],
[user: @user, exchange: "topic1", write: "^a", read: "^b"]
]
end

View File

@ -24,8 +24,8 @@ defmodule ListUserTopicPermissionsCommandTest do
RabbitMQ.CLI.Core.Distribution.start()
:net_kernel.connect_node(get_rabbit_hostname)
set_topic_permissions("guest", "/", "amq.topic", "^a")
set_topic_permissions("guest", "/", "topic1", "^a")
set_topic_permissions("guest", "/", "amq.topic", "^a", "^b")
set_topic_permissions("guest", "/", "topic1", "^a", "^b")
on_exit([], fn ->
clear_topic_permissions("guest", "/")

View File

@ -63,7 +63,8 @@ defmodule SetTopicPermissionsCommandTest do
assert @command.validate([], %{}) == {:validation_failure, :not_enough_args}
assert @command.validate(["insufficient"], %{}) == {:validation_failure, :not_enough_args}
assert @command.validate(["not", "enough"], %{}) == {:validation_failure, :not_enough_args}
assert @command.validate(["this", "is", "too", "many"], %{}) == {:validation_failure, :too_many_args}
assert @command.validate(["still", "not", "enough"], %{}) == {:validation_failure, :not_enough_args}
assert @command.validate(["this", "is", "way", "too", "many"], %{}) == {:validation_failure, :too_many_args}
end
@tag user: @user, vhost: @vhost
@ -71,11 +72,12 @@ defmodule SetTopicPermissionsCommandTest do
vhost_opts = Map.merge(context[:opts], %{vhost: context[:vhost]})
assert @command.run(
[context[:user], "amq.topic", "^a"],
[context[:user], "amq.topic", "^a", "^b"],
vhost_opts
) == :ok
assert List.first(list_user_topic_permissions(context[:user]))[:pattern] == "^a"
assert List.first(list_user_topic_permissions(context[:user]))[:write] == "^a"
assert List.first(list_user_topic_permissions(context[:user]))[:read] == "^b"
end
test "run: throws a badrpc when instructed to contact an unreachable RabbitMQ node" do
@ -83,13 +85,13 @@ defmodule SetTopicPermissionsCommandTest do
:net_kernel.connect_node(target)
opts = %{node: target, vhost: @vhost}
assert @command.run([@user, "amq.topic", "^a"], opts) == {:badrpc, :nodedown}
assert @command.run([@user, "amq.topic", "^a", "^b"], opts) == {:badrpc, :nodedown}
end
@tag user: "interloper", vhost: @root
test "run: an invalid user returns a no-such-user error", context do
assert @command.run(
[context[:user], "amq.topic", "^a"],
[context[:user], "amq.topic", "^a", "^b"],
context[:opts]
) == {:error, {:no_such_user, context[:user]}}
end
@ -99,7 +101,7 @@ defmodule SetTopicPermissionsCommandTest do
vhost_opts = Map.merge(context[:opts], %{vhost: context[:vhost]})
assert @command.run(
[context[:user], "amq.topic", "^a"],
[context[:user], "amq.topic", "^a", "^b"],
vhost_opts
) == {:error, {:no_such_vhost, context[:vhost]}}
@ -110,7 +112,7 @@ defmodule SetTopicPermissionsCommandTest do
test "run: invalid regex patterns return error", context do
n = Enum.count(list_user_topic_permissions(context[:user]))
{:error, {:invalid_regexp, _, _}} = @command.run(
[context[:user], "amq.topic", "["],
[context[:user], "amq.topic", "[", "^b"],
context[:opts]
)
assert Enum.count(list_user_topic_permissions(context[:user])) == n
@ -120,7 +122,7 @@ defmodule SetTopicPermissionsCommandTest do
test "banner", context do
vhost_opts = Map.merge(context[:opts], %{vhost: context[:vhost]})
assert @command.banner([context[:user], "amq.topic", "^a"], vhost_opts)
assert @command.banner([context[:user], "amq.topic", "^a", "^b"], vhost_opts)
=~ ~r/Setting topic permissions on \"amq.topic\" for user \"#{context[:user]}\" in vhost \"#{context[:vhost]}\" \.\.\./
end
end

View File

@ -174,12 +174,12 @@ defmodule TestHelper do
)
end
def set_topic_permissions(user, vhost, exchange, pattern) do
def set_topic_permissions(user, vhost, exchange, writePerm, readPerm) do
:rpc.call(
get_rabbit_hostname,
:rabbit_auth_backend_internal,
:set_topic_permissions,
[user, vhost, exchange, pattern, "acting-user"],
[user, vhost, exchange, writePerm, readPerm, "acting-user"],
:infinity
)
end