]> granicus.if.org Git - ejabberd/commitdiff
Catch exceptions from acl:add_list in web admin
authorPaweł Chmielowski <pchmielowski@process-one.net>
Thu, 4 May 2017 09:18:16 +0000 (11:18 +0200)
committerPaweł Chmielowski <pchmielowski@process-one.net>
Thu, 4 May 2017 10:01:22 +0000 (12:01 +0200)
src/acl.erl
src/ejabberd_web_admin.erl

index 3e0617f5565bcefd16dcb155d3967c55355b9071..2d848b99b4a247c8b1f9d9db1e94511323367f45 100644 (file)
@@ -266,24 +266,42 @@ normalize_spec(Spec) ->
     case Spec of
         all -> all;
         none -> none;
-        {acl, N} -> {acl, N};
-        {user, {U, S}} -> {user, {nodeprep(U), nameprep(S)}};
-        {user, U} -> {user, split_user_server(U, fun nodeprep/1, fun nameprep/1)};
-        {shared_group, {G, H}} -> {shared_group, {b(G), nameprep(H)}};
-        {shared_group, G} -> {shared_group, split_user_server(G, fun b/1, fun nameprep/1)};
-        {user_regexp, {UR, S}} -> {user_regexp, {b(UR), nameprep(S)}};
-        {user_regexp, UR} -> {user_regexp, split_user_server(UR, fun b/1, fun nameprep/1)};
-        {node_regexp, {UR, SR}} -> {node_regexp, {b(UR), b(SR)}};
-        {user_glob, {UR, S}} -> {user_glob, {b(UR), nameprep(S)}};
-        {user_glob, UR} -> {user_glob, split_user_server(UR, fun b/1, fun nameprep/1)};
-        {node_glob, {UR, SR}} -> {node_glob, {b(UR), b(SR)}};
-        {server, S} -> {server, nameprep(S)};
-        {resource, R} -> {resource, resourceprep(R)};
-        {server_regexp, SR} -> {server_regexp, b(SR)};
-        {resource_regexp, R} -> {resource_regexp, b(R)};
-        {server_glob, S} -> {server_glob, b(S)};
-        {resource_glob, R} -> {resource_glob, b(R)};
-        {ip, {Net, Mask}} -> {ip, {Net, Mask}};
+       {acl, N} when is_atom(N) ->
+           {acl, N};
+       {user, {U, S}} when is_binary(U), is_binary(S) ->
+           {user, {nodeprep(U), nameprep(S)}};
+       {user, U} when is_binary(U) ->
+           {user, split_user_server(U, fun nodeprep/1, fun nameprep/1)};
+       {shared_group, {G, H}} when is_binary(G), is_binary(H) ->
+           {shared_group, {b(G), nameprep(H)}};
+       {shared_group, G} when is_binary(G) ->
+           {shared_group, split_user_server(G, fun b/1, fun nameprep/1)};
+       {user_regexp, {UR, S}} when is_binary(UR), is_binary(S) ->
+           {user_regexp, {b(UR), nameprep(S)}};
+       {user_regexp, UR} when is_binary(UR) ->
+           {user_regexp, split_user_server(UR, fun b/1, fun nameprep/1)};
+       {node_regexp, {UR, SR}} when is_binary(UR), is_binary(SR) ->
+           {node_regexp, {b(UR), b(SR)}};
+       {user_glob, {UR, S}} when is_binary(UR), is_binary(S) ->
+           {user_glob, {b(UR), nameprep(S)}};
+       {user_glob, UR} when is_binary(UR) ->
+           {user_glob, split_user_server(UR, fun b/1, fun nameprep/1)};
+       {node_glob, {UR, SR}} when is_binary(UR), is_binary(SR) ->
+           {node_glob, {b(UR), b(SR)}};
+       {server, S} when is_binary(S) ->
+           {server, nameprep(S)};
+       {resource, R} when is_binary(R) ->
+           {resource, resourceprep(R)};
+       {server_regexp, SR} when is_binary(SR) ->
+           {server_regexp, b(SR)};
+       {resource_regexp, R} when is_binary(R) ->
+           {resource_regexp, b(R)};
+       {server_glob, S} when is_binary(S) ->
+           {server_glob, b(S)};
+       {resource_glob, R} when is_binary(R) ->
+           {resource_glob, b(R)};
+       {ip, {Net, Mask}} when is_binary(Net), is_integer(Mask) ->
+           {ip, {Net, Mask}};
         {ip, S} ->
             case parse_ip_netmask(b(S)) of
                 {ok, Net, Mask} ->
@@ -291,7 +309,9 @@ normalize_spec(Spec) ->
                 error ->
                     ?INFO_MSG("Invalid network address: ~p", [S]),
                     none
-            end
+           end;
+       BadVal ->
+           throw({<<"Invalid acl value">>, BadVal})
     end.
 
 -spec any_rules_allowed(global | binary(), [access_name()],
index f4186b3e5d00a45d04da75250958306186c68f23..0106bb9cd0141362ebb19f0ab0c8b3eb0be3e681 100644 (file)
@@ -740,7 +740,10 @@ process_admin(Host,
                  {ok, Tokens, _} ->
                      case erl_parse:parse_term(Tokens) of
                        {ok, NewACLs} ->
-                            acl:add_list(Host, NewACLs, true);
+                           case catch acl:add_list(Host, NewACLs, true) of
+                               ok -> ok;
+                               _ -> error
+                           end;
                        _ -> error
                      end;
                  _ -> error
@@ -779,8 +782,11 @@ process_admin(Host,
                case catch acl_parse_query(Host, Query) of
                  {'EXIT', _} -> error;
                  NewACLs ->
-                     ?INFO_MSG("NewACLs at ~s: ~p", [Host, NewACLs]),
-                     acl:add_list(Host, NewACLs, true)
+                       ?INFO_MSG("NewACLs at ~s: ~p", [Host, NewACLs]),
+                       case catch acl:add_list(Host, NewACLs, true) of
+                           ok -> ok;
+                           _ -> error
+                       end
                end;
            _ -> nothing
          end,