X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fsqlitestorage.cpp;h=81f2fa9ee6079c33231dcb609dab17ee7c88af78;hp=ed705a84aa95b6c8ca4f04c613b2d0bf5ecdf7ad;hb=4ed404c7a72dd21bb06b003274ae544ab5ca1ad7;hpb=04754cf669dd295205226b744bc769b94693866a diff --git a/src/core/sqlitestorage.cpp b/src/core/sqlitestorage.cpp index ed705a84..81f2fa9e 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()) { @@ -463,6 +453,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 +543,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 +654,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 false; + + 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; +}