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