#include "login.h" #include "ui_login.h" #include #include "QXmppStanza.h" #include static QString error_to_str(const QXmppStanza::Error::Condition c) { switch (c) { case QXmppStanza::Error::BadRequest: return "BadRequest"; case QXmppStanza::Error::Conflict: return "Conflict"; case QXmppStanza::Error::FeatureNotImplemented: return "FeatureNotImplemented"; case QXmppStanza::Error::Forbidden: return "Forbidden"; case QXmppStanza::Error::Gone: return "Gone"; case QXmppStanza::Error::InternalServerError: return "internal server error"; case QXmppStanza::Error::ItemNotFound: return "item not found"; case QXmppStanza::Error::JidMalformed: return "JID Malformed"; case QXmppStanza::Error::NotAcceptable: return "not acceptable"; case QXmppStanza::Error::NotAllowed: return "not allowed"; case QXmppStanza::Error::NotAuthorized: return "not authorized"; case QXmppStanza::Error::RecipientUnavailable: return "recipient unavailable"; case QXmppStanza::Error::Redirect: return "Redirect"; case QXmppStanza::Error::RegistrationRequired: return "RegistrationRequired"; case QXmppStanza::Error::RemoteServerNotFound: return "RemoteServerNotFound"; case QXmppStanza::Error::RemoteServerTimeout: return "RemoteServerTimeout"; case QXmppStanza::Error::ResourceConstraint: return "ResourceConstraint"; case QXmppStanza::Error::ServiceUnavailable: return "ServiceUnavailable"; case QXmppStanza::Error::SubscriptionRequired: return "SubscriptionRequired"; case QXmppStanza::Error::UndefinedCondition: return "UndefinedCondition"; case QXmppStanza::Error::UnexpectedRequest: return "UnexpectedRequest"; case QXmppStanza::Error::PolicyViolation: return "PolicyViolation"; default: break; } return "UnknownError"; } Login::Login(QDialog *const parent) : QDialog(parent) { ui.setupUi(this); ui.error->setVisible(false); connect(ui.login_b, &QPushButton::released, [this] { const QString jid = ui.username->text(), pwd = ui.password->text(); QString domain, error; if (!jid_is_valid(jid, domain)) error = tr("Invalid username"); else if (pwd.isEmpty()) error = tr("Invalid password"); else setup(jid, pwd, domain); ui.error->setText(error); ui.error->setVisible(!error.isEmpty()); }); showMaximized(); } bool Login::jid_is_valid(const QString &jid, QString &domain) { if (jid.isEmpty() || jid.count('@') != 1) return false; else if ((domain = jid.mid(jid.indexOf('@') + 1)).isEmpty()) return false; return true; } void Login::setup(const QString &jid, const QString pwd, const QString &domain) { QXmppConfiguration cfg; cfg.setStreamSecurityMode(QXmppConfiguration::TLSRequired); cfg.setJid(jid); cfg.setPassword(pwd); cfg.setAutoReconnectionEnabled(false); const auto client = new Client(jid); connect(client, &Client::stateChanged, [d = domain, e = ui.error] (const Client::State state) { if (state == Client::ConnectingState) { e->setVisible(true); e->setText(tr("Connecting to ") + d + "..."); } }); connect(client, &Client::connected, this, [this, client] { Q_EMIT auth_success(client); close(); }); connect(client, &Client::disconnected, this, [this, client, e = ui.error] { e->setText("Disconnected from server: " + error_to_str(client->xmppStreamError())); e->setVisible(true); ui.login_b->setEnabled(true); delete client; }); ui.login_b->setEnabled(false); client->connectToServer(cfg); }