X-Git-Url: https://git.quassel-irc.org/?a=blobdiff_plain;f=src%2Fcore%2Fcore.cpp;h=80646c0335e52ee5261c3ce77e369203b5ebc5c9;hb=27df512ce272d88cf85b854f6bfb3f1c7ba4a65c;hp=7fbd4e71f300b2eb3b7291bada74ffda2f7d150f;hpb=436cb365db846985ef5ce508cb5bf925cd903480;p=quassel.git diff --git a/src/core/core.cpp b/src/core/core.cpp index 7fbd4e71..80646c03 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -49,11 +49,6 @@ # include #endif /* Q_OS_WIN */ -#ifdef HAVE_UMASK -# include -# include -#endif /* HAVE_UMASK */ - // ============================== // Custom Events // ============================== @@ -91,80 +86,10 @@ void Core::destroy() Core::Core() { -#ifdef HAVE_UMASK - umask(S_IRWXG | S_IRWXO); -#endif _startTime = QDateTime::currentDateTime().toUTC(); // for uptime :) Quassel::loadTranslation(QLocale::system()); - // FIXME: MIGRATION 0.3 -> 0.4: Move database and core config to new location - // Move settings, note this does not delete the old files -#ifdef Q_OS_MAC - QSettings newSettings("quassel-irc.org", "quasselcore"); -#else - -# ifdef Q_OS_WIN - QSettings::Format format = QSettings::IniFormat; -# else - QSettings::Format format = QSettings::NativeFormat; -# endif - QString newFilePath = Quassel::configDirPath() + "quasselcore" - + ((format == QSettings::NativeFormat) ? QLatin1String(".conf") : QLatin1String(".ini")); - QSettings newSettings(newFilePath, format); -#endif /* Q_OS_MAC */ - - if (newSettings.value("Config/Version").toUInt() == 0) { -# ifdef Q_OS_MAC - QString org = "quassel-irc.org"; -# else - QString org = "Quassel Project"; -# endif - QSettings oldSettings(org, "Quassel Core"); - if (oldSettings.allKeys().count()) { - quWarning() << "\n\n*** IMPORTANT: Config and data file locations have changed. Attempting to auto-migrate your core settings..."; - foreach(QString key, oldSettings.allKeys()) - newSettings.setValue(key, oldSettings.value(key)); - newSettings.setValue("Config/Version", 1); - quWarning() << "* Your core settings have been migrated to" << newSettings.fileName(); - -#ifndef Q_OS_MAC /* we don't need to move the db and cert for mac */ -#ifdef Q_OS_WIN - QString quasselDir = qgetenv("APPDATA") + "/quassel/"; -#elif defined Q_OS_MAC - QString quasselDir = QDir::homePath() + "/Library/Application Support/Quassel/"; -#else - QString quasselDir = QDir::homePath() + "/.quassel/"; -#endif - - QFileInfo info(Quassel::configDirPath() + "quassel-storage.sqlite"); - if (!info.exists()) { - // move database, if we found it - QFile oldDb(quasselDir + "quassel-storage.sqlite"); - if (oldDb.exists()) { - bool success = oldDb.rename(Quassel::configDirPath() + "quassel-storage.sqlite"); - if (success) - quWarning() << "* Your database has been moved to" << Quassel::configDirPath() + "quassel-storage.sqlite"; - else - quWarning() << "!!! Moving your database has failed. Please move it manually into" << Quassel::configDirPath(); - } - } - // move certificate - QFileInfo certInfo(quasselDir + "quasselCert.pem"); - if (certInfo.exists()) { - QFile cert(quasselDir + "quasselCert.pem"); - bool success = cert.rename(Quassel::configDirPath() + "quasselCert.pem"); - if (success) - quWarning() << "* Your certificate has been moved to" << Quassel::configDirPath() + "quasselCert.pem"; - else - quWarning() << "!!! Moving your certificate has failed. Please move it manually into" << Quassel::configDirPath(); - } -#endif /* !Q_OS_MAC */ - quWarning() << "*** Migration completed.\n\n"; - } - } - // MIGRATION end - // check settings version // so far, we only have 1 CoreSettings s; @@ -184,15 +109,40 @@ Core::Core() void Core::init() { - CoreSettings cs; + QProcessEnvironment environment = QProcessEnvironment::systemEnvironment(); + bool config_from_environment = Quassel::isOptionSet("config-from-environment"); + + QString db_backend; + QVariantMap db_connectionProperties; + + QString auth_authenticator; + QVariantMap auth_properties; + + bool writeError = false; + + if (config_from_environment) { + db_backend = environment.value("DB_BACKEND"); + auth_authenticator = environment.value("AUTH_AUTHENTICATOR"); + } else { + CoreSettings cs; + + QVariantMap dbsettings = cs.storageSettings().toMap(); + db_backend = dbsettings.value("Backend").toString(); + db_connectionProperties = dbsettings.value("ConnectionProperties").toMap(); + + QVariantMap authSettings = cs.authSettings().toMap(); + auth_authenticator = authSettings.value("Authenticator", "Database").toString(); + auth_properties = authSettings.value("AuthProperties").toMap(); + + writeError = !cs.isWritable(); + } + // legacy - QVariantMap dbsettings = cs.storageSettings().toMap(); - _configured = initStorage(dbsettings.value("Backend").toString(), dbsettings.value("ConnectionProperties").toMap()); + _configured = initStorage(db_backend, db_connectionProperties, environment, config_from_environment); // Not entirely sure what is 'legacy' about the above, but it seems to be the way things work! if (_configured) { - QVariantMap authSettings = cs.authSettings().toMap(); - initAuthenticator(authSettings.value("Authenticator", "Database").toString(), authSettings.value("AuthProperties").toMap()); + initAuthenticator(auth_authenticator, auth_properties, environment, config_from_environment); } if (Quassel::isOptionSet("select-backend") || Quassel::isOptionSet("select-authenticator")) { @@ -206,20 +156,30 @@ void Core::init() } if (!_configured) { - if (_registeredStorageBackends.size() == 0) { - quWarning() << qPrintable(tr("Could not initialize any storage backend! Exiting...")); - quWarning() << qPrintable(tr("Currently, Quassel supports SQLite3 and PostgreSQL. You need to build your\n" - "Qt library with the sqlite or postgres plugin enabled in order for quasselcore\n" - "to work.")); - exit(EXIT_FAILURE); // TODO make this less brutal (especially for mono client -> popup) - } - quWarning() << "Core is currently not configured! Please connect with a Quassel Client for basic setup."; + if (config_from_environment) { + _configured = initStorage(db_backend, db_connectionProperties, environment, config_from_environment, true); + initAuthenticator(auth_authenticator, auth_properties, environment, config_from_environment, true); - if (!cs.isWritable()) { - qWarning() << "Cannot write quasselcore configuration; probably a permission problem."; - exit(EXIT_FAILURE); - } + if (!_configured) { + qWarning() << "Cannot configure from environment"; + exit(EXIT_FAILURE); + } + } else { + if (_registeredStorageBackends.empty()) { + quWarning() << qPrintable(tr("Could not initialize any storage backend! Exiting...")); + quWarning() + << qPrintable(tr("Currently, Quassel supports SQLite3 and PostgreSQL. You need to build your\n" + "Qt library with the sqlite or postgres plugin enabled in order for quasselcore\n" + "to work.")); + exit(EXIT_FAILURE); // TODO make this less brutal (especially for mono client -> popup) + } + quWarning() << "Core is currently not configured! Please connect with a Quassel Client for basic setup."; + if (writeError) { + qWarning() << "Cannot write quasselcore configuration; probably a permission problem."; + exit(EXIT_FAILURE); + } + } } if (Quassel::isOptionSet("add-user")) { @@ -236,11 +196,13 @@ void Core::init() connect(&_v6server, SIGNAL(newConnection()), this, SLOT(incomingConnection())); if (!startListening()) exit(1); // TODO make this less brutal + _strictIdentEnabled = Quassel::isOptionSet("strict-ident"); + if (_strictIdentEnabled) { + cacheSysIdent(); + } + if (Quassel::isOptionSet("oidentd")) { - _oidentdConfigGenerator = new OidentdConfigGenerator(Quassel::isOptionSet("oidentd-strict"), this); - if (Quassel::isOptionSet("oidentd-strict")) { - cacheSysIdent(); - } + _oidentdConfigGenerator = new OidentdConfigGenerator(this); } } @@ -314,12 +276,12 @@ QString Core::setupCore(const QString &adminUser, const QString &adminPassword, if (adminUser.isEmpty() || adminPassword.isEmpty()) { return tr("Admin user or password not set."); } - if (!(_configured = initStorage(backend, setupData, true))) { + if (!(_configured = initStorage(backend, setupData, {}, false, true))) { return tr("Could not setup storage!"); } quInfo() << "Selected authenticator:" << authenticator; - if (!(_configured = initAuthenticator(authenticator, authSetupData, true))) + if (!(_configured = initAuthenticator(authenticator, authSetupData, {}, false, true))) { return tr("Could not setup authenticator!"); } @@ -341,7 +303,7 @@ QString Core::setupCoreForInternalUsage() { Q_ASSERT(!_registeredStorageBackends.empty()); - qsrand(QDateTime::currentDateTime().toTime_t()); + qsrand(QDateTime::currentDateTime().toMSecsSinceEpoch()); int pass = 0; for (int i = 0; i < 10; i++) { pass *= 10; @@ -386,7 +348,8 @@ DeferredSharedPtr Core::storageBackend(const QString &backendId) const // old db settings: // "Type" => "sqlite" -bool Core::initStorage(const QString &backend, const QVariantMap &settings, bool setup) +bool Core::initStorage(const QString &backend, const QVariantMap &settings, + const QProcessEnvironment &environment, bool loadFromEnvironment, bool setup) { if (backend.isEmpty()) { quWarning() << "No storage backend selected!"; @@ -399,13 +362,13 @@ bool Core::initStorage(const QString &backend, const QVariantMap &settings, bool return false; } - Storage::State storageState = storage->init(settings); + Storage::State storageState = storage->init(settings, environment, loadFromEnvironment); switch (storageState) { case Storage::NeedsSetup: if (!setup) return false; // trigger setup process - if (storage->setup(settings)) - return initStorage(backend, settings, false); + if (storage->setup(settings, environment, loadFromEnvironment)) + return initStorage(backend, settings, environment, loadFromEnvironment, false); return false; // if initialization wasn't successful, we quit to keep from coming up unconfigured @@ -483,7 +446,9 @@ DeferredSharedPtr Core::authenticator(const QString &backendId) c // FIXME: Apparently, this is the legacy way of initting storage backends? // If there's a not-legacy way, it should be used here -bool Core::initAuthenticator(const QString &backend, const QVariantMap &settings, bool setup) +bool Core::initAuthenticator(const QString &backend, const QVariantMap &settings, + const QProcessEnvironment &environment, bool loadFromEnvironment, + bool setup) { if (backend.isEmpty()) { quWarning() << "No authenticator selected!"; @@ -496,13 +461,13 @@ bool Core::initAuthenticator(const QString &backend, const QVariantMap &settings return false; } - Authenticator::State authState = auth->init(settings); + Authenticator::State authState = auth->init(settings, environment, loadFromEnvironment); switch (authState) { case Authenticator::NeedsSetup: if (!setup) return false; // trigger setup process - if (auth->setup(settings)) - return initAuthenticator(backend, settings, false); + if (auth->setup(settings, environment, loadFromEnvironment)) + return initAuthenticator(backend, settings, environment, loadFromEnvironment, false); return false; // if initialization wasn't successful, we quit to keep from coming up unconfigured @@ -787,7 +752,7 @@ SessionThread *Core::sessionForUser(UserId uid, bool restore) if (_sessions.contains(uid)) return _sessions[uid]; - SessionThread *session = new SessionThread(uid, restore, this); + SessionThread *session = new SessionThread(uid, restore, strictIdentEnabled(), this); _sessions[uid] = session; session->start(); return session;