diff options
Diffstat (limited to 'Swiften/SASL')
-rw-r--r-- | Swiften/SASL/ClientAuthenticator.h | 6 | ||||
-rw-r--r-- | Swiften/SASL/DIGESTMD5ClientAuthenticator.cpp | 13 | ||||
-rw-r--r-- | Swiften/SASL/DIGESTMD5ClientAuthenticator.h | 4 | ||||
-rw-r--r-- | Swiften/SASL/PLAINClientAuthenticator.cpp | 4 | ||||
-rw-r--r-- | Swiften/SASL/PLAINClientAuthenticator.h | 4 | ||||
-rw-r--r-- | Swiften/SASL/SCRAMSHA1ClientAuthenticator.cpp | 13 | ||||
-rw-r--r-- | Swiften/SASL/SCRAMSHA1ClientAuthenticator.h | 4 | ||||
-rw-r--r-- | Swiften/SASL/UnitTest/DIGESTMD5ClientAuthenticatorTest.cpp | 8 | ||||
-rw-r--r-- | Swiften/SASL/UnitTest/PLAINClientAuthenticatorTest.cpp | 4 | ||||
-rw-r--r-- | Swiften/SASL/UnitTest/SCRAMSHA1ClientAuthenticatorTest.cpp | 24 |
10 files changed, 44 insertions, 40 deletions
diff --git a/Swiften/SASL/ClientAuthenticator.h b/Swiften/SASL/ClientAuthenticator.h index 7d81e8f..718ccdc 100644 --- a/Swiften/SASL/ClientAuthenticator.h +++ b/Swiften/SASL/ClientAuthenticator.h @@ -6,6 +6,8 @@ #pragma once +#include <boost/optional.hpp> + #include "Swiften/Base/String.h" #include "Swiften/Base/ByteArray.h" @@ -25,8 +27,8 @@ namespace Swift { this->authzid = authzid; } - virtual ByteArray getResponse() const = 0; - virtual bool setChallenge(const ByteArray&) = 0; + virtual boost::optional<ByteArray> getResponse() const = 0; + virtual bool setChallenge(const boost::optional<ByteArray>&) = 0; const String& getAuthenticationID() const { return authcid; diff --git a/Swiften/SASL/DIGESTMD5ClientAuthenticator.cpp b/Swiften/SASL/DIGESTMD5ClientAuthenticator.cpp index d22f295..050b73b 100644 --- a/Swiften/SASL/DIGESTMD5ClientAuthenticator.cpp +++ b/Swiften/SASL/DIGESTMD5ClientAuthenticator.cpp @@ -16,9 +16,9 @@ namespace Swift { DIGESTMD5ClientAuthenticator::DIGESTMD5ClientAuthenticator(const String& host, const String& nonce) : ClientAuthenticator("DIGEST-MD5"), step(Initial), host(host), cnonce(nonce) { } -ByteArray DIGESTMD5ClientAuthenticator::getResponse() const { +boost::optional<ByteArray> DIGESTMD5ClientAuthenticator::getResponse() const { if (step == Initial) { - return ByteArray(); + return boost::optional<ByteArray>(); } else if (step == Response) { String realm; @@ -59,13 +59,16 @@ ByteArray DIGESTMD5ClientAuthenticator::getResponse() const { return response.serialize(); } else { - return ByteArray(); + return boost::optional<ByteArray>(); } } -bool DIGESTMD5ClientAuthenticator::setChallenge(const ByteArray& challengeData) { +bool DIGESTMD5ClientAuthenticator::setChallenge(const boost::optional<ByteArray>& challengeData) { if (step == Initial) { - challenge = DIGESTMD5Properties::parse(challengeData); + if (!challengeData) { + return false; + } + challenge = DIGESTMD5Properties::parse(*challengeData); // Sanity checks if (!challenge.getValue("nonce")) { diff --git a/Swiften/SASL/DIGESTMD5ClientAuthenticator.h b/Swiften/SASL/DIGESTMD5ClientAuthenticator.h index e360257..457bde9 100644 --- a/Swiften/SASL/DIGESTMD5ClientAuthenticator.h +++ b/Swiften/SASL/DIGESTMD5ClientAuthenticator.h @@ -18,8 +18,8 @@ namespace Swift { public: DIGESTMD5ClientAuthenticator(const String& host, const String& nonce); - virtual ByteArray getResponse() const; - virtual bool setChallenge(const ByteArray&); + virtual boost::optional<ByteArray> getResponse() const; + virtual bool setChallenge(const boost::optional<ByteArray>&); private: enum Step { diff --git a/Swiften/SASL/PLAINClientAuthenticator.cpp b/Swiften/SASL/PLAINClientAuthenticator.cpp index 96d1163..2ea2425 100644 --- a/Swiften/SASL/PLAINClientAuthenticator.cpp +++ b/Swiften/SASL/PLAINClientAuthenticator.cpp @@ -11,11 +11,11 @@ namespace Swift { PLAINClientAuthenticator::PLAINClientAuthenticator() : ClientAuthenticator("PLAIN") { } -ByteArray PLAINClientAuthenticator::getResponse() const { +boost::optional<ByteArray> PLAINClientAuthenticator::getResponse() const { return ByteArray(getAuthorizationID()) + '\0' + ByteArray(getAuthenticationID()) + '\0' + ByteArray(getPassword()); } -bool PLAINClientAuthenticator::setChallenge(const ByteArray&) { +bool PLAINClientAuthenticator::setChallenge(const boost::optional<ByteArray>&) { return true; } diff --git a/Swiften/SASL/PLAINClientAuthenticator.h b/Swiften/SASL/PLAINClientAuthenticator.h index 3fbad48..959244d 100644 --- a/Swiften/SASL/PLAINClientAuthenticator.h +++ b/Swiften/SASL/PLAINClientAuthenticator.h @@ -13,7 +13,7 @@ namespace Swift { public: PLAINClientAuthenticator(); - virtual ByteArray getResponse() const; - virtual bool setChallenge(const ByteArray&); + virtual boost::optional<ByteArray> getResponse() const; + virtual bool setChallenge(const boost::optional<ByteArray>&); }; } diff --git a/Swiften/SASL/SCRAMSHA1ClientAuthenticator.cpp b/Swiften/SASL/SCRAMSHA1ClientAuthenticator.cpp index 0dc61b6..5d0ee9a 100644 --- a/Swiften/SASL/SCRAMSHA1ClientAuthenticator.cpp +++ b/Swiften/SASL/SCRAMSHA1ClientAuthenticator.cpp @@ -38,7 +38,7 @@ static String escape(const String& s) { SCRAMSHA1ClientAuthenticator::SCRAMSHA1ClientAuthenticator(const String& nonce) : ClientAuthenticator("SCRAM-SHA-1"), step(Initial), clientnonce(nonce) { } -ByteArray SCRAMSHA1ClientAuthenticator::getResponse() const { +boost::optional<ByteArray> SCRAMSHA1ClientAuthenticator::getResponse() const { if (step == Initial) { return getGS2Header() + getInitialBareClientMessage(); } @@ -54,13 +54,16 @@ ByteArray SCRAMSHA1ClientAuthenticator::getResponse() const { return result; } else { - return ByteArray(); + return boost::optional<ByteArray>(); } } -bool SCRAMSHA1ClientAuthenticator::setChallenge(const ByteArray& challenge) { +bool SCRAMSHA1ClientAuthenticator::setChallenge(const boost::optional<ByteArray>& challenge) { if (step == Initial) { - initialServerMessage = challenge; + if (!challenge) { + return false; + } + initialServerMessage = *challenge; std::map<char, String> keys = parseMap(String(initialServerMessage.getData(), initialServerMessage.getSize())); @@ -102,7 +105,7 @@ bool SCRAMSHA1ClientAuthenticator::setChallenge(const ByteArray& challenge) { else if (step == Proof) { ByteArray result = ByteArray("v=") + ByteArray(Base64::encode(serverSignature)); step = Final; - return challenge == result; + return challenge && challenge == result; } else { return true; diff --git a/Swiften/SASL/SCRAMSHA1ClientAuthenticator.h b/Swiften/SASL/SCRAMSHA1ClientAuthenticator.h index 045c1b1..396cc93 100644 --- a/Swiften/SASL/SCRAMSHA1ClientAuthenticator.h +++ b/Swiften/SASL/SCRAMSHA1ClientAuthenticator.h @@ -17,8 +17,8 @@ namespace Swift { public: SCRAMSHA1ClientAuthenticator(const String& nonce); - virtual ByteArray getResponse() const; - virtual bool setChallenge(const ByteArray&); + virtual boost::optional<ByteArray> getResponse() const; + virtual bool setChallenge(const boost::optional<ByteArray>&); private: ByteArray getInitialBareClientMessage() const; diff --git a/Swiften/SASL/UnitTest/DIGESTMD5ClientAuthenticatorTest.cpp b/Swiften/SASL/UnitTest/DIGESTMD5ClientAuthenticatorTest.cpp index e16c202..8daea4f 100644 --- a/Swiften/SASL/UnitTest/DIGESTMD5ClientAuthenticatorTest.cpp +++ b/Swiften/SASL/UnitTest/DIGESTMD5ClientAuthenticatorTest.cpp @@ -25,9 +25,7 @@ class DIGESTMD5ClientAuthenticatorTest : public CppUnit::TestFixture { void testGetInitialResponse() { DIGESTMD5ClientAuthenticator testling("xmpp.example.com", "abcdefgh"); - ByteArray response = testling.getResponse(); - - CPPUNIT_ASSERT(response.isEmpty()); + CPPUNIT_ASSERT(!testling.getResponse()); } void testGetResponse() { @@ -39,7 +37,7 @@ class DIGESTMD5ClientAuthenticatorTest : public CppUnit::TestFixture { "nonce=\"O6skKPuaCZEny3hteI19qXMBXSadoWs840MchORo\"," "qop=auth,charset=utf-8,algorithm=md5-sess")); - ByteArray response = testling.getResponse(); + ByteArray response = *testling.getResponse(); CPPUNIT_ASSERT_EQUAL(String("charset=utf-8,cnonce=\"abcdefgh\",digest-uri=\"xmpp/xmpp.example.com\",nc=00000001,nonce=\"O6skKPuaCZEny3hteI19qXMBXSadoWs840MchORo\",qop=auth,realm=\"example.com\",response=088891c800ecff1b842159ad6459104a,username=\"user\""), response.toString()); } @@ -53,7 +51,7 @@ class DIGESTMD5ClientAuthenticatorTest : public CppUnit::TestFixture { "nonce=\"O6skKPuaCZEny3hteI19qXMBXSadoWs840MchORo\"," "qop=auth,charset=utf-8,algorithm=md5-sess")); - ByteArray response = testling.getResponse(); + ByteArray response = *testling.getResponse(); CPPUNIT_ASSERT_EQUAL(String("authzid=\"myauthzid\",charset=utf-8,cnonce=\"abcdefgh\",digest-uri=\"xmpp/xmpp.example.com\",nc=00000001,nonce=\"O6skKPuaCZEny3hteI19qXMBXSadoWs840MchORo\",qop=auth,realm=\"example.com\",response=4293834432b6e7889a2dee7e8fe7dd06,username=\"user\""), response.toString()); } diff --git a/Swiften/SASL/UnitTest/PLAINClientAuthenticatorTest.cpp b/Swiften/SASL/UnitTest/PLAINClientAuthenticatorTest.cpp index 818e02e..7784898 100644 --- a/Swiften/SASL/UnitTest/PLAINClientAuthenticatorTest.cpp +++ b/Swiften/SASL/UnitTest/PLAINClientAuthenticatorTest.cpp @@ -23,7 +23,7 @@ class PLAINClientAuthenticatorTest : public CppUnit::TestFixture { testling.setCredentials("user", "pass"); - CPPUNIT_ASSERT_EQUAL(testling.getResponse(), ByteArray("\0user\0pass", 10)); + CPPUNIT_ASSERT_EQUAL(*testling.getResponse(), ByteArray("\0user\0pass", 10)); } void testGetResponse_WithAuthzID() { @@ -31,7 +31,7 @@ class PLAINClientAuthenticatorTest : public CppUnit::TestFixture { testling.setCredentials("user", "pass", "authz"); - CPPUNIT_ASSERT_EQUAL(testling.getResponse(), ByteArray("authz\0user\0pass", 15)); + CPPUNIT_ASSERT_EQUAL(*testling.getResponse(), ByteArray("authz\0user\0pass", 15)); } }; diff --git a/Swiften/SASL/UnitTest/SCRAMSHA1ClientAuthenticatorTest.cpp b/Swiften/SASL/UnitTest/SCRAMSHA1ClientAuthenticatorTest.cpp index 0fce39a..b65cdd3 100644 --- a/Swiften/SASL/UnitTest/SCRAMSHA1ClientAuthenticatorTest.cpp +++ b/Swiften/SASL/UnitTest/SCRAMSHA1ClientAuthenticatorTest.cpp @@ -39,36 +39,36 @@ class SCRAMSHA1ClientAuthenticatorTest : public CppUnit::TestFixture { SCRAMSHA1ClientAuthenticator testling("abcdefghABCDEFGH"); testling.setCredentials("user", "pass", ""); - ByteArray response = testling.getResponse(); + ByteArray response = *testling.getResponse(); - CPPUNIT_ASSERT_EQUAL(String("n,,n=user,r=abcdefghABCDEFGH"), testling.getResponse().toString()); + CPPUNIT_ASSERT_EQUAL(String("n,,n=user,r=abcdefghABCDEFGH"), response.toString()); } void testGetInitialResponse_UsernameHasSpecialChars() { SCRAMSHA1ClientAuthenticator testling("abcdefghABCDEFGH"); testling.setCredentials(",us=,er=", "pass", ""); - ByteArray response = testling.getResponse(); + ByteArray response = *testling.getResponse(); - CPPUNIT_ASSERT_EQUAL(String("n,,n==2Cus=3D=2Cer=3D,r=abcdefghABCDEFGH"), testling.getResponse().toString()); + CPPUNIT_ASSERT_EQUAL(String("n,,n==2Cus=3D=2Cer=3D,r=abcdefghABCDEFGH"), response.toString()); } void testGetInitialResponse_WithAuthorizationID() { SCRAMSHA1ClientAuthenticator testling("abcdefghABCDEFGH"); testling.setCredentials("user", "pass", "auth"); - ByteArray response = testling.getResponse(); + ByteArray response = *testling.getResponse(); - CPPUNIT_ASSERT_EQUAL(String("n,a=auth,n=user,r=abcdefghABCDEFGH"), testling.getResponse().toString()); + CPPUNIT_ASSERT_EQUAL(String("n,a=auth,n=user,r=abcdefghABCDEFGH"), response.toString()); } void testGetInitialResponse_WithAuthorizationIDWithSpecialChars() { SCRAMSHA1ClientAuthenticator testling("abcdefghABCDEFGH"); testling.setCredentials("user", "pass", "a=u,th"); - ByteArray response = testling.getResponse(); + ByteArray response = *testling.getResponse(); - CPPUNIT_ASSERT_EQUAL(String("n,a=a=3Du=2Cth,n=user,r=abcdefghABCDEFGH"), testling.getResponse().toString()); + CPPUNIT_ASSERT_EQUAL(String("n,a=a=3Du=2Cth,n=user,r=abcdefghABCDEFGH"), response.toString()); } void testGetFinalResponse() { @@ -76,9 +76,9 @@ class SCRAMSHA1ClientAuthenticatorTest : public CppUnit::TestFixture { testling.setCredentials("user", "pass", ""); testling.setChallenge(ByteArray("r=abcdefghABCDEFGH,s=MTIzNDU2NzgK,i=4096")); - ByteArray response = testling.getResponse(); + ByteArray response = *testling.getResponse(); - CPPUNIT_ASSERT_EQUAL(String("c=biws,r=abcdefghABCDEFGH,p=CZbjGDpIteIJwQNBgO0P8pKkMGY="), testling.getResponse().toString()); + CPPUNIT_ASSERT_EQUAL(String("c=biws,r=abcdefghABCDEFGH,p=CZbjGDpIteIJwQNBgO0P8pKkMGY="), response.toString()); } void testSetFinalChallenge() { @@ -169,9 +169,7 @@ class SCRAMSHA1ClientAuthenticatorTest : public CppUnit::TestFixture { testling.setChallenge(ByteArray("r=abcdefghABCDEFGH,s=MTIzNDU2NzgK,i=4096")); testling.setChallenge(ByteArray("v=Dd+Q20knZs9jeeK0pi1Mx1Se+yo=")); - ByteArray result = testling.getResponse(); - - CPPUNIT_ASSERT_EQUAL(ByteArray(), result); + CPPUNIT_ASSERT(!testling.getResponse()); } }; |