X-Git-Url: https://git.quassel-irc.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fcore%2Fcore.h;h=91aafd2779d0cbe12dc6f1001656d04cb0f68127;hb=8697a21faab21ae23646f559cba9a85bd95b2ad7;hp=88b398a2452a37be971ca3670ec2fc2116058675;hpb=3867471c05de4c463373c6c4d1c414871c14cdc8;p=quassel.git diff --git a/src/core/core.h b/src/core/core.h index 88b398a2..91aafd27 100644 --- a/src/core/core.h +++ b/src/core/core.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2016 by the Quassel Project * + * Copyright (C) 2005-2018 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -18,8 +18,10 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ -#ifndef CORE_H -#define CORE_H +#pragma once + +#include +#include #include #include @@ -34,7 +36,9 @@ # include #endif +#include "authenticator.h" #include "bufferinfo.h" +#include "deferredptr.h" #include "message.h" #include "oidentdconfiggenerator.h" #include "sessionthread.h" @@ -74,6 +78,36 @@ public: return instance()->_storage->validateUser(userName, password); } + //! Authenticate user against auth backend + /** + * \param userName The user's login name + * \param password The user's uncrypted password + * \return The user's ID if valid; 0 otherwise + */ + static inline UserId authenticateUser(const QString &userName, const QString &password) { + return instance()->_authenticator->validateUser(userName, password); + } + + //! Add a new user, exposed so auth providers can call this without being the storage. + /** + * \param userName The user's login name + * \param password The user's uncrypted password + * \param authenticator The name of the auth provider service used to log the user in, defaults to "Database". + * \return The user's ID if valid; 0 otherwise + */ + static inline UserId addUser(const QString &userName, const QString &password, const QString &authenticator = "Database") { + return instance()->_storage->addUser(userName, password, authenticator); + } + + //! Does a comparison test against the authenticator in the database and the authenticator currently in use for a UserID. + /** + * \param userid The user's ID (note: not login name). + * \param authenticator The name of the auth provider service used to log the user in, defaults to "Database". + * \return True if the userid was configured with the passed authenticator, false otherwise. + */ + static inline bool checkAuthProvider(const UserId userid, const QString &authenticator) { + return instance()->_storage->getUserAuthenticator(userid) == authenticator; + } //! Change a user's password /** @@ -83,6 +117,13 @@ public: */ static bool changeUserPassword(UserId userId, const QString &password); + //! Check if we can change a user password. + /** + * \param userID The user's ID + * \return true, if we can change their password, false otherwise + */ + static bool canChangeUserPassword(UserId userId); + //! Store a user setting persistently /** * \param userId The users Id @@ -452,6 +493,20 @@ public: return instance()->_storage->setBufferLastSeenMsg(user, bufferId, msgId); } + //! Get the auth username associated with a userId + /** \param user The user to retrieve the username for + * \return The username for the user + */ + static inline const QString getAuthusername(UserId user) { + return instance()->_storage->getAuthusername(user); + } + + //! Get a usable sysident for the given user in oidentd-strict mode + /** \param user The user to retrieve the sysident for + * \return The authusername + */ + QString strictSysident(UserId user); + //! Get a Hash of all last seen message ids /** This Method is called when the Quassel Core is started to restore the lastSeenMsgIds @@ -490,6 +545,39 @@ public: return instance()->_storage->bufferMarkerLineMsgIds(user); } + //! Update the BufferActivity for a Buffer + /** This Method is used to make the activity state of a Buffer persistent + * \note This method is threadsafe. + * + * \param user The Owner of that Buffer + * \param bufferId The buffer id + * \param MsgId The Message id where the marker line should be placed + */ + static inline void setBufferActivity(UserId user, BufferId bufferId, Message::Types activity) { + return instance()->_storage->setBufferActivity(user, bufferId, activity); + } + + + //! Get a Hash of all buffer activity states + /** This Method is called when the Quassel Core is started to restore the BufferActivity + * \note This method is threadsafe. + * + * \param user The Owner of the buffers + */ + static inline QHash bufferActivities(UserId user) { + return instance()->_storage->bufferActivities(user); + } + + //! Get the bitset of buffer activity states for a buffer + /** This method is used to load the activity state of a buffer when its last seen message changes. + * \note This method is threadsafe. + * + * \param bufferId The buffer + * \param lastSeenMsgId The last seen message + */ + static inline Message::Types bufferActivity(BufferId bufferId, MsgId lastSeenMsgId) { + return instance()->_storage->bufferActivity(bufferId, lastSeenMsgId); + } static inline QDateTime startTime() { return instance()->_startTime; } static inline bool isConfigured() { return instance()->_configured; } @@ -502,22 +590,12 @@ public: */ static bool reloadCerts(); - static QVariantList backendInfo(); + static void cacheSysident(); - /** - * Checks if a storage backend is the default storage backend. This - * hardcodes this information into the core (not the client). - * - * \param backend The backend to check. - * - * @return True if storage backend is default, false otherwise. - */ - static inline bool isStorageBackendDefault(const Storage *backend) - { - return (backend->displayName() == "SQLite") ? true : false; - } + static QVariantList backendInfo(); + static QVariantList authenticatorInfo(); - static QString setup(const QString &adminUser, const QString &adminPassword, const QString &backend, const QVariantMap &setupData); + static QString setup(const QString &adminUser, const QString &adminPassword, const QString &backend, const QVariantMap &setupData, const QString &authenticator, const QVariantMap &authSetupMap); static inline QTimer &syncTimer() { return instance()->_storageSyncTimer; } @@ -531,7 +609,7 @@ public slots: */ void syncStorage(); void setupInternalClientSession(InternalPeer *clientConnection); - QString setupCore(const QString &adminUser, const QString &adminPassword, const QString &backend, const QVariantMap &setupData); + QString setupCore(const QString &adminUser, const QString &adminPassword, const QString &backend, const QVariantMap &setupData, const QString &authenticator, const QVariantMap &authSetupMap); signals: //! Sent when a BufferInfo is updated in storage. @@ -550,6 +628,7 @@ private slots: void clientDisconnected(); bool initStorage(const QString &backend, const QVariantMap &settings, bool setup = false); + bool initAuthenticator(const QString &backend, const QVariantMap &settings, bool setup = false); void socketError(QAbstractSocket::SocketError err, const QString &errorString); void setupClientSession(RemotePeer *, UserId); @@ -567,20 +646,36 @@ private: //void processCoreSetup(QTcpSocket *socket, QVariantMap &msg); QString setupCoreForInternalUsage(); + bool createUser(); + + template + void registerStorageBackend(); + + template + void registerAuthenticator(); + void registerStorageBackends(); - bool registerStorageBackend(Storage *); - void unregisterStorageBackends(); - void unregisterStorageBackend(Storage *); + void registerAuthenticators(); + + DeferredSharedPtr storageBackend(const QString& backendId) const; + DeferredSharedPtr authenticator(const QString& authenticatorId) const; + bool selectBackend(const QString &backend); - bool createUser(); - void saveBackendSettings(const QString &backend, const QVariantMap &settings); - QVariantMap promptForSettings(const Storage *storage); + bool selectAuthenticator(const QString &backend); + + bool saveBackendSettings(const QString &backend, const QVariantMap &settings); + void saveAuthenticatorSettings(const QString &backend, const QVariantMap &settings); + + template + QVariantMap promptForSettings(const Backend *backend); private: QSet _connectingClients; QHash _sessions; - Storage *_storage; + DeferredSharedPtr _storage; ///< Active storage backend + DeferredSharedPtr _authenticator; ///< Active authenticator QTimer _storageSyncTimer; + QMap _authusernames; #ifdef HAVE_SSL SslServer _server, _v6server; @@ -588,20 +683,18 @@ private: QTcpServer _server, _v6server; #endif - OidentdConfigGenerator *_oidentdConfigGenerator; + OidentdConfigGenerator *_oidentdConfigGenerator {nullptr}; - QHash _storageBackends; + std::vector> _registeredStorageBackends; + std::vector> _registeredAuthenticators; QDateTime _startTime; bool _configured; - static AbstractSqlMigrationReader *getMigrationReader(Storage *storage); - static AbstractSqlMigrationWriter *getMigrationWriter(Storage *storage); + static std::unique_ptr getMigrationReader(Storage *storage); + static std::unique_ptr getMigrationWriter(Storage *storage); static void stdInEcho(bool on); static inline void enableStdInEcho() { stdInEcho(true); } static inline void disableStdInEcho() { stdInEcho(false); } }; - - -#endif