#endif
cliParser->addOption("logfile", 'l', "Log to a file", "path");
cliParser->addOption("select-backend", 0, "Switch storage backend (migrating data if possible)", "backendidentifier");
+ cliParser->addOption("select-authenticator", 0, "Switch auth backend", "authidentifier");
cliParser->addSwitch("add-user", 0, "Starts an interactive session to add a new core user");
cliParser->addOption("change-userpass", 0, "Starts an interactive session to change the password of the user identified by <username>", "username");
cliParser->addSwitch("oidentd", 0, "Enable oidentd integration");
QVariantMap authSettings = cs.authSettings().toMap();
initAuthenticator(authSettings.value("AuthBackend").toString(), authSettings.value("ConnectionProperties").toMap());
- if (Quassel::isOptionSet("select-backend")) {
- selectBackend(Quassel::optionValue("select-backend"));
+ if (Quassel::isOptionSet("select-backend") || Quassel::isOptionSet("select-authenticator")) {
+ if (Quassel::isOptionSet("select-backend")) {
+ selectBackend(Quassel::optionValue("select-backend"));
+ }
+ if (Quassel::isOptionSet("select-authenticator")) {
+ selectAuthenticator(Quassel::optionValue("select-authenticator"));
+ }
exit(0);
}
- // TODO: add --select-authenticator command line option and code.
-
if (!_configured) {
if (!_storageBackends.count()) {
qWarning() << qPrintable(tr("Could not initialize any storage backend! Exiting..."));
return true;
}
+// XXX: I am not sure if this function is implemented correctly.
+// There is currently no concept of migraiton between auth backends.
+bool Core::selectAuthenticator(const QString &backend)
+{
+ // Register all authentication backends.
+ registerAuthenticatorBackends();
+ if (!_authenticatorBackends.contains(backend)) {
+ qWarning() << qPrintable(QString("Core::selectAuthenticator(): unsupported backend: %1").arg(backend));
+ qWarning() << " supported backends are:" << qPrintable(QStringList(_authenticatorBackends.keys()).join(", "));
+ return false;
+ }
+
+ Authenticator *authenticator = _authenticatorBackends[backend];
+ QVariantMap settings = promptForSettings(authenticator);
+
+ Authenticator::State state = authenticator->init(settings);
+ switch (state) {
+ case Authenticator::IsReady:
+ saveAuthBackendSettings(backend, settings);
+ qWarning() << "Switched auth backend to:" << qPrintable(backend);
+// qWarning() << "Auth backend already initialized. Skipping Migration";
+ return true;
+ case Authenticator::NotAvailable:
+ qCritical() << "Auth backend is not available:" << qPrintable(backend);
+ return false;
+ case Authenticator::NeedsSetup:
+ if (!authenticator->setup(settings)) {
+ qWarning() << qPrintable(QString("Core::selectAuthenticator(): unable to setup authenticator: %1").arg(backend));
+ return false;
+ }
+
+ if (authenticator->init(settings) != Authenticator::IsReady) {
+ qWarning() << qPrintable(QString("Core::migrateBackend(): unable to initialize authenticator: %1").arg(backend));
+ return false;
+ }
+
+ saveAuthBackendSettings(backend, settings);
+ qWarning() << "Switched auth backend to:" << qPrintable(backend);
+ }
+
+ _authenticator = authenticator;
+ return true;
+}
+
bool Core::createUser()
{
CoreSettings().setAuthSettings(dbsettings);
}
-
-QVariantMap Core::promptForSettings(const Storage *storage)
+// Generic version of promptForSettings that doesn't care what *type* of
+// backend it runs over.
+QVariantMap Core::promptForSettings(QStringList keys, QVariantMap defaults)
{
QVariantMap settings;
- QStringList keys = storage->setupKeys();
if (keys.isEmpty())
return settings;
QTextStream in(stdin);
out << "Default values are in brackets" << endl;
- QVariantMap defaults = storage->setupDefaults();
QString value;
foreach(QString key, keys) {
QVariant val;
return settings;
}
+// Since an auth and storage backend work basically the same way,
+// use polymorphism here on this routine.
+QVariantMap Core::promptForSettings(const Storage *storage)
+{
+ QStringList keys = storage->setupKeys();
+ QVariantMap defaults = storage->setupDefaults();
+ return Core::promptForSettings(keys, defaults);
+
+}
+
+QVariantMap Core::promptForSettings(const Authenticator *authenticator)
+{
+ QStringList keys = authenticator->setupKeys();
+ QVariantMap defaults = authenticator->setupDefaults();
+ return Core::promptForSettings(keys, defaults);
+}
+
#ifdef Q_OS_WIN
void Core::stdInEcho(bool on)