From deb23a72f89ee0683bd15bcf525660b04c73f384 Mon Sep 17 00:00:00 2001 From: Nathan Nichols Date: Mon, 14 Jun 2021 09:43:47 -0500 Subject: [PATCH] rebase server --- reporting/server/HttpSession.h | 38 +++++---- reporting/server/SslCerts.h | 124 ------------------------------ server/listener.h | 6 +- server/websocket_server_async.cpp | 54 +++++++++++-- 4 files changed, 70 insertions(+), 152 deletions(-) delete mode 100644 reporting/server/SslCerts.h diff --git a/reporting/server/HttpSession.h b/reporting/server/HttpSession.h index 6cbe719a..f7504a75 100644 --- a/reporting/server/HttpSession.h +++ b/reporting/server/HttpSession.h @@ -105,45 +105,43 @@ handle_request( if(req.method() == http::verb::get && req.body() == "") + { send(response(http::status::ok, "text/html", defaultResponse)); + return; + } if(req.method() != http::verb::post) - return send( - response( - http::status::bad_request, - "text/html", - "Expected a POST request")); + { + send(response( + http::status::bad_request, + "text/html", + "Expected a POST request")); + + return; + } try { auto request = boost::json::parse(req.body()).as_object(); - boost::json::object builtResponse; - try - { - builtResponse = buildResponse(request, etl, nullptr); - } - catch (std::exception const& e) - { - return send(response( - http::status::internal_server_error, - "text/html", - "Internal Error" - )); - } + auto builtResponse = buildResponse(request, etl, nullptr); - return send(response( + send(response( http::status::ok, "application/json", boost::json::serialize(builtResponse))); + + return; } catch (std::exception const& e) { - return send(response( + send(response( http::status::internal_server_error, "text/html", "Internal server error occurred" )); + + return; } } diff --git a/reporting/server/SslCerts.h b/reporting/server/SslCerts.h deleted file mode 100644 index 6ab2167b..00000000 --- a/reporting/server/SslCerts.h +++ /dev/null @@ -1,124 +0,0 @@ -// -// Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// -// Official repository: https://github.com/boostorg/beast -// - -#ifndef BOOST_BEAST_EXAMPLE_COMMON_SERVER_CERTIFICATE_HPP -#define BOOST_BEAST_EXAMPLE_COMMON_SERVER_CERTIFICATE_HPP - -#include -#include -#include -#include - -/* Load a signed certificate into the ssl context, and configure - the context for use with a server. - - For this to work with the browser or operating system, it is - necessary to import the "Beast Test CA" certificate into - the local certificate store, browser, or operating system - depending on your environment Please see the documentation - accompanying the Beast certificate for more details. -*/ -inline -void -load_server_certificate(boost::asio::ssl::context& ctx) -{ - /* - The certificate was generated from CMD.EXE on Windows 10 using: - - winpty openssl dhparam -out dh.pem 2048 - winpty openssl req -newkey rsa:2048 -nodes -keyout key.pem -x509 -days 10000 -out cert.pem -subj "//C=US\ST=CA\L=Los Angeles\O=Beast\CN=www.example.com" - */ - - std::string const cert = - "-----BEGIN CERTIFICATE-----\n" - "MIIDaDCCAlCgAwIBAgIJAO8vBu8i8exWMA0GCSqGSIb3DQEBCwUAMEkxCzAJBgNV\n" - "BAYTAlVTMQswCQYDVQQIDAJDQTEtMCsGA1UEBwwkTG9zIEFuZ2VsZXNPPUJlYXN0\n" - "Q049d3d3LmV4YW1wbGUuY29tMB4XDTE3MDUwMzE4MzkxMloXDTQ0MDkxODE4Mzkx\n" - "MlowSTELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMS0wKwYDVQQHDCRMb3MgQW5n\n" - "ZWxlc089QmVhc3RDTj13d3cuZXhhbXBsZS5jb20wggEiMA0GCSqGSIb3DQEBAQUA\n" - "A4IBDwAwggEKAoIBAQDJ7BRKFO8fqmsEXw8v9YOVXyrQVsVbjSSGEs4Vzs4cJgcF\n" - "xqGitbnLIrOgiJpRAPLy5MNcAXE1strVGfdEf7xMYSZ/4wOrxUyVw/Ltgsft8m7b\n" - "Fu8TsCzO6XrxpnVtWk506YZ7ToTa5UjHfBi2+pWTxbpN12UhiZNUcrRsqTFW+6fO\n" - "9d7xm5wlaZG8cMdg0cO1bhkz45JSl3wWKIES7t3EfKePZbNlQ5hPy7Pd5JTmdGBp\n" - "yY8anC8u4LPbmgW0/U31PH0rRVfGcBbZsAoQw5Tc5dnb6N2GEIbq3ehSfdDHGnrv\n" - "enu2tOK9Qx6GEzXh3sekZkxcgh+NlIxCNxu//Dk9AgMBAAGjUzBRMB0GA1UdDgQW\n" - "BBTZh0N9Ne1OD7GBGJYz4PNESHuXezAfBgNVHSMEGDAWgBTZh0N9Ne1OD7GBGJYz\n" - "4PNESHuXezAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQCmTJVT\n" - "LH5Cru1vXtzb3N9dyolcVH82xFVwPewArchgq+CEkajOU9bnzCqvhM4CryBb4cUs\n" - "gqXWp85hAh55uBOqXb2yyESEleMCJEiVTwm/m26FdONvEGptsiCmF5Gxi0YRtn8N\n" - "V+KhrQaAyLrLdPYI7TrwAOisq2I1cD0mt+xgwuv/654Rl3IhOMx+fKWKJ9qLAiaE\n" - "fQyshjlPP9mYVxWOxqctUdQ8UnsUKKGEUcVrA08i1OAnVKlPFjKBvk+r7jpsTPcr\n" - "9pWXTO9JrYMML7d+XRSZA1n3856OqZDX4403+9FnXCvfcLZLLKTBvwwFgEFGpzjK\n" - "UEVbkhd5qstF6qWK\n" - "-----END CERTIFICATE-----\n"; - - std::string const key = - "-----BEGIN PRIVATE KEY-----\n" - "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDJ7BRKFO8fqmsE\n" - "Xw8v9YOVXyrQVsVbjSSGEs4Vzs4cJgcFxqGitbnLIrOgiJpRAPLy5MNcAXE1strV\n" - "GfdEf7xMYSZ/4wOrxUyVw/Ltgsft8m7bFu8TsCzO6XrxpnVtWk506YZ7ToTa5UjH\n" - "fBi2+pWTxbpN12UhiZNUcrRsqTFW+6fO9d7xm5wlaZG8cMdg0cO1bhkz45JSl3wW\n" - "KIES7t3EfKePZbNlQ5hPy7Pd5JTmdGBpyY8anC8u4LPbmgW0/U31PH0rRVfGcBbZ\n" - "sAoQw5Tc5dnb6N2GEIbq3ehSfdDHGnrvenu2tOK9Qx6GEzXh3sekZkxcgh+NlIxC\n" - "Nxu//Dk9AgMBAAECggEBAK1gV8uETg4SdfE67f9v/5uyK0DYQH1ro4C7hNiUycTB\n" - "oiYDd6YOA4m4MiQVJuuGtRR5+IR3eI1zFRMFSJs4UqYChNwqQGys7CVsKpplQOW+\n" - "1BCqkH2HN/Ix5662Dv3mHJemLCKUON77IJKoq0/xuZ04mc9csykox6grFWB3pjXY\n" - "OEn9U8pt5KNldWfpfAZ7xu9WfyvthGXlhfwKEetOuHfAQv7FF6s25UIEU6Hmnwp9\n" - "VmYp2twfMGdztz/gfFjKOGxf92RG+FMSkyAPq/vhyB7oQWxa+vdBn6BSdsfn27Qs\n" - "bTvXrGe4FYcbuw4WkAKTljZX7TUegkXiwFoSps0jegECgYEA7o5AcRTZVUmmSs8W\n" - "PUHn89UEuDAMFVk7grG1bg8exLQSpugCykcqXt1WNrqB7x6nB+dbVANWNhSmhgCg\n" - "VrV941vbx8ketqZ9YInSbGPWIU/tss3r8Yx2Ct3mQpvpGC6iGHzEc/NHJP8Efvh/\n" - "CcUWmLjLGJYYeP5oNu5cncC3fXUCgYEA2LANATm0A6sFVGe3sSLO9un1brA4zlZE\n" - "Hjd3KOZnMPt73B426qUOcw5B2wIS8GJsUES0P94pKg83oyzmoUV9vJpJLjHA4qmL\n" - "CDAd6CjAmE5ea4dFdZwDDS8F9FntJMdPQJA9vq+JaeS+k7ds3+7oiNe+RUIHR1Sz\n" - "VEAKh3Xw66kCgYB7KO/2Mchesu5qku2tZJhHF4QfP5cNcos511uO3bmJ3ln+16uR\n" - "GRqz7Vu0V6f7dvzPJM/O2QYqV5D9f9dHzN2YgvU9+QSlUeFK9PyxPv3vJt/WP1//\n" - "zf+nbpaRbwLxnCnNsKSQJFpnrE166/pSZfFbmZQpNlyeIuJU8czZGQTifQKBgHXe\n" - "/pQGEZhVNab+bHwdFTxXdDzr+1qyrodJYLaM7uFES9InVXQ6qSuJO+WosSi2QXlA\n" - "hlSfwwCwGnHXAPYFWSp5Owm34tbpp0mi8wHQ+UNgjhgsE2qwnTBUvgZ3zHpPORtD\n" - "23KZBkTmO40bIEyIJ1IZGdWO32q79nkEBTY+v/lRAoGBAI1rbouFYPBrTYQ9kcjt\n" - "1yfu4JF5MvO9JrHQ9tOwkqDmNCWx9xWXbgydsn/eFtuUMULWsG3lNjfst/Esb8ch\n" - "k5cZd6pdJZa4/vhEwrYYSuEjMCnRb0lUsm7TsHxQrUd6Fi/mUuFU/haC0o0chLq7\n" - "pVOUFq5mW8p0zbtfHbjkgxyF\n" - "-----END PRIVATE KEY-----\n"; - - std::string const dh = - "-----BEGIN DH PARAMETERS-----\n" - "MIIBCAKCAQEArzQc5mpm0Fs8yahDeySj31JZlwEphUdZ9StM2D8+Fo7TMduGtSi+\n" - "/HRWVwHcTFAgrxVdm+dl474mOUqqaz4MpzIb6+6OVfWHbQJmXPepZKyu4LgUPvY/\n" - "4q3/iDMjIS0fLOu/bLuObwU5ccZmDgfhmz1GanRlTQOiYRty3FiOATWZBRh6uv4u\n" - "tff4A9Bm3V9tLx9S6djq31w31Gl7OQhryodW28kc16t9TvO1BzcV3HjRPwpe701X\n" - "oEEZdnZWANkkpR/m/pfgdmGPU66S2sXMHgsliViQWpDCYeehrvFRHEdR9NV+XJfC\n" - "QMUk26jPTIVTLfXmmwU0u8vUkpR7LQKkwwIBAg==\n" - "-----END DH PARAMETERS-----\n"; - - ctx.set_password_callback( - [](std::size_t, - boost::asio::ssl::context_base::password_purpose) - { - return "test"; - }); - - ctx.set_options( - boost::asio::ssl::context::default_workarounds | - boost::asio::ssl::context::no_sslv2 | - boost::asio::ssl::context::single_dh_use); - - ctx.use_certificate_chain( - boost::asio::buffer(cert.data(), cert.size())); - - ctx.use_private_key( - boost::asio::buffer(key.data(), key.size()), - boost::asio::ssl::context::file_format::pem); - - ctx.use_tmp_dh( - boost::asio::buffer(dh.data(), dh.size())); -} - -#endif \ No newline at end of file diff --git a/server/listener.h b/server/listener.h index 34bd03d6..a888766c 100644 --- a/server/listener.h +++ b/server/listener.h @@ -32,9 +32,9 @@ class SubscriptionManager; // Accepts incoming connections and launches the sessions template -class listener : public std::enable_shared_from_this> +class Listener : public std::enable_shared_from_this> { - using std::enable_shared_from_this>::shared_from_this; + using std::enable_shared_from_this>::shared_from_this; boost::asio::io_context& ioc_; boost::asio::ip::tcp::acceptor acceptor_; @@ -128,7 +128,7 @@ private: acceptor_.async_accept( boost::asio::make_strand(ioc_), boost::beast::bind_front_handler( - &listener::on_accept, shared_from_this())); + &Listener::on_accept, shared_from_this())); } void diff --git a/server/websocket_server_async.cpp b/server/websocket_server_async.cpp index cdccea66..77aa6659 100644 --- a/server/websocket_server_async.cpp +++ b/server/websocket_server_async.cpp @@ -63,8 +63,45 @@ parse_config(const char* filename) } return {}; } -//------------------------------------------------------------------------------ -// + +std::optional +parse_certs(const char* certFilename, const char* keyFilename) +{ + std::ifstream readCert(certFilename, std::ios::in | std::ios::binary); + if (!readCert) + return {}; + + std::stringstream contents; + contents << readCert.rdbuf(); + readCert.close(); + std::string cert = contents.str(); + + std::ifstream readKey(keyFilename, std::ios::in | std::ios::binary); + if(!readKey) + return {}; + + contents.str(""); + contents << readKey.rdbuf(); + readKey.close(); + std::string key = contents.str(); + + ssl::context ctx{ssl::context::tlsv12}; + + ctx.set_options( + boost::asio::ssl::context::default_workarounds | + boost::asio::ssl::context::no_sslv2); + + ctx.use_certificate_chain( + boost::asio::buffer(cert.data(), cert.size())); + + ctx.use_private_key( + boost::asio::buffer(key.data(), key.size()), + boost::asio::ssl::context::file_format::pem); + + return ctx; +} + + void initLogLevel(int level) { @@ -115,18 +152,19 @@ int main(int argc, char* argv[]) { // Check command line arguments. - if (argc != 3 and argc != 4) + if (argc != 5 and argc != 6) { std::cerr << "Usage: websocket-server-async " - " \n" + " \n" << "Example:\n" - << " websocket-server-async 1 config.json 2\n"; + << " websocket-server-async 1 config.json cert.pem key.pem 2\n"; return EXIT_FAILURE; } auto const threads = std::max(1, std::atoi(argv[1])); auto const config = parse_config(argv[2]); + auto ctx = parse_certs(argv[3], argv[4]); if (argc > 5) { @@ -141,6 +179,12 @@ main(int argc, char* argv[]) std::cerr << "couldnt parse config. Exiting..." << std::endl; return EXIT_FAILURE; } + if (!ctx) + { + std::cerr << "could not parse certs, Exiting..." << std::endl; + return EXIT_FAILURE; + } + boost::asio::io_context ioc{threads};