From 10bd3ed9b7135710cbb77457dd17bbc1b56e05c1 Mon Sep 17 00:00:00 2001
From: Gunnar Beutner
Date: Thu, 22 Oct 2015 12:02:15 +0200
Subject: [PATCH] Implement URL handler for /v1
refs #9105
---
lib/remote/CMakeLists.txt | 2 +-
lib/remote/infohandler.cpp | 76 ++++++++++++++++++++++++++++++++++++++
lib/remote/infohandler.hpp | 38 +++++++++++++++++++
3 files changed, 115 insertions(+), 1 deletion(-)
create mode 100644 lib/remote/infohandler.cpp
create mode 100644 lib/remote/infohandler.hpp
diff --git a/lib/remote/CMakeLists.txt b/lib/remote/CMakeLists.txt
index 8916b2c8f..11243f782 100644
--- a/lib/remote/CMakeLists.txt
+++ b/lib/remote/CMakeLists.txt
@@ -28,7 +28,7 @@ set(remote_SOURCES
configstageshandler.cpp createobjecthandler.cpp deleteobjecthandler.cpp
endpoint.cpp endpoint.thpp eventshandler.cpp eventqueue.cpp filterutility.cpp
httpchunkedencoding.cpp httpclientconnection.cpp httpserverconnection.cpp httphandler.cpp httprequest.cpp httpresponse.cpp
- httputility.cpp jsonrpc.cpp jsonrpcconnection.cpp jsonrpcconnection-heartbeat.cpp
+ httputility.cpp infohandler.cpp jsonrpc.cpp jsonrpcconnection.cpp jsonrpcconnection-heartbeat.cpp
messageorigin.cpp modifyobjecthandler.cpp statushandler.cpp objectqueryhandler.cpp typequeryhandler.cpp
url.cpp zone.cpp zone.thpp
)
diff --git a/lib/remote/infohandler.cpp b/lib/remote/infohandler.cpp
new file mode 100644
index 000000000..d05199e15
--- /dev/null
+++ b/lib/remote/infohandler.cpp
@@ -0,0 +1,76 @@
+/******************************************************************************
+ * Icinga 2 *
+ * Copyright (C) 2012-2015 Icinga Development Team (http://www.icinga.org) *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software Foundation *
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ******************************************************************************/
+
+#include "remote/infohandler.hpp"
+#include "remote/httputility.hpp"
+
+using namespace icinga;
+
+REGISTER_URLHANDLER("/v1", InfoHandler);
+
+bool InfoHandler::HandleRequest(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response)
+{
+ if (request.RequestUrl->GetPath().size() != 1)
+ return false;
+
+ if (request.RequestMethod != "GET")
+ return false;
+
+ response.SetStatus(200, "OK");
+ response.AddHeader("Content-Type", "text/html");
+
+ String body = "Icinga 2Hello from Icinga 2!
";
+ body += "You are authenticated as " + user->GetName() + ". ";
+
+ bool has_permissions = false;
+ String perm_info;
+
+ 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;
+ if (permission.IsObjectType()) {
+ Dictionary::Ptr dpermission = permission;
+ name = dpermission->Get("permission");
+ has_filter = dpermission->Contains("filter");
+ } else
+ name = permission;
+
+ perm_info += "" + name;
+ if (has_filter)
+ perm_info += " (filtered)";
+ perm_info += "";
+ }
+ }
+
+ if (has_permissions)
+ body += "Your user has the following permissions:
";
+ else
+ body += "Your user does not have any permissions.
";
+
+ body += "More information about API requests is available in the documentation.
";
+ response.WriteBody(body.CStr(), body.GetLength());
+
+ return true;
+}
+
diff --git a/lib/remote/infohandler.hpp b/lib/remote/infohandler.hpp
new file mode 100644
index 000000000..86afe598b
--- /dev/null
+++ b/lib/remote/infohandler.hpp
@@ -0,0 +1,38 @@
+/******************************************************************************
+ * Icinga 2 *
+ * Copyright (C) 2012-2015 Icinga Development Team (http://www.icinga.org) *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software Foundation *
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ******************************************************************************/
+
+#ifndef INFOHANDLER_H
+#define INFOHANDLER_H
+
+#include "remote/httphandler.hpp"
+
+namespace icinga
+{
+
+class I2_REMOTE_API InfoHandler : public HttpHandler
+{
+public:
+ DECLARE_PTR_TYPEDEFS(InfoHandler);
+
+ virtual bool HandleRequest(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response) override;
+};
+
+}
+
+#endif /* INFOHANDLER_H */