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 2

Hello 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 */