diff --git a/src/RegistrationManager.cpp b/src/RegistrationManager.cpp index 30b4f40..194e0d8 100644 --- a/src/RegistrationManager.cpp +++ b/src/RegistrationManager.cpp @@ -1,162 +1,162 @@ /* * Kaidan - A user-friendly XMPP client for every device! * * Copyright (C) 2016-2020 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 . */ #include "ClientWorker.h" #include "RegistrationManager.h" #include "Globals.h" #include "Kaidan.h" #include #include #include #include #if (QXMPP_VERSION) >= QT_VERSION_CHECK(1, 2, 0) #include #endif #include #include RegistrationManager::RegistrationManager(Kaidan *kaidan, ClientWorker *clientWorker, QXmppClient *client, QSettings *settings) : kaidan(kaidan), clientWorker(clientWorker), settings(settings), m_client(client) #if (QXMPP_VERSION) >= QT_VERSION_CHECK(1, 2, 0) , m_manager(new QXmppRegistrationManager) #endif { #if (QXMPP_VERSION) >= QT_VERSION_CHECK(1, 2, 0) m_client->addExtension(m_manager); connect(m_manager, &QXmppRegistrationManager::accountDeletionFailed, clientWorker, &ClientWorker::onAccountDeletionFromServerFailed); connect(m_manager, &QXmppRegistrationManager::accountDeleted, clientWorker, &ClientWorker::onAccountDeletedFromServer); #endif 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::registrationSupported() const +{ + return m_registrationSupported; +} + +void RegistrationManager::deleteAccount() +{ +#if (QXMPP_VERSION) >= QT_VERSION_CHECK(1, 2, 0) + m_manager->deleteAccount(); +#else + emit kaidan->passiveNotificationRequested("Account deletion is not supported. If an update doesn't help, contact your distribution maintainers: QXmpp version >= 1.2 is required."); +#endif +} + +void RegistrationManager::setClient(QXmppClient *client) +{ + QXmppClientExtension::setClient(client); + // get service discovery manager + auto *disco = client->findExtension(); + if (disco) { + connect(disco, &QXmppDiscoveryManager::infoReceived, + this, &RegistrationManager::handleDiscoInfo); + + connect(client, &QXmppClient::disconnected, this, [=] () { + setRegistrationSupported(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::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::deleteAccount() -{ -#if (QXMPP_VERSION) >= QT_VERSION_CHECK(1, 2, 0) - m_manager->deleteAccount(); -#else - emit kaidan->passiveNotificationRequested("Account deletion is not supported. If an update doesn't help, contact your distribution maintainers: QXmpp version >= 1.2 is required."); -#endif -} - 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(); - if (disco) { - connect(disco, &QXmppDiscoveryManager::infoReceived, - this, &RegistrationManager::handleDiscoInfo); - - connect(client, &QXmppClient::disconnected, this, [=] () { - setRegistrationSupported(false); - }); - } -}