fix: banned api rfc time & login hidden error type (#5681)

This commit is contained in:
DDDHuang 2021-09-08 17:53:52 +08:00 committed by GitHub
parent 242214988f
commit e2d9d9bfcb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 45 additions and 30 deletions

View File

@ -37,6 +37,7 @@
, delete/1 , delete/1
, info/1 , info/1
, format/1 , format/1
, parse/1
]). ]).
%% gen_server callbacks %% gen_server callbacks
@ -107,6 +108,33 @@ format(#banned{who = Who0,
until => to_rfc3339(Until) until => to_rfc3339(Until)
}. }.
parse(Params) ->
Who = pares_who(Params),
By = maps:get(<<"by">>, Params, <<"mgmt_api">>),
Reason = maps:get(<<"reason">>, Params, <<"">>),
At = pares_time(maps:get(<<"at">>, Params, undefined), erlang:system_time(second)),
Until = pares_time(maps:get(<<"until">>, Params, undefined), At + 5 * 60),
#banned{
who = Who,
by = By,
reason = Reason,
at = At,
until = Until
}.
pares_who(#{as := As, who := Who}) ->
pares_who(#{<<"as">> => As, <<"who">> => Who});
pares_who(#{<<"as">> := <<"peerhost">>, <<"who">> := Peerhost0}) ->
{ok, Peerhost} = inet:parse_address(binary_to_list(Peerhost0)),
{peerhost, Peerhost};
pares_who(#{<<"as">> := As, <<"who">> := Who}) ->
{binary_to_atom(As, utf8), Who}.
pares_time(undefined, Default) ->
Default;
pares_time(Rfc3339, _Default) ->
to_timestamp(Rfc3339).
maybe_format_host({peerhost, Host}) -> maybe_format_host({peerhost, Host}) ->
AddrBinary = list_to_binary(inet:ntoa(Host)), AddrBinary = list_to_binary(inet:ntoa(Host)),
{peerhost, AddrBinary}; {peerhost, AddrBinary};
@ -116,6 +144,11 @@ maybe_format_host({As, Who}) ->
to_rfc3339(Timestamp) -> to_rfc3339(Timestamp) ->
list_to_binary(calendar:system_time_to_rfc3339(Timestamp, [{unit, second}])). list_to_binary(calendar:system_time_to_rfc3339(Timestamp, [{unit, second}])).
to_timestamp(Rfc3339) when is_binary(Rfc3339) ->
to_timestamp(binary_to_list(Rfc3339));
to_timestamp(Rfc3339) ->
calendar:rfc3339_to_system_time(Rfc3339, [{unit, second}]).
-spec(create(emqx_types:banned() | map()) -> ok). -spec(create(emqx_types:banned() | map()) -> ok).
create(#{who := Who, create(#{who := Who,
by := By, by := By,
@ -130,12 +163,16 @@ create(#{who := Who,
create(Banned) when is_record(Banned, banned) -> create(Banned) when is_record(Banned, banned) ->
ekka_mnesia:dirty_write(?BANNED_TAB, Banned). ekka_mnesia:dirty_write(?BANNED_TAB, Banned).
look_up(Who) when is_map(Who) ->
look_up(pares_who(Who));
look_up(Who) -> look_up(Who) ->
mnesia:dirty_read(?BANNED_TAB, Who). mnesia:dirty_read(?BANNED_TAB, Who).
-spec(delete({clientid, emqx_types:clientid()} -spec(delete({clientid, emqx_types:clientid()}
| {username, emqx_types:username()} | {username, emqx_types:username()}
| {peerhost, emqx_types:peerhost()}) -> ok). | {peerhost, emqx_types:peerhost()}) -> ok).
delete(Who) when is_map(Who)->
delete(pares_who(Who));
delete(Who) -> delete(Who) ->
ekka_mnesia:dirty_delete(?BANNED_TAB, Who). ekka_mnesia:dirty_delete(?BANNED_TAB, Who).

View File

@ -49,6 +49,8 @@
-define(EMPTY(V), (V == undefined orelse V == <<>>)). -define(EMPTY(V), (V == undefined orelse V == <<>>)).
-define(ERROR_USERNAME_OR_PWD, 'ERROR_USERNAME_OR_PWD').
api_spec() -> api_spec() ->
{[ login_api() {[ login_api()
, logout_api() , logout_api()
@ -164,8 +166,8 @@ login(post, #{body := Params}) ->
{ok, Token} -> {ok, Token} ->
Version = iolist_to_binary(proplists:get_value(version, emqx_sys:info())), Version = iolist_to_binary(proplists:get_value(version, emqx_sys:info())),
{200, #{token => Token, version => Version, license => #{edition => ?RELEASE}}}; {200, #{token => Token, version => Version, license => #{edition => ?RELEASE}}};
{error, Code} -> {error, _} ->
{401, #{code => Code, message => <<"Auth filed">>}} {401, #{code => ?ERROR_USERNAME_OR_PWD, message => <<"Auth filed">>}}
end. end.
logout(_, #{body := Params}) -> logout(_, #{body := Params}) ->
@ -233,7 +235,7 @@ parameters() ->
unauthorized_request() -> unauthorized_request() ->
object_schema( object_schema(
properties([{message, string}, properties([{message, string},
{code, string, <<"Resp Code">>, ['PASSWORD_ERROR','USERNAME_ERROR']} {code, string, <<"Resp Code">>, [?ERROR_USERNAME_OR_PWD]}
]), ]),
<<"Unauthorized">> <<"Unauthorized">>
). ).

View File

@ -101,44 +101,20 @@ banned(get, #{query_string := Params}) ->
Response = emqx_mgmt_api:paginate(?TAB, Params, fun format/1), Response = emqx_mgmt_api:paginate(?TAB, Params, fun format/1),
{200, Response}; {200, Response};
banned(post, #{body := Body}) -> banned(post, #{body := Body}) ->
Banned = trans_param(Body), _ = emqx_banned:create(emqx_banned:parse(Body)),
_ = emqx_banned:create(Banned),
{200}. {200}.
delete_banned(delete, #{bindings := Params}) -> delete_banned(delete, #{bindings := Params}) ->
Who = trans_who(Params), case emqx_banned:look_up(Params) of
case emqx_banned:look_up(Who) of
[] -> [] ->
As0 = maps:get(as, Params), As0 = maps:get(as, Params),
Who0 = maps:get(who, Params), Who0 = maps:get(who, Params),
Message = list_to_binary(io_lib:format("~p: ~p not found", [As0, Who0])), Message = list_to_binary(io_lib:format("~p: ~p not found", [As0, Who0])),
{404, #{code => 'RESOURCE_NOT_FOUND', message => Message}}; {404, #{code => 'RESOURCE_NOT_FOUND', message => Message}};
_ -> _ ->
ok = emqx_banned:delete(Who), ok = emqx_banned:delete(Params),
{200} {200}
end. end.
trans_param(Params) ->
Who = trans_who(Params),
By = maps:get(<<"by">>, Params, <<"mgmt_api">>),
Reason = maps:get(<<"reason">>, Params, <<"">>),
At = maps:get(<<"at">>, Params, erlang:system_time(second)),
Until = maps:get(<<"until">>, Params, At + 5 * 60),
#banned{
who = Who,
by = By,
reason = Reason,
at = At,
until = Until
}.
trans_who(#{as := As, who := Who}) ->
trans_who(#{<<"as">> => As, <<"who">> => Who});
trans_who(#{<<"as">> := <<"peerhost">>, <<"who">> := Peerhost0}) ->
{ok, Peerhost} = inet:parse_address(binary_to_list(Peerhost0)),
{peerhost, Peerhost};
trans_who(#{<<"as">> := As, <<"who">> := Who}) ->
{binary_to_atom(As, utf8), Who}.
format(Banned) -> format(Banned) ->
emqx_banned:format(Banned). emqx_banned:format(Banned).