// SPDX-FileCopyrightText: 2023 Tobias Fella // SPDX-License-Identifier: GPL-2.0-or-later #include "neochatconnection.h" #include #include "controller.h" #include "jobs/neochatchangepasswordjob.h" #include "jobs/neochatdeactivateaccountjob.h" #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) #include #else #include #endif #include #include #include #include using namespace Quotient; NeoChatConnection::NeoChatConnection(QObject *parent) : Connection(parent) { connect(this, &NeoChatConnection::accountDataChanged, this, [this](const QString &type) { if (type == QLatin1String("org.kde.neochat.account_label")) { Q_EMIT labelChanged(); } }); } NeoChatConnection::NeoChatConnection(const QUrl &server, QObject *parent) : Connection(server, parent) { connect(this, &NeoChatConnection::accountDataChanged, this, [this](const QString &type) { if (type == QLatin1String("org.kde.neochat.account_label")) { Q_EMIT labelChanged(); } }); } void NeoChatConnection::logout(bool serverSideLogout) { SettingsGroup(QStringLiteral("Accounts")).remove(userId()); QKeychain::DeletePasswordJob job(qAppName()); job.setAutoDelete(true); job.setKey(userId()); QEventLoop loop; QKeychain::DeletePasswordJob::connect(&job, &QKeychain::Job::finished, &loop, &QEventLoop::quit); job.start(); loop.exec(); if (Controller::instance().accounts().count() > 1) { // Only set the connection if the the account being logged out is currently active if (this == Controller::instance().activeConnection()) { Controller::instance().setActiveConnection(dynamic_cast(Controller::instance().accounts().accounts()[0])); } } else { Controller::instance().setActiveConnection(nullptr); } if (!serverSideLogout) { return; } Connection::logout(); } bool NeoChatConnection::setAvatar(const QUrl &avatarSource) { QString decoded = avatarSource.path(); if (decoded.isEmpty()) { callApi(user()->id(), avatarSource); return true; } if (QImageReader(decoded).read().isNull()) { return false; } else { return user()->setAvatar(decoded); } } QVariantList NeoChatConnection::getSupportedRoomVersions() const { const auto &roomVersions = availableRoomVersions(); QVariantList supportedRoomVersions; for (const auto &v : roomVersions) { QVariantMap roomVersionMap; roomVersionMap.insert("id"_ls, v.id); roomVersionMap.insert("status"_ls, v.status); roomVersionMap.insert("isStable"_ls, v.isStable()); supportedRoomVersions.append(roomVersionMap); } return supportedRoomVersions; } void NeoChatConnection::changePassword(const QString ¤tPassword, const QString &newPassword) { auto job = callApi(newPassword, false); connect(job, &BaseJob::result, this, [this, job, currentPassword, newPassword] { if (job->error() == 103) { QJsonObject replyData = job->jsonData(); QJsonObject authData; authData["session"_ls] = replyData["session"_ls]; authData["password"_ls] = currentPassword; authData["type"_ls] = "m.login.password"_ls; authData["user"_ls] = user()->id(); QJsonObject identifier = {{"type"_ls, "m.id.user"_ls}, {"user"_ls, user()->id()}}; authData["identifier"_ls] = identifier; NeochatChangePasswordJob *innerJob = callApi(newPassword, false, authData); connect(innerJob, &BaseJob::success, this, []() { Q_EMIT Controller::instance().passwordStatus(Controller::PasswordStatus::Success); }); connect(innerJob, &BaseJob::failure, this, [innerJob]() { Q_EMIT Controller::instance().passwordStatus(innerJob->jsonData()["errcode"_ls] == "M_FORBIDDEN"_ls ? Controller::PasswordStatus::Wrong : Controller::PasswordStatus::Other); }); } }); } void NeoChatConnection::setLabel(const QString &label) { QJsonObject json{ {"account_label"_ls, label}, }; setAccountData("org.kde.neochat.account_label"_ls, json); Q_EMIT labelChanged(); } QString NeoChatConnection::label() const { return accountDataJson("org.kde.neochat.account_label"_ls)["account_label"_ls].toString(); } void NeoChatConnection::deactivateAccount(const QString &password) { auto job = callApi(); connect(job, &BaseJob::result, this, [this, job, password] { if (job->error() == 103) { QJsonObject replyData = job->jsonData(); QJsonObject authData; authData["session"_ls] = replyData["session"_ls]; authData["password"_ls] = password; authData["type"_ls] = "m.login.password"_ls; authData["user"_ls] = user()->id(); QJsonObject identifier = {{"type"_ls, "m.id.user"_ls}, {"user"_ls, user()->id()}}; authData["identifier"_ls] = identifier; auto innerJob = callApi(authData); connect(innerJob, &BaseJob::success, this, [this]() { logout(false); }); } }); } #include "moc_neochatconnection.cpp"