X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fcoreconfigwizard.cpp;h=a4cfe166a28e31445940e6f0da1b1bb546964b0d;hp=9fbc0741b57621cae8e8de150fb6fbd0f00b535c;hb=f77a0b720ed58a2b68876b9320742b81b6df871f;hpb=4a5065255e652dd0c301bac0db41b7afb777ef49 diff --git a/src/qtui/coreconfigwizard.cpp b/src/qtui/coreconfigwizard.cpp index 9fbc0741..a4cfe166 100644 --- a/src/qtui/coreconfigwizard.cpp +++ b/src/qtui/coreconfigwizard.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2013 by the Quassel Project * + * Copyright (C) 2005-2016 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -21,13 +21,15 @@ #include #include #include +#include #include #include "coreconfigwizard.h" #include "coreconnection.h" -#include "iconloader.h" -CoreConfigWizard::CoreConfigWizard(CoreConnection *connection, const QList &backends, QWidget *parent) +#include "client.h" + +CoreConfigWizard::CoreConfigWizard(CoreConnection *connection, const QList &backends, const QList &authenticators, QWidget *parent) : QWizard(parent), _connection(connection) { @@ -35,13 +37,18 @@ CoreConfigWizard::CoreConfigWizard(CoreConnection *connection, const QList CoreConfigWizard::backends() const } -void CoreConfigWizard::prepareCoreSetup(const QString &backend, const QVariantMap &properties) +QHash CoreConfigWizard::authenticators() const +{ + return _authenticators; +} + + +void CoreConfigWizard::prepareCoreSetup(const QString &backend, const QVariantMap &properties, const QString &authenticator, const QVariantMap &authProperties) { // Prevent the user from changing any settings he already specified... foreach(int idx, visitedPages()) page(idx)->setEnabled(false); - QVariantMap foo; - foo["AdminUser"] = field("adminUser.user").toString(); - foo["AdminPasswd"] = field("adminUser.password").toString(); - foo["Backend"] = backend; - foo["ConnectionProperties"] = properties; - coreConnection()->doCoreSetup(foo); + // FIXME? We need to be able to set up older cores that don't have auth backend support. + // So if the core doesn't support that feature, don't pass those parameters. + if (!(Client::coreFeatures() & Quassel::Authenticators)) { + coreConnection()->setupCore(Protocol::SetupData(field("adminUser.user").toString(), field("adminUser.password").toString(), backend, properties)); + } + else { + coreConnection()->setupCore(Protocol::SetupData(field("adminUser.user").toString(), field("adminUser.password").toString(), backend, properties, authenticator, authProperties)); + } } @@ -180,7 +195,13 @@ AdminUserPage::AdminUserPage(QWidget *parent) : QWizardPage(parent) int AdminUserPage::nextId() const { - return CoreConfigWizard::StorageSelectionPage; + // If the core doesn't support auth backends, skip that page! + if (!(Client::coreFeatures() & Quassel::Authenticators)) { + return CoreConfigWizard::StorageSelectionPage; + } + else { + return CoreConfigWizard::AuthenticationSelectionPage; + } } @@ -190,6 +211,127 @@ bool AdminUserPage::isComplete() const return ok; } +/*** Authentication Selection Page ***/ + +AuthenticationSelectionPage::AuthenticationSelectionPage(const QHash &backends, QWidget *parent) + : QWizardPage(parent), + _connectionBox(0), + _backends(backends) +{ + ui.setupUi(this); + + setTitle(tr("Select Authentication Backend")); + setSubTitle(tr("Please select a backend for Quassel Core to use for authenticating users.")); + setCommitPage(true); + + registerField("authentication.backend", ui.backendList); + + foreach(QString key, _backends.keys()) { + ui.backendList->addItem(_backends[key].toMap()["DisplayName"].toString(), key); + } + + on_backendList_currentIndexChanged(); +} + + +int AuthenticationSelectionPage::nextId() const +{ + return CoreConfigWizard::StorageSelectionPage; +} + + +QString AuthenticationSelectionPage::selectedBackend() const +{ + return ui.backendList->currentText(); +} + + +QVariantMap AuthenticationSelectionPage::connectionProperties() const +{ + QString backend = ui.backendList->itemData(ui.backendList->currentIndex()).toString(); + + QVariantMap properties; + QStringList setupKeys = _backends[backend].toMap()["SetupKeys"].toStringList(); + if (!setupKeys.isEmpty()) { + QVariantMap defaults = _backends[backend].toMap()["SetupDefaults"].toMap(); + foreach(QString key, setupKeys) { + QWidget *widget = _connectionBox->findChild(key); + QVariant def; + if (defaults.contains(key)) { + def = defaults[key]; + } + switch (def.type()) { + case QVariant::Int: + { + QSpinBox *spinbox = qobject_cast(widget); + Q_ASSERT(spinbox); + def = QVariant(spinbox->value()); + } + break; + default: + { + QLineEdit *lineEdit = qobject_cast(widget); + Q_ASSERT(lineEdit); + def = QVariant(lineEdit->text()); + } + } + properties[key] = def; + } + } + return properties; +} + + +void AuthenticationSelectionPage::on_backendList_currentIndexChanged() +{ + QString backend = ui.backendList->itemData(ui.backendList->currentIndex()).toString(); + ui.description->setText(_backends[backend].toMap()["Description"].toString()); + + if (_connectionBox) { + layout()->removeWidget(_connectionBox); + _connectionBox->deleteLater(); + _connectionBox = 0; + } + + QStringList setupKeys = _backends[backend].toMap()["SetupKeys"].toStringList(); + if (!setupKeys.isEmpty()) { + QVariantMap defaults = _backends[backend].toMap()["SetupDefaults"].toMap(); + QGroupBox *propertyBox = new QGroupBox(this); + propertyBox->setTitle(tr("Connection Properties")); + QFormLayout *formlayout = new QFormLayout; + + foreach(QString key, setupKeys) { + QWidget *widget = 0; + QVariant def; + if (defaults.contains(key)) { + def = defaults[key]; + } + switch (def.type()) { + case QVariant::Int: + { + QSpinBox *spinbox = new QSpinBox(propertyBox); + spinbox->setMaximum(64000); + spinbox->setValue(def.toInt()); + widget = spinbox; + } + break; + default: + { + QLineEdit *lineEdit = new QLineEdit(def.toString(), propertyBox); + if (key.toLower().contains("password")) { + lineEdit->setEchoMode(QLineEdit::Password); + } + widget = lineEdit; + } + } + widget->setObjectName(key); + formlayout->addRow(key + ":", widget); + } + propertyBox->setLayout(formlayout); + static_cast(layout())->insertWidget(layout()->indexOf(ui.descriptionBox) + 1, propertyBox); + _connectionBox = propertyBox; + } +} /*** Storage Selection Page ***/ @@ -206,10 +348,16 @@ StorageSelectionPage::StorageSelectionPage(const QHash &backe registerField("storage.backend", ui.backendList); + int defaultIndex = 0; foreach(QString key, _backends.keys()) { ui.backendList->addItem(_backends[key].toMap()["DisplayName"].toString(), key); + if (_backends[key].toMap()["IsDefault"].toBool()) { + defaultIndex = ui.backendList->count() - 1; + } } + ui.backendList->setCurrentIndex(defaultIndex); + on_backendList_currentIndexChanged(); } @@ -354,13 +502,23 @@ void SyncPage::initializePage() complete = false; hasError = false; + // Fill in sync info about the storage layer. StorageSelectionPage *storagePage = qobject_cast(wizard()->page(CoreConfigWizard::StorageSelectionPage)); QString backend = storagePage->selectedBackend(); QVariantMap properties = storagePage->connectionProperties(); Q_ASSERT(!backend.isEmpty()); - ui.user->setText(wizard()->field("adminUser.user").toString()); ui.backend->setText(backend); - emit setupCore(backend, properties); + + // Fill in sync info about the authentication layer. + AuthenticationSelectionPage *authPage = qobject_cast(wizard()->page(CoreConfigWizard::AuthenticationSelectionPage)); + QString authenticator = authPage->selectedBackend(); + QVariantMap authProperties = authPage->connectionProperties(); + Q_ASSERT(!authenticator.isEmpty()); + ui.authenticator->setText(authenticator); + + ui.user->setText(wizard()->field("adminUser.user").toString()); + + emit setupCore(backend, properties, authenticator, authProperties); }