summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'Swiften')
-rw-r--r--Swiften/SASL/SCRAMSHA1ClientAuthenticator.cpp16
-rw-r--r--Swiften/SASL/UnitTest/PLAINClientAuthenticatorTest.cpp5
-rw-r--r--Swiften/SASL/UnitTest/SCRAMSHA1ClientAuthenticatorTest.cpp42
-rw-r--r--Swiften/SConscript1
4 files changed, 58 insertions, 6 deletions
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"),