Просмотр исходного кода

Merge branch 'resync-apps-from-426' into chore-sync-apps-resync-4.2.6

Zaiming Shi 5 лет назад
Родитель
Сommit
4103a7292a
2 измененных файлов с 30 добавлено и 5 удалено
  1. 29 4
      apps/emqx_auth_mnesia/src/emqx_auth_mnesia.erl
  2. 1 1
      sync-apps.sh

+ 29 - 4
apps/emqx_auth_mnesia/src/emqx_auth_mnesia.erl

@@ -63,10 +63,8 @@ check(ClientInfo = #{ clientid := Clientid
             emqx_metrics:inc(?AUTH_METRICS(ignore)),
             emqx_metrics:inc(?AUTH_METRICS(ignore)),
             ok;
             ok;
         List ->
         List ->
-            case [ Hash  || <<Salt:4/binary, Hash/binary>> <- lists:sort(fun emqx_auth_mnesia_cli:comparing/2, List),
-                            Hash =:= hash(NPassword, Salt, HashType)
-                 ] of
-                [] ->
+            case match_password(NPassword, HashType, List)  of
+                false ->
                     ?LOG(error, "[Mnesia] Auth from mnesia failed: ~p", [ClientInfo]),
                     ?LOG(error, "[Mnesia] Auth from mnesia failed: ~p", [ClientInfo]),
                     emqx_metrics:inc(?AUTH_METRICS(failure)),
                     emqx_metrics:inc(?AUTH_METRICS(failure)),
                     {stop, AuthResult#{anonymous => false, auth_result => password_error}};
                     {stop, AuthResult#{anonymous => false, auth_result => password_error}};
@@ -78,7 +76,34 @@ check(ClientInfo = #{ clientid := Clientid
 
 
 description() -> "Authentication with Mnesia".
 description() -> "Authentication with Mnesia".
 
 
+match_password(Password, HashType, HashList) ->
+    lists:any(
+      fun(Secret) ->
+        case is_salt_hash(Secret, HashType) of
+            true ->
+                <<Salt:4/binary, Hash/binary>> = Secret,
+                Hash =:= hash(Password, Salt, HashType);
+            _ ->
+                Secret =:= hash(Password, HashType)
+        end
+      end, HashList).
+
+hash(undefined, HashType) ->
+    hash(<<>>, HashType);
+hash(Password, HashType) ->
+    emqx_passwd:hash(HashType, Password).
+
 hash(undefined, SaltBin, HashType) ->
 hash(undefined, SaltBin, HashType) ->
     hash(<<>>, SaltBin, HashType);
     hash(<<>>, SaltBin, HashType);
 hash(Password, SaltBin, HashType) ->
 hash(Password, SaltBin, HashType) ->
     emqx_passwd:hash(HashType, <<SaltBin/binary, Password/binary>>).
     emqx_passwd:hash(HashType, <<SaltBin/binary, Password/binary>>).
+
+is_salt_hash(_, plain) ->
+    true;
+is_salt_hash(Secret, HashType) ->
+    not (byte_size(Secret) == len(HashType)).
+
+len(md5) -> 32;
+len(sha) -> 40;
+len(sha256) -> 64;
+len(sha512) -> 128.

+ 1 - 1
sync-apps.sh

@@ -78,7 +78,7 @@ extract_zip(){
     mv "apps/${repo}-${vsn}/" "apps/$app/"
     mv "apps/${repo}-${vsn}/" "apps/$app/"
 }
 }
 
 
-extract_zip "emqx_auth_mnesia" "e4.2.2" "e4.2.2"
+extract_zip "emqx_auth_mnesia" "e4.2.3" "e4.2.3"
 for app in ${apps[@]}; do
 for app in ${apps[@]}; do
     extract_zip "$app" "$default_vsn"
     extract_zip "$app" "$default_vsn"
 done
 done