File indexing completed on 2025-02-02 05:08:36

0001 /*
0002     SPDX-FileCopyrightText: 2009 Volker Krause <vkrause@kde.org>
0003     SPDX-FileCopyrightText: 2023-2024 Laurent Montel <montel.org>
0004 
0005     SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007 
0008 #include "transport.h"
0009 #include "accountwizard_debug.h"
0010 #include <KLocalizedString>
0011 #include <MailTransport/Transport>
0012 #include <MailTransport/TransportManager>
0013 
0014 #define TABLE_SIZE x
0015 
0016 template<typename T>
0017 struct StringValueTable {
0018     const char *name;
0019     using value_type = T;
0020     value_type value;
0021 };
0022 
0023 static const StringValueTable<MailTransport::Transport::EnumEncryption> encryptionEnum[] = {{"none", MailTransport::Transport::EnumEncryption::None},
0024                                                                                             {"ssl", MailTransport::Transport::EnumEncryption::SSL},
0025                                                                                             {"tls", MailTransport::Transport::EnumEncryption::TLS}};
0026 static const int encryptionEnumSize = sizeof(encryptionEnum) / sizeof(*encryptionEnum);
0027 
0028 static const StringValueTable<MailTransport::Transport::EnumAuthenticationType> authenticationTypeEnum[] = {
0029     {"login", MailTransport::Transport::EnumAuthenticationType::LOGIN},
0030     {"plain", MailTransport::Transport::EnumAuthenticationType::PLAIN},
0031     {"cram-md5", MailTransport::Transport::EnumAuthenticationType::CRAM_MD5},
0032     {"digest-md5", MailTransport::Transport::EnumAuthenticationType::DIGEST_MD5},
0033     {"gssapi", MailTransport::Transport::EnumAuthenticationType::GSSAPI},
0034     {"ntlm", MailTransport::Transport::EnumAuthenticationType::NTLM},
0035     {"apop", MailTransport::Transport::EnumAuthenticationType::APOP},
0036     {"clear", MailTransport::Transport::EnumAuthenticationType::CLEAR},
0037     {"oauth2", MailTransport::Transport::EnumAuthenticationType::XOAUTH2},
0038     {"anonymous", MailTransport::Transport::EnumAuthenticationType::ANONYMOUS}};
0039 static const int authenticationTypeEnumSize = sizeof(authenticationTypeEnum) / sizeof(*authenticationTypeEnum);
0040 
0041 template<typename T>
0042 static typename T::value_type stringToValue(const T *table, const int tableSize, const QString &string, bool &valid)
0043 {
0044     const QString ref = string.toLower();
0045     for (int i = 0; i < tableSize; ++i) {
0046         if (ref == QLatin1StringView(table[i].name)) {
0047             valid = true;
0048             return table[i].value;
0049         }
0050     }
0051     valid = false;
0052     return table[0].value; // TODO: error handling
0053 }
0054 
0055 Transport::Transport(QObject *parent)
0056     : SetupBase(parent)
0057 {
0058 }
0059 
0060 Transport::~Transport() = default;
0061 
0062 void Transport::createTransport()
0063 {
0064     Q_EMIT info(i18n("Setting up mail transport account..."));
0065     MailTransport::Transport *mt = MailTransport::TransportManager::self()->createTransport();
0066     mt->setName(mTransportInfo.name);
0067     mt->setHost(mTransportInfo.host);
0068     if (mTransportInfo.port > 0) {
0069         mt->setPort(mTransportInfo.port);
0070     }
0071     if (!mTransportInfo.user.isEmpty()) {
0072         mt->setUserName(mTransportInfo.user);
0073         mt->setRequiresAuthentication(true);
0074     }
0075     if (!mTransportInfo.password.isEmpty()) {
0076         mt->setStorePassword(true);
0077         mt->setPassword(mTransportInfo.password);
0078     }
0079     mTransportId = mt->id();
0080 
0081     bool valid;
0082     QString encrStr;
0083     MailTransport::Transport::EnumEncryption encr = stringToValue(encryptionEnum, encryptionEnumSize, mTransportInfo.encrStr, valid);
0084     if (valid) {
0085         qCWarning(ACCOUNTWIZARD_LOG) << "encr " << encr;
0086         encrStr = mTransportInfo.encrStr;
0087     }
0088     mt->setEncryption(encr);
0089 
0090     QString authStr;
0091     MailTransport::Transport::EnumAuthenticationType auth = stringToValue(authenticationTypeEnum, authenticationTypeEnumSize, mTransportInfo.authStr, valid);
0092     if (valid) {
0093         qCWarning(ACCOUNTWIZARD_LOG) << "auth " << auth;
0094         authStr = mTransportInfo.authStr;
0095     }
0096     mt->setAuthenticationType(auth);
0097 
0098     mt->save();
0099     Q_EMIT info(i18n("Mail transport uses '%1' encryption and '%2' authentication.", encrStr, authStr));
0100     MailTransport::TransportManager::self()->addTransport(mt);
0101     MailTransport::TransportManager::self()->setDefaultTransport(mt->id());
0102     Q_EMIT finished(i18n("Mail transport account set up."));
0103 }
0104 
0105 Transport::TransportInfo Transport::transportInfo() const
0106 {
0107     return mTransportInfo;
0108 }
0109 
0110 void Transport::setTransportInfo(const TransportInfo &newTransportInfo)
0111 {
0112     mTransportInfo = newTransportInfo;
0113 }
0114 
0115 int Transport::transportId() const
0116 {
0117     return mTransportId;
0118 }
0119 
0120 QDebug operator<<(QDebug d, const Transport::TransportInfo &t)
0121 {
0122     d << "name " << t.name;
0123     d << "host " << t.host;
0124     d << "user " << t.user;
0125     d << "password " << t.password;
0126     d << "encrStr " << t.encrStr;
0127     d << "authStr " << t.authStr;
0128     d << "port " << t.port;
0129 
0130     return d;
0131 }
0132 
0133 #include "moc_transport.cpp"