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"