X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fcore.h;h=835e7879c9bcd5e343d56fb8b1c503da1f6f9547;hp=ebe8061963adb2ab8964e1493a8035ab4bb3adf2;hb=7fb88a023ef8e4658b39d22c2d88c0d8bd6709f8;hpb=9fc57dc2c000e80fb8bd746a090e2e8210e1278e diff --git a/src/core/core.h b/src/core/core.h index ebe80619..835e7879 100644 --- a/src/core/core.h +++ b/src/core/core.h @@ -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 * @@ -34,6 +34,7 @@ # include #endif +#include "authenticator.h" #include "bufferinfo.h" #include "message.h" #include "oidentdconfiggenerator.h" @@ -41,8 +42,8 @@ #include "storage.h" #include "types.h" +class CoreAuthHandler; class CoreSession; -class RemotePeer; struct NetworkInfo; class SessionThread; class SignalProxy; @@ -64,6 +65,55 @@ public: /*** Storage access ***/ // These methods are threadsafe. + //! Validate user + /** + * \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 validateUser(const QString &userName, const QString &password) { + 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 + /** + * \param userId The user's ID + * \param password The user's unencrypted new password + * \return true, if the password change was successful + */ + static bool changeUserPassword(UserId userId, const QString &password); + //! Store a user setting persistently /** * \param userId The users Id @@ -472,7 +522,34 @@ public: } - const QDateTime &startTime() const { return _startTime; } + static inline QDateTime startTime() { return instance()->_startTime; } + static inline bool isConfigured() { return instance()->_configured; } + static bool sslSupported(); + + /** + * Reloads SSL certificates used for connection with clients + * + * @return True if certificates reloaded successfully, otherwise false. + */ + static bool reloadCerts(); + + static QVariantList backendInfo(); + static QVariantList authenticatorInfo(); + + /** + * 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 QString setup(const QString &adminUser, const QString &adminPassword, const QString &backend, const QVariantMap &setupData, const QString &authBackend, const QVariantMap &authSetupMap); static inline QTimer &syncTimer() { return instance()->_storageSyncTimer; } @@ -486,13 +563,14 @@ public slots: */ void syncStorage(); void setupInternalClientSession(InternalPeer *clientConnection); + QString setupCore(const QString &adminUser, const QString &adminPassword, const QString &backend, const QVariantMap &setupData, const QString &authBackend, const QVariantMap &authSetupMap); signals: //! Sent when a BufferInfo is updated in storage. void bufferInfoUpdated(UserId user, const BufferInfo &info); - //! Relay From CoreSession::sessionState(const QVariant &). Used for internal connection only - void sessionState(const QVariant &); + //! Relay from CoreSession::sessionState(). Used for internal connection only + void sessionState(const Protocol::SessionState &sessionState); protected: virtual void customEvent(QEvent *event); @@ -503,15 +581,13 @@ private slots: void incomingConnection(); void clientDisconnected(); - bool initStorage(const QString &backend, QVariantMap settings, bool setup = false); - bool initStorage(QVariantMap dbSettings, bool setup = false); + bool initStorage(const QString &backend, const QVariantMap &settings, bool setup = false); + bool initAuthenticator(const QString &backend, const QVariantMap &settings, bool setup = false); -#ifdef HAVE_SSL - void sslErrors(const QList &errors); -#endif - void socketError(QAbstractSocket::SocketError); + void socketError(QAbstractSocket::SocketError err, const QString &errorString); + void setupClientSession(RemotePeer *, UserId); - void processClientMessage(const QVariant &data); + bool changeUserPass(const QString &username); private: Core(); @@ -519,25 +595,34 @@ private: void init(); static Core *instanceptr; - SessionThread *createSession(UserId userId, bool restoreState = false); - void setupClientSession(RemotePeer *peer, UserId uid); + SessionThread *sessionForUser(UserId userId, bool restoreState = false); void addClientHelper(RemotePeer *peer, UserId uid); //void processCoreSetup(QTcpSocket *socket, QVariantMap &msg); QString setupCoreForInternalUsage(); - QString setupCore(QVariantMap setupData); void registerStorageBackends(); bool registerStorageBackend(Storage *); void unregisterStorageBackends(); void unregisterStorageBackend(Storage *); + + void registerAuthenticatorBackends(); + bool registerAuthenticatorBackend(Authenticator *); + void unregisterAuthenticatorBackends(); + void unregisterAuthenticatorBackend(Authenticator *); + bool selectBackend(const QString &backend); - void createUser(); - void changeUserPass(const QString &username); - void saveBackendSettings(const QString &backend, const QVariantMap &settings); + bool createUser(); + bool saveBackendSettings(const QString &backend, const QVariantMap &settings); + void saveAuthBackendSettings(const QString &backend, const QVariantMap &settings); QVariantMap promptForSettings(const Storage *storage); - QHash sessions; +private: + QSet _connectingClients; + QHash _sessions; + + // Have both a storage backend and an authenticator backend. Storage *_storage; + Authenticator *_authenticator; QTimer _storageSyncTimer; #ifdef HAVE_SSL @@ -548,9 +633,8 @@ private: OidentdConfigGenerator *_oidentdConfigGenerator; - QHash clientInfo; - QHash _storageBackends; + QHash _authenticatorBackends; QDateTime _startTime;