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

0001 /*
0002    SPDX-FileCopyrightText: 2019-2024 Laurent Montel <montel@kde.org>
0003 
0004    SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "dkimdownloadkeyjob.h"
0008 #include "messageviewer_dkimcheckerdebug.h"
0009 
0010 #include <QDnsLookup>
0011 using namespace MessageViewer;
0012 DKIMDownloadKeyJob::DKIMDownloadKeyJob(QObject *parent)
0013     : QObject(parent)
0014 {
0015 }
0016 
0017 DKIMDownloadKeyJob::~DKIMDownloadKeyJob() = default;
0018 
0019 bool DKIMDownloadKeyJob::start()
0020 {
0021     if (!canStart()) {
0022         qCWarning(MESSAGEVIEWER_DKIMCHECKER_LOG) << "Impossible to start download public keys";
0023         deleteLater();
0024         return false;
0025     }
0026     mDnsLookup = new QDnsLookup(this);
0027     connect(mDnsLookup, &QDnsLookup::finished, this, &DKIMDownloadKeyJob::resolvDnsDone);
0028 
0029     mDnsLookup->setType(QDnsLookup::TXT);
0030     mDnsLookup->setName(resolvDnsValue());
0031     mDnsLookup->lookup();
0032     return true;
0033 }
0034 
0035 bool DKIMDownloadKeyJob::canStart() const
0036 {
0037     return !mDomainName.isEmpty() && !mSelectorName.isEmpty();
0038 }
0039 
0040 QString DKIMDownloadKeyJob::domainName() const
0041 {
0042     return mDomainName;
0043 }
0044 
0045 void DKIMDownloadKeyJob::setDomainName(const QString &domainName)
0046 {
0047     mDomainName = domainName;
0048 }
0049 
0050 QString DKIMDownloadKeyJob::selectorName() const
0051 {
0052     return mSelectorName;
0053 }
0054 
0055 void DKIMDownloadKeyJob::setSelectorName(const QString &selectorName)
0056 {
0057     mSelectorName = selectorName;
0058 }
0059 
0060 QString DKIMDownloadKeyJob::resolvDnsValue() const
0061 {
0062     const QString name = mSelectorName + QLatin1StringView("._domainkey.") + mDomainName;
0063     qDebug(MESSAGEVIEWER_DKIMCHECKER_LOG) << "DKIMDownloadKeyJob::resolvDnsValue" << name;
0064     return name;
0065 }
0066 
0067 QDnsLookup *DKIMDownloadKeyJob::dnsLookup() const
0068 {
0069     return mDnsLookup;
0070 }
0071 
0072 void DKIMDownloadKeyJob::resolvDnsDone()
0073 {
0074     // Check the lookup succeeded.
0075     if (mDnsLookup->error() != QDnsLookup::NoError) {
0076         qCWarning(MESSAGEVIEWER_DKIMCHECKER_LOG) << "Error during resolving: " << mDnsLookup->errorString();
0077         Q_EMIT error(mDnsLookup->errorString());
0078         deleteLater();
0079         return;
0080     }
0081 
0082     // Handle the results.
0083     const auto records = mDnsLookup->textRecords();
0084     QList<QByteArray> textRecordResult;
0085     textRecordResult.reserve(records.count());
0086     for (const QDnsTextRecord &record : records) {
0087         textRecordResult << record.values();
0088     }
0089 
0090     Q_EMIT success(textRecordResult, mDomainName, mSelectorName);
0091     deleteLater();
0092 }
0093 
0094 #include "moc_dkimdownloadkeyjob.cpp"