From e94192d1fa38f5741e51aa620fe6fc907b993fdb Mon Sep 17 00:00:00 2001 From: firest Date: Mon, 25 Sep 2023 11:36:17 +0800 Subject: [PATCH] fix(sso): refactor the `admins` CLI 1. revert the opensource version 2. allow delete the SSO user via CLI --- .../src/emqx_dashboard_admin.erl | 4 +- .../emqx_dashboard/src/emqx_dashboard_cli.erl | 75 +++++++------------ .../src/emqx_dashboard_sso_cli.erl | 60 +++++++++++++++ 3 files changed, 89 insertions(+), 50 deletions(-) create mode 100644 apps/emqx_dashboard_sso/src/emqx_dashboard_sso_cli.erl diff --git a/apps/emqx_dashboard/src/emqx_dashboard_admin.erl b/apps/emqx_dashboard/src/emqx_dashboard_admin.erl index cf05b1f9f..e77204541 100644 --- a/apps/emqx_dashboard/src/emqx_dashboard_admin.erl +++ b/apps/emqx_dashboard/src/emqx_dashboard_admin.erl @@ -212,8 +212,8 @@ add_user_(Username, Password, Role, Desc) -> mnesia:abort(<<"username_already_exist">>) end. --spec remove_user(binary()) -> {ok, any()} | {error, any()}. -remove_user(Username) when is_binary(Username) -> +-spec remove_user(dashboard_username()) -> {ok, any()} | {error, any()}. +remove_user(Username) -> Trans = fun() -> case lookup_user(Username) of [] -> mnesia:abort(<<"username_not_found">>); diff --git a/apps/emqx_dashboard/src/emqx_dashboard_cli.erl b/apps/emqx_dashboard/src/emqx_dashboard_cli.erl index 3da3e822d..ec197fdb0 100644 --- a/apps/emqx_dashboard/src/emqx_dashboard_cli.erl +++ b/apps/emqx_dashboard/src/emqx_dashboard_cli.erl @@ -24,9 +24,26 @@ unload/0 ]). -load() -> - emqx_ctl:register_command(admins, {?MODULE, admins}, []). +-export([bin/1, print_error/1]). +-if(?EMQX_RELEASE_EDITION == ee). +-define(CLI_MOD, emqx_dashboard_sso_cli). +-else. +-define(CLI_MOD, ?MODULE). +-endif. + +load() -> + emqx_ctl:register_command(admins, {?CLI_MOD, admins}, []). + +admins(["add", Username, Password]) -> + admins(["add", Username, Password, ""]); +admins(["add", Username, Password, Desc]) -> + case emqx_dashboard_admin:add_user(bin(Username), bin(Password), ?ROLE_DEFAULT, bin(Desc)) of + {ok, _} -> + emqx_ctl:print("ok~n"); + {error, Reason} -> + print_error(Reason) + end; admins(["passwd", Username, Password]) -> case emqx_dashboard_admin:change_password(bin(Username), bin(Password)) of {ok, _} -> @@ -41,8 +58,14 @@ admins(["del", Username]) -> {error, Reason} -> print_error(Reason) end; -admins(Args) -> - inner_admins(Args). +admins(_) -> + emqx_ctl:usage( + [ + {"admins add ", "Add dashboard user"}, + {"admins passwd ", "Reset dashboard user password"}, + {"admins del ", "Delete dashboard user"} + ] + ). unload() -> emqx_ctl:unregister_command(admins). @@ -54,47 +77,3 @@ print_error(Reason) when is_binary(Reason) -> %% Maybe has more types of error, but there is only binary now. So close it for dialyzer. % print_error(Reason) -> % emqx_ctl:print("Error: ~p~n", [Reason]). - --if(?EMQX_RELEASE_EDITION == ee). -usage() -> - [ - {"admins add ", "Add dashboard user"}, - {"admins passwd ", "Reset dashboard user password"}, - {"admins del ", "Delete dashboard user"} - ]. - -inner_admins(["add", Username, Password]) -> - inner_admins(["add", Username, Password, ?ROLE_SUPERUSER]); -inner_admins(["add", Username, Password, Role]) -> - inner_admins(["add", Username, Password, Role, ""]); -inner_admins(["add", Username, Password, Role, Desc]) -> - case emqx_dashboard_admin:add_user(bin(Username), bin(Password), bin(Role), bin(Desc)) of - {ok, _} -> - emqx_ctl:print("ok~n"); - {error, Reason} -> - print_error(Reason) - end; -inner_admins(_) -> - emqx_ctl:usage(usage()). --else. - -usage() -> - [ - {"admins add ", "Add dashboard user"}, - {"admins passwd ", "Reset dashboard user password"}, - {"admins del ", "Delete dashboard user"} - ]. - -inner_admins(["add", Username, Password]) -> - inner_admins(["add", Username, Password, ""]); -inner_admins(["add", Username, Password, Desc]) -> - case emqx_dashboard_admin:add_user(bin(Username), bin(Password), ?ROLE_SUPERUSER, bin(Desc)) of - {ok, _} -> - emqx_ctl:print("ok~n"); - {error, Reason} -> - print_error(Reason) - end; -inner_admins(_) -> - emqx_ctl:usage(usage()). - --endif. diff --git a/apps/emqx_dashboard_sso/src/emqx_dashboard_sso_cli.erl b/apps/emqx_dashboard_sso/src/emqx_dashboard_sso_cli.erl new file mode 100644 index 000000000..308d37f5c --- /dev/null +++ b/apps/emqx_dashboard_sso/src/emqx_dashboard_sso_cli.erl @@ -0,0 +1,60 @@ +%%-------------------------------------------------------------------- +%% Copyright (c) 2023 EMQ Technologies Co., Ltd. All Rights Reserved. +%%-------------------------------------------------------------------- + +-module(emqx_dashboard_sso_cli). + +-include_lib("emqx_dashboard/include/emqx_dashboard.hrl"). + +-export([admins/1]). + +-import(emqx_dashboard_cli, [bin/1, print_error/1]). + +admins(["add", Username, Password]) -> + admins(["add", Username, Password, ""]); +admins(["add", Username, Password, Desc]) -> + case emqx_dashboard_admin:add_user(bin(Username), bin(Password), ?ROLE_DEFAULT, bin(Desc)) of + {ok, _} -> + emqx_ctl:print("ok~n"); + {error, Reason} -> + print_error(Reason) + end; +admins(["add", Username, Password, Desc, Role]) -> + case emqx_dashboard_admin:add_user(bin(Username), bin(Password), bin(Role), bin(Desc)) of + {ok, _} -> + emqx_ctl:print("ok~n"); + {error, Reason} -> + print_error(Reason) + end; +admins(["passwd", Username, Password]) -> + case emqx_dashboard_admin:change_password(bin(Username), bin(Password)) of + {ok, _} -> + emqx_ctl:print("ok~n"); + {error, Reason} -> + print_error(Reason) + end; +admins(["del", Username]) -> + case emqx_dashboard_admin:remove_user(bin(Username)) of + {ok, _} -> + emqx_ctl:print("ok~n"); + {error, Reason} -> + print_error(Reason) + end; +admins(["del", Username, Backend]) -> + case emqx_dashboard_admin:remove_user(?SSO_USERNAME(atom(Backend), bin(Username))) of + {ok, _} -> + emqx_ctl:print("ok~n"); + {error, Reason} -> + print_error(Reason) + end; +admins(_) -> + emqx_ctl:usage( + [ + {"admins add ", "Add dashboard user"}, + {"admins passwd ", "Reset dashboard user password"}, + {"admins del ", "Delete dashboard user"} + ] + ). + +atom(S) -> + erlang:list_to_atom(S).