summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTobias Markmann <tm@ayena.de>2015-03-08 15:36:49 (GMT)
committerKevin Smith <kevin.smith@isode.com>2015-05-01 17:14:55 (GMT)
commit794fec2873e69ec047974416768b32b69754dad1 (patch)
treea3cc8cb221e9ee7ad5c40a9de0ccc03e5f9d9562 /Swiften/FileTransfer/SOCKS5BytestreamServerManager.cpp
parentd7bc3a37f4bb261c8520a8ddedcda2369f97361c (diff)
downloadswift-794fec2873e69ec047974416768b32b69754dad1.zip
swift-794fec2873e69ec047974416768b32b69754dad1.tar.bz2
Add resource management for S5B server and port forwardings
This patchs adds management of the SOCKS5 bytestream server and port forwarding setup to Swiften. The first file-transfer, regardless of incoming or outgoing transfer, will start and initialize the S5B server and if configured try to set up port forwarding. The last file-transfer to finish will will close the server and remove the port forwarding. Test-Information: Tested with upcoming ConcurrentFileTransferTest.cpp and running multiple S5B file-transfers in parallel. Change-Id: Idd09d3d0ef9498fc9435b0aee81f2b1061783342
Diffstat (limited to 'Swiften/FileTransfer/SOCKS5BytestreamServerManager.cpp')
-rw-r--r--Swiften/FileTransfer/SOCKS5BytestreamServerManager.cpp99
1 files changed, 64 insertions, 35 deletions
diff --git a/Swiften/FileTransfer/SOCKS5BytestreamServerManager.cpp b/Swiften/FileTransfer/SOCKS5BytestreamServerManager.cpp
index cf4ae84..43d3e46 100644
--- a/Swiften/FileTransfer/SOCKS5BytestreamServerManager.cpp
+++ b/Swiften/FileTransfer/SOCKS5BytestreamServerManager.cpp
@@ -15,7 +15,8 @@
#include <boost/smart_ptr/make_shared.hpp>
#include <boost/bind.hpp>
-#include <Swiften/FileTransfer/SOCKS5BytestreamServerInitializeRequest.h>
+#include <Swiften/FileTransfer/SOCKS5BytestreamServerResourceUser.h>
+#include <Swiften/FileTransfer/SOCKS5BytestreamServerPortForwardingUser.h>
#include <Swiften/Base/foreach.h>
#include <Swiften/Base/Log.h>
#include <Swiften/FileTransfer/SOCKS5BytestreamServer.h>
@@ -42,7 +43,8 @@ SOCKS5BytestreamServerManager::SOCKS5BytestreamServerManager(
networkEnvironment(networkEnvironment),
natTraverser(natTraverser),
state(Start),
- server(NULL) {
+ server(NULL),
+ attemptedPortMapping_(false) {
}
SOCKS5BytestreamServerManager::~SOCKS5BytestreamServerManager() {
@@ -57,9 +59,28 @@ SOCKS5BytestreamServerManager::~SOCKS5BytestreamServerManager() {
}
}
+boost::shared_ptr<SOCKS5BytestreamServerResourceUser> SOCKS5BytestreamServerManager::aquireResourceUser() {
+ boost::shared_ptr<SOCKS5BytestreamServerResourceUser> resourceUser;
+ if (s5bServerResourceUser_.expired()) {
+ resourceUser = boost::make_shared<SOCKS5BytestreamServerResourceUser>(this);
+ s5bServerResourceUser_ = resourceUser;
+ }
+ else {
+ resourceUser = s5bServerResourceUser_.lock();
+ }
+ return resourceUser;
+}
-boost::shared_ptr<SOCKS5BytestreamServerInitializeRequest> SOCKS5BytestreamServerManager::createInitializeRequest() {
- return boost::make_shared<SOCKS5BytestreamServerInitializeRequest>(this);
+boost::shared_ptr<SOCKS5BytestreamServerPortForwardingUser> SOCKS5BytestreamServerManager::aquirePortForwardingUser() {
+ boost::shared_ptr<SOCKS5BytestreamServerPortForwardingUser> portForwardingUser;
+ if (s5bServerPortForwardingUser_.expired()) {
+ portForwardingUser = boost::make_shared<SOCKS5BytestreamServerPortForwardingUser>(this);
+ s5bServerPortForwardingUser_ = portForwardingUser;
+ }
+ else {
+ portForwardingUser = s5bServerPortForwardingUser_.lock();
+ }
+ return portForwardingUser;
}
std::vector<HostAddressPort> SOCKS5BytestreamServerManager::getHostAddressPorts() const {
@@ -121,24 +142,44 @@ void SOCKS5BytestreamServerManager::initialize() {
assert(!server);
server = new SOCKS5BytestreamServer(connectionServer, bytestreamRegistry);
server->start();
+ checkInitializeFinished();
+ }
+}
- // Retrieve public addresses
- assert(!getPublicIPRequest);
- publicAddress = boost::optional<HostAddress>();
- if ((getPublicIPRequest = natTraverser->createGetPublicIPRequest())) {
- getPublicIPRequest->onResult.connect(
- boost::bind(&SOCKS5BytestreamServerManager::handleGetPublicIPResult, this, _1));
- getPublicIPRequest->start();
- }
+bool SOCKS5BytestreamServerManager::isPortForwardingReady() const {
+ return attemptedPortMapping_ && !getPublicIPRequest && !forwardPortRequest;
+}
- // Forward ports
- assert(!forwardPortRequest);
- portMapping = boost::optional<NATPortMapping>();
- if ((forwardPortRequest = natTraverser->createForwardPortRequest(port, port))) {
- forwardPortRequest->onResult.connect(
- boost::bind(&SOCKS5BytestreamServerManager::handleForwardPortResult, this, _1));
- forwardPortRequest->start();
- }
+void SOCKS5BytestreamServerManager::setupPortForwarding() {
+ assert(server);
+ attemptedPortMapping_ = true;
+
+ // Retrieve public addresses
+ assert(!getPublicIPRequest);
+ publicAddress = boost::optional<HostAddress>();
+ if ((getPublicIPRequest = natTraverser->createGetPublicIPRequest())) {
+ getPublicIPRequest->onResult.connect(
+ boost::bind(&SOCKS5BytestreamServerManager::handleGetPublicIPResult, this, _1));
+ getPublicIPRequest->start();
+ }
+
+ // Forward ports
+ int port = server->getAddressPort().getPort();
+ assert(!forwardPortRequest);
+ portMapping = boost::optional<NATPortMapping>();
+ if ((forwardPortRequest = natTraverser->createForwardPortRequest(port, port))) {
+ forwardPortRequest->onResult.connect(
+ boost::bind(&SOCKS5BytestreamServerManager::handleForwardPortResult, this, _1));
+ forwardPortRequest->start();
+ }
+}
+
+void SOCKS5BytestreamServerManager::removePortForwarding() {
+ // remove port forwards
+ if (portMapping) {
+ unforwardPortRequest = natTraverser->createRemovePortForwardingRequest(portMapping.get().getLocalPort(), portMapping.get().getPublicPort());
+ unforwardPortRequest->onResult.connect(boost::bind(&SOCKS5BytestreamServerManager::handleUnforwardPortResult, this, _1));
+ unforwardPortRequest->start();
}
}
@@ -156,13 +197,6 @@ void SOCKS5BytestreamServerManager::stop() {
connectionServer.reset();
}
- // remove port forwards
- if (portMapping) {
- unforwardPortRequest = natTraverser->createRemovePortForwardingRequest(portMapping.get().getLocalPort(), portMapping.get().getPublicPort());
- unforwardPortRequest->onResult.connect(boost::bind(&SOCKS5BytestreamServerManager::handleUnforwardPortResult, this, _1));
- unforwardPortRequest->start();
- }
-
state = Start;
}
@@ -178,8 +212,6 @@ void SOCKS5BytestreamServerManager::handleGetPublicIPResult(boost::optional<Host
getPublicIPRequest->stop();
getPublicIPRequest.reset();
-
- checkInitializeFinished();
}
void SOCKS5BytestreamServerManager::handleForwardPortResult(boost::optional<NATPortMapping> mapping) {
@@ -194,8 +226,6 @@ void SOCKS5BytestreamServerManager::handleForwardPortResult(boost::optional<NATP
forwardPortRequest->stop();
forwardPortRequest.reset();
-
- checkInitializeFinished();
}
void SOCKS5BytestreamServerManager::handleUnforwardPortResult(boost::optional<bool> result) {
@@ -205,13 +235,12 @@ void SOCKS5BytestreamServerManager::handleUnforwardPortResult(boost::optional<bo
else {
SWIFT_LOG(warning) << "Failed to remove port forwarding." << std::endl;
}
+ attemptedPortMapping_ = false;
unforwardPortRequest.reset();
}
void SOCKS5BytestreamServerManager::checkInitializeFinished() {
assert(state == Initializing);
- if (!getPublicIPRequest && !forwardPortRequest) {
- state = Initialized;
- onInitialized(true);
- }
+ state = Initialized;
+ onInitialized(true);
}