/***************************************************************************
- * Copyright (C) 2005-2014 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 *
NotAvailable // remove the storage backend from the list of avaliable backends
};
+ enum HashVersion {
+ Sha1,
+ Sha2_512,
+ Latest=Sha2_512
+
+ };
+
public slots:
/* General */
*/
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;
/** \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.
* \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
*/
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
*/
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);
};