1 /*
2  * SPDX-FileCopyrightText: 2017 Daniel Vrátil <dvratil@kde.org>
3  *
4  * SPDX-License-Identifier: LGPL-2.1-or-later
5  *
6  */
7 
8 #include "loginjob.h"
9 #include "session.h"
10 #include "sessionuiproxy.h"
11 
12 #include <QApplication>
13 #include <QCommandLineOption>
14 #include <QCommandLineParser>
15 
16 #include <KIO/SslUi>
17 
18 #include <iostream>
19 
20 class SessionUiProxy : public KSmtp::SessionUiProxy
21 {
22 public:
ignoreSslError(const KSslErrorUiData & errorData)23     bool ignoreSslError(const KSslErrorUiData &errorData) override
24     {
25         return KIO::SslUi::askIgnoreSslErrors(errorData);
26     }
27 };
28 
login(KSmtp::Session * session,const QString & user,const QString & pass)29 void login(KSmtp::Session *session, const QString &user, const QString &pass)
30 {
31     auto login = new KSmtp::LoginJob(session);
32     login->setUserName(user);
33     login->setPassword(pass);
34     QObject::connect(login, &KJob::result, [](KJob *job) {
35         if (job->error()) {
36             std::cout << "Login error: " << job->errorString().toStdString() << std::endl;
37             qApp->quit();
38         } else {
39             std::cout << "Login job finished" << std::endl;
40         }
41     });
42     login->start();
43     std::cout << "Login job started" << std::endl;
44 }
45 
main(int argc,char ** argv)46 int main(int argc, char **argv)
47 {
48     QApplication app(argc, argv);
49 
50     QCommandLineParser parser;
51     QCommandLineOption hostOption(QStringLiteral("host"), QString(), QStringLiteral("hostname"));
52     QCommandLineOption portOption(QStringLiteral("port"), QString(), QStringLiteral("port"));
53     QCommandLineOption userOption(QStringLiteral("user"), QString(), QStringLiteral("username"));
54     QCommandLineOption passOption(QStringLiteral("pass"), QString(), QStringLiteral("password"));
55     QCommandLineOption sslTlsOption(QStringLiteral("sslTls"));
56     QCommandLineOption startTlsOption(QStringLiteral("starttls"));
57     parser.addOption(hostOption);
58     parser.addOption(portOption);
59     parser.addOption(userOption);
60     parser.addOption(passOption);
61     parser.addOption(sslTlsOption);
62     parser.addOption(startTlsOption);
63     parser.addHelpOption();
64 
65     parser.process(app);
66 
67     if (!parser.isSet(hostOption) || !parser.isSet(portOption) || !parser.isSet(userOption) || !parser.isSet(passOption)) {
68         parser.showHelp(1);
69         return 1;
70     }
71 
72     KSmtp::Session session(parser.value(hostOption), parser.value(portOption).toUInt());
73     session.setUiProxy(SessionUiProxy::Ptr(new SessionUiProxy));
74     if (parser.isSet(sslTlsOption)) {
75         session.setEncryptionMode(KSmtp::Session::TLS);
76     } else if (parser.isSet(startTlsOption)) {
77         session.setEncryptionMode(KSmtp::Session::STARTTLS);
78     }
79     QObject::connect(&session, &KSmtp::Session::stateChanged, [&](KSmtp::Session::State state) {
80         switch (state) {
81         case KSmtp::Session::Disconnected:
82             std::cout << "Session in Disconnected state" << std::endl;
83             break;
84         case KSmtp::Session::Handshake:
85             std::cout << "Session in Handshake state" << std::endl;
86             break;
87         case KSmtp::Session::Ready:
88             std::cout << "Session in Ready state" << std::endl;
89             std::cout << std::endl;
90             login(&session, parser.value(userOption), parser.value(passOption));
91             break;
92         case KSmtp::Session::Quitting:
93             // Internal (avoid compile warning)
94             break;
95         case KSmtp::Session::NotAuthenticated: {
96             std::cout << "Session in NotAuthenticated state" << std::endl;
97             std::cout << "Available auth modes: ";
98             const auto modes = session.availableAuthModes();
99             for (const QString &mode : modes) {
100                 std::cout << mode.toStdString() << " ";
101             }
102             std::cout << std::endl;
103         } break;
104         case KSmtp::Session::Authenticated:
105             std::cout << "Session entered Authenticated state, we are done" << std::endl;
106             app.quit();
107         }
108     });
109     std::cout << "Opening session ..." << std::endl;
110     session.open();
111 
112     return app.exec();
113 }
114