X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fsqlitestorage.cpp;h=3c61f985d4f134c79b5cd4d9ed90deaede96d945;hp=ed705a84aa95b6c8ca4f04c613b2d0bf5ecdf7ad;hb=f6e0e4c958187792081b397795eb2ee7de294c23;hpb=04754cf669dd295205226b744bc769b94693866a diff --git a/src/core/sqlitestorage.cpp b/src/core/sqlitestorage.cpp index ed705a84..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()); @@ -463,6 +517,47 @@ bool SqliteStorage::removeBuffer(const UserId &user, const BufferId &bufferId) { return true; } +BufferId SqliteStorage::renameBuffer(const UserId &user, const NetworkId &networkId, const QString &newName, const QString &oldName) { + // check if such a buffer exists... + QSqlQuery existsQuery(logDb()); + existsQuery.prepare(queryString("select_bufferByName")); + existsQuery.bindValue(":networkid", networkId.toInt()); + existsQuery.bindValue(":userid", user.toInt()); + existsQuery.bindValue(":buffercname", oldName.toLower()); + existsQuery.exec(); + if(!watchQuery(&existsQuery)) + return false; + + if(!existsQuery.first()) + return false; + + const int bufferid = existsQuery.value(0).toInt(); + + Q_ASSERT(!existsQuery.next()); + + // ... and if the new name is still free. + existsQuery.bindValue(":networkid", networkId.toInt()); + existsQuery.bindValue(":userid", user.toInt()); + existsQuery.bindValue(":buffercname", newName.toLower()); + existsQuery.exec(); + if(!watchQuery(&existsQuery)) + return false; + + if(existsQuery.first()) + return false; + + QSqlQuery renameBufferQuery(logDb()); + renameBufferQuery.prepare(queryString("update_buffer_name")); + renameBufferQuery.bindValue(":buffername", newName); + renameBufferQuery.bindValue(":buffercname", newName.toLower()); + renameBufferQuery.bindValue(":bufferid", bufferid); + renameBufferQuery.exec(); + if(watchQuery(&existsQuery)) + return BufferId(bufferid); + else + return BufferId(); +} + void SqliteStorage::setBufferLastSeen(UserId user, const BufferId &bufferId, const QDateTime &seenDate) { QSqlQuery *query = cachedQuery("update_buffer_lastseen"); query->bindValue(":userid", user.toInt()); @@ -512,20 +607,9 @@ MsgId SqliteStorage::logMessage(Message msg) { } } - QSqlQuery *getLastMessageIdQuery = cachedQuery("select_lastMessage"); - getLastMessageIdQuery->bindValue(":time", msg.timestamp().toTime_t()); - getLastMessageIdQuery->bindValue(":bufferid", msg.bufferInfo().bufferId().toInt()); - getLastMessageIdQuery->bindValue(":type", msg.type()); - getLastMessageIdQuery->bindValue(":sender", msg.sender()); - getLastMessageIdQuery->exec(); - - if(getLastMessageIdQuery->first()) { - return getLastMessageIdQuery->value(0).toInt(); - } else { // somethin went wrong... :( - qDebug() << getLastMessageIdQuery->lastQuery() << "time/bufferid/type/sender:" << msg.timestamp().toTime_t() << msg.bufferInfo().bufferId() << msg.type() << msg.sender(); - Q_ASSERT(false); - return 0; - } + MsgId msgId = logMessageQuery->lastInsertId().toInt(); + Q_ASSERT(msgId.isValid()); + return msgId; } QList SqliteStorage::requestMsgs(BufferInfo buffer, int lastmsgs, int offset) { @@ -634,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; +}