File indexing completed on 2024-05-12 05:21:36
0001 /* 0002 * SPDX-FileCopyrightText: 2017 Daniel Vrátil <dvratil@kde.org> 0003 * 0004 * SPDX-License-Identifier: LGPL-2.1-or-later 0005 * 0006 */ 0007 0008 #include "loginjob.h" 0009 #include "session.h" 0010 #include "sessionuiproxy.h" 0011 0012 #include <QApplication> 0013 #include <QCommandLineOption> 0014 #include <QCommandLineParser> 0015 0016 #include <KIO/SslUi> 0017 0018 #include <iostream> 0019 0020 class SessionUiProxy : public KSmtp::SessionUiProxy 0021 { 0022 public: 0023 bool ignoreSslError(const KSslErrorUiData &errorData) override 0024 { 0025 return KIO::SslUi::askIgnoreSslErrors(errorData); 0026 } 0027 }; 0028 0029 void login(KSmtp::Session *session, const QString &user, const QString &pass) 0030 { 0031 auto login = new KSmtp::LoginJob(session); 0032 login->setUserName(user); 0033 login->setPassword(pass); 0034 QObject::connect(login, &KJob::result, [](KJob *job) { 0035 if (job->error()) { 0036 std::cout << "Login error: " << job->errorString().toStdString() << std::endl; 0037 qApp->quit(); 0038 } else { 0039 std::cout << "Login job finished" << std::endl; 0040 } 0041 }); 0042 login->start(); 0043 std::cout << "Login job started" << std::endl; 0044 } 0045 0046 int main(int argc, char **argv) 0047 { 0048 QApplication app(argc, argv); 0049 0050 QCommandLineParser parser; 0051 QCommandLineOption hostOption(QStringLiteral("host"), QString(), QStringLiteral("hostname")); 0052 QCommandLineOption portOption(QStringLiteral("port"), QString(), QStringLiteral("port")); 0053 QCommandLineOption userOption(QStringLiteral("user"), QString(), QStringLiteral("username")); 0054 QCommandLineOption passOption(QStringLiteral("pass"), QString(), QStringLiteral("password")); 0055 QCommandLineOption sslTlsOption(QStringLiteral("sslTls")); 0056 QCommandLineOption startTlsOption(QStringLiteral("starttls")); 0057 parser.addOption(hostOption); 0058 parser.addOption(portOption); 0059 parser.addOption(userOption); 0060 parser.addOption(passOption); 0061 parser.addOption(sslTlsOption); 0062 parser.addOption(startTlsOption); 0063 parser.addHelpOption(); 0064 0065 parser.process(app); 0066 0067 if (!parser.isSet(hostOption) || !parser.isSet(portOption) || !parser.isSet(userOption) || !parser.isSet(passOption)) { 0068 parser.showHelp(1); 0069 return 1; 0070 } 0071 0072 KSmtp::Session session(parser.value(hostOption), parser.value(portOption).toUInt()); 0073 session.setUiProxy(SessionUiProxy::Ptr(new SessionUiProxy)); 0074 if (parser.isSet(sslTlsOption)) { 0075 session.setEncryptionMode(KSmtp::Session::TLS); 0076 } else if (parser.isSet(startTlsOption)) { 0077 session.setEncryptionMode(KSmtp::Session::STARTTLS); 0078 } 0079 QObject::connect(&session, &KSmtp::Session::stateChanged, [&](KSmtp::Session::State state) { 0080 switch (state) { 0081 case KSmtp::Session::Disconnected: 0082 std::cout << "Session in Disconnected state" << std::endl; 0083 break; 0084 case KSmtp::Session::Handshake: 0085 std::cout << "Session in Handshake state" << std::endl; 0086 break; 0087 case KSmtp::Session::Ready: 0088 std::cout << "Session in Ready state" << std::endl; 0089 std::cout << std::endl; 0090 login(&session, parser.value(userOption), parser.value(passOption)); 0091 break; 0092 case KSmtp::Session::Quitting: 0093 // Internal (avoid compile warning) 0094 break; 0095 case KSmtp::Session::NotAuthenticated: { 0096 std::cout << "Session in NotAuthenticated state" << std::endl; 0097 std::cout << "Available auth modes: "; 0098 const auto modes = session.availableAuthModes(); 0099 for (const QString &mode : modes) { 0100 std::cout << mode.toStdString() << " "; 0101 } 0102 std::cout << std::endl; 0103 } break; 0104 case KSmtp::Session::Authenticated: 0105 std::cout << "Session entered Authenticated state, we are done" << std::endl; 0106 app.quit(); 0107 } 0108 }); 0109 std::cout << "Opening session ..." << std::endl; 0110 session.open(); 0111 0112 return app.exec(); 0113 }