File indexing completed on 2025-03-09 04:54:38

0001 /*
0002   SPDX-FileCopyrightText: 2016-2024 Laurent Montel <montel@kde.org>
0003 
0004   SPDX-License-Identifier: LGPL-2.0-or-later
0005 
0006 */
0007 
0008 #include "scamexpandurljob.h"
0009 #include "messageviewer_debug.h"
0010 
0011 #include <PimCommon/BroadcastStatus>
0012 #include <PimCommon/NetworkManager>
0013 
0014 #include <KLocalizedString>
0015 
0016 #include <QJsonDocument>
0017 #include <QNetworkAccessManager>
0018 
0019 using namespace MessageViewer;
0020 class MessageViewer::ScamExpandUrlJobPrivate
0021 {
0022 public:
0023     ScamExpandUrlJobPrivate() = default;
0024 
0025     ~ScamExpandUrlJobPrivate() = default;
0026 
0027     QNetworkAccessManager *mNetworkAccessManager = nullptr;
0028 };
0029 
0030 ScamExpandUrlJob::ScamExpandUrlJob(QObject *parent)
0031     : QObject(parent)
0032     , d(new ScamExpandUrlJobPrivate)
0033 {
0034     d->mNetworkAccessManager = new QNetworkAccessManager(this);
0035     d->mNetworkAccessManager->setRedirectPolicy(QNetworkRequest::NoLessSafeRedirectPolicy);
0036     d->mNetworkAccessManager->setStrictTransportSecurityEnabled(true);
0037     d->mNetworkAccessManager->enableStrictTransportSecurityStore(true);
0038 
0039     connect(d->mNetworkAccessManager, &QNetworkAccessManager::finished, this, &ScamExpandUrlJob::slotExpandFinished);
0040 }
0041 
0042 ScamExpandUrlJob::~ScamExpandUrlJob() = default;
0043 
0044 void ScamExpandUrlJob::expandedUrl(const QUrl &url)
0045 {
0046     if (!PimCommon::NetworkManager::self()->isOnline()) {
0047         PimCommon::BroadcastStatus::instance()->setStatusMsg(i18n("No network connection detected, we cannot expand url."));
0048         deleteLater();
0049         return;
0050     }
0051     const QUrl newUrl(QStringLiteral("https://lengthenurl.info/api/longurl/shorturl/?inputURL=%1&format=json").arg(url.url()));
0052 
0053     qCDebug(MESSAGEVIEWER_LOG) << " newUrl " << newUrl;
0054     QNetworkReply *reply = d->mNetworkAccessManager->get(QNetworkRequest(newUrl));
0055     reply->setProperty("shortUrl", url.url());
0056     connect(reply, &QNetworkReply::errorOccurred, this, &ScamExpandUrlJob::slotError);
0057 }
0058 
0059 void ScamExpandUrlJob::slotExpandFinished(QNetworkReply *reply)
0060 {
0061     QUrl shortUrl;
0062     if (!reply->property("shortUrl").isNull()) {
0063         shortUrl.setUrl(reply->property("shortUrl").toString());
0064     }
0065     const QByteArray ba = reply->readAll();
0066     // qDebug() << " reply->readAll()" << ba;
0067     QJsonDocument jsonDoc = QJsonDocument::fromJson(ba);
0068     reply->deleteLater();
0069     if (!jsonDoc.isNull()) {
0070         const QMap<QString, QVariant> map = jsonDoc.toVariant().toMap();
0071         QUrl longUrl;
0072         const QVariant longUrlVar = map.value(QStringLiteral("LongURL"));
0073         if (longUrlVar.isValid()) {
0074             longUrl.setUrl(longUrlVar.toString());
0075         } else {
0076             qCWarning(MESSAGEVIEWER_LOG) << "JSon is not correct" << ba;
0077             PimCommon::BroadcastStatus::instance()->setStatusMsg(i18n("Impossible to expand \'%1\'.", shortUrl.url()));
0078             deleteLater();
0079             return;
0080         }
0081         PimCommon::BroadcastStatus::instance()->setStatusMsg(i18n("Short url \'%1\' redirects to \'%2\'.", shortUrl.url(), longUrl.toDisplayString()));
0082     } else {
0083         PimCommon::BroadcastStatus::instance()->setStatusMsg(i18n("Impossible to expand \'%1\'.", shortUrl.url()));
0084     }
0085     deleteLater();
0086 }
0087 
0088 void ScamExpandUrlJob::slotError(QNetworkReply::NetworkError error)
0089 {
0090     Q_EMIT expandUrlError(error);
0091     deleteLater();
0092 }
0093 
0094 #include "moc_scamexpandurljob.cpp"