diff options
Diffstat (limited to 'Swift/Controllers/MainController.cpp')
| -rw-r--r-- | Swift/Controllers/MainController.cpp | 143 | 
1 files changed, 99 insertions, 44 deletions
| diff --git a/Swift/Controllers/MainController.cpp b/Swift/Controllers/MainController.cpp index 9a35cc1..f759e98 100644 --- a/Swift/Controllers/MainController.cpp +++ b/Swift/Controllers/MainController.cpp @@ -1,5 +1,5 @@  /* - * Copyright (c) 2010 Kevin Smith + * Copyright (c) 2010-2011 Kevin Smith   * Licensed under the GNU General Public License v3.   * See Documentation/Licenses/GPLv3.txt for more information.   */ @@ -14,14 +14,13 @@  #include <stdlib.h>  #include <Swiften/Base/format.h> +#include <Swiften/Base/Algorithm.h>  #include <Swift/Controllers/Intl.h>  #include <Swift/Controllers/UIInterfaces/UIFactory.h>  #include "Swiften/Network/TimerFactory.h"  #include "Swift/Controllers/BuildVersion.h" -#include "Swift/Controllers/StoragesFactory.h"  #include "Swiften/Client/Storages.h"  #include "Swiften/VCards/VCardManager.h" -#include "Swift/Controllers/Chat/MUCSearchController.h"  #include "Swift/Controllers/Chat/UserSearchController.h"  #include "Swift/Controllers/Chat/ChatsManager.h"  #include "Swift/Controllers/XMPPEvents/EventController.h" @@ -41,6 +40,7 @@  #include "Swift/Controllers/UIEvents/UIEventStream.h"  #include "Swift/Controllers/PresenceNotifier.h"  #include "Swift/Controllers/EventNotifier.h" +#include "Swift/Controllers/Storages/StoragesFactory.h"  #include "SwifTools/Dock/Dock.h"  #include "SwifTools/Notifier/TogglableNotifier.h"  #include "Swiften/Base/foreach.h" @@ -60,11 +60,13 @@  #include "Swift/Controllers/UIEvents/RequestChatUIEvent.h"  #include "Swift/Controllers/UIEvents/ToggleNotificationsUIEvent.h"  #include "Swift/Controllers/UIEvents/JoinMUCUIEvent.h" -#include "Swift/Controllers/CertificateStorageFactory.h" -#include "Swift/Controllers/CertificateStorageTrustChecker.h" +#include "Swift/Controllers/Storages/CertificateStorageFactory.h" +#include "Swift/Controllers/Storages/CertificateStorageTrustChecker.h"  #include "Swiften/Network/NetworkFactories.h"  #include <Swift/Controllers/ProfileController.h>  #include <Swift/Controllers/ContactEditController.h> +#include <Swift/Controllers/XMPPURIController.h> +#include "Swift/Controllers/AdHocManager.h"  namespace Swift { @@ -84,7 +86,9 @@ MainController::MainController(  		CertificateStorageFactory* certificateStorageFactory,  		Dock* dock,  		Notifier* notifier, -		bool useDelayForLatency) : +		URIHandler* uriHandler, +		bool useDelayForLatency, +		bool eagleMode) :  			eventLoop_(eventLoop),  			networkFactories_(networkFactories),  			uiFactory_(uiFactories), @@ -92,8 +96,10 @@ MainController::MainController(  			storagesFactory_(storagesFactory),  			certificateStorageFactory_(certificateStorageFactory),  			settings_(settings), +			uriHandler_(uriHandler),  			loginWindow_(NULL) , -			useDelayForLatency_(useDelayForLatency) { +			useDelayForLatency_(useDelayForLatency), +			eagleMode_(eagleMode) {  	storages_ = NULL;  	certificateStorage_ = NULL;  	statusTracker_ = NULL; @@ -121,23 +127,31 @@ MainController::MainController(  	loginWindow_ = uiFactory_->createLoginWindow(uiEventStream_);  	soundEventController_ = new SoundEventController(eventController_, soundPlayer, settings, uiEventStream_); +	xmppURIController_ = new XMPPURIController(uriHandler_, uiEventStream_); +  	std::string selectedLoginJID = settings_->getStringSetting("lastLoginJID");  	bool loginAutomatically = settings_->getBoolSetting("loginAutomatically", false);  	std::string cachedPassword;  	std::string cachedCertificate; -	foreach (std::string profile, settings->getAvailableProfiles()) { -		ProfileSettingsProvider profileSettings(profile, settings); -		std::string password = profileSettings.getStringSetting("pass"); -		std::string certificate = profileSettings.getStringSetting("certificate"); -		std::string jid = profileSettings.getStringSetting("jid"); -		loginWindow_->addAvailableAccount(jid, password, certificate); -		if (jid == selectedLoginJID) { -			cachedPassword = password; -			cachedCertificate = certificate; +	if (!eagleMode_) { +		foreach (std::string profile, settings->getAvailableProfiles()) { +			ProfileSettingsProvider profileSettings(profile, settings); +			std::string password = eagleMode ? "" : profileSettings.getStringSetting("pass"); +			std::string certificate = profileSettings.getStringSetting("certificate"); +			std::string jid = profileSettings.getStringSetting("jid"); +			loginWindow_->addAvailableAccount(jid, password, certificate); +			if (jid == selectedLoginJID) { +				cachedPassword = password; +				cachedCertificate = certificate; +			}  		} +		loginWindow_->selectUser(selectedLoginJID); +		loginWindow_->setLoginAutomatically(loginAutomatically); +	} else { +		loginWindow_->setRememberingAllowed(false);  	} -	loginWindow_->selectUser(selectedLoginJID); -	loginWindow_->setLoginAutomatically(loginAutomatically); + +  	loginWindow_->onLoginRequest.connect(boost::bind(&MainController::handleLoginRequest, this, _1, _2, _3, _4, _5));  	loginWindow_->onPurgeSavedLoginRequest.connect(boost::bind(&MainController::handlePurgeSavedLoginRequest, this, _1));  	loginWindow_->onCancelLoginRequest.connect(boost::bind(&MainController::handleCancelLoginRequest, this)); @@ -161,12 +175,14 @@ MainController::MainController(  }  MainController::~MainController() { +	purgeCachedCredentials();  	//setManagersOffline();  	eventController_->disconnectAll();  	resetClient();  	delete xmlConsoleController_; +	delete xmppURIController_;  	delete soundEventController_;  	delete systemTrayController_;  	delete eventController_; @@ -174,7 +190,12 @@ MainController::~MainController() {  	delete uiEventStream_;  } +void MainController::purgeCachedCredentials() { +	safeClear(password_); +} +  void MainController::resetClient() { +	purgeCachedCredentials();  	resetCurrentError();  	resetPendingReconnects();  	vCardPhotoHash_.clear(); @@ -237,6 +258,9 @@ void MainController::handleConnected() {  	loginWindow_->setIsLoggingIn(false);  	resetCurrentError();  	resetPendingReconnects(); +	if (eagleMode_) { +		purgeCachedCredentials(); +	}  	bool freshLogin = rosterController_ == NULL;  	myStatusLooksOnline_ = true;  	if (freshLogin) { @@ -247,7 +271,7 @@ void MainController::handleConnected() {  		contactEditController_ = new ContactEditController(rosterController_, uiFactory_, uiEventStream_); -		chatsManager_ = new ChatsManager(jid_, client_->getStanzaChannel(), client_->getIQRouter(), eventController_, uiFactory_, uiFactory_, client_->getNickResolver(), client_->getPresenceOracle(), client_->getPresenceSender(), uiEventStream_, uiFactory_, useDelayForLatency_, networkFactories_->getTimerFactory(), client_->getMUCRegistry(), client_->getEntityCapsProvider(), client_->getMUCManager(), uiFactory_, settings_); +		chatsManager_ = new ChatsManager(jid_, client_->getStanzaChannel(), client_->getIQRouter(), eventController_, uiFactory_, uiFactory_, client_->getNickResolver(), client_->getPresenceOracle(), client_->getPresenceSender(), uiEventStream_, uiFactory_, useDelayForLatency_, networkFactories_->getTimerFactory(), client_->getMUCRegistry(), client_->getEntityCapsProvider(), client_->getMUCManager(), uiFactory_, profileSettings_);  		client_->onMessageReceived.connect(boost::bind(&ChatsManager::handleIncomingMessage, chatsManager_, _1));  		chatsManager_->setAvatarManager(client_->getAvatarManager()); @@ -262,14 +286,14 @@ void MainController::handleConnected() {  		client_->getDiscoManager()->setCapsNode(CLIENT_NODE);  		client_->getDiscoManager()->setDiscoInfo(discoInfo); -  		userSearchControllerChat_ = new UserSearchController(UserSearchController::StartChat, jid_, uiEventStream_, uiFactory_, client_->getIQRouter(), rosterController_);  		userSearchControllerAdd_ = new UserSearchController(UserSearchController::AddContact, jid_, uiEventStream_, uiFactory_, client_->getIQRouter(), rosterController_); +		adHocManager_ = new AdHocManager(boundJID_, uiFactory_, client_->getIQRouter(), uiEventStream_, rosterController_->getWindow());  	}  	client_->requestRoster(); -	GetDiscoInfoRequest::ref discoInfoRequest = GetDiscoInfoRequest::create(JID(), client_->getIQRouter()); +	GetDiscoInfoRequest::ref discoInfoRequest = GetDiscoInfoRequest::create(boundJID_.toBare(), client_->getIQRouter());  	discoInfoRequest->onResponse.connect(boost::bind(&MainController::handleServerDiscoInfoResponse, this, _1, _2));  	discoInfoRequest->send(); @@ -356,19 +380,27 @@ void MainController::handleInputIdleChanged(bool idle) {  }  void MainController::handleLoginRequest(const std::string &username, const std::string &password, const std::string& certificateFile, bool remember, bool loginAutomatically) { -	loginWindow_->setMessage(""); -	loginWindow_->setIsLoggingIn(true); -	profileSettings_ = new ProfileSettingsProvider(username, settings_); -	profileSettings_->storeString("jid", username); -	profileSettings_->storeString("certificate", certificateFile); -	profileSettings_->storeString("pass", (remember || loginAutomatically) ? password : ""); -	settings_->storeString("lastLoginJID", username); -	settings_->storeBool("loginAutomatically", loginAutomatically); -	loginWindow_->addAvailableAccount(profileSettings_->getStringSetting("jid"), profileSettings_->getStringSetting("pass"), profileSettings_->getStringSetting("certificate"));  	jid_ = JID(username); -	password_ = password; -	certificateFile_ = certificateFile; -	performLoginFromCachedCredentials(); +	if (!jid_.isValid() || jid_.getNode().empty()) { +		loginWindow_->setMessage(QT_TRANSLATE_NOOP("", "User address invalid. User address should be of the form 'alice@wonderland.lit'")); +		loginWindow_->setIsLoggingIn(false); +	} else { +		loginWindow_->setMessage(""); +		loginWindow_->setIsLoggingIn(true); +		profileSettings_ = new ProfileSettingsProvider(username, settings_); +		if (!eagleMode_) { +			profileSettings_->storeString("jid", username); +			profileSettings_->storeString("certificate", certificateFile); +			profileSettings_->storeString("pass", (remember || loginAutomatically) ? password : ""); +			settings_->storeString("lastLoginJID", username); +			settings_->storeBool("loginAutomatically", loginAutomatically); +			loginWindow_->addAvailableAccount(profileSettings_->getStringSetting("jid"), profileSettings_->getStringSetting("pass"), profileSettings_->getStringSetting("certificate")); +		} + +		password_ = password; +		certificateFile_ = certificateFile; +		performLoginFromCachedCredentials(); +	}  }  void MainController::handlePurgeSavedLoginRequest(const std::string& username) { @@ -377,6 +409,10 @@ void MainController::handlePurgeSavedLoginRequest(const std::string& username) {  }  void MainController::performLoginFromCachedCredentials() { +	if (eagleMode_ && password_.empty()) { +		/* Then we can't try to login again. */ +		return; +	}  	/* If we logged in with a bare JID, and we have a full bound JID, re-login with the  	 * bound JID to try and keep dynamically assigned resources */  	JID clientJID = jid_; @@ -392,7 +428,7 @@ void MainController::performLoginFromCachedCredentials() {  		certificateStorage_ = certificateStorageFactory_->createCertificateStorage(jid_.toBare());  		certificateTrustChecker_ = new CertificateStorageTrustChecker(certificateStorage_); -		client_ = boost::make_shared<Swift::Client>(clientJID, password_, networkFactories_, storages_); +		client_ = boost::make_shared<Swift::Client>(clientJID, createSafeByteArray(password_.c_str()), networkFactories_, storages_);  		clientInitialized_ = true;  		client_->setCertificateTrustChecker(certificateTrustChecker_);  		client_->onDataRead.connect(boost::bind(&XMLConsoleController::handleDataRead, xmlConsoleController_, _1)); @@ -422,11 +458,15 @@ void MainController::performLoginFromCachedCredentials() {  	if (rosterController_) {  		rosterController_->getWindow()->setConnecting();  	} - -	client_->connect(); +	ClientOptions clientOptions; +	clientOptions.forgetPassword = eagleMode_; +	client_->connect(clientOptions);  }  void MainController::handleDisconnected(const boost::optional<ClientError>& error) { +	if (eagleMode_) { +		purgeCachedCredentials(); +	}  	if (quitRequested_) {  		resetClient();  		loginWindow_->quit(); @@ -483,19 +523,27 @@ void MainController::handleDisconnected(const boost::optional<ClientError>& erro  		else if (!rosterController_) { //hasn't been logged in yet  			signOut();  			loginWindow_->setMessage(message); +			loginWindow_->setIsLoggingIn(false);  		} else {  			logout(); -			setReconnectTimer(); -			if (lastDisconnectError_) { -				message = str(format(QT_TRANSLATE_NOOP("", "Reconnect to %1% failed: %2%. Will retry in %3% seconds.")) % jid_.getDomain() % message % boost::lexical_cast<std::string>(timeBeforeNextReconnect_)); -				lastDisconnectError_->conclude(); +			if (eagleMode_) { +				message = str(format(QT_TRANSLATE_NOOP("", "Disconnected from %1%: %2%. To reconnect, Sign Out and provide your password again.")) % jid_.getDomain() % message);  			} else { -				message = str(format(QT_TRANSLATE_NOOP("", "Disconnected from %1%: %2%.")) % jid_.getDomain() % message); +				setReconnectTimer(); +				if (lastDisconnectError_) { +					message = str(format(QT_TRANSLATE_NOOP("", "Reconnect to %1% failed: %2%. Will retry in %3% seconds.")) % jid_.getDomain() % message % boost::lexical_cast<std::string>(timeBeforeNextReconnect_)); +					lastDisconnectError_->conclude(); +				} else { +					message = str(format(QT_TRANSLATE_NOOP("", "Disconnected from %1%: %2%.")) % jid_.getDomain() % message); +				} +				lastDisconnectError_ = boost::shared_ptr<ErrorEvent>(new ErrorEvent(JID(jid_.getDomain()), message)); +				eventController_->handleIncomingEvent(lastDisconnectError_);  			} -			lastDisconnectError_ = boost::shared_ptr<ErrorEvent>(new ErrorEvent(JID(jid_.getDomain()), message)); -			eventController_->handleIncomingEvent(lastDisconnectError_);  		}  	} +	else if (!rosterController_) { //hasn't been logged in yet +		loginWindow_->setIsLoggingIn(false); +	}  }  void MainController::setReconnectTimer() { @@ -517,6 +565,9 @@ void MainController::handleCancelLoginRequest() {  }  void MainController::signOut() { +	if (eagleMode_) { +		purgeCachedCredentials(); +	}  	eventController_->clear();  	logout();  	loginWindow_->loggedOut(); @@ -524,6 +575,9 @@ void MainController::signOut() {  }  void MainController::logout() { +	if (eagleMode_) { +		purgeCachedCredentials(); +	}  	systemTrayController_->setMyStatusType(StatusShow::None);  	if (clientInitialized_ /*&& client_->isAvailable()*/) {  		client_->disconnect(); @@ -554,11 +608,12 @@ void MainController::setManagersOffline() {  void MainController::handleServerDiscoInfoResponse(boost::shared_ptr<DiscoInfo> info, ErrorPayload::ref error) {  	if (!error) {  		chatsManager_->setServerDiscoInfo(info); +		adHocManager_->setServerDiscoInfo(info);  	}  }  void MainController::handleVCardReceived(const JID& jid, VCard::ref vCard) { -	if (!jid.equals(jid_, JID::WithoutResource) || !vCard || vCard->getPhoto().isEmpty()) { +	if (!jid.equals(jid_, JID::WithoutResource) || !vCard || vCard->getPhoto().empty()) {  		return;  	}  	std::string hash = Hexify::hexify(SHA1::getHash(vCard->getPhoto())); | 
 Swift
 Swift