#include "sqlitestorage.h"
-#include <QCryptographicHash>
#include <QtSql>
#include "network.h"
}
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;
}
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();
}
}
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()) {
return NetworkId();
}
+QList<NetworkId> SqliteStorage::connectedNetworks(UserId user) {
+ QList<NetworkId> 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<QString, QString> SqliteStorage::persistentChannels(UserId user, const NetworkId &networkId) {
+ QHash<QString, QString> 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());
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());
}
}
- 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<Message> SqliteStorage::requestMsgs(BufferInfo buffer, int lastmsgs, int offset) {
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<int, QByteArray> 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;
+}