From 0f95c6e941c9a8b545f3903e4e1842c229d60fe7 Mon Sep 17 00:00:00 2001 From: Andrew Nelless Date: Fri, 30 Sep 2016 15:03:49 +0100 Subject: [PATCH] #5629 Complete activation support for activation dialog --- src/gui/res/ActivationDialog.ui | 24 ++--- src/gui/res/CancelActivationDialog.ui | 2 +- src/gui/src/ActivationDialog.cpp | 147 +++++++++++++++++++++++++- src/gui/src/ActivationDialog.h | 13 ++- src/gui/src/AppConfig.cpp | 91 +++++++++++++++- src/gui/src/AppConfig.h | 77 +++++++------- src/gui/src/EditionType.h | 6 +- src/gui/src/MainWindow.cpp | 20 +--- src/gui/src/MainWindow.h | 4 +- src/gui/src/QUtility.cpp | 17 +++ src/gui/src/QUtility.h | 1 + src/gui/src/SetupWizard.cpp | 9 +- src/gui/src/SubscriptionManager.cpp | 4 +- src/gui/src/WebClient.cpp | 92 +++++++--------- src/gui/src/WebClient.h | 16 +-- 15 files changed, 374 insertions(+), 149 deletions(-) diff --git a/src/gui/res/ActivationDialog.ui b/src/gui/res/ActivationDialog.ui index 63e9e26125..fb700f9197 100644 --- a/src/gui/res/ActivationDialog.ui +++ b/src/gui/res/ActivationDialog.ui @@ -11,7 +11,7 @@ - Dialog + Activate Synergy @@ -51,17 +51,11 @@ - + 0 0 - - - 200 - 20 - - QLineEdit::Normal @@ -77,17 +71,11 @@ - + 0 0 - - - 200 - 20 - - QLineEdit::Password @@ -120,6 +108,9 @@ + + false + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> @@ -127,6 +118,9 @@ p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> + + false + diff --git a/src/gui/res/CancelActivationDialog.ui b/src/gui/res/CancelActivationDialog.ui index 2c6ef41b85..b98733f6e1 100644 --- a/src/gui/res/CancelActivationDialog.ui +++ b/src/gui/res/CancelActivationDialog.ui @@ -7,7 +7,7 @@ 0 0 400 - 156 + 165 diff --git a/src/gui/src/ActivationDialog.cpp b/src/gui/src/ActivationDialog.cpp index da7e934ac0..df0d1618e6 100644 --- a/src/gui/src/ActivationDialog.cpp +++ b/src/gui/src/ActivationDialog.cpp @@ -1,12 +1,44 @@ #include "ActivationDialog.h" #include "ui_ActivationDialog.h" #include "CancelActivationDialog.h" +#include "AppConfig.h" +#include "WebClient.h" +#include "EditionType.h" +#include "ActivationNotifier.h" +#include "MainWindow.h" +#include "QUtility.h" +#include "SubscriptionManager.h" -ActivationDialog::ActivationDialog(QWidget *parent) : +#include +#include +#include + +ActivationDialog::ActivationDialog(QWidget* parent, AppConfig& appConfig) : QDialog(parent), - ui(new Ui::ActivationDialog) + ui(new Ui::ActivationDialog), + m_appConfig (&appConfig) { ui->setupUi(this); + + ui->m_pLineEditEmail->setText(appConfig.activateEmail()); + ui->m_pTextEditSerialKey->setText(appConfig.serialKey()); + + if (!appConfig.serialKey().isEmpty()) { + ui->m_pRadioButtonActivate->setAutoExclusive(false); + ui->m_pRadioButtonSubscription->setAutoExclusive(false); + ui->m_pRadioButtonActivate->setChecked(false); + ui->m_pRadioButtonSubscription->setChecked(true); + ui->m_pRadioButtonActivate->setAutoExclusive(true); + ui->m_pRadioButtonSubscription->setAutoExclusive(true); + ui->m_pTextEditSerialKey->setFocus(); + ui->m_pTextEditSerialKey->moveCursor(QTextCursor::End); + } else { + if (ui->m_pLineEditEmail->text().isEmpty()) { + ui->m_pLineEditEmail->setFocus(); + } else { + ui->m_pLineEditPassword->setFocus(); + } + } } ActivationDialog::~ActivationDialog() @@ -14,10 +46,121 @@ ActivationDialog::~ActivationDialog() delete ui; } +void ActivationDialog::notifyActivation(QString identity) +{ + ActivationNotifier* notifier = new ActivationNotifier(); + notifier->setIdentity(identity); + + QThread* thread = new QThread(); + connect(notifier, SIGNAL(finished()), thread, SLOT(quit())); + connect(notifier, SIGNAL(finished()), notifier, SLOT(deleteLater())); + connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater())); + + notifier->moveToThread(thread); + thread->start(); + + QMetaObject::invokeMethod(notifier, "notify", Qt::QueuedConnection); +} + void ActivationDialog::reject() { CancelActivationDialog cancelActivationDialog(this); if (QDialog::Accepted == cancelActivationDialog.exec()) { + notifyActivation("skip:unknown"); QDialog::reject(); } } + +void ActivationDialog::on_m_pRadioButtonSubscription_toggled(bool checked) +{ + if (checked) { + ui->m_pLineEditEmail->setEnabled(false); + ui->m_pLineEditPassword->setEnabled(false); + ui->m_pTextEditSerialKey->setEnabled(true); + ui->m_pTextEditSerialKey->setFocus(); + } +} + +void ActivationDialog::on_m_pRadioButtonActivate_toggled(bool checked) +{ + if (checked) { + ui->m_pLineEditEmail->setEnabled(true); + ui->m_pLineEditPassword->setEnabled(true); + ui->m_pTextEditSerialKey->setEnabled(false); + if (ui->m_pLineEditEmail->text().isEmpty()) { + ui->m_pLineEditEmail->setFocus(); + } else { + ui->m_pLineEditPassword->setFocus(); + } + } +} + +void ActivationDialog::accept() +{ + QMessageBox message; + QString error; + int edition = Unregistered; + + try { + if (ui->m_pRadioButtonActivate->isChecked()) { + WebClient webClient; + QString email = ui->m_pLineEditEmail->text(); + QString password = ui->m_pLineEditPassword->text(); + + if (!webClient.setEmail (email, error)) { + message.critical (this, "Invalid Email Address", tr("%1").arg(error)); + return; + } + else if (!webClient.setPassword (password, error)) { + message.critical (this, "Invalid Password", tr("%1").arg(error)); + return; + } + else if (!webClient.getEdition (edition, error)) { + message.critical (this, "Activation Error", + tr("An error occurred while trying to activate Synergy. " + "The Symless server returned the following error:\n\n%1").arg(error)); + return; + } + + m_appConfig->setActivateEmail (email); + m_appConfig->clearSerialKey(); + ui->m_pTextEditSerialKey->clear(); + notifyActivation ("login:" + m_appConfig->activateEmail()); + } + else { + QString serialKey = ui->m_pTextEditSerialKey->toPlainText(); + + if (!m_appConfig->setSerialKey (serialKey, error)) { + message.critical (this, "Invalid Serial Key", tr("%1").arg(error)); + return; + } + + SubscriptionManager subscriptionManager (this, *m_appConfig, edition); + if (!subscriptionManager.activateSerial (serialKey)) { + return; + } + m_appConfig->setActivateEmail(""); + notifyActivation ("serial:" + m_appConfig->serialKey()); + } + } + catch (std::exception& e) { + message.critical (this, "Unknown Error", + tr("An error occurred while trying to activate Synergy. " + "Please contact the helpdesk, and provide the " + "following details.\n\n%1").arg(e.what())); + return; + } + + m_appConfig->setEdition(edition); + m_appConfig->saveSettings(); + + message.information (this, "Activated!", + tr("Thanks for activating %1!").arg + (getEditionName (edition))); + MainWindow& mainWindow = dynamic_cast(*this->parent()); + mainWindow.setEdition(edition); + mainWindow.updateLocalFingerprint(); + mainWindow.settings().sync(); + + QDialog::accept(); +} diff --git a/src/gui/src/ActivationDialog.h b/src/gui/src/ActivationDialog.h index 396c41046e..6fb926cce4 100644 --- a/src/gui/src/ActivationDialog.h +++ b/src/gui/src/ActivationDialog.h @@ -7,19 +7,30 @@ namespace Ui { class ActivationDialog; } +class AppConfig; + class ActivationDialog : public QDialog { Q_OBJECT public: - explicit ActivationDialog(QWidget *parent = 0); + explicit ActivationDialog(QWidget *parent, AppConfig& appConfig); ~ActivationDialog(); public slots: void reject(); + void accept(); + +protected: + void notifyActivation (QString identity); private: Ui::ActivationDialog *ui; + AppConfig* m_appConfig; + +private slots: + void on_m_pRadioButtonSubscription_toggled(bool checked); + void on_m_pRadioButtonActivate_toggled(bool checked); }; #endif // ACTIVATIONDIALOG_H diff --git a/src/gui/src/AppConfig.cpp b/src/gui/src/AppConfig.cpp index a48bbc04c1..6347c6cf65 100644 --- a/src/gui/src/AppConfig.cpp +++ b/src/gui/src/AppConfig.cpp @@ -73,6 +73,18 @@ AppConfig::~AppConfig() saveSettings(); } +const QString &AppConfig::screenName() const { return m_ScreenName; } + +int AppConfig::port() const { return m_Port; } + +const QString &AppConfig::interface() const { return m_Interface; } + +int AppConfig::logLevel() const { return m_LogLevel; } + +bool AppConfig::logToFile() const { return m_LogToFile; } + +const QString &AppConfig::logFilename() const { return m_LogFilename; } + QString AppConfig::synergyLogDir() const { #if defined(Q_OS_WIN) @@ -116,6 +128,16 @@ QString AppConfig::logLevelText() const return logLevelNames[logLevel()]; } +ProcessMode AppConfig::processMode() const { return m_ProcessMode; } + +bool AppConfig::wizardShouldRun() const { return m_WizardLastRun < kWizardVersion; } + +const QString &AppConfig::language() const { return m_Language; } + +bool AppConfig::startedBefore() const { return m_StartedBefore; } + +bool AppConfig::autoConfig() const { return m_AutoConfig; } + void AppConfig::loadSettings() { m_ScreenName = settings().value("screenName", QHostInfo::localHostName()).toString(); @@ -135,7 +157,7 @@ void AppConfig::loadSettings() } m_ElevateMode = static_cast(elevateMode.toInt()); m_AutoConfigPrompted = settings().value("autoConfigPrompted", false).toBool(); - m_Edition = settings().value("edition", Unknown).toInt(); + m_Edition = settings().value("edition", Unregistered).toInt(); m_ActivateEmail = settings().value("activateEmail", "").toString(); m_CryptoEnabled = settings().value("cryptoEnabled", false).toBool(); m_AutoHide = settings().value("autoHide", false).toBool(); @@ -168,17 +190,84 @@ void AppConfig::saveSettings() settings().setValue("lastExpiringWarningTime", m_LastExpiringWarningTime); } +QSettings &AppConfig::settings() { return *m_pSettings; } + +void AppConfig::setScreenName(const QString &s) { m_ScreenName = s; } + +void AppConfig::setPort(int i) { m_Port = i; } + +void AppConfig::setInterface(const QString &s) { m_Interface = s; } + +void AppConfig::setLogLevel(int i) { m_LogLevel = i; } + +void AppConfig::setLogToFile(bool b) { m_LogToFile = b; } + +void AppConfig::setLogFilename(const QString &s) { m_LogFilename = s; } + +void AppConfig::setWizardHasRun() { m_WizardLastRun = kWizardVersion; } + +void AppConfig::setLanguage(const QString language) { m_Language = language; } + +void AppConfig::setStartedBefore(bool b) { m_StartedBefore = b; } + +void AppConfig::setElevateMode(ElevateMode em) { m_ElevateMode = em; } + void AppConfig::setAutoConfig(bool autoConfig) { m_AutoConfig = autoConfig; } +bool AppConfig::autoConfigPrompted() { return m_AutoConfigPrompted; } + void AppConfig::setAutoConfigPrompted(bool prompted) { m_AutoConfigPrompted = prompted; } +void AppConfig::setEdition(int e) { m_Edition = e; } + +int AppConfig::edition() { return m_Edition; } + +bool AppConfig::setActivateEmail(QString e) { + m_ActivateEmail = e; + return true; +} + +QString AppConfig::activateEmail() { return m_ActivateEmail; } + +bool AppConfig::setSerialKey(QString serial, QString& errorOut) { + if (serial.isEmpty()) { + errorOut = "Your serial key cannot be blank."; + return false; + } + m_Serialkey = serial; + return true; +} + +void AppConfig::clearSerialKey() +{ + m_Serialkey.clear(); +} + +QString AppConfig::serialKey() { return m_Serialkey; } + +int AppConfig::lastExpiringWarningTime() const { return m_LastExpiringWarningTime; } + +void AppConfig::setLastExpiringWarningTime(int t) { m_LastExpiringWarningTime = t; } + +QString AppConfig::synergysName() const { return m_SynergysName; } + +QString AppConfig::synergycName() const { return m_SynergycName; } + ElevateMode AppConfig::elevateMode() { return m_ElevateMode; } + +void AppConfig::setCryptoEnabled(bool e) { m_CryptoEnabled = e; } + +bool AppConfig::getCryptoEnabled() { return m_CryptoEnabled; } + +void AppConfig::setAutoHide(bool b) { m_AutoHide = b; } + +bool AppConfig::getAutoHide() { return m_AutoHide; } diff --git a/src/gui/src/AppConfig.h b/src/gui/src/AppConfig.h index 43e35c7fc9..df391bfba4 100644 --- a/src/gui/src/AppConfig.h +++ b/src/gui/src/AppConfig.h @@ -58,33 +58,34 @@ class AppConfig ~AppConfig(); public: - const QString& screenName() const { return m_ScreenName; } - int port() const { return m_Port; } - const QString& interface() const { return m_Interface; } - int logLevel() const { return m_LogLevel; } - bool logToFile() const { return m_LogToFile; } - const QString& logFilename() const { return m_LogFilename; } + const QString& screenName() const; + int port() const; + const QString& interface() const; + int logLevel() const; + bool logToFile() const; + const QString& logFilename() const; const QString logFilenameCmd() const; QString logLevelText() const; - ProcessMode processMode() const { return m_ProcessMode; } - bool wizardShouldRun() const { return m_WizardLastRun < kWizardVersion; } - const QString& language() const { return m_Language; } - bool startedBefore() const { return m_StartedBefore; } - bool autoConfig() const { return m_AutoConfig; } + ProcessMode processMode() const; + bool wizardShouldRun() const; + const QString& language() const; + bool startedBefore() const; + bool autoConfig() const; void setAutoConfig(bool autoConfig); - bool autoConfigPrompted() { return m_AutoConfigPrompted; } + bool autoConfigPrompted(); void setAutoConfigPrompted(bool prompted); - void setEdition(int e) { m_Edition = e; } - int edition() { return m_Edition; } - void setActivateEmail(QString e) { m_ActivateEmail = e; } - QString activateEmail() { return m_ActivateEmail; } - void setSerialKey(QString serial) { m_Serialkey = serial; } - QString serialKey() { return m_Serialkey; } - int lastExpiringWarningTime() const { return m_LastExpiringWarningTime; } - void setLastExpiringWarningTime(int t) { m_LastExpiringWarningTime = t; } - - QString synergysName() const { return m_SynergysName; } - QString synergycName() const { return m_SynergycName; } + void setEdition(int e); + int edition(); + bool setActivateEmail(QString e); + QString activateEmail(); + bool setSerialKey(QString serial, QString& error); + void clearSerialKey(); + QString serialKey(); + int lastExpiringWarningTime() const; + void setLastExpiringWarningTime(int t); + + QString synergysName() const; + QString synergycName() const; QString synergyProgramDir() const; QString synergyLogDir() const; @@ -92,25 +93,25 @@ class AppConfig void persistLogDir(); ElevateMode elevateMode(); - void setCryptoEnabled(bool e) { m_CryptoEnabled = e; } - bool getCryptoEnabled() { return m_CryptoEnabled; } - void setAutoHide(bool b) { m_AutoHide = b; } - bool getAutoHide() { return m_AutoHide; } + void setCryptoEnabled(bool e); + bool getCryptoEnabled(); + void setAutoHide(bool b); + bool getAutoHide(); void saveSettings(); protected: - QSettings& settings() { return *m_pSettings; } - void setScreenName(const QString& s) { m_ScreenName = s; } - void setPort(int i) { m_Port = i; } - void setInterface(const QString& s) { m_Interface = s; } - void setLogLevel(int i) { m_LogLevel = i; } - void setLogToFile(bool b) { m_LogToFile = b; } - void setLogFilename(const QString& s) { m_LogFilename = s; } - void setWizardHasRun() { m_WizardLastRun = kWizardVersion; } - void setLanguage(const QString language) { m_Language = language; } - void setStartedBefore(bool b) { m_StartedBefore = b; } - void setElevateMode(ElevateMode em) { m_ElevateMode = em; } + QSettings& settings(); + void setScreenName(const QString& s); + void setPort(int i); + void setInterface(const QString& s); + void setLogLevel(int i); + void setLogToFile(bool b); + void setLogFilename(const QString& s); + void setWizardHasRun(); + void setLanguage(const QString language); + void setStartedBefore(bool b); + void setElevateMode(ElevateMode em); void loadSettings(); diff --git a/src/gui/src/EditionType.h b/src/gui/src/EditionType.h index d294cda531..5869a32b4a 100644 --- a/src/gui/src/EditionType.h +++ b/src/gui/src/EditionType.h @@ -18,11 +18,13 @@ #ifndef EDITIONTYPE_H #define EDITIONTYPE_H -enum qEditionType { +/* Do not reorder these! */ + +enum EditionType { Basic, Pro, Trial, - Unknown + Unregistered }; #endif // EDITIONTYPE_H diff --git a/src/gui/src/MainWindow.cpp b/src/gui/src/MainWindow.cpp index 64f9f42542..15c20d122d 100644 --- a/src/gui/src/MainWindow.cpp +++ b/src/gui/src/MainWindow.cpp @@ -1015,23 +1015,9 @@ void MainWindow::serverDetected(const QString name) } } -void MainWindow::setEdition(int type) +void MainWindow::setEdition(int edition) { - QString title; - if (type == Basic) { - title = "Synergy Basic"; - } - else if (type == Pro) { - title = "Synergy Pro"; - } - else if (type == Trial) { - title = "Synergy Trial"; - } - else { - title = "Synergy (UNREGISTERED)"; - } - - setWindowTitle(title); + setWindowTitle(getEditionName(edition)); } void MainWindow::updateLocalFingerprint() @@ -1154,7 +1140,7 @@ void MainWindow::on_m_pActionWizard_triggered() void MainWindow::on_m_pActivate_triggered() { - ActivationDialog activationDialog (this); + ActivationDialog activationDialog (this, this->appConfig()); activationDialog.exec(); } diff --git a/src/gui/src/MainWindow.h b/src/gui/src/MainWindow.h index b08709a7c3..8788e4a26c 100644 --- a/src/gui/src/MainWindow.h +++ b/src/gui/src/MainWindow.h @@ -33,6 +33,7 @@ #include "VersionChecker.h" #include "IpcClient.h" #include "Ipc.h" +#include "ActivationDialog.h" #include @@ -63,6 +64,7 @@ class MainWindow : public QMainWindow, public Ui::MainWindowBase friend class QSynergyApplication; friend class SetupWizard; + friend class ActivationDialog; public: enum qSynergyState @@ -111,7 +113,7 @@ class MainWindow : public QMainWindow, public Ui::MainWindowBase void autoAddScreen(const QString name); void updateZeroconfService(); void serverDetected(const QString name); - void setEdition(int type); + void setEdition(int edition); void updateLocalFingerprint(); public slots: void appendLogRaw(const QString& text); diff --git a/src/gui/src/QUtility.cpp b/src/gui/src/QUtility.cpp index a21343ec65..ca2c52c0c6 100644 --- a/src/gui/src/QUtility.cpp +++ b/src/gui/src/QUtility.cpp @@ -19,6 +19,7 @@ #include "ProcessorArch.h" #include "CommandProcess.h" +#include "EditionType.h" #if defined(Q_OS_LINUX) #include @@ -42,6 +43,22 @@ void setIndexFromItemData(QComboBox* comboBox, const QVariant& itemData) } } +QString +getEditionName (int edition) { + if (edition == Basic) { + return "Synergy Basic"; + } + else if (edition == Pro) { + return "Synergy Pro"; + } + else if (edition == Trial) { + return "Synergy Trial"; + } + else { + return "Synergy (UNREGISTERED)"; + } +} + QString hash(const QString& string) { QByteArray data = string.toUtf8(); diff --git a/src/gui/src/QUtility.h b/src/gui/src/QUtility.h index 0738d96cc2..ca00d06fad 100644 --- a/src/gui/src/QUtility.h +++ b/src/gui/src/QUtility.h @@ -29,3 +29,4 @@ QString hash(const QString& string); QString getFirstMacAddress(); qProcessorArch getProcessorArch(); QString getOSInformation(); +QString getEditionName (int edition); diff --git a/src/gui/src/SetupWizard.cpp b/src/gui/src/SetupWizard.cpp index ed574e04e1..6a28c2f875 100644 --- a/src/gui/src/SetupWizard.cpp +++ b/src/gui/src/SetupWizard.cpp @@ -29,7 +29,7 @@ SetupWizard::SetupWizard(MainWindow& mainWindow, bool startMain) : m_MainWindow(mainWindow), m_StartMain(startMain), - m_Edition(Unknown), + m_Edition(Unregistered), m_LoginAttemps(0) { setupUi(this); @@ -76,7 +76,7 @@ bool SetupWizard::validateCurrentPage() message.setWindowTitle(tr("Setup Synergy")); message.setIcon(QMessageBox::Information); - if (currentPage() == m_pActivatePage) + /*if (currentPage() == m_pActivatePage) { if (m_pRadioButtonActivate->isChecked()) { if (m_pLineEditEmail->text().isEmpty() || @@ -136,7 +136,8 @@ bool SetupWizard::validateCurrentPage() return true; } } - else if (currentPage() == m_pNodePage) + else */ + if (currentPage() == m_pNodePage) { bool result = m_pClientRadioButton->isChecked() || m_pServerRadioButton->isChecked(); @@ -201,7 +202,7 @@ void SetupWizard::accept() if (m_pRadioButtonSubscription->isChecked()) { - appConfig.setSerialKey(m_pTextEditSerialKey->toPlainText()); + //appConfig.setSerialKey(m_pTextEditSerialKey->toPlainText()); notifyActivation("serial:" + m_pTextEditSerialKey->toPlainText()); } diff --git a/src/gui/src/SubscriptionManager.cpp b/src/gui/src/SubscriptionManager.cpp index 52096a11a2..107bdff132 100644 --- a/src/gui/src/SubscriptionManager.cpp +++ b/src/gui/src/SubscriptionManager.cpp @@ -39,7 +39,7 @@ SubscriptionManager::SubscriptionManager(QWidget* parent, AppConfig& appConfig, bool SubscriptionManager::activateSerial(const QString& serial) { - m_Edition = Unknown; + m_Edition = Unregistered; persistDirectory(); CoreInterface coreInterface; QString output; @@ -62,7 +62,7 @@ bool SubscriptionManager::activateSerial(const QString& serial) bool SubscriptionManager::checkSubscription() { - m_Edition = Unknown; + m_Edition = Unregistered; persistDirectory(); CoreInterface coreInterface; QString output; diff --git a/src/gui/src/WebClient.cpp b/src/gui/src/WebClient.cpp index 4b4b999b4e..a0a6118a00 100644 --- a/src/gui/src/WebClient.cpp +++ b/src/gui/src/WebClient.cpp @@ -25,76 +25,60 @@ #include #include -int WebClient::getEdition( - const QString& email, - const QString& password, - QMessageBox& message, - QWidget* w) -{ - QString responseJson; - int edition = Unknown; - try { - responseJson = request(email, password); - } - catch (std::exception& e) - { - message.critical( - w, "Error", - tr("An error occurred while trying to sign in. " - "Please contact the helpdesk, and provide the " - "following details.\n\n%1").arg(e.what())); - return edition; - } +bool +WebClient::getEdition (int& edition, QString& errorOut) { + QString responseJson = request(); + + /* TODO: This is horrible and should be ripped out as soon as we move + * to Qt 5. See issue #5630 + */ QRegExp resultRegex(".*\"result\".*:.*(true|false).*"); - if (resultRegex.exactMatch(responseJson)) { + if (resultRegex.exactMatch (responseJson)) { QString boolString = resultRegex.cap(1); if (boolString == "true") { QRegExp editionRegex(".*\"edition\".*:.*\"([^\"]+)\".*"); if (editionRegex.exactMatch(responseJson)) { QString e = editionRegex.cap(1); edition = e.toInt(); + return true; + } else { + throw std::runtime_error ("Unrecognised server response."); } - - return edition; + } else { + errorOut = tr("Login failed. Invalid email or password."); + return false; } - else if (boolString == "false") { - message.critical( - w, "Error", - tr("Login failed, invalid email or password.")); - - return edition; - } - } - else { + } else { QRegExp errorRegex(".*\"error\".*:.*\"([^\"]+)\".*"); - if (errorRegex.exactMatch(responseJson)) { - - // replace "\n" with real new lines. - QString error = errorRegex.cap(1).replace("\\n", "\n"); - message.critical( - w, "Error", - tr("Login failed, an error occurred.\n\n%1").arg(error)); - - return edition; + if (errorRegex.exactMatch (responseJson)) { + errorOut = errorRegex.cap(1).replace("\\n", "\n"); + return false; + } else { + throw std::runtime_error ("Unrecognised server response."); } } +} - message.critical( - w, "Error", - tr("Login failed, an error occurred.\n\nServer response:\n\n%1") - .arg(responseJson)); +bool +WebClient::setEmail (QString email, QString& errorOut) { + if (email.isEmpty()) { + errorOut = tr("Your email address cannot be left blank."); + return false; + } + m_Email = email; + return true; +} - return edition; +bool +WebClient::setPassword (QString password, QString&) { + m_Password = password; + return true; } -QString WebClient::request( - const QString& email, - const QString& password) -{ +QString +WebClient::request() { QStringList args("--login-auth"); - // hash password in case it contains interesting chars. - QString credentials(email + ":" + hash(password) + "\n"); - - return m_CoreInterface.run(args, credentials); + QString credentials (m_Email + ":" + hash(m_Password) + "\n"); + return m_CoreInterface.run (args, credentials); } diff --git a/src/gui/src/WebClient.h b/src/gui/src/WebClient.h index 100b63d128..7ff6e2beba 100644 --- a/src/gui/src/WebClient.h +++ b/src/gui/src/WebClient.h @@ -32,21 +32,15 @@ class WebClient : public QObject Q_OBJECT public: - int getEdition(const QString& email, - const QString& password, - QMessageBox& message, - QWidget* w); - void setEmail(QString& e) { m_Email = e; } - void setPassword(QString& p) { m_Password = p; } - + bool getEdition (int& edition, QString& errorOut); + bool setEmail (QString email, QString& errorOut); + bool setPassword (QString password, QString& errorOut); signals: void error(QString e); private: - QString request(const QString& email, - const QString& password); - -private: + QString request(); + QString m_Email; QString m_Password; CoreInterface m_CoreInterface;