Add support for password hash versioning
authorMichael Marley <michael@michaelmarley.com>
Sat, 7 Feb 2015 20:40:23 +0000 (15:40 -0500)
committerMichael Marley <michael@michaelmarley.com>
Sun, 8 Feb 2015 13:55:58 +0000 (08:55 -0500)
Previously, Quassel would always use an unsalted SHA1 hash.  This
patch introduces a version field for the password, allowing for
using a better hash.  (No new hash is added yet.)  Users will be
automatically upgraded to the newest hash whenever they login or
change their passwords.

This is implemented by adding a new integer field to hold the hash
version in the DB.  Additionally, the password field in PostgreSQL
has been expanded to a TEXT field, allowing larger hash values to
be stored in the future.  The password hashing code has also been
refactored to make it easier to introduce new hashes without
fooling around in the DB driver code.

183 files changed:
src/core/SQL/PostgreSQL/16/insert_quasseluser.sql [deleted file]
src/core/SQL/PostgreSQL/16/select_authuser.sql [deleted file]
src/core/SQL/PostgreSQL/16/update_userpassword.sql [deleted file]
src/core/SQL/PostgreSQL/17/delete_backlog_by_uid.sql [moved from src/core/SQL/PostgreSQL/16/delete_backlog_by_uid.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/delete_backlog_for_buffer.sql [moved from src/core/SQL/PostgreSQL/16/delete_backlog_for_buffer.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/delete_backlog_for_network.sql [moved from src/core/SQL/PostgreSQL/16/delete_backlog_for_network.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/delete_buffer_for_bufferid.sql [moved from src/core/SQL/PostgreSQL/16/delete_buffer_for_bufferid.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/delete_buffers_by_uid.sql [moved from src/core/SQL/PostgreSQL/16/delete_buffers_by_uid.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/delete_buffers_for_network.sql [moved from src/core/SQL/PostgreSQL/16/delete_buffers_for_network.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/delete_identity.sql [moved from src/core/SQL/PostgreSQL/16/delete_identity.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/delete_ircservers_for_network.sql [moved from src/core/SQL/PostgreSQL/16/delete_ircservers_for_network.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/delete_network.sql [moved from src/core/SQL/PostgreSQL/16/delete_network.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/delete_networks_by_uid.sql [moved from src/core/SQL/PostgreSQL/16/delete_networks_by_uid.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/delete_nicks.sql [moved from src/core/SQL/PostgreSQL/16/delete_nicks.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/delete_quasseluser.sql [moved from src/core/SQL/PostgreSQL/16/delete_quasseluser.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/insert_buffer.sql [moved from src/core/SQL/PostgreSQL/16/insert_buffer.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/insert_identity.sql [moved from src/core/SQL/PostgreSQL/16/insert_identity.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/insert_message.sql [moved from src/core/SQL/PostgreSQL/16/insert_message.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/insert_network.sql [moved from src/core/SQL/PostgreSQL/16/insert_network.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/insert_nick.sql [moved from src/core/SQL/PostgreSQL/16/insert_nick.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/insert_quasseluser.sql [new file with mode: 0644]
src/core/SQL/PostgreSQL/17/insert_sender.sql [moved from src/core/SQL/PostgreSQL/16/insert_sender.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/insert_server.sql [moved from src/core/SQL/PostgreSQL/16/insert_server.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/insert_user_setting.sql [moved from src/core/SQL/PostgreSQL/16/insert_user_setting.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/migrate_write_backlog.sql [moved from src/core/SQL/PostgreSQL/16/migrate_write_backlog.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/migrate_write_buffer.sql [moved from src/core/SQL/PostgreSQL/16/migrate_write_buffer.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/migrate_write_identity.sql [moved from src/core/SQL/PostgreSQL/16/migrate_write_identity.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/migrate_write_identity_nick.sql [moved from src/core/SQL/PostgreSQL/16/migrate_write_identity_nick.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/migrate_write_ircserver.sql [moved from src/core/SQL/PostgreSQL/16/migrate_write_ircserver.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/migrate_write_network.sql [moved from src/core/SQL/PostgreSQL/16/migrate_write_network.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/migrate_write_quasseluser.sql [moved from src/core/SQL/PostgreSQL/16/migrate_write_quasseluser.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/migrate_write_sender.sql [moved from src/core/SQL/PostgreSQL/16/migrate_write_sender.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/migrate_write_usersetting.sql [moved from src/core/SQL/PostgreSQL/16/migrate_write_usersetting.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/select_authuser.sql [new file with mode: 0644]
src/core/SQL/PostgreSQL/17/select_bufferByName.sql [moved from src/core/SQL/PostgreSQL/16/select_bufferByName.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/select_bufferExists.sql [moved from src/core/SQL/PostgreSQL/16/select_bufferExists.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/select_buffer_by_id.sql [moved from src/core/SQL/PostgreSQL/16/select_buffer_by_id.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/select_buffer_lastseen_messages.sql [moved from src/core/SQL/PostgreSQL/16/select_buffer_lastseen_messages.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/select_buffer_markerlinemsgids.sql [moved from src/core/SQL/PostgreSQL/16/select_buffer_markerlinemsgids.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/select_buffers.sql [moved from src/core/SQL/PostgreSQL/16/select_buffers.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/select_buffers_for_network.sql [moved from src/core/SQL/PostgreSQL/16/select_buffers_for_network.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/select_checkidentity.sql [moved from src/core/SQL/PostgreSQL/16/select_checkidentity.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/select_connected_networks.sql [moved from src/core/SQL/PostgreSQL/16/select_connected_networks.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/select_identities.sql [moved from src/core/SQL/PostgreSQL/16/select_identities.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/select_internaluser.sql [moved from src/core/SQL/PostgreSQL/16/select_internaluser.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/select_messages.sql [moved from src/core/SQL/PostgreSQL/16/select_messages.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/select_messagesAll.sql [moved from src/core/SQL/PostgreSQL/16/select_messagesAll.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/select_messagesAllNew.sql [moved from src/core/SQL/PostgreSQL/16/select_messagesAllNew.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/select_messagesNewerThan.sql [moved from src/core/SQL/PostgreSQL/16/select_messagesNewerThan.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/select_messagesRange.sql [moved from src/core/SQL/PostgreSQL/16/select_messagesRange.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/select_networkExists.sql [moved from src/core/SQL/PostgreSQL/16/select_networkExists.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/select_network_awaymsg.sql [moved from src/core/SQL/PostgreSQL/16/select_network_awaymsg.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/select_network_usermode.sql [moved from src/core/SQL/PostgreSQL/16/select_network_usermode.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/select_networks_for_user.sql [moved from src/core/SQL/PostgreSQL/16/select_networks_for_user.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/select_nicks.sql [moved from src/core/SQL/PostgreSQL/16/select_nicks.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/select_persistent_channels.sql [moved from src/core/SQL/PostgreSQL/16/select_persistent_channels.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/select_senderid.sql [moved from src/core/SQL/PostgreSQL/16/select_senderid.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/select_servers_for_network.sql [moved from src/core/SQL/PostgreSQL/16/select_servers_for_network.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/select_user_setting.sql [moved from src/core/SQL/PostgreSQL/16/select_user_setting.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/select_userid.sql [moved from src/core/SQL/PostgreSQL/16/select_userid.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/setup_000_quasseluser.sql [moved from src/core/SQL/PostgreSQL/16/setup_000_quasseluser.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/setup_010_sender.sql [moved from src/core/SQL/PostgreSQL/16/setup_010_sender.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/setup_020_identity.sql [moved from src/core/SQL/PostgreSQL/16/setup_020_identity.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/setup_030_identity_nick.sql [moved from src/core/SQL/PostgreSQL/16/setup_030_identity_nick.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/setup_040_network.sql [moved from src/core/SQL/PostgreSQL/16/setup_040_network.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/setup_050_buffer.sql [moved from src/core/SQL/PostgreSQL/16/setup_050_buffer.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/setup_060_backlog.sql [moved from src/core/SQL/PostgreSQL/16/setup_060_backlog.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/setup_070_coreinfo.sql [moved from src/core/SQL/PostgreSQL/16/setup_070_coreinfo.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/setup_080_ircservers.sql [moved from src/core/SQL/PostgreSQL/16/setup_080_ircservers.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/setup_090_backlog_idx.sql [moved from src/core/SQL/PostgreSQL/16/setup_090_backlog_idx.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/setup_100_user_setting.sql [moved from src/core/SQL/PostgreSQL/16/setup_100_user_setting.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/setup_110_alter_sender_seq.sql [moved from src/core/SQL/PostgreSQL/16/setup_110_alter_sender_seq.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/setup_120_alter_messageid_seq.sql [moved from src/core/SQL/PostgreSQL/16/setup_120_alter_messageid_seq.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/update_backlog_bufferid.sql [moved from src/core/SQL/PostgreSQL/16/update_backlog_bufferid.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/update_buffer_lastseen.sql [moved from src/core/SQL/PostgreSQL/16/update_buffer_lastseen.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/update_buffer_markerlinemsgid.sql [moved from src/core/SQL/PostgreSQL/16/update_buffer_markerlinemsgid.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/update_buffer_name.sql [moved from src/core/SQL/PostgreSQL/16/update_buffer_name.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/update_buffer_persistent_channel.sql [moved from src/core/SQL/PostgreSQL/16/update_buffer_persistent_channel.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/update_buffer_set_channel_key.sql [moved from src/core/SQL/PostgreSQL/16/update_buffer_set_channel_key.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/update_identity.sql [moved from src/core/SQL/PostgreSQL/16/update_identity.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/update_network.sql [moved from src/core/SQL/PostgreSQL/16/update_network.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/update_network_connected.sql [moved from src/core/SQL/PostgreSQL/16/update_network_connected.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/update_network_set_awaymsg.sql [moved from src/core/SQL/PostgreSQL/16/update_network_set_awaymsg.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/update_network_set_usermode.sql [moved from src/core/SQL/PostgreSQL/16/update_network_set_usermode.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/update_user_setting.sql [moved from src/core/SQL/PostgreSQL/16/update_user_setting.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/update_username.sql [moved from src/core/SQL/PostgreSQL/16/update_username.sql with 100% similarity]
src/core/SQL/PostgreSQL/17/update_userpassword.sql [new file with mode: 0644]
src/core/SQL/PostgreSQL/17/upgrade_000_alter_quasseluser_add_passwordversion.sql [new file with mode: 0644]
src/core/SQL/SQLite/17/insert_quasseluser.sql [deleted file]
src/core/SQL/SQLite/17/select_authuser.sql [deleted file]
src/core/SQL/SQLite/17/update_userpassword.sql [deleted file]
src/core/SQL/SQLite/18/delete_backlog_by_uid.sql [moved from src/core/SQL/SQLite/17/delete_backlog_by_uid.sql with 100% similarity]
src/core/SQL/SQLite/18/delete_backlog_for_buffer.sql [moved from src/core/SQL/SQLite/17/delete_backlog_for_buffer.sql with 100% similarity]
src/core/SQL/SQLite/18/delete_backlog_for_network.sql [moved from src/core/SQL/SQLite/17/delete_backlog_for_network.sql with 100% similarity]
src/core/SQL/SQLite/18/delete_buffer_for_bufferid.sql [moved from src/core/SQL/SQLite/17/delete_buffer_for_bufferid.sql with 100% similarity]
src/core/SQL/SQLite/18/delete_buffers_by_uid.sql [moved from src/core/SQL/SQLite/17/delete_buffers_by_uid.sql with 100% similarity]
src/core/SQL/SQLite/18/delete_buffers_for_network.sql [moved from src/core/SQL/SQLite/17/delete_buffers_for_network.sql with 100% similarity]
src/core/SQL/SQLite/18/delete_identity.sql [moved from src/core/SQL/SQLite/17/delete_identity.sql with 100% similarity]
src/core/SQL/SQLite/18/delete_ircservers_for_network.sql [moved from src/core/SQL/SQLite/17/delete_ircservers_for_network.sql with 100% similarity]
src/core/SQL/SQLite/18/delete_network.sql [moved from src/core/SQL/SQLite/17/delete_network.sql with 100% similarity]
src/core/SQL/SQLite/18/delete_networks_by_uid.sql [moved from src/core/SQL/SQLite/17/delete_networks_by_uid.sql with 100% similarity]
src/core/SQL/SQLite/18/delete_nicks.sql [moved from src/core/SQL/SQLite/17/delete_nicks.sql with 100% similarity]
src/core/SQL/SQLite/18/delete_quasseluser.sql [moved from src/core/SQL/SQLite/17/delete_quasseluser.sql with 100% similarity]
src/core/SQL/SQLite/18/insert_buffer.sql [moved from src/core/SQL/SQLite/17/insert_buffer.sql with 100% similarity]
src/core/SQL/SQLite/18/insert_identity.sql [moved from src/core/SQL/SQLite/17/insert_identity.sql with 100% similarity]
src/core/SQL/SQLite/18/insert_message.sql [moved from src/core/SQL/SQLite/17/insert_message.sql with 100% similarity]
src/core/SQL/SQLite/18/insert_network.sql [moved from src/core/SQL/SQLite/17/insert_network.sql with 100% similarity]
src/core/SQL/SQLite/18/insert_nick.sql [moved from src/core/SQL/SQLite/17/insert_nick.sql with 100% similarity]
src/core/SQL/SQLite/18/insert_quasseluser.sql [new file with mode: 0644]
src/core/SQL/SQLite/18/insert_sender.sql [moved from src/core/SQL/SQLite/17/insert_sender.sql with 100% similarity]
src/core/SQL/SQLite/18/insert_server.sql [moved from src/core/SQL/SQLite/17/insert_server.sql with 100% similarity]
src/core/SQL/SQLite/18/insert_user_setting.sql [moved from src/core/SQL/SQLite/17/insert_user_setting.sql with 100% similarity]
src/core/SQL/SQLite/18/migrate_read_backlog.sql [moved from src/core/SQL/SQLite/17/migrate_read_backlog.sql with 100% similarity]
src/core/SQL/SQLite/18/migrate_read_buffer.sql [moved from src/core/SQL/SQLite/17/migrate_read_buffer.sql with 100% similarity]
src/core/SQL/SQLite/18/migrate_read_identity.sql [moved from src/core/SQL/SQLite/17/migrate_read_identity.sql with 100% similarity]
src/core/SQL/SQLite/18/migrate_read_identity_nick.sql [moved from src/core/SQL/SQLite/17/migrate_read_identity_nick.sql with 100% similarity]
src/core/SQL/SQLite/18/migrate_read_ircserver.sql [moved from src/core/SQL/SQLite/17/migrate_read_ircserver.sql with 100% similarity]
src/core/SQL/SQLite/18/migrate_read_network.sql [moved from src/core/SQL/SQLite/17/migrate_read_network.sql with 100% similarity]
src/core/SQL/SQLite/18/migrate_read_quasseluser.sql [moved from src/core/SQL/SQLite/17/migrate_read_quasseluser.sql with 100% similarity]
src/core/SQL/SQLite/18/migrate_read_sender.sql [moved from src/core/SQL/SQLite/17/migrate_read_sender.sql with 100% similarity]
src/core/SQL/SQLite/18/migrate_read_usersetting.sql [moved from src/core/SQL/SQLite/17/migrate_read_usersetting.sql with 100% similarity]
src/core/SQL/SQLite/18/select_authuser.sql [new file with mode: 0644]
src/core/SQL/SQLite/18/select_bufferByName.sql [moved from src/core/SQL/SQLite/17/select_bufferByName.sql with 100% similarity]
src/core/SQL/SQLite/18/select_bufferExists.sql [moved from src/core/SQL/SQLite/17/select_bufferExists.sql with 100% similarity]
src/core/SQL/SQLite/18/select_buffer_by_id.sql [moved from src/core/SQL/SQLite/17/select_buffer_by_id.sql with 100% similarity]
src/core/SQL/SQLite/18/select_buffer_lastseen_messages.sql [moved from src/core/SQL/SQLite/17/select_buffer_lastseen_messages.sql with 100% similarity]
src/core/SQL/SQLite/18/select_buffer_markerlinemsgids.sql [moved from src/core/SQL/SQLite/17/select_buffer_markerlinemsgids.sql with 100% similarity]
src/core/SQL/SQLite/18/select_buffers.sql [moved from src/core/SQL/SQLite/17/select_buffers.sql with 100% similarity]
src/core/SQL/SQLite/18/select_buffers_for_merge.sql [moved from src/core/SQL/SQLite/17/select_buffers_for_merge.sql with 100% similarity]
src/core/SQL/SQLite/18/select_buffers_for_network.sql [moved from src/core/SQL/SQLite/17/select_buffers_for_network.sql with 100% similarity]
src/core/SQL/SQLite/18/select_checkidentity.sql [moved from src/core/SQL/SQLite/17/select_checkidentity.sql with 100% similarity]
src/core/SQL/SQLite/18/select_connected_networks.sql [moved from src/core/SQL/SQLite/17/select_connected_networks.sql with 100% similarity]
src/core/SQL/SQLite/18/select_identities.sql [moved from src/core/SQL/SQLite/17/select_identities.sql with 100% similarity]
src/core/SQL/SQLite/18/select_internaluser.sql [moved from src/core/SQL/SQLite/17/select_internaluser.sql with 100% similarity]
src/core/SQL/SQLite/18/select_messages.sql [moved from src/core/SQL/SQLite/17/select_messages.sql with 100% similarity]
src/core/SQL/SQLite/18/select_messagesAll.sql [moved from src/core/SQL/SQLite/17/select_messagesAll.sql with 100% similarity]
src/core/SQL/SQLite/18/select_messagesAllNew.sql [moved from src/core/SQL/SQLite/17/select_messagesAllNew.sql with 100% similarity]
src/core/SQL/SQLite/18/select_messagesNewerThan.sql [moved from src/core/SQL/SQLite/17/select_messagesNewerThan.sql with 100% similarity]
src/core/SQL/SQLite/18/select_messagesNewestK.sql [moved from src/core/SQL/SQLite/17/select_messagesNewestK.sql with 100% similarity]
src/core/SQL/SQLite/18/select_networkExists.sql [moved from src/core/SQL/SQLite/17/select_networkExists.sql with 100% similarity]
src/core/SQL/SQLite/18/select_network_awaymsg.sql [moved from src/core/SQL/SQLite/17/select_network_awaymsg.sql with 100% similarity]
src/core/SQL/SQLite/18/select_network_usermode.sql [moved from src/core/SQL/SQLite/17/select_network_usermode.sql with 100% similarity]
src/core/SQL/SQLite/18/select_networks_for_user.sql [moved from src/core/SQL/SQLite/17/select_networks_for_user.sql with 100% similarity]
src/core/SQL/SQLite/18/select_nicks.sql [moved from src/core/SQL/SQLite/17/select_nicks.sql with 100% similarity]
src/core/SQL/SQLite/18/select_persistent_channels.sql [moved from src/core/SQL/SQLite/17/select_persistent_channels.sql with 100% similarity]
src/core/SQL/SQLite/18/select_servers_for_network.sql [moved from src/core/SQL/SQLite/17/select_servers_for_network.sql with 100% similarity]
src/core/SQL/SQLite/18/select_user_setting.sql [moved from src/core/SQL/SQLite/17/select_user_setting.sql with 100% similarity]
src/core/SQL/SQLite/18/select_userid.sql [moved from src/core/SQL/SQLite/17/select_userid.sql with 100% similarity]
src/core/SQL/SQLite/18/setup_000_quasseluser.sql [moved from src/core/SQL/SQLite/17/setup_000_quasseluser.sql with 100% similarity]
src/core/SQL/SQLite/18/setup_010_sender.sql [moved from src/core/SQL/SQLite/17/setup_010_sender.sql with 100% similarity]
src/core/SQL/SQLite/18/setup_020_network.sql [moved from src/core/SQL/SQLite/17/setup_020_network.sql with 100% similarity]
src/core/SQL/SQLite/18/setup_030_buffer.sql [moved from src/core/SQL/SQLite/17/setup_030_buffer.sql with 100% similarity]
src/core/SQL/SQLite/18/setup_040_buffer_idx.sql [moved from src/core/SQL/SQLite/17/setup_040_buffer_idx.sql with 100% similarity]
src/core/SQL/SQLite/18/setup_050_buffer_cname_idx.sql [moved from src/core/SQL/SQLite/17/setup_050_buffer_cname_idx.sql with 100% similarity]
src/core/SQL/SQLite/18/setup_060_backlog.sql [moved from src/core/SQL/SQLite/17/setup_060_backlog.sql with 100% similarity]
src/core/SQL/SQLite/18/setup_070_coreinfo.sql [moved from src/core/SQL/SQLite/17/setup_070_coreinfo.sql with 100% similarity]
src/core/SQL/SQLite/18/setup_080_ircservers.sql [moved from src/core/SQL/SQLite/17/setup_080_ircservers.sql with 100% similarity]
src/core/SQL/SQLite/18/setup_090_backlog_idx.sql [moved from src/core/SQL/SQLite/17/setup_090_backlog_idx.sql with 100% similarity]
src/core/SQL/SQLite/18/setup_100_backlog_idx2.sql [moved from src/core/SQL/SQLite/17/setup_100_backlog_idx2.sql with 100% similarity]
src/core/SQL/SQLite/18/setup_110_buffer_user_idx.sql [moved from src/core/SQL/SQLite/17/setup_110_buffer_user_idx.sql with 100% similarity]
src/core/SQL/SQLite/18/setup_120_user_setting.sql [moved from src/core/SQL/SQLite/17/setup_120_user_setting.sql with 100% similarity]
src/core/SQL/SQLite/18/setup_130_identity.sql [moved from src/core/SQL/SQLite/17/setup_130_identity.sql with 100% similarity]
src/core/SQL/SQLite/18/setup_140_identity_nick.sql [moved from src/core/SQL/SQLite/17/setup_140_identity_nick.sql with 100% similarity]
src/core/SQL/SQLite/18/update_backlog_bufferid.sql [moved from src/core/SQL/SQLite/17/update_backlog_bufferid.sql with 100% similarity]
src/core/SQL/SQLite/18/update_buffer_lastseen.sql [moved from src/core/SQL/SQLite/17/update_buffer_lastseen.sql with 100% similarity]
src/core/SQL/SQLite/18/update_buffer_markerlinemsgid.sql [moved from src/core/SQL/SQLite/17/update_buffer_markerlinemsgid.sql with 100% similarity]
src/core/SQL/SQLite/18/update_buffer_name.sql [moved from src/core/SQL/SQLite/17/update_buffer_name.sql with 100% similarity]
src/core/SQL/SQLite/18/update_buffer_persistent_channel.sql [moved from src/core/SQL/SQLite/17/update_buffer_persistent_channel.sql with 100% similarity]
src/core/SQL/SQLite/18/update_buffer_set_channel_key.sql [moved from src/core/SQL/SQLite/17/update_buffer_set_channel_key.sql with 100% similarity]
src/core/SQL/SQLite/18/update_identity.sql [moved from src/core/SQL/SQLite/17/update_identity.sql with 100% similarity]
src/core/SQL/SQLite/18/update_network.sql [moved from src/core/SQL/SQLite/17/update_network.sql with 100% similarity]
src/core/SQL/SQLite/18/update_network_connected.sql [moved from src/core/SQL/SQLite/17/update_network_connected.sql with 100% similarity]
src/core/SQL/SQLite/18/update_network_set_awaymsg.sql [moved from src/core/SQL/SQLite/17/update_network_set_awaymsg.sql with 100% similarity]
src/core/SQL/SQLite/18/update_network_set_usermode.sql [moved from src/core/SQL/SQLite/17/update_network_set_usermode.sql with 100% similarity]
src/core/SQL/SQLite/18/update_user_setting.sql [moved from src/core/SQL/SQLite/17/update_user_setting.sql with 100% similarity]
src/core/SQL/SQLite/18/update_username.sql [moved from src/core/SQL/SQLite/17/update_username.sql with 100% similarity]
src/core/SQL/SQLite/18/update_userpassword.sql [new file with mode: 0644]
src/core/SQL/SQLite/18/upgrade_000_alter_quasseluser_add_passwordversion.sql [new file with mode: 0644]
src/core/postgresqlstorage.cpp
src/core/sql.qrc
src/core/sqlitestorage.cpp
src/core/storage.cpp
src/core/storage.h

diff --git a/src/core/SQL/PostgreSQL/16/insert_quasseluser.sql b/src/core/SQL/PostgreSQL/16/insert_quasseluser.sql
deleted file mode 100644 (file)
index f336d0c..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-INSERT INTO quasseluser (username, password)
-VALUES (:username, :password)
-RETURNING userid
diff --git a/src/core/SQL/PostgreSQL/16/select_authuser.sql b/src/core/SQL/PostgreSQL/16/select_authuser.sql
deleted file mode 100644 (file)
index f11bf18..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-SELECT userid
-FROM quasseluser
-WHERE username = :username AND password = :password
diff --git a/src/core/SQL/PostgreSQL/16/update_userpassword.sql b/src/core/SQL/PostgreSQL/16/update_userpassword.sql
deleted file mode 100644 (file)
index 44a514a..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-UPDATE quasseluser
-SET password = :password
-WHERE userid = :userid
diff --git a/src/core/SQL/PostgreSQL/17/insert_quasseluser.sql b/src/core/SQL/PostgreSQL/17/insert_quasseluser.sql
new file mode 100644 (file)
index 0000000..af85392
--- /dev/null
@@ -0,0 +1,3 @@
+INSERT INTO quasseluser (username, password, hashversion)
+VALUES (:username, :password, :hashversion)
+RETURNING userid
diff --git a/src/core/SQL/PostgreSQL/17/select_authuser.sql b/src/core/SQL/PostgreSQL/17/select_authuser.sql
new file mode 100644 (file)
index 0000000..1991281
--- /dev/null
@@ -0,0 +1,3 @@
+SELECT userid, password, hashversion
+FROM quasseluser
+WHERE username = :username
diff --git a/src/core/SQL/PostgreSQL/17/update_userpassword.sql b/src/core/SQL/PostgreSQL/17/update_userpassword.sql
new file mode 100644 (file)
index 0000000..61eeb0c
--- /dev/null
@@ -0,0 +1,3 @@
+UPDATE quasseluser
+SET password = :password, hashversion = :hashversion
+WHERE userid = :userid
diff --git a/src/core/SQL/PostgreSQL/17/upgrade_000_alter_quasseluser_add_passwordversion.sql b/src/core/SQL/PostgreSQL/17/upgrade_000_alter_quasseluser_add_passwordversion.sql
new file mode 100644 (file)
index 0000000..7a799c7
--- /dev/null
@@ -0,0 +1,3 @@
+ALTER TABLE quasseluser
+ALTER COLUMN password TYPE text,
+ADD COLUMN hashversion integer NOT NULL DEFAULT 0
diff --git a/src/core/SQL/SQLite/17/insert_quasseluser.sql b/src/core/SQL/SQLite/17/insert_quasseluser.sql
deleted file mode 100644 (file)
index 3a9ff8b..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-INSERT INTO quasseluser (username, password)
-VALUES (:username, :password)
\ No newline at end of file
diff --git a/src/core/SQL/SQLite/17/select_authuser.sql b/src/core/SQL/SQLite/17/select_authuser.sql
deleted file mode 100644 (file)
index f11bf18..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-SELECT userid
-FROM quasseluser
-WHERE username = :username AND password = :password
diff --git a/src/core/SQL/SQLite/17/update_userpassword.sql b/src/core/SQL/SQLite/17/update_userpassword.sql
deleted file mode 100644 (file)
index 44a514a..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-UPDATE quasseluser
-SET password = :password
-WHERE userid = :userid
diff --git a/src/core/SQL/SQLite/18/insert_quasseluser.sql b/src/core/SQL/SQLite/18/insert_quasseluser.sql
new file mode 100644 (file)
index 0000000..8a24419
--- /dev/null
@@ -0,0 +1,2 @@
+INSERT INTO quasseluser (username, password, hashversion)
+VALUES (:username, :password, :hashversion)
\ No newline at end of file
diff --git a/src/core/SQL/SQLite/18/select_authuser.sql b/src/core/SQL/SQLite/18/select_authuser.sql
new file mode 100644 (file)
index 0000000..1991281
--- /dev/null
@@ -0,0 +1,3 @@
+SELECT userid, password, hashversion
+FROM quasseluser
+WHERE username = :username
diff --git a/src/core/SQL/SQLite/18/update_userpassword.sql b/src/core/SQL/SQLite/18/update_userpassword.sql
new file mode 100644 (file)
index 0000000..61eeb0c
--- /dev/null
@@ -0,0 +1,3 @@
+UPDATE quasseluser
+SET password = :password, hashversion = :hashversion
+WHERE userid = :userid
diff --git a/src/core/SQL/SQLite/18/upgrade_000_alter_quasseluser_add_passwordversion.sql b/src/core/SQL/SQLite/18/upgrade_000_alter_quasseluser_add_passwordversion.sql
new file mode 100644 (file)
index 0000000..ab1fce8
--- /dev/null
@@ -0,0 +1,2 @@
+ALTER TABLE quasseluser
+ADD COLUMN hashversion INTEGER NOT NULL DEFAULT 0
index 11adb1d..7c20a05 100644 (file)
@@ -207,7 +207,8 @@ UserId PostgreSqlStorage::addUser(const QString &user, const QString &password)
     QSqlQuery query(logDb());
     query.prepare(queryString("insert_quasseluser"));
     query.bindValue(":username", user);
-    query.bindValue(":password", cryptedPassword(password));
+    query.bindValue(":password", hashPassword(password));
+    query.bindValue(":hashversion", Storage::HashVersion::latest);
     safeExec(query);
     if (!watchQuery(query))
         return 0;
@@ -224,7 +225,8 @@ bool PostgreSqlStorage::updateUser(UserId user, const QString &password)
     QSqlQuery query(logDb());
     query.prepare(queryString("update_userpassword"));
     query.bindValue(":userid", user.toInt());
-    query.bindValue(":password", cryptedPassword(password));
+    query.bindValue(":password", hashPassword(password));
+    query.bindValue(":hashversion", Storage::HashVersion::latest);
     safeExec(query);
     watchQuery(query);
     return query.numRowsAffected() != 0;
@@ -248,11 +250,10 @@ UserId PostgreSqlStorage::validateUser(const QString &user, const QString &passw
     QSqlQuery query(logDb());
     query.prepare(queryString("select_authuser"));
     query.bindValue(":username", user);
-    query.bindValue(":password", cryptedPassword(password));
     safeExec(query);
     watchQuery(query);
 
-    if (query.first()) {
+    if (query.first() && checkHashedPassword(query.value(0).toInt(), password, query.value(1).toString(), static_cast<Storage::HashVersion>(query.value(2).toInt()))) {
         return query.value(0).toInt();
     }
     else {
index fce0692..c72d14f 100644 (file)
 <!DOCTYPE RCC><RCC version="1.0">
 <qresource>
-    <file>./SQL/PostgreSQL/15/upgrade_000_alter_buffer_add_markerlinemsgid.sql</file>
-    <file>./SQL/PostgreSQL/16/delete_backlog_by_uid.sql</file>
-    <file>./SQL/PostgreSQL/16/delete_backlog_for_buffer.sql</file>
-    <file>./SQL/PostgreSQL/16/delete_backlog_for_network.sql</file>
-    <file>./SQL/PostgreSQL/16/delete_buffer_for_bufferid.sql</file>
-    <file>./SQL/PostgreSQL/16/delete_buffers_by_uid.sql</file>
-    <file>./SQL/PostgreSQL/16/delete_buffers_for_network.sql</file>
-    <file>./SQL/PostgreSQL/16/delete_identity.sql</file>
-    <file>./SQL/PostgreSQL/16/delete_ircservers_for_network.sql</file>
-    <file>./SQL/PostgreSQL/16/delete_network.sql</file>
-    <file>./SQL/PostgreSQL/16/delete_networks_by_uid.sql</file>
-    <file>./SQL/PostgreSQL/16/delete_nicks.sql</file>
-    <file>./SQL/PostgreSQL/16/delete_quasseluser.sql</file>
-    <file>./SQL/PostgreSQL/16/insert_buffer.sql</file>
-    <file>./SQL/PostgreSQL/16/insert_identity.sql</file>
-    <file>./SQL/PostgreSQL/16/insert_message.sql</file>
-    <file>./SQL/PostgreSQL/16/insert_network.sql</file>
-    <file>./SQL/PostgreSQL/16/insert_nick.sql</file>
-    <file>./SQL/PostgreSQL/16/insert_quasseluser.sql</file>
-    <file>./SQL/PostgreSQL/16/insert_sender.sql</file>
-    <file>./SQL/PostgreSQL/16/insert_server.sql</file>
-    <file>./SQL/PostgreSQL/16/insert_user_setting.sql</file>
-    <file>./SQL/PostgreSQL/16/migrate_write_backlog.sql</file>
-    <file>./SQL/PostgreSQL/16/migrate_write_buffer.sql</file>
-    <file>./SQL/PostgreSQL/16/migrate_write_identity.sql</file>
-    <file>./SQL/PostgreSQL/16/migrate_write_identity_nick.sql</file>
-    <file>./SQL/PostgreSQL/16/migrate_write_ircserver.sql</file>
-    <file>./SQL/PostgreSQL/16/migrate_write_network.sql</file>
-    <file>./SQL/PostgreSQL/16/migrate_write_quasseluser.sql</file>
-    <file>./SQL/PostgreSQL/16/migrate_write_sender.sql</file>
-    <file>./SQL/PostgreSQL/16/migrate_write_usersetting.sql</file>
-    <file>./SQL/PostgreSQL/16/select_authuser.sql</file>
-    <file>./SQL/PostgreSQL/16/select_buffer_by_id.sql</file>
-    <file>./SQL/PostgreSQL/16/select_buffer_lastseen_messages.sql</file>
-    <file>./SQL/PostgreSQL/16/select_buffer_markerlinemsgids.sql</file>
-    <file>./SQL/PostgreSQL/16/select_bufferByName.sql</file>
-    <file>./SQL/PostgreSQL/16/select_bufferExists.sql</file>
-    <file>./SQL/PostgreSQL/16/select_buffers.sql</file>
-    <file>./SQL/PostgreSQL/16/select_buffers_for_network.sql</file>
-    <file>./SQL/PostgreSQL/16/select_checkidentity.sql</file>
-    <file>./SQL/PostgreSQL/16/select_connected_networks.sql</file>
-    <file>./SQL/PostgreSQL/16/select_identities.sql</file>
-    <file>./SQL/PostgreSQL/16/select_internaluser.sql</file>
-    <file>./SQL/PostgreSQL/16/select_messages.sql</file>
-    <file>./SQL/PostgreSQL/16/select_messagesAll.sql</file>
-    <file>./SQL/PostgreSQL/16/select_messagesAllNew.sql</file>
-    <file>./SQL/PostgreSQL/16/select_messagesNewerThan.sql</file>
-    <file>./SQL/PostgreSQL/16/select_messagesRange.sql</file>
-    <file>./SQL/PostgreSQL/16/select_network_awaymsg.sql</file>
-    <file>./SQL/PostgreSQL/16/select_network_usermode.sql</file>
-    <file>./SQL/PostgreSQL/16/select_networkExists.sql</file>
-    <file>./SQL/PostgreSQL/16/select_networks_for_user.sql</file>
-    <file>./SQL/PostgreSQL/16/select_nicks.sql</file>
-    <file>./SQL/PostgreSQL/16/select_persistent_channels.sql</file>
-    <file>./SQL/PostgreSQL/16/select_senderid.sql</file>
-    <file>./SQL/PostgreSQL/16/select_servers_for_network.sql</file>
-    <file>./SQL/PostgreSQL/16/select_user_setting.sql</file>
-    <file>./SQL/PostgreSQL/16/select_userid.sql</file>
-    <file>./SQL/PostgreSQL/16/setup_000_quasseluser.sql</file>
-    <file>./SQL/PostgreSQL/16/setup_010_sender.sql</file>
-    <file>./SQL/PostgreSQL/16/setup_020_identity.sql</file>
-    <file>./SQL/PostgreSQL/16/setup_030_identity_nick.sql</file>
-    <file>./SQL/PostgreSQL/16/setup_040_network.sql</file>
-    <file>./SQL/PostgreSQL/16/setup_050_buffer.sql</file>
-    <file>./SQL/PostgreSQL/16/setup_060_backlog.sql</file>
-    <file>./SQL/PostgreSQL/16/setup_070_coreinfo.sql</file>
-    <file>./SQL/PostgreSQL/16/setup_080_ircservers.sql</file>
-    <file>./SQL/PostgreSQL/16/setup_090_backlog_idx.sql</file>
-    <file>./SQL/PostgreSQL/16/setup_100_user_setting.sql</file>
-    <file>./SQL/PostgreSQL/16/setup_110_alter_sender_seq.sql</file>
-    <file>./SQL/PostgreSQL/16/setup_120_alter_messageid_seq.sql</file>
-    <file>./SQL/PostgreSQL/16/update_backlog_bufferid.sql</file>
-    <file>./SQL/PostgreSQL/16/update_buffer_lastseen.sql</file>
-    <file>./SQL/PostgreSQL/16/update_buffer_markerlinemsgid.sql</file>
-    <file>./SQL/PostgreSQL/16/update_buffer_name.sql</file>
-    <file>./SQL/PostgreSQL/16/update_buffer_persistent_channel.sql</file>
-    <file>./SQL/PostgreSQL/16/update_buffer_set_channel_key.sql</file>
-    <file>./SQL/PostgreSQL/16/update_identity.sql</file>
-    <file>./SQL/PostgreSQL/16/update_network.sql</file>
-    <file>./SQL/PostgreSQL/16/update_network_connected.sql</file>
-    <file>./SQL/PostgreSQL/16/update_network_set_awaymsg.sql</file>
-    <file>./SQL/PostgreSQL/16/update_network_set_usermode.sql</file>
-    <file>./SQL/PostgreSQL/16/update_user_setting.sql</file>
-    <file>./SQL/PostgreSQL/16/update_username.sql</file>
-    <file>./SQL/PostgreSQL/16/update_userpassword.sql</file>
-    <file>./SQL/PostgreSQL/16/upgrade_000_alter_network_add_sasl.sql</file>
-    <file>./SQL/SQLite/1/upgrade_000_drop_coreinfo.sql</file>
-    <file>./SQL/SQLite/1/upgrade_010_create_coreinfo.sql</file>
-    <file>./SQL/SQLite/1/upgrade_020_update_schemaversion.sql</file>
-    <file>./SQL/SQLite/10/upgrade_000_switch_to_msgid.sql</file>
-    <file>./SQL/SQLite/10/upgrade_010_rename_buffer_table.sql</file>
-    <file>./SQL/SQLite/10/upgrade_020_create_buffer_table.sql</file>
-    <file>./SQL/SQLite/10/upgrade_030_copy_buffer_table.sql</file>
-    <file>./SQL/SQLite/10/upgrade_040_drop_buffer_old_table.sql</file>
-    <file>./SQL/SQLite/11/upgrade_000_create_user_setting.sql</file>
-    <file>./SQL/SQLite/12/upgrade_000_create_identity.sql</file>
-    <file>./SQL/SQLite/12/upgrade_010_create_identity_nick.sql</file>
-    <file>./SQL/SQLite/12/upgrade_020_rename_servertable.sql</file>
-    <file>./SQL/SQLite/12/upgrade_030_create_ircserver.sql</file>
-    <file>./SQL/SQLite/12/upgrade_040_copy_ircserver.sql</file>
-    <file>./SQL/SQLite/12/upgrade_050_drop_ircserverold.sql</file>
-    <file>./SQL/SQLite/13/upgrade_000_create_buffer_user_idx.sql</file>
-    <file>./SQL/SQLite/13/upgrade_010_create_buffer_cname_idx.sql</file>
-    <file>./SQL/SQLite/13/upgrade_020_create_buffer_cname_idx.sql</file>
-    <file>./SQL/SQLite/14/upgrade_000_rename_networktable.sql</file>
-    <file>./SQL/SQLite/14/upgrade_010_create_networktable.sql</file>
-    <file>./SQL/SQLite/14/upgrade_030_copy_networktable.sql</file>
-    <file>./SQL/SQLite/14/upgrade_040_drop_networkold.sql</file>
-    <file>./SQL/SQLite/15/upgrade_000_fix_ircservers.sql</file>
-    <file>./SQL/SQLite/15/upgrade_000_fix_network.sql</file>
     <file>./SQL/SQLite/16/upgrade_000_alter_buffer_add_markerlinemsgid.sql</file>
-    <file>./SQL/SQLite/17/delete_backlog_by_uid.sql</file>
-    <file>./SQL/SQLite/17/delete_backlog_for_buffer.sql</file>
-    <file>./SQL/SQLite/17/delete_backlog_for_network.sql</file>
-    <file>./SQL/SQLite/17/delete_buffer_for_bufferid.sql</file>
-    <file>./SQL/SQLite/17/delete_buffers_by_uid.sql</file>
-    <file>./SQL/SQLite/17/delete_buffers_for_network.sql</file>
-    <file>./SQL/SQLite/17/delete_identity.sql</file>
-    <file>./SQL/SQLite/17/delete_ircservers_for_network.sql</file>
-    <file>./SQL/SQLite/17/delete_network.sql</file>
-    <file>./SQL/SQLite/17/delete_networks_by_uid.sql</file>
-    <file>./SQL/SQLite/17/delete_nicks.sql</file>
-    <file>./SQL/SQLite/17/delete_quasseluser.sql</file>
-    <file>./SQL/SQLite/17/insert_buffer.sql</file>
-    <file>./SQL/SQLite/17/insert_identity.sql</file>
-    <file>./SQL/SQLite/17/insert_message.sql</file>
-    <file>./SQL/SQLite/17/insert_network.sql</file>
-    <file>./SQL/SQLite/17/insert_nick.sql</file>
-    <file>./SQL/SQLite/17/insert_quasseluser.sql</file>
-    <file>./SQL/SQLite/17/insert_sender.sql</file>
-    <file>./SQL/SQLite/17/insert_server.sql</file>
-    <file>./SQL/SQLite/17/insert_user_setting.sql</file>
-    <file>./SQL/SQLite/17/migrate_read_backlog.sql</file>
-    <file>./SQL/SQLite/17/migrate_read_buffer.sql</file>
-    <file>./SQL/SQLite/17/migrate_read_identity.sql</file>
-    <file>./SQL/SQLite/17/migrate_read_identity_nick.sql</file>
-    <file>./SQL/SQLite/17/migrate_read_ircserver.sql</file>
-    <file>./SQL/SQLite/17/migrate_read_network.sql</file>
-    <file>./SQL/SQLite/17/migrate_read_quasseluser.sql</file>
-    <file>./SQL/SQLite/17/migrate_read_sender.sql</file>
-    <file>./SQL/SQLite/17/migrate_read_usersetting.sql</file>
-    <file>./SQL/SQLite/17/select_authuser.sql</file>
-    <file>./SQL/SQLite/17/select_buffer_by_id.sql</file>
-    <file>./SQL/SQLite/17/select_buffer_lastseen_messages.sql</file>
-    <file>./SQL/SQLite/17/select_buffer_markerlinemsgids.sql</file>
-    <file>./SQL/SQLite/17/select_bufferByName.sql</file>
-    <file>./SQL/SQLite/17/select_bufferExists.sql</file>
-    <file>./SQL/SQLite/17/select_buffers.sql</file>
-    <file>./SQL/SQLite/17/select_buffers_for_merge.sql</file>
-    <file>./SQL/SQLite/17/select_buffers_for_network.sql</file>
-    <file>./SQL/SQLite/17/select_checkidentity.sql</file>
-    <file>./SQL/SQLite/17/select_connected_networks.sql</file>
-    <file>./SQL/SQLite/17/select_identities.sql</file>
-    <file>./SQL/SQLite/17/select_internaluser.sql</file>
-    <file>./SQL/SQLite/17/select_messages.sql</file>
-    <file>./SQL/SQLite/17/select_messagesAll.sql</file>
-    <file>./SQL/SQLite/17/select_messagesAllNew.sql</file>
-    <file>./SQL/SQLite/17/select_messagesNewerThan.sql</file>
-    <file>./SQL/SQLite/17/select_messagesNewestK.sql</file>
-    <file>./SQL/SQLite/17/select_network_awaymsg.sql</file>
-    <file>./SQL/SQLite/17/select_network_usermode.sql</file>
-    <file>./SQL/SQLite/17/select_networkExists.sql</file>
-    <file>./SQL/SQLite/17/select_networks_for_user.sql</file>
-    <file>./SQL/SQLite/17/select_nicks.sql</file>
-    <file>./SQL/SQLite/17/select_persistent_channels.sql</file>
-    <file>./SQL/SQLite/17/select_servers_for_network.sql</file>
-    <file>./SQL/SQLite/17/select_user_setting.sql</file>
-    <file>./SQL/SQLite/17/select_userid.sql</file>
-    <file>./SQL/SQLite/17/setup_000_quasseluser.sql</file>
-    <file>./SQL/SQLite/17/setup_010_sender.sql</file>
-    <file>./SQL/SQLite/17/setup_020_network.sql</file>
-    <file>./SQL/SQLite/17/setup_030_buffer.sql</file>
-    <file>./SQL/SQLite/17/setup_040_buffer_idx.sql</file>
-    <file>./SQL/SQLite/17/setup_050_buffer_cname_idx.sql</file>
-    <file>./SQL/SQLite/17/setup_060_backlog.sql</file>
-    <file>./SQL/SQLite/17/setup_070_coreinfo.sql</file>
-    <file>./SQL/SQLite/17/setup_080_ircservers.sql</file>
-    <file>./SQL/SQLite/17/setup_090_backlog_idx.sql</file>
-    <file>./SQL/SQLite/17/setup_100_backlog_idx2.sql</file>
-    <file>./SQL/SQLite/17/setup_110_buffer_user_idx.sql</file>
-    <file>./SQL/SQLite/17/setup_120_user_setting.sql</file>
-    <file>./SQL/SQLite/17/setup_130_identity.sql</file>
-    <file>./SQL/SQLite/17/setup_140_identity_nick.sql</file>
-    <file>./SQL/SQLite/17/update_backlog_bufferid.sql</file>
-    <file>./SQL/SQLite/17/update_buffer_lastseen.sql</file>
-    <file>./SQL/SQLite/17/update_buffer_markerlinemsgid.sql</file>
-    <file>./SQL/SQLite/17/update_buffer_name.sql</file>
-    <file>./SQL/SQLite/17/update_buffer_persistent_channel.sql</file>
-    <file>./SQL/SQLite/17/update_buffer_set_channel_key.sql</file>
-    <file>./SQL/SQLite/17/update_identity.sql</file>
-    <file>./SQL/SQLite/17/update_network.sql</file>
-    <file>./SQL/SQLite/17/update_network_connected.sql</file>
-    <file>./SQL/SQLite/17/update_network_set_awaymsg.sql</file>
-    <file>./SQL/SQLite/17/update_network_set_usermode.sql</file>
-    <file>./SQL/SQLite/17/update_user_setting.sql</file>
-    <file>./SQL/SQLite/17/update_username.sql</file>
-    <file>./SQL/SQLite/17/update_userpassword.sql</file>
-    <file>./SQL/SQLite/17/upgrade_000_alter_network_add_sasl.sql</file>
     <file>./SQL/SQLite/17/upgrade_001_alter_network_add_sasl.sql</file>
+    <file>./SQL/SQLite/17/upgrade_000_alter_network_add_sasl.sql</file>
     <file>./SQL/SQLite/17/upgrade_002_alter_network_add_sasl.sql</file>
-    <file>./SQL/SQLite/2/upgrade_000_drop_buffergroup.sql</file>
+    <file>./SQL/SQLite/18/update_buffer_persistent_channel.sql</file>
+    <file>./SQL/SQLite/18/insert_network.sql</file>
+    <file>./SQL/SQLite/18/insert_identity.sql</file>
+    <file>./SQL/SQLite/18/select_checkidentity.sql</file>
+    <file>./SQL/SQLite/18/migrate_read_identity.sql</file>
+    <file>./SQL/SQLite/18/update_identity.sql</file>
+    <file>./SQL/SQLite/18/delete_buffer_for_bufferid.sql</file>
+    <file>./SQL/SQLite/18/setup_120_user_setting.sql</file>
+    <file>./SQL/SQLite/18/select_networks_for_user.sql</file>
+    <file>./SQL/SQLite/18/select_networkExists.sql</file>
+    <file>./SQL/SQLite/18/migrate_read_network.sql</file>
+    <file>./SQL/SQLite/18/setup_130_identity.sql</file>
+    <file>./SQL/SQLite/18/select_messagesNewestK.sql</file>
+    <file>./SQL/SQLite/18/setup_100_backlog_idx2.sql</file>
+    <file>./SQL/SQLite/18/select_messagesAllNew.sql</file>
+    <file>./SQL/SQLite/18/select_buffers_for_merge.sql</file>
+    <file>./SQL/SQLite/18/delete_ircservers_for_network.sql</file>
+    <file>./SQL/SQLite/18/select_persistent_channels.sql</file>
+    <file>./SQL/SQLite/18/update_buffer_set_channel_key.sql</file>
+    <file>./SQL/SQLite/18/setup_040_buffer_idx.sql</file>
+    <file>./SQL/SQLite/18/select_messagesNewerThan.sql</file>
+    <file>./SQL/SQLite/18/setup_070_coreinfo.sql</file>
+    <file>./SQL/SQLite/18/insert_nick.sql</file>
+    <file>./SQL/SQLite/18/select_messagesAll.sql</file>
+    <file>./SQL/SQLite/18/delete_identity.sql</file>
+    <file>./SQL/SQLite/18/select_buffer_markerlinemsgids.sql</file>
+    <file>./SQL/SQLite/18/migrate_read_identity_nick.sql</file>
+    <file>./SQL/SQLite/18/select_buffer_lastseen_messages.sql</file>
+    <file>./SQL/SQLite/18/insert_sender.sql</file>
+    <file>./SQL/SQLite/18/select_nicks.sql</file>
+    <file>./SQL/SQLite/18/setup_030_buffer.sql</file>
+    <file>./SQL/SQLite/18/migrate_read_sender.sql</file>
+    <file>./SQL/SQLite/18/insert_user_setting.sql</file>
+    <file>./SQL/SQLite/18/delete_buffers_for_network.sql</file>
+    <file>./SQL/SQLite/18/select_messages.sql</file>
+    <file>./SQL/SQLite/18/select_buffers.sql</file>
+    <file>./SQL/SQLite/18/select_userid.sql</file>
+    <file>./SQL/SQLite/18/update_network.sql</file>
+    <file>./SQL/SQLite/18/migrate_read_usersetting.sql</file>
+    <file>./SQL/SQLite/18/migrate_read_quasseluser.sql</file>
+    <file>./SQL/SQLite/18/setup_010_sender.sql</file>
+    <file>./SQL/SQLite/18/delete_quasseluser.sql</file>
+    <file>./SQL/SQLite/18/select_network_usermode.sql</file>
+    <file>./SQL/SQLite/18/update_userpassword.sql</file>
+    <file>./SQL/SQLite/18/select_identities.sql</file>
+    <file>./SQL/SQLite/18/setup_000_quasseluser.sql</file>
+    <file>./SQL/SQLite/18/setup_080_ircservers.sql</file>
+    <file>./SQL/SQLite/18/delete_nicks.sql</file>
+    <file>./SQL/SQLite/18/delete_network.sql</file>
+    <file>./SQL/SQLite/18/select_servers_for_network.sql</file>
+    <file>./SQL/SQLite/18/migrate_read_buffer.sql</file>
+    <file>./SQL/SQLite/18/select_connected_networks.sql</file>
+    <file>./SQL/SQLite/18/update_network_connected.sql</file>
+    <file>./SQL/SQLite/18/delete_backlog_for_network.sql</file>
+    <file>./SQL/SQLite/18/setup_060_backlog.sql</file>
+    <file>./SQL/SQLite/18/update_username.sql</file>
+    <file>./SQL/SQLite/18/insert_message.sql</file>
+    <file>./SQL/SQLite/18/select_buffer_by_id.sql</file>
+    <file>./SQL/SQLite/18/update_user_setting.sql</file>
+    <file>./SQL/SQLite/18/update_buffer_name.sql</file>
+    <file>./SQL/SQLite/18/select_bufferExists.sql</file>
+    <file>./SQL/SQLite/18/setup_110_buffer_user_idx.sql</file>
+    <file>./SQL/SQLite/18/select_buffers_for_network.sql</file>
+    <file>./SQL/SQLite/18/delete_backlog_by_uid.sql</file>
+    <file>./SQL/SQLite/18/select_internaluser.sql</file>
+    <file>./SQL/SQLite/18/select_network_awaymsg.sql</file>
+    <file>./SQL/SQLite/18/setup_090_backlog_idx.sql</file>
+    <file>./SQL/SQLite/18/insert_quasseluser.sql</file>
+    <file>./SQL/SQLite/18/update_network_set_usermode.sql</file>
+    <file>./SQL/SQLite/18/migrate_read_ircserver.sql</file>
+    <file>./SQL/SQLite/18/delete_backlog_for_buffer.sql</file>
+    <file>./SQL/SQLite/18/update_network_set_awaymsg.sql</file>
+    <file>./SQL/SQLite/18/upgrade_000_alter_quasseluser_add_passwordversion.sql</file>
+    <file>./SQL/SQLite/18/update_backlog_bufferid.sql</file>
+    <file>./SQL/SQLite/18/update_buffer_markerlinemsgid.sql</file>
+    <file>./SQL/SQLite/18/update_buffer_lastseen.sql</file>
+    <file>./SQL/SQLite/18/setup_050_buffer_cname_idx.sql</file>
+    <file>./SQL/SQLite/18/insert_buffer.sql</file>
+    <file>./SQL/SQLite/18/select_authuser.sql</file>
+    <file>./SQL/SQLite/18/select_user_setting.sql</file>
+    <file>./SQL/SQLite/18/select_bufferByName.sql</file>
+    <file>./SQL/SQLite/18/insert_server.sql</file>
+    <file>./SQL/SQLite/18/setup_020_network.sql</file>
+    <file>./SQL/SQLite/18/migrate_read_backlog.sql</file>
+    <file>./SQL/SQLite/18/setup_140_identity_nick.sql</file>
+    <file>./SQL/SQLite/18/delete_networks_by_uid.sql</file>
+    <file>./SQL/SQLite/18/delete_buffers_by_uid.sql</file>
+    <file>./SQL/SQLite/15/upgrade_000_fix_ircservers.sql</file>
+    <file>./SQL/SQLite/15/upgrade_000_fix_network.sql</file>
     <file>./SQL/SQLite/2/upgrade_010_update_schemaversion.sql</file>
-    <file>./SQL/SQLite/3/upgrade_000_update_backlog_flags.sql</file>
-    <file>./SQL/SQLite/3/upgrade_010_update_schemaversion.sql</file>
-    <file>./SQL/SQLite/4/upgrade_000_rename_buffertable.sql</file>
-    <file>./SQL/SQLite/4/upgrade_010_create_buffertable.sql</file>
-    <file>./SQL/SQLite/4/upgrade_020_copy_buffertable.sql</file>
-    <file>./SQL/SQLite/4/upgrade_030_drop_oldbuffertable.sql</file>
-    <file>./SQL/SQLite/4/upgrade_040_create_buffer_idx.sql</file>
-    <file>./SQL/SQLite/4/upgrade_050_create_buffer_cname_idx.sql</file>
-    <file>./SQL/SQLite/5/upgrade_000_rename_networktable.sql</file>
-    <file>./SQL/SQLite/5/upgrade_010_create_newnetworktable.sql</file>
-    <file>./SQL/SQLite/5/upgrade_020_copy_networktable.sql</file>
+    <file>./SQL/SQLite/2/upgrade_000_drop_buffergroup.sql</file>
     <file>./SQL/SQLite/5/upgrade_030_drop_oldnetworktable.sql</file>
+    <file>./SQL/SQLite/5/upgrade_020_copy_networktable.sql</file>
+    <file>./SQL/SQLite/5/upgrade_000_rename_networktable.sql</file>
     <file>./SQL/SQLite/5/upgrade_180_create_ircservers.sql</file>
-    <file>./SQL/SQLite/6/upgrade_000_alter_buffertable.sql</file>
+    <file>./SQL/SQLite/5/upgrade_010_create_newnetworktable.sql</file>
+    <file>./SQL/SQLite/12/upgrade_050_drop_ircserverold.sql</file>
+    <file>./SQL/SQLite/12/upgrade_030_create_ircserver.sql</file>
+    <file>./SQL/SQLite/12/upgrade_010_create_identity_nick.sql</file>
+    <file>./SQL/SQLite/12/upgrade_040_copy_ircserver.sql</file>
+    <file>./SQL/SQLite/12/upgrade_000_create_identity.sql</file>
+    <file>./SQL/SQLite/12/upgrade_020_rename_servertable.sql</file>
+    <file>./SQL/SQLite/14/upgrade_000_rename_networktable.sql</file>
+    <file>./SQL/SQLite/14/upgrade_040_drop_networkold.sql</file>
+    <file>./SQL/SQLite/14/upgrade_010_create_networktable.sql</file>
+    <file>./SQL/SQLite/14/upgrade_030_copy_networktable.sql</file>
+    <file>./SQL/SQLite/13/upgrade_000_create_buffer_user_idx.sql</file>
+    <file>./SQL/SQLite/13/upgrade_020_create_buffer_cname_idx.sql</file>
+    <file>./SQL/SQLite/13/upgrade_010_create_buffer_cname_idx.sql</file>
+    <file>./SQL/SQLite/11/upgrade_000_create_user_setting.sql</file>
+    <file>./SQL/SQLite/3/upgrade_010_update_schemaversion.sql</file>
+    <file>./SQL/SQLite/3/upgrade_000_update_backlog_flags.sql</file>
+    <file>./SQL/SQLite/8/upgrade_000_alter_network_add_connected.sql</file>
+    <file>./SQL/SQLite/8/upgrade_020_alter_buffer_add_joined.sql</file>
+    <file>./SQL/SQLite/8/upgrade_010_alter_buffer_add_key.sql</file>
+    <file>./SQL/SQLite/8/upgrade_030_update_buffer_set_joined_for_channels.sql</file>
     <file>./SQL/SQLite/6/upgrade_010_set_statusbuffertype.sql</file>
-    <file>./SQL/SQLite/6/upgrade_020_set_channelbuffertype.sql</file>
-    <file>./SQL/SQLite/6/upgrade_030_set_querybuffertype.sql</file>
-    <file>./SQL/SQLite/6/upgrade_040_update_msgtype.sql</file>
-    <file>./SQL/SQLite/6/upgrade_050_update_msgtype.sql</file>
+    <file>./SQL/SQLite/6/upgrade_080_update_msgtype.sql</file>
+    <file>./SQL/SQLite/6/upgrade_000_alter_buffertable.sql</file>
     <file>./SQL/SQLite/6/upgrade_060_update_msgtype.sql</file>
+    <file>./SQL/SQLite/6/upgrade_050_update_msgtype.sql</file>
+    <file>./SQL/SQLite/6/upgrade_150_update_msgtype.sql</file>
+    <file>./SQL/SQLite/6/upgrade_100_update_msgtype.sql</file>
+    <file>./SQL/SQLite/6/upgrade_040_update_msgtype.sql</file>
+    <file>./SQL/SQLite/6/upgrade_130_update_msgtype.sql</file>
+    <file>./SQL/SQLite/6/upgrade_160_update_msgtype.sql</file>
+    <file>./SQL/SQLite/6/upgrade_020_set_channelbuffertype.sql</file>
     <file>./SQL/SQLite/6/upgrade_070_update_msgtype.sql</file>
-    <file>./SQL/SQLite/6/upgrade_080_update_msgtype.sql</file>
     <file>./SQL/SQLite/6/upgrade_090_update_msgtype.sql</file>
-    <file>./SQL/SQLite/6/upgrade_100_update_msgtype.sql</file>
-    <file>./SQL/SQLite/6/upgrade_110_update_msgtype.sql</file>
+    <file>./SQL/SQLite/6/upgrade_030_set_querybuffertype.sql</file>
     <file>./SQL/SQLite/6/upgrade_120_update_msgtype.sql</file>
-    <file>./SQL/SQLite/6/upgrade_130_update_msgtype.sql</file>
+    <file>./SQL/SQLite/6/upgrade_110_update_msgtype.sql</file>
     <file>./SQL/SQLite/6/upgrade_140_update_msgtype.sql</file>
-    <file>./SQL/SQLite/6/upgrade_150_update_msgtype.sql</file>
-    <file>./SQL/SQLite/6/upgrade_160_update_msgtype.sql</file>
+    <file>./SQL/SQLite/4/upgrade_010_create_buffertable.sql</file>
+    <file>./SQL/SQLite/4/upgrade_040_create_buffer_idx.sql</file>
+    <file>./SQL/SQLite/4/upgrade_020_copy_buffertable.sql</file>
+    <file>./SQL/SQLite/4/upgrade_030_drop_oldbuffertable.sql</file>
+    <file>./SQL/SQLite/4/upgrade_000_rename_buffertable.sql</file>
+    <file>./SQL/SQLite/4/upgrade_050_create_buffer_cname_idx.sql</file>
+    <file>./SQL/SQLite/7/upgrade_030_drop_oldnetworktable.sql</file>
+    <file>./SQL/SQLite/7/upgrade_020_copy_networktable.sql</file>
     <file>./SQL/SQLite/7/upgrade_000_rename_networktable.sql</file>
     <file>./SQL/SQLite/7/upgrade_010_create_newnetworktable.sql</file>
-    <file>./SQL/SQLite/7/upgrade_020_copy_networktable.sql</file>
-    <file>./SQL/SQLite/7/upgrade_030_drop_oldnetworktable.sql</file>
     <file>./SQL/SQLite/7/upgrade_040_alter_buffer_add_lastseen.sql</file>
-    <file>./SQL/SQLite/8/upgrade_000_alter_network_add_connected.sql</file>
-    <file>./SQL/SQLite/8/upgrade_010_alter_buffer_add_key.sql</file>
-    <file>./SQL/SQLite/8/upgrade_020_alter_buffer_add_joined.sql</file>
-    <file>./SQL/SQLite/8/upgrade_030_update_buffer_set_joined_for_channels.sql</file>
-    <file>./SQL/SQLite/9/upgrade_000_create_backlog_idx.sql</file>
-    <file>./SQL/SQLite/9/upgrade_010_create_backlog_idx2.sql</file>
+    <file>./SQL/SQLite/1/upgrade_010_create_coreinfo.sql</file>
+    <file>./SQL/SQLite/1/upgrade_020_update_schemaversion.sql</file>
+    <file>./SQL/SQLite/1/upgrade_000_drop_coreinfo.sql</file>
+    <file>./SQL/SQLite/10/upgrade_040_drop_buffer_old_table.sql</file>
+    <file>./SQL/SQLite/10/upgrade_030_copy_buffer_table.sql</file>
+    <file>./SQL/SQLite/10/upgrade_000_switch_to_msgid.sql</file>
+    <file>./SQL/SQLite/10/upgrade_020_create_buffer_table.sql</file>
+    <file>./SQL/SQLite/10/upgrade_010_rename_buffer_table.sql</file>
     <file>./SQL/SQLite/9/upgrade_020_create_buffer_idx.sql</file>
+    <file>./SQL/SQLite/9/upgrade_010_create_backlog_idx2.sql</file>
+    <file>./SQL/SQLite/9/upgrade_000_create_backlog_idx.sql</file>
+    <file>./SQL/PostgreSQL/16/upgrade_000_alter_network_add_sasl.sql</file>
+    <file>./SQL/PostgreSQL/17/setup_120_alter_messageid_seq.sql</file>
+    <file>./SQL/PostgreSQL/17/setup_030_identity_nick.sql</file>
+    <file>./SQL/PostgreSQL/17/update_buffer_persistent_channel.sql</file>
+    <file>./SQL/PostgreSQL/17/insert_network.sql</file>
+    <file>./SQL/PostgreSQL/17/insert_identity.sql</file>
+    <file>./SQL/PostgreSQL/17/select_checkidentity.sql</file>
+    <file>./SQL/PostgreSQL/17/update_identity.sql</file>
+    <file>./SQL/PostgreSQL/17/delete_buffer_for_bufferid.sql</file>
+    <file>./SQL/PostgreSQL/17/select_networks_for_user.sql</file>
+    <file>./SQL/PostgreSQL/17/select_networkExists.sql</file>
+    <file>./SQL/PostgreSQL/17/migrate_write_backlog.sql</file>
+    <file>./SQL/PostgreSQL/17/migrate_write_identity_nick.sql</file>
+    <file>./SQL/PostgreSQL/17/select_messagesAllNew.sql</file>
+    <file>./SQL/PostgreSQL/17/delete_ircservers_for_network.sql</file>
+    <file>./SQL/PostgreSQL/17/select_persistent_channels.sql</file>
+    <file>./SQL/PostgreSQL/17/update_buffer_set_channel_key.sql</file>
+    <file>./SQL/PostgreSQL/17/migrate_write_ircserver.sql</file>
+    <file>./SQL/PostgreSQL/17/setup_040_network.sql</file>
+    <file>./SQL/PostgreSQL/17/migrate_write_buffer.sql</file>
+    <file>./SQL/PostgreSQL/17/migrate_write_usersetting.sql</file>
+    <file>./SQL/PostgreSQL/17/setup_050_buffer.sql</file>
+    <file>./SQL/PostgreSQL/17/migrate_write_identity.sql</file>
+    <file>./SQL/PostgreSQL/17/select_messagesNewerThan.sql</file>
+    <file>./SQL/PostgreSQL/17/setup_070_coreinfo.sql</file>
+    <file>./SQL/PostgreSQL/17/insert_nick.sql</file>
+    <file>./SQL/PostgreSQL/17/select_messagesAll.sql</file>
+    <file>./SQL/PostgreSQL/17/delete_identity.sql</file>
+    <file>./SQL/PostgreSQL/17/setup_110_alter_sender_seq.sql</file>
+    <file>./SQL/PostgreSQL/17/select_senderid.sql</file>
+    <file>./SQL/PostgreSQL/17/select_buffer_markerlinemsgids.sql</file>
+    <file>./SQL/PostgreSQL/17/select_buffer_lastseen_messages.sql</file>
+    <file>./SQL/PostgreSQL/17/insert_sender.sql</file>
+    <file>./SQL/PostgreSQL/17/select_nicks.sql</file>
+    <file>./SQL/PostgreSQL/17/insert_user_setting.sql</file>
+    <file>./SQL/PostgreSQL/17/setup_020_identity.sql</file>
+    <file>./SQL/PostgreSQL/17/delete_buffers_for_network.sql</file>
+    <file>./SQL/PostgreSQL/17/select_messages.sql</file>
+    <file>./SQL/PostgreSQL/17/select_buffers.sql</file>
+    <file>./SQL/PostgreSQL/17/select_userid.sql</file>
+    <file>./SQL/PostgreSQL/17/update_network.sql</file>
+    <file>./SQL/PostgreSQL/17/setup_010_sender.sql</file>
+    <file>./SQL/PostgreSQL/17/delete_quasseluser.sql</file>
+    <file>./SQL/PostgreSQL/17/select_network_usermode.sql</file>
+    <file>./SQL/PostgreSQL/17/update_userpassword.sql</file>
+    <file>./SQL/PostgreSQL/17/select_identities.sql</file>
+    <file>./SQL/PostgreSQL/17/setup_000_quasseluser.sql</file>
+    <file>./SQL/PostgreSQL/17/setup_080_ircservers.sql</file>
+    <file>./SQL/PostgreSQL/17/delete_nicks.sql</file>
+    <file>./SQL/PostgreSQL/17/migrate_write_quasseluser.sql</file>
+    <file>./SQL/PostgreSQL/17/delete_network.sql</file>
+    <file>./SQL/PostgreSQL/17/select_servers_for_network.sql</file>
+    <file>./SQL/PostgreSQL/17/select_connected_networks.sql</file>
+    <file>./SQL/PostgreSQL/17/update_network_connected.sql</file>
+    <file>./SQL/PostgreSQL/17/select_messagesRange.sql</file>
+    <file>./SQL/PostgreSQL/17/delete_backlog_for_network.sql</file>
+    <file>./SQL/PostgreSQL/17/setup_060_backlog.sql</file>
+    <file>./SQL/PostgreSQL/17/update_username.sql</file>
+    <file>./SQL/PostgreSQL/17/insert_message.sql</file>
+    <file>./SQL/PostgreSQL/17/select_buffer_by_id.sql</file>
+    <file>./SQL/PostgreSQL/17/update_user_setting.sql</file>
+    <file>./SQL/PostgreSQL/17/update_buffer_name.sql</file>
+    <file>./SQL/PostgreSQL/17/select_bufferExists.sql</file>
+    <file>./SQL/PostgreSQL/17/select_buffers_for_network.sql</file>
+    <file>./SQL/PostgreSQL/17/delete_backlog_by_uid.sql</file>
+    <file>./SQL/PostgreSQL/17/select_internaluser.sql</file>
+    <file>./SQL/PostgreSQL/17/select_network_awaymsg.sql</file>
+    <file>./SQL/PostgreSQL/17/setup_090_backlog_idx.sql</file>
+    <file>./SQL/PostgreSQL/17/insert_quasseluser.sql</file>
+    <file>./SQL/PostgreSQL/17/update_network_set_usermode.sql</file>
+    <file>./SQL/PostgreSQL/17/delete_backlog_for_buffer.sql</file>
+    <file>./SQL/PostgreSQL/17/update_network_set_awaymsg.sql</file>
+    <file>./SQL/PostgreSQL/17/upgrade_000_alter_quasseluser_add_passwordversion.sql</file>
+    <file>./SQL/PostgreSQL/17/update_backlog_bufferid.sql</file>
+    <file>./SQL/PostgreSQL/17/update_buffer_markerlinemsgid.sql</file>
+    <file>./SQL/PostgreSQL/17/update_buffer_lastseen.sql</file>
+    <file>./SQL/PostgreSQL/17/insert_buffer.sql</file>
+    <file>./SQL/PostgreSQL/17/select_authuser.sql</file>
+    <file>./SQL/PostgreSQL/17/select_user_setting.sql</file>
+    <file>./SQL/PostgreSQL/17/migrate_write_network.sql</file>
+    <file>./SQL/PostgreSQL/17/select_bufferByName.sql</file>
+    <file>./SQL/PostgreSQL/17/insert_server.sql</file>
+    <file>./SQL/PostgreSQL/17/delete_networks_by_uid.sql</file>
+    <file>./SQL/PostgreSQL/17/migrate_write_sender.sql</file>
+    <file>./SQL/PostgreSQL/17/delete_buffers_by_uid.sql</file>
+    <file>./SQL/PostgreSQL/17/setup_100_user_setting.sql</file>
+    <file>./SQL/PostgreSQL/15/upgrade_000_alter_buffer_add_markerlinemsgid.sql</file>
 </qresource>
 </RCC>
index 837e6b8..0b640f4 100644 (file)
@@ -129,7 +129,8 @@ UserId SqliteStorage::addUser(const QString &user, const QString &password)
         QSqlQuery query(db);
         query.prepare(queryString("insert_quasseluser"));
         query.bindValue(":username", user);
-        query.bindValue(":password", cryptedPassword(password));
+        query.bindValue(":password", hashPassword(password));
+        query.bindValue(":hashversion", Storage::HashVersion::latest);
         lockForWrite();
         safeExec(query);
         if (query.lastError().isValid() && query.lastError().number() == 19) { // user already exists - sadly 19 seems to be the general constraint violation error...
@@ -158,7 +159,8 @@ bool SqliteStorage::updateUser(UserId user, const QString &password)
         QSqlQuery query(db);
         query.prepare(queryString("update_userpassword"));
         query.bindValue(":userid", user.toInt());
-        query.bindValue(":password", cryptedPassword(password));
+        query.bindValue(":password", hashPassword(password));
+        query.bindValue(":hashversion", Storage::HashVersion::latest);
         lockForWrite();
         safeExec(query);
         success = query.numRowsAffected() != 0;
@@ -190,23 +192,30 @@ void SqliteStorage::renameUser(UserId user, const QString &newName)
 UserId SqliteStorage::validateUser(const QString &user, const QString &password)
 {
     UserId userId;
+    QString hashedPassword;
+    Storage::HashVersion hashVersion;
 
     {
         QSqlQuery query(logDb());
         query.prepare(queryString("select_authuser"));
         query.bindValue(":username", user);
-        query.bindValue(":password", cryptedPassword(password));
 
         lockForRead();
         safeExec(query);
 
         if (query.first()) {
             userId = query.value(0).toInt();
+            hashedPassword = query.value(1).toString();
+            hashVersion = static_cast<Storage::HashVersion>(query.value(2).toInt());
         }
     }
     unlock();
 
-    return userId;
+    UserId returnUserId;
+    if (userId != 0 && checkHashedPassword(userId, password, hashedPassword, hashVersion)) {
+        returnUserId = userId;
+    }
+    return returnUserId;
 }
 
 
index 2e81de6..4a84e9b 100644 (file)
@@ -27,8 +27,37 @@ Storage::Storage(QObject *parent)
 {
 }
 
+QString Storage::hashPassword(const QString &password)
+{
+    return hashPasswordSha1(password);
+}
 
-QString Storage::cryptedPassword(const QString &password)
+bool Storage::checkHashedPassword(const UserId user, const QString &password, const QString &hashedPassword, const Storage::HashVersion version)
+{
+    bool passwordCorrect = false;
+    
+    switch (version) {
+    case Storage::HashVersion::sha1:
+        passwordCorrect = checkHashedPasswordSha1(password, hashedPassword);
+        break;
+
+    default:
+        qWarning() << "Password hash version" << QString(version) << "is not supported, please reset password";
+    }
+    
+    if (passwordCorrect && version < Storage::HashVersion::latest) {
+        updateUser(user, password);
+    }
+    
+    return passwordCorrect;
+}
+
+QString Storage::hashPasswordSha1(const QString &password)
 {
     return QString(QCryptographicHash::hash(password.toUtf8(), QCryptographicHash::Sha1).toHex());
 }
+
+bool Storage::checkHashedPasswordSha1(const QString &password, const QString &hashedPassword)
+{
+    return hashPasswordSha1(password) == hashedPassword;
+}
index 9984d31..9371529 100644 (file)
@@ -42,6 +42,11 @@ public:
         NotAvailable // remove the storage backend from the list of avaliable backends
     };
 
+    enum HashVersion {
+        sha1,
+        latest=sha1
+    };
+
 public slots:
     /* General */
 
@@ -408,10 +413,12 @@ signals:
     void userRemoved(UserId);
 
 protected:
-    //! when implementing a storage handler, use this method to crypt user passwords.
-    /**  This guarantees compatibility with other storage handlers and allows easy migration
-     */
-    QString cryptedPassword(const QString &password);
+    QString hashPassword(const QString &password);
+    bool checkHashedPassword(const UserId user, const QString &password, const QString &hashedPassword, const Storage::HashVersion version);
+
+private:
+    QString hashPasswordSha1(const QString &password);
+    bool checkHashedPasswordSha1(const QString &password, const QString &hashedPassword);
 };