From 4e244a9d1967ad416530aa3b9b07faad54097327 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Remko=20Tron=C3=A7on?= <git@el-tramo.be>
Date: Sun, 22 Nov 2009 11:20:58 +0100
Subject: Added SCRAM-SHA-1 unit test.


diff --git a/Swiften/SASL/SCRAMSHA1ClientAuthenticator.cpp b/Swiften/SASL/SCRAMSHA1ClientAuthenticator.cpp
index 41e8f72..15c8ab6 100644
--- a/Swiften/SASL/SCRAMSHA1ClientAuthenticator.cpp
+++ b/Swiften/SASL/SCRAMSHA1ClientAuthenticator.cpp
@@ -87,8 +87,20 @@ std::map<char, String> SCRAMSHA1ClientAuthenticator::parseMap(const String& s) {
 }
 
 ByteArray SCRAMSHA1ClientAuthenticator::getInitialBareClientMessage() const {
-	// TODO: Replace , and =
-	return ByteArray(String("n=" + getAuthenticationID() + ",r=" + clientnonce));
+	String authenticationID = getAuthenticationID();
+	String escapedAuthenticationID;
+	for (size_t i = 0; i < authenticationID.getUTF8Size(); ++i) {
+		if (authenticationID[i] == ',') {
+			escapedAuthenticationID += "=2C";
+		}
+		else if (authenticationID[i] == '=') {
+			escapedAuthenticationID += "=3D";
+		}
+		else {
+			escapedAuthenticationID += authenticationID[i];
+		}
+	}
+	return ByteArray(String("n=" + escapedAuthenticationID + ",r=" + clientnonce));
 }
 
 }
diff --git a/Swiften/SASL/UnitTest/PLAINClientAuthenticatorTest.cpp b/Swiften/SASL/UnitTest/PLAINClientAuthenticatorTest.cpp
index b83e1f5..e92cd34 100644
--- a/Swiften/SASL/UnitTest/PLAINClientAuthenticatorTest.cpp
+++ b/Swiften/SASL/UnitTest/PLAINClientAuthenticatorTest.cpp
@@ -5,16 +5,13 @@
 
 using namespace Swift;
 
-class PLAINClientAuthenticatorTest : public CppUnit::TestFixture
-{
+class PLAINClientAuthenticatorTest : public CppUnit::TestFixture {
 		CPPUNIT_TEST_SUITE(PLAINClientAuthenticatorTest);
 		CPPUNIT_TEST(testGetResponse_WithoutAuthzID);
 		CPPUNIT_TEST(testGetResponse_WithAuthzID);
 		CPPUNIT_TEST_SUITE_END();
 
 	public:
-		PLAINClientAuthenticatorTest() {}
-
 		void testGetResponse_WithoutAuthzID() {
 			PLAINClientAuthenticator testling;
 
diff --git a/Swiften/SASL/UnitTest/SCRAMSHA1ClientAuthenticatorTest.cpp b/Swiften/SASL/UnitTest/SCRAMSHA1ClientAuthenticatorTest.cpp
new file mode 100644
index 0000000..9f7ef38
--- /dev/null
+++ b/Swiften/SASL/UnitTest/SCRAMSHA1ClientAuthenticatorTest.cpp
@@ -0,0 +1,42 @@
+#include <cppunit/extensions/HelperMacros.h>
+#include <cppunit/extensions/TestFactoryRegistry.h>
+
+#include "Swiften/SASL/SCRAMSHA1ClientAuthenticator.h"
+#include "Swiften/Base/ByteArray.h"
+
+using namespace Swift;
+
+class SCRAMSHA1ClientAuthenticatorTest : public CppUnit::TestFixture {
+		CPPUNIT_TEST_SUITE(SCRAMSHA1ClientAuthenticatorTest);
+		CPPUNIT_TEST(testGetInitialResponse);
+		CPPUNIT_TEST(testGetInitialResponse_UsernameHasSpecialChars);
+		CPPUNIT_TEST_SUITE_END();
+
+	public:
+		void setUp() {
+			nonce = String("abcdefghABCDEFGH");
+		}
+
+		void testGetInitialResponse() {
+			SCRAMSHA1ClientAuthenticator testling(nonce);
+			testling.setCredentials("user", "pass", "");
+
+			ByteArray response = testling.getResponse();
+
+			CPPUNIT_ASSERT_EQUAL(String("n,,n=user,r=abcdefghABCDEFGH"), testling.getResponse().toString());
+		}
+
+		void testGetInitialResponse_UsernameHasSpecialChars() {
+			SCRAMSHA1ClientAuthenticator testling(nonce);
+			testling.setCredentials(",us=,er=", "pass", "");
+
+			ByteArray response = testling.getResponse();
+
+			CPPUNIT_ASSERT_EQUAL(String("n,,n==2Cus=3D=2Cer=3D,r=abcdefghABCDEFGH"), testling.getResponse().toString());
+		}
+
+	private:
+		String nonce;
+};
+
+CPPUNIT_TEST_SUITE_REGISTRATION(SCRAMSHA1ClientAuthenticatorTest);
diff --git a/Swiften/SConscript b/Swiften/SConscript
index d04c9fb..3b37f90 100644
--- a/Swiften/SConscript
+++ b/Swiften/SConscript
@@ -166,6 +166,7 @@ env.Append(UNITTEST_SOURCES = [
 		File("Roster/UnitTest/XMPPRosterTest.cpp"),
 		File("SASL/UnitTest/PLAINMessageTest.cpp"),
 		File("SASL/UnitTest/PLAINClientAuthenticatorTest.cpp"),
+		File("SASL/UnitTest/SCRAMSHA1ClientAuthenticatorTest.cpp"),
 		File("Serializer/PayloadSerializers/UnitTest/PayloadsSerializer.cpp"),
 		File("Serializer/PayloadSerializers/UnitTest/CapsInfoSerializerTest.cpp"),
 		File("Serializer/PayloadSerializers/UnitTest/DiscoInfoSerializerTest.cpp"),
-- 
cgit v0.10.2-6-g49f6