Add named referencies implementation
[accounts-sso:vitalyrepins-signon.git] / src / signond / credentialsdb.h
1 /* -*- Mode: C++; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of signon
4  *
5  * Copyright (C) 2009-2010 Nokia Corporation.
6  *
7  * Contact: Aurel Popirtac <ext-aurel.popirtac@nokia.com>
8  * Contact: Alberto Mardegan <alberto.mardegan@nokia.com>
9  *
10  * This library is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU Lesser General Public License
12  * version 2.1 as published by the Free Software Foundation.
13  *
14  * This library is distributed in the hope that it will be useful, but
15  * WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with this library; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
22  * 02110-1301 USA
23  */
24
25 /*!
26   @file credentialsdb.h
27   Definition of the CredentialsDB object.
28   @ingroup Accounts_and_SSO_Framework
29  */
30
31 #ifndef CREDENTIALS_DB_H
32 #define CREDENTIALS_DB_H
33
34 #include <QObject>
35 #include <QtSql>
36
37 #include "signonidentityinfo.h"
38
39 #define SSO_MAX_TOKEN_STORAGE (4*1024) // 4 kB for token store/identity/method
40
41 class TestDatabase;
42
43 namespace SignonDaemonNS {
44
45     /*!
46      * @enum IdentityFlags
47      * Flags to be stored into database
48      */
49     enum IdentityFlags {
50         Validated = 0x0001,
51         RememberPassword = 0x0002
52     };
53
54     /*!
55         @class SqlDatabase
56         Will be used manage the SQL database interaction.
57         @ingroup Accounts_and_SSO_Framework
58      */
59     class SqlDatabase
60     {
61     public:
62         /*!
63             Constructs a SqlDatabase object using the given hostname.
64             @param hostname
65         */
66         SqlDatabase(const QString &hostname);
67
68         /*!
69             Destroys the SqlDatabase object, closing the database connection.
70         */
71         ~SqlDatabase();
72
73         /*!
74             Creates the database connection.
75             @returns true if successful, false otherwise.
76         */
77         bool connect();
78         /*!
79             Destroys the database connection.
80         */
81         void disconnect();
82         /*!
83             @returns true if database connection is opened, false otherwise.
84         */
85         bool connected() { return m_database.isOpen(); }
86
87         /*!
88             Sets the database name.
89             @param databseName
90         */
91         void setDatabaseName(const QString &databaseName) { m_database.setDatabaseName(databaseName); }
92
93         /*!
94             Sets the username for the database connection.
95             @param username
96         */
97         void setUsername(const QString &username) { m_database.setUserName(username); }
98
99         /*!
100             Sets the password for the database connection.
101             @param password
102         */
103         void setPassword(const QString &password) { m_database.setPassword(password); }
104
105         /*!
106             @returns the database name.
107         */
108         QString databaseName() const { return m_database.databaseName(); }
109
110         /*!
111             @returns the username for the database connection.
112         */
113         QString username() const { return m_database.userName(); }
114
115         /*!
116             @returns the password for the database connection.
117         */
118         QString password() const { return m_database.password(); }
119
120         /*!
121             Executes a specific database query.
122             If an error occurres the lastError() method can be used for handling decissions.
123             @param query, the query string.
124             @returns the resulting sql query, which can be process in the case of a 'SELECT' statement.
125         */
126         QSqlQuery exec(const QString &query);
127
128         /*!
129             Executes a specific database query.
130             If an error occurres the lastError() method can be used for handling decissions.
131             @param query, the query.
132             @returns the resulting sql query, which can be process in the case of a 'SELECT' statement.
133         */
134         QSqlQuery exec(QSqlQuery &query);
135
136          /*!
137             Executes a specific database set of queryes (INSERTs, UPDATEs, DELETEs) in a transaction
138             context (No nested transactions supported - sqlite reasons).
139             If an error occurres the lastError() method can be used for handling decissions.
140             @param queryList, the query list to be executed.
141             @returns true if the transaction commits successfully, false otherwise.
142         */
143         bool transactionalExec(const QStringList &queryList);
144
145         /*!
146             @returns true, if the database has any tables created, false otherwise.
147         */
148         bool hasTables() const { return m_database.tables().count() > 0 ? true : false; }
149
150         /*!
151             @returns a list of the supported drivers on the specific OS.
152         */
153         static QStringList supportedDrivers() { return QSqlDatabase::drivers(); }
154
155         /*!
156             @returns the current object configuration as a property, value strings map.
157         */
158         QMap<QString, QString> configuration();
159
160         /*!
161             @param queryExecuted, by default true, if otherwise will return specific database errors - non-query, use to check connection errors.
162             @param clearError, clears the error cache, future calls of this methods without any addition querying will indicate no error occurred.
163             @returns the last occurred error if any. If not error occurred on the last performed operation the QSqlError object is invalid.
164         */
165         QSqlError lastError(bool queryExecuted = true, bool clearError = true);
166
167         /*!
168             Serializes a SQL error into a string.
169             @param error, method will fail if an error object is passed.
170             @returns the error information as string.
171         */
172         static QString errorInfo(const QSqlError &error);
173
174         static void removeDatabase();
175
176     private:
177         QSqlError m_lastError;
178         QSqlDatabase m_database;
179
180         friend class CredentialsDB;
181     };
182
183     /*!
184         @class CredentialsDB
185         Manages the credentials I/O.
186         @ingroup Accounts_and_SSO_Framework
187      */
188
189     typedef QSqlError CredentialsDBError;
190
191     class CredentialsDB : public QObject
192     {
193         Q_OBJECT
194         Q_DISABLE_COPY(CredentialsDB)
195
196         friend class CredentialsAccessManager;
197         friend class ::TestDatabase;
198
199         CredentialsDB(const QString &dbName);
200         ~CredentialsDB();
201
202     private:
203         QSqlQuery exec(const QString &query);
204         QSqlQuery exec(QSqlQuery &query);
205         bool transactionalExec(const QStringList &queryList);
206         bool startTransaction();
207         bool commit();
208         void rollback();
209         bool connect();
210         void disconnect();
211         QMap<QString, QString> sqlDBConfiguration() const;
212         bool hasTableStructure() const;
213         bool createTableStructure();
214 //helpers
215         QStringList queryList(const QString &query_str);
216         bool insertMethods(QMap<QString, QStringList> methods);
217
218     public:
219         CredentialsDBError error(bool queryError = true, bool clearError = true) const;
220         bool errorOccurred(bool queryError = true) { return error(queryError, false).type() != QSqlError::NoError; }
221
222         QStringList methods(const quint32 id, const QString &securityToken = QString());
223         bool checkPassword(const quint32 id, const QString &username, const QString &password);
224         SignonIdentityInfo credentials(const quint32 id, bool queryPassword = true);
225         QList<SignonIdentityInfo> credentials(const QMap<QString, QString> &filter);
226
227         quint32 insertCredentials(const SignonIdentityInfo &info, bool storeSecret = true);
228         quint32 updateCredentials(const SignonIdentityInfo &info, bool storeSecret = true);
229         bool removeCredentials(const quint32 id);
230
231         bool clear();
232
233         QStringList accessControlList(const quint32 identityId);
234         QString credentialsOwnerSecurityToken(const quint32 identityId);
235
236         QVariantMap loadData(const quint32 id, const QString &method);
237         bool storeData(const quint32 id, const QString &method, const QVariantMap &data);
238         bool removeData(const quint32 id, const QString &method = QString());
239
240         bool addReference(const quint32 id, const QString &token, const QString &reference);
241         bool removeReference(const quint32 id, const QString &token, const QString &reference = QString());
242         QStringList references(const quint32 id, const QString &token = QString());
243
244     private:
245         SqlDatabase *m_pSqlDatabase;
246     };
247
248 } // namespace SignonDaemonNS
249
250 #endif // CREDENTIALSDB_H