aboutsummaryrefslogtreecommitdiff
path: root/tests/qxmppsasl
diff options
context:
space:
mode:
authorJeremy Lainé <jeremy.laine@m4x.org>2012-09-27 20:50:17 +0200
committerJeremy Lainé <jeremy.laine@m4x.org>2012-09-27 20:50:17 +0200
commit6a01a0f7bfd03deb3d0e6ed3e107ddbc4e07e5c8 (patch)
tree340a4ee17e107d484a3373db56443dc6060e23ae /tests/qxmppsasl
parent4dca74738a729a3f10f110c4003ba02c67b9fd47 (diff)
downloadqxmpp-6a01a0f7bfd03deb3d0e6ed3e107ddbc4e07e5c8.tar.gz
move sasl test code
Diffstat (limited to 'tests/qxmppsasl')
-rw-r--r--tests/qxmppsasl/tst_qxmppsasl.cpp447
1 files changed, 447 insertions, 0 deletions
diff --git a/tests/qxmppsasl/tst_qxmppsasl.cpp b/tests/qxmppsasl/tst_qxmppsasl.cpp
new file mode 100644
index 00000000..b85e49ee
--- /dev/null
+++ b/tests/qxmppsasl/tst_qxmppsasl.cpp
@@ -0,0 +1,447 @@
+/*
+ * Copyright (C) 2008-2012 The QXmpp developers
+ *
+ * Author:
+ * Jeremy Lainé
+ *
+ * Source:
+ * http://code.google.com/p/qxmpp
+ *
+ * This file is a part of QXmpp library.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ */
+
+#include <QObject>
+#include "QXmppSasl_p.h"
+#include "util.h"
+
+class tst_QXmppSasl : public QObject
+{
+ Q_OBJECT
+
+private slots:
+ void testParsing();
+ void testAuth_data();
+ void testAuth();
+ void testChallenge_data();
+ void testChallenge();
+ void testFailure();
+ void testResponse_data();
+ void testResponse();
+ void testSuccess();
+};
+
+class tst_QXmppSaslClient : public QObject
+{
+ Q_OBJECT
+
+private slots:
+ void testAvailableMechanisms();
+ void testBadMechanism();
+ void testAnonymous();
+ void testDigestMd5();
+ void testDigestMd5_data();
+ void testFacebook();
+ void testGoogle();
+ void testPlain();
+ void testWindowsLive();
+};
+
+class tst_QXmppSaslServer : public QObject
+{
+ Q_OBJECT
+
+private slots:
+ void testBadMechanism();
+ void testAnonymous();
+ void testDigestMd5();
+ void testPlain();
+ void testPlainChallenge();
+};
+
+void tst_QXmppSasl::testParsing()
+{
+ // empty
+ QMap<QByteArray, QByteArray> empty = QXmppSaslDigestMd5::parseMessage(QByteArray());
+ QCOMPARE(empty.size(), 0);
+ QCOMPARE(QXmppSaslDigestMd5::serializeMessage(empty), QByteArray());
+
+ // non-empty
+ const QByteArray bytes("number=12345,quoted_plain=\"quoted string\",quoted_quote=\"quoted\\\\slash\\\"quote\",string=string");
+
+ QMap<QByteArray, QByteArray> map = QXmppSaslDigestMd5::parseMessage(bytes);
+ QCOMPARE(map.size(), 4);
+ QCOMPARE(map["number"], QByteArray("12345"));
+ QCOMPARE(map["quoted_plain"], QByteArray("quoted string"));
+ QCOMPARE(map["quoted_quote"], QByteArray("quoted\\slash\"quote"));
+ QCOMPARE(map["string"], QByteArray("string"));
+ QCOMPARE(QXmppSaslDigestMd5::serializeMessage(map), bytes);
+}
+
+void tst_QXmppSasl::testAuth_data()
+{
+ QTest::addColumn<QByteArray>("xml");
+ QTest::addColumn<QString>("mechanism");
+ QTest::addColumn<QByteArray>("value");
+
+ QTest::newRow("plain")
+ << QByteArray("<auth xmlns=\"urn:ietf:params:xml:ns:xmpp-sasl\" mechanism=\"PLAIN\">AGZvbwBiYXI=</auth>")
+ << "PLAIN" << QByteArray("\0foo\0bar", 8);
+
+ QTest::newRow("digest-md5")
+ << QByteArray("<auth xmlns=\"urn:ietf:params:xml:ns:xmpp-sasl\" mechanism=\"DIGEST-MD5\"/>")
+ << "DIGEST-MD5" << QByteArray();
+}
+
+void tst_QXmppSasl::testAuth()
+{
+ QFETCH(QByteArray, xml);
+ QFETCH(QString, mechanism);
+ QFETCH(QByteArray, value);
+
+ // no condition
+ QXmppSaslAuth auth;
+ parsePacket(auth, xml);
+ QCOMPARE(auth.mechanism(), mechanism);
+ QCOMPARE(auth.value(), value);
+ serializePacket(auth, xml);
+}
+
+void tst_QXmppSasl::testChallenge_data()
+{
+ QTest::addColumn<QByteArray>("xml");
+ QTest::addColumn<QByteArray>("value");
+
+ QTest::newRow("empty")
+ << QByteArray("<challenge xmlns=\"urn:ietf:params:xml:ns:xmpp-sasl\"/>")
+ << QByteArray();
+
+ QTest::newRow("value")
+ << QByteArray("<challenge xmlns=\"urn:ietf:params:xml:ns:xmpp-sasl\">AGZvbwBiYXI=</challenge>")
+ << QByteArray("\0foo\0bar", 8);
+}
+
+void tst_QXmppSasl::testChallenge()
+{
+ QFETCH(QByteArray, xml);
+ QFETCH(QByteArray, value);
+
+ // no condition
+ QXmppSaslChallenge challenge;
+ parsePacket(challenge, xml);
+ QCOMPARE(challenge.value(), value);
+ serializePacket(challenge, xml);
+}
+
+void tst_QXmppSasl::testFailure()
+{
+ // no condition
+ const QByteArray xml = "<failure xmlns=\"urn:ietf:params:xml:ns:xmpp-sasl\"/>";
+ QXmppSaslFailure failure;
+ parsePacket(failure, xml);
+ QCOMPARE(failure.condition(), QString());
+ serializePacket(failure, xml);
+
+ // not authorized
+ const QByteArray xml2 = "<failure xmlns=\"urn:ietf:params:xml:ns:xmpp-sasl\"><not-authorized/></failure>";
+ QXmppSaslFailure failure2;
+ parsePacket(failure2, xml2);
+ QCOMPARE(failure2.condition(), QLatin1String("not-authorized"));
+ serializePacket(failure2, xml2);
+}
+
+void tst_QXmppSasl::testResponse_data()
+{
+ QTest::addColumn<QByteArray>("xml");
+ QTest::addColumn<QByteArray>("value");
+
+ QTest::newRow("empty")
+ << QByteArray("<response xmlns=\"urn:ietf:params:xml:ns:xmpp-sasl\"/>")
+ << QByteArray();
+
+ QTest::newRow("value")
+ << QByteArray("<response xmlns=\"urn:ietf:params:xml:ns:xmpp-sasl\">AGZvbwBiYXI=</response>")
+ << QByteArray("\0foo\0bar", 8);
+}
+
+void tst_QXmppSasl::testResponse()
+{
+ QFETCH(QByteArray, xml);
+ QFETCH(QByteArray, value);
+
+ // no condition
+ QXmppSaslResponse response;
+ parsePacket(response, xml);
+ QCOMPARE(response.value(), value);
+ serializePacket(response, xml);
+}
+
+void tst_QXmppSasl::testSuccess()
+{
+ const QByteArray xml = "<success xmlns=\"urn:ietf:params:xml:ns:xmpp-sasl\"/>";
+ QXmppSaslSuccess stanza;
+ parsePacket(stanza, xml);
+ serializePacket(stanza, xml);
+}
+
+void tst_QXmppSaslClient::testAvailableMechanisms()
+{
+ QCOMPARE(QXmppSaslClient::availableMechanisms(), QStringList() << "PLAIN" << "DIGEST-MD5" << "ANONYMOUS" << "X-FACEBOOK-PLATFORM" << "X-MESSENGER-OAUTH2" << "X-OAUTH2");
+}
+
+void tst_QXmppSaslClient::testBadMechanism()
+{
+ QXmppSaslClient *client = QXmppSaslClient::create("BAD-MECH");
+ QVERIFY(client == 0);
+}
+
+void tst_QXmppSaslClient::testAnonymous()
+{
+ QXmppSaslClient *client = QXmppSaslClient::create("ANONYMOUS");
+ QVERIFY(client != 0);
+ QCOMPARE(client->mechanism(), QLatin1String("ANONYMOUS"));
+
+ // initial step returns nothing
+ QByteArray response;
+ QVERIFY(client->respond(QByteArray(), response));
+ QCOMPARE(response, QByteArray());
+
+ // any further step is an error
+ QVERIFY(!client->respond(QByteArray(), response));
+
+ delete client;
+}
+
+void tst_QXmppSaslClient::testDigestMd5_data()
+{
+ QTest::addColumn<QByteArray>("qop");
+ QTest::newRow("qop-none") << QByteArray();
+ QTest::newRow("qop-auth") << QByteArray(",qop=\"auth\"");
+ QTest::newRow("qop-multi") << QByteArray(",qop=\"auth,auth-int\"");
+}
+
+void tst_QXmppSaslClient::testDigestMd5()
+{
+ QFETCH(QByteArray, qop);
+
+ QXmppSaslDigestMd5::setNonce("AMzVG8Oibf+sVUCPPlWLR8lZQvbbJtJB9vJd+u3c6dw=");
+
+ QXmppSaslClient *client = QXmppSaslClient::create("DIGEST-MD5");
+ QVERIFY(client != 0);
+ QCOMPARE(client->mechanism(), QLatin1String("DIGEST-MD5"));
+
+ client->setUsername("qxmpp1");
+ client->setPassword("qxmpp123");
+ client->setHost("jabber.ru");
+ client->setServiceType("xmpp");
+
+ // initial step returns nothing
+ QByteArray response;
+ QVERIFY(client->respond(QByteArray(), response));
+ QCOMPARE(response, QByteArray());
+
+ QVERIFY(client->respond(QByteArray("nonce=\"2530347127\"") + qop + QByteArray("charset=utf-8,algorithm=md5-sess"), response));
+ QCOMPARE(response, QByteArray("charset=utf-8,cnonce=\"AMzVG8Oibf+sVUCPPlWLR8lZQvbbJtJB9vJd+u3c6dw=\",digest-uri=\"xmpp/jabber.ru\",nc=00000001,nonce=2530347127,qop=auth,response=a61fbf4320577d74038b71a8546bc7ae,username=qxmpp1"));
+
+ QVERIFY(client->respond(QByteArray("rspauth=d92bf7f4331700c24799cbab364a14b7"), response));
+ QCOMPARE(response, QByteArray());
+
+ // any further step is an error
+ QVERIFY(!client->respond(QByteArray(), response));
+
+ delete client;
+}
+
+void tst_QXmppSaslClient::testFacebook()
+{
+ QXmppSaslClient *client = QXmppSaslClient::create("X-FACEBOOK-PLATFORM");
+ QVERIFY(client != 0);
+ QCOMPARE(client->mechanism(), QLatin1String("X-FACEBOOK-PLATFORM"));
+
+ client->setUsername("123456789012345");
+ client->setPassword("abcdefghijlkmno");
+
+ // initial step returns nothing
+ QByteArray response;
+ QVERIFY(client->respond(QByteArray(), response));
+ QCOMPARE(response, QByteArray());
+
+ // challenge response
+ QVERIFY(client->respond(QByteArray("version=1&method=auth.xmpp_login&nonce=AA4EFEE16F2AB64B131EEFFE6EACDDB8"), response));
+ QCOMPARE(response, QByteArray("access_token=abcdefghijlkmno&api_key=123456789012345&call_id=&method=auth.xmpp_login&nonce=AA4EFEE16F2AB64B131EEFFE6EACDDB8&v=1.0"));
+
+ // any further step is an error
+ QVERIFY(!client->respond(QByteArray(), response));
+
+ delete client;
+}
+
+void tst_QXmppSaslClient::testGoogle()
+{
+ QXmppSaslClient *client = QXmppSaslClient::create("X-OAUTH2");
+ QVERIFY(client != 0);
+ QCOMPARE(client->mechanism(), QLatin1String("X-OAUTH2"));
+
+ client->setUsername("foo");
+ client->setPassword("bar");
+
+ // initial step returns data
+ QByteArray response;
+ QVERIFY(client->respond(QByteArray(), response));
+ QCOMPARE(response, QByteArray("\0foo\0bar", 8));
+
+ // any further step is an error
+ QVERIFY(!client->respond(QByteArray(), response));
+
+ delete client;
+}
+
+void tst_QXmppSaslClient::testPlain()
+{
+ QXmppSaslClient *client = QXmppSaslClient::create("PLAIN");
+ QVERIFY(client != 0);
+ QCOMPARE(client->mechanism(), QLatin1String("PLAIN"));
+
+ client->setUsername("foo");
+ client->setPassword("bar");
+
+ // initial step returns data
+ QByteArray response;
+ QVERIFY(client->respond(QByteArray(), response));
+ QCOMPARE(response, QByteArray("\0foo\0bar", 8));
+
+ // any further step is an error
+ QVERIFY(!client->respond(QByteArray(), response));
+
+ delete client;
+}
+
+void tst_QXmppSaslClient::testWindowsLive()
+{
+ QXmppSaslClient *client = QXmppSaslClient::create("X-MESSENGER-OAUTH2");
+ QVERIFY(client != 0);
+ QCOMPARE(client->mechanism(), QLatin1String("X-MESSENGER-OAUTH2"));
+
+ client->setPassword(QByteArray("footoken").toBase64());
+
+ // initial step returns data
+ QByteArray response;
+ QVERIFY(client->respond(QByteArray(), response));
+ QCOMPARE(response, QByteArray("footoken", 8));
+
+ // any further step is an error
+ QVERIFY(!client->respond(QByteArray(), response));
+
+ delete client;
+}
+
+void tst_QXmppSaslServer::testBadMechanism()
+{
+ QXmppSaslServer *server = QXmppSaslServer::create("BAD-MECH");
+ QVERIFY(server == 0);
+}
+
+void tst_QXmppSaslServer::testAnonymous()
+{
+ QXmppSaslServer *server = QXmppSaslServer::create("ANONYMOUS");
+ QVERIFY(server != 0);
+ QCOMPARE(server->mechanism(), QLatin1String("ANONYMOUS"));
+
+ // initial step returns success
+ QByteArray response;
+ QCOMPARE(server->respond(QByteArray(), response), QXmppSaslServer::Succeeded);
+ QCOMPARE(response, QByteArray());
+
+ // any further step is an error
+ QCOMPARE(server->respond(QByteArray(), response), QXmppSaslServer::Failed);
+
+ delete server;
+}
+
+void tst_QXmppSaslServer::testDigestMd5()
+{
+ QXmppSaslDigestMd5::setNonce("OI08/m+QRm6Ma+fKOjuqVXtz40sR5u9/u5GN6sSW0rs=");
+
+ QXmppSaslServer *server = QXmppSaslServer::create("DIGEST-MD5");
+ QVERIFY(server != 0);
+ QCOMPARE(server->mechanism(), QLatin1String("DIGEST-MD5"));
+
+ // initial step returns challenge
+ QByteArray response;
+ QCOMPARE(server->respond(QByteArray(), response), QXmppSaslServer::Challenge);
+ QCOMPARE(response, QByteArray("algorithm=md5-sess,charset=utf-8,nonce=\"OI08/m+QRm6Ma+fKOjuqVXtz40sR5u9/u5GN6sSW0rs=\",qop=auth"));
+
+ // password needed
+ const QByteArray request = QByteArray("charset=utf-8,cnonce=\"AMzVG8Oibf+sVUCPPlWLR8lZQvbbJtJB9vJd+u3c6dw=\",digest-uri=\"xmpp/jabber.ru\",nc=00000001,nonce=\"OI08/m+QRm6Ma+fKOjuqVXtz40sR5u9/u5GN6sSW0rs=\",qop=auth,response=70e9063257ee2bf6bfd108975b917410,username=qxmpp1");
+ QCOMPARE(server->respond(request, response), QXmppSaslServer::InputNeeded);
+ QCOMPARE(server->username(), QLatin1String("qxmpp1"));
+ server->setPassword("qxmpp123");
+
+ // second challenge
+ QCOMPARE(server->respond(request, response), QXmppSaslServer::Challenge);
+ QCOMPARE(response, QByteArray("rspauth=2821a3add271b9ae02b813bed57ec878"));
+
+ // success
+ QCOMPARE(server->respond(QByteArray(), response), QXmppSaslServer::Succeeded);
+ QCOMPARE(response, QByteArray());
+
+ // any further step is an error
+ QCOMPARE(server->respond(QByteArray(), response), QXmppSaslServer::Failed);
+
+ delete server;
+}
+
+void tst_QXmppSaslServer::testPlain()
+{
+ QXmppSaslServer *server = QXmppSaslServer::create("PLAIN");
+ QVERIFY(server != 0);
+ QCOMPARE(server->mechanism(), QLatin1String("PLAIN"));
+
+ // initial step returns success
+ QByteArray response;
+ QCOMPARE(server->respond(QByteArray("\0foo\0bar", 8), response), QXmppSaslServer::InputNeeded);
+ QCOMPARE(response, QByteArray());
+ QCOMPARE(server->username(), QLatin1String("foo"));
+ QCOMPARE(server->password(), QLatin1String("bar"));
+
+ // any further step is an error
+ QCOMPARE(server->respond(QByteArray(), response), QXmppSaslServer::Failed);
+
+ delete server;
+}
+
+void tst_QXmppSaslServer::testPlainChallenge()
+{
+ QXmppSaslServer *server = QXmppSaslServer::create("PLAIN");
+ QVERIFY(server != 0);
+ QCOMPARE(server->mechanism(), QLatin1String("PLAIN"));
+
+ // initial step returns challenge
+ QByteArray response;
+ QCOMPARE(server->respond(QByteArray(), response), QXmppSaslServer::Challenge);
+ QCOMPARE(response, QByteArray());
+
+ // initial step returns success
+ QCOMPARE(server->respond(QByteArray("\0foo\0bar", 8), response), QXmppSaslServer::InputNeeded);
+ QCOMPARE(response, QByteArray());
+ QCOMPARE(server->username(), QLatin1String("foo"));
+ QCOMPARE(server->password(), QLatin1String("bar"));
+
+ // any further step is an error
+ QCOMPARE(server->respond(QByteArray(), response), QXmppSaslServer::Failed);
+
+ delete server;
+}
+
+QTEST_MAIN(tst_QXmppSasl)
+#include "tst_qxmppsasl.moc"