]> granicus.if.org Git - icinga2/commitdiff
API: Fix that /v1 returns html if json is requested
authorMichael Friedrich <michael.friedrich@netways.de>
Wed, 11 May 2016 08:28:44 +0000 (10:28 +0200)
committerMichael Friedrich <michael.friedrich@netways.de>
Wed, 15 Jun 2016 15:46:09 +0000 (17:46 +0200)
fixes #10570

lib/remote/infohandler.cpp

index 058ca51de322e010082becb87b296c27e085be76..04c0c90f46e9aa3ee2a037b0da655b9d6c239ca4 100644 (file)
@@ -42,43 +42,63 @@ bool InfoHandler::HandleRequest(const ApiUser::Ptr& user, HttpRequest& request,
                return false;
 
        response.SetStatus(200, "OK");
-       response.AddHeader("Content-Type", "text/html");
-
-       String body = "<html><head><title>Icinga 2</title></head><h1>Hello from Icinga 2!</h1>";
-       body += "<p>You are authenticated as <b>" + user->GetName() + "</b>. ";
-
-       bool has_permissions = false;
-       String perm_info;
 
+       std::vector<String> permInfo;
        Array::Ptr permissions = user->GetPermissions();
+
        if (permissions) {
                ObjectLock olock(permissions);
                BOOST_FOREACH(const Value& permission, permissions) {
-                       has_permissions = true;
-
                        String name;
-                       bool has_filter = false;
+                       bool hasFilter = false;
                        if (permission.IsObjectType<Dictionary>()) {
                                Dictionary::Ptr dpermission = permission;
                                name = dpermission->Get("permission");
-                               has_filter = dpermission->Contains("filter");
+                               hasFilter = dpermission->Contains("filter");
                        } else
                                name = permission;
 
-                       perm_info += "<li>" + name;
-                       if (has_filter)
-                               perm_info += " (filtered)";
-                       perm_info += "</li>";
+                       if (hasFilter)
+                               name += " (filtered)";
+
+                       permInfo.push_back(name);
                }
        }
 
-       if (has_permissions)
-               body += "Your user has the following permissions:</p> <ul>" + perm_info + "</ul>";
-       else
-               body += "Your user does not have any permissions.</p>";
+       if (request.Headers->Get("accept") == "application/json") {
+               Dictionary::Ptr result1 = new Dictionary();
+
+               result1->Set("user", user->GetName());
+               result1->Set("permissions", Array::FromVector(permInfo));
+               result1->Set("info", "More information about API requests is available in the documentation at http://docs.icinga.org/icinga2/latest.");
+
+               Array::Ptr results = new Array();
+               results->Add(result1);
 
-       body += "<p>More information about API requests is available in the <a href=\"http://docs.icinga.org/icinga2/latest\" target=\"_blank\">documentation</a>.</p></html>";
-       response.WriteBody(body.CStr(), body.GetLength());
+               Dictionary::Ptr result = new Dictionary();
+               result->Set("results", results);
+
+               HttpUtility::SendJsonBody(response, result);
+       } else {
+               response.AddHeader("Content-Type", "text/html");
+
+               String body = "<html><head><title>Icinga 2</title></head><h1>Hello from Icinga 2!</h1>";
+               body += "<p>You are authenticated as <b>" + user->GetName() + "</b>. ";
+
+               if (!permInfo.empty()) {
+                       body += "Your user has the following permissions:</p> <ul>";
+
+                       BOOST_FOREACH(const String& perm, permInfo) {
+                               body += "<li>" + perm + "</li>";
+                       }
+
+                       body += "</ul>";
+               } else
+                       body += "Your user does not have any permissions.</p>";
+
+               body += "<p>More information about API requests is available in the <a href=\"http://docs.icinga.org/icinga2/latest\" target=\"_blank\">documentation</a>.</p></html>";
+               response.WriteBody(body.CStr(), body.GetLength());
+       }
 
        return true;
 }