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 }