Commit a95a2ab2 authored by LNJ's avatar LNJ 💬

Add RegistrationManager for changing password (back-end)

parent 7af0e2d9
set(CURDIR ${CMAKE_CURRENT_LIST_DIR})
# set Kaidans sources (used in main cmake file)
set(KAIDAN_SOURCES
${CURDIR}/main.cpp
${CURDIR}/Kaidan.cpp
${CURDIR}/ClientWorker.cpp
${CURDIR}/AvatarFileStorage.cpp
${CURDIR}/Database.cpp
${CURDIR}/RosterModel.cpp
${CURDIR}/RosterManager.cpp
${CURDIR}/MessageHandler.cpp
${CURDIR}/MessageModel.cpp
${CURDIR}/Notifications.cpp
${CURDIR}/PresenceCache.cpp
${CURDIR}/DiscoveryManager.cpp
${CURDIR}/VCardManager.cpp
${CURDIR}/LogHandler.cpp
${CURDIR}/StatusBar.cpp
${CURDIR}/UploadManager.cpp
${CURDIR}/EmojiModel.cpp
${CURDIR}/TransferCache.cpp
${CURDIR}/DownloadManager.cpp
${CURDIR}/Utils.cpp
src/main.cpp
src/Kaidan.cpp
src/ClientWorker.cpp
src/AvatarFileStorage.cpp
src/Database.cpp
src/RosterModel.cpp
src/RosterManager.cpp
src/RegistrationManager.cpp
src/MessageHandler.cpp
src/MessageModel.cpp
src/Notifications.cpp
src/PresenceCache.cpp
src/DiscoveryManager.cpp
src/VCardManager.cpp
src/LogHandler.cpp
src/StatusBar.cpp
src/UploadManager.cpp
src/EmojiModel.cpp
src/TransferCache.cpp
src/DownloadManager.cpp
src/Utils.cpp
# needed to trigger moc generation
${CURDIR}/Enums.h
src/Enums.h
# kaidan QXmpp extensions (need to be merged into QXmpp upstream)
${CURDIR}/qxmpp-exts/QXmppHttpUploadIq.cpp
${CURDIR}/qxmpp-exts/QXmppUploadRequestManager.cpp
${CURDIR}/qxmpp-exts/QXmppUploadManager.cpp
${CURDIR}/qxmpp-exts/QXmppColorGenerator.cpp
src/qxmpp-exts/QXmppHttpUploadIq.cpp
src/qxmpp-exts/QXmppUploadRequestManager.cpp
src/qxmpp-exts/QXmppUploadManager.cpp
src/qxmpp-exts/QXmppColorGenerator.cpp
# hsluv-c required for color generation
${CURDIR}/hsluv-c/hsluv.c
src/hsluv-c/hsluv.c
)
if (NOT ANDROID AND NOT IOS)
set (KAIDAN_SOURCES ${KAIDAN_SOURCES}
${CURDIR}/singleapp/singleapplication.cpp
${CURDIR}/singleapp/singleapplication_p.cpp
if(NOT ANDROID AND NOT IOS)
set(KAIDAN_SOURCES ${KAIDAN_SOURCES}
src/singleapp/singleapplication.cpp
src/singleapp/singleapplication_p.cpp
)
endif()
......@@ -42,6 +42,7 @@
// Kaidan
#include "Kaidan.h"
#include "LogHandler.h"
#include "RegistrationManager.h"
#include "RosterManager.h"
#include "MessageHandler.h"
#include "DiscoveryManager.h"
......@@ -57,6 +58,7 @@ ClientWorker::ClientWorker(Caches *caches, Kaidan *kaidan, bool enableLogging, Q
logger = new LogHandler(client, this);
logger->enableLogging(enableLogging);
vCardManager = new VCardManager(client, caches->avatarStorage, this);
registrationManager = new RegistrationManager(kaidan, caches->settings);
rosterManager = new RosterManager(kaidan, client, caches->rosterModel,
caches->avatarStorage, vCardManager, this);
msgHandler = new MessageHandler(kaidan, client, caches->msgModel, this);
......@@ -66,6 +68,8 @@ ClientWorker::ClientWorker(Caches *caches, Kaidan *kaidan, bool enableLogging, Q
downloadManager = new DownloadManager(kaidan, caches->transferCache,
caches->msgModel, this);
client->addExtension(registrationManager);
connect(client, &QXmppClient::presenceReceived,
caches->presCache, &PresenceCache::updatePresenceRequested);
......@@ -189,7 +193,7 @@ void ClientWorker::onConnectionError(QXmppClient::Error error)
QString ClientWorker::generateRandomString(unsigned int length) const
{
QString randomString;
for (int i = 0; i < length; ++i)
for (unsigned int i = 0; i < length; ++i)
randomString.append(KAIDAN_RESOURCE_RANDOM_CHARS.at(
qrand() % KAIDAN_RESOURCE_RANDOM_CHARS.length()));
return randomString;
......
......@@ -51,6 +51,7 @@ class QGuiApplication;
class LogHandler;
class Kaidan;
class ClientWorker;
class RegistrationManager;
class RosterManager;
class MessageHandler;
class DiscoveryManager;
......@@ -200,6 +201,7 @@ private:
bool enableLogging;
QGuiApplication *app;
RegistrationManager *registrationManager;
RosterManager *rosterManager;
MessageHandler *msgHandler;
DiscoveryManager *discoManager;
......
......@@ -45,6 +45,7 @@ const QString KAIDAN_RESOURCE_RANDOM_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefgh
// XML namespaces
#define NS_SPOILERS "urn:xmpp:spoiler:0"
#define NS_CARBONS "urn:xmpp:carbons:2"
#define NS_REGISTER "jabber:iq:register"
/**
* Map of JIDs to contact names
......
......@@ -342,13 +342,30 @@ signals:
void removeContact(QString jid);
/**
* @brief Downloads an attached media file of a message
* Downloads an attached media file of a message
*
* @param msgId The message
* @param url the media url from the message
*/
void downloadMedia(QString msgId, QString url);
/**
* Changes the user's password on the server
*
* @param newPassword The new password
*/
void changePassword(const QString &newPassword);
/**
* Emitted, when changing the password has succeeded.
*/
void passwordChangeSucceeded();
/**
* Emitted, when changing the password has failed.
*/
void passwordChangeFailed();
public slots:
/**
* Set current connection state
......
/*
* Kaidan - A user-friendly XMPP client for every device!
*
* Copyright (C) 2016-2019 Kaidan developers and contributors
* (see the LICENSE file for a full list of copyright authors)
*
* Kaidan is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* In addition, as a special exception, the author of Kaidan gives
* permission to link the code of its release with the OpenSSL
* project's "OpenSSL" library (or with modified versions of it that
* use the same license as the "OpenSSL" library), and distribute the
* linked executables. You must obey the GNU General Public License in
* all respects for all of the code used other than "OpenSSL". If you
* modify this file, you may extend this exception to your version of
* the file, but you are not obligated to do so. If you do not wish to
* do so, delete this exception statement from your version.
*
* Kaidan 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Kaidan. If not, see <http://www.gnu.org/licenses/>.
*/
#include "RegistrationManager.h"
#include "Globals.h"
#include "Kaidan.h"
#include <QXmppRegisterIq.h>
#include <QXmppClient.h>
#include <QXmppUtils.h>
#include <QXmppDiscoveryManager.h>
#include <QSettings>
#include <QDomElement>
RegistrationManager::RegistrationManager(Kaidan *kaidan, QSettings *settings)
: kaidan(kaidan), settings(settings)
{
connect(kaidan, &Kaidan::changePassword, this, &RegistrationManager::changePassword);
connect(this, &RegistrationManager::passwordChanged, kaidan, &Kaidan::setPassword);
connect(this, &RegistrationManager::passwordChanged,
kaidan, &Kaidan::passwordChangeSucceeded);
connect(this, &RegistrationManager::passwordChangeFailed,
kaidan, &Kaidan::passwordChangeFailed);
}
QStringList RegistrationManager::discoveryFeatures() const
{
return QStringList() << NS_REGISTER;
}
void RegistrationManager::changePassword(const QString &newPassword)
{
m_newPasswordIqId = QXmppUtils::generateStanzaHash();
m_newPassword = newPassword;
QXmppRegisterIq iq;
iq.setType(QXmppIq::Set);
iq.setTo(client()->configuration().domain());
iq.setFrom(client()->configuration().jid());
iq.setUsername(QXmppUtils::jidToUser(client()->configuration().jid()));
iq.setPassword(newPassword);
iq.setId(m_newPasswordIqId);
client()->sendPacket(iq);
}
bool RegistrationManager::handleStanza(const QDomElement &stanza)
{
// result of change password:
if (!m_newPassword.isEmpty() && stanza.attribute("id") == m_newPasswordIqId) {
QXmppRegisterIq iq;
iq.parse(stanza);
if (iq.type() == QXmppIq::Result) {
// Success
client()->configuration().setPassword(m_newPassword);
settings->setValue(KAIDAN_SETTINGS_AUTH_PASSWD,
QString::fromUtf8(m_newPassword.toUtf8().toBase64()));
emit passwordChanged(m_newPassword);
emit kaidan->passiveNotificationRequested(
tr("Password changed successfully.")
);
} else if (iq.type() == QXmppIq::Error) {
// Error
emit passwordChangeFailed();
emit kaidan->passiveNotificationRequested(
tr("Failed to change password: %1").arg(iq.error().text())
);
qWarning() << QString("Failed to change password: %1").arg(iq.error().text());
}
m_newPassword = "";
m_newPasswordIqId = "";
return true;
}
return false;
}
void RegistrationManager::handleDiscoInfo(const QXmppDiscoveryIq &iq)
{
// check features of own server
if (iq.from().isEmpty() || iq.from() == client()->configuration().domain()) {
if (iq.features().contains(NS_REGISTER))
setRegistrationSupported(true);
}
}
bool RegistrationManager::registrationSupported() const
{
return m_registrationSupported;
}
void RegistrationManager::setRegistrationSupported(bool registrationSupported)
{
if (m_registrationSupported == registrationSupported) {
m_registrationSupported = registrationSupported;
emit registrationSupportedChanged();
}
}
void RegistrationManager::setClient(QXmppClient *client)
{
QXmppClientExtension::setClient(client);
// get service discovery manager
auto *disco = client->findExtension<QXmppDiscoveryManager>();
if (disco) {
connect(disco, &QXmppDiscoveryManager::infoReceived,
this, &RegistrationManager::handleDiscoInfo);
connect(client, &QXmppClient::disconnected, [this] () {
setRegistrationSupported(false);
});
}
}
/*
* Kaidan - A user-friendly XMPP client for every device!
*
* Copyright (C) 2016-2019 Kaidan developers and contributors
* (see the LICENSE file for a full list of copyright authors)
*
* Kaidan is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* In addition, as a special exception, the author of Kaidan gives
* permission to link the code of its release with the OpenSSL
* project's "OpenSSL" library (or with modified versions of it that
* use the same license as the "OpenSSL" library), and distribute the
* linked executables. You must obey the GNU General Public License in
* all respects for all of the code used other than "OpenSSL". If you
* modify this file, you may extend this exception to your version of
* the file, but you are not obligated to do so. If you do not wish to
* do so, delete this exception statement from your version.
*
* Kaidan 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Kaidan. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef REGISTRATIONMANAGER_H
#define REGISTRATIONMANAGER_H
#include <QXmppClientExtension.h>
class Kaidan;
class QSettings;
class RegistrationManager : public QXmppClientExtension
{
Q_OBJECT
Q_PROPERTY(bool registrationSupported READ registrationSupported
NOTIFY registrationSupportedChanged)
public:
RegistrationManager(Kaidan *kaidan, QSettings *settings);
QStringList discoveryFeatures() const override;
/**
* @brief Changes the user's password
* @param newPassword The requested new password
*/
void changePassword(const QString &newPassword);
bool registrationSupported() const;
signals:
void passwordChanged(const QString &newPassword);
void passwordChangeFailed();
void registrationSupportedChanged();
protected:
void setClient(QXmppClient *client) override;
private slots:
void handleDiscoInfo(const QXmppDiscoveryIq &iq);
private:
bool handleStanza(const QDomElement &stanza) override;
void setRegistrationSupported(bool registrationSupported);
Kaidan *kaidan;
QSettings *settings;
bool m_registrationSupported = false;
// caching
QString m_newPasswordIqId;
QString m_newPassword;
};
#endif // REGISTRATIONMANAGER_H
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment