X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fstorage.h;h=7cbc3e3dff72c88c55c41899e28199a30a5262d9;hp=db863910fae84b8b98dd1a2868b268d92bd1a06d;hb=b9169a652a6854b3fa85aee8f833cb9e18a8d510;hpb=9d54503555534a2c554f09a33df6afa33d6308ec diff --git a/src/core/storage.h b/src/core/storage.h index db863910..7cbc3e3d 100644 --- a/src/core/storage.h +++ b/src/core/storage.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2014 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 * @@ -42,6 +42,13 @@ public: NotAvailable // remove the storage backend from the list of avaliable backends }; + enum HashVersion { + Sha1, + Sha2_512, + Latest=Sha2_512 + + }; + public slots: /* General */ @@ -52,6 +59,10 @@ public slots: */ virtual bool isAvailable() const = 0; + //! Returns the identifier of the authenticator backend + /** \return A string that can be used by the client to identify the authenticator backend */ + virtual QString backendId() const = 0; + //! Returns the display name of the storage backend /** \return A string that can be used by the client to name the storage backend */ virtual QString displayName() const = 0; @@ -60,12 +71,14 @@ public slots: /** \return A string that can be displayed by the client to describe the storage backend */ virtual QString description() const = 0; - //! Returns a list of properties required to use the storage backend - virtual QStringList setupKeys() const = 0; - - //! Returns a map where the keys are are properties to use the storage backend - /* the values are QVariants with default values */ - virtual QVariantMap setupDefaults() const = 0; + //! Returns data required to configure the authenticator backend + /** + * A list of flattened triples for each field: {key, translated field name, default value} + * The default value's type determines the kind of input widget to be shown + * (int -> QSpinBox; QString -> QLineEdit) + * \return A list of triples defining the data to be shown in the configuration dialog + */ + virtual QVariantList setupData() const = 0; //! Setup the storage provider. /** This prepares the storage provider (e.g. create tables, etc.) for use within Quassel. @@ -96,7 +109,7 @@ public slots: * \param password The cleartext password for the new user * \return The new user's UserId */ - virtual UserId addUser(const QString &user, const QString &password) = 0; + virtual UserId addUser(const QString &user, const QString &password, const QString &authenticator = "Database") = 0; //! Update a core user's password. /** \param user The user's id @@ -124,6 +137,13 @@ public slots: */ virtual UserId getUserId(const QString &username) = 0; + //! Get the authentication provider for a given user. + /** \param username The username to validate + * \return The name of the auth provider if the UserId exists, "" otherwise. + */ + virtual QString getUserAuthenticator(const UserId userid) = 0; + + //! Determine the UserId of the internal user /** \return A valid UserId if the password matches the username; 0 else */ @@ -364,6 +384,79 @@ public slots: */ virtual QHash bufferMarkerLineMsgIds(UserId user) = 0; + //! 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 + */ + virtual void setBufferActivity(UserId id, BufferId bufferId, Message::Types type) = 0; + + //! Get a Hash of all buffer activity states + /** This Method is called when the Quassel Core is started to restore the BufferActivities + * \note This method is threadsafe. + * + * \param user The Owner of the buffers + */ + virtual QHash bufferActivities(UserId id) = 0; + + //! 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 + */ + virtual Message::Types bufferActivity(BufferId bufferId, MsgId lastSeenMsgId) = 0; + + //! Get a hash of buffers with their ciphers for a given network + /** The keys are channel names and values are ciphers (possibly empty) + * \note This method is threadsafe + * + * \param user The id of the networks owner + * \param networkId The Id of the network + */ + virtual QHash bufferCiphers(UserId user, const NetworkId &networkId) = 0; + + //! Update the cipher of a buffer + /** \note This method is threadsafe + * + * \param user The Id of the networks owner + * \param networkId The Id of the network + * \param bufferName The Cname of the buffer + * \param cipher The cipher for the buffer + */ + virtual void setBufferCipher(UserId user, const NetworkId &networkId, const QString &bufferName, const QByteArray &cipher) = 0; + + //! Update the highlight count 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 + */ + virtual void setHighlightCount(UserId id, BufferId bufferId, int count) = 0; + + //! Get a Hash of all highlight count states + /** This Method is called when the Quassel Core is started to restore the HighlightCounts + * \note This method is threadsafe. + * + * \param user The Owner of the buffers + */ + virtual QHash highlightCounts(UserId id) = 0; + + //! Get the highlight count 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 + */ + virtual int highlightCount(BufferId bufferId, MsgId lastSeenMsgId) = 0; + /* Message handling */ //! Store a Message in the storage backend and set its unique Id. @@ -387,6 +480,18 @@ public slots: */ virtual QList requestMsgs(UserId user, BufferId bufferId, MsgId first = -1, MsgId last = -1, int limit = -1) = 0; + //! Request a certain number messages stored in a given buffer, matching certain filters + /** \param buffer The buffer we request messages from + * \param first if != -1 return only messages with a MsgId >= first + * \param last if != -1 return only messages with a MsgId < last + * \param limit if != -1 limit the returned list to a max of \limit entries + * \param type The Message::Types that should be returned + * \return The requested list of messages + */ + virtual QList requestMsgsFiltered(UserId user, BufferId bufferId, MsgId first = -1, MsgId last = -1, + int limit = -1, Message::Types type = Message::Types{-1}, + Message::Flags flags = Message::Flags{-1}) = 0; + //! Request a certain number of messages across all buffers /** \param first if != -1 return only messages with a MsgId >= first * \param last if != -1 return only messages with a MsgId < last @@ -395,6 +500,28 @@ public slots: */ virtual QList requestAllMsgs(UserId user, MsgId first = -1, MsgId last = -1, int limit = -1) = 0; + //! Request a certain number of messages across all buffers, matching certain filters + /** \param first if != -1 return only messages with a MsgId >= first + * \param last if != -1 return only messages with a MsgId < last + * \param limit Max amount of messages + * \param type The Message::Types that should be returned + * \return The requested list of messages + */ + virtual QList requestAllMsgsFiltered(UserId user, MsgId first = -1, MsgId last = -1, int limit = -1, + Message::Types type = Message::Types{-1}, + Message::Flags flags = Message::Flags{-1}) = 0; + + //! Fetch all authusernames + /** \return Map of all current UserIds to permitted idents + */ + virtual QMap getAllAuthUserNames() = 0; + + //! Get the auth username associated with a userId + /** \param user The user to retrieve the username for + * \return The username for the user + */ + virtual QString getAuthUserName(UserId user) = 0; + signals: //! Sent when a new BufferInfo is created, or an existing one changed somehow. void bufferInfoUpdated(UserId user, const BufferInfo &); @@ -408,10 +535,16 @@ signals: void userRemoved(UserId); protected: - //! when implementing a storage handler, use this method to crypt user passwords. - /** This guarantees compatibility with other storage handlers and allows easy migration - */ - QString cryptedPassword(const QString &password); + QString hashPassword(const QString &password); + bool checkHashedPassword(const UserId user, const QString &password, const QString &hashedPassword, const Storage::HashVersion version); + +private: + QString hashPasswordSha1(const QString &password); + bool checkHashedPasswordSha1(const QString &password, const QString &hashedPassword); + + QString hashPasswordSha2_512(const QString &password); + bool checkHashedPasswordSha2_512(const QString &password, const QString &hashedPassword); + QString sha2_512(const QString &input); };