From 45db776536a8be48aa245cd2c07c1512513f7ce6 Mon Sep 17 00:00:00 2001 From: Amna <amna.snene@savoirfairelinux.com> Date: Wed, 24 Jul 2024 18:33:48 -0400 Subject: [PATCH] tools: add upnp dnc: upnp can be disabled via dnc.yaml only dsh and dvpn : upnp cannot be disabled Change-Id: Ic1a53b049eace145ebdc7ac186ab92a4a0df3635 --- extras/packaging/gnu-linux/debian/postinst | 3 +++ tools/common.cpp | 12 +++++++++++- tools/common.h | 6 +++++- tools/dhtnet_crtmgr/main.cpp | 3 +++ tools/dnc/dnc.cpp | 11 +++++++---- tools/dnc/dnc.h | 6 ++++-- tools/dnc/dnc.yaml | 3 +++ tools/dnc/main.cpp | 10 ++++++++-- 8 files changed, 44 insertions(+), 10 deletions(-) diff --git a/extras/packaging/gnu-linux/debian/postinst b/extras/packaging/gnu-linux/debian/postinst index 39ad146..d716e78 100644 --- a/extras/packaging/gnu-linux/debian/postinst +++ b/extras/packaging/gnu-linux/debian/postinst @@ -60,6 +60,9 @@ configure_yaml() { echo "# When verbose is set to true, the server logs all incoming connections" echo "verbose: false" echo "" + echo "# If true, will send request to use UPNP if available" + echo "enable_upnp: true" + echo "" echo "# On server, identities are saved in /etc/dhtnet/id/" echo "certificate: \"/etc/dhtnet/id/id-server.crt\"" echo "privateKey: \"/etc/dhtnet/id/id-server.pem\"" diff --git a/tools/common.cpp b/tools/common.cpp index 7b10bfd..06b9208 100644 --- a/tools/common.cpp +++ b/tools/common.cpp @@ -53,7 +53,8 @@ connectionManagerConfig(dht::crypto::Identity identity, const std::string& turn_host, const std::string& turn_user, const std::string& turn_pass, - const std::string& turn_realm) + const std::string& turn_realm, + const bool enable_upnp) { // DHT node creation: To make a connection manager at first a DHT node should be created dht::DhtRunner::Config dhtConfig; @@ -93,6 +94,15 @@ connectionManagerConfig(dht::crypto::Identity identity, config->turnServerPwd = turn_pass; config->turnServerRealm = turn_realm; } + + if (enable_upnp) { + // UPnP configuration + auto upnpContext = std::make_shared<dhtnet::upnp::UPnPContext>(ioContext, logger); + auto controller = std::make_shared<dhtnet::upnp::Controller>(upnpContext); + config->upnpEnabled = true; + config->upnpCtrl = controller; + } + return std::move(config); } template<typename T> diff --git a/tools/common.h b/tools/common.h index 97c44c9..dbd72c3 100644 --- a/tools/common.h +++ b/tools/common.h @@ -21,6 +21,9 @@ #include "ice_transport_factory.h" #include "certstore.h" +#include "upnp/upnp_control.h" +#include "upnp/upnp_context.h" + namespace dhtnet { #define Log(...) do { fmt::print(__VA_ARGS__); std::fflush(stdout); } while (0) @@ -40,7 +43,8 @@ std::unique_ptr<ConnectionManager::Config> connectionManagerConfig( const std::string& turn_host ="", const std::string& turn_user="", const std::string& turn_pass="", - const std::string& turn_realm=""); + const std::string& turn_realm="", + const bool enable_upnp=true); // add ioContext to readFromStdin template<typename T> diff --git a/tools/dhtnet_crtmgr/main.cpp b/tools/dhtnet_crtmgr/main.cpp index 70e551e..4705e94 100644 --- a/tools/dhtnet_crtmgr/main.cpp +++ b/tools/dhtnet_crtmgr/main.cpp @@ -122,6 +122,9 @@ int create_yaml_config(std::filesystem::path file, std::filesystem::path certifi yaml_file << "\n# When verbose is set to true, the server logs all incoming connections\n"; yaml_file << "verbose: false\n"; + yaml_file << "\n# If true, will send request to use UPNP if available\n"; + yaml_file << "enable_upnp: true\n"; + yaml_file << "\n# On server, identities are saved in /etc/dhtnet/id/\n"; yaml_file << "# On client, they are generaly saved in ~/.dnc/\n"; yaml_file << "certificate: " << certificate << "\n"; diff --git a/tools/dnc/dnc.cpp b/tools/dnc/dnc.cpp index 18860ae..27cf3b4 100644 --- a/tools/dnc/dnc.cpp +++ b/tools/dnc/dnc.cpp @@ -61,7 +61,8 @@ Dnc::Dnc(dht::crypto::Identity identity, const std::string& turn_realm, const bool anonymous, const bool verbose, - const std::map<std::string, std::vector<int>> authorized_services) + const std::map<std::string, std::vector<int>> authorized_services, + const bool enable_upnp) :logger(verbose ? dht::log::getStdLogger() : nullptr), ioContext(std::make_shared<asio::io_context>()), iceFactory(std::make_shared<IceTransportFactory>(logger)) @@ -91,7 +92,8 @@ Dnc::Dnc(dht::crypto::Identity identity, turn_host, turn_user, turn_pass, - turn_realm); + turn_realm, + enable_upnp); // create a connection manager connectionManager = std::make_unique<ConnectionManager>(std::move(config)); @@ -206,8 +208,9 @@ Dnc::Dnc(dht::crypto::Identity identity, const std::string& turn_user, const std::string& turn_pass, const std::string& turn_realm, - const bool verbose) - : Dnc(identity, bootstrap,turn_host,turn_user,turn_pass, turn_realm, true, verbose, {}) + const bool verbose, + const bool enable_upnp) + : Dnc(identity, bootstrap,turn_host,turn_user,turn_pass, turn_realm, true, verbose, {}, enable_upnp) { std::condition_variable cv; auto name = fmt::format("nc://{:s}:{:d}", remote_host, remote_port); diff --git a/tools/dnc/dnc.h b/tools/dnc/dnc.h index 6e5537d..7d03cc9 100644 --- a/tools/dnc/dnc.h +++ b/tools/dnc/dnc.h @@ -41,7 +41,8 @@ public: const std::string& turn_realm, const bool anonymous, const bool verbose, - const std::map<std::string, std::vector<int>> authorized_services); + const std::map<std::string, std::vector<int>> authorized_services, + const bool enable_upnp); // Build a client Dnc( dht::crypto::Identity identity, @@ -53,7 +54,8 @@ public: const std::string& turn_user, const std::string& turn_pass, const std::string& turn_realm, - const bool verbose); + const bool verbose, + const bool enable_upnp); ~Dnc(); void run(); diff --git a/tools/dnc/dnc.yaml b/tools/dnc/dnc.yaml index f1b06ea..649a9be 100644 --- a/tools/dnc/dnc.yaml +++ b/tools/dnc/dnc.yaml @@ -16,6 +16,9 @@ turn_realm: "ring" # When verbose is set to true, the server logs all incoming connections verbose: false +# If true, will send request to use UPNP if available +enable_upnp: true + # On server, identities are saved in /etc/dhtnet/id/ # On client, identities are saved in ~/.dnc/ #certificate: "to/your/certificate.crt" diff --git a/tools/dnc/main.cpp b/tools/dnc/main.cpp index 2e4d1bf..f759ff5 100644 --- a/tools/dnc/main.cpp +++ b/tools/dnc/main.cpp @@ -51,6 +51,7 @@ struct dhtnc_params bool anonymous_cnx {false}; bool verbose {false}; std::map<std::string, std::vector<int>> authorizedServices {}; + bool enable_upnp {true}; }; static const constexpr struct option long_options[] @@ -201,6 +202,9 @@ parse_args(int argc, char** argv) params.authorizedServices[ip].push_back(port); } } + if (config["enable_upnp"]) { + params.enable_upnp = config["enable_upnp"].as<bool>(); + } } } return params; @@ -272,7 +276,8 @@ main(int argc, char** argv) params.turn_realm, params.anonymous_cnx, params.verbose, - params.authorizedServices); + params.authorizedServices, + params.enable_upnp); } else { dhtnc = std::make_unique<dhtnet::Dnc>(identity, params.bootstrap, @@ -283,7 +288,8 @@ main(int argc, char** argv) params.turn_user, params.turn_pass, params.turn_realm, - params.verbose); + params.verbose, + params.enable_upnp); } dhtnc->run(); return EXIT_SUCCESS; -- GitLab