]> granicus.if.org Git - icinga2/commitdiff
Fix HTTP handlers
authorGunnar Beutner <gunnar@beutner.name>
Wed, 29 Jul 2015 11:39:58 +0000 (13:39 +0200)
committerGunnar Beutner <gunnar@beutner.name>
Wed, 29 Jul 2015 11:39:58 +0000 (13:39 +0200)
refs #9768

lib/remote/configfileshandler.cpp
lib/remote/configmoduleshandler.cpp
lib/remote/configstageshandler.cpp
lib/remote/filterutility.cpp
lib/remote/httputility.cpp
lib/remote/httputility.hpp

index 5d11cd0902d81478e27e0df43cce963ea168ad95..fb59c4b3b8862079e41a332901593b397863d8f8 100644 (file)
@@ -55,15 +55,15 @@ void ConfigFilesHandler::HandleGet(const ApiUser::Ptr& user, HttpRequest& reques
                params->Set("path", boost::algorithm::join(tmpPath, "/"));
        }
 
-       String moduleName = params->Get("module");
-       String stageName = params->Get("stage");
+       String moduleName = HttpUtility::GetLastParameter(params, "module");
+       String stageName = HttpUtility::GetLastParameter(params, "stage");
 
        if (!ConfigModuleUtility::ValidateName(moduleName) || !ConfigModuleUtility::ValidateName(stageName)) {
                response.SetStatus(403, "Forbidden");
                return;
        }
 
-       String relativePath = params->Get("path");
+       String relativePath = HttpUtility::GetLastParameter(params, "path");
 
        if (ConfigModuleUtility::ContainsDotDot(relativePath)) {
                response.SetStatus(403, "Forbidden");
index 738f84f85c50ab462cbbcf9a7f1b920c1d08530b..ef8b9491c8987400e1319fc3fbb761f9f13fb7c1 100644 (file)
@@ -71,7 +71,7 @@ void ConfigModulesHandler::HandlePost(const ApiUser::Ptr& user, HttpRequest& req
        if (request.RequestUrl->GetPath().size() >= 4)
                params->Set("module", request.RequestUrl->GetPath()[3]);
 
-       String moduleName = params->Get("module");
+       String moduleName = HttpUtility::GetLastParameter(params, "module");
 
        if (!ConfigModuleUtility::ValidateName(moduleName)) {
                response.SetStatus(403, "Forbidden");
@@ -111,7 +111,7 @@ void ConfigModulesHandler::HandleDelete(const ApiUser::Ptr& user, HttpRequest& r
        if (request.RequestUrl->GetPath().size() >= 4)
                params->Set("module", request.RequestUrl->GetPath()[3]);
 
-       String moduleName = params->Get("module");
+       String moduleName = HttpUtility::GetLastParameter(params, "module");
 
        if (!ConfigModuleUtility::ValidateName(moduleName)) {
                response.SetStatus(403, "Forbidden");
index ca7d26039591bdaa6720b41d4a88ad732b911767..3d42271dc741c87db1006e245cb063c17df7f7f1 100644 (file)
@@ -55,8 +55,8 @@ void ConfigStagesHandler::HandleGet(const ApiUser::Ptr& user, HttpRequest& reque
        if (request.RequestUrl->GetPath().size() >= 5)
                params->Set("stage", request.RequestUrl->GetPath()[4]);
 
-       String moduleName = params->Get("module");
-       String stageName = params->Get("stage");
+       String moduleName = HttpUtility::GetLastParameter(params, "module");
+       String stageName = HttpUtility::GetLastParameter(params, "stage");
 
        if (!ConfigModuleUtility::ValidateName(moduleName) || !ConfigModuleUtility::ValidateName(stageName)) {
                response.SetStatus(403, "Forbidden");
@@ -91,7 +91,7 @@ void ConfigStagesHandler::HandlePost(const ApiUser::Ptr& user, HttpRequest& requ
        if (request.RequestUrl->GetPath().size() >= 4)
                params->Set("module", request.RequestUrl->GetPath()[3]);
 
-       String moduleName = params->Get("module");
+       String moduleName = HttpUtility::GetLastParameter(params, "module");
 
        if (!ConfigModuleUtility::ValidateName(moduleName)) {
                response.SetStatus(403, "Forbidden");
@@ -144,8 +144,8 @@ void ConfigStagesHandler::HandleDelete(const ApiUser::Ptr& user, HttpRequest& re
        if (request.RequestUrl->GetPath().size() >= 5)
                params->Set("stage", request.RequestUrl->GetPath()[4]);
 
-       String moduleName = params->Get("module");
-       String stageName = params->Get("stage");
+       String moduleName = HttpUtility::GetLastParameter(params, "module");
+       String stageName = HttpUtility::GetLastParameter(params, "stage");
 
        if (!ConfigModuleUtility::ValidateName(moduleName) || !ConfigModuleUtility::ValidateName(stageName)) {
                response.SetStatus(403, "Forbidden");
index 5da79384ba444f31fe25ecdb8f8e1c6feb136c86..26d893cfb928e8c51c442a519636589d99d5dcd5 100644 (file)
  ******************************************************************************/
 
 #include "remote/filterutility.hpp"
+#include "remote/httputility.hpp"
 #include "config/configcompiler.hpp"
 #include "config/expression.hpp"
 #include "base/json.hpp"
 #include "base/dynamictype.hpp"
+#include "base/logger.hpp"
 #include <boost/foreach.hpp>
 #include <boost/algorithm/string.hpp>
 
@@ -99,8 +101,10 @@ std::vector<DynamicObject::Ptr> FilterUtility::GetFilterTargets(const QueryDescr
                if (!query->Contains("type"))
                        BOOST_THROW_EXCEPTION(std::invalid_argument("Type must be specified when using a filter."));
 
-               String filter = query->Get("filter");
-               String type = query->Get("type");
+               String filter = HttpUtility::GetLastParameter(query, "filter");
+               String type = HttpUtility::GetLastParameter(query, "type");
+
+               Log(LogInformation, "FilterUtility", filter);
 
                Type::Ptr utype = Type::GetByName(type);
 
index a0f0d5f2641339490e11165bd2e70ccb94871157..fd9b33fcaba7441b948ab84d86a19e3a312dfec9 100644 (file)
@@ -56,4 +56,17 @@ void HttpUtility::SendJsonBody(HttpResponse& response, const Value& val)
        response.WriteBody(body.CStr(), body.GetLength());
 }
 
+String HttpUtility::GetLastParameter(const Dictionary::Ptr& params, const String& key)
+{
+       Value varr = params->Get(key);
+
+       if (!varr.IsObjectType<Array>())
+               return varr;
 
+       Array::Ptr arr = varr;
+
+       if (arr->GetLength() == 0)
+               return String();
+       else
+               return arr->Get(arr->GetLength() - 1);
+}
index 48f27368a691bc1086123690a6b086508f3d8e08..7553642e5258f268d6db2cf030f3261408c5321d 100644 (file)
@@ -38,6 +38,7 @@ class I2_REMOTE_API HttpUtility
 public:
        static Dictionary::Ptr FetchRequestParameters(HttpRequest& request);
        static void SendJsonBody(HttpResponse& response, const Value& val);
+       static String GetLastParameter(const Dictionary::Ptr& params, const String& key);
 };
 
 }