File indexing completed on 2024-05-26 05:27:08

0001 /*
0002    SPDX-FileCopyrightText: 2020-2024 Laurent Montel <montel@kde.org>
0003 
0004    SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "importmailjobinterfaceimpl.h"
0008 #include "archivestorage.h"
0009 #include "resourceconverterimpl.h"
0010 #include "smtpmailtransport.h"
0011 #include <Akonadi/CollectionFetchJob>
0012 #include <KIdentityManagementCore/Identity>
0013 #include <KIdentityManagementCore/IdentityManager>
0014 #include <MailCommon/FilterImporterExporter>
0015 #include <MailCommon/FilterManager>
0016 #include <PimCommonAkonadi/CreateResource>
0017 using namespace Akonadi;
0018 
0019 ImportMailJobInterfaceImpl::ImportMailJobInterfaceImpl(QObject *parent, Utils::StoredTypes typeSelected, ArchiveStorage *archiveStorage, int numberOfStep)
0020     : ImportMailJobInterface(parent, typeSelected, archiveStorage, numberOfStep)
0021     , mIdentityManager(KIdentityManagementCore::IdentityManager::self())
0022 {
0023 }
0024 
0025 ImportMailJobInterfaceImpl::~ImportMailJobInterfaceImpl() = default;
0026 
0027 QString ImportMailJobInterfaceImpl::configLocation() const
0028 {
0029     return QStandardPaths::writableLocation(QStandardPaths::ConfigLocation) + QLatin1Char('/');
0030 }
0031 
0032 void ImportMailJobInterfaceImpl::importFolderAttributes()
0033 {
0034 #if 0
0035     emitInfo(i18n("Restoring folder attributes..."));
0036     auto job = new ImportMailFolderAttributeJobImpl(this);
0037     job->setArchiveDirectory(mArchiveDirectory);
0038     job->setExportInterface(this);
0039     job->setExtractPath(mTempDirName);
0040     connect(job, &ImportMailFolderAttributeJobImpl::successed, this, [this]() {
0041         emitInfo(i18n("Restoring Folder Attributes done."));
0042         Q_EMIT jobFinished();
0043     });
0044     connect(job, &ImportMailFolderAttributeJobImpl::failed, this, [this]() {
0045         emitError(i18n("Folder Attributes cannot be restored."));
0046         Q_EMIT jobFinished();
0047     });
0048     job->start();
0049 #else
0050     Q_EMIT jobFinished();
0051 #endif
0052 }
0053 
0054 QString ImportMailJobInterfaceImpl::adaptResourcePath(const KSharedConfigPtr &resourceConfig, const QString &storedData)
0055 {
0056     ResourceConverterImpl converter;
0057     return converter.adaptResourcePath(resourceConfig, storedData);
0058 }
0059 
0060 void ImportMailJobInterfaceImpl::registerSpecialCollection(Akonadi::SpecialMailCollections::Type type, qint64 colId)
0061 {
0062     auto fetch = new Akonadi::CollectionFetchJob(Akonadi::Collection(colId), Akonadi::CollectionFetchJob::Base, this);
0063     connect(fetch, &Akonadi::CollectionFetchJob::collectionsReceived, this, [type](const Akonadi::Collection::List &cols) {
0064         if (cols.count() != 1) {
0065             return;
0066         }
0067         Akonadi::SpecialMailCollections::self()->registerCollection(type, cols.first());
0068     });
0069 }
0070 
0071 QString ImportMailJobInterfaceImpl::createResource(const QString &resources, const QString &name, const QMap<QString, QVariant> &settings, bool synchronizeTree)
0072 {
0073     return mCreateResource->createResource(resources, name, settings, synchronizeTree);
0074 }
0075 
0076 void ImportMailJobInterfaceImpl::synchronizeResource(const QStringList &lst)
0077 {
0078     // It's maildir support. Need to add support
0079     startSynchronizeResources(lst);
0080 }
0081 
0082 void ImportMailJobInterfaceImpl::importFilters(const QString &filename)
0083 {
0084     bool canceled = false;
0085     MailCommon::FilterImporterExporter exportFilters;
0086     const QList<MailCommon::MailFilter *> lstFilter = exportFilters.importFilters(canceled, MailCommon::FilterImporterExporter::KMailFilter, filename);
0087     if (!canceled) {
0088         MailCommon::FilterManager::instance()->appendFilters(lstFilter);
0089     }
0090 }
0091 
0092 Collection::Id ImportMailJobInterfaceImpl::convertFolderPathToCollectionId(const QString &path)
0093 {
0094     ResourceConverterImpl converter;
0095     return converter.convertFolderPathToCollectionId(path);
0096 }
0097 
0098 QString ImportMailJobInterfaceImpl::adaptNewResourceUrl(bool overwriteResources, const KSharedConfig::Ptr &resourceConfig, const QString &storePath)
0099 {
0100     ResourceConverterImpl converter;
0101     return converter.adaptNewResourceUrl(overwriteResources, resourceConfig, storePath);
0102 }
0103 
0104 void ImportMailJobInterfaceImpl::addNewIdentity(const QString &name, KConfigGroup &group, int defaultIdentity, int oldUid)
0105 {
0106     const QString uniqueName = uniqueIdentityName(name);
0107     KIdentityManagementCore::Identity *identity = &mIdentityManager->newFromScratch(uniqueName);
0108     group.writeEntry(QStringLiteral("Identity"), uniqueName);
0109     group.sync();
0110 
0111     identity->readConfig(group);
0112 
0113     if (oldUid != -1) {
0114         mHashIdentity.insert(oldUid, identity->uoid());
0115         if (oldUid == defaultIdentity) {
0116             mIdentityManager->setAsDefault(identity->uoid());
0117         }
0118     }
0119     mIdentityManager->commit();
0120 }
0121 
0122 QString ImportMailJobInterfaceImpl::uniqueIdentityName(const QString &name)
0123 {
0124     QString newName(name);
0125     int i = 1;
0126     while (!mIdentityManager->isUnique(newName)) {
0127         newName = QStringLiteral("%1_%2").arg(name).arg(i);
0128         ++i;
0129     }
0130     return newName;
0131 }
0132 
0133 void ImportMailJobInterfaceImpl::importCustomMailTransport(const QString &identifierValue, const KConfigGroup &group, int defaultTransport, int transportId)
0134 {
0135     if (!identifierValue.isEmpty()) {
0136         if (identifierValue == QLatin1StringView("sendmail") || identifierValue == QLatin1StringView("akonadi_ewsmta_resource")) {
0137             MailTransport::Transport *mt = MailTransport::TransportManager::self()->createTransport();
0138             mt->setName(group.readEntry(QStringLiteral("name")));
0139             const QString hostStr(QStringLiteral("host"));
0140             if (group.hasKey(hostStr)) {
0141                 mt->setHost(group.readEntry(hostStr));
0142             }
0143             mt->setIdentifier(identifierValue);
0144             addMailTransport(mt, defaultTransport, transportId);
0145         } else {
0146             qCWarning(PIMDATAEXPORTERCORE_LOG) << "Unknown identifier type " << identifierValue;
0147         }
0148     } else {
0149         qCWarning(PIMDATAEXPORTERCORE_LOG) << "identifier value is empty";
0150     }
0151 }
0152 
0153 int ImportMailJobInterfaceImpl::convertEncryptionEnum(int val)
0154 {
0155     switch (val) {
0156     case 0:
0157         return MailTransport::Transport::EnumEncryption::None;
0158     case 1:
0159         return MailTransport::Transport::EnumEncryption::TLS;
0160     case 2:
0161         return MailTransport::Transport::EnumEncryption::SSL;
0162     }
0163     return MailTransport::Transport::EnumEncryption::None;
0164 }
0165 
0166 void ImportMailJobInterfaceImpl::importSmtpMailTransport(const SmtpMailTransport &smtpMailTransport, int defaultTransport, int transportId)
0167 {
0168     MailTransport::Transport *mt = MailTransport::TransportManager::self()->createTransport();
0169     mt->setName(smtpMailTransport.name());
0170     mt->setHost(smtpMailTransport.host());
0171     mt->setPort(smtpMailTransport.port());
0172     mt->setUserName(smtpMailTransport.userName());
0173     mt->setPrecommand(smtpMailTransport.precommand());
0174     mt->setRequiresAuthentication(smtpMailTransport.requiresAuthentication());
0175     mt->setSpecifyHostname(smtpMailTransport.specifyHostname());
0176     mt->setLocalHostname(smtpMailTransport.localHostname());
0177     mt->setSpecifySenderOverwriteAddress(smtpMailTransport.specifySenderOverwriteAddress());
0178     mt->setStorePassword(smtpMailTransport.storePassword());
0179     mt->setSenderOverwriteAddress(smtpMailTransport.senderOverwriteAddress());
0180     mt->setEncryption(convertEncryptionEnum(smtpMailTransport.encryption()));
0181     mt->setAuthenticationType(smtpMailTransport.authenticationType());
0182     addMailTransport(mt, defaultTransport, transportId);
0183 }
0184 
0185 void ImportMailJobInterfaceImpl::addMailTransport(MailTransport::Transport *mt, int defaultTransport, int transportId)
0186 {
0187     mt->forceUniqueName();
0188     mt->save();
0189     MailTransport::TransportManager::self()->addTransport(mt);
0190     if (transportId == defaultTransport) {
0191         MailTransport::TransportManager::self()->setDefaultTransport(mt->id());
0192     }
0193     mHashTransport.insert(transportId, mt->id());
0194     // qDebug() << " void ImportMailJobInterface::addMailTransport(MailTransport::Transport *mt, int defaultTransport, int transportId)" << transportId;
0195 }
0196 
0197 #include "moc_importmailjobinterfaceimpl.cpp"