From 8fcd28d189f5e27abe1928b8e2f1e01e2d2a45b5 Mon Sep 17 00:00:00 2001 From: Dario Date: Wed, 9 Oct 2019 19:25:18 +0200 Subject: [PATCH] adding elopage webhook page --- dependencies/iroha-ed25519 | 2 +- src/cpp/HTTPInterface/ElopageWebhook.cpp | 25 ++++++++++++++ src/cpp/HTTPInterface/ElopageWebhook.h | 15 +++++++++ .../PageRequestHandlerFactory.cpp | 5 +++ src/cpp/ServerConfig.cpp | 33 +++++++++++++++++++ src/cpp/ServerConfig.h | 3 ++ 6 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 src/cpp/HTTPInterface/ElopageWebhook.cpp create mode 100644 src/cpp/HTTPInterface/ElopageWebhook.h diff --git a/dependencies/iroha-ed25519 b/dependencies/iroha-ed25519 index a0977c22d..7307ffb8a 160000 --- a/dependencies/iroha-ed25519 +++ b/dependencies/iroha-ed25519 @@ -1 +1 @@ -Subproject commit a0977c22d23f7e8cb596f1d9d812de74115f407b +Subproject commit 7307ffb8a89d2459f0c07ea5cab27c0d3496df00 diff --git a/src/cpp/HTTPInterface/ElopageWebhook.cpp b/src/cpp/HTTPInterface/ElopageWebhook.cpp new file mode 100644 index 000000000..dd16b4cc2 --- /dev/null +++ b/src/cpp/HTTPInterface/ElopageWebhook.cpp @@ -0,0 +1,25 @@ +#include "ElopageWebhook.h" +#include "Poco/Net/HTTPServerRequest.h" +#include "Poco/Net/HTTPServerResponse.h" +#include "Poco/DeflatingStream.h" + +#include "../ServerConfig.h" + + +void ElopageWebhook::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response) +{ + // simply write request to file for later lookup + ServerConfig::writeToFile(request.stream(), "elopage_webhook_requests.txt"); + + response.setChunkedTransferEncoding(true); + response.setContentType("application/json"); + bool _compressResponse(request.hasToken("Accept-Encoding", "gzip")); + if (_compressResponse) response.set("Content-Encoding", "gzip"); + + + std::ostream& _responseStream = response.send(); + Poco::DeflatingOutputStream _gzipStream(_responseStream, Poco::DeflatingStreamBuf::STREAM_GZIP, 1); + std::ostream& responseStream = _compressResponse ? _gzipStream : _responseStream; + + if (_compressResponse) _gzipStream.close(); +} diff --git a/src/cpp/HTTPInterface/ElopageWebhook.h b/src/cpp/HTTPInterface/ElopageWebhook.h new file mode 100644 index 000000000..3799c1592 --- /dev/null +++ b/src/cpp/HTTPInterface/ElopageWebhook.h @@ -0,0 +1,15 @@ +#ifndef Elopage_Webhook_INCLUDED +#define Elopage_Webhook_INCLUDED + + +#include "Poco/Net/HTTPRequestHandler.h" + + +class ElopageWebhook : public Poco::Net::HTTPRequestHandler +{ +public: + void handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response); +}; + + +#endif // Elopage_Webhook_INCLUDED diff --git a/src/cpp/HTTPInterface/PageRequestHandlerFactory.cpp b/src/cpp/HTTPInterface/PageRequestHandlerFactory.cpp index f6626203b..d9e7e1179 100644 --- a/src/cpp/HTTPInterface/PageRequestHandlerFactory.cpp +++ b/src/cpp/HTTPInterface/PageRequestHandlerFactory.cpp @@ -11,6 +11,7 @@ #include "CheckEmailPage.h" #include "PassphrasePage.h" #include "SaveKeysPage.h" +#include "ElopageWebhook.h" #include "../SingletonManager/SessionManager.h" @@ -36,6 +37,10 @@ Poco::Net::HTTPRequestHandler* PageRequestHandlerFactory::createRequestHandler(c } } + if (url_first_part == "/elopage_webhook_261") { + return new ElopageWebhook; + } + // check if user has valid session Poco::Net::NameValueCollection cookies; request.getCookies(cookies); diff --git a/src/cpp/ServerConfig.cpp b/src/cpp/ServerConfig.cpp index 02c310019..3461e60f1 100644 --- a/src/cpp/ServerConfig.cpp +++ b/src/cpp/ServerConfig.cpp @@ -8,6 +8,12 @@ #include "Poco/Net/RejectCertificateHandler.h" #include "Poco/SharedPtr.h" +#include "Poco/Mutex.h" +#include "Poco/FileStream.h" +#include "Poco/LocalDateTime.h" +#include "Poco/DateTimeFormat.h" +#include "Poco/DateTimeFormatter.h" + using Poco::Net::SSLManager; using Poco::Net::Context; using Poco::Net::KeyConsoleHandler; @@ -118,4 +124,31 @@ namespace ServerConfig { delete g_CPUScheduler; } } + + void writeToFile(std::istream& datas, std::string& fileName) + { + static Poco::Mutex mutex; + + mutex.lock(); + + Poco::FileOutputStream file(fileName, std::ios::out | std::ios::app); + + if (!file.good()) { + printf("[ServerConfig::writeToFile] error creating file with name: %s\n", fileName.data()); + mutex.unlock(); + return; + } + + Poco::LocalDateTime now; + + std::string dateTimeStr = Poco::DateTimeFormatter::format(now, Poco::DateTimeFormat::ISO8601_FORMAT); + file << dateTimeStr << std::endl; + + for (std::string line; std::getline(datas, line); ) { + file << line << std::endl; + } + file << std::endl; + file.close(); + mutex.unlock(); + } } \ No newline at end of file diff --git a/src/cpp/ServerConfig.h b/src/cpp/ServerConfig.h index 1c08f3fa0..54e86c4d0 100644 --- a/src/cpp/ServerConfig.h +++ b/src/cpp/ServerConfig.h @@ -3,6 +3,7 @@ #include "Poco/Util/LayeredConfiguration.h" #include "Poco/Net/Context.h" + #include "tasks/CPUSheduler.h" namespace ServerConfig { @@ -34,5 +35,7 @@ namespace ServerConfig { bool initEMailAccount(const Poco::Util::LayeredConfiguration& cfg); bool initSSLClientContext(); + void writeToFile(std::istream& datas, std::string& fileName); + void unload(); }; \ No newline at end of file