File: logintest.cpp

package info (click to toggle)
ksmtp 25.08.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky
  • size: 596 kB
  • sloc: cpp: 1,936; makefile: 16; sh: 1
file content (113 lines) | stat: -rw-r--r-- 3,940 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
/*
 * SPDX-FileCopyrightText: 2017 Daniel Vrátil <dvratil@kde.org>
 *
 * SPDX-License-Identifier: LGPL-2.1-or-later
 *
 */

#include "loginjob.h"
#include "session.h"
#include "sessionuiproxy.h"

#include <QApplication>
#include <QCommandLineOption>
#include <QCommandLineParser>

#include <KIO/SslUi>

#include <iostream>

class SessionUiProxy : public KSmtp::SessionUiProxy
{
public:
    bool ignoreSslError(const KSslErrorUiData &errorData) override
    {
        return KIO::SslUi::askIgnoreSslErrors(errorData);
    }
};

static void login(KSmtp::Session *session, const QString &user, const QString &pass)
{
    auto login = new KSmtp::LoginJob(session);
    login->setUserName(user);
    login->setPassword(pass);
    QObject::connect(login, &KJob::result, login, [](KJob *job) {
        if (job->error()) {
            std::cout << "Login error: " << job->errorString().toStdString() << std::endl;
            qApp->quit();
        } else {
            std::cout << "Login job finished" << std::endl;
        }
    });
    login->start();
    std::cout << "Login job started" << std::endl;
}

int main(int argc, char **argv)
{
    QApplication app(argc, argv);

    QCommandLineParser parser;
    QCommandLineOption hostOption(QStringLiteral("host"), QString(), QStringLiteral("hostname"));
    QCommandLineOption portOption(QStringLiteral("port"), QString(), QStringLiteral("port"));
    QCommandLineOption userOption(QStringLiteral("user"), QString(), QStringLiteral("username"));
    QCommandLineOption passOption(QStringLiteral("pass"), QString(), QStringLiteral("password"));
    QCommandLineOption sslTlsOption(QStringLiteral("sslTls"));
    QCommandLineOption startTlsOption(QStringLiteral("starttls"));
    parser.addOption(hostOption);
    parser.addOption(portOption);
    parser.addOption(userOption);
    parser.addOption(passOption);
    parser.addOption(sslTlsOption);
    parser.addOption(startTlsOption);
    parser.addHelpOption();

    parser.process(app);

    if (!parser.isSet(hostOption) || !parser.isSet(portOption) || !parser.isSet(userOption) || !parser.isSet(passOption)) {
        parser.showHelp(1);
        return 1;
    }

    KSmtp::Session session(parser.value(hostOption), parser.value(portOption).toUInt());
    session.setUiProxy(SessionUiProxy::Ptr(new SessionUiProxy));
    if (parser.isSet(sslTlsOption)) {
        session.setEncryptionMode(KSmtp::Session::TLS);
    } else if (parser.isSet(startTlsOption)) {
        session.setEncryptionMode(KSmtp::Session::STARTTLS);
    }
    QObject::connect(&session, &KSmtp::Session::stateChanged, &session, [&](KSmtp::Session::State state) {
        switch (state) {
        case KSmtp::Session::Disconnected:
            std::cout << "Session in Disconnected state" << std::endl;
            break;
        case KSmtp::Session::Handshake:
            std::cout << "Session in Handshake state" << std::endl;
            break;
        case KSmtp::Session::Ready:
            std::cout << "Session in Ready state" << std::endl;
            std::cout << std::endl;
            login(&session, parser.value(userOption), parser.value(passOption));
            break;
        case KSmtp::Session::Quitting:
            // Internal (avoid compile warning)
            break;
        case KSmtp::Session::NotAuthenticated: {
            std::cout << "Session in NotAuthenticated state" << std::endl;
            std::cout << "Available auth modes: ";
            const auto modes = session.availableAuthModes();
            for (const QString &mode : modes) {
                std::cout << mode.toStdString() << " ";
            }
            std::cout << std::endl;
        } break;
        case KSmtp::Session::Authenticated:
            std::cout << "Session entered Authenticated state, we are done" << std::endl;
            app.quit();
        }
    });
    std::cout << "Opening session ..." << std::endl;
    session.open();

    return app.exec();
}