Browse Source

Merge pull request #11653 from thalesmg/fix-dash-rbac-dialyzer-error-m-20230921

chore: fix dialyzer errors on ce version
Thales Macedo Garitezi 2 years ago
parent
commit
76f614e9c5

+ 5 - 0
apps/emqx_dashboard/src/emqx_dashboard.erl

@@ -210,6 +210,11 @@ filter_false(K, V, S) -> [{K, V} | S].
 listener_name(Protocol) ->
     list_to_atom(atom_to_list(Protocol) ++ ":dashboard").
 
+-if(?EMQX_RELEASE_EDITION =/= ee).
+%% dialyzer complains about the `unauthorized_role' clause...
+-dialyzer({no_match, [authorize/1]}).
+-endif.
+
 authorize(Req) ->
     case cowboy_req:parse_header(<<"authorization">>, Req) of
         {basic, Username, Password} ->

+ 4 - 0
apps/emqx_dashboard/src/emqx_dashboard_admin.erl

@@ -374,6 +374,10 @@ sign_token(Username, Password) ->
             Error
     end.
 
+-spec verify_token(_, Token :: binary()) ->
+    Result ::
+        {ok, binary()}
+        | {error, token_timeout | not_found | unauthorized_role}.
 verify_token(Req, Token) ->
     emqx_dashboard_token:verify(Req, Token).
 

+ 26 - 20
apps/emqx_dashboard/src/emqx_dashboard_token.erl

@@ -122,23 +122,16 @@ do_sign(#?ADMIN{username = Username} = User, Password) ->
     _ = mria:transaction(?DASHBOARD_SHARD, fun mnesia:write/1, [JWTRec]),
     {ok, Token}.
 
+-spec do_verify(_, Token :: binary()) ->
+    Result ::
+        {ok, binary()}
+        | {error, token_timeout | not_found | unauthorized_role}.
 do_verify(Req, Token) ->
     case lookup(Token) of
-        {ok, JWT = #?ADMIN_JWT{exptime = ExpTime, extra = Extra, username = Username}} ->
+        {ok, JWT = #?ADMIN_JWT{exptime = ExpTime, extra = _Extra, username = _Username}} ->
             case ExpTime > erlang:system_time(millisecond) of
                 true ->
-                    case check_rbac(Req, Extra) of
-                        true ->
-                            NewJWT = JWT#?ADMIN_JWT{exptime = jwt_expiration_time()},
-                            {atomic, Res} = mria:transaction(
-                                ?DASHBOARD_SHARD,
-                                fun mnesia:write/1,
-                                [NewJWT]
-                            ),
-                            {Res, Username};
-                        _ ->
-                            {error, unauthorized_role}
-                    end;
+                    check_rbac(Req, JWT);
                 _ ->
                     {error, token_timeout}
             end;
@@ -254,15 +247,28 @@ clean_expired_jwt(Now) ->
     ok = destroy(JWTList).
 
 -if(?EMQX_RELEASE_EDITION == ee).
-check_rbac(Req, Extra) ->
-    emqx_dashboard_rbac:check_rbac(Req, Extra).
+check_rbac(Req, JWT) ->
+    #?ADMIN_JWT{exptime = _ExpTime, extra = Extra, username = _Username} = JWT,
+    case emqx_dashboard_rbac:check_rbac(Req, Extra) of
+        true ->
+            save_new_jwt(JWT);
+        _ ->
+            {error, unauthorized_role}
+    end.
 
 -else.
 
--dialyzer({nowarn_function, [check_rbac/2]}).
--dialyzer({no_match, [do_verify/2]}).
-
-check_rbac(_Req, _Extra) ->
-    true.
+check_rbac(_Req, JWT) ->
+    save_new_jwt(JWT).
 
 -endif.
+
+save_new_jwt(OldJWT) ->
+    #?ADMIN_JWT{exptime = _ExpTime, extra = _Extra, username = Username} = OldJWT,
+    NewJWT = OldJWT#?ADMIN_JWT{exptime = jwt_expiration_time()},
+    {atomic, Res} = mria:transaction(
+        ?DASHBOARD_SHARD,
+        fun mnesia:write/1,
+        [NewJWT]
+    ),
+    {Res, Username}.