From 37567ebaa72cfc26e6cf49179eb988594c488c4b Mon Sep 17 00:00:00 2001
From: Kevin Smith <git@kismith.co.uk>
Date: Tue, 26 Apr 2011 08:29:55 +0100
Subject: Don't attempt to login without a valid node@domain JID.

Invalid JIDs and JIDs without nodes will now be rejected.

Resolves: #829
Release-Notes: Username well-formedness will now be checked before attempting to connect.

diff --git a/Swift/Controllers/Chat/ChatsManager.h b/Swift/Controllers/Chat/ChatsManager.h
index 3740186..34cd1bf 100644
--- a/Swift/Controllers/Chat/ChatsManager.h
+++ b/Swift/Controllers/Chat/ChatsManager.h
@@ -52,6 +52,12 @@ namespace Swift {
 			void setServerDiscoInfo(boost::shared_ptr<DiscoInfo> info);
 			void handleIncomingMessage(boost::shared_ptr<Message> message);
 		private:
+			class Chat {
+				public: Chat(const JID& jid, bool isMUC, const std::string& nick) : jid(jid), isMUC(isMUC), nick(nick) {}
+				JID jid;
+				bool isMUC;
+				std::string nick;
+			};
 			void handleChatRequest(const std::string& contact);
 			void handleJoinMUCRequest(const JID& muc, const boost::optional<std::string>& nick, bool autoJoin);
 			void handleSearchMUCRequest();
@@ -64,6 +70,9 @@ namespace Swift {
 			void handleUserLeftMUC(MUCController* mucController);
 			void handleBookmarksReady();
 			void setupBookmarks();
+			void loadRecents();
+			void saveRecents();
+			void handleChatMadeRecent();
 			ChatController* getChatControllerOrFindAnother(const JID &contact);
 			ChatController* createNewChatController(const JID &contact);
 			ChatController* getChatControllerOrCreate(const JID &contact);
@@ -92,5 +101,6 @@ namespace Swift {
 			EntityCapsProvider* entityCapsProvider_;
 			MUCManager* mucManager;
 			MUCSearchController* mucSearchController_;
+			std::vector<Chat> recentChats_;
 	};
 }
diff --git a/Swift/Controllers/MainController.cpp b/Swift/Controllers/MainController.cpp
index 2da16cc..6133ffa 100644
--- a/Swift/Controllers/MainController.cpp
+++ b/Swift/Controllers/MainController.cpp
@@ -362,19 +362,25 @@ 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("", "Username not a valid format"));
+		loginWindow_->setIsLoggingIn(false);
+	} else {
+		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"));
+
+		password_ = password;
+		certificateFile_ = certificateFile;
+		performLoginFromCachedCredentials();
+	}
 }
 
 void MainController::handlePurgeSavedLoginRequest(const std::string& username) {
-- 
cgit v0.10.2-6-g49f6