summary refs log tree commit diff
path: root/src/RegisterPage.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/RegisterPage.cpp')
-rw-r--r--src/RegisterPage.cpp123
1 files changed, 10 insertions, 113 deletions
diff --git a/src/RegisterPage.cpp b/src/RegisterPage.cpp

index 0204a307..271a7fc2 100644 --- a/src/RegisterPage.cpp +++ b/src/RegisterPage.cpp
@@ -23,6 +23,7 @@ #include "ui/FlatButton.h" #include "ui/RaisedButton.h" #include "ui/TextField.h" +#include "ui/UIA.h" #include "dialogs/FallbackAuth.h" #include "dialogs/ReCaptcha.h" @@ -178,8 +179,6 @@ RegisterPage::RegisterPage(QWidget *parent) connect(this, &RegisterPage::wellKnownLookup, this, &RegisterPage::doWellKnownLookup); connect(this, &RegisterPage::versionsCheck, this, &RegisterPage::doVersionsCheck); connect(this, &RegisterPage::registration, this, &RegisterPage::doRegistration); - connect(this, &RegisterPage::UIA, this, &RegisterPage::doUIA); - connect(this, &RegisterPage::registrationWithAuth, this, &RegisterPage::doRegistrationWithAuth); } void @@ -277,18 +276,11 @@ RegisterPage::onRegisterButtonClicked() // // The sequence of events looks something like this: // - // dowellKnownLookup + // doKnownLookup // v // doVersionsCheck // v - // doRegistration - // v - // doUIA <-----------------+ - // v | More auth required - // doRegistrationWithAuth -+ - // | Success - // v - // registering + // doRegistration -> loops the UIAHandler until complete emit wellKnownLookup(); @@ -367,18 +359,12 @@ RegisterPage::doRegistration() if (checkUsername() && checkPassword() && checkPasswordConfirmation()) { auto username = username_input_->text().toStdString(); auto password = password_input_->text().toStdString(); - http::client()->registration(username, password, registrationCb()); - } -} - -void -RegisterPage::doRegistrationWithAuth(const mtx::user_interactive::Auth &auth) -{ - // These inputs should still be alright, but check just in case - if (checkUsername() && checkPassword() && checkPasswordConfirmation()) { - auto username = username_input_->text().toStdString(); - auto password = password_input_->text().toStdString(); - http::client()->registration(username, password, auth, registrationCb()); + connect(UIA::instance(), &UIA::error, this, [this](QString msg) { + showError(msg); + disconnect(UIA::instance(), &UIA::error, this, nullptr); + }); + http::client()->registration( + username, password, ::UIA::instance()->genericHandler("Registration"), registrationCb()); } } @@ -392,6 +378,7 @@ RegisterPage::registrationCb() http::client()->set_user(res.user_id); http::client()->set_access_token(res.access_token); emit registerOk(); + disconnect(UIA::instance(), &UIA::error, this, nullptr); return; } @@ -403,11 +390,7 @@ RegisterPage::registrationCb() static_cast<int>(err->status_code), err->matrix_error.error); showError(QString::fromStdString(err->matrix_error.error)); - return; } - - // Attempt to complete a UIA stage - emit UIA(err->matrix_error.unauthorized); return; } @@ -420,92 +403,6 @@ RegisterPage::registrationCb() } void -RegisterPage::doUIA(const mtx::user_interactive::Unauthorized &unauthorized) -{ - auto completed_stages = unauthorized.completed; - auto flows = unauthorized.flows; - auto session = - unauthorized.session.empty() ? http::client()->generate_txn_id() : unauthorized.session; - - nhlog::ui()->info("Completed stages: {}", completed_stages.size()); - - if (!completed_stages.empty()) { - // Get rid of all flows which don't start with the sequence of - // stages that have already been completed. - flows.erase(std::remove_if(flows.begin(), - flows.end(), - [completed_stages](auto flow) { - if (completed_stages.size() > flow.stages.size()) - return true; - for (size_t f = 0; f < completed_stages.size(); f++) - if (completed_stages[f] != flow.stages[f]) - return true; - return false; - }), - flows.end()); - } - - if (flows.empty()) { - nhlog::ui()->error("No available registration flows!"); - showError(tr("No supported registration flows!")); - return; - } - - auto current_stage = flows.front().stages.at(completed_stages.size()); - - if (current_stage == mtx::user_interactive::auth_types::recaptcha) { - auto captchaDialog = new dialogs::ReCaptcha(QString::fromStdString(session), this); - - connect( - captchaDialog, &dialogs::ReCaptcha::confirmation, this, [this, session, captchaDialog]() { - captchaDialog->close(); - captchaDialog->deleteLater(); - doRegistrationWithAuth( - mtx::user_interactive::Auth{session, mtx::user_interactive::auth::Fallback{}}); - }); - - connect(captchaDialog, &dialogs::ReCaptcha::cancel, this, &RegisterPage::errorOccurred); - - QTimer::singleShot(1000, this, [captchaDialog]() { captchaDialog->show(); }); - - } else if (current_stage == mtx::user_interactive::auth_types::dummy) { - doRegistrationWithAuth( - mtx::user_interactive::Auth{session, mtx::user_interactive::auth::Dummy{}}); - - } else if (current_stage == mtx::user_interactive::auth_types::registration_token) { - bool ok; - QString token = QInputDialog::getText(this, - tr("Registration token"), - tr("Please enter a valid registration token."), - QLineEdit::Normal, - QString(), - &ok); - - if (ok) { - emit registrationWithAuth(mtx::user_interactive::Auth{ - session, mtx::user_interactive::auth::RegistrationToken{token.toStdString()}}); - } else { - emit errorOccurred(); - } - } else { - // use fallback - auto dialog = new dialogs::FallbackAuth( - QString::fromStdString(current_stage), QString::fromStdString(session), this); - - connect(dialog, &dialogs::FallbackAuth::confirmation, this, [this, session, dialog]() { - dialog->close(); - dialog->deleteLater(); - emit registrationWithAuth( - mtx::user_interactive::Auth{session, mtx::user_interactive::auth::Fallback{}}); - }); - - connect(dialog, &dialogs::FallbackAuth::cancel, this, &RegisterPage::errorOccurred); - - dialog->show(); - } -} - -void RegisterPage::paintEvent(QPaintEvent *) { QStyleOption opt;