diff options
| author | Jeremy Lainé <jeremy.laine@m4x.org> | 2012-02-08 12:14:30 +0000 |
|---|---|---|
| committer | Jeremy Lainé <jeremy.laine@m4x.org> | 2012-02-08 12:14:30 +0000 |
| commit | cea7ae1e702b82d2d0d0a851de1aae58270b14f6 (patch) | |
| tree | 7fb9d3bf62bed76f2bf5df4544952ce53a0003b3 /src/server | |
| parent | 0a07f25dfd859dcfaf27e89579a7e751865dc1ad (diff) | |
| download | qxmpp-cea7ae1e702b82d2d0d0a851de1aae58270b14f6.tar.gz | |
move QXmppPasswordChecker, it's server-only
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/QXmppPasswordChecker.cpp | 224 | ||||
| -rw-r--r-- | src/server/QXmppPasswordChecker.h | 109 |
2 files changed, 333 insertions, 0 deletions
diff --git a/src/server/QXmppPasswordChecker.cpp b/src/server/QXmppPasswordChecker.cpp new file mode 100644 index 00000000..9048d66c --- /dev/null +++ b/src/server/QXmppPasswordChecker.cpp @@ -0,0 +1,224 @@ +/* + * Copyright (C) 2008-2011 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 <QCryptographicHash> +#include <QString> +#include <QTimer> + +#include "QXmppPasswordChecker.h" + +/// Returns the requested domain. + +QString QXmppPasswordRequest::domain() const +{ + return m_domain; +} + +/// Sets the requested \a domain. +/// +/// \param domain + +void QXmppPasswordRequest::setDomain(const QString &domain) +{ + m_domain = domain; +} + +QString QXmppPasswordRequest::password() const +{ + return m_password; +} + +void QXmppPasswordRequest::setPassword(const QString &password) +{ + m_password = password; +} + +/// Returns the requested username. + +QString QXmppPasswordRequest::username() const +{ + return m_username; +} + +/// Sets the requested \a username. +/// +/// \param username + +void QXmppPasswordRequest::setUsername(const QString &username) +{ + m_username = username; +} + +/// Constructs a new QXmppPasswordReply. +/// +/// \param parent + +QXmppPasswordReply::QXmppPasswordReply(QObject *parent) + : QObject(parent), + m_error(QXmppPasswordReply::NoError), + m_isFinished(false) +{ +} + +/// Returns the received MD5 digest. + +QByteArray QXmppPasswordReply::digest() const +{ + return m_digest; +} + +/// Sets the received MD5 digest. +/// +/// \param digest + +void QXmppPasswordReply::setDigest(const QByteArray &digest) +{ + m_digest = digest; +} + +/// Returns the error that was found during the processing of this request. +/// +/// If no error was found, returns NoError. + +QXmppPasswordReply::Error QXmppPasswordReply::error() const +{ + return m_error; +} + +/// Returns the error that was found during the processing of this request. +/// +void QXmppPasswordReply::setError(QXmppPasswordReply::Error error) +{ + m_error = error; +} + +/// Mark reply as finished. + +void QXmppPasswordReply::finish() +{ + m_isFinished = true; + emit finished(); +} + +/// Delay marking reply as finished. + +void QXmppPasswordReply::finishLater() +{ + QTimer::singleShot(0, this, SLOT(finish())); +} + +/// Returns true when the reply has finished. + +bool QXmppPasswordReply::isFinished() const +{ + return m_isFinished; +} + +/// Returns the received password. + +QString QXmppPasswordReply::password() const +{ + return m_password; +} + +/// Sets the received password. +/// +/// \param password + +void QXmppPasswordReply::setPassword(const QString &password) +{ + m_password = password; +} + +/// Checks that the given credentials are valid. +/// +/// The base implementation requires that you reimplement getPassword(). +/// +/// \param request + +QXmppPasswordReply *QXmppPasswordChecker::checkPassword(const QXmppPasswordRequest &request) +{ + QXmppPasswordReply *reply = new QXmppPasswordReply; + + QString secret; + QXmppPasswordReply::Error error = getPassword(request, secret); + if (error == QXmppPasswordReply::NoError) { + if (request.password() != secret) + reply->setError(QXmppPasswordReply::AuthorizationError); + } else { + reply->setError(error); + } + + // reply is finished + reply->finishLater(); + return reply; +} + +/// Retrieves the MD5 digest for the given username. +/// +/// Reimplement this method if your backend natively supports +/// retrieving MD5 digests. +/// +/// \param request + +QXmppPasswordReply *QXmppPasswordChecker::getDigest(const QXmppPasswordRequest &request) +{ + QXmppPasswordReply *reply = new QXmppPasswordReply; + + QString secret; + QXmppPasswordReply::Error error = getPassword(request, secret); + if (error == QXmppPasswordReply::NoError) { + reply->setDigest(QCryptographicHash::hash( + (request.username() + ":" + request.domain() + ":" + secret).toUtf8(), + QCryptographicHash::Md5)); + } else { + reply->setError(error); + } + + // reply is finished + reply->finishLater(); + return reply; +} + +/// Retrieves the password for the given username. +/// +/// The simplest way to write a password checker is to reimplement this method. +/// +/// \param request +/// \param password + +QXmppPasswordReply::Error QXmppPasswordChecker::getPassword(const QXmppPasswordRequest &request, QString &password) +{ + Q_UNUSED(request); + Q_UNUSED(password); + return QXmppPasswordReply::TemporaryError; +} + +/// Returns true if the getPassword() method is implemented. +/// + +bool QXmppPasswordChecker::hasGetPassword() const +{ + return false; +} + diff --git a/src/server/QXmppPasswordChecker.h b/src/server/QXmppPasswordChecker.h new file mode 100644 index 00000000..85cef3d4 --- /dev/null +++ b/src/server/QXmppPasswordChecker.h @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2008-2011 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. + * + */ + +#ifndef QXMPPPASSWORDCHECKER_H +#define QXMPPPASSWORDCHECKER_H + +#include <QObject> + +/// \brief The QXmppPasswordRequest class represents a password request. +/// +class QXmppPasswordRequest +{ +public: + // This enum is used to describe request types. + enum Type { + CheckPassword = 0, + }; + + QString domain() const; + void setDomain(const QString &domain); + + QString password() const; + void setPassword(const QString &password); + + QString username() const; + void setUsername(const QString &username); + +private: + QString m_domain; + QString m_password; + QString m_username; +}; + +/// \brief The QXmppPasswordRequest class represents a password reply. +/// +class QXmppPasswordReply : public QObject +{ + Q_OBJECT + +public: + /// This enum is used to describe authentication errors. + enum Error { + NoError = 0, + AuthorizationError, + TemporaryError, + }; + + QXmppPasswordReply(QObject *parent = 0); + + QByteArray digest() const; + void setDigest(const QByteArray &digest); + + QString password() const; + void setPassword(const QString &password); + + QXmppPasswordReply::Error error() const; + void setError(QXmppPasswordReply::Error error); + + bool isFinished() const; + +public slots: + void finish(); + void finishLater(); + +signals: + void finished(); + +private: + QByteArray m_digest; + QString m_password; + QXmppPasswordReply::Error m_error; + bool m_isFinished; +}; + +/// \brief The QXmppPasswordChecker class represents an abstract password checker. +/// + +class QXmppPasswordChecker +{ +public: + virtual QXmppPasswordReply *checkPassword(const QXmppPasswordRequest &request); + virtual QXmppPasswordReply *getDigest(const QXmppPasswordRequest &request); + virtual bool hasGetPassword() const; + +protected: + virtual QXmppPasswordReply::Error getPassword(const QXmppPasswordRequest &request, QString &password); +}; + +#endif |
