summaryrefslogtreecommitdiff
path: root/deps/rabbit/src/internal_user_v1.erl
diff options
context:
space:
mode:
Diffstat (limited to 'deps/rabbit/src/internal_user_v1.erl')
-rw-r--r--deps/rabbit/src/internal_user_v1.erl151
1 files changed, 151 insertions, 0 deletions
diff --git a/deps/rabbit/src/internal_user_v1.erl b/deps/rabbit/src/internal_user_v1.erl
new file mode 100644
index 0000000000..edb956436f
--- /dev/null
+++ b/deps/rabbit/src/internal_user_v1.erl
@@ -0,0 +1,151 @@
+%% 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) 2020 VMware, Inc. or its affiliates. All rights reserved.
+%%
+
+-module(internal_user_v1).
+
+-include_lib("rabbit_common/include/rabbit.hrl").
+
+-export([
+ new/0,
+ new/1,
+ record_version_to_use/0,
+ fields/0,
+ fields/1,
+ upgrade/1,
+ upgrade_to/2,
+ pattern_match_all/0,
+ get_username/1,
+ get_password_hash/1,
+ get_tags/1,
+ get_hashing_algorithm/1,
+ get_limits/1,
+ create_user/3,
+ set_password_hash/3,
+ set_tags/2,
+ update_limits/3,
+ clear_limits/1
+]).
+
+-define(record_version, ?MODULE).
+
+-record(internal_user, {
+ username :: internal_user:username() | '_',
+ password_hash :: internal_user:password_hash() | '_',
+ tags :: [atom()] | '_',
+ %% password hashing implementation module,
+ %% typically rabbit_password_hashing_* but can
+ %% come from a plugin
+ hashing_algorithm :: atom() | '_'}).
+
+-type internal_user() :: internal_user_v1().
+
+-type(internal_user_v1() ::
+ #internal_user{username :: internal_user:username(),
+ password_hash :: internal_user:password_hash(),
+ tags :: [atom()],
+ hashing_algorithm :: atom()}).
+
+-type internal_user_pattern() :: internal_user_v1_pattern().
+
+-type internal_user_v1_pattern() :: #internal_user{
+ username :: internal_user:username() | '_',
+ password_hash :: '_',
+ tags :: '_',
+ hashing_algorithm :: '_'
+ }.
+
+-export_type([internal_user/0,
+ internal_user_v1/0,
+ internal_user_pattern/0,
+ internal_user_v1_pattern/0]).
+
+-spec record_version_to_use() -> internal_user_v1.
+record_version_to_use() ->
+ ?record_version.
+
+-spec new() -> internal_user().
+new() ->
+ #internal_user{
+ username = <<"">>,
+ password_hash = <<"">>,
+ tags = []
+ }.
+
+-spec new(tuple()) -> internal_user().
+new({hashing_algorithm, HashingAlgorithm}) ->
+ #internal_user{
+ username = <<"">>,
+ password_hash = <<"">>,
+ hashing_algorithm = HashingAlgorithm,
+ tags = []
+ };
+new({tags, Tags}) ->
+ #internal_user{
+ username = <<"">>,
+ password_hash = <<"">>,
+ tags = Tags
+ }.
+
+-spec fields() -> list().
+fields() -> fields(?record_version).
+
+-spec fields(atom()) -> list().
+fields(?record_version) -> record_info(fields, internal_user).
+
+-spec upgrade(internal_user()) -> internal_user().
+upgrade(#internal_user{} = User) -> User.
+
+-spec upgrade_to(internal_user_v1, internal_user()) -> internal_user().
+upgrade_to(?record_version, #internal_user{} = User) ->
+ User.
+
+-spec pattern_match_all() -> internal_user_pattern().
+pattern_match_all() -> #internal_user{_ = '_'}.
+
+-spec get_username(internal_user()) -> internal_user:username().
+get_username(#internal_user{username = Value}) -> Value.
+
+-spec get_password_hash(internal_user()) -> internal_user:password_hash().
+get_password_hash(#internal_user{password_hash = Value}) -> Value.
+
+-spec get_tags(internal_user()) -> [atom()].
+get_tags(#internal_user{tags = Value}) -> Value.
+
+-spec get_hashing_algorithm(internal_user()) -> atom().
+get_hashing_algorithm(#internal_user{hashing_algorithm = Value}) -> Value.
+
+-spec get_limits(internal_user()) -> map().
+get_limits(_User) -> #{}.
+
+-spec create_user(internal_user:username(), internal_user:password_hash(),
+ atom()) -> internal_user().
+create_user(Username, PasswordHash, HashingMod) ->
+ #internal_user{username = Username,
+ password_hash = PasswordHash,
+ tags = [],
+ hashing_algorithm = HashingMod
+ }.
+
+-spec set_password_hash(internal_user:internal_user(),
+ internal_user:password_hash(), atom()) -> internal_user().
+set_password_hash(#internal_user{} = User, PasswordHash, HashingAlgorithm) ->
+ User#internal_user{password_hash = PasswordHash,
+ hashing_algorithm = HashingAlgorithm}.
+
+-spec set_tags(internal_user(), [atom()]) -> internal_user().
+set_tags(#internal_user{} = User, Tags) ->
+ User#internal_user{tags = Tags}.
+
+-spec update_limits
+(add, internal_user(), map()) -> internal_user();
+(remove, internal_user(), term()) -> internal_user().
+update_limits(_, User, _) ->
+ User.
+
+-spec clear_limits(internal_user()) -> internal_user().
+clear_limits(User) ->
+ User.