diff options
Diffstat (limited to 'Swiften/Client/CoreClient.cpp')
| -rw-r--r-- | Swiften/Client/CoreClient.cpp | 99 | 
1 files changed, 74 insertions, 25 deletions
diff --git a/Swiften/Client/CoreClient.cpp b/Swiften/Client/CoreClient.cpp index f0c5333..ab9e947 100644 --- a/Swiften/Client/CoreClient.cpp +++ b/Swiften/Client/CoreClient.cpp @@ -4,25 +4,31 @@   * See Documentation/Licenses/GPLv3.txt for more information.   */ -#include "Swiften/Client/CoreClient.h" +#include <Swiften/Client/CoreClient.h>  #include <boost/bind.hpp> +#include <boost/smart_ptr/make_shared.hpp> -#include "Swiften/Client/ClientSession.h" -#include "Swiften/TLS/PlatformTLSFactories.h" -#include "Swiften/TLS/CertificateVerificationError.h" -#include "Swiften/Network/Connector.h" -#include "Swiften/Network/NetworkFactories.h" -#include "Swiften/TLS/PKCS12Certificate.h" -#include "Swiften/Session/BasicSessionStream.h" -#include "Swiften/Queries/IQRouter.h" -#include "Swiften/Base/IDGenerator.h" -#include "Swiften/Client/ClientSessionStanzaChannel.h" +#include <Swiften/Base/IDGenerator.h>  #include <Swiften/Base/Log.h> +#include <Swiften/Base/foreach.h> +#include <Swiften/Base/Algorithm.h> +#include <Swiften/Client/ClientSession.h> +#include <Swiften/TLS/PlatformTLSFactories.h> +#include <Swiften/TLS/CertificateVerificationError.h> +#include <Swiften/Network/ChainedConnector.h> +#include <Swiften/Network/NetworkFactories.h> +#include <Swiften/TLS/PKCS12Certificate.h> +#include <Swiften/Session/BasicSessionStream.h> +#include <Swiften/Queries/IQRouter.h> +#include <Swiften/Client/ClientSessionStanzaChannel.h> +#include <Swiften/Network/PlatformProxyProvider.h> +#include <Swiften/Network/SOCKS5ProxiedConnectionFactory.h> +#include <Swiften/Network/HTTPConnectProxiedConnectionFactory.h>  namespace Swift { -CoreClient::CoreClient(const JID& jid, const std::string& password, NetworkFactories* networkFactories) : jid_(jid), password_(password), networkFactories(networkFactories), useStreamCompression(true), useTLS(UseTLSWhenAvailable), disconnectRequested_(false), certificateTrustChecker(NULL) { +CoreClient::CoreClient(const JID& jid, const SafeByteArray& password, NetworkFactories* networkFactories) : jid_(jid), password_(password), networkFactories(networkFactories), disconnectRequested_(false), certificateTrustChecker(NULL) {  	stanzaChannel_ = new ClientSessionStanzaChannel();  	stanzaChannel_->onMessageReceived.connect(boost::bind(&CoreClient::handleMessageReceived, this, _1));  	stanzaChannel_->onPresenceReceived.connect(boost::bind(&CoreClient::handlePresenceReceived, this, _1)); @@ -47,8 +53,9 @@ CoreClient::~CoreClient() {  	delete stanzaChannel_;  } -void CoreClient::connect() { +void CoreClient::connect(const ClientOptions& o) {  	SWIFT_LOG(debug) << "Connecting" << std::endl; +	options = o;  	connect(jid_.getDomain());  } @@ -56,7 +63,19 @@ void CoreClient::connect(const std::string& host) {  	SWIFT_LOG(debug) << "Connecting to host " << host << std::endl;  	disconnectRequested_ = false;  	assert(!connector_); -	connector_ = Connector::create(host, networkFactories->getDomainNameResolver(), networkFactories->getConnectionFactory(), networkFactories->getTimerFactory()); + +	assert(proxyConnectionFactories.empty()); +	PlatformProxyProvider proxyProvider; +	if(proxyProvider.getSOCKS5Proxy().isValid()) { +		proxyConnectionFactories.push_back(new SOCKS5ProxiedConnectionFactory(networkFactories->getConnectionFactory(), proxyProvider.getSOCKS5Proxy())); +	} +	if(proxyProvider.getHTTPConnectProxy().isValid()) { +		proxyConnectionFactories.push_back(new HTTPConnectProxiedConnectionFactory(networkFactories->getConnectionFactory(), proxyProvider.getHTTPConnectProxy())); +	} +	std::vector<ConnectionFactory*> connectionFactories(proxyConnectionFactories); +	connectionFactories.push_back(networkFactories->getConnectionFactory()); + +	connector_ = boost::make_shared<ChainedConnector>(host, networkFactories->getDomainNameResolver(), connectionFactories, networkFactories->getTimerFactory());  	connector_->onConnectFinished.connect(boost::bind(&CoreClient::handleConnectorFinished, this, _1));  	connector_->setTimeoutMilliseconds(60*1000);  	connector_->start(); @@ -65,7 +84,14 @@ void CoreClient::connect(const std::string& host) {  void CoreClient::handleConnectorFinished(boost::shared_ptr<Connection> connection) {  	connector_->onConnectFinished.disconnect(boost::bind(&CoreClient::handleConnectorFinished, this, _1));  	connector_.reset(); +	foreach(ConnectionFactory* f, proxyConnectionFactories) { +		delete f; +	} +  	if (!connection) { +		if (options.forgetPassword) { +			purgePassword(); +		}  		onDisconnected(disconnectRequested_ ? boost::optional<ClientError>() : boost::optional<ClientError>(ClientError::ConnectionError));  	}  	else { @@ -73,7 +99,7 @@ void CoreClient::handleConnectorFinished(boost::shared_ptr<Connection> connectio  		connection_ = connection;  		assert(!sessionStream_); -		sessionStream_ = boost::shared_ptr<BasicSessionStream>(new BasicSessionStream(ClientStreamType, connection_, getPayloadParserFactories(), getPayloadSerializers(), tlsFactories->getTLSContextFactory(), networkFactories->getTimerFactory())); +		sessionStream_ = boost::make_shared<BasicSessionStream>(ClientStreamType, connection_, getPayloadParserFactories(), getPayloadSerializers(), tlsFactories->getTLSContextFactory(), networkFactories->getTimerFactory());  		if (!certificate_.empty()) {  			sessionStream_->setTLSCertificate(PKCS12Certificate(certificate_, password_));  		} @@ -82,12 +108,13 @@ void CoreClient::handleConnectorFinished(boost::shared_ptr<Connection> connectio  		session_ = ClientSession::create(jid_, sessionStream_);  		session_->setCertificateTrustChecker(certificateTrustChecker); -		session_->setUseStreamCompression(useStreamCompression); -		switch(useTLS) { -			case UseTLSWhenAvailable: +		session_->setUseStreamCompression(options.useStreamCompression); +		session_->setAllowPLAINOverNonTLS(options.allowPLAINWithoutTLS); +		switch(options.useTLS) { +			case ClientOptions::UseTLSWhenAvailable:  				session_->setUseTLS(ClientSession::UseTLSWhenAvailable);  				break; -			case NeverUseTLS: +			case ClientOptions::NeverUseTLS:  				session_->setUseTLS(ClientSession::NeverUseTLS);  				break;  		} @@ -115,6 +142,9 @@ void CoreClient::setCertificate(const std::string& certificate) {  }  void CoreClient::handleSessionFinished(boost::shared_ptr<Error> error) { +	if (options.forgetPassword) { +		purgePassword(); +	}  	session_->onFinished.disconnect(boost::bind(&CoreClient::handleSessionFinished, this, _1));  	session_->onNeedCredentials.disconnect(boost::bind(&CoreClient::handleNeedCredentials, this)); @@ -226,13 +256,16 @@ void CoreClient::handleSessionFinished(boost::shared_ptr<Error> error) {  void CoreClient::handleNeedCredentials() {  	assert(session_);  	session_->sendCredentials(password_); +	if (options.forgetPassword) { +		purgePassword(); +	}  } -void CoreClient::handleDataRead(const std::string& data) { +void CoreClient::handleDataRead(const SafeByteArray& data) {  	onDataRead(data);  } -void CoreClient::handleDataWritten(const std::string& data) { +void CoreClient::handleDataWritten(const SafeByteArray& data) {  	onDataWritten(data);  } @@ -275,13 +308,29 @@ void CoreClient::handleStanzaAcked(Stanza::ref stanza) {  	onStanzaAcked(stanza);  } -void CoreClient::setUseStreamCompression(bool b) { -	useStreamCompression = b; +bool CoreClient::isAvailable() const { +	return stanzaChannel_->isAvailable();  } -void CoreClient::setUseTLS(UseTLS b) { -	useTLS = b; +bool CoreClient::getStreamManagementEnabled() const { +	return stanzaChannel_->getStreamManagementEnabled();  } +StanzaChannel* CoreClient::getStanzaChannel() const { +	return stanzaChannel_; +} + +const JID& CoreClient::getJID() const { +	if (session_) { +		return session_->getLocalJID(); +	} +	else { +		return jid_; +	} +} + +void CoreClient::purgePassword() { +	safeClear(password_); +}  }  | 
 Swift