diff options
| author | Jeremy Lainé <jeremy.laine@m4x.org> | 2012-07-20 17:37:38 +0200 |
|---|---|---|
| committer | Jeremy Lainé <jeremy.laine@m4x.org> | 2012-07-20 17:37:38 +0200 |
| commit | 51eef84fd4104f19228ebd85fce89658b64464a2 (patch) | |
| tree | 31db52023ae0a063714140897bcbbfb6010ba04a /src/base/QXmppSasl_p.h | |
| parent | db4fe78387247ff039602030d964e4c0d6e39f46 (diff) | |
| download | qxmpp-51eef84fd4104f19228ebd85fce89658b64464a2.tar.gz | |
make SASL code fully private
Diffstat (limited to 'src/base/QXmppSasl_p.h')
| -rw-r--r-- | src/base/QXmppSasl_p.h | 300 |
1 files changed, 300 insertions, 0 deletions
diff --git a/src/base/QXmppSasl_p.h b/src/base/QXmppSasl_p.h new file mode 100644 index 00000000..636385ef --- /dev/null +++ b/src/base/QXmppSasl_p.h @@ -0,0 +1,300 @@ +/* + * Copyright (C) 2008-2012 The QXmpp developers + * + * Authors: + * Manjeet Dahiya + * 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. + * + */ + +#ifndef QXMPPSASL_P_H +#define QXMPPSASL_P_H + +#include <QByteArray> +#include <QMap> + +#include "QXmppGlobal.h" +#include "QXmppLogger.h" +#include "QXmppStanza.h" + +class QXmppSaslClientPrivate; +class QXmppSaslServerPrivate; + +// +// W A R N I N G +// ------------- +// +// This file is not part of the QXmpp API. It exists for the convenience +// of the QXmppIncomingClient and QXmppOutgoingClient classes. +// +// This header file may change from version to version without notice, +// or even be removed. +// +// We mean it. +// + +class QXmppSaslClient : public QXmppLoggable +{ +public: + QXmppSaslClient(QObject *parent = 0); + virtual ~QXmppSaslClient(); + + QString host() const; + void setHost(const QString &host); + + QString serviceType() const; + void setServiceType(const QString &serviceType); + + QString username() const; + void setUsername(const QString &username); + + QString password() const; + void setPassword(const QString &password); + + virtual QString mechanism() const = 0; + virtual bool respond(const QByteArray &challenge, QByteArray &response) = 0; + + static QStringList availableMechanisms(); + static QXmppSaslClient* create(const QString &mechanism, QObject *parent = 0); + +private: + QXmppSaslClientPrivate *d; +}; + +/// The QXmppServerClient class is the base class for all SASL server +/// authentication methods. + +class QXmppSaslServer : public QXmppLoggable +{ +public: + enum Response { + Challenge = 0, + Succeeded = 1, + Failed = 2, + InputNeeded = 3 + }; + + QXmppSaslServer(QObject *parent = 0); + virtual ~QXmppSaslServer(); + + QString username() const; + void setUsername(const QString &username); + + QString password() const; + void setPassword(const QString &password); + + QByteArray passwordDigest() const; + void setPasswordDigest(const QByteArray &digest); + + QString realm() const; + void setRealm(const QString &realm); + + virtual QString mechanism() const = 0; + virtual Response respond(const QByteArray &challenge, QByteArray &response) = 0; + + static QXmppSaslServer* create(const QString &mechanism, QObject *parent = 0); + +private: + QXmppSaslServerPrivate *d; +}; + + +class QXmppSaslDigestMd5 +{ +public: + static void setNonce(const QByteArray &nonce); + + // message parsing and serialization + static QMap<QByteArray, QByteArray> parseMessage(const QByteArray &ba); + static QByteArray serializeMessage(const QMap<QByteArray, QByteArray> &map); +}; + +class QXmppSaslStanza : public QXmppStanza +{ +public: + QXmppSaslStanza(const QString &type, const QByteArray &value = QByteArray()); + + QString type() const; + void setType(const QString &type); + + QByteArray value() const; + void setValue(const QByteArray &value); + + /// \cond + void parse(const QDomElement &element); + void toXml(QXmlStreamWriter *writer) const; + /// \endcond + +private: + QString m_type; + QByteArray m_value; +}; + +class QXmppSaslAuth : public QXmppSaslStanza +{ +public: + QXmppSaslAuth(const QString &mechanism = QString(), const QByteArray &value = QByteArray()); + + QString mechanism() const; + void setMechanism(const QString &mechanism); + + /// \cond + void parse(const QDomElement &element); + void toXml(QXmlStreamWriter *writer) const; + /// \endcond + +private: + QString m_mechanism; +}; + +class QXmppSaslChallenge : public QXmppSaslStanza +{ +public: + QXmppSaslChallenge(const QByteArray &value = QByteArray()); +}; + +class QXmppSaslFailure : public QXmppSaslStanza +{ +public: + QXmppSaslFailure(const QString &condition = QString()); + + QString condition() const; + void setCondition(const QString &condition); + + /// \cond + void parse(const QDomElement &element); + void toXml(QXmlStreamWriter *writer) const; + /// \endcond + +private: + QString m_condition; +}; + +class QXmppSaslResponse : public QXmppSaslStanza +{ +public: + QXmppSaslResponse(const QByteArray &value = QByteArray()); +}; + +class QXmppSaslSuccess : public QXmppSaslStanza +{ +public: + QXmppSaslSuccess(); +}; + +class QXmppSaslClientAnonymous : public QXmppSaslClient +{ +public: + QXmppSaslClientAnonymous(QObject *parent = 0); + QString mechanism() const; + bool respond(const QByteArray &challenge, QByteArray &response); + +private: + int m_step; +}; + +class QXmppSaslClientDigestMd5 : public QXmppSaslClient +{ +public: + QXmppSaslClientDigestMd5(QObject *parent = 0); + QString mechanism() const; + bool respond(const QByteArray &challenge, QByteArray &response); + +private: + QByteArray m_cnonce; + QByteArray m_nc; + QByteArray m_nonce; + QByteArray m_secret; + int m_step; +}; + +class QXmppSaslClientFacebook : public QXmppSaslClient +{ +public: + QXmppSaslClientFacebook(QObject *parent = 0); + QString mechanism() const; + bool respond(const QByteArray &challenge, QByteArray &response); + +private: + int m_step; +}; + +class QXmppSaslClientPlain : public QXmppSaslClient +{ +public: + QXmppSaslClientPlain(QObject *parent = 0); + QString mechanism() const; + bool respond(const QByteArray &challenge, QByteArray &response); + +private: + int m_step; +}; + +class QXmppSaslServerAnonymous : public QXmppSaslServer +{ +public: + QXmppSaslServerAnonymous(QObject *parent = 0); + QString mechanism() const; + + Response respond(const QByteArray &challenge, QByteArray &response); + +private: + int m_step; +}; + +class QXmppSaslServerDigestMd5 : public QXmppSaslServer +{ +public: + QXmppSaslServerDigestMd5(QObject *parent = 0); + QString mechanism() const; + + Response respond(const QByteArray &challenge, QByteArray &response); + +private: + QByteArray m_cnonce; + QByteArray m_nc; + QByteArray m_nonce; + QByteArray m_secret; + int m_step; +}; + +class QXmppSaslServerFacebook : public QXmppSaslServer +{ +public: + QXmppSaslServerFacebook(QObject *parent = 0); + QString mechanism() const; + + Response respond(const QByteArray &challenge, QByteArray &response); + +private: + int m_step; +}; + +class QXmppSaslServerPlain : public QXmppSaslServer +{ +public: + QXmppSaslServerPlain(QObject *parent = 0); + QString mechanism() const; + + Response respond(const QByteArray &challenge, QByteArray &response); + +private: + int m_step; +}; + +#endif |
