]> granicus.if.org Git - icinga2/commitdiff
Refactor PkiUtility class
authorGunnar Beutner <gunnar.beutner@icinga.com>
Tue, 5 Sep 2017 12:44:56 +0000 (14:44 +0200)
committerGunnar Beutner <gunnar.beutner@icinga.com>
Tue, 12 Sep 2017 10:52:49 +0000 (12:52 +0200)
refs #5450

16 files changed:
lib/cli/CMakeLists.txt
lib/cli/apisetuputility.cpp
lib/cli/calistcommand.cpp
lib/cli/nodesetupcommand.cpp
lib/cli/nodewizardcommand.cpp
lib/cli/pkinewcacommand.cpp
lib/cli/pkinewcertcommand.cpp
lib/cli/pkirequestcommand.cpp
lib/cli/pkisavecertcommand.cpp
lib/cli/pkisigncsrcommand.cpp
lib/cli/pkiticketcommand.cpp
lib/icinga/apiactions.cpp
lib/icinga/apiactions.hpp
lib/remote/CMakeLists.txt
lib/remote/pkiutility.cpp [moved from lib/cli/pkiutility.cpp with 86% similarity]
lib/remote/pkiutility.hpp [moved from lib/cli/pkiutility.hpp with 94% similarity]

index 05ec67762a1a1f70ee17ed9d92ed8e09c053828c..bf706e2eb71c4e346cd3fd4bd78efcd1d427695a 100644 (file)
@@ -26,7 +26,6 @@ set(cli_SOURCES
   featureenablecommand.cpp featuredisablecommand.cpp featurelistcommand.cpp featureutility.cpp
   objectlistcommand.cpp objectlistutility.cpp
   pkinewcacommand.cpp pkinewcertcommand.cpp pkisigncsrcommand.cpp pkirequestcommand.cpp pkisavecertcommand.cpp pkiticketcommand.cpp
-  pkiutility.cpp
   repositoryclearchangescommand.cpp repositorycommitcommand.cpp repositoryobjectcommand.cpp repositoryutility.cpp
   variablegetcommand.cpp variablelistcommand.cpp variableutility.cpp
   troubleshootcommand.cpp
index 6a1885e320a9f0d8c0b5c77da914f8704b86185a..35b63a2b1aaa0d36b959797766b75c1b4e9af213 100644 (file)
  ******************************************************************************/
 
 #include "cli/apisetuputility.hpp"
-#include "cli/pkiutility.hpp"
 #include "cli/nodeutility.hpp"
 #include "cli/featureutility.hpp"
 #include "remote/apilistener.hpp"
+#include "remote/pkiutility.hpp"
 #include "base/logger.hpp"
 #include "base/console.hpp"
 #include "base/application.hpp"
index b538b772f0013f337614a17013b5fba6e3cc1fe7..e44717188a551a5dbd97ca568cc9db1de8656bf6 100644 (file)
@@ -19,6 +19,7 @@
 
 #include "cli/calistcommand.hpp"
 #include "remote/apilistener.hpp"
+#include "remote/pkiutility.hpp"
 #include "base/logger.hpp"
 #include "base/application.hpp"
 #include "base/tlsutility.hpp"
@@ -46,51 +47,6 @@ void CAListCommand::InitParameters(boost::program_options::options_description&
                ("json", "encode output as JSON")
        ;
 }
-static void CollectRequestHandler(const Dictionary::Ptr& requests, const String& requestFile)
-{
-       Dictionary::Ptr request = Utility::LoadJsonFile(requestFile);
-
-       if (!request)
-               return;
-
-       Dictionary::Ptr result = new Dictionary();
-
-       String fingerprint = Utility::BaseName(requestFile);
-       fingerprint = fingerprint.SubStr(0, fingerprint.GetLength() - 5);
-
-       String certRequestText = request->Get("cert_request");
-       result->Set("cert_request", certRequestText);
-
-       Value vcertResponseText;
-
-       if (request->Get("cert_response", &vcertResponseText)) {
-               String certResponseText = vcertResponseText;
-               result->Set("cert_response", certResponseText);
-       }
-
-       boost::shared_ptr<X509> certRequest = StringToCertificate(certRequestText);
-
-       time_t now;
-       time(&now);
-       ASN1_TIME *tm = ASN1_TIME_adj(NULL, now, 0, 0);
-
-       int day, sec;
-       ASN1_TIME_diff(&day, &sec, tm, X509_get_notBefore(certRequest.get()));
-
-       result->Set("timestamp",  static_cast<double>(now) + day * 24 * 60 * 60 + sec);
-
-       BIO *out = BIO_new(BIO_s_mem());
-       X509_NAME_print_ex(out, X509_get_subject_name(certRequest.get()), 0, XN_FLAG_ONELINE & ~ASN1_STRFLGS_ESC_MSB);
-
-       char *data;
-       long length;
-       length = BIO_get_mem_data(out, &data);
-
-       result->Set("subject", String(data, data + length));
-       BIO_free(out);
-
-       requests->Set(fingerprint, result);
-}
 
 /**
  * The entry point for the "ca list" CLI command.
@@ -99,12 +55,7 @@ static void CollectRequestHandler(const Dictionary::Ptr& requests, const String&
  */
 int CAListCommand::Run(const boost::program_options::variables_map& vm, const std::vector<std::string>& ap) const
 {
-       Dictionary::Ptr requests = new Dictionary();
-
-       String requestDir = ApiListener::GetPkiRequestsDir();
-
-       if (Utility::PathExists(requestDir))
-               Utility::Glob(requestDir + "/*.json", boost::bind(&CollectRequestHandler, requests, _1), GlobFile);
+       Dictionary::Ptr requests = PkiUtility::GetCertificateRequests();
 
        if (vm.count("json"))
                std::cout << JsonEncode(requests);
index 140cad998a1dd1fa7957a42672489d43c6c96ff4..e02e9f6da91e884d79edd3613fb0d5bfb5e0123f 100644 (file)
@@ -20,9 +20,9 @@
 #include "cli/nodesetupcommand.hpp"
 #include "cli/nodeutility.hpp"
 #include "cli/featureutility.hpp"
-#include "cli/pkiutility.hpp"
 #include "cli/apisetuputility.hpp"
 #include "remote/apilistener.hpp"
+#include "remote/pkiutility.hpp"
 #include "base/logger.hpp"
 #include "base/console.hpp"
 #include "base/application.hpp"
index 0253a06e2d887ed007f71af7e72b6163097fcc0b..fd841af21835021744e8630fb5271af10cb2e555 100644 (file)
 
 #include "cli/nodewizardcommand.hpp"
 #include "cli/nodeutility.hpp"
-#include "cli/pkiutility.hpp"
 #include "cli/featureutility.hpp"
 #include "cli/apisetuputility.hpp"
 #include "remote/apilistener.hpp"
+#include "remote/pkiutility.hpp"
 #include "base/logger.hpp"
 #include "base/console.hpp"
 #include "base/application.hpp"
index e381b2a12cc66ef342e5394f5f0c77b1ee902359..69d0465f3b39e4f28e38439ac5fb2d2f297f0b67 100644 (file)
@@ -18,7 +18,7 @@
  ******************************************************************************/
 
 #include "cli/pkinewcacommand.hpp"
-#include "cli/pkiutility.hpp"
+#include "remote/pkiutility.hpp"
 #include "base/logger.hpp"
 
 using namespace icinga;
index 706c67d2de16a0e7a53b3dcc506f656f8059a61f..9f4ac9e8fe77a87cecc3d41e5a6d7337e402d3f9 100644 (file)
@@ -18,7 +18,7 @@
  ******************************************************************************/
 
 #include "cli/pkinewcertcommand.hpp"
-#include "cli/pkiutility.hpp"
+#include "remote/pkiutility.hpp"
 #include "base/logger.hpp"
 
 using namespace icinga;
index bbbf629a8c9f5f661da261cc50f3e30e39c51a51..0e3dead6faafa4ebd7d40ee35d4c308aacb71388 100644 (file)
@@ -18,7 +18,7 @@
  ******************************************************************************/
 
 #include "cli/pkirequestcommand.hpp"
-#include "cli/pkiutility.hpp"
+#include "remote/pkiutility.hpp"
 #include "base/logger.hpp"
 #include "base/tlsutility.hpp"
 #include <iostream>
index 9249ae8e7b4ac14385be905f1e64ab5d0b8bfd27..f823f643edbe9ce73f2d11c2d119230459d79c87 100644 (file)
@@ -18,7 +18,7 @@
  ******************************************************************************/
 
 #include "cli/pkisavecertcommand.hpp"
-#include "cli/pkiutility.hpp"
+#include "remote/pkiutility.hpp"
 #include "base/logger.hpp"
 #include "base/tlsutility.hpp"
 
index 233a29401d3a9d43188289adcb177ce75f43dc7c..a20507661a42124900a95cd597f608d1f529a261 100644 (file)
@@ -18,7 +18,7 @@
  ******************************************************************************/
 
 #include "cli/pkisigncsrcommand.hpp"
-#include "cli/pkiutility.hpp"
+#include "remote/pkiutility.hpp"
 #include "base/logger.hpp"
 
 using namespace icinga;
index 7eea4bbb117fa642097febac9042b826cc01336f..3ae97766885af3e6682b56ede3a774096676a13c 100644 (file)
@@ -18,7 +18,7 @@
  ******************************************************************************/
 
 #include "cli/pkiticketcommand.hpp"
-#include "cli/pkiutility.hpp"
+#include "remote/pkiutility.hpp"
 #include "cli/variableutility.hpp"
 #include "base/logger.hpp"
 #include <iostream>
index 198bc9929b8f82aa4bae335843ad9cab2ea87463..8d76dab3676f2e558ee443eaae90489a45c450f8 100644 (file)
@@ -27,6 +27,7 @@
 #include "icinga/notificationcommand.hpp"
 #include "remote/apiaction.hpp"
 #include "remote/apilistener.hpp"
+#include "remote/pkiutility.hpp"
 #include "remote/httputility.hpp"
 #include "base/utility.hpp"
 #include "base/convert.hpp"
@@ -47,6 +48,8 @@ REGISTER_APIACTION(remove_downtime, "Service;Host;Downtime", &ApiActions::Remove
 REGISTER_APIACTION(shutdown_process, "", &ApiActions::ShutdownProcess);
 REGISTER_APIACTION(restart_process, "", &ApiActions::RestartProcess);
 REGISTER_APIACTION(generate_ticket, "", &ApiActions::GenerateTicket);
+REGISTER_APIACTION(list_ca_requests, "", &ApiActions::ListCARequests);
+REGISTER_APIACTION(sign_ca_request, "", &ApiActions::SignCARequest);
 
 Dictionary::Ptr ApiActions::CreateResult(int code, const String& status,
     const Dictionary::Ptr& additional)
@@ -456,3 +459,21 @@ Dictionary::Ptr ApiActions::GenerateTicket(const ConfigObject::Ptr&,
        return ApiActions::CreateResult(200, "Generated PKI ticket '" + ticket + "' for common name '"
            + cn + "'.", additional);
 }
+
+Dictionary::Ptr ApiActions::ListCARequests(const ConfigObject::Ptr&,
+    const Dictionary::Ptr& params)
+{
+       Dictionary::Ptr additional = new Dictionary();
+       additional->Set("requests", PkiUtility::GetCertificateRequests());
+
+       return ApiActions::CreateResult(200, "Listing all CA requests.", additional);
+}
+
+Dictionary::Ptr ApiActions::SignCARequest(const ConfigObject::Ptr&,
+    const Dictionary::Ptr& params)
+{
+       if (!params->Contains("fingerprint"))
+               return ApiActions::CreateResult(400, "Option 'fingerprint' is required.");
+
+       
+}
index 8bfcd8a4e4bb7fa0d262df477ccc05dc2f9c6f65..a1787b27ca93d7951b0a6ad70303ee8186dff8e8 100644 (file)
@@ -46,6 +46,8 @@ public:
        static Dictionary::Ptr ShutdownProcess(const ConfigObject::Ptr& object, const Dictionary::Ptr& params);
        static Dictionary::Ptr RestartProcess(const ConfigObject::Ptr& object, const Dictionary::Ptr& params);
        static Dictionary::Ptr GenerateTicket(const ConfigObject::Ptr& object, const Dictionary::Ptr& params);
+       static Dictionary::Ptr ListCARequests(const ConfigObject::Ptr& object, const Dictionary::Ptr& params);
+       static Dictionary::Ptr SignCARequest(const ConfigObject::Ptr& object, const Dictionary::Ptr& params);
 
 private:
        static Dictionary::Ptr CreateResult(int code, const String& status, const Dictionary::Ptr& additional = Dictionary::Ptr());
index 349091e003115c8122cafb75cb4ee47332c77e2b..32538deb1d9554739f2b113ad639ff1e0c48957e 100644 (file)
@@ -30,6 +30,7 @@ set(remote_SOURCES
   httpchunkedencoding.cpp httpclientconnection.cpp httpserverconnection.cpp httphandler.cpp httprequest.cpp httpresponse.cpp
   httputility.cpp infohandler.cpp jsonrpc.cpp jsonrpcconnection.cpp jsonrpcconnection-heartbeat.cpp jsonrpcconnection-pki.cpp
   messageorigin.cpp modifyobjecthandler.cpp statushandler.cpp objectqueryhandler.cpp templatequeryhandler.cpp
+  pkiutility.cpp
   typequeryhandler.cpp url.cpp variablequeryhandler.cpp zone.cpp zone.thpp
 )
 
similarity index 86%
rename from lib/cli/pkiutility.cpp
rename to lib/remote/pkiutility.cpp
index c1325aafd9f120d74f7d1e02c31e74398ad19057..f3eef9d36f06c7cecd0151ae9d8a5507bf9dbd5b 100644 (file)
@@ -17,8 +17,7 @@
  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.             *
  ******************************************************************************/
 
-#include "cli/pkiutility.hpp"
-#include "cli/clicommand.hpp"
+#include "remote/pkiutility.hpp"
 #include "remote/apilistener.hpp"
 #include "base/logger.hpp"
 #include "base/application.hpp"
@@ -369,3 +368,61 @@ String PkiUtility::GetCertificateInformation(const boost::shared_ptr<X509>& cert
 
        return info.str();
 }
+
+static void CollectRequestHandler(const Dictionary::Ptr& requests, const String& requestFile)
+{
+       Dictionary::Ptr request = Utility::LoadJsonFile(requestFile);
+
+       if (!request)
+               return;
+
+       Dictionary::Ptr result = new Dictionary();
+
+       String fingerprint = Utility::BaseName(requestFile);
+       fingerprint = fingerprint.SubStr(0, fingerprint.GetLength() - 5);
+
+       String certRequestText = request->Get("cert_request");
+       result->Set("cert_request", certRequestText);
+
+       Value vcertResponseText;
+
+       if (request->Get("cert_response", &vcertResponseText)) {
+               String certResponseText = vcertResponseText;
+               result->Set("cert_response", certResponseText);
+       }
+
+       boost::shared_ptr<X509> certRequest = StringToCertificate(certRequestText);
+
+       time_t now;
+       time(&now);
+       ASN1_TIME *tm = ASN1_TIME_adj(NULL, now, 0, 0);
+
+       int day, sec;
+       ASN1_TIME_diff(&day, &sec, tm, X509_get_notBefore(certRequest.get()));
+
+       result->Set("timestamp",  static_cast<double>(now) + day * 24 * 60 * 60 + sec);
+
+       BIO *out = BIO_new(BIO_s_mem());
+       X509_NAME_print_ex(out, X509_get_subject_name(certRequest.get()), 0, XN_FLAG_ONELINE & ~ASN1_STRFLGS_ESC_MSB);
+
+       char *data;
+       long length;
+       length = BIO_get_mem_data(out, &data);
+
+       result->Set("subject", String(data, data + length));
+       BIO_free(out);
+
+       requests->Set(fingerprint, result);
+}
+
+Dictionary::Ptr PkiUtility::GetCertificateRequests(void)
+{
+       Dictionary::Ptr requests = new Dictionary();
+
+       String requestDir = ApiListener::GetPkiRequestsDir();
+
+       if (Utility::PathExists(requestDir))
+               Utility::Glob(requestDir + "/*.json", boost::bind(&CollectRequestHandler, requests, _1), GlobFile);
+
+       return requests;
+}
similarity index 94%
rename from lib/cli/pkiutility.hpp
rename to lib/remote/pkiutility.hpp
index 830de9d46f2dc18bfa708091ede8cef13140e96a..07872287333e84729e62e73b5b0ef190d4176b0b 100644 (file)
@@ -20,8 +20,7 @@
 #ifndef PKIUTILITY_H
 #define PKIUTILITY_H
 
-#include "base/i2-base.hpp"
-#include "cli/i2-cli.hpp"
+#include "remote/i2-remote.hpp"
 #include "base/dictionary.hpp"
 #include "base/string.hpp"
 #include <openssl/x509v3.h>
@@ -30,9 +29,9 @@ namespace icinga
 {
 
 /**
- * @ingroup cli
+ * @ingroup remote
  */
-class I2_CLI_API PkiUtility
+class I2_REMOTE_API PkiUtility
 {
 public:
        static int NewCa(void);
@@ -45,6 +44,7 @@ public:
            const String& certfile, const String& cafile, const boost::shared_ptr<X509>& trustedcert,
            const String& ticket = String());
        static String GetCertificateInformation(const boost::shared_ptr<X509>& certificate);
+       static Dictionary::Ptr GetCertificateRequests(void);
 
 private:
        PkiUtility(void);