X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fsqlitestorage.cpp;h=3c61f985d4f134c79b5cd4d9ed90deaede96d945;hp=7ae4f0e8fc2a170741e532b78b775d6f37b3e901;hb=f6e0e4c958187792081b397795eb2ee7de294c23;hpb=70638bdb6a34f51409d4618128fbfd5b56af0e52 diff --git a/src/core/sqlitestorage.cpp b/src/core/sqlitestorage.cpp index 7ae4f0e8..3c61f985 100644 --- a/src/core/sqlitestorage.cpp +++ b/src/core/sqlitestorage.cpp @@ -20,7 +20,6 @@ #include "sqlitestorage.h" -#include #include #include "network.h" @@ -62,13 +61,10 @@ int SqliteStorage::installedSchemaVersion() { } UserId SqliteStorage::addUser(const QString &user, const QString &password) { - QByteArray cryptopass = QCryptographicHash::hash(password.toUtf8(), QCryptographicHash::Sha1); - cryptopass = cryptopass.toHex(); - QSqlQuery query(logDb()); query.prepare(queryString("insert_quasseluser")); query.bindValue(":username", user); - query.bindValue(":password", cryptopass); + query.bindValue(":password", cryptedPassword(password)); query.exec(); if(query.lastError().isValid() && query.lastError().number() == 19) { // user already exists - sadly 19 seems to be the general constraint violation error... return 0; @@ -84,13 +80,10 @@ UserId SqliteStorage::addUser(const QString &user, const QString &password) { } void SqliteStorage::updateUser(UserId user, const QString &password) { - QByteArray cryptopass = QCryptographicHash::hash(password.toUtf8(), QCryptographicHash::Sha1); - cryptopass = cryptopass.toHex(); - QSqlQuery query(logDb()); query.prepare(queryString("update_userpassword")); query.bindValue(":userid", user.toInt()); - query.bindValue(":password", cryptopass); + query.bindValue(":password", cryptedPassword(password)); query.exec(); } @@ -104,13 +97,10 @@ void SqliteStorage::renameUser(UserId user, const QString &newName) { } UserId SqliteStorage::validateUser(const QString &user, const QString &password) { - QByteArray cryptopass = QCryptographicHash::hash(password.toUtf8(), QCryptographicHash::Sha1); - cryptopass = cryptopass.toHex(); - QSqlQuery query(logDb()); query.prepare(queryString("select_authuser")); query.bindValue(":username", user); - query.bindValue(":password", cryptopass); + query.bindValue(":password", cryptedPassword(password)); query.exec(); if(query.first()) { @@ -365,6 +355,70 @@ NetworkId SqliteStorage::getNetworkId(UserId user, const QString &network) { return NetworkId(); } +QList SqliteStorage::connectedNetworks(UserId user) { + QList connectedNets; + QSqlQuery query(logDb()); + query.prepare(queryString("select_connected_networks")); + query.bindValue(":userid", user.toInt()); + query.exec(); + watchQuery(&query); + + while(query.next()) { + connectedNets << query.value(0).toInt(); + } + + return connectedNets; +} + +void SqliteStorage::setNetworkConnected(UserId user, const NetworkId &networkId, bool isConnected) { + QSqlQuery query(logDb()); + query.prepare(queryString("update_network_connected")); + query.bindValue(":userid", user.toInt()); + query.bindValue(":networkid", networkId.toInt()); + query.bindValue(":connected", isConnected ? 1 : 0); + query.exec(); + watchQuery(&query); +} + +QHash SqliteStorage::persistentChannels(UserId user, const NetworkId &networkId) { + QHash persistentChans; + QSqlQuery query(logDb()); + query.prepare(queryString("select_persistent_channels")); + query.bindValue(":userid", user.toInt()); + query.bindValue(":networkid", networkId.toInt()); + query.exec(); + watchQuery(&query); + + while(query.next()) { + persistentChans[query.value(0).toString()] = query.value(1).toString(); + } + + return persistentChans; +} + +void SqliteStorage::setChannelPersistent(UserId user, const NetworkId &networkId, const QString &channel, bool isJoined) { + QSqlQuery query(logDb()); + query.prepare(queryString("update_buffer_persistent_channel")); + query.bindValue(":userid", user.toInt()); + query.bindValue(":networkId", networkId.toInt()); + query.bindValue(":buffercname", channel.toLower()); + query.bindValue(":joined", isJoined ? 1 : 0); + query.exec(); + watchQuery(&query); +} + +void SqliteStorage::setPersistentChannelKey(UserId user, const NetworkId &networkId, const QString &channel, const QString &key) { + QSqlQuery query(logDb()); + query.prepare(queryString("update_buffer_set_channel_key")); + query.bindValue(":userid", user.toInt()); + query.bindValue(":networkId", networkId.toInt()); + query.bindValue(":buffercname", channel.toLower()); + query.bindValue(":key", key); + query.exec(); + watchQuery(&query); +} + + void SqliteStorage::createBuffer(UserId user, const NetworkId &networkId, BufferInfo::Type type, const QString &buffer) { QSqlQuery *query = cachedQuery("insert_buffer"); query->bindValue(":userid", user.toInt()); @@ -664,3 +718,50 @@ QString SqliteStorage::backlogFile() { return quasselDir + "quassel-storage.sqlite"; } + +// ONLY NEEDED FOR MIGRATION +bool SqliteStorage::init(const QVariantMap &settings) { + if(!AbstractSqlStorage::init(settings)) + return false; + + QSqlQuery checkMigratedQuery(logDb()); + checkMigratedQuery.prepare("SELECT DISTINCT typeOf(password) FROM quasseluser"); + checkMigratedQuery.exec(); + if(!watchQuery(&checkMigratedQuery)) + return false; + + if(!checkMigratedQuery.first()) + return true; // table is empty -> no work to be done + + QString passType = checkMigratedQuery.value(0).toString().toLower(); + if(passType == "text") + return true; // allready migrated + + Q_ASSERT(passType == "blob"); + + QSqlQuery getPasswordsQuery(logDb()); + getPasswordsQuery.prepare("SELECT userid, password FROM quasseluser"); + getPasswordsQuery.exec(); + + if(!watchQuery(&getPasswordsQuery)) { + qWarning() << "unable to migrate to new password format!"; + return false; + } + + QHash passHash; + while(getPasswordsQuery.next()) { + passHash[getPasswordsQuery.value(0).toInt()] = getPasswordsQuery.value(1).toByteArray(); + } + + QSqlQuery setPasswordsQuery(logDb()); + setPasswordsQuery.prepare("UPDATE quasseluser SET password = :password WHERE userid = :userid"); + foreach(int userId, passHash.keys()) { + setPasswordsQuery.bindValue(":password", QString(passHash[userId])); + setPasswordsQuery.bindValue(":userid", userId); + setPasswordsQuery.exec(); + watchQuery(&setPasswordsQuery); + } + + qDebug() << "successfully migrated passwords!"; + return true; +}