REGISTER_URLHANDLER("/v1/actions", ActionsHandler);
-bool ActionsHandler::HandleRequest(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response)
+bool ActionsHandler::HandleRequest(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response, const Dictionary::Ptr& params)
{
if (request.RequestUrl->GetPath().size() != 3)
return false;
QueryDescription qd;
- Dictionary::Ptr params = HttpUtility::FetchRequestParameters(request);
-
const std::vector<String>& types = action->GetTypes();
std::vector<Value> objs;
public:
DECLARE_PTR_TYPEDEFS(ActionsHandler);
- virtual bool HandleRequest(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response) override;
+ virtual bool HandleRequest(const ApiUser::Ptr& user, HttpRequest& request,
+ HttpResponse& response, const Dictionary::Ptr& params) override;
};
}
REGISTER_URLHANDLER("/v1/config/files", ConfigFilesHandler);
-bool ConfigFilesHandler::HandleRequest(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response)
+bool ConfigFilesHandler::HandleRequest(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response, const Dictionary::Ptr& params)
{
if (request.RequestMethod != "GET")
return false;
- Dictionary::Ptr params = HttpUtility::FetchRequestParameters(request);
-
const std::vector<String>& urlPath = request.RequestUrl->GetPath();
if (urlPath.size() >= 4)
public:
DECLARE_PTR_TYPEDEFS(ConfigFilesHandler);
- virtual bool HandleRequest(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response) override;
+ virtual bool HandleRequest(const ApiUser::Ptr& user, HttpRequest& request,
+ HttpResponse& response, const Dictionary::Ptr& params) override;
};
}
REGISTER_URLHANDLER("/v1/config/packages", ConfigPackagesHandler);
-bool ConfigPackagesHandler::HandleRequest(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response)
+bool ConfigPackagesHandler::HandleRequest(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response, const Dictionary::Ptr& params)
{
if (request.RequestUrl->GetPath().size() > 4)
return false;
if (request.RequestMethod == "GET")
HandleGet(user, request, response);
else if (request.RequestMethod == "POST")
- HandlePost(user, request, response);
+ HandlePost(user, request, response, params);
else if (request.RequestMethod == "DELETE")
- HandleDelete(user, request, response);
+ HandleDelete(user, request, response, params);
else
return false;
HttpUtility::SendJsonBody(response, result);
}
-void ConfigPackagesHandler::HandlePost(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response)
+void ConfigPackagesHandler::HandlePost(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response, const Dictionary::Ptr& params)
{
FilterUtility::CheckPermission(user, "config/modify");
- Dictionary::Ptr params = HttpUtility::FetchRequestParameters(request);
-
if (request.RequestUrl->GetPath().size() >= 4)
params->Set("package", request.RequestUrl->GetPath()[3]);
HttpUtility::SendJsonBody(response, result);
}
-void ConfigPackagesHandler::HandleDelete(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response)
+void ConfigPackagesHandler::HandleDelete(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response, const Dictionary::Ptr& params)
{
FilterUtility::CheckPermission(user, "config/modify");
- Dictionary::Ptr params = HttpUtility::FetchRequestParameters(request);
-
if (request.RequestUrl->GetPath().size() >= 4)
params->Set("package", request.RequestUrl->GetPath()[3]);
public:
DECLARE_PTR_TYPEDEFS(ConfigPackagesHandler);
- virtual bool HandleRequest(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response) override;
+ virtual bool HandleRequest(const ApiUser::Ptr& user, HttpRequest& request,
+ HttpResponse& response, const Dictionary::Ptr& params) override;
private:
- void HandleGet(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response);
- void HandlePost(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response);
- void HandleDelete(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response);
+ void HandleGet(const ApiUser::Ptr& user, HttpRequest& request,
+ HttpResponse& response);
+ void HandlePost(const ApiUser::Ptr& user, HttpRequest& request,
+ HttpResponse& response, const Dictionary::Ptr& params);
+ void HandleDelete(const ApiUser::Ptr& user, HttpRequest& request,
+ HttpResponse& response, const Dictionary::Ptr& params);
};
REGISTER_URLHANDLER("/v1/config/stages", ConfigStagesHandler);
-bool ConfigStagesHandler::HandleRequest(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response)
+bool ConfigStagesHandler::HandleRequest(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response, const Dictionary::Ptr& params)
{
if (request.RequestUrl->GetPath().size() > 5)
return false;
if (request.RequestMethod == "GET")
- HandleGet(user, request, response);
+ HandleGet(user, request, response, params);
else if (request.RequestMethod == "POST")
- HandlePost(user, request, response);
+ HandlePost(user, request, response, params);
else if (request.RequestMethod == "DELETE")
- HandleDelete(user, request, response);
+ HandleDelete(user, request, response, params);
else
return false;
return true;
}
-void ConfigStagesHandler::HandleGet(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response)
+void ConfigStagesHandler::HandleGet(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response, const Dictionary::Ptr& params)
{
FilterUtility::CheckPermission(user, "config/query");
- Dictionary::Ptr params = HttpUtility::FetchRequestParameters(request);
-
if (request.RequestUrl->GetPath().size() >= 4)
params->Set("package", request.RequestUrl->GetPath()[3]);
HttpUtility::SendJsonBody(response, result);
}
-void ConfigStagesHandler::HandlePost(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response)
+void ConfigStagesHandler::HandlePost(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response, const Dictionary::Ptr& params)
{
FilterUtility::CheckPermission(user, "config/modify");
- Dictionary::Ptr params = HttpUtility::FetchRequestParameters(request);
-
if (request.RequestUrl->GetPath().size() >= 4)
params->Set("package", request.RequestUrl->GetPath()[3]);
HttpUtility::SendJsonBody(response, result);
}
-void ConfigStagesHandler::HandleDelete(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response)
+void ConfigStagesHandler::HandleDelete(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response, const Dictionary::Ptr& params)
{
FilterUtility::CheckPermission(user, "config/modify");
- Dictionary::Ptr params = HttpUtility::FetchRequestParameters(request);
-
if (request.RequestUrl->GetPath().size() >= 4)
params->Set("package", request.RequestUrl->GetPath()[3]);
public:
DECLARE_PTR_TYPEDEFS(ConfigStagesHandler);
- virtual bool HandleRequest(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response) override;
+ virtual bool HandleRequest(const ApiUser::Ptr& user, HttpRequest& request,
+ HttpResponse& response, const Dictionary::Ptr& params) override;
private:
- void HandleGet(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response);
- void HandlePost(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response);
- void HandleDelete(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response);
+ void HandleGet(const ApiUser::Ptr& user, HttpRequest& request,
+ HttpResponse& response, const Dictionary::Ptr& params);
+ void HandlePost(const ApiUser::Ptr& user, HttpRequest& request,
+ HttpResponse& response, const Dictionary::Ptr& params);
+ void HandleDelete(const ApiUser::Ptr& user, HttpRequest& request,
+ HttpResponse& response, const Dictionary::Ptr& params);
};
INITIALIZE_ONCE(InitScriptFrameCleanup);
-bool ConsoleHandler::HandleRequest(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response)
+bool ConsoleHandler::HandleRequest(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response, const Dictionary::Ptr& params)
{
if (request.RequestUrl->GetPath().size() > 3)
return false;
return false;
QueryDescription qd;
- Dictionary::Ptr params = HttpUtility::FetchRequestParameters(request);
String methodName = request.RequestUrl->GetPath()[2];
-
+
FilterUtility::CheckPermission(user, "console");
String session = HttpUtility::GetLastParameter(params, "session");
public:
DECLARE_PTR_TYPEDEFS(ConsoleHandler);
- virtual bool HandleRequest(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response) override;
+ virtual bool HandleRequest(const ApiUser::Ptr& user, HttpRequest& request,
+ HttpResponse& response, const Dictionary::Ptr& params) override;
static std::vector<String> GetAutocompletionSuggestions(const String& word, ScriptFrame& frame);
REGISTER_URLHANDLER("/v1/objects", CreateObjectHandler);
-bool CreateObjectHandler::HandleRequest(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response)
+bool CreateObjectHandler::HandleRequest(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response, const Dictionary::Ptr& params)
{
if (request.RequestUrl->GetPath().size() != 4)
return false;
FilterUtility::CheckPermission(user, "objects/create/" + type->GetName());
String name = request.RequestUrl->GetPath()[3];
- Dictionary::Ptr params = HttpUtility::FetchRequestParameters(request);
Array::Ptr templates = params->Get("templates");
Dictionary::Ptr attrs = params->Get("attrs");
public:
DECLARE_PTR_TYPEDEFS(CreateObjectHandler);
- virtual bool HandleRequest(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response) override;
+ virtual bool HandleRequest(const ApiUser::Ptr& user, HttpRequest& request,
+ HttpResponse& response, const Dictionary::Ptr& params) override;
};
}
REGISTER_URLHANDLER("/v1/objects", DeleteObjectHandler);
-bool DeleteObjectHandler::HandleRequest(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response)
+bool DeleteObjectHandler::HandleRequest(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response, const Dictionary::Ptr& params)
{
if (request.RequestUrl->GetPath().size() < 3 || request.RequestUrl->GetPath().size() > 4)
return false;
qd.Types.insert(type->GetName());
qd.Permission = "objects/delete/" + type->GetName();
- Dictionary::Ptr params = HttpUtility::FetchRequestParameters(request);
-
params->Set("type", type->GetName());
if (request.RequestUrl->GetPath().size() >= 4) {
public:
DECLARE_PTR_TYPEDEFS(DeleteObjectHandler);
- virtual bool HandleRequest(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response) override;
+ virtual bool HandleRequest(const ApiUser::Ptr& user, HttpRequest& request,
+ HttpResponse& response, const Dictionary::Ptr& params) override;
};
}
REGISTER_URLHANDLER("/v1/events", EventsHandler);
-bool EventsHandler::HandleRequest(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response)
+bool EventsHandler::HandleRequest(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response, const Dictionary::Ptr& params)
{
if (request.RequestUrl->GetPath().size() != 2)
return false;
return true;
}
- Dictionary::Ptr params = HttpUtility::FetchRequestParameters(request);
-
Array::Ptr types = params->Get("types");
if (!types) {
public:
DECLARE_PTR_TYPEDEFS(EventsHandler);
- virtual bool HandleRequest(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response) override;
+ virtual bool HandleRequest(const ApiUser::Ptr& user, HttpRequest& request,
+ HttpResponse& response, const Dictionary::Ptr& params) override;
};
}
#include "remote/httphandler.hpp"
#include "remote/httputility.hpp"
#include "base/singleton.hpp"
+#include "base/exception.hpp"
#include <boost/algorithm/string/join.hpp>
using namespace icinga;
std::reverse(handlers.begin(), handlers.end());
+ Dictionary::Ptr params;
+
+ try {
+ params = HttpUtility::FetchRequestParameters(request);
+ } catch (const std::exception& ex) {
+ HttpUtility::SendJsonError(response, 400, "Invalid request body: " + DiagnosticInformation(ex, false));
+ return;
+ }
+
bool processed = false;
BOOST_FOREACH(const HttpHandler::Ptr& handler, handlers) {
- if (handler->HandleRequest(user, request, response)) {
+ if (handler->HandleRequest(user, request, response, params)) {
processed = true;
break;
}
}
+
if (!processed) {
String path = boost::algorithm::join(request.RequestUrl->GetPath(), "/");
HttpUtility::SendJsonError(response, 404, "The requested path '" + path +
public:
DECLARE_PTR_TYPEDEFS(HttpHandler);
- virtual bool HandleRequest(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response) = 0;
+ virtual bool HandleRequest(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response, const Dictionary::Ptr& params) = 0;
static void Register(const Url::Ptr& url, const HttpHandler::Ptr& handler);
static void ProcessRequest(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response);
REGISTER_URLHANDLER("/", InfoHandler);
-bool InfoHandler::HandleRequest(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response)
+bool InfoHandler::HandleRequest(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response, const Dictionary::Ptr& params)
{
if (request.RequestUrl->GetPath().size() > 2)
return false;
public:
DECLARE_PTR_TYPEDEFS(InfoHandler);
- virtual bool HandleRequest(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response) override;
+ virtual bool HandleRequest(const ApiUser::Ptr& user, HttpRequest& request,
+ HttpResponse& response, const Dictionary::Ptr& params) override;
};
}
REGISTER_URLHANDLER("/v1/objects", ModifyObjectHandler);
-bool ModifyObjectHandler::HandleRequest(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response)
+bool ModifyObjectHandler::HandleRequest(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response, const Dictionary::Ptr& params)
{
if (request.RequestUrl->GetPath().size() < 3 || request.RequestUrl->GetPath().size() > 4)
return false;
qd.Types.insert(type->GetName());
qd.Permission = "objects/modify/" + type->GetName();
- Dictionary::Ptr params = HttpUtility::FetchRequestParameters(request);
-
params->Set("type", type->GetName());
if (request.RequestUrl->GetPath().size() >= 4) {
public:
DECLARE_PTR_TYPEDEFS(ModifyObjectHandler);
- virtual bool HandleRequest(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response) override;
+ virtual bool HandleRequest(const ApiUser::Ptr& user, HttpRequest& request,
+ HttpResponse& response, const Dictionary::Ptr& params) override;
};
}
return resultAttrs;
}
-bool ObjectQueryHandler::HandleRequest(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response)
+bool ObjectQueryHandler::HandleRequest(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response, const Dictionary::Ptr& params)
{
if (request.RequestUrl->GetPath().size() < 3 || request.RequestUrl->GetPath().size() > 4)
return false;
qd.Types.insert(type->GetName());
qd.Permission = "objects/query/" + type->GetName();
- Dictionary::Ptr params = HttpUtility::FetchRequestParameters(request);
-
Array::Ptr uattrs = params->Get("attrs");
Array::Ptr ujoins = params->Get("joins");
Array::Ptr umetas = params->Get("meta");
public:
DECLARE_PTR_TYPEDEFS(ObjectQueryHandler);
- virtual bool HandleRequest(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response) override;
+ virtual bool HandleRequest(const ApiUser::Ptr& user, HttpRequest& request,
+ HttpResponse& response, const Dictionary::Ptr& params) override;
private:
static Dictionary::Ptr SerializeObjectAttrs(const Object::Ptr& object, const String& attrPrefix,
}
};
-bool StatusHandler::HandleRequest(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response)
+bool StatusHandler::HandleRequest(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response, const Dictionary::Ptr& params)
{
if (request.RequestUrl->GetPath().size() > 3)
return false;
qd.Provider = new StatusTargetProvider();
qd.Permission = "status/query";
- Dictionary::Ptr params = HttpUtility::FetchRequestParameters(request);
-
params->Set("type", "Status");
if (request.RequestUrl->GetPath().size() >= 3)
public:
DECLARE_PTR_TYPEDEFS(StatusHandler);
- virtual bool HandleRequest(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response) override;
+ virtual bool HandleRequest(const ApiUser::Ptr& user, HttpRequest& request,
+ HttpResponse& response, const Dictionary::Ptr& params) override;
};
}
}
};
-bool TypeQueryHandler::HandleRequest(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response)
+bool TypeQueryHandler::HandleRequest(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response, const Dictionary::Ptr& params)
{
if (request.RequestUrl->GetPath().size() > 3)
return false;
qd.Types.insert("Type");
qd.Provider = new TypeTargetProvider();
- Dictionary::Ptr params = HttpUtility::FetchRequestParameters(request);
-
if (params->Contains("type"))
params->Set("name", params->Get("type"));
public:
DECLARE_PTR_TYPEDEFS(TypeQueryHandler);
- virtual bool HandleRequest(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response) override;
+ virtual bool HandleRequest(const ApiUser::Ptr& user, HttpRequest& request,
+ HttpResponse& response, const Dictionary::Ptr& params) override;
};
}