]> granicus.if.org Git - ejabberd/commitdiff
Improve error handling
authorMickael Remond <mremond@process-one.net>
Sun, 31 Jul 2016 20:48:24 +0000 (22:48 +0200)
committerMickael Remond <mremond@process-one.net>
Sun, 31 Jul 2016 20:48:24 +0000 (22:48 +0200)
src/ejabberd_admin.erl
src/ejabberd_commands.erl
src/mod_http_api.erl

index 2c4d5ed6d3c0fb96b9bc6b2b3ef7ad4a16caf4bb..615459f77cf2fd7e9791bcc7b0b5229199c105cb 100644 (file)
@@ -87,6 +87,7 @@ get_commands_spec() ->
                        args = [], result = {res, rescode}},
      #ejabberd_commands{name = reopen_log, tags = [logs, server],
                        desc = "Reopen the log files",
+                       policy = admin,
                        module = ?MODULE, function = reopen_log,
                        args = [], result = {res, rescode}},
      #ejabberd_commands{name = rotate_log, tags = [logs, server],
index d9497322f5b0bec2b32b3a831e4ae3b0be1268f7..a8b3e25ab82efa6878c8264fae4541dcbdc4af99 100644 (file)
@@ -425,7 +425,7 @@ get_command_definition(Name, Version) ->
                          {V, C}
                  end)))) of
         [{_, Command} | _ ] -> Command;
-        _E -> throw(unknown_command)
+        _E -> throw({error, unknown_command})
     end.
 
 -spec get_commands_definition(integer()) -> [ejabberd_commands()].
index cda4d6059eb8c97c2348a1a2f407bcdb07adf56f..d33fb7a7fbb99b3d34006aad5645fb7ed6c93ba7 100644 (file)
@@ -213,11 +213,7 @@ process(_, #request{method = 'POST', data = <<>>}) ->
 process([Call], #request{method = 'POST', data = Data, ip = {IP, _} = IPPort} = Req) ->
     Version = get_api_version(Req),
     try
-        Args = case jiffy:decode(Data) of
-            List when is_list(List) -> List;
-            {List} when is_list(List) -> List;
-            Other -> [Other]
-        end,
+        Args = extract_args(Data),
         log(Call, Args, IPPort),
         case check_permissions(Req, Call) of
             {allowed, Cmd, Auth} ->
@@ -227,10 +223,14 @@ process([Call], #request{method = 'POST', data = Data, ip = {IP, _} = IPPort} =
             ErrorResponse ->
                 ErrorResponse
         end
-    catch _:{error,{_,invalid_json}} = _Err ->
-           ?DEBUG("Bad Request: ~p", [_Err]),
-           badrequest_response(<<"Invalid JSON input">>);
-         _:_Error ->
+    catch
+        %% TODO We need to refactor to remove redundant error return formatting
+        throw:{error, unknown_command} ->
+            {404, 40, <<"Command not found.">>};
+        _:{error,{_,invalid_json}} = _Err ->
+            ?DEBUG("Bad Request: ~p", [_Err]),
+            badrequest_response(<<"Invalid JSON input">>);
+          _:_Error ->
             ?DEBUG("Bad Request: ~p ~p", [_Error, erlang:get_stacktrace()]),
             badrequest_response()
     end;
@@ -250,7 +250,12 @@ process([Call], #request{method = 'GET', q = Data, ip = IP} = Req) ->
             ErrorResponse ->
                 ErrorResponse
         end
-    catch _:_Error ->
+    catch
+        %% TODO We need to refactor to remove redundant error return formatting
+        throw:{error, unknown_command} ->
+            {404, 40, <<"Command not found.">>};
+        _:_Error ->
+
         ?DEBUG("Bad Request: ~p ~p", [_Error, erlang:get_stacktrace()]),
         badrequest_response()
     end;
@@ -260,6 +265,15 @@ process(_Path, Request) ->
     ?DEBUG("Bad Request: no handler ~p", [Request]),
     badrequest_response().
 
+%% Be tolerant to make API more easily usable from command-line pipe.
+extract_args(<<"\n">>) -> [];
+extract_args(Data) ->
+    case jiffy:decode(Data) of
+        List when is_list(List) -> List;
+        {List} when is_list(List) -> List;
+        Other -> [Other]
+    end.
+
 % get API version N from last "vN" element in URL path
 get_api_version(#request{path = Path}) ->
     get_api_version(lists:reverse(Path));