28 #define INIT_ERROR() ErrorMonitor errorMonitor(this)
29 #define RETURN_IF_NO_SECRETS_DB(retval) \
30 if (!isSecretsDBOpen()) { \
31 TRACE() << "Secrets DB is not available"; \
32 _lastError = noSecretsDB; return retval; \
35 #define S(s) QLatin1String(s)
37 namespace SignonDaemonNS {
39 static const QString driver = QLatin1String(
"QSQLITE");
42 const QString &connectionName,
44 m_lastError(SignOn::CredentialsDBError()),
46 m_database(QSqlDatabase::addDatabase(driver, connectionName))
50 TRACE() <<
"DATABASE NAME [" << databaseName <<
"]";
66 TRACE() <<
"Database connection succeeded.";
69 TRACE() <<
"Creating SQL table structure...";
75 <<
".This could lead to data loss.";
77 TRACE() <<
"SQL table structure already created...";
79 QSqlQuery q =
exec(
S(
"PRAGMA user_version"));
80 int oldVersion = q.first() ? q.value(0).toInt() : 0;
90 TRACE() <<
"Update DB from version " << version <<
" to " <<
m_version;
91 exec(QString::fromLatin1(
"PRAGMA user_version = %1").arg(m_version));
98 TRACE() <<
"Could not open database connection.\n";
123 TRACE() <<
"Rollback failed, db data integrity could be compromised.";
130 if (!query.prepare(queryStr))
131 TRACE() <<
"Query prepare warning: " << query.lastQuery();
134 TRACE() <<
"Query exec error: " << query.lastQuery();
147 TRACE() <<
"Query exec error: " << query.lastQuery();
161 TRACE() <<
"Could not start transaction";
166 foreach (QString queryStr, queryList) {
167 TRACE() << QString::fromLatin1(
"TRANSACT Query [%1]").arg(queryStr);
168 QSqlQuery query =
exec(queryStr);
177 TRACE() <<
"Commit SUCCEEDED.";
183 TRACE() <<
"Transactional exec FAILED!";
194 if (sqlError.isValid()) {
195 if (sqlError.type() == QSqlError::ConnectionError) {
196 m_lastError.setType(SignOn::CredentialsDBError::ConnectionError);
198 m_lastError.setType(SignOn::CredentialsDBError::StatementError);
200 m_lastError.setText(sqlError.text());
208 if (!error.isValid())
209 return QLatin1String(
"SQL Error invalid.");
212 QTextStream stream(&text);
213 stream <<
"SQL error description:";
214 stream <<
"\n\tType: ";
217 switch (error.type()) {
219 case QSqlError::ConnectionError: errType =
"ConnectionError";
break;
220 case QSqlError::StatementError: errType =
"StatementError";
break;
221 case QSqlError::TransactionError: errType =
"TransactionError";
break;
224 default: errType =
"UnknownError";
227 stream <<
"\n\tDatabase text: " << error.databaseText();
228 stream <<
"\n\tDriver text: " << error.driverText();
229 stream <<
"\n\tNumber: " << error.number();
237 if (!query.prepare(query_str))
238 TRACE() <<
"Query prepare warning: " << query.lastQuery();
245 QSqlQuery query =
exec(q);
247 while (query.next()) {
248 list.append(query.value(0).toString());
254 QStringList MetaDataDB::tableUpdates2()
256 QStringList tableUpdates = QStringList()
257 << QString::fromLatin1(
259 "(rowid INTEGER PRIMARY KEY AUTOINCREMENT,"
260 "identity_id INTEGER CONSTRAINT fk_identity_id REFERENCES CREDENTIALS(id) ON DELETE CASCADE,"
261 "token_id INTEGER CONSTRAINT fk_token_id REFERENCES TOKENS(id) ON DELETE CASCADE)")
263 << QString::fromLatin1(
265 "CREATE TRIGGER fki_OWNER_token_id_TOKENS_id "
266 "BEFORE INSERT ON [OWNER] "
267 "FOR EACH ROW BEGIN "
268 " SELECT RAISE(ROLLBACK, 'insert on table OWNER violates foreign key constraint fki_OWNER_token_id_TOKENS_id') "
269 " WHERE NEW.token_id IS NOT NULL AND (SELECT id FROM TOKENS WHERE id = NEW.token_id) IS NULL; "
272 << QString::fromLatin1(
274 "CREATE TRIGGER fku_OWNER_token_id_TOKENS_id "
275 "BEFORE UPDATE ON [OWNER] "
276 "FOR EACH ROW BEGIN "
277 " SELECT RAISE(ROLLBACK, 'update on table OWNER violates foreign key constraint fku_OWNER_token_id_TOKENS_id') "
278 " WHERE NEW.token_id IS NOT NULL AND (SELECT id FROM TOKENS WHERE id = NEW.token_id) IS NULL; "
281 << QString::fromLatin1(
283 "CREATE TRIGGER fkdc_OWNER_token_id_TOKENS_id "
284 "BEFORE DELETE ON TOKENS "
285 "FOR EACH ROW BEGIN "
286 " DELETE FROM OWNER WHERE OWNER.token_id = OLD.id; "
296 QStringList createTableQuery = QStringList()
297 << QString::fromLatin1(
298 "CREATE TABLE CREDENTIALS"
299 "(id INTEGER PRIMARY KEY AUTOINCREMENT,"
304 << QString::fromLatin1(
305 "CREATE TABLE METHODS"
306 "(id INTEGER PRIMARY KEY AUTOINCREMENT,"
307 "method TEXT UNIQUE)")
308 << QString::fromLatin1(
309 "CREATE TABLE MECHANISMS"
310 "(id INTEGER PRIMARY KEY AUTOINCREMENT,"
311 "mechanism TEXT UNIQUE)")
312 << QString::fromLatin1(
313 "CREATE TABLE TOKENS"
314 "(id INTEGER PRIMARY KEY AUTOINCREMENT,"
315 "token TEXT UNIQUE)")
316 << QString::fromLatin1(
317 "CREATE TABLE REALMS"
318 "(identity_id INTEGER CONSTRAINT fk_identity_id REFERENCES CREDENTIALS(id) ON DELETE CASCADE,"
321 "PRIMARY KEY (identity_id, realm, hostname))")
322 << QString::fromLatin1(
324 "(rowid INTEGER PRIMARY KEY AUTOINCREMENT,"
325 "identity_id INTEGER CONSTRAINT fk_identity_id REFERENCES CREDENTIALS(id) ON DELETE CASCADE,"
326 "method_id INTEGER CONSTRAINT fk_method_id REFERENCES METHODS(id) ON DELETE CASCADE,"
327 "mechanism_id INTEGER CONSTRAINT fk_mechanism_id REFERENCES MECHANISMS(id) ON DELETE CASCADE,"
328 "token_id INTEGER CONSTRAINT fk_token_id REFERENCES TOKENS(id) ON DELETE CASCADE)")
329 << QString::fromLatin1(
331 "(identity_id INTEGER CONSTRAINT fk_identity_id REFERENCES CREDENTIALS(id) ON DELETE CASCADE,"
332 "token_id INTEGER CONSTRAINT fk_token_id REFERENCES TOKENS(id) ON DELETE CASCADE,"
334 "PRIMARY KEY (identity_id, token_id, ref))")
341 << QString::fromLatin1(
343 "CREATE TRIGGER fki_REALMS_identity_id_CREDENTIALS_id "
344 "BEFORE INSERT ON [REALMS] "
345 "FOR EACH ROW BEGIN "
346 " SELECT RAISE(ROLLBACK, 'insert on table REALMS violates foreign key constraint fki_REALMS_identity_id_CREDENTIALS_id') "
347 " WHERE NEW.identity_id IS NOT NULL AND (SELECT id FROM CREDENTIALS WHERE id = NEW.identity_id) IS NULL; "
350 << QString::fromLatin1(
352 "CREATE TRIGGER fku_REALMS_identity_id_CREDENTIALS_id "
353 "BEFORE UPDATE ON [REALMS] "
354 "FOR EACH ROW BEGIN "
355 " SELECT RAISE(ROLLBACK, 'update on table REALMS violates foreign key constraint fku_REALMS_identity_id_CREDENTIALS_id') "
356 " WHERE NEW.identity_id IS NOT NULL AND (SELECT id FROM CREDENTIALS WHERE id = NEW.identity_id) IS NULL; "
359 << QString::fromLatin1(
361 "CREATE TRIGGER fkdc_REALMS_identity_id_CREDENTIALS_id "
362 "BEFORE DELETE ON CREDENTIALS "
363 "FOR EACH ROW BEGIN "
364 " DELETE FROM REALMS WHERE REALMS.identity_id = OLD.id; "
367 << QString::fromLatin1(
369 "CREATE TRIGGER fki_ACL_identity_id_CREDENTIALS_id "
370 "BEFORE INSERT ON [ACL] "
371 "FOR EACH ROW BEGIN "
372 " SELECT RAISE(ROLLBACK, 'insert on table ACL violates foreign key constraint fki_ACL_identity_id_CREDENTIALS_id') "
373 " WHERE NEW.identity_id IS NOT NULL AND (SELECT id FROM CREDENTIALS WHERE id = NEW.identity_id) IS NULL; "
376 << QString::fromLatin1(
378 "CREATE TRIGGER fku_ACL_identity_id_CREDENTIALS_id "
379 "BEFORE UPDATE ON [ACL] "
380 "FOR EACH ROW BEGIN "
381 " SELECT RAISE(ROLLBACK, 'update on table ACL violates foreign key constraint fku_ACL_identity_id_CREDENTIALS_id') "
382 " WHERE NEW.identity_id IS NOT NULL AND (SELECT id FROM CREDENTIALS WHERE id = NEW.identity_id) IS NULL; "
385 << QString::fromLatin1(
387 "CREATE TRIGGER fkdc_ACL_identity_id_CREDENTIALS_id "
388 "BEFORE DELETE ON CREDENTIALS "
389 "FOR EACH ROW BEGIN "
390 " DELETE FROM ACL WHERE ACL.identity_id = OLD.id; "
393 << QString::fromLatin1(
395 "CREATE TRIGGER fki_ACL_method_id_METHODS_id "
396 "BEFORE INSERT ON [ACL] "
397 "FOR EACH ROW BEGIN "
398 " SELECT RAISE(ROLLBACK, 'insert on table ACL violates foreign key constraint fki_ACL_method_id_METHODS_id') "
399 " WHERE NEW.method_id IS NOT NULL AND (SELECT id FROM METHODS WHERE id = NEW.method_id) IS NULL; "
402 << QString::fromLatin1(
404 "CREATE TRIGGER fku_ACL_method_id_METHODS_id "
405 "BEFORE UPDATE ON [ACL] "
406 "FOR EACH ROW BEGIN "
407 " SELECT RAISE(ROLLBACK, 'update on table ACL violates foreign key constraint fku_ACL_method_id_METHODS_id') "
408 " WHERE NEW.method_id IS NOT NULL AND (SELECT id FROM METHODS WHERE id = NEW.method_id) IS NULL; "
411 << QString::fromLatin1(
413 "CREATE TRIGGER fkdc_ACL_method_id_METHODS_id "
414 "BEFORE DELETE ON METHODS "
415 "FOR EACH ROW BEGIN "
416 " DELETE FROM ACL WHERE ACL.method_id = OLD.id; "
419 << QString::fromLatin1(
421 "CREATE TRIGGER fki_ACL_mechanism_id_MECHANISMS_id "
422 "BEFORE INSERT ON [ACL] "
423 "FOR EACH ROW BEGIN "
424 " SELECT RAISE(ROLLBACK, 'insert on table ACL violates foreign key constraint fki_ACL_mechanism_id_MECHANISMS_id') "
425 " WHERE NEW.mechanism_id IS NOT NULL AND (SELECT id FROM MECHANISMS WHERE id = NEW.mechanism_id) IS NULL; "
428 << QString::fromLatin1(
430 "CREATE TRIGGER fku_ACL_mechanism_id_MECHANISMS_id "
431 "BEFORE UPDATE ON [ACL] "
432 "FOR EACH ROW BEGIN "
433 " SELECT RAISE(ROLLBACK, 'update on table ACL violates foreign key constraint fku_ACL_mechanism_id_MECHANISMS_id') "
434 " WHERE NEW.mechanism_id IS NOT NULL AND (SELECT id FROM MECHANISMS WHERE id = NEW.mechanism_id) IS NULL; "
437 << QString::fromLatin1(
439 "CREATE TRIGGER fkdc_ACL_mechanism_id_MECHANISMS_id "
440 "BEFORE DELETE ON MECHANISMS "
441 "FOR EACH ROW BEGIN "
442 " DELETE FROM ACL WHERE ACL.mechanism_id = OLD.id; "
445 << QString::fromLatin1(
447 "CREATE TRIGGER fki_ACL_token_id_TOKENS_id "
448 "BEFORE INSERT ON [ACL] "
449 "FOR EACH ROW BEGIN "
450 " SELECT RAISE(ROLLBACK, 'insert on table ACL violates foreign key constraint fki_ACL_token_id_TOKENS_id') "
451 " WHERE NEW.token_id IS NOT NULL AND (SELECT id FROM TOKENS WHERE id = NEW.token_id) IS NULL; "
454 << QString::fromLatin1(
456 "CREATE TRIGGER fku_ACL_token_id_TOKENS_id "
457 "BEFORE UPDATE ON [ACL] "
458 "FOR EACH ROW BEGIN "
459 " SELECT RAISE(ROLLBACK, 'update on table ACL violates foreign key constraint fku_ACL_token_id_TOKENS_id') "
460 " WHERE NEW.token_id IS NOT NULL AND (SELECT id FROM TOKENS WHERE id = NEW.token_id) IS NULL; "
463 << QString::fromLatin1(
465 "CREATE TRIGGER fkdc_ACL_token_id_TOKENS_id "
466 "BEFORE DELETE ON TOKENS "
467 "FOR EACH ROW BEGIN "
468 " DELETE FROM ACL WHERE ACL.token_id = OLD.id; "
471 << QString::fromLatin1(
473 "CREATE TRIGGER fki_REFS_identity_id_CREDENTIALS_id "
474 "BEFORE INSERT ON [REFS] "
475 "FOR EACH ROW BEGIN "
476 " SELECT RAISE(ROLLBACK, 'insert on table REFS violates foreign key constraint fki_REFS_identity_id_CREDENTIALS_id') "
477 " WHERE NEW.identity_id IS NOT NULL AND (SELECT id FROM CREDENTIALS WHERE id = NEW.identity_id) IS NULL; "
480 << QString::fromLatin1(
482 "CREATE TRIGGER fku_REFS_identity_id_CREDENTIALS_id "
483 "BEFORE UPDATE ON [REFS] "
484 "FOR EACH ROW BEGIN "
485 " SELECT RAISE(ROLLBACK, 'update on table REFS violates foreign key constraint fku_REFS_identity_id_CREDENTIALS_id') "
486 " WHERE NEW.identity_id IS NOT NULL AND (SELECT id FROM CREDENTIALS WHERE id = NEW.identity_id) IS NULL; "
489 << QString::fromLatin1(
491 "CREATE TRIGGER fkdc_REFS_identity_id_CREDENTIALS_id "
492 "BEFORE DELETE ON CREDENTIALS "
493 "FOR EACH ROW BEGIN "
494 " DELETE FROM REFS WHERE REFS.identity_id = OLD.id; "
497 << QString::fromLatin1(
499 "CREATE TRIGGER fki_REFS_token_id_TOKENS_id "
500 "BEFORE INSERT ON [REFS] "
501 "FOR EACH ROW BEGIN "
502 " SELECT RAISE(ROLLBACK, 'insert on table REFS violates foreign key constraint fki_REFS_token_id_TOKENS_id') "
503 " WHERE NEW.token_id IS NOT NULL AND (SELECT id FROM TOKENS WHERE id = NEW.token_id) IS NULL; "
506 << QString::fromLatin1(
508 "CREATE TRIGGER fku_REFS_token_id_TOKENS_id "
509 "BEFORE UPDATE ON [REFS] "
510 "FOR EACH ROW BEGIN "
511 " SELECT RAISE(ROLLBACK, 'update on table REFS violates foreign key constraint fku_REFS_token_id_TOKENS_id') "
512 " WHERE NEW.token_id IS NOT NULL AND (SELECT id FROM TOKENS WHERE id = NEW.token_id) IS NULL; "
515 << QString::fromLatin1(
517 "CREATE TRIGGER fkdc_REFS_token_id_TOKENS_id "
518 "BEFORE DELETE ON TOKENS "
519 "FOR EACH ROW BEGIN "
520 " DELETE FROM REFS WHERE REFS.token_id = OLD.id; "
527 createTableQuery << tableUpdates2();
529 foreach (QString createTable, createTableQuery) {
530 QSqlQuery query =
exec(createTable);
532 TRACE() <<
"Error occurred while creating the database.";
538 TRACE() <<
"Creation successful";
549 TRACE() <<
"Upgrading from version < 1 not supported. Clearing DB";
553 QFile::remove(fileName);
554 m_database = QSqlDatabase(QSqlDatabase::addDatabase(driver,
566 QStringList createTableQuery = tableUpdates2();
567 foreach (QString createTable, createTableQuery) {
568 QSqlQuery query =
exec(createTable);
570 TRACE() <<
"Error occurred while inseting new tables.";
576 TRACE() <<
"Table insert successful";
579 QSqlQuery ownerInsert =
exec(
S(
"INSERT OR IGNORE INTO OWNER "
580 "(identity_id, token_id) "
581 " SELECT identity_id, token_id FROM ACL"));
583 BLAME() <<
"Table copy failed.";
597 if (securityToken.isEmpty()) {
599 QString::fromLatin1(
"SELECT DISTINCT METHODS.method FROM "
600 "( ACL JOIN METHODS ON ACL.method_id = METHODS.id ) "
601 "WHERE ACL.identity_id = '%1'").arg(
id)
606 q.prepare(
S(
"SELECT DISTINCT METHODS.method FROM "
607 "( ACL JOIN METHODS ON ACL.method_id = METHODS.id) "
608 "WHERE ACL.identity_id = :id AND ACL.token_id = "
609 "(SELECT id FROM TOKENS where token = :token)"));
610 q.bindValue(
S(
":id"),
id);
611 q.bindValue(
S(
":token"), securityToken);
619 TRACE() <<
"method:" << method;
622 q.prepare(
S(
"SELECT id FROM METHODS WHERE method = :method"));
623 q.bindValue(
S(
":method"), method);
626 TRACE() <<
"No result or invalid method query.";
630 return q.value(0).toUInt();
637 query_str = QString::fromLatin1(
638 "SELECT caption, username, flags, type "
639 "FROM credentials WHERE id = %1").arg(
id);
640 QSqlQuery query =
exec(query_str);
642 if (!query.first()) {
643 TRACE() <<
"No result or invalid credentials query.";
647 QString caption = query.value(0).toString();
648 QString
username = query.value(1).toString();
649 int flags = query.value(2).toInt();
653 if (isUserNameSecret) username = QString();
654 int type = query.value(3).toInt();
658 QString::fromLatin1(
"SELECT realm FROM REALMS "
659 "WHERE identity_id = %1").arg(
id));
662 QString::fromLatin1(
"SELECT token FROM TOKENS "
664 "(SELECT token_id FROM OWNER WHERE identity_id = '%1' )")
667 query_str = QString::fromLatin1(
"SELECT token FROM TOKENS "
669 "(SELECT token_id FROM ACL WHERE identity_id = '%1' )")
671 query =
exec(query_str);
672 QStringList securityTokens;
673 while (query.next()) {
674 securityTokens.append(query.value(0).toString());
678 query_str = QString::fromLatin1(
679 "SELECT DISTINCT ACL.method_id, METHODS.method FROM "
680 "( ACL JOIN METHODS ON ACL.method_id = METHODS.id ) "
681 "WHERE ACL.identity_id = '%1'").arg(
id);
682 query =
exec(query_str);
683 while (query.next()) {
685 QString::fromLatin1(
"SELECT DISTINCT MECHANISMS.mechanism FROM "
686 "( MECHANISMS JOIN ACL "
687 "ON ACL.mechanism_id = MECHANISMS.id ) "
688 "WHERE ACL.method_id = '%1' AND ACL.identity_id = '%2' ")
689 .arg(query.value(0).toInt()).arg(
id));
690 methods.insert(query.value(1).toString(), mechanisms);
699 caption, methods, realms, securityTokens,
701 type, refCount, validated);
711 QList<SignonIdentityInfo> result;
713 QString queryStr(QString::fromLatin1(
"SELECT id FROM credentials"));
717 queryStr += QString::fromLatin1(
" ORDER BY id");
719 QSqlQuery query =
exec(queryStr);
721 TRACE() <<
"Error occurred while fetching credentials from database.";
725 while (query.next()) {
739 TRACE() <<
"Could not start transaction. Error inserting credentials.";
743 quint32
id = updateCredentials(info);
752 if (!updateRealms(
id, info.
realms(), info.
isNew())) {
753 TRACE() <<
"Error in updating realms";
761 tokenInsert.prepare(
S(
"INSERT OR IGNORE INTO TOKENS (token) "
762 "VALUES ( :token )"));
763 tokenInsert.bindValue(
S(
":token"), token);
767 foreach (QString token, info.
ownerList()) {
768 if (!token.isEmpty()) {
770 tokenInsert.prepare(
S(
"INSERT OR IGNORE INTO TOKENS (token) "
771 "VALUES ( :token )"));
772 tokenInsert.bindValue(
S(
":token"), token);
779 QString queryStr = QString::fromLatin1(
780 "DELETE FROM ACL WHERE "
781 "identity_id = '%1'")
783 QSqlQuery insertQuery =
exec(queryStr);
786 queryStr = QString::fromLatin1(
787 "DELETE FROM OWNER WHERE "
788 "identity_id = '%1'")
790 insertQuery =
exec(queryStr);
795 QMapIterator<QString, QStringList> it(info.
methods());
796 while (it.hasNext()) {
800 foreach (QString mech, it.value()) {
802 aclInsert.prepare(
S(
"INSERT OR REPLACE INTO ACL "
803 "(identity_id, method_id, mechanism_id, token_id) "
805 "( SELECT id FROM METHODS WHERE method = :method ),"
806 "( SELECT id FROM MECHANISMS WHERE mechanism= :mech ), "
807 "( SELECT id FROM TOKENS WHERE token = :token ))"));
808 aclInsert.bindValue(
S(
":id"),
id);
809 aclInsert.bindValue(
S(
":method"), it.key());
810 aclInsert.bindValue(
S(
":mech"), mech);
811 aclInsert.bindValue(
S(
":token"), token);
815 if (it.value().isEmpty()) {
817 aclInsert.prepare(
S(
"INSERT OR REPLACE INTO ACL (identity_id, method_id, token_id) "
819 "( SELECT id FROM METHODS WHERE method = :method ),"
820 "( SELECT id FROM TOKENS WHERE token = :token ))"));
821 aclInsert.bindValue(
S(
":id"),
id);
822 aclInsert.bindValue(
S(
":method"), it.key());
823 aclInsert.bindValue(
S(
":token"), token);
828 foreach (QString mech, it.value()) {
830 aclInsert.prepare(
S(
"INSERT OR REPLACE INTO ACL "
831 "(identity_id, method_id, mechanism_id) "
833 "( SELECT id FROM METHODS WHERE method = :method ),"
834 "( SELECT id FROM MECHANISMS WHERE mechanism= :mech )"
836 aclInsert.bindValue(
S(
":id"),
id);
837 aclInsert.bindValue(
S(
":method"), it.key());
838 aclInsert.bindValue(
S(
":mech"), mech);
842 if (it.value().isEmpty()) {
844 aclInsert.prepare(
S(
"INSERT OR REPLACE INTO ACL (identity_id, method_id) "
846 "( SELECT id FROM METHODS WHERE method = :method )"
848 aclInsert.bindValue(
S(
":id"),
id);
849 aclInsert.bindValue(
S(
":method"), it.key());
855 if (info.
methods().isEmpty()) {
858 aclInsert.prepare(
S(
"INSERT OR REPLACE INTO ACL "
859 "(identity_id, token_id) "
861 "( SELECT id FROM TOKENS WHERE token = :token ))"));
862 aclInsert.bindValue(
S(
":id"),
id);
863 aclInsert.bindValue(
S(
":token"), token);
869 foreach (QString token, info.
ownerList()) {
870 if (!token.isEmpty()) {
872 ownerInsert.prepare(
S(
"INSERT OR REPLACE INTO OWNER "
873 "(identity_id, token_id) "
875 "( SELECT id FROM TOKENS WHERE token = :token ))"));
876 ownerInsert.bindValue(
S(
":id"),
id);
877 ownerInsert.bindValue(
S(
":token"), token);
886 TRACE() <<
"Credentials insertion failed.";
895 QStringList queries = QStringList()
896 << QString::fromLatin1(
897 "DELETE FROM CREDENTIALS WHERE id = %1").arg(
id)
898 << QString::fromLatin1(
899 "DELETE FROM ACL WHERE identity_id = %1").arg(
id)
900 << QString::fromLatin1(
901 "DELETE FROM REALMS WHERE identity_id = %1").arg(
id)
902 << QString::fromLatin1(
903 "DELETE FROM owner WHERE identity_id = %1").arg(
id);
912 QStringList clearCommands = QStringList()
913 << QLatin1String(
"DELETE FROM CREDENTIALS")
914 << QLatin1String(
"DELETE FROM METHODS")
915 << QLatin1String(
"DELETE FROM MECHANISMS")
916 << QLatin1String(
"DELETE FROM ACL")
917 << QLatin1String(
"DELETE FROM REALMS")
918 << QLatin1String(
"DELETE FROM TOKENS")
919 << QLatin1String(
"DELETE FROM OWNER");
926 return queryList(QString::fromLatin1(
"SELECT token FROM TOKENS "
928 "(SELECT token_id FROM ACL WHERE identity_id = '%1' )")
934 return queryList(QString::fromLatin1(
"SELECT token FROM TOKENS "
936 "(SELECT token_id FROM OWNER WHERE identity_id = '%1' )")
941 const QString &token,
942 const QString &reference)
945 TRACE() <<
"Could not start transaction. Error inserting data.";
949 TRACE() <<
"Storing:" <<
id <<
", " << token <<
", " << reference;
955 tokenInsert.prepare(
S(
"INSERT OR IGNORE INTO TOKENS (token) "
956 "VALUES ( :token )"));
957 tokenInsert.bindValue(
S(
":token"), token);
964 refsInsert.prepare(
S(
"INSERT OR REPLACE INTO REFS "
965 "(identity_id, token_id, ref) "
967 "( SELECT id FROM TOKENS WHERE token = :token ),"
970 refsInsert.bindValue(
S(
":id"),
id);
971 refsInsert.bindValue(
S(
":token"), token);
972 refsInsert.bindValue(
S(
":reference"), reference);
979 TRACE() <<
"Data insertion ok.";
983 TRACE() <<
"Data insertion failed.";
988 const QString &token,
989 const QString &reference)
991 TRACE() <<
"Removing:" <<
id <<
", " << token <<
", " << reference;
996 if (!reference.isNull() && !refs.contains(reference))
1000 TRACE() <<
"Could not start transaction. Error removing data.";
1007 if (reference.isEmpty()) {
1008 refsDelete.prepare(
S(
"DELETE FROM REFS "
1009 "WHERE identity_id = :id AND "
1010 "token_id = ( SELECT id FROM TOKENS WHERE token = :token )"));
1011 refsDelete.bindValue(
S(
":id"),
id);
1012 refsDelete.bindValue(
S(
":token"), token);
1014 refsDelete.prepare(
S(
"DELETE FROM REFS "
1015 "WHERE identity_id = :id AND "
1016 "token_id = ( SELECT id FROM TOKENS WHERE token = :token ) "
1018 refsDelete.bindValue(
S(
":id"),
id);
1019 refsDelete.bindValue(
S(
":token"), token);
1020 refsDelete.bindValue(
S(
":ref"), reference);
1029 TRACE() <<
"Data delete ok.";
1033 TRACE() <<
"Data delete failed.";
1039 if (token.isEmpty())
1040 return queryList(QString::fromLatin1(
"SELECT ref FROM REFS "
1041 "WHERE identity_id = '%1'")
1044 q.prepare(
S(
"SELECT ref FROM REFS "
1045 "WHERE identity_id = :id AND "
1046 "token_id = (SELECT id FROM TOKENS WHERE token = :token )"));
1047 q.bindValue(
S(
":id"),
id);
1048 q.bindValue(
S(
":token"), token);
1052 bool MetaDataDB::insertMethods(QMap<QString, QStringList> methods)
1056 if (methods.isEmpty())
return false;
1058 QMapIterator<QString, QStringList> it(methods);
1059 while (it.hasNext()) {
1061 QSqlQuery methodInsert =
newQuery();
1062 methodInsert.prepare(
S(
"INSERT OR IGNORE INTO METHODS (method) "
1063 "VALUES( :method )"));
1064 methodInsert.bindValue(
S(
":method"), it.key());
1068 foreach (QString mech, it.value()) {
1070 mechInsert.prepare(
S(
"INSERT OR IGNORE INTO MECHANISMS (mechanism) "
1071 "VALUES( :mech )"));
1072 mechInsert.bindValue(
S(
":mech"), mech);
1083 q.prepare(
S(
"INSERT INTO METHODS (method) VALUES(:method)"));
1084 q.bindValue(
S(
":method"), method);
1088 if (ok != 0) *ok =
false;
1091 return q.lastInsertId().toUInt(ok);
1104 if (!info.
isNew()) {
1105 TRACE() <<
"UPDATE:" << info.
id() ;
1106 q.prepare(
S(
"UPDATE CREDENTIALS SET caption = :caption, "
1107 "username = :username, "
1109 "type = :type WHERE id = :id"));
1110 q.bindValue(
S(
":id"), info.
id());
1112 TRACE() <<
"INSERT:" << info.
id();
1113 q.prepare(
S(
"INSERT INTO CREDENTIALS "
1114 "(caption, username, flags, type) "
1115 "VALUES(:caption, :username, :flags, :type)"));
1117 q.bindValue(
S(
":username"),
1119 q.bindValue(
S(
":caption"), info.
caption());
1120 q.bindValue(
S(
":flags"), flags);
1121 q.bindValue(
S(
":type"), info.
type());
1124 TRACE() <<
"Error occurred while updating crendentials";
1130 QVariant idVariant = q.lastInsertId();
1131 if (!idVariant.isValid()) {
1132 TRACE() <<
"Error occurred while inserting crendentials";
1135 id = idVariant.toUInt();
1143 bool MetaDataDB::updateRealms(quint32
id,
const QStringList &realms,
bool isNew)
1149 queryStr = QString::fromLatin1(
1150 "DELETE FROM REALMS WHERE identity_id = '%1'")
1157 q.prepare(
S(
"INSERT OR IGNORE INTO REALMS (identity_id, realm) "
1158 "VALUES (:id, :realm)"));
1159 foreach (QString realm, realms) {
1160 q.bindValue(
S(
":id"),
id);
1161 q.bindValue(
S(
":realm"), realm);
1173 db->metaDataDB->clearError();
1174 if (db->secretsStorage != 0)
1175 db->secretsStorage->clearError();
1179 CredentialsDB::ErrorMonitor::~ErrorMonitor()
1184 if (_db->_lastError.isValid())
1187 if (_db->secretsStorage != 0 &&
1188 _db->secretsStorage->lastError().isValid()) {
1189 _db->_lastError = _db->secretsStorage->lastError();
1193 _db->_lastError = _db->metaDataDB->lastError();
1199 SignOn::AbstractSecretsStorage *secretsStorage):
1200 secretsStorage(secretsStorage),
1203 noSecretsDB = SignOn::CredentialsDBError(
1204 QLatin1String(
"Secrets DB not opened"),
1205 SignOn::CredentialsDBError::ConnectionError);
1214 QSqlDatabase::removeDatabase(connectionName);
1220 return metaDataDB->
init();
1225 QVariantMap configuration;
1226 configuration.insert(QLatin1String(
"name"), secretsDbName);
1227 if (!secretsStorage->initialize(configuration)) {
1228 TRACE() <<
"SecretsStorage initialization failed: " <<
1229 secretsStorage->lastError().text();
1238 return secretsStorage != 0 && secretsStorage->isOpen();
1243 if (secretsStorage != 0) secretsStorage->close();
1252 const QString &securityToken)
1255 return metaDataDB->
methods(
id, securityToken);
1259 const QString &username,
1260 const QString &password)
1266 return secretsStorage->checkPassword(
id, username, password);
1268 return username == info.
userName() &&
1269 secretsStorage->checkPassword(
id, QString(), password);
1276 TRACE() <<
"id:" <<
id <<
"queryPassword:" << queryPassword;
1280 QString username, password;
1281 secretsStorage->loadCredentials(
id, username, password);
1289 QList<SignonIdentityInfo>
1310 if (
id == 0)
return id;
1321 secretsStorage->updateCredentials(
id, userName, password);
1335 return secretsStorage->removeCredentials(
id) &&
1348 return secretsStorage->clear() && metaDataDB->
clear();
1353 TRACE() <<
"Loading:" <<
id <<
"," << method;
1357 if (
id == 0)
return QVariantMap();
1359 quint32 methodId = metaDataDB->
methodId(method);
1360 if (methodId == 0)
return QVariantMap();
1362 return secretsStorage->loadData(
id, methodId);
1366 const QVariantMap &data)
1368 TRACE() <<
"Storing:" <<
id <<
"," << method;
1372 if (
id == 0)
return false;
1374 quint32 methodId = metaDataDB->
methodId(method);
1375 if (methodId == 0) {
1382 return secretsStorage->storeData(
id, methodId, data);
1387 TRACE() <<
"Removing:" <<
id <<
"," << method;
1391 if (
id == 0)
return false;
1394 if (!method.isEmpty()) {
1395 methodId = metaDataDB->
methodId(method);
1396 if (methodId == 0)
return false;
1401 return secretsStorage->removeData(
id, methodId);
1413 return metaDataDB->
ownerList(identityId);
1419 QStringList owners =
ownerList(identityId);
1420 return owners.count() ? owners.at(0) : QString();
1424 const QString &token,
1425 const QString &reference)
1432 const QString &token,
1433 const QString &reference)