fix(api_key): set api_key unexpired when update expired_at=undefined

This commit is contained in:
zhongwencool 2021-12-31 14:42:09 +08:00
parent 54ea7a5871
commit 87bff075ad
3 changed files with 18 additions and 10 deletions

View File

@ -139,13 +139,7 @@ api_key(post, #{body := App}) ->
<<"desc">> := Desc0, <<"desc">> := Desc0,
<<"enable">> := Enable <<"enable">> := Enable
} = App, } = App,
%% undefined is never expired ExpiredAt = ensure_expired_at(App),
ExpiredAt0 = maps:get(<<"expired_at">>, App, <<"undefined">>),
ExpiredAt =
case ExpiredAt0 of
<<"undefined">> -> undefined;
_ -> ExpiredAt0
end,
Desc = unicode:characters_to_binary(Desc0, unicode), Desc = unicode:characters_to_binary(Desc0, unicode),
case emqx_mgmt_auth:create(Name, Enable, ExpiredAt, Desc) of case emqx_mgmt_auth:create(Name, Enable, ExpiredAt, Desc) of
{ok, NewApp} -> {200, format(NewApp)}; {ok, NewApp} -> {200, format(NewApp)};
@ -164,7 +158,7 @@ api_key_by_name(delete, #{bindings := #{name := Name}}) ->
end; end;
api_key_by_name(put, #{bindings := #{name := Name}, body := Body}) -> api_key_by_name(put, #{bindings := #{name := Name}, body := Body}) ->
Enable = maps:get(<<"enable">>, Body, undefined), Enable = maps:get(<<"enable">>, Body, undefined),
ExpiredAt = maps:get(<<"expired_at">>, Body, undefined), ExpiredAt = ensure_expired_at(Body),
Desc = maps:get(<<"desc">>, Body, undefined), Desc = maps:get(<<"desc">>, Body, undefined),
case emqx_mgmt_auth:update(Name, Enable, ExpiredAt, Desc) of case emqx_mgmt_auth:update(Name, Enable, ExpiredAt, Desc) of
{ok, App} -> {200, format(App)}; {ok, App} -> {200, format(App)};
@ -181,3 +175,6 @@ format(App = #{expired_at := ExpiredAt0, created_at := CreateAt}) ->
expired_at => ExpiredAt, expired_at => ExpiredAt,
created_at => list_to_binary(calendar:system_time_to_rfc3339(CreateAt)) created_at => list_to_binary(calendar:system_time_to_rfc3339(CreateAt))
}. }.
ensure_expired_at(#{<<"expired_at">> := ExpiredAt})when is_integer(ExpiredAt) -> ExpiredAt;
ensure_expired_at(_) -> undefined.

View File

@ -68,11 +68,11 @@ update(Name, Enable, ExpiredAt, Desc) ->
Fun = fun() -> Fun = fun() ->
case mnesia:read(?APP, Name, write) of case mnesia:read(?APP, Name, write) of
[] -> mnesia:abort(not_found); [] -> mnesia:abort(not_found);
[App0 = #?APP{enable = Enable0, expired_at = ExpiredAt0, desc = Desc0}] -> [App0 = #?APP{enable = Enable0, desc = Desc0}] ->
App = App =
App0#?APP{ App0#?APP{
expired_at = ExpiredAt,
enable = ensure_not_undefined(Enable, Enable0), enable = ensure_not_undefined(Enable, Enable0),
expired_at = ensure_not_undefined(ExpiredAt, ExpiredAt0),
desc = ensure_not_undefined(Desc, Desc0) desc = ensure_not_undefined(Desc, Desc0)
}, },
ok = mnesia:write(App), ok = mnesia:write(App),

View File

@ -96,6 +96,13 @@ t_update(_Config) ->
?assertEqual(calendar:rfc3339_to_system_time(binary_to_list(ExpiredAt)), ?assertEqual(calendar:rfc3339_to_system_time(binary_to_list(ExpiredAt)),
calendar:rfc3339_to_system_time(binary_to_list(maps:get(<<"expired_at">>, Update1))) calendar:rfc3339_to_system_time(binary_to_list(maps:get(<<"expired_at">>, Update1)))
), ),
Unexpired1 = maps:without([expired_at], Change),
{ok, Update2} = update_app(Name, Unexpired1),
?assertEqual(<<"undefined">>, maps:get(<<"expired_at">>, Update2)),
Unexpired2 = Change#{expired_at => <<"undefined">>},
{ok, Update3} = update_app(Name, Unexpired2),
?assertEqual(<<"undefined">>, maps:get(<<"expired_at">>, Update3)),
?assertEqual({error, {"HTTP/1.1", 404, "Not Found"}}, update_app(<<"Not-Exist">>, Change)), ?assertEqual({error, {"HTTP/1.1", 404, "Not Found"}}, update_app(<<"Not-Exist">>, Change)),
ok. ok.
@ -137,6 +144,10 @@ t_authorize(_Config) ->
}, },
?assertMatch({ok, #{<<"api_key">> := _, <<"enable">> := true}}, update_app(Name, Expired)), ?assertMatch({ok, #{<<"api_key">> := _, <<"enable">> := true}}, update_app(Name, Expired)),
?assertEqual(Unauthorized, emqx_mgmt_api_test_util:request_api(get, BanPath, BasicHeader)), ?assertEqual(Unauthorized, emqx_mgmt_api_test_util:request_api(get, BanPath, BasicHeader)),
UnExpired = #{expired_at => undefined},
?assertMatch({ok, #{<<"api_key">> := _, <<"expired_at">> := <<"undefined">>}},
update_app(Name, UnExpired)),
{ok, _Status1} = emqx_mgmt_api_test_util:request_api(get, BanPath, BasicHeader),
ok. ok.
t_create_unexpired_app(_Config) -> t_create_unexpired_app(_Config) ->