aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Lainé <jeremy.laine@m4x.org>2010-08-12 07:55:43 +0000
committerJeremy Lainé <jeremy.laine@m4x.org>2010-08-12 07:55:43 +0000
commit4e6d4908fdf5168fbd0ad4025f00a8d133622b4d (patch)
tree4f434a77e0a13f84e9b417a2fa74c68d82730f16
parent3ad23dd378b7b769ff65c6bf297d2547184e78e2 (diff)
downloadqxmpp-4e6d4908fdf5168fbd0ad4025f00a8d133622b4d.tar.gz
start refactoring and testing non-SASL auth
-rw-r--r--src/QXmppNonSASLAuth.cpp81
-rw-r--r--src/QXmppNonSASLAuth.h35
-rw-r--r--src/QXmppStream.cpp19
-rw-r--r--tests/tests.cpp13
-rw-r--r--tests/tests.h1
5 files changed, 95 insertions, 54 deletions
diff --git a/src/QXmppNonSASLAuth.cpp b/src/QXmppNonSASLAuth.cpp
index c17a1ba6..7e33fa43 100644
--- a/src/QXmppNonSASLAuth.cpp
+++ b/src/QXmppNonSASLAuth.cpp
@@ -21,55 +21,70 @@
*
*/
-#include "QXmppNonSASLAuth.h"
-#include "QXmppUtils.h"
#include <QCryptographicHash>
+#include <QDomElement>
#include <QXmlStreamWriter>
-QXmppNonSASLAuthTypesRequestIq::QXmppNonSASLAuthTypesRequestIq() : QXmppIq(QXmppIq::Get)
-{
+#include "QXmppConstants.h"
+#include "QXmppNonSASLAuth.h"
+#include "QXmppUtils.h"
+QXmppNonSASLAuthIq::QXmppNonSASLAuthIq()
+ : QXmppIq(QXmppIq::Set),
+ m_useplaintext(false)
+{
}
-void QXmppNonSASLAuthTypesRequestIq::setUsername( const QString &username )
+void QXmppNonSASLAuthIq::parseElementFromChild(const QDomElement &element)
{
- m_username = username;
+ QDomElement queryElement = element.firstChildElement("query");
+ m_username = queryElement.firstChildElement("username").text();
+ m_password = queryElement.firstChildElement("password").text();
+ m_digest = queryElement.firstChildElement("digest").text();
+ m_resource = queryElement.firstChildElement("resource").text();
}
-void QXmppNonSASLAuthTypesRequestIq::toXmlElementFromChild(QXmlStreamWriter *writer) const
+void QXmppNonSASLAuthIq::toXmlElementFromChild(QXmlStreamWriter *writer) const
{
writer->writeStartElement("query");
- writer->writeAttribute( "xmlns","jabber:iq:auth");
- writer->writeTextElement("username", m_username );
+ writer->writeAttribute("xmlns", ns_auth);
+ if (!m_username.isEmpty())
+ writer->writeTextElement("username", m_username);
+ if (!m_password.isEmpty())
+ {
+ if ( m_useplaintext )
+ writer->writeTextElement("password", m_password);
+ else
+ {//SHA1(concat(sid, password)).
+ QByteArray textSid = m_sid.toUtf8();
+ QByteArray encodedPassword = m_password.toUtf8();
+ QByteArray digest = QCryptographicHash::hash(textSid + encodedPassword, QCryptographicHash::Sha1 ).toHex();
+ writer->writeTextElement("digest", digest);
+ }
+ }
+ if (!m_resource.isEmpty())
+ writer->writeTextElement("resource", m_resource);
writer->writeEndElement();
}
-QXmppNonSASLAuthIq::QXmppNonSASLAuthIq() : QXmppIq(QXmppIq::Set), m_useplaintext(false)
+QString QXmppNonSASLAuthIq::username() const
{
+ return m_username;
+}
+void QXmppNonSASLAuthIq::setUsername( const QString &username )
+{
+ m_username = username;
}
-void QXmppNonSASLAuthIq::toXmlElementFromChild(QXmlStreamWriter *writer) const
+QString QXmppNonSASLAuthIq::digest() const
{
- writer->writeStartElement("query");
- writer->writeAttribute( "xmlns","jabber:iq:auth");
- writer->writeTextElement("username", m_username );
- if ( m_useplaintext )
- writer->writeTextElement("password", m_password );
- else
- {//SHA1(concat(sid, password)).
- QByteArray textSid = m_sid.toUtf8();
- QByteArray encodedPassword = m_password.toUtf8();
- QByteArray digest = QCryptographicHash::hash(textSid + encodedPassword, QCryptographicHash::Sha1 ).toHex();
- writer->writeTextElement("digest", digest );
- }
- writer->writeTextElement("resource", m_resource );
- writer->writeEndElement();
+ return m_digest;
}
-void QXmppNonSASLAuthIq::setUsername( const QString &username )
+QString QXmppNonSASLAuthIq::password() const
{
- m_username = username;
+ return m_password;
}
void QXmppNonSASLAuthIq::setPassword( const QString &password )
@@ -77,17 +92,23 @@ void QXmppNonSASLAuthIq::setPassword( const QString &password )
m_password = password;
}
-void QXmppNonSASLAuthIq::setResource( const QString &resource )
+QString QXmppNonSASLAuthIq::resource() const
+{
+ return m_resource;
+}
+
+void QXmppNonSASLAuthIq::setResource(const QString &resource)
{
m_resource = resource;
}
-void QXmppNonSASLAuthIq::setStreamId( const QString &sid )
+void QXmppNonSASLAuthIq::setStreamId(const QString &sid)
{
m_sid = sid;
}
-void QXmppNonSASLAuthIq::setUsePlainText( bool use )
+void QXmppNonSASLAuthIq::setUsePlainText(bool use)
{
m_useplaintext = use;
}
+
diff --git a/src/QXmppNonSASLAuth.h b/src/QXmppNonSASLAuth.h
index 956814fa..10dab42c 100644
--- a/src/QXmppNonSASLAuth.h
+++ b/src/QXmppNonSASLAuth.h
@@ -26,29 +26,34 @@
#include "QXmppIq.h"
-class QXmppNonSASLAuthTypesRequestIq : public QXmppIq
-{
-public:
- QXmppNonSASLAuthTypesRequestIq();
- void setUsername( const QString &username );
- virtual void toXmlElementFromChild(QXmlStreamWriter *writer) const;
-private:
- QString m_username;
-};
-
class QXmppNonSASLAuthIq : public QXmppIq
{
public:
QXmppNonSASLAuthIq();
- virtual void toXmlElementFromChild(QXmlStreamWriter *writer) const;
- void setUsername( const QString &username );
- void setPassword( const QString &password );
- void setResource( const QString &resource );
- void setStreamId( const QString &sid );
+
+ QString username() const;
+ void setUsername(const QString &username);
+
+ QString digest() const;
+
+ QString password() const;
+ void setPassword(const QString &password);
+
+ QString resource() const;
+ void setResource(const QString &resource);
+
+ void setStreamId(const QString &sid);
void setUsePlainText( bool useplaintext );
+protected:
+ /// \cond
+ void parseElementFromChild(const QDomElement &element);
+ void toXmlElementFromChild(QXmlStreamWriter *writer) const;
+ /// \endcond
+
private:
QString m_username;
+ QString m_digest;
QString m_password;
QString m_resource;
QString m_sid;
diff --git a/src/QXmppStream.cpp b/src/QXmppStream.cpp
index 4e655885..d4625ba3 100644
--- a/src/QXmppStream.cpp
+++ b/src/QXmppStream.cpp
@@ -224,15 +224,6 @@ void QXmppStream::socketReadReady()
parser(data);
}
-void QXmppStream::sendNonSASLAuthQuery( const QString &to )
-{
- QXmppNonSASLAuthTypesRequestIq authQuery;
- authQuery.setTo(to);
- authQuery.setUsername(configuration().user());
-
- sendPacket(authQuery);
-}
-
/// Returns the QXmppLogger associated with the current QXmppStream.
QXmppLogger *QXmppStream::logger()
@@ -821,6 +812,7 @@ bool QXmppStream::sendToServer(const QByteArray& packet)
void QXmppStream::sendNonSASLAuth(bool plainText)
{
QXmppNonSASLAuthIq authQuery;
+ authQuery.setType(QXmppIq::Set);
authQuery.setUsername(configuration().user());
authQuery.setPassword(configuration().passwd());
authQuery.setResource(configuration().resource());
@@ -830,6 +822,15 @@ void QXmppStream::sendNonSASLAuth(bool plainText)
sendPacket(authQuery);
}
+void QXmppStream::sendNonSASLAuthQuery( const QString &to )
+{
+ QXmppNonSASLAuthIq authQuery;
+ authQuery.setType(QXmppIq::Get);
+ authQuery.setTo(to);
+ authQuery.setUsername(configuration().user());
+ sendPacket(authQuery);
+}
+
// challenge is BASE64 encoded string
void QXmppStream::sendAuthDigestMD5ResponseStep1(const QString& challenge)
{
diff --git a/tests/tests.cpp b/tests/tests.cpp
index a838020a..14c05890 100644
--- a/tests/tests.cpp
+++ b/tests/tests.cpp
@@ -31,6 +31,7 @@
#include "QXmppBind.h"
#include "QXmppJingleIq.h"
#include "QXmppMessage.h"
+#include "QXmppNonSASLAuth.h"
#include "QXmppPresence.h"
#include "QXmppRpcIq.h"
#include "QXmppSession.h"
@@ -183,6 +184,18 @@ void TestPackets::testMessageLegacyDelay()
serializePacket(message, xml);
}
+void TestPackets::testNonSaslAuth()
+{
+ const QByteArray xml(
+ "<iq id=\"auth1\" to=\"shakespeare.lit\" type=\"get\">"
+ "<query xmlns=\"jabber:iq:auth\"/>"
+ "</iq>");
+
+ QXmppNonSASLAuthIq iq;
+ parsePacket(iq, xml);
+ serializePacket(iq, xml);
+}
+
void TestPackets::testPresence()
{
const QByteArray xml(
diff --git a/tests/tests.h b/tests/tests.h
index 33536883..0e177f1b 100644
--- a/tests/tests.h
+++ b/tests/tests.h
@@ -43,6 +43,7 @@ private slots:
void testMessageFull();
void testMessageDelay();
void testMessageLegacyDelay();
+ void testNonSaslAuth();
void testPresence();
void testPresenceFull();
void testSession();