From 6159c580884583bad0e17d4e96ea9ffc7e0be29a Mon Sep 17 00:00:00 2001
From: Kevin Smith <git@kismith.co.uk>
Date: Wed, 11 Mar 2015 14:54:53 +0000
Subject: Don't allow JIDs with explicitly empty resources

A JID may have no resource, but may not have an empty resource. Mark such
JIDs as invalid.

Test-Information:
Added a unit test for the failure case (and made it pass). Other unit tests still pass

Change-Id: I4fb300f716e635a3f8f02843891f25218da77130

diff --git a/Swiften/JID/JID.cpp b/Swiften/JID/JID.cpp
index a0f18d5..37fb755 100644
--- a/Swiften/JID/JID.cpp
+++ b/Swiften/JID/JID.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2013 Isode Limited.
+ * Copyright (c) 2010-2016 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -146,6 +146,9 @@ JID::JID(const std::string& node, const std::string& domain) : valid_(true), has
 }
 
 JID::JID(const std::string& node, const std::string& domain, const std::string& resource) : valid_(true), hasResource_(true) {
+	if (resource.empty()) {
+		valid_ = false;
+	}
 	nameprepAndSetComponents(node, domain, resource);
 }
 
diff --git a/Swiften/JID/JID.h b/Swiften/JID/JID.h
index 00ee27f..0fd2f00 100644
--- a/Swiften/JID/JID.h
+++ b/Swiften/JID/JID.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2013 Isode Limited.
+ * Copyright (c) 2010-2016 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -195,4 +195,3 @@ namespace Swift {
 	
 	SWIFTEN_API std::ostream& operator<<(std::ostream& os, const Swift::JID& j);
 }
-
diff --git a/Swiften/JID/UnitTest/JIDTest.cpp b/Swiften/JID/UnitTest/JIDTest.cpp
index 307243a..8f43576 100644
--- a/Swiften/JID/UnitTest/JIDTest.cpp
+++ b/Swiften/JID/UnitTest/JIDTest.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010 Isode Limited.
+ * Copyright (c) 2010-2016 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -28,6 +28,7 @@ class JIDTest : public CppUnit::TestFixture
 		CPPUNIT_TEST(testConstructorWithString_SpacesInNode);
 		CPPUNIT_TEST(testConstructorWithStrings);
 		CPPUNIT_TEST(testConstructorWithStrings_EmptyDomain);
+		CPPUNIT_TEST(testConstructorWithStrings_EmptyResource);
 		CPPUNIT_TEST(testIsBare);
 		CPPUNIT_TEST(testIsBare_NotBare);
 		CPPUNIT_TEST(testToBare);
@@ -154,7 +155,7 @@ class JIDTest : public CppUnit::TestFixture
 			CPPUNIT_ASSERT(!JID("   alice@wonderland.lit").isValid());
 			CPPUNIT_ASSERT(!JID("alice   @wonderland.lit").isValid());
 		}
-		
+
 		void testConstructorWithStrings() {
 			JID testling("foo", "bar", "baz");
 
@@ -170,6 +171,12 @@ class JIDTest : public CppUnit::TestFixture
 			CPPUNIT_ASSERT(!testling.isValid());
 		}
 
+		void testConstructorWithStrings_EmptyResource() {
+			JID testling("foo", "bar", "");
+
+			CPPUNIT_ASSERT(!testling.isValid());
+		}
+
 		void testIsBare() {
 			CPPUNIT_ASSERT(JID("foo@bar").isBare());
 		}
-- 
cgit v0.10.2-6-g49f6