From: Manuel Nickschas Date: Wed, 11 Mar 2015 19:43:25 +0000 (+0100) Subject: Merge pull request #116 from mamarley/splitfix2 X-Git-Tag: 0.12-rc1~2 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=d0e9b7a1d5e73041ade519189eea012500440ba9;hp=b5e38970ffd55e2dd9f706ce75af9a8d7730b1b8 Merge pull request #116 from mamarley/splitfix2 Improve the message-splitting algorithm for PRIVMSG and CTCP --- diff --git a/3rdparty/sha512/sha512.c b/3rdparty/sha512/sha512.c new file mode 100644 index 00000000..742d5562 --- /dev/null +++ b/3rdparty/sha512/sha512.c @@ -0,0 +1,797 @@ +/* + * FIPS-180-2 compliant SHA-384/512 implementation + * + * Copyright (C) 2006-2014, ARM Limited, All Rights Reserved + * + * This file is part of mbed TLS (https://polarssl.org) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +/* + * The SHA-512 Secure Hash Standard was published by NIST in 2002. + * + * http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf + */ + +// Don't include polarssl/config.h since we are compiling outside of PolarSSL +/* +#if !defined(POLARSSL_CONFIG_FILE) +#include "polarssl/config.h" +#else +#include POLARSSL_CONFIG_FILE +#endif +*/ + +// Don't require defining POLARSSL_SHA512_C +//#if defined(POLARSSL_SHA512_C) + +#include "sha512.h" + +#if defined(POLARSSL_FS_IO) || defined(POLARSSL_SELF_TEST) +#include +#endif + +#if defined(POLARSSL_PLATFORM_C) +#include "polarssl/platform.h" +#else +#define polarssl_printf printf +#endif + +/* Implementation that should never be optimized out by the compiler */ +static void polarssl_zeroize( void *v, size_t n ) { + volatile unsigned char *p = v; while( n-- ) *p++ = 0; +} + +#if !defined(POLARSSL_SHA512_ALT) + +/* + * 64-bit integer manipulation macros (big endian) + */ +#ifndef GET_UINT64_BE +#define GET_UINT64_BE(n,b,i) \ +{ \ + (n) = ( (uint64_t) (b)[(i) ] << 56 ) \ + | ( (uint64_t) (b)[(i) + 1] << 48 ) \ + | ( (uint64_t) (b)[(i) + 2] << 40 ) \ + | ( (uint64_t) (b)[(i) + 3] << 32 ) \ + | ( (uint64_t) (b)[(i) + 4] << 24 ) \ + | ( (uint64_t) (b)[(i) + 5] << 16 ) \ + | ( (uint64_t) (b)[(i) + 6] << 8 ) \ + | ( (uint64_t) (b)[(i) + 7] ); \ +} +#endif /* GET_UINT64_BE */ + +#ifndef PUT_UINT64_BE +#define PUT_UINT64_BE(n,b,i) \ +{ \ + (b)[(i) ] = (unsigned char) ( (n) >> 56 ); \ + (b)[(i) + 1] = (unsigned char) ( (n) >> 48 ); \ + (b)[(i) + 2] = (unsigned char) ( (n) >> 40 ); \ + (b)[(i) + 3] = (unsigned char) ( (n) >> 32 ); \ + (b)[(i) + 4] = (unsigned char) ( (n) >> 24 ); \ + (b)[(i) + 5] = (unsigned char) ( (n) >> 16 ); \ + (b)[(i) + 6] = (unsigned char) ( (n) >> 8 ); \ + (b)[(i) + 7] = (unsigned char) ( (n) ); \ +} +#endif /* PUT_UINT64_BE */ + +/* + * Round constants + */ +static const uint64_t K[80] = +{ + UL64(0x428A2F98D728AE22), UL64(0x7137449123EF65CD), + UL64(0xB5C0FBCFEC4D3B2F), UL64(0xE9B5DBA58189DBBC), + UL64(0x3956C25BF348B538), UL64(0x59F111F1B605D019), + UL64(0x923F82A4AF194F9B), UL64(0xAB1C5ED5DA6D8118), + UL64(0xD807AA98A3030242), UL64(0x12835B0145706FBE), + UL64(0x243185BE4EE4B28C), UL64(0x550C7DC3D5FFB4E2), + UL64(0x72BE5D74F27B896F), UL64(0x80DEB1FE3B1696B1), + UL64(0x9BDC06A725C71235), UL64(0xC19BF174CF692694), + UL64(0xE49B69C19EF14AD2), UL64(0xEFBE4786384F25E3), + UL64(0x0FC19DC68B8CD5B5), UL64(0x240CA1CC77AC9C65), + UL64(0x2DE92C6F592B0275), UL64(0x4A7484AA6EA6E483), + UL64(0x5CB0A9DCBD41FBD4), UL64(0x76F988DA831153B5), + UL64(0x983E5152EE66DFAB), UL64(0xA831C66D2DB43210), + UL64(0xB00327C898FB213F), UL64(0xBF597FC7BEEF0EE4), + UL64(0xC6E00BF33DA88FC2), UL64(0xD5A79147930AA725), + UL64(0x06CA6351E003826F), UL64(0x142929670A0E6E70), + UL64(0x27B70A8546D22FFC), UL64(0x2E1B21385C26C926), + UL64(0x4D2C6DFC5AC42AED), UL64(0x53380D139D95B3DF), + UL64(0x650A73548BAF63DE), UL64(0x766A0ABB3C77B2A8), + UL64(0x81C2C92E47EDAEE6), UL64(0x92722C851482353B), + UL64(0xA2BFE8A14CF10364), UL64(0xA81A664BBC423001), + UL64(0xC24B8B70D0F89791), UL64(0xC76C51A30654BE30), + UL64(0xD192E819D6EF5218), UL64(0xD69906245565A910), + UL64(0xF40E35855771202A), UL64(0x106AA07032BBD1B8), + UL64(0x19A4C116B8D2D0C8), UL64(0x1E376C085141AB53), + UL64(0x2748774CDF8EEB99), UL64(0x34B0BCB5E19B48A8), + UL64(0x391C0CB3C5C95A63), UL64(0x4ED8AA4AE3418ACB), + UL64(0x5B9CCA4F7763E373), UL64(0x682E6FF3D6B2B8A3), + UL64(0x748F82EE5DEFB2FC), UL64(0x78A5636F43172F60), + UL64(0x84C87814A1F0AB72), UL64(0x8CC702081A6439EC), + UL64(0x90BEFFFA23631E28), UL64(0xA4506CEBDE82BDE9), + UL64(0xBEF9A3F7B2C67915), UL64(0xC67178F2E372532B), + UL64(0xCA273ECEEA26619C), UL64(0xD186B8C721C0C207), + UL64(0xEADA7DD6CDE0EB1E), UL64(0xF57D4F7FEE6ED178), + UL64(0x06F067AA72176FBA), UL64(0x0A637DC5A2C898A6), + UL64(0x113F9804BEF90DAE), UL64(0x1B710B35131C471B), + UL64(0x28DB77F523047D84), UL64(0x32CAAB7B40C72493), + UL64(0x3C9EBE0A15C9BEBC), UL64(0x431D67C49C100D4C), + UL64(0x4CC5D4BECB3E42B6), UL64(0x597F299CFC657E2A), + UL64(0x5FCB6FAB3AD6FAEC), UL64(0x6C44198C4A475817) +}; + +void sha512_init( sha512_context *ctx ) +{ + memset( ctx, 0, sizeof( sha512_context ) ); +} + +void sha512_free( sha512_context *ctx ) +{ + if( ctx == NULL ) + return; + + polarssl_zeroize( ctx, sizeof( sha512_context ) ); +} + +/* + * SHA-512 context setup + */ +void sha512_starts( sha512_context *ctx, int is384 ) +{ + ctx->total[0] = 0; + ctx->total[1] = 0; + + if( is384 == 0 ) + { + /* SHA-512 */ + ctx->state[0] = UL64(0x6A09E667F3BCC908); + ctx->state[1] = UL64(0xBB67AE8584CAA73B); + ctx->state[2] = UL64(0x3C6EF372FE94F82B); + ctx->state[3] = UL64(0xA54FF53A5F1D36F1); + ctx->state[4] = UL64(0x510E527FADE682D1); + ctx->state[5] = UL64(0x9B05688C2B3E6C1F); + ctx->state[6] = UL64(0x1F83D9ABFB41BD6B); + ctx->state[7] = UL64(0x5BE0CD19137E2179); + } + else + { + /* SHA-384 */ + ctx->state[0] = UL64(0xCBBB9D5DC1059ED8); + ctx->state[1] = UL64(0x629A292A367CD507); + ctx->state[2] = UL64(0x9159015A3070DD17); + ctx->state[3] = UL64(0x152FECD8F70E5939); + ctx->state[4] = UL64(0x67332667FFC00B31); + ctx->state[5] = UL64(0x8EB44A8768581511); + ctx->state[6] = UL64(0xDB0C2E0D64F98FA7); + ctx->state[7] = UL64(0x47B5481DBEFA4FA4); + } + + ctx->is384 = is384; +} + +void sha512_process( sha512_context *ctx, const unsigned char data[128] ) +{ + int i; + uint64_t temp1, temp2, W[80]; + uint64_t A, B, C, D, E, F, G, H; + +#define SHR(x,n) (x >> n) +#define ROTR(x,n) (SHR(x,n) | (x << (64 - n))) + +#define S0(x) (ROTR(x, 1) ^ ROTR(x, 8) ^ SHR(x, 7)) +#define S1(x) (ROTR(x,19) ^ ROTR(x,61) ^ SHR(x, 6)) + +#define S2(x) (ROTR(x,28) ^ ROTR(x,34) ^ ROTR(x,39)) +#define S3(x) (ROTR(x,14) ^ ROTR(x,18) ^ ROTR(x,41)) + +#define F0(x,y,z) ((x & y) | (z & (x | y))) +#define F1(x,y,z) (z ^ (x & (y ^ z))) + +#define P(a,b,c,d,e,f,g,h,x,K) \ +{ \ + temp1 = h + S3(e) + F1(e,f,g) + K + x; \ + temp2 = S2(a) + F0(a,b,c); \ + d += temp1; h = temp1 + temp2; \ +} + + for( i = 0; i < 16; i++ ) + { + GET_UINT64_BE( W[i], data, i << 3 ); + } + + for( ; i < 80; i++ ) + { + W[i] = S1(W[i - 2]) + W[i - 7] + + S0(W[i - 15]) + W[i - 16]; + } + + A = ctx->state[0]; + B = ctx->state[1]; + C = ctx->state[2]; + D = ctx->state[3]; + E = ctx->state[4]; + F = ctx->state[5]; + G = ctx->state[6]; + H = ctx->state[7]; + i = 0; + + do + { + P( A, B, C, D, E, F, G, H, W[i], K[i] ); i++; + P( H, A, B, C, D, E, F, G, W[i], K[i] ); i++; + P( G, H, A, B, C, D, E, F, W[i], K[i] ); i++; + P( F, G, H, A, B, C, D, E, W[i], K[i] ); i++; + P( E, F, G, H, A, B, C, D, W[i], K[i] ); i++; + P( D, E, F, G, H, A, B, C, W[i], K[i] ); i++; + P( C, D, E, F, G, H, A, B, W[i], K[i] ); i++; + P( B, C, D, E, F, G, H, A, W[i], K[i] ); i++; + } + while( i < 80 ); + + ctx->state[0] += A; + ctx->state[1] += B; + ctx->state[2] += C; + ctx->state[3] += D; + ctx->state[4] += E; + ctx->state[5] += F; + ctx->state[6] += G; + ctx->state[7] += H; +} + +/* + * SHA-512 process buffer + */ +void sha512_update( sha512_context *ctx, const unsigned char *input, + size_t ilen ) +{ + size_t fill; + unsigned int left; + + if( ilen == 0 ) + return; + + left = (unsigned int) (ctx->total[0] & 0x7F); + fill = 128 - left; + + ctx->total[0] += (uint64_t) ilen; + + if( ctx->total[0] < (uint64_t) ilen ) + ctx->total[1]++; + + if( left && ilen >= fill ) + { + memcpy( (void *) (ctx->buffer + left), input, fill ); + sha512_process( ctx, ctx->buffer ); + input += fill; + ilen -= fill; + left = 0; + } + + while( ilen >= 128 ) + { + sha512_process( ctx, input ); + input += 128; + ilen -= 128; + } + + if( ilen > 0 ) + memcpy( (void *) (ctx->buffer + left), input, ilen ); +} + +static const unsigned char sha512_padding[128] = +{ + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +/* + * SHA-512 final digest + */ +void sha512_finish( sha512_context *ctx, unsigned char output[64] ) +{ + size_t last, padn; + uint64_t high, low; + unsigned char msglen[16]; + + high = ( ctx->total[0] >> 61 ) + | ( ctx->total[1] << 3 ); + low = ( ctx->total[0] << 3 ); + + PUT_UINT64_BE( high, msglen, 0 ); + PUT_UINT64_BE( low, msglen, 8 ); + + last = (size_t)( ctx->total[0] & 0x7F ); + padn = ( last < 112 ) ? ( 112 - last ) : ( 240 - last ); + + sha512_update( ctx, sha512_padding, padn ); + sha512_update( ctx, msglen, 16 ); + + PUT_UINT64_BE( ctx->state[0], output, 0 ); + PUT_UINT64_BE( ctx->state[1], output, 8 ); + PUT_UINT64_BE( ctx->state[2], output, 16 ); + PUT_UINT64_BE( ctx->state[3], output, 24 ); + PUT_UINT64_BE( ctx->state[4], output, 32 ); + PUT_UINT64_BE( ctx->state[5], output, 40 ); + + if( ctx->is384 == 0 ) + { + PUT_UINT64_BE( ctx->state[6], output, 48 ); + PUT_UINT64_BE( ctx->state[7], output, 56 ); + } +} + +#endif /* !POLARSSL_SHA512_ALT */ + +/* + * output = SHA-512( input buffer ) + */ +void sha512( const unsigned char *input, size_t ilen, + unsigned char output[64], int is384 ) +{ + sha512_context ctx; + + sha512_init( &ctx ); + sha512_starts( &ctx, is384 ); + sha512_update( &ctx, input, ilen ); + sha512_finish( &ctx, output ); + sha512_free( &ctx ); +} + +#if defined(POLARSSL_FS_IO) +/* + * output = SHA-512( file contents ) + */ +int sha512_file( const char *path, unsigned char output[64], int is384 ) +{ + FILE *f; + size_t n; + sha512_context ctx; + unsigned char buf[1024]; + + if( ( f = fopen( path, "rb" ) ) == NULL ) + return( POLARSSL_ERR_SHA512_FILE_IO_ERROR ); + + sha512_init( &ctx ); + sha512_starts( &ctx, is384 ); + + while( ( n = fread( buf, 1, sizeof( buf ), f ) ) > 0 ) + sha512_update( &ctx, buf, n ); + + sha512_finish( &ctx, output ); + sha512_free( &ctx ); + + if( ferror( f ) != 0 ) + { + fclose( f ); + return( POLARSSL_ERR_SHA512_FILE_IO_ERROR ); + } + + fclose( f ); + return( 0 ); +} +#endif /* POLARSSL_FS_IO */ + +/* + * SHA-512 HMAC context setup + */ +void sha512_hmac_starts( sha512_context *ctx, const unsigned char *key, + size_t keylen, int is384 ) +{ + size_t i; + unsigned char sum[64]; + + if( keylen > 128 ) + { + sha512( key, keylen, sum, is384 ); + keylen = ( is384 ) ? 48 : 64; + key = sum; + } + + memset( ctx->ipad, 0x36, 128 ); + memset( ctx->opad, 0x5C, 128 ); + + for( i = 0; i < keylen; i++ ) + { + ctx->ipad[i] = (unsigned char)( ctx->ipad[i] ^ key[i] ); + ctx->opad[i] = (unsigned char)( ctx->opad[i] ^ key[i] ); + } + + sha512_starts( ctx, is384 ); + sha512_update( ctx, ctx->ipad, 128 ); + + polarssl_zeroize( sum, sizeof( sum ) ); +} + +/* + * SHA-512 HMAC process buffer + */ +void sha512_hmac_update( sha512_context *ctx, + const unsigned char *input, size_t ilen ) +{ + sha512_update( ctx, input, ilen ); +} + +/* + * SHA-512 HMAC final digest + */ +void sha512_hmac_finish( sha512_context *ctx, unsigned char output[64] ) +{ + int is384, hlen; + unsigned char tmpbuf[64]; + + is384 = ctx->is384; + hlen = ( is384 == 0 ) ? 64 : 48; + + sha512_finish( ctx, tmpbuf ); + sha512_starts( ctx, is384 ); + sha512_update( ctx, ctx->opad, 128 ); + sha512_update( ctx, tmpbuf, hlen ); + sha512_finish( ctx, output ); + + polarssl_zeroize( tmpbuf, sizeof( tmpbuf ) ); +} + +/* + * SHA-512 HMAC context reset + */ +void sha512_hmac_reset( sha512_context *ctx ) +{ + sha512_starts( ctx, ctx->is384 ); + sha512_update( ctx, ctx->ipad, 128 ); +} + +/* + * output = HMAC-SHA-512( hmac key, input buffer ) + */ +void sha512_hmac( const unsigned char *key, size_t keylen, + const unsigned char *input, size_t ilen, + unsigned char output[64], int is384 ) +{ + sha512_context ctx; + + sha512_init( &ctx ); + sha512_hmac_starts( &ctx, key, keylen, is384 ); + sha512_hmac_update( &ctx, input, ilen ); + sha512_hmac_finish( &ctx, output ); + sha512_free( &ctx ); +} + +#if defined(POLARSSL_SELF_TEST) + +/* + * FIPS-180-2 test vectors + */ +static unsigned char sha512_test_buf[3][113] = +{ + { "abc" }, + { "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn" + "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu" }, + { "" } +}; + +static const int sha512_test_buflen[3] = +{ + 3, 112, 1000 +}; + +static const unsigned char sha512_test_sum[6][64] = +{ + /* + * SHA-384 test vectors + */ + { 0xCB, 0x00, 0x75, 0x3F, 0x45, 0xA3, 0x5E, 0x8B, + 0xB5, 0xA0, 0x3D, 0x69, 0x9A, 0xC6, 0x50, 0x07, + 0x27, 0x2C, 0x32, 0xAB, 0x0E, 0xDE, 0xD1, 0x63, + 0x1A, 0x8B, 0x60, 0x5A, 0x43, 0xFF, 0x5B, 0xED, + 0x80, 0x86, 0x07, 0x2B, 0xA1, 0xE7, 0xCC, 0x23, + 0x58, 0xBA, 0xEC, 0xA1, 0x34, 0xC8, 0x25, 0xA7 }, + { 0x09, 0x33, 0x0C, 0x33, 0xF7, 0x11, 0x47, 0xE8, + 0x3D, 0x19, 0x2F, 0xC7, 0x82, 0xCD, 0x1B, 0x47, + 0x53, 0x11, 0x1B, 0x17, 0x3B, 0x3B, 0x05, 0xD2, + 0x2F, 0xA0, 0x80, 0x86, 0xE3, 0xB0, 0xF7, 0x12, + 0xFC, 0xC7, 0xC7, 0x1A, 0x55, 0x7E, 0x2D, 0xB9, + 0x66, 0xC3, 0xE9, 0xFA, 0x91, 0x74, 0x60, 0x39 }, + { 0x9D, 0x0E, 0x18, 0x09, 0x71, 0x64, 0x74, 0xCB, + 0x08, 0x6E, 0x83, 0x4E, 0x31, 0x0A, 0x4A, 0x1C, + 0xED, 0x14, 0x9E, 0x9C, 0x00, 0xF2, 0x48, 0x52, + 0x79, 0x72, 0xCE, 0xC5, 0x70, 0x4C, 0x2A, 0x5B, + 0x07, 0xB8, 0xB3, 0xDC, 0x38, 0xEC, 0xC4, 0xEB, + 0xAE, 0x97, 0xDD, 0xD8, 0x7F, 0x3D, 0x89, 0x85 }, + + /* + * SHA-512 test vectors + */ + { 0xDD, 0xAF, 0x35, 0xA1, 0x93, 0x61, 0x7A, 0xBA, + 0xCC, 0x41, 0x73, 0x49, 0xAE, 0x20, 0x41, 0x31, + 0x12, 0xE6, 0xFA, 0x4E, 0x89, 0xA9, 0x7E, 0xA2, + 0x0A, 0x9E, 0xEE, 0xE6, 0x4B, 0x55, 0xD3, 0x9A, + 0x21, 0x92, 0x99, 0x2A, 0x27, 0x4F, 0xC1, 0xA8, + 0x36, 0xBA, 0x3C, 0x23, 0xA3, 0xFE, 0xEB, 0xBD, + 0x45, 0x4D, 0x44, 0x23, 0x64, 0x3C, 0xE8, 0x0E, + 0x2A, 0x9A, 0xC9, 0x4F, 0xA5, 0x4C, 0xA4, 0x9F }, + { 0x8E, 0x95, 0x9B, 0x75, 0xDA, 0xE3, 0x13, 0xDA, + 0x8C, 0xF4, 0xF7, 0x28, 0x14, 0xFC, 0x14, 0x3F, + 0x8F, 0x77, 0x79, 0xC6, 0xEB, 0x9F, 0x7F, 0xA1, + 0x72, 0x99, 0xAE, 0xAD, 0xB6, 0x88, 0x90, 0x18, + 0x50, 0x1D, 0x28, 0x9E, 0x49, 0x00, 0xF7, 0xE4, + 0x33, 0x1B, 0x99, 0xDE, 0xC4, 0xB5, 0x43, 0x3A, + 0xC7, 0xD3, 0x29, 0xEE, 0xB6, 0xDD, 0x26, 0x54, + 0x5E, 0x96, 0xE5, 0x5B, 0x87, 0x4B, 0xE9, 0x09 }, + { 0xE7, 0x18, 0x48, 0x3D, 0x0C, 0xE7, 0x69, 0x64, + 0x4E, 0x2E, 0x42, 0xC7, 0xBC, 0x15, 0xB4, 0x63, + 0x8E, 0x1F, 0x98, 0xB1, 0x3B, 0x20, 0x44, 0x28, + 0x56, 0x32, 0xA8, 0x03, 0xAF, 0xA9, 0x73, 0xEB, + 0xDE, 0x0F, 0xF2, 0x44, 0x87, 0x7E, 0xA6, 0x0A, + 0x4C, 0xB0, 0x43, 0x2C, 0xE5, 0x77, 0xC3, 0x1B, + 0xEB, 0x00, 0x9C, 0x5C, 0x2C, 0x49, 0xAA, 0x2E, + 0x4E, 0xAD, 0xB2, 0x17, 0xAD, 0x8C, 0xC0, 0x9B } +}; + +/* + * RFC 4231 test vectors + */ +static unsigned char sha512_hmac_test_key[7][26] = +{ + { "\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B" + "\x0B\x0B\x0B\x0B" }, + { "Jefe" }, + { "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" + "\xAA\xAA\xAA\xAA" }, + { "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10" + "\x11\x12\x13\x14\x15\x16\x17\x18\x19" }, + { "\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C" + "\x0C\x0C\x0C\x0C" }, + { "" }, /* 0xAA 131 times */ + { "" } +}; + +static const int sha512_hmac_test_keylen[7] = +{ + 20, 4, 20, 25, 20, 131, 131 +}; + +static unsigned char sha512_hmac_test_buf[7][153] = +{ + { "Hi There" }, + { "what do ya want for nothing?" }, + { "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD" + "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD" + "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD" + "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD" + "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD" }, + { "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD" + "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD" + "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD" + "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD" + "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD" }, + { "Test With Truncation" }, + { "Test Using Larger Than Block-Size Key - Hash Key First" }, + { "This is a test using a larger than block-size key " + "and a larger than block-size data. The key needs to " + "be hashed before being used by the HMAC algorithm." } +}; + +static const int sha512_hmac_test_buflen[7] = +{ + 8, 28, 50, 50, 20, 54, 152 +}; + +static const unsigned char sha512_hmac_test_sum[14][64] = +{ + /* + * HMAC-SHA-384 test vectors + */ + { 0xAF, 0xD0, 0x39, 0x44, 0xD8, 0x48, 0x95, 0x62, + 0x6B, 0x08, 0x25, 0xF4, 0xAB, 0x46, 0x90, 0x7F, + 0x15, 0xF9, 0xDA, 0xDB, 0xE4, 0x10, 0x1E, 0xC6, + 0x82, 0xAA, 0x03, 0x4C, 0x7C, 0xEB, 0xC5, 0x9C, + 0xFA, 0xEA, 0x9E, 0xA9, 0x07, 0x6E, 0xDE, 0x7F, + 0x4A, 0xF1, 0x52, 0xE8, 0xB2, 0xFA, 0x9C, 0xB6 }, + { 0xAF, 0x45, 0xD2, 0xE3, 0x76, 0x48, 0x40, 0x31, + 0x61, 0x7F, 0x78, 0xD2, 0xB5, 0x8A, 0x6B, 0x1B, + 0x9C, 0x7E, 0xF4, 0x64, 0xF5, 0xA0, 0x1B, 0x47, + 0xE4, 0x2E, 0xC3, 0x73, 0x63, 0x22, 0x44, 0x5E, + 0x8E, 0x22, 0x40, 0xCA, 0x5E, 0x69, 0xE2, 0xC7, + 0x8B, 0x32, 0x39, 0xEC, 0xFA, 0xB2, 0x16, 0x49 }, + { 0x88, 0x06, 0x26, 0x08, 0xD3, 0xE6, 0xAD, 0x8A, + 0x0A, 0xA2, 0xAC, 0xE0, 0x14, 0xC8, 0xA8, 0x6F, + 0x0A, 0xA6, 0x35, 0xD9, 0x47, 0xAC, 0x9F, 0xEB, + 0xE8, 0x3E, 0xF4, 0xE5, 0x59, 0x66, 0x14, 0x4B, + 0x2A, 0x5A, 0xB3, 0x9D, 0xC1, 0x38, 0x14, 0xB9, + 0x4E, 0x3A, 0xB6, 0xE1, 0x01, 0xA3, 0x4F, 0x27 }, + { 0x3E, 0x8A, 0x69, 0xB7, 0x78, 0x3C, 0x25, 0x85, + 0x19, 0x33, 0xAB, 0x62, 0x90, 0xAF, 0x6C, 0xA7, + 0x7A, 0x99, 0x81, 0x48, 0x08, 0x50, 0x00, 0x9C, + 0xC5, 0x57, 0x7C, 0x6E, 0x1F, 0x57, 0x3B, 0x4E, + 0x68, 0x01, 0xDD, 0x23, 0xC4, 0xA7, 0xD6, 0x79, + 0xCC, 0xF8, 0xA3, 0x86, 0xC6, 0x74, 0xCF, 0xFB }, + { 0x3A, 0xBF, 0x34, 0xC3, 0x50, 0x3B, 0x2A, 0x23, + 0xA4, 0x6E, 0xFC, 0x61, 0x9B, 0xAE, 0xF8, 0x97 }, + { 0x4E, 0xCE, 0x08, 0x44, 0x85, 0x81, 0x3E, 0x90, + 0x88, 0xD2, 0xC6, 0x3A, 0x04, 0x1B, 0xC5, 0xB4, + 0x4F, 0x9E, 0xF1, 0x01, 0x2A, 0x2B, 0x58, 0x8F, + 0x3C, 0xD1, 0x1F, 0x05, 0x03, 0x3A, 0xC4, 0xC6, + 0x0C, 0x2E, 0xF6, 0xAB, 0x40, 0x30, 0xFE, 0x82, + 0x96, 0x24, 0x8D, 0xF1, 0x63, 0xF4, 0x49, 0x52 }, + { 0x66, 0x17, 0x17, 0x8E, 0x94, 0x1F, 0x02, 0x0D, + 0x35, 0x1E, 0x2F, 0x25, 0x4E, 0x8F, 0xD3, 0x2C, + 0x60, 0x24, 0x20, 0xFE, 0xB0, 0xB8, 0xFB, 0x9A, + 0xDC, 0xCE, 0xBB, 0x82, 0x46, 0x1E, 0x99, 0xC5, + 0xA6, 0x78, 0xCC, 0x31, 0xE7, 0x99, 0x17, 0x6D, + 0x38, 0x60, 0xE6, 0x11, 0x0C, 0x46, 0x52, 0x3E }, + + /* + * HMAC-SHA-512 test vectors + */ + { 0x87, 0xAA, 0x7C, 0xDE, 0xA5, 0xEF, 0x61, 0x9D, + 0x4F, 0xF0, 0xB4, 0x24, 0x1A, 0x1D, 0x6C, 0xB0, + 0x23, 0x79, 0xF4, 0xE2, 0xCE, 0x4E, 0xC2, 0x78, + 0x7A, 0xD0, 0xB3, 0x05, 0x45, 0xE1, 0x7C, 0xDE, + 0xDA, 0xA8, 0x33, 0xB7, 0xD6, 0xB8, 0xA7, 0x02, + 0x03, 0x8B, 0x27, 0x4E, 0xAE, 0xA3, 0xF4, 0xE4, + 0xBE, 0x9D, 0x91, 0x4E, 0xEB, 0x61, 0xF1, 0x70, + 0x2E, 0x69, 0x6C, 0x20, 0x3A, 0x12, 0x68, 0x54 }, + { 0x16, 0x4B, 0x7A, 0x7B, 0xFC, 0xF8, 0x19, 0xE2, + 0xE3, 0x95, 0xFB, 0xE7, 0x3B, 0x56, 0xE0, 0xA3, + 0x87, 0xBD, 0x64, 0x22, 0x2E, 0x83, 0x1F, 0xD6, + 0x10, 0x27, 0x0C, 0xD7, 0xEA, 0x25, 0x05, 0x54, + 0x97, 0x58, 0xBF, 0x75, 0xC0, 0x5A, 0x99, 0x4A, + 0x6D, 0x03, 0x4F, 0x65, 0xF8, 0xF0, 0xE6, 0xFD, + 0xCA, 0xEA, 0xB1, 0xA3, 0x4D, 0x4A, 0x6B, 0x4B, + 0x63, 0x6E, 0x07, 0x0A, 0x38, 0xBC, 0xE7, 0x37 }, + { 0xFA, 0x73, 0xB0, 0x08, 0x9D, 0x56, 0xA2, 0x84, + 0xEF, 0xB0, 0xF0, 0x75, 0x6C, 0x89, 0x0B, 0xE9, + 0xB1, 0xB5, 0xDB, 0xDD, 0x8E, 0xE8, 0x1A, 0x36, + 0x55, 0xF8, 0x3E, 0x33, 0xB2, 0x27, 0x9D, 0x39, + 0xBF, 0x3E, 0x84, 0x82, 0x79, 0xA7, 0x22, 0xC8, + 0x06, 0xB4, 0x85, 0xA4, 0x7E, 0x67, 0xC8, 0x07, + 0xB9, 0x46, 0xA3, 0x37, 0xBE, 0xE8, 0x94, 0x26, + 0x74, 0x27, 0x88, 0x59, 0xE1, 0x32, 0x92, 0xFB }, + { 0xB0, 0xBA, 0x46, 0x56, 0x37, 0x45, 0x8C, 0x69, + 0x90, 0xE5, 0xA8, 0xC5, 0xF6, 0x1D, 0x4A, 0xF7, + 0xE5, 0x76, 0xD9, 0x7F, 0xF9, 0x4B, 0x87, 0x2D, + 0xE7, 0x6F, 0x80, 0x50, 0x36, 0x1E, 0xE3, 0xDB, + 0xA9, 0x1C, 0xA5, 0xC1, 0x1A, 0xA2, 0x5E, 0xB4, + 0xD6, 0x79, 0x27, 0x5C, 0xC5, 0x78, 0x80, 0x63, + 0xA5, 0xF1, 0x97, 0x41, 0x12, 0x0C, 0x4F, 0x2D, + 0xE2, 0xAD, 0xEB, 0xEB, 0x10, 0xA2, 0x98, 0xDD }, + { 0x41, 0x5F, 0xAD, 0x62, 0x71, 0x58, 0x0A, 0x53, + 0x1D, 0x41, 0x79, 0xBC, 0x89, 0x1D, 0x87, 0xA6 }, + { 0x80, 0xB2, 0x42, 0x63, 0xC7, 0xC1, 0xA3, 0xEB, + 0xB7, 0x14, 0x93, 0xC1, 0xDD, 0x7B, 0xE8, 0xB4, + 0x9B, 0x46, 0xD1, 0xF4, 0x1B, 0x4A, 0xEE, 0xC1, + 0x12, 0x1B, 0x01, 0x37, 0x83, 0xF8, 0xF3, 0x52, + 0x6B, 0x56, 0xD0, 0x37, 0xE0, 0x5F, 0x25, 0x98, + 0xBD, 0x0F, 0xD2, 0x21, 0x5D, 0x6A, 0x1E, 0x52, + 0x95, 0xE6, 0x4F, 0x73, 0xF6, 0x3F, 0x0A, 0xEC, + 0x8B, 0x91, 0x5A, 0x98, 0x5D, 0x78, 0x65, 0x98 }, + { 0xE3, 0x7B, 0x6A, 0x77, 0x5D, 0xC8, 0x7D, 0xBA, + 0xA4, 0xDF, 0xA9, 0xF9, 0x6E, 0x5E, 0x3F, 0xFD, + 0xDE, 0xBD, 0x71, 0xF8, 0x86, 0x72, 0x89, 0x86, + 0x5D, 0xF5, 0xA3, 0x2D, 0x20, 0xCD, 0xC9, 0x44, + 0xB6, 0x02, 0x2C, 0xAC, 0x3C, 0x49, 0x82, 0xB1, + 0x0D, 0x5E, 0xEB, 0x55, 0xC3, 0xE4, 0xDE, 0x15, + 0x13, 0x46, 0x76, 0xFB, 0x6D, 0xE0, 0x44, 0x60, + 0x65, 0xC9, 0x74, 0x40, 0xFA, 0x8C, 0x6A, 0x58 } +}; + +/* + * Checkup routine + */ +int sha512_self_test( int verbose ) +{ + int i, j, k, buflen, ret = 0; + unsigned char buf[1024]; + unsigned char sha512sum[64]; + sha512_context ctx; + + sha512_init( &ctx ); + + for( i = 0; i < 6; i++ ) + { + j = i % 3; + k = i < 3; + + if( verbose != 0 ) + polarssl_printf( " SHA-%d test #%d: ", 512 - k * 128, j + 1 ); + + sha512_starts( &ctx, k ); + + if( j == 2 ) + { + memset( buf, 'a', buflen = 1000 ); + + for( j = 0; j < 1000; j++ ) + sha512_update( &ctx, buf, buflen ); + } + else + sha512_update( &ctx, sha512_test_buf[j], + sha512_test_buflen[j] ); + + sha512_finish( &ctx, sha512sum ); + + if( memcmp( sha512sum, sha512_test_sum[i], 64 - k * 16 ) != 0 ) + { + if( verbose != 0 ) + polarssl_printf( "failed\n" ); + + ret = 1; + goto exit; + } + + if( verbose != 0 ) + polarssl_printf( "passed\n" ); + } + + if( verbose != 0 ) + polarssl_printf( "\n" ); + + for( i = 0; i < 14; i++ ) + { + j = i % 7; + k = i < 7; + + if( verbose != 0 ) + polarssl_printf( " HMAC-SHA-%d test #%d: ", 512 - k * 128, j + 1 ); + + if( j == 5 || j == 6 ) + { + memset( buf, '\xAA', buflen = 131 ); + sha512_hmac_starts( &ctx, buf, buflen, k ); + } + else + sha512_hmac_starts( &ctx, sha512_hmac_test_key[j], + sha512_hmac_test_keylen[j], k ); + + sha512_hmac_update( &ctx, sha512_hmac_test_buf[j], + sha512_hmac_test_buflen[j] ); + + sha512_hmac_finish( &ctx, sha512sum ); + + buflen = ( j == 4 ) ? 16 : 64 - k * 16; + + if( memcmp( sha512sum, sha512_hmac_test_sum[i], buflen ) != 0 ) + { + if( verbose != 0 ) + polarssl_printf( "failed\n" ); + + ret = 1; + goto exit; + } + + if( verbose != 0 ) + polarssl_printf( "passed\n" ); + } + + if( verbose != 0 ) + polarssl_printf( "\n" ); + +exit: + sha512_free( &ctx ); + + return( ret ); +} + +#endif /* POLARSSL_SELF_TEST */ + +//#endif /* POLARSSL_SHA512_C */ diff --git a/3rdparty/sha512/sha512.h b/3rdparty/sha512/sha512.h new file mode 100644 index 00000000..22ea97a6 --- /dev/null +++ b/3rdparty/sha512/sha512.h @@ -0,0 +1,209 @@ +/** + * \file sha512.h + * + * \brief SHA-384 and SHA-512 cryptographic hash function + * + * Copyright (C) 2006-2014, ARM Limited, All Rights Reserved + * + * This file is part of mbed TLS (https://polarssl.org) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#ifndef POLARSSL_SHA512_H +#define POLARSSL_SHA512_H + +// Don't include polarssl/config.h since we are compiling outside of PolarSSL +/* +#if !defined(POLARSSL_CONFIG_FILE) +#include "config.h" +#else +#include POLARSSL_CONFIG_FILE +#endif +*/ + +#include + +#if defined(_MSC_VER) || defined(__WATCOMC__) + #define UL64(x) x##ui64 + typedef unsigned __int64 uint64_t; +#else + #include + #define UL64(x) x##ULL +#endif + +#define POLARSSL_ERR_SHA512_FILE_IO_ERROR -0x007A /**< Read/write error in file. */ + +#if !defined(POLARSSL_SHA512_ALT) +// Regular implementation +// + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief SHA-512 context structure + */ +typedef struct +{ + uint64_t total[2]; /*!< number of bytes processed */ + uint64_t state[8]; /*!< intermediate digest state */ + unsigned char buffer[128]; /*!< data block being processed */ + + unsigned char ipad[128]; /*!< HMAC: inner padding */ + unsigned char opad[128]; /*!< HMAC: outer padding */ + int is384; /*!< 0 => SHA-512, else SHA-384 */ +} +sha512_context; + +/** + * \brief Initialize SHA-512 context + * + * \param ctx SHA-512 context to be initialized + */ +void sha512_init( sha512_context *ctx ); + +/** + * \brief Clear SHA-512 context + * + * \param ctx SHA-512 context to be cleared + */ +void sha512_free( sha512_context *ctx ); + +/** + * \brief SHA-512 context setup + * + * \param ctx context to be initialized + * \param is384 0 = use SHA512, 1 = use SHA384 + */ +void sha512_starts( sha512_context *ctx, int is384 ); + +/** + * \brief SHA-512 process buffer + * + * \param ctx SHA-512 context + * \param input buffer holding the data + * \param ilen length of the input data + */ +void sha512_update( sha512_context *ctx, const unsigned char *input, + size_t ilen ); + +/** + * \brief SHA-512 final digest + * + * \param ctx SHA-512 context + * \param output SHA-384/512 checksum result + */ +void sha512_finish( sha512_context *ctx, unsigned char output[64] ); + +#ifdef __cplusplus +} +#endif + +#else /* POLARSSL_SHA512_ALT */ +#include "sha512_alt.h" +#endif /* POLARSSL_SHA512_ALT */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Output = SHA-512( input buffer ) + * + * \param input buffer holding the data + * \param ilen length of the input data + * \param output SHA-384/512 checksum result + * \param is384 0 = use SHA512, 1 = use SHA384 + */ +void sha512( const unsigned char *input, size_t ilen, + unsigned char output[64], int is384 ); + +/** + * \brief Output = SHA-512( file contents ) + * + * \param path input file name + * \param output SHA-384/512 checksum result + * \param is384 0 = use SHA512, 1 = use SHA384 + * + * \return 0 if successful, or POLARSSL_ERR_SHA512_FILE_IO_ERROR + */ +int sha512_file( const char *path, unsigned char output[64], int is384 ); + +/** + * \brief SHA-512 HMAC context setup + * + * \param ctx HMAC context to be initialized + * \param is384 0 = use SHA512, 1 = use SHA384 + * \param key HMAC secret key + * \param keylen length of the HMAC key + */ +void sha512_hmac_starts( sha512_context *ctx, const unsigned char *key, + size_t keylen, int is384 ); + +/** + * \brief SHA-512 HMAC process buffer + * + * \param ctx HMAC context + * \param input buffer holding the data + * \param ilen length of the input data + */ +void sha512_hmac_update( sha512_context *ctx, const unsigned char *input, + size_t ilen ); + +/** + * \brief SHA-512 HMAC final digest + * + * \param ctx HMAC context + * \param output SHA-384/512 HMAC checksum result + */ +void sha512_hmac_finish( sha512_context *ctx, unsigned char output[64] ); + +/** + * \brief SHA-512 HMAC context reset + * + * \param ctx HMAC context to be reset + */ +void sha512_hmac_reset( sha512_context *ctx ); + +/** + * \brief Output = HMAC-SHA-512( hmac key, input buffer ) + * + * \param key HMAC secret key + * \param keylen length of the HMAC key + * \param input buffer holding the data + * \param ilen length of the input data + * \param output HMAC-SHA-384/512 result + * \param is384 0 = use SHA512, 1 = use SHA384 + */ +void sha512_hmac( const unsigned char *key, size_t keylen, + const unsigned char *input, size_t ilen, + unsigned char output[64], int is384 ); + +/** + * \brief Checkup routine + * + * \return 0 if successful, or 1 if the test failed + */ +int sha512_self_test( int verbose ); + +/* Internal use */ +void sha512_process( sha512_context *ctx, const unsigned char data[128] ); + +#ifdef __cplusplus +} +#endif + +#endif /* sha512.h */ diff --git a/CMakeLists.txt b/CMakeLists.txt index 85809145..baf926d0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -262,7 +262,7 @@ if (USE_QT5) endif() if (WITH_KDE) - find_package(KF5 COMPONENTS ConfigWidgets CoreAddons Notifications NotifyConfig TextWidgets XmlGui QUIET) + find_package(KF5 COMPONENTS ConfigWidgets CoreAddons Notifications NotifyConfig TextWidgets WidgetsAddons XmlGui QUIET) set_package_properties(KF5 PROPERTIES TYPE REQUIRED URL "http://www.kde.org" DESCRIPTION "KDE Frameworks" @@ -567,7 +567,7 @@ git_describe(GIT_DESCRIBE --long) # enviroment if (NOT GIT_HEAD OR NOT GIT_DESCRIBE) if (DEFINED ENV{GIT_HEAD}) - set(GIT_HEAD ${GIT_HEAD}) + set(GIT_HEAD ${GIT_HEAD}) endif () if (DEFINED ENV{GIT_DESCRIBE}) set(GIT_DESCRIBE ${GIT_DESCRIBE}) diff --git a/src/client/client.cpp b/src/client/client.cpp index d8dbcbf5..54a93fb3 100644 --- a/src/client/client.cpp +++ b/src/client/client.cpp @@ -153,6 +153,9 @@ void Client::init() p->attachSlot(SIGNAL(networkCreated(NetworkId)), this, SLOT(coreNetworkCreated(NetworkId))); p->attachSlot(SIGNAL(networkRemoved(NetworkId)), this, SLOT(coreNetworkRemoved(NetworkId))); + p->attachSignal(this, SIGNAL(requestPasswordChange(PeerPtr,QString,QString,QString)), SIGNAL(changePassword(PeerPtr,QString,QString,QString))); + p->attachSlot(SIGNAL(passwordChanged(PeerPtr,bool)), this, SLOT(corePasswordChanged(PeerPtr,bool))); + //connect(mainUi(), SIGNAL(connectToCore(const QVariantMap &)), this, SLOT(connectToCore(const QVariantMap &))); connect(mainUi(), SIGNAL(disconnectFromCore()), this, SLOT(disconnectFromCore())); connect(this, SIGNAL(connected()), mainUi(), SLOT(connectedToCore())); @@ -386,11 +389,6 @@ void Client::setSyncedToCore() connect(networkModel(), SIGNAL(requestSetLastSeenMsg(BufferId, MsgId)), bufferSyncer(), SLOT(requestSetLastSeenMsg(BufferId, const MsgId &))); SignalProxy *p = signalProxy(); - - if ((Client::coreFeatures() & Quassel::PasswordChange)) { - p->attachSignal(this, SIGNAL(clientChangePassword(QString))); - } - p->synchronize(bufferSyncer()); // create a new BufferViewManager @@ -653,12 +651,20 @@ void Client::markBufferAsRead(BufferId id) bufferSyncer()->requestMarkBufferAsRead(id); } -void Client::changePassword(QString newPassword) { + +void Client::changePassword(const QString &oldPassword, const QString &newPassword) { CoreAccount account = currentCoreAccount(); account.setPassword(newPassword); coreAccountModel()->createOrUpdateAccount(account); - coreAccountModel()->save(); - emit clientChangePassword(newPassword); + emit instance()->requestPasswordChange(nullptr, account.user(), oldPassword, newPassword); +} + + +void Client::corePasswordChanged(PeerPtr, bool success) +{ + if (success) + coreAccountModel()->save(); + emit passwordChanged(success); } diff --git a/src/client/client.h b/src/client/client.h index 445648b2..6d224cf9 100644 --- a/src/client/client.h +++ b/src/client/client.h @@ -142,6 +142,8 @@ public: static void mergeBuffersPermanently(BufferId bufferId1, BufferId bufferId2); static void purgeKnownBufferIds(); + static void changePassword(const QString &oldPassword, const QString &newPassword); + #if QT_VERSION < 0x050000 static void logMessage(QtMsgType type, const char *msg); #else @@ -191,7 +193,9 @@ signals: */ void bufferMarkedAsRead(BufferId id); - void clientChangePassword(QString password); + //! Requests a password change (user name must match the currently logged in user) + void requestPasswordChange(PeerPtr peer, const QString &userName, const QString &oldPassword, const QString &newPassword); + void passwordChanged(bool success); public slots: void disconnectFromCore(); @@ -202,8 +206,6 @@ public slots: void markBufferAsRead(BufferId id); - void changePassword(QString newPassword); - private slots: void setSyncedToCore(); void setDisconnectedFromCore(); @@ -218,6 +220,8 @@ private slots: void coreNetworkCreated(NetworkId); void coreNetworkRemoved(NetworkId); + void corePasswordChanged(PeerPtr, bool success); + void requestInitialBacklog(); void sendBufferedUserInput(); diff --git a/src/client/coreconnection.h b/src/client/coreconnection.h index 0019a534..ba33f178 100644 --- a/src/client/coreconnection.h +++ b/src/client/coreconnection.h @@ -73,6 +73,8 @@ public: //! Check if we consider the last connect as reconnect bool wasReconnect() const { return _wasReconnect; } + QPointer peer() { return _peer; } + public slots: bool connectToCore(AccountId = 0); void reconnectToCore(); diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index 90ccb5f3..414bfdfe 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -62,6 +62,10 @@ else() set(SOURCES ${SOURCES} ../../3rdparty/miniz/miniz.c) endif() +if (USE_QT4) + set(SOURCES ${SOURCES} ../../3rdparty/sha512/sha512.c) +endif() + if (HAVE_SYSLOG) add_definitions(-DHAVE_SYSLOG) endif() diff --git a/src/common/internalpeer.h b/src/common/internalpeer.h index 97499bd7..103c47d3 100644 --- a/src/common/internalpeer.h +++ b/src/common/internalpeer.h @@ -42,6 +42,7 @@ public: InternalPeer(QObject *parent = 0); virtual ~InternalPeer(); + Protocol::Type protocol() const { return Protocol::InternalProtocol; } QString description() const; SignalProxy *signalProxy() const; diff --git a/src/common/main.cpp b/src/common/main.cpp index 6847371d..b13d3eef 100644 --- a/src/common/main.cpp +++ b/src/common/main.cpp @@ -169,7 +169,7 @@ int main(int argc, char **argv) cliParser->addSwitch("oidentd", 0, "Enable oidentd integration"); cliParser->addOption("oidentd-conffile", 0, "Set path to oidentd configuration file", "file"); #ifdef HAVE_SSL - cliParser->addSwitch("require-ssl", 0, "Require SSL for client connections"); + cliParser->addSwitch("require-ssl", 0, "Require SSL for remote (non-loopback) client connections"); #endif cliParser->addSwitch("enable-experimental-dcc", 0, "Enable highly experimental and unfinished support for CTCP DCC (DANGEROUS)"); #endif diff --git a/src/common/peer.cpp b/src/common/peer.cpp index 14041597..3785326c 100644 --- a/src/common/peer.cpp +++ b/src/common/peer.cpp @@ -32,3 +32,22 @@ AuthHandler *Peer::authHandler() const { return _authHandler; } + + +// Note that we need to use a fixed-size integer instead of uintptr_t, in order +// to avoid issues with different architectures for client and core. +// In practice, we'll never really have to restore the real value of a PeerPtr from +// a QVariant. +QDataStream &operator<<(QDataStream &out, PeerPtr ptr) +{ + out << reinterpret_cast(ptr); + return out; +} + +QDataStream &operator>>(QDataStream &in, PeerPtr &ptr) +{ + quint64 value; + in >> value; + ptr = reinterpret_cast(value); + return in; +} diff --git a/src/common/peer.h b/src/common/peer.h index a21e9c1b..02eb3c0c 100644 --- a/src/common/peer.h +++ b/src/common/peer.h @@ -35,6 +35,7 @@ class Peer : public QObject public: Peer(AuthHandler *authHandler, QObject *parent = 0); + virtual Protocol::Type protocol() const = 0; virtual QString description() const = 0; virtual SignalProxy *signalProxy() const = 0; @@ -86,6 +87,9 @@ private: typedef Peer * PeerPtr; Q_DECLARE_METATYPE(PeerPtr) +QDataStream &operator<<(QDataStream &out, PeerPtr ptr); +QDataStream &operator>>(QDataStream &in, PeerPtr &ptr); + // Template method needed in the header template inline diff --git a/src/common/protocol.h b/src/common/protocol.h index 15f5e5d3..ba705303 100644 --- a/src/common/protocol.h +++ b/src/common/protocol.h @@ -30,6 +30,7 @@ namespace Protocol { const quint32 magic = 0x42b33f00; enum Type { + InternalProtocol = 0x00, LegacyProtocol = 0x01, DataStreamProtocol = 0x02 }; diff --git a/src/common/quassel.cpp b/src/common/quassel.cpp index f43423cc..c166ee64 100644 --- a/src/common/quassel.cpp +++ b/src/common/quassel.cpp @@ -42,6 +42,7 @@ #include "logger.h" #include "message.h" #include "network.h" +#include "peer.h" #include "protocol.h" #include "syncableobject.h" #include "types.h" @@ -203,6 +204,8 @@ void Quassel::registerMetaTypes() qRegisterMetaTypeStreamOperators("MsgId"); qRegisterMetaType("Protocol::SessionState"); + qRegisterMetaType("PeerPtr"); + qRegisterMetaTypeStreamOperators("PeerPtr"); // Versions of Qt prior to 4.7 didn't define QVariant as a meta type if (!QMetaType::type("QVariant")) { diff --git a/src/common/remotepeer.h b/src/common/remotepeer.h index 5650120e..677ff21c 100644 --- a/src/common/remotepeer.h +++ b/src/common/remotepeer.h @@ -45,7 +45,6 @@ public: void setSignalProxy(SignalProxy *proxy); - virtual Protocol::Type protocol() const = 0; virtual QString protocolName() const = 0; virtual QString description() const; virtual quint16 enabledFeatures() const { return 0; } diff --git a/src/core/SQL/PostgreSQL/16/insert_quasseluser.sql b/src/core/SQL/PostgreSQL/16/insert_quasseluser.sql deleted file mode 100644 index f336d0cb..00000000 --- a/src/core/SQL/PostgreSQL/16/insert_quasseluser.sql +++ /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 index f11bf18a..00000000 --- a/src/core/SQL/PostgreSQL/16/select_authuser.sql +++ /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 index 44a514a1..00000000 --- a/src/core/SQL/PostgreSQL/16/update_userpassword.sql +++ /dev/null @@ -1,3 +0,0 @@ -UPDATE quasseluser -SET password = :password -WHERE userid = :userid diff --git a/src/core/SQL/PostgreSQL/16/delete_backlog_by_uid.sql b/src/core/SQL/PostgreSQL/17/delete_backlog_by_uid.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/delete_backlog_by_uid.sql rename to src/core/SQL/PostgreSQL/17/delete_backlog_by_uid.sql diff --git a/src/core/SQL/PostgreSQL/16/delete_backlog_for_buffer.sql b/src/core/SQL/PostgreSQL/17/delete_backlog_for_buffer.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/delete_backlog_for_buffer.sql rename to src/core/SQL/PostgreSQL/17/delete_backlog_for_buffer.sql diff --git a/src/core/SQL/PostgreSQL/16/delete_backlog_for_network.sql b/src/core/SQL/PostgreSQL/17/delete_backlog_for_network.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/delete_backlog_for_network.sql rename to src/core/SQL/PostgreSQL/17/delete_backlog_for_network.sql diff --git a/src/core/SQL/PostgreSQL/16/delete_buffer_for_bufferid.sql b/src/core/SQL/PostgreSQL/17/delete_buffer_for_bufferid.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/delete_buffer_for_bufferid.sql rename to src/core/SQL/PostgreSQL/17/delete_buffer_for_bufferid.sql diff --git a/src/core/SQL/PostgreSQL/16/delete_buffers_by_uid.sql b/src/core/SQL/PostgreSQL/17/delete_buffers_by_uid.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/delete_buffers_by_uid.sql rename to src/core/SQL/PostgreSQL/17/delete_buffers_by_uid.sql diff --git a/src/core/SQL/PostgreSQL/16/delete_buffers_for_network.sql b/src/core/SQL/PostgreSQL/17/delete_buffers_for_network.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/delete_buffers_for_network.sql rename to src/core/SQL/PostgreSQL/17/delete_buffers_for_network.sql diff --git a/src/core/SQL/PostgreSQL/16/delete_identity.sql b/src/core/SQL/PostgreSQL/17/delete_identity.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/delete_identity.sql rename to src/core/SQL/PostgreSQL/17/delete_identity.sql diff --git a/src/core/SQL/PostgreSQL/16/delete_ircservers_for_network.sql b/src/core/SQL/PostgreSQL/17/delete_ircservers_for_network.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/delete_ircservers_for_network.sql rename to src/core/SQL/PostgreSQL/17/delete_ircservers_for_network.sql diff --git a/src/core/SQL/PostgreSQL/16/delete_network.sql b/src/core/SQL/PostgreSQL/17/delete_network.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/delete_network.sql rename to src/core/SQL/PostgreSQL/17/delete_network.sql diff --git a/src/core/SQL/PostgreSQL/16/delete_networks_by_uid.sql b/src/core/SQL/PostgreSQL/17/delete_networks_by_uid.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/delete_networks_by_uid.sql rename to src/core/SQL/PostgreSQL/17/delete_networks_by_uid.sql diff --git a/src/core/SQL/PostgreSQL/16/delete_nicks.sql b/src/core/SQL/PostgreSQL/17/delete_nicks.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/delete_nicks.sql rename to src/core/SQL/PostgreSQL/17/delete_nicks.sql diff --git a/src/core/SQL/PostgreSQL/16/delete_quasseluser.sql b/src/core/SQL/PostgreSQL/17/delete_quasseluser.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/delete_quasseluser.sql rename to src/core/SQL/PostgreSQL/17/delete_quasseluser.sql diff --git a/src/core/SQL/PostgreSQL/16/insert_buffer.sql b/src/core/SQL/PostgreSQL/17/insert_buffer.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/insert_buffer.sql rename to src/core/SQL/PostgreSQL/17/insert_buffer.sql diff --git a/src/core/SQL/PostgreSQL/16/insert_identity.sql b/src/core/SQL/PostgreSQL/17/insert_identity.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/insert_identity.sql rename to src/core/SQL/PostgreSQL/17/insert_identity.sql diff --git a/src/core/SQL/PostgreSQL/16/insert_message.sql b/src/core/SQL/PostgreSQL/17/insert_message.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/insert_message.sql rename to src/core/SQL/PostgreSQL/17/insert_message.sql diff --git a/src/core/SQL/PostgreSQL/16/insert_network.sql b/src/core/SQL/PostgreSQL/17/insert_network.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/insert_network.sql rename to src/core/SQL/PostgreSQL/17/insert_network.sql diff --git a/src/core/SQL/PostgreSQL/16/insert_nick.sql b/src/core/SQL/PostgreSQL/17/insert_nick.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/insert_nick.sql rename to src/core/SQL/PostgreSQL/17/insert_nick.sql diff --git a/src/core/SQL/PostgreSQL/17/insert_quasseluser.sql b/src/core/SQL/PostgreSQL/17/insert_quasseluser.sql new file mode 100644 index 00000000..af853922 --- /dev/null +++ b/src/core/SQL/PostgreSQL/17/insert_quasseluser.sql @@ -0,0 +1,3 @@ +INSERT INTO quasseluser (username, password, hashversion) +VALUES (:username, :password, :hashversion) +RETURNING userid diff --git a/src/core/SQL/PostgreSQL/16/insert_sender.sql b/src/core/SQL/PostgreSQL/17/insert_sender.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/insert_sender.sql rename to src/core/SQL/PostgreSQL/17/insert_sender.sql diff --git a/src/core/SQL/PostgreSQL/16/insert_server.sql b/src/core/SQL/PostgreSQL/17/insert_server.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/insert_server.sql rename to src/core/SQL/PostgreSQL/17/insert_server.sql diff --git a/src/core/SQL/PostgreSQL/16/insert_user_setting.sql b/src/core/SQL/PostgreSQL/17/insert_user_setting.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/insert_user_setting.sql rename to src/core/SQL/PostgreSQL/17/insert_user_setting.sql diff --git a/src/core/SQL/PostgreSQL/16/migrate_write_backlog.sql b/src/core/SQL/PostgreSQL/17/migrate_write_backlog.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/migrate_write_backlog.sql rename to src/core/SQL/PostgreSQL/17/migrate_write_backlog.sql diff --git a/src/core/SQL/PostgreSQL/16/migrate_write_buffer.sql b/src/core/SQL/PostgreSQL/17/migrate_write_buffer.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/migrate_write_buffer.sql rename to src/core/SQL/PostgreSQL/17/migrate_write_buffer.sql diff --git a/src/core/SQL/PostgreSQL/16/migrate_write_identity.sql b/src/core/SQL/PostgreSQL/17/migrate_write_identity.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/migrate_write_identity.sql rename to src/core/SQL/PostgreSQL/17/migrate_write_identity.sql diff --git a/src/core/SQL/PostgreSQL/16/migrate_write_identity_nick.sql b/src/core/SQL/PostgreSQL/17/migrate_write_identity_nick.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/migrate_write_identity_nick.sql rename to src/core/SQL/PostgreSQL/17/migrate_write_identity_nick.sql diff --git a/src/core/SQL/PostgreSQL/16/migrate_write_ircserver.sql b/src/core/SQL/PostgreSQL/17/migrate_write_ircserver.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/migrate_write_ircserver.sql rename to src/core/SQL/PostgreSQL/17/migrate_write_ircserver.sql diff --git a/src/core/SQL/PostgreSQL/16/migrate_write_network.sql b/src/core/SQL/PostgreSQL/17/migrate_write_network.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/migrate_write_network.sql rename to src/core/SQL/PostgreSQL/17/migrate_write_network.sql diff --git a/src/core/SQL/PostgreSQL/16/migrate_write_quasseluser.sql b/src/core/SQL/PostgreSQL/17/migrate_write_quasseluser.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/migrate_write_quasseluser.sql rename to src/core/SQL/PostgreSQL/17/migrate_write_quasseluser.sql diff --git a/src/core/SQL/PostgreSQL/16/migrate_write_sender.sql b/src/core/SQL/PostgreSQL/17/migrate_write_sender.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/migrate_write_sender.sql rename to src/core/SQL/PostgreSQL/17/migrate_write_sender.sql diff --git a/src/core/SQL/PostgreSQL/16/migrate_write_usersetting.sql b/src/core/SQL/PostgreSQL/17/migrate_write_usersetting.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/migrate_write_usersetting.sql rename to src/core/SQL/PostgreSQL/17/migrate_write_usersetting.sql diff --git a/src/core/SQL/PostgreSQL/17/select_authuser.sql b/src/core/SQL/PostgreSQL/17/select_authuser.sql new file mode 100644 index 00000000..1991281e --- /dev/null +++ b/src/core/SQL/PostgreSQL/17/select_authuser.sql @@ -0,0 +1,3 @@ +SELECT userid, password, hashversion +FROM quasseluser +WHERE username = :username diff --git a/src/core/SQL/PostgreSQL/16/select_bufferByName.sql b/src/core/SQL/PostgreSQL/17/select_bufferByName.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/select_bufferByName.sql rename to src/core/SQL/PostgreSQL/17/select_bufferByName.sql diff --git a/src/core/SQL/PostgreSQL/16/select_bufferExists.sql b/src/core/SQL/PostgreSQL/17/select_bufferExists.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/select_bufferExists.sql rename to src/core/SQL/PostgreSQL/17/select_bufferExists.sql diff --git a/src/core/SQL/PostgreSQL/16/select_buffer_by_id.sql b/src/core/SQL/PostgreSQL/17/select_buffer_by_id.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/select_buffer_by_id.sql rename to src/core/SQL/PostgreSQL/17/select_buffer_by_id.sql diff --git a/src/core/SQL/PostgreSQL/16/select_buffer_lastseen_messages.sql b/src/core/SQL/PostgreSQL/17/select_buffer_lastseen_messages.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/select_buffer_lastseen_messages.sql rename to src/core/SQL/PostgreSQL/17/select_buffer_lastseen_messages.sql diff --git a/src/core/SQL/PostgreSQL/16/select_buffer_markerlinemsgids.sql b/src/core/SQL/PostgreSQL/17/select_buffer_markerlinemsgids.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/select_buffer_markerlinemsgids.sql rename to src/core/SQL/PostgreSQL/17/select_buffer_markerlinemsgids.sql diff --git a/src/core/SQL/PostgreSQL/16/select_buffers.sql b/src/core/SQL/PostgreSQL/17/select_buffers.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/select_buffers.sql rename to src/core/SQL/PostgreSQL/17/select_buffers.sql diff --git a/src/core/SQL/PostgreSQL/16/select_buffers_for_network.sql b/src/core/SQL/PostgreSQL/17/select_buffers_for_network.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/select_buffers_for_network.sql rename to src/core/SQL/PostgreSQL/17/select_buffers_for_network.sql diff --git a/src/core/SQL/PostgreSQL/16/select_checkidentity.sql b/src/core/SQL/PostgreSQL/17/select_checkidentity.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/select_checkidentity.sql rename to src/core/SQL/PostgreSQL/17/select_checkidentity.sql diff --git a/src/core/SQL/PostgreSQL/16/select_connected_networks.sql b/src/core/SQL/PostgreSQL/17/select_connected_networks.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/select_connected_networks.sql rename to src/core/SQL/PostgreSQL/17/select_connected_networks.sql diff --git a/src/core/SQL/PostgreSQL/16/select_identities.sql b/src/core/SQL/PostgreSQL/17/select_identities.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/select_identities.sql rename to src/core/SQL/PostgreSQL/17/select_identities.sql diff --git a/src/core/SQL/PostgreSQL/16/select_internaluser.sql b/src/core/SQL/PostgreSQL/17/select_internaluser.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/select_internaluser.sql rename to src/core/SQL/PostgreSQL/17/select_internaluser.sql diff --git a/src/core/SQL/PostgreSQL/16/select_messages.sql b/src/core/SQL/PostgreSQL/17/select_messages.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/select_messages.sql rename to src/core/SQL/PostgreSQL/17/select_messages.sql diff --git a/src/core/SQL/PostgreSQL/16/select_messagesAll.sql b/src/core/SQL/PostgreSQL/17/select_messagesAll.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/select_messagesAll.sql rename to src/core/SQL/PostgreSQL/17/select_messagesAll.sql diff --git a/src/core/SQL/PostgreSQL/16/select_messagesAllNew.sql b/src/core/SQL/PostgreSQL/17/select_messagesAllNew.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/select_messagesAllNew.sql rename to src/core/SQL/PostgreSQL/17/select_messagesAllNew.sql diff --git a/src/core/SQL/PostgreSQL/16/select_messagesNewerThan.sql b/src/core/SQL/PostgreSQL/17/select_messagesNewerThan.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/select_messagesNewerThan.sql rename to src/core/SQL/PostgreSQL/17/select_messagesNewerThan.sql diff --git a/src/core/SQL/PostgreSQL/16/select_messagesRange.sql b/src/core/SQL/PostgreSQL/17/select_messagesRange.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/select_messagesRange.sql rename to src/core/SQL/PostgreSQL/17/select_messagesRange.sql diff --git a/src/core/SQL/PostgreSQL/16/select_networkExists.sql b/src/core/SQL/PostgreSQL/17/select_networkExists.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/select_networkExists.sql rename to src/core/SQL/PostgreSQL/17/select_networkExists.sql diff --git a/src/core/SQL/PostgreSQL/16/select_network_awaymsg.sql b/src/core/SQL/PostgreSQL/17/select_network_awaymsg.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/select_network_awaymsg.sql rename to src/core/SQL/PostgreSQL/17/select_network_awaymsg.sql diff --git a/src/core/SQL/PostgreSQL/16/select_network_usermode.sql b/src/core/SQL/PostgreSQL/17/select_network_usermode.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/select_network_usermode.sql rename to src/core/SQL/PostgreSQL/17/select_network_usermode.sql diff --git a/src/core/SQL/PostgreSQL/16/select_networks_for_user.sql b/src/core/SQL/PostgreSQL/17/select_networks_for_user.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/select_networks_for_user.sql rename to src/core/SQL/PostgreSQL/17/select_networks_for_user.sql diff --git a/src/core/SQL/PostgreSQL/16/select_nicks.sql b/src/core/SQL/PostgreSQL/17/select_nicks.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/select_nicks.sql rename to src/core/SQL/PostgreSQL/17/select_nicks.sql diff --git a/src/core/SQL/PostgreSQL/16/select_persistent_channels.sql b/src/core/SQL/PostgreSQL/17/select_persistent_channels.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/select_persistent_channels.sql rename to src/core/SQL/PostgreSQL/17/select_persistent_channels.sql diff --git a/src/core/SQL/PostgreSQL/16/select_senderid.sql b/src/core/SQL/PostgreSQL/17/select_senderid.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/select_senderid.sql rename to src/core/SQL/PostgreSQL/17/select_senderid.sql diff --git a/src/core/SQL/PostgreSQL/16/select_servers_for_network.sql b/src/core/SQL/PostgreSQL/17/select_servers_for_network.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/select_servers_for_network.sql rename to src/core/SQL/PostgreSQL/17/select_servers_for_network.sql diff --git a/src/core/SQL/PostgreSQL/16/select_user_setting.sql b/src/core/SQL/PostgreSQL/17/select_user_setting.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/select_user_setting.sql rename to src/core/SQL/PostgreSQL/17/select_user_setting.sql diff --git a/src/core/SQL/PostgreSQL/16/select_userid.sql b/src/core/SQL/PostgreSQL/17/select_userid.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/select_userid.sql rename to src/core/SQL/PostgreSQL/17/select_userid.sql diff --git a/src/core/SQL/PostgreSQL/16/setup_000_quasseluser.sql b/src/core/SQL/PostgreSQL/17/setup_000_quasseluser.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/setup_000_quasseluser.sql rename to src/core/SQL/PostgreSQL/17/setup_000_quasseluser.sql diff --git a/src/core/SQL/PostgreSQL/16/setup_010_sender.sql b/src/core/SQL/PostgreSQL/17/setup_010_sender.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/setup_010_sender.sql rename to src/core/SQL/PostgreSQL/17/setup_010_sender.sql diff --git a/src/core/SQL/PostgreSQL/16/setup_020_identity.sql b/src/core/SQL/PostgreSQL/17/setup_020_identity.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/setup_020_identity.sql rename to src/core/SQL/PostgreSQL/17/setup_020_identity.sql diff --git a/src/core/SQL/PostgreSQL/16/setup_030_identity_nick.sql b/src/core/SQL/PostgreSQL/17/setup_030_identity_nick.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/setup_030_identity_nick.sql rename to src/core/SQL/PostgreSQL/17/setup_030_identity_nick.sql diff --git a/src/core/SQL/PostgreSQL/16/setup_040_network.sql b/src/core/SQL/PostgreSQL/17/setup_040_network.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/setup_040_network.sql rename to src/core/SQL/PostgreSQL/17/setup_040_network.sql diff --git a/src/core/SQL/PostgreSQL/16/setup_050_buffer.sql b/src/core/SQL/PostgreSQL/17/setup_050_buffer.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/setup_050_buffer.sql rename to src/core/SQL/PostgreSQL/17/setup_050_buffer.sql diff --git a/src/core/SQL/PostgreSQL/16/setup_060_backlog.sql b/src/core/SQL/PostgreSQL/17/setup_060_backlog.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/setup_060_backlog.sql rename to src/core/SQL/PostgreSQL/17/setup_060_backlog.sql diff --git a/src/core/SQL/PostgreSQL/16/setup_070_coreinfo.sql b/src/core/SQL/PostgreSQL/17/setup_070_coreinfo.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/setup_070_coreinfo.sql rename to src/core/SQL/PostgreSQL/17/setup_070_coreinfo.sql diff --git a/src/core/SQL/PostgreSQL/16/setup_080_ircservers.sql b/src/core/SQL/PostgreSQL/17/setup_080_ircservers.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/setup_080_ircservers.sql rename to src/core/SQL/PostgreSQL/17/setup_080_ircservers.sql diff --git a/src/core/SQL/PostgreSQL/16/setup_090_backlog_idx.sql b/src/core/SQL/PostgreSQL/17/setup_090_backlog_idx.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/setup_090_backlog_idx.sql rename to src/core/SQL/PostgreSQL/17/setup_090_backlog_idx.sql diff --git a/src/core/SQL/PostgreSQL/16/setup_100_user_setting.sql b/src/core/SQL/PostgreSQL/17/setup_100_user_setting.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/setup_100_user_setting.sql rename to src/core/SQL/PostgreSQL/17/setup_100_user_setting.sql diff --git a/src/core/SQL/PostgreSQL/16/setup_110_alter_sender_seq.sql b/src/core/SQL/PostgreSQL/17/setup_110_alter_sender_seq.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/setup_110_alter_sender_seq.sql rename to src/core/SQL/PostgreSQL/17/setup_110_alter_sender_seq.sql diff --git a/src/core/SQL/PostgreSQL/16/setup_120_alter_messageid_seq.sql b/src/core/SQL/PostgreSQL/17/setup_120_alter_messageid_seq.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/setup_120_alter_messageid_seq.sql rename to src/core/SQL/PostgreSQL/17/setup_120_alter_messageid_seq.sql diff --git a/src/core/SQL/PostgreSQL/16/update_backlog_bufferid.sql b/src/core/SQL/PostgreSQL/17/update_backlog_bufferid.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/update_backlog_bufferid.sql rename to src/core/SQL/PostgreSQL/17/update_backlog_bufferid.sql diff --git a/src/core/SQL/PostgreSQL/16/update_buffer_lastseen.sql b/src/core/SQL/PostgreSQL/17/update_buffer_lastseen.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/update_buffer_lastseen.sql rename to src/core/SQL/PostgreSQL/17/update_buffer_lastseen.sql diff --git a/src/core/SQL/PostgreSQL/16/update_buffer_markerlinemsgid.sql b/src/core/SQL/PostgreSQL/17/update_buffer_markerlinemsgid.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/update_buffer_markerlinemsgid.sql rename to src/core/SQL/PostgreSQL/17/update_buffer_markerlinemsgid.sql diff --git a/src/core/SQL/PostgreSQL/16/update_buffer_name.sql b/src/core/SQL/PostgreSQL/17/update_buffer_name.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/update_buffer_name.sql rename to src/core/SQL/PostgreSQL/17/update_buffer_name.sql diff --git a/src/core/SQL/PostgreSQL/16/update_buffer_persistent_channel.sql b/src/core/SQL/PostgreSQL/17/update_buffer_persistent_channel.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/update_buffer_persistent_channel.sql rename to src/core/SQL/PostgreSQL/17/update_buffer_persistent_channel.sql diff --git a/src/core/SQL/PostgreSQL/16/update_buffer_set_channel_key.sql b/src/core/SQL/PostgreSQL/17/update_buffer_set_channel_key.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/update_buffer_set_channel_key.sql rename to src/core/SQL/PostgreSQL/17/update_buffer_set_channel_key.sql diff --git a/src/core/SQL/PostgreSQL/16/update_identity.sql b/src/core/SQL/PostgreSQL/17/update_identity.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/update_identity.sql rename to src/core/SQL/PostgreSQL/17/update_identity.sql diff --git a/src/core/SQL/PostgreSQL/16/update_network.sql b/src/core/SQL/PostgreSQL/17/update_network.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/update_network.sql rename to src/core/SQL/PostgreSQL/17/update_network.sql diff --git a/src/core/SQL/PostgreSQL/16/update_network_connected.sql b/src/core/SQL/PostgreSQL/17/update_network_connected.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/update_network_connected.sql rename to src/core/SQL/PostgreSQL/17/update_network_connected.sql diff --git a/src/core/SQL/PostgreSQL/16/update_network_set_awaymsg.sql b/src/core/SQL/PostgreSQL/17/update_network_set_awaymsg.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/update_network_set_awaymsg.sql rename to src/core/SQL/PostgreSQL/17/update_network_set_awaymsg.sql diff --git a/src/core/SQL/PostgreSQL/16/update_network_set_usermode.sql b/src/core/SQL/PostgreSQL/17/update_network_set_usermode.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/update_network_set_usermode.sql rename to src/core/SQL/PostgreSQL/17/update_network_set_usermode.sql diff --git a/src/core/SQL/PostgreSQL/16/update_user_setting.sql b/src/core/SQL/PostgreSQL/17/update_user_setting.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/update_user_setting.sql rename to src/core/SQL/PostgreSQL/17/update_user_setting.sql diff --git a/src/core/SQL/PostgreSQL/16/update_username.sql b/src/core/SQL/PostgreSQL/17/update_username.sql similarity index 100% rename from src/core/SQL/PostgreSQL/16/update_username.sql rename to src/core/SQL/PostgreSQL/17/update_username.sql diff --git a/src/core/SQL/PostgreSQL/17/update_userpassword.sql b/src/core/SQL/PostgreSQL/17/update_userpassword.sql new file mode 100644 index 00000000..61eeb0ce --- /dev/null +++ b/src/core/SQL/PostgreSQL/17/update_userpassword.sql @@ -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 index 00000000..7a799c78 --- /dev/null +++ b/src/core/SQL/PostgreSQL/17/upgrade_000_alter_quasseluser_add_passwordversion.sql @@ -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 index 3a9ff8ba..00000000 --- a/src/core/SQL/SQLite/17/insert_quasseluser.sql +++ /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 index f11bf18a..00000000 --- a/src/core/SQL/SQLite/17/select_authuser.sql +++ /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 index 44a514a1..00000000 --- a/src/core/SQL/SQLite/17/update_userpassword.sql +++ /dev/null @@ -1,3 +0,0 @@ -UPDATE quasseluser -SET password = :password -WHERE userid = :userid diff --git a/src/core/SQL/SQLite/17/delete_backlog_by_uid.sql b/src/core/SQL/SQLite/18/delete_backlog_by_uid.sql similarity index 100% rename from src/core/SQL/SQLite/17/delete_backlog_by_uid.sql rename to src/core/SQL/SQLite/18/delete_backlog_by_uid.sql diff --git a/src/core/SQL/SQLite/17/delete_backlog_for_buffer.sql b/src/core/SQL/SQLite/18/delete_backlog_for_buffer.sql similarity index 100% rename from src/core/SQL/SQLite/17/delete_backlog_for_buffer.sql rename to src/core/SQL/SQLite/18/delete_backlog_for_buffer.sql diff --git a/src/core/SQL/SQLite/17/delete_backlog_for_network.sql b/src/core/SQL/SQLite/18/delete_backlog_for_network.sql similarity index 100% rename from src/core/SQL/SQLite/17/delete_backlog_for_network.sql rename to src/core/SQL/SQLite/18/delete_backlog_for_network.sql diff --git a/src/core/SQL/SQLite/17/delete_buffer_for_bufferid.sql b/src/core/SQL/SQLite/18/delete_buffer_for_bufferid.sql similarity index 100% rename from src/core/SQL/SQLite/17/delete_buffer_for_bufferid.sql rename to src/core/SQL/SQLite/18/delete_buffer_for_bufferid.sql diff --git a/src/core/SQL/SQLite/17/delete_buffers_by_uid.sql b/src/core/SQL/SQLite/18/delete_buffers_by_uid.sql similarity index 100% rename from src/core/SQL/SQLite/17/delete_buffers_by_uid.sql rename to src/core/SQL/SQLite/18/delete_buffers_by_uid.sql diff --git a/src/core/SQL/SQLite/17/delete_buffers_for_network.sql b/src/core/SQL/SQLite/18/delete_buffers_for_network.sql similarity index 100% rename from src/core/SQL/SQLite/17/delete_buffers_for_network.sql rename to src/core/SQL/SQLite/18/delete_buffers_for_network.sql diff --git a/src/core/SQL/SQLite/17/delete_identity.sql b/src/core/SQL/SQLite/18/delete_identity.sql similarity index 100% rename from src/core/SQL/SQLite/17/delete_identity.sql rename to src/core/SQL/SQLite/18/delete_identity.sql diff --git a/src/core/SQL/SQLite/17/delete_ircservers_for_network.sql b/src/core/SQL/SQLite/18/delete_ircservers_for_network.sql similarity index 100% rename from src/core/SQL/SQLite/17/delete_ircservers_for_network.sql rename to src/core/SQL/SQLite/18/delete_ircservers_for_network.sql diff --git a/src/core/SQL/SQLite/17/delete_network.sql b/src/core/SQL/SQLite/18/delete_network.sql similarity index 100% rename from src/core/SQL/SQLite/17/delete_network.sql rename to src/core/SQL/SQLite/18/delete_network.sql diff --git a/src/core/SQL/SQLite/17/delete_networks_by_uid.sql b/src/core/SQL/SQLite/18/delete_networks_by_uid.sql similarity index 100% rename from src/core/SQL/SQLite/17/delete_networks_by_uid.sql rename to src/core/SQL/SQLite/18/delete_networks_by_uid.sql diff --git a/src/core/SQL/SQLite/17/delete_nicks.sql b/src/core/SQL/SQLite/18/delete_nicks.sql similarity index 100% rename from src/core/SQL/SQLite/17/delete_nicks.sql rename to src/core/SQL/SQLite/18/delete_nicks.sql diff --git a/src/core/SQL/SQLite/17/delete_quasseluser.sql b/src/core/SQL/SQLite/18/delete_quasseluser.sql similarity index 100% rename from src/core/SQL/SQLite/17/delete_quasseluser.sql rename to src/core/SQL/SQLite/18/delete_quasseluser.sql diff --git a/src/core/SQL/SQLite/17/insert_buffer.sql b/src/core/SQL/SQLite/18/insert_buffer.sql similarity index 100% rename from src/core/SQL/SQLite/17/insert_buffer.sql rename to src/core/SQL/SQLite/18/insert_buffer.sql diff --git a/src/core/SQL/SQLite/17/insert_identity.sql b/src/core/SQL/SQLite/18/insert_identity.sql similarity index 100% rename from src/core/SQL/SQLite/17/insert_identity.sql rename to src/core/SQL/SQLite/18/insert_identity.sql diff --git a/src/core/SQL/SQLite/17/insert_message.sql b/src/core/SQL/SQLite/18/insert_message.sql similarity index 100% rename from src/core/SQL/SQLite/17/insert_message.sql rename to src/core/SQL/SQLite/18/insert_message.sql diff --git a/src/core/SQL/SQLite/17/insert_network.sql b/src/core/SQL/SQLite/18/insert_network.sql similarity index 100% rename from src/core/SQL/SQLite/17/insert_network.sql rename to src/core/SQL/SQLite/18/insert_network.sql diff --git a/src/core/SQL/SQLite/17/insert_nick.sql b/src/core/SQL/SQLite/18/insert_nick.sql similarity index 100% rename from src/core/SQL/SQLite/17/insert_nick.sql rename to src/core/SQL/SQLite/18/insert_nick.sql diff --git a/src/core/SQL/SQLite/18/insert_quasseluser.sql b/src/core/SQL/SQLite/18/insert_quasseluser.sql new file mode 100644 index 00000000..8a244192 --- /dev/null +++ b/src/core/SQL/SQLite/18/insert_quasseluser.sql @@ -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/17/insert_sender.sql b/src/core/SQL/SQLite/18/insert_sender.sql similarity index 100% rename from src/core/SQL/SQLite/17/insert_sender.sql rename to src/core/SQL/SQLite/18/insert_sender.sql diff --git a/src/core/SQL/SQLite/17/insert_server.sql b/src/core/SQL/SQLite/18/insert_server.sql similarity index 100% rename from src/core/SQL/SQLite/17/insert_server.sql rename to src/core/SQL/SQLite/18/insert_server.sql diff --git a/src/core/SQL/SQLite/17/insert_user_setting.sql b/src/core/SQL/SQLite/18/insert_user_setting.sql similarity index 100% rename from src/core/SQL/SQLite/17/insert_user_setting.sql rename to src/core/SQL/SQLite/18/insert_user_setting.sql diff --git a/src/core/SQL/SQLite/17/migrate_read_backlog.sql b/src/core/SQL/SQLite/18/migrate_read_backlog.sql similarity index 100% rename from src/core/SQL/SQLite/17/migrate_read_backlog.sql rename to src/core/SQL/SQLite/18/migrate_read_backlog.sql diff --git a/src/core/SQL/SQLite/17/migrate_read_buffer.sql b/src/core/SQL/SQLite/18/migrate_read_buffer.sql similarity index 100% rename from src/core/SQL/SQLite/17/migrate_read_buffer.sql rename to src/core/SQL/SQLite/18/migrate_read_buffer.sql diff --git a/src/core/SQL/SQLite/17/migrate_read_identity.sql b/src/core/SQL/SQLite/18/migrate_read_identity.sql similarity index 100% rename from src/core/SQL/SQLite/17/migrate_read_identity.sql rename to src/core/SQL/SQLite/18/migrate_read_identity.sql diff --git a/src/core/SQL/SQLite/17/migrate_read_identity_nick.sql b/src/core/SQL/SQLite/18/migrate_read_identity_nick.sql similarity index 100% rename from src/core/SQL/SQLite/17/migrate_read_identity_nick.sql rename to src/core/SQL/SQLite/18/migrate_read_identity_nick.sql diff --git a/src/core/SQL/SQLite/17/migrate_read_ircserver.sql b/src/core/SQL/SQLite/18/migrate_read_ircserver.sql similarity index 100% rename from src/core/SQL/SQLite/17/migrate_read_ircserver.sql rename to src/core/SQL/SQLite/18/migrate_read_ircserver.sql diff --git a/src/core/SQL/SQLite/17/migrate_read_network.sql b/src/core/SQL/SQLite/18/migrate_read_network.sql similarity index 100% rename from src/core/SQL/SQLite/17/migrate_read_network.sql rename to src/core/SQL/SQLite/18/migrate_read_network.sql diff --git a/src/core/SQL/SQLite/17/migrate_read_quasseluser.sql b/src/core/SQL/SQLite/18/migrate_read_quasseluser.sql similarity index 100% rename from src/core/SQL/SQLite/17/migrate_read_quasseluser.sql rename to src/core/SQL/SQLite/18/migrate_read_quasseluser.sql diff --git a/src/core/SQL/SQLite/17/migrate_read_sender.sql b/src/core/SQL/SQLite/18/migrate_read_sender.sql similarity index 100% rename from src/core/SQL/SQLite/17/migrate_read_sender.sql rename to src/core/SQL/SQLite/18/migrate_read_sender.sql diff --git a/src/core/SQL/SQLite/17/migrate_read_usersetting.sql b/src/core/SQL/SQLite/18/migrate_read_usersetting.sql similarity index 100% rename from src/core/SQL/SQLite/17/migrate_read_usersetting.sql rename to src/core/SQL/SQLite/18/migrate_read_usersetting.sql diff --git a/src/core/SQL/SQLite/18/select_authuser.sql b/src/core/SQL/SQLite/18/select_authuser.sql new file mode 100644 index 00000000..1991281e --- /dev/null +++ b/src/core/SQL/SQLite/18/select_authuser.sql @@ -0,0 +1,3 @@ +SELECT userid, password, hashversion +FROM quasseluser +WHERE username = :username diff --git a/src/core/SQL/SQLite/17/select_bufferByName.sql b/src/core/SQL/SQLite/18/select_bufferByName.sql similarity index 100% rename from src/core/SQL/SQLite/17/select_bufferByName.sql rename to src/core/SQL/SQLite/18/select_bufferByName.sql diff --git a/src/core/SQL/SQLite/17/select_bufferExists.sql b/src/core/SQL/SQLite/18/select_bufferExists.sql similarity index 100% rename from src/core/SQL/SQLite/17/select_bufferExists.sql rename to src/core/SQL/SQLite/18/select_bufferExists.sql diff --git a/src/core/SQL/SQLite/17/select_buffer_by_id.sql b/src/core/SQL/SQLite/18/select_buffer_by_id.sql similarity index 100% rename from src/core/SQL/SQLite/17/select_buffer_by_id.sql rename to src/core/SQL/SQLite/18/select_buffer_by_id.sql diff --git a/src/core/SQL/SQLite/17/select_buffer_lastseen_messages.sql b/src/core/SQL/SQLite/18/select_buffer_lastseen_messages.sql similarity index 100% rename from src/core/SQL/SQLite/17/select_buffer_lastseen_messages.sql rename to src/core/SQL/SQLite/18/select_buffer_lastseen_messages.sql diff --git a/src/core/SQL/SQLite/17/select_buffer_markerlinemsgids.sql b/src/core/SQL/SQLite/18/select_buffer_markerlinemsgids.sql similarity index 100% rename from src/core/SQL/SQLite/17/select_buffer_markerlinemsgids.sql rename to src/core/SQL/SQLite/18/select_buffer_markerlinemsgids.sql diff --git a/src/core/SQL/SQLite/17/select_buffers.sql b/src/core/SQL/SQLite/18/select_buffers.sql similarity index 100% rename from src/core/SQL/SQLite/17/select_buffers.sql rename to src/core/SQL/SQLite/18/select_buffers.sql diff --git a/src/core/SQL/SQLite/17/select_buffers_for_merge.sql b/src/core/SQL/SQLite/18/select_buffers_for_merge.sql similarity index 100% rename from src/core/SQL/SQLite/17/select_buffers_for_merge.sql rename to src/core/SQL/SQLite/18/select_buffers_for_merge.sql diff --git a/src/core/SQL/SQLite/17/select_buffers_for_network.sql b/src/core/SQL/SQLite/18/select_buffers_for_network.sql similarity index 100% rename from src/core/SQL/SQLite/17/select_buffers_for_network.sql rename to src/core/SQL/SQLite/18/select_buffers_for_network.sql diff --git a/src/core/SQL/SQLite/17/select_checkidentity.sql b/src/core/SQL/SQLite/18/select_checkidentity.sql similarity index 100% rename from src/core/SQL/SQLite/17/select_checkidentity.sql rename to src/core/SQL/SQLite/18/select_checkidentity.sql diff --git a/src/core/SQL/SQLite/17/select_connected_networks.sql b/src/core/SQL/SQLite/18/select_connected_networks.sql similarity index 100% rename from src/core/SQL/SQLite/17/select_connected_networks.sql rename to src/core/SQL/SQLite/18/select_connected_networks.sql diff --git a/src/core/SQL/SQLite/17/select_identities.sql b/src/core/SQL/SQLite/18/select_identities.sql similarity index 100% rename from src/core/SQL/SQLite/17/select_identities.sql rename to src/core/SQL/SQLite/18/select_identities.sql diff --git a/src/core/SQL/SQLite/17/select_internaluser.sql b/src/core/SQL/SQLite/18/select_internaluser.sql similarity index 100% rename from src/core/SQL/SQLite/17/select_internaluser.sql rename to src/core/SQL/SQLite/18/select_internaluser.sql diff --git a/src/core/SQL/SQLite/17/select_messages.sql b/src/core/SQL/SQLite/18/select_messages.sql similarity index 100% rename from src/core/SQL/SQLite/17/select_messages.sql rename to src/core/SQL/SQLite/18/select_messages.sql diff --git a/src/core/SQL/SQLite/17/select_messagesAll.sql b/src/core/SQL/SQLite/18/select_messagesAll.sql similarity index 100% rename from src/core/SQL/SQLite/17/select_messagesAll.sql rename to src/core/SQL/SQLite/18/select_messagesAll.sql diff --git a/src/core/SQL/SQLite/17/select_messagesAllNew.sql b/src/core/SQL/SQLite/18/select_messagesAllNew.sql similarity index 100% rename from src/core/SQL/SQLite/17/select_messagesAllNew.sql rename to src/core/SQL/SQLite/18/select_messagesAllNew.sql diff --git a/src/core/SQL/SQLite/17/select_messagesNewerThan.sql b/src/core/SQL/SQLite/18/select_messagesNewerThan.sql similarity index 100% rename from src/core/SQL/SQLite/17/select_messagesNewerThan.sql rename to src/core/SQL/SQLite/18/select_messagesNewerThan.sql diff --git a/src/core/SQL/SQLite/17/select_messagesNewestK.sql b/src/core/SQL/SQLite/18/select_messagesNewestK.sql similarity index 100% rename from src/core/SQL/SQLite/17/select_messagesNewestK.sql rename to src/core/SQL/SQLite/18/select_messagesNewestK.sql diff --git a/src/core/SQL/SQLite/17/select_networkExists.sql b/src/core/SQL/SQLite/18/select_networkExists.sql similarity index 100% rename from src/core/SQL/SQLite/17/select_networkExists.sql rename to src/core/SQL/SQLite/18/select_networkExists.sql diff --git a/src/core/SQL/SQLite/17/select_network_awaymsg.sql b/src/core/SQL/SQLite/18/select_network_awaymsg.sql similarity index 100% rename from src/core/SQL/SQLite/17/select_network_awaymsg.sql rename to src/core/SQL/SQLite/18/select_network_awaymsg.sql diff --git a/src/core/SQL/SQLite/17/select_network_usermode.sql b/src/core/SQL/SQLite/18/select_network_usermode.sql similarity index 100% rename from src/core/SQL/SQLite/17/select_network_usermode.sql rename to src/core/SQL/SQLite/18/select_network_usermode.sql diff --git a/src/core/SQL/SQLite/17/select_networks_for_user.sql b/src/core/SQL/SQLite/18/select_networks_for_user.sql similarity index 100% rename from src/core/SQL/SQLite/17/select_networks_for_user.sql rename to src/core/SQL/SQLite/18/select_networks_for_user.sql diff --git a/src/core/SQL/SQLite/17/select_nicks.sql b/src/core/SQL/SQLite/18/select_nicks.sql similarity index 100% rename from src/core/SQL/SQLite/17/select_nicks.sql rename to src/core/SQL/SQLite/18/select_nicks.sql diff --git a/src/core/SQL/SQLite/17/select_persistent_channels.sql b/src/core/SQL/SQLite/18/select_persistent_channels.sql similarity index 100% rename from src/core/SQL/SQLite/17/select_persistent_channels.sql rename to src/core/SQL/SQLite/18/select_persistent_channels.sql diff --git a/src/core/SQL/SQLite/17/select_servers_for_network.sql b/src/core/SQL/SQLite/18/select_servers_for_network.sql similarity index 100% rename from src/core/SQL/SQLite/17/select_servers_for_network.sql rename to src/core/SQL/SQLite/18/select_servers_for_network.sql diff --git a/src/core/SQL/SQLite/17/select_user_setting.sql b/src/core/SQL/SQLite/18/select_user_setting.sql similarity index 100% rename from src/core/SQL/SQLite/17/select_user_setting.sql rename to src/core/SQL/SQLite/18/select_user_setting.sql diff --git a/src/core/SQL/SQLite/17/select_userid.sql b/src/core/SQL/SQLite/18/select_userid.sql similarity index 100% rename from src/core/SQL/SQLite/17/select_userid.sql rename to src/core/SQL/SQLite/18/select_userid.sql diff --git a/src/core/SQL/SQLite/17/setup_000_quasseluser.sql b/src/core/SQL/SQLite/18/setup_000_quasseluser.sql similarity index 100% rename from src/core/SQL/SQLite/17/setup_000_quasseluser.sql rename to src/core/SQL/SQLite/18/setup_000_quasseluser.sql diff --git a/src/core/SQL/SQLite/17/setup_010_sender.sql b/src/core/SQL/SQLite/18/setup_010_sender.sql similarity index 100% rename from src/core/SQL/SQLite/17/setup_010_sender.sql rename to src/core/SQL/SQLite/18/setup_010_sender.sql diff --git a/src/core/SQL/SQLite/17/setup_020_network.sql b/src/core/SQL/SQLite/18/setup_020_network.sql similarity index 100% rename from src/core/SQL/SQLite/17/setup_020_network.sql rename to src/core/SQL/SQLite/18/setup_020_network.sql diff --git a/src/core/SQL/SQLite/17/setup_030_buffer.sql b/src/core/SQL/SQLite/18/setup_030_buffer.sql similarity index 100% rename from src/core/SQL/SQLite/17/setup_030_buffer.sql rename to src/core/SQL/SQLite/18/setup_030_buffer.sql diff --git a/src/core/SQL/SQLite/17/setup_040_buffer_idx.sql b/src/core/SQL/SQLite/18/setup_040_buffer_idx.sql similarity index 100% rename from src/core/SQL/SQLite/17/setup_040_buffer_idx.sql rename to src/core/SQL/SQLite/18/setup_040_buffer_idx.sql diff --git a/src/core/SQL/SQLite/17/setup_050_buffer_cname_idx.sql b/src/core/SQL/SQLite/18/setup_050_buffer_cname_idx.sql similarity index 100% rename from src/core/SQL/SQLite/17/setup_050_buffer_cname_idx.sql rename to src/core/SQL/SQLite/18/setup_050_buffer_cname_idx.sql diff --git a/src/core/SQL/SQLite/17/setup_060_backlog.sql b/src/core/SQL/SQLite/18/setup_060_backlog.sql similarity index 100% rename from src/core/SQL/SQLite/17/setup_060_backlog.sql rename to src/core/SQL/SQLite/18/setup_060_backlog.sql diff --git a/src/core/SQL/SQLite/17/setup_070_coreinfo.sql b/src/core/SQL/SQLite/18/setup_070_coreinfo.sql similarity index 100% rename from src/core/SQL/SQLite/17/setup_070_coreinfo.sql rename to src/core/SQL/SQLite/18/setup_070_coreinfo.sql diff --git a/src/core/SQL/SQLite/17/setup_080_ircservers.sql b/src/core/SQL/SQLite/18/setup_080_ircservers.sql similarity index 100% rename from src/core/SQL/SQLite/17/setup_080_ircservers.sql rename to src/core/SQL/SQLite/18/setup_080_ircservers.sql diff --git a/src/core/SQL/SQLite/17/setup_090_backlog_idx.sql b/src/core/SQL/SQLite/18/setup_090_backlog_idx.sql similarity index 100% rename from src/core/SQL/SQLite/17/setup_090_backlog_idx.sql rename to src/core/SQL/SQLite/18/setup_090_backlog_idx.sql diff --git a/src/core/SQL/SQLite/17/setup_100_backlog_idx2.sql b/src/core/SQL/SQLite/18/setup_100_backlog_idx2.sql similarity index 100% rename from src/core/SQL/SQLite/17/setup_100_backlog_idx2.sql rename to src/core/SQL/SQLite/18/setup_100_backlog_idx2.sql diff --git a/src/core/SQL/SQLite/17/setup_110_buffer_user_idx.sql b/src/core/SQL/SQLite/18/setup_110_buffer_user_idx.sql similarity index 100% rename from src/core/SQL/SQLite/17/setup_110_buffer_user_idx.sql rename to src/core/SQL/SQLite/18/setup_110_buffer_user_idx.sql diff --git a/src/core/SQL/SQLite/17/setup_120_user_setting.sql b/src/core/SQL/SQLite/18/setup_120_user_setting.sql similarity index 100% rename from src/core/SQL/SQLite/17/setup_120_user_setting.sql rename to src/core/SQL/SQLite/18/setup_120_user_setting.sql diff --git a/src/core/SQL/SQLite/17/setup_130_identity.sql b/src/core/SQL/SQLite/18/setup_130_identity.sql similarity index 100% rename from src/core/SQL/SQLite/17/setup_130_identity.sql rename to src/core/SQL/SQLite/18/setup_130_identity.sql diff --git a/src/core/SQL/SQLite/17/setup_140_identity_nick.sql b/src/core/SQL/SQLite/18/setup_140_identity_nick.sql similarity index 100% rename from src/core/SQL/SQLite/17/setup_140_identity_nick.sql rename to src/core/SQL/SQLite/18/setup_140_identity_nick.sql diff --git a/src/core/SQL/SQLite/17/update_backlog_bufferid.sql b/src/core/SQL/SQLite/18/update_backlog_bufferid.sql similarity index 100% rename from src/core/SQL/SQLite/17/update_backlog_bufferid.sql rename to src/core/SQL/SQLite/18/update_backlog_bufferid.sql diff --git a/src/core/SQL/SQLite/17/update_buffer_lastseen.sql b/src/core/SQL/SQLite/18/update_buffer_lastseen.sql similarity index 100% rename from src/core/SQL/SQLite/17/update_buffer_lastseen.sql rename to src/core/SQL/SQLite/18/update_buffer_lastseen.sql diff --git a/src/core/SQL/SQLite/17/update_buffer_markerlinemsgid.sql b/src/core/SQL/SQLite/18/update_buffer_markerlinemsgid.sql similarity index 100% rename from src/core/SQL/SQLite/17/update_buffer_markerlinemsgid.sql rename to src/core/SQL/SQLite/18/update_buffer_markerlinemsgid.sql diff --git a/src/core/SQL/SQLite/17/update_buffer_name.sql b/src/core/SQL/SQLite/18/update_buffer_name.sql similarity index 100% rename from src/core/SQL/SQLite/17/update_buffer_name.sql rename to src/core/SQL/SQLite/18/update_buffer_name.sql diff --git a/src/core/SQL/SQLite/17/update_buffer_persistent_channel.sql b/src/core/SQL/SQLite/18/update_buffer_persistent_channel.sql similarity index 100% rename from src/core/SQL/SQLite/17/update_buffer_persistent_channel.sql rename to src/core/SQL/SQLite/18/update_buffer_persistent_channel.sql diff --git a/src/core/SQL/SQLite/17/update_buffer_set_channel_key.sql b/src/core/SQL/SQLite/18/update_buffer_set_channel_key.sql similarity index 100% rename from src/core/SQL/SQLite/17/update_buffer_set_channel_key.sql rename to src/core/SQL/SQLite/18/update_buffer_set_channel_key.sql diff --git a/src/core/SQL/SQLite/17/update_identity.sql b/src/core/SQL/SQLite/18/update_identity.sql similarity index 100% rename from src/core/SQL/SQLite/17/update_identity.sql rename to src/core/SQL/SQLite/18/update_identity.sql diff --git a/src/core/SQL/SQLite/17/update_network.sql b/src/core/SQL/SQLite/18/update_network.sql similarity index 100% rename from src/core/SQL/SQLite/17/update_network.sql rename to src/core/SQL/SQLite/18/update_network.sql diff --git a/src/core/SQL/SQLite/17/update_network_connected.sql b/src/core/SQL/SQLite/18/update_network_connected.sql similarity index 100% rename from src/core/SQL/SQLite/17/update_network_connected.sql rename to src/core/SQL/SQLite/18/update_network_connected.sql diff --git a/src/core/SQL/SQLite/17/update_network_set_awaymsg.sql b/src/core/SQL/SQLite/18/update_network_set_awaymsg.sql similarity index 100% rename from src/core/SQL/SQLite/17/update_network_set_awaymsg.sql rename to src/core/SQL/SQLite/18/update_network_set_awaymsg.sql diff --git a/src/core/SQL/SQLite/17/update_network_set_usermode.sql b/src/core/SQL/SQLite/18/update_network_set_usermode.sql similarity index 100% rename from src/core/SQL/SQLite/17/update_network_set_usermode.sql rename to src/core/SQL/SQLite/18/update_network_set_usermode.sql diff --git a/src/core/SQL/SQLite/17/update_user_setting.sql b/src/core/SQL/SQLite/18/update_user_setting.sql similarity index 100% rename from src/core/SQL/SQLite/17/update_user_setting.sql rename to src/core/SQL/SQLite/18/update_user_setting.sql diff --git a/src/core/SQL/SQLite/17/update_username.sql b/src/core/SQL/SQLite/18/update_username.sql similarity index 100% rename from src/core/SQL/SQLite/17/update_username.sql rename to src/core/SQL/SQLite/18/update_username.sql diff --git a/src/core/SQL/SQLite/18/update_userpassword.sql b/src/core/SQL/SQLite/18/update_userpassword.sql new file mode 100644 index 00000000..61eeb0ce --- /dev/null +++ b/src/core/SQL/SQLite/18/update_userpassword.sql @@ -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 index 00000000..ab1fce8f --- /dev/null +++ b/src/core/SQL/SQLite/18/upgrade_000_alter_quasseluser_add_passwordversion.sql @@ -0,0 +1,2 @@ +ALTER TABLE quasseluser +ADD COLUMN hashversion INTEGER NOT NULL DEFAULT 0 diff --git a/src/core/core.cpp b/src/core/core.cpp index dfd2c95a..2049b63b 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -638,7 +638,6 @@ SessionThread *Core::sessionForUser(UserId uid, bool restore) SessionThread *session = new SessionThread(uid, restore, this); _sessions[uid] = session; session->start(); - connect(session, SIGNAL(passwordChangeRequested(UserId, QString)), _storage, SLOT(updateUser(UserId, QString))); return session; } @@ -819,6 +818,15 @@ void Core::changeUserPass(const QString &username) } +bool Core::changeUserPassword(UserId userId, const QString &password) +{ + if (!isConfigured() || !userId.isValid()) + return false; + + return instance()->_storage->updateUser(userId, password); +} + + AbstractSqlMigrationReader *Core::getMigrationReader(Storage *storage) { if (!storage) diff --git a/src/core/core.h b/src/core/core.h index deef9114..e356a0fb 100644 --- a/src/core/core.h +++ b/src/core/core.h @@ -74,6 +74,15 @@ public: return instance()->_storage->validateUser(userName, password); } + + //! Change a user's password + /** + * \param userId The user's ID + * \param password The user's unencrypted new password + * \return true, if the password change was successful + */ + static bool changeUserPassword(UserId userId, const QString &password); + //! Store a user setting persistently /** * \param userId The users Id diff --git a/src/core/coreauthhandler.cpp b/src/core/coreauthhandler.cpp index 75a29282..92b32c5c 100644 --- a/src/core/coreauthhandler.cpp +++ b/src/core/coreauthhandler.cpp @@ -158,7 +158,7 @@ void CoreAuthHandler::handle(const RegisterClient &msg) else useSsl = _connectionFeatures & Protocol::Encryption; - if (Quassel::isOptionSet("require-ssl") && !useSsl) { + if (Quassel::isOptionSet("require-ssl") && !useSsl && !_peer->isLocal()) { _peer->dispatch(ClientDenied(tr("SSL is required!
You need to use SSL in order to connect to this core."))); _peer->close(); return; diff --git a/src/core/coresession.cpp b/src/core/coresession.cpp index 1f6345d0..5fd5bdcf 100644 --- a/src/core/coresession.cpp +++ b/src/core/coresession.cpp @@ -100,7 +100,8 @@ CoreSession::CoreSession(UserId uid, bool restoreState, QObject *parent) p->attachSlot(SIGNAL(createNetwork(const NetworkInfo &, const QStringList &)), this, SLOT(createNetwork(const NetworkInfo &, const QStringList &))); p->attachSlot(SIGNAL(removeNetwork(NetworkId)), this, SLOT(removeNetwork(NetworkId))); - p->attachSlot(SIGNAL(clientChangePassword(QString)), this, SLOT(changePassword(QString))); + p->attachSlot(SIGNAL(changePassword(PeerPtr,QString,QString,QString)), this, SLOT(changePassword(PeerPtr,QString,QString,QString))); + p->attachSignal(this, SIGNAL(passwordChanged(PeerPtr,bool))); loadSettings(); initScriptEngine(); @@ -641,7 +642,12 @@ void CoreSession::globalAway(const QString &msg) } } -void CoreSession::changePassword(QString password) +void CoreSession::changePassword(PeerPtr peer, const QString &userName, const QString &oldPassword, const QString &newPassword) { - emit passwordChangeRequested(_user, password); + bool success = false; + UserId uid = Core::validateUser(userName, oldPassword); + if (uid.isValid() && uid == user()) + success = Core::changeUserPassword(uid, newPassword); + + emit passwordChanged(peer, success); } diff --git a/src/core/coresession.h b/src/core/coresession.h index 0861b18c..a164ffe1 100644 --- a/src/core/coresession.h +++ b/src/core/coresession.h @@ -27,6 +27,7 @@ #include "corecoreinfo.h" #include "corealiasmanager.h" #include "coreignorelistmanager.h" +#include "peer.h" #include "protocol.h" #include "message.h" #include "storage.h" @@ -45,7 +46,6 @@ class EventManager; class EventStringifier; class InternalPeer; class IrcParser; -class Peer; class MessageEvent; class NetworkConnection; class RemotePeer; @@ -127,13 +127,13 @@ public slots: */ void renameBuffer(const NetworkId &networkId, const QString &newName, const QString &oldName); + void changePassword(PeerPtr peer, const QString &userName, const QString &oldPassword, const QString &newPassword); + QHash persistentChannels(NetworkId) const; //! Marks us away (or unaway) on all networks void globalAway(const QString &msg = QString()); - void changePassword(QString password); - signals: void initialized(); void sessionState(const Protocol::SessionState &sessionState); @@ -160,7 +160,7 @@ signals: void networkRemoved(NetworkId); void networkDisconnected(NetworkId); - void passwordChangeRequested(UserId user, QString password); + void passwordChanged(PeerPtr peer, bool success); protected: virtual void customEvent(QEvent *event); diff --git a/src/core/postgresqlstorage.cpp b/src/core/postgresqlstorage.cpp index 11adb1dd..ca865704 100644 --- a/src/core/postgresqlstorage.cpp +++ b/src/core/postgresqlstorage.cpp @@ -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(query.value(2).toInt()))) { return query.value(0).toInt(); } else { diff --git a/src/core/sessionthread.cpp b/src/core/sessionthread.cpp index 1439bfce..c2f9b5a2 100644 --- a/src/core/sessionthread.cpp +++ b/src/core/sessionthread.cpp @@ -121,7 +121,6 @@ void SessionThread::addInternalClientToSession(InternalPeer *internalPeer) void SessionThread::run() { _session = new CoreSession(user(), _restoreState); - connect(_session, SIGNAL(passwordChangeRequested(UserId, QString)), SIGNAL(passwordChangeRequested(UserId, QString))); connect(this, SIGNAL(addRemoteClient(RemotePeer*)), _session, SLOT(addClient(RemotePeer*))); connect(this, SIGNAL(addInternalClient(InternalPeer*)), _session, SLOT(addClient(InternalPeer*))); connect(_session, SIGNAL(sessionState(Protocol::SessionState)), Core::instance(), SIGNAL(sessionState(Protocol::SessionState))); diff --git a/src/core/sessionthread.h b/src/core/sessionthread.h index 9a4a1b6b..fee6e64f 100644 --- a/src/core/sessionthread.h +++ b/src/core/sessionthread.h @@ -57,8 +57,6 @@ signals: void addRemoteClient(RemotePeer *peer); void addInternalClient(InternalPeer *peer); - void passwordChangeRequested(UserId user, QString newPassword); - private: CoreSession *_session; UserId _user; diff --git a/src/core/sql.qrc b/src/core/sql.qrc index fce06925..c72d14f6 100644 --- a/src/core/sql.qrc +++ b/src/core/sql.qrc @@ -1,248 +1,250 @@ - ./SQL/PostgreSQL/15/upgrade_000_alter_buffer_add_markerlinemsgid.sql - ./SQL/PostgreSQL/16/delete_backlog_by_uid.sql - ./SQL/PostgreSQL/16/delete_backlog_for_buffer.sql - ./SQL/PostgreSQL/16/delete_backlog_for_network.sql - ./SQL/PostgreSQL/16/delete_buffer_for_bufferid.sql - ./SQL/PostgreSQL/16/delete_buffers_by_uid.sql - ./SQL/PostgreSQL/16/delete_buffers_for_network.sql - ./SQL/PostgreSQL/16/delete_identity.sql - ./SQL/PostgreSQL/16/delete_ircservers_for_network.sql - ./SQL/PostgreSQL/16/delete_network.sql - ./SQL/PostgreSQL/16/delete_networks_by_uid.sql - ./SQL/PostgreSQL/16/delete_nicks.sql - ./SQL/PostgreSQL/16/delete_quasseluser.sql - ./SQL/PostgreSQL/16/insert_buffer.sql - ./SQL/PostgreSQL/16/insert_identity.sql - ./SQL/PostgreSQL/16/insert_message.sql - ./SQL/PostgreSQL/16/insert_network.sql - ./SQL/PostgreSQL/16/insert_nick.sql - ./SQL/PostgreSQL/16/insert_quasseluser.sql - ./SQL/PostgreSQL/16/insert_sender.sql - ./SQL/PostgreSQL/16/insert_server.sql - ./SQL/PostgreSQL/16/insert_user_setting.sql - ./SQL/PostgreSQL/16/migrate_write_backlog.sql - ./SQL/PostgreSQL/16/migrate_write_buffer.sql - ./SQL/PostgreSQL/16/migrate_write_identity.sql - ./SQL/PostgreSQL/16/migrate_write_identity_nick.sql - ./SQL/PostgreSQL/16/migrate_write_ircserver.sql - ./SQL/PostgreSQL/16/migrate_write_network.sql - ./SQL/PostgreSQL/16/migrate_write_quasseluser.sql - ./SQL/PostgreSQL/16/migrate_write_sender.sql - ./SQL/PostgreSQL/16/migrate_write_usersetting.sql - ./SQL/PostgreSQL/16/select_authuser.sql - ./SQL/PostgreSQL/16/select_buffer_by_id.sql - ./SQL/PostgreSQL/16/select_buffer_lastseen_messages.sql - ./SQL/PostgreSQL/16/select_buffer_markerlinemsgids.sql - ./SQL/PostgreSQL/16/select_bufferByName.sql - ./SQL/PostgreSQL/16/select_bufferExists.sql - ./SQL/PostgreSQL/16/select_buffers.sql - ./SQL/PostgreSQL/16/select_buffers_for_network.sql - ./SQL/PostgreSQL/16/select_checkidentity.sql - ./SQL/PostgreSQL/16/select_connected_networks.sql - ./SQL/PostgreSQL/16/select_identities.sql - ./SQL/PostgreSQL/16/select_internaluser.sql - ./SQL/PostgreSQL/16/select_messages.sql - ./SQL/PostgreSQL/16/select_messagesAll.sql - ./SQL/PostgreSQL/16/select_messagesAllNew.sql - ./SQL/PostgreSQL/16/select_messagesNewerThan.sql - ./SQL/PostgreSQL/16/select_messagesRange.sql - ./SQL/PostgreSQL/16/select_network_awaymsg.sql - ./SQL/PostgreSQL/16/select_network_usermode.sql - ./SQL/PostgreSQL/16/select_networkExists.sql - ./SQL/PostgreSQL/16/select_networks_for_user.sql - ./SQL/PostgreSQL/16/select_nicks.sql - ./SQL/PostgreSQL/16/select_persistent_channels.sql - ./SQL/PostgreSQL/16/select_senderid.sql - ./SQL/PostgreSQL/16/select_servers_for_network.sql - ./SQL/PostgreSQL/16/select_user_setting.sql - ./SQL/PostgreSQL/16/select_userid.sql - ./SQL/PostgreSQL/16/setup_000_quasseluser.sql - ./SQL/PostgreSQL/16/setup_010_sender.sql - ./SQL/PostgreSQL/16/setup_020_identity.sql - ./SQL/PostgreSQL/16/setup_030_identity_nick.sql - ./SQL/PostgreSQL/16/setup_040_network.sql - ./SQL/PostgreSQL/16/setup_050_buffer.sql - ./SQL/PostgreSQL/16/setup_060_backlog.sql - ./SQL/PostgreSQL/16/setup_070_coreinfo.sql - ./SQL/PostgreSQL/16/setup_080_ircservers.sql - ./SQL/PostgreSQL/16/setup_090_backlog_idx.sql - ./SQL/PostgreSQL/16/setup_100_user_setting.sql - ./SQL/PostgreSQL/16/setup_110_alter_sender_seq.sql - ./SQL/PostgreSQL/16/setup_120_alter_messageid_seq.sql - ./SQL/PostgreSQL/16/update_backlog_bufferid.sql - ./SQL/PostgreSQL/16/update_buffer_lastseen.sql - ./SQL/PostgreSQL/16/update_buffer_markerlinemsgid.sql - ./SQL/PostgreSQL/16/update_buffer_name.sql - ./SQL/PostgreSQL/16/update_buffer_persistent_channel.sql - ./SQL/PostgreSQL/16/update_buffer_set_channel_key.sql - ./SQL/PostgreSQL/16/update_identity.sql - ./SQL/PostgreSQL/16/update_network.sql - ./SQL/PostgreSQL/16/update_network_connected.sql - ./SQL/PostgreSQL/16/update_network_set_awaymsg.sql - ./SQL/PostgreSQL/16/update_network_set_usermode.sql - ./SQL/PostgreSQL/16/update_user_setting.sql - ./SQL/PostgreSQL/16/update_username.sql - ./SQL/PostgreSQL/16/update_userpassword.sql - ./SQL/PostgreSQL/16/upgrade_000_alter_network_add_sasl.sql - ./SQL/SQLite/1/upgrade_000_drop_coreinfo.sql - ./SQL/SQLite/1/upgrade_010_create_coreinfo.sql - ./SQL/SQLite/1/upgrade_020_update_schemaversion.sql - ./SQL/SQLite/10/upgrade_000_switch_to_msgid.sql - ./SQL/SQLite/10/upgrade_010_rename_buffer_table.sql - ./SQL/SQLite/10/upgrade_020_create_buffer_table.sql - ./SQL/SQLite/10/upgrade_030_copy_buffer_table.sql - ./SQL/SQLite/10/upgrade_040_drop_buffer_old_table.sql - ./SQL/SQLite/11/upgrade_000_create_user_setting.sql - ./SQL/SQLite/12/upgrade_000_create_identity.sql - ./SQL/SQLite/12/upgrade_010_create_identity_nick.sql - ./SQL/SQLite/12/upgrade_020_rename_servertable.sql - ./SQL/SQLite/12/upgrade_030_create_ircserver.sql - ./SQL/SQLite/12/upgrade_040_copy_ircserver.sql - ./SQL/SQLite/12/upgrade_050_drop_ircserverold.sql - ./SQL/SQLite/13/upgrade_000_create_buffer_user_idx.sql - ./SQL/SQLite/13/upgrade_010_create_buffer_cname_idx.sql - ./SQL/SQLite/13/upgrade_020_create_buffer_cname_idx.sql - ./SQL/SQLite/14/upgrade_000_rename_networktable.sql - ./SQL/SQLite/14/upgrade_010_create_networktable.sql - ./SQL/SQLite/14/upgrade_030_copy_networktable.sql - ./SQL/SQLite/14/upgrade_040_drop_networkold.sql - ./SQL/SQLite/15/upgrade_000_fix_ircservers.sql - ./SQL/SQLite/15/upgrade_000_fix_network.sql ./SQL/SQLite/16/upgrade_000_alter_buffer_add_markerlinemsgid.sql - ./SQL/SQLite/17/delete_backlog_by_uid.sql - ./SQL/SQLite/17/delete_backlog_for_buffer.sql - ./SQL/SQLite/17/delete_backlog_for_network.sql - ./SQL/SQLite/17/delete_buffer_for_bufferid.sql - ./SQL/SQLite/17/delete_buffers_by_uid.sql - ./SQL/SQLite/17/delete_buffers_for_network.sql - ./SQL/SQLite/17/delete_identity.sql - ./SQL/SQLite/17/delete_ircservers_for_network.sql - ./SQL/SQLite/17/delete_network.sql - ./SQL/SQLite/17/delete_networks_by_uid.sql - ./SQL/SQLite/17/delete_nicks.sql - ./SQL/SQLite/17/delete_quasseluser.sql - ./SQL/SQLite/17/insert_buffer.sql - ./SQL/SQLite/17/insert_identity.sql - ./SQL/SQLite/17/insert_message.sql - ./SQL/SQLite/17/insert_network.sql - ./SQL/SQLite/17/insert_nick.sql - ./SQL/SQLite/17/insert_quasseluser.sql - ./SQL/SQLite/17/insert_sender.sql - ./SQL/SQLite/17/insert_server.sql - ./SQL/SQLite/17/insert_user_setting.sql - ./SQL/SQLite/17/migrate_read_backlog.sql - ./SQL/SQLite/17/migrate_read_buffer.sql - ./SQL/SQLite/17/migrate_read_identity.sql - ./SQL/SQLite/17/migrate_read_identity_nick.sql - ./SQL/SQLite/17/migrate_read_ircserver.sql - ./SQL/SQLite/17/migrate_read_network.sql - ./SQL/SQLite/17/migrate_read_quasseluser.sql - ./SQL/SQLite/17/migrate_read_sender.sql - ./SQL/SQLite/17/migrate_read_usersetting.sql - ./SQL/SQLite/17/select_authuser.sql - ./SQL/SQLite/17/select_buffer_by_id.sql - ./SQL/SQLite/17/select_buffer_lastseen_messages.sql - ./SQL/SQLite/17/select_buffer_markerlinemsgids.sql - ./SQL/SQLite/17/select_bufferByName.sql - ./SQL/SQLite/17/select_bufferExists.sql - ./SQL/SQLite/17/select_buffers.sql - ./SQL/SQLite/17/select_buffers_for_merge.sql - ./SQL/SQLite/17/select_buffers_for_network.sql - ./SQL/SQLite/17/select_checkidentity.sql - ./SQL/SQLite/17/select_connected_networks.sql - ./SQL/SQLite/17/select_identities.sql - ./SQL/SQLite/17/select_internaluser.sql - ./SQL/SQLite/17/select_messages.sql - ./SQL/SQLite/17/select_messagesAll.sql - ./SQL/SQLite/17/select_messagesAllNew.sql - ./SQL/SQLite/17/select_messagesNewerThan.sql - ./SQL/SQLite/17/select_messagesNewestK.sql - ./SQL/SQLite/17/select_network_awaymsg.sql - ./SQL/SQLite/17/select_network_usermode.sql - ./SQL/SQLite/17/select_networkExists.sql - ./SQL/SQLite/17/select_networks_for_user.sql - ./SQL/SQLite/17/select_nicks.sql - ./SQL/SQLite/17/select_persistent_channels.sql - ./SQL/SQLite/17/select_servers_for_network.sql - ./SQL/SQLite/17/select_user_setting.sql - ./SQL/SQLite/17/select_userid.sql - ./SQL/SQLite/17/setup_000_quasseluser.sql - ./SQL/SQLite/17/setup_010_sender.sql - ./SQL/SQLite/17/setup_020_network.sql - ./SQL/SQLite/17/setup_030_buffer.sql - ./SQL/SQLite/17/setup_040_buffer_idx.sql - ./SQL/SQLite/17/setup_050_buffer_cname_idx.sql - ./SQL/SQLite/17/setup_060_backlog.sql - ./SQL/SQLite/17/setup_070_coreinfo.sql - ./SQL/SQLite/17/setup_080_ircservers.sql - ./SQL/SQLite/17/setup_090_backlog_idx.sql - ./SQL/SQLite/17/setup_100_backlog_idx2.sql - ./SQL/SQLite/17/setup_110_buffer_user_idx.sql - ./SQL/SQLite/17/setup_120_user_setting.sql - ./SQL/SQLite/17/setup_130_identity.sql - ./SQL/SQLite/17/setup_140_identity_nick.sql - ./SQL/SQLite/17/update_backlog_bufferid.sql - ./SQL/SQLite/17/update_buffer_lastseen.sql - ./SQL/SQLite/17/update_buffer_markerlinemsgid.sql - ./SQL/SQLite/17/update_buffer_name.sql - ./SQL/SQLite/17/update_buffer_persistent_channel.sql - ./SQL/SQLite/17/update_buffer_set_channel_key.sql - ./SQL/SQLite/17/update_identity.sql - ./SQL/SQLite/17/update_network.sql - ./SQL/SQLite/17/update_network_connected.sql - ./SQL/SQLite/17/update_network_set_awaymsg.sql - ./SQL/SQLite/17/update_network_set_usermode.sql - ./SQL/SQLite/17/update_user_setting.sql - ./SQL/SQLite/17/update_username.sql - ./SQL/SQLite/17/update_userpassword.sql - ./SQL/SQLite/17/upgrade_000_alter_network_add_sasl.sql ./SQL/SQLite/17/upgrade_001_alter_network_add_sasl.sql + ./SQL/SQLite/17/upgrade_000_alter_network_add_sasl.sql ./SQL/SQLite/17/upgrade_002_alter_network_add_sasl.sql - ./SQL/SQLite/2/upgrade_000_drop_buffergroup.sql + ./SQL/SQLite/18/update_buffer_persistent_channel.sql + ./SQL/SQLite/18/insert_network.sql + ./SQL/SQLite/18/insert_identity.sql + ./SQL/SQLite/18/select_checkidentity.sql + ./SQL/SQLite/18/migrate_read_identity.sql + ./SQL/SQLite/18/update_identity.sql + ./SQL/SQLite/18/delete_buffer_for_bufferid.sql + ./SQL/SQLite/18/setup_120_user_setting.sql + ./SQL/SQLite/18/select_networks_for_user.sql + ./SQL/SQLite/18/select_networkExists.sql + ./SQL/SQLite/18/migrate_read_network.sql + ./SQL/SQLite/18/setup_130_identity.sql + ./SQL/SQLite/18/select_messagesNewestK.sql + ./SQL/SQLite/18/setup_100_backlog_idx2.sql + ./SQL/SQLite/18/select_messagesAllNew.sql + ./SQL/SQLite/18/select_buffers_for_merge.sql + ./SQL/SQLite/18/delete_ircservers_for_network.sql + ./SQL/SQLite/18/select_persistent_channels.sql + ./SQL/SQLite/18/update_buffer_set_channel_key.sql + ./SQL/SQLite/18/setup_040_buffer_idx.sql + ./SQL/SQLite/18/select_messagesNewerThan.sql + ./SQL/SQLite/18/setup_070_coreinfo.sql + ./SQL/SQLite/18/insert_nick.sql + ./SQL/SQLite/18/select_messagesAll.sql + ./SQL/SQLite/18/delete_identity.sql + ./SQL/SQLite/18/select_buffer_markerlinemsgids.sql + ./SQL/SQLite/18/migrate_read_identity_nick.sql + ./SQL/SQLite/18/select_buffer_lastseen_messages.sql + ./SQL/SQLite/18/insert_sender.sql + ./SQL/SQLite/18/select_nicks.sql + ./SQL/SQLite/18/setup_030_buffer.sql + ./SQL/SQLite/18/migrate_read_sender.sql + ./SQL/SQLite/18/insert_user_setting.sql + ./SQL/SQLite/18/delete_buffers_for_network.sql + ./SQL/SQLite/18/select_messages.sql + ./SQL/SQLite/18/select_buffers.sql + ./SQL/SQLite/18/select_userid.sql + ./SQL/SQLite/18/update_network.sql + ./SQL/SQLite/18/migrate_read_usersetting.sql + ./SQL/SQLite/18/migrate_read_quasseluser.sql + ./SQL/SQLite/18/setup_010_sender.sql + ./SQL/SQLite/18/delete_quasseluser.sql + ./SQL/SQLite/18/select_network_usermode.sql + ./SQL/SQLite/18/update_userpassword.sql + ./SQL/SQLite/18/select_identities.sql + ./SQL/SQLite/18/setup_000_quasseluser.sql + ./SQL/SQLite/18/setup_080_ircservers.sql + ./SQL/SQLite/18/delete_nicks.sql + ./SQL/SQLite/18/delete_network.sql + ./SQL/SQLite/18/select_servers_for_network.sql + ./SQL/SQLite/18/migrate_read_buffer.sql + ./SQL/SQLite/18/select_connected_networks.sql + ./SQL/SQLite/18/update_network_connected.sql + ./SQL/SQLite/18/delete_backlog_for_network.sql + ./SQL/SQLite/18/setup_060_backlog.sql + ./SQL/SQLite/18/update_username.sql + ./SQL/SQLite/18/insert_message.sql + ./SQL/SQLite/18/select_buffer_by_id.sql + ./SQL/SQLite/18/update_user_setting.sql + ./SQL/SQLite/18/update_buffer_name.sql + ./SQL/SQLite/18/select_bufferExists.sql + ./SQL/SQLite/18/setup_110_buffer_user_idx.sql + ./SQL/SQLite/18/select_buffers_for_network.sql + ./SQL/SQLite/18/delete_backlog_by_uid.sql + ./SQL/SQLite/18/select_internaluser.sql + ./SQL/SQLite/18/select_network_awaymsg.sql + ./SQL/SQLite/18/setup_090_backlog_idx.sql + ./SQL/SQLite/18/insert_quasseluser.sql + ./SQL/SQLite/18/update_network_set_usermode.sql + ./SQL/SQLite/18/migrate_read_ircserver.sql + ./SQL/SQLite/18/delete_backlog_for_buffer.sql + ./SQL/SQLite/18/update_network_set_awaymsg.sql + ./SQL/SQLite/18/upgrade_000_alter_quasseluser_add_passwordversion.sql + ./SQL/SQLite/18/update_backlog_bufferid.sql + ./SQL/SQLite/18/update_buffer_markerlinemsgid.sql + ./SQL/SQLite/18/update_buffer_lastseen.sql + ./SQL/SQLite/18/setup_050_buffer_cname_idx.sql + ./SQL/SQLite/18/insert_buffer.sql + ./SQL/SQLite/18/select_authuser.sql + ./SQL/SQLite/18/select_user_setting.sql + ./SQL/SQLite/18/select_bufferByName.sql + ./SQL/SQLite/18/insert_server.sql + ./SQL/SQLite/18/setup_020_network.sql + ./SQL/SQLite/18/migrate_read_backlog.sql + ./SQL/SQLite/18/setup_140_identity_nick.sql + ./SQL/SQLite/18/delete_networks_by_uid.sql + ./SQL/SQLite/18/delete_buffers_by_uid.sql + ./SQL/SQLite/15/upgrade_000_fix_ircservers.sql + ./SQL/SQLite/15/upgrade_000_fix_network.sql ./SQL/SQLite/2/upgrade_010_update_schemaversion.sql - ./SQL/SQLite/3/upgrade_000_update_backlog_flags.sql - ./SQL/SQLite/3/upgrade_010_update_schemaversion.sql - ./SQL/SQLite/4/upgrade_000_rename_buffertable.sql - ./SQL/SQLite/4/upgrade_010_create_buffertable.sql - ./SQL/SQLite/4/upgrade_020_copy_buffertable.sql - ./SQL/SQLite/4/upgrade_030_drop_oldbuffertable.sql - ./SQL/SQLite/4/upgrade_040_create_buffer_idx.sql - ./SQL/SQLite/4/upgrade_050_create_buffer_cname_idx.sql - ./SQL/SQLite/5/upgrade_000_rename_networktable.sql - ./SQL/SQLite/5/upgrade_010_create_newnetworktable.sql - ./SQL/SQLite/5/upgrade_020_copy_networktable.sql + ./SQL/SQLite/2/upgrade_000_drop_buffergroup.sql ./SQL/SQLite/5/upgrade_030_drop_oldnetworktable.sql + ./SQL/SQLite/5/upgrade_020_copy_networktable.sql + ./SQL/SQLite/5/upgrade_000_rename_networktable.sql ./SQL/SQLite/5/upgrade_180_create_ircservers.sql - ./SQL/SQLite/6/upgrade_000_alter_buffertable.sql + ./SQL/SQLite/5/upgrade_010_create_newnetworktable.sql + ./SQL/SQLite/12/upgrade_050_drop_ircserverold.sql + ./SQL/SQLite/12/upgrade_030_create_ircserver.sql + ./SQL/SQLite/12/upgrade_010_create_identity_nick.sql + ./SQL/SQLite/12/upgrade_040_copy_ircserver.sql + ./SQL/SQLite/12/upgrade_000_create_identity.sql + ./SQL/SQLite/12/upgrade_020_rename_servertable.sql + ./SQL/SQLite/14/upgrade_000_rename_networktable.sql + ./SQL/SQLite/14/upgrade_040_drop_networkold.sql + ./SQL/SQLite/14/upgrade_010_create_networktable.sql + ./SQL/SQLite/14/upgrade_030_copy_networktable.sql + ./SQL/SQLite/13/upgrade_000_create_buffer_user_idx.sql + ./SQL/SQLite/13/upgrade_020_create_buffer_cname_idx.sql + ./SQL/SQLite/13/upgrade_010_create_buffer_cname_idx.sql + ./SQL/SQLite/11/upgrade_000_create_user_setting.sql + ./SQL/SQLite/3/upgrade_010_update_schemaversion.sql + ./SQL/SQLite/3/upgrade_000_update_backlog_flags.sql + ./SQL/SQLite/8/upgrade_000_alter_network_add_connected.sql + ./SQL/SQLite/8/upgrade_020_alter_buffer_add_joined.sql + ./SQL/SQLite/8/upgrade_010_alter_buffer_add_key.sql + ./SQL/SQLite/8/upgrade_030_update_buffer_set_joined_for_channels.sql ./SQL/SQLite/6/upgrade_010_set_statusbuffertype.sql - ./SQL/SQLite/6/upgrade_020_set_channelbuffertype.sql - ./SQL/SQLite/6/upgrade_030_set_querybuffertype.sql - ./SQL/SQLite/6/upgrade_040_update_msgtype.sql - ./SQL/SQLite/6/upgrade_050_update_msgtype.sql + ./SQL/SQLite/6/upgrade_080_update_msgtype.sql + ./SQL/SQLite/6/upgrade_000_alter_buffertable.sql ./SQL/SQLite/6/upgrade_060_update_msgtype.sql + ./SQL/SQLite/6/upgrade_050_update_msgtype.sql + ./SQL/SQLite/6/upgrade_150_update_msgtype.sql + ./SQL/SQLite/6/upgrade_100_update_msgtype.sql + ./SQL/SQLite/6/upgrade_040_update_msgtype.sql + ./SQL/SQLite/6/upgrade_130_update_msgtype.sql + ./SQL/SQLite/6/upgrade_160_update_msgtype.sql + ./SQL/SQLite/6/upgrade_020_set_channelbuffertype.sql ./SQL/SQLite/6/upgrade_070_update_msgtype.sql - ./SQL/SQLite/6/upgrade_080_update_msgtype.sql ./SQL/SQLite/6/upgrade_090_update_msgtype.sql - ./SQL/SQLite/6/upgrade_100_update_msgtype.sql - ./SQL/SQLite/6/upgrade_110_update_msgtype.sql + ./SQL/SQLite/6/upgrade_030_set_querybuffertype.sql ./SQL/SQLite/6/upgrade_120_update_msgtype.sql - ./SQL/SQLite/6/upgrade_130_update_msgtype.sql + ./SQL/SQLite/6/upgrade_110_update_msgtype.sql ./SQL/SQLite/6/upgrade_140_update_msgtype.sql - ./SQL/SQLite/6/upgrade_150_update_msgtype.sql - ./SQL/SQLite/6/upgrade_160_update_msgtype.sql + ./SQL/SQLite/4/upgrade_010_create_buffertable.sql + ./SQL/SQLite/4/upgrade_040_create_buffer_idx.sql + ./SQL/SQLite/4/upgrade_020_copy_buffertable.sql + ./SQL/SQLite/4/upgrade_030_drop_oldbuffertable.sql + ./SQL/SQLite/4/upgrade_000_rename_buffertable.sql + ./SQL/SQLite/4/upgrade_050_create_buffer_cname_idx.sql + ./SQL/SQLite/7/upgrade_030_drop_oldnetworktable.sql + ./SQL/SQLite/7/upgrade_020_copy_networktable.sql ./SQL/SQLite/7/upgrade_000_rename_networktable.sql ./SQL/SQLite/7/upgrade_010_create_newnetworktable.sql - ./SQL/SQLite/7/upgrade_020_copy_networktable.sql - ./SQL/SQLite/7/upgrade_030_drop_oldnetworktable.sql ./SQL/SQLite/7/upgrade_040_alter_buffer_add_lastseen.sql - ./SQL/SQLite/8/upgrade_000_alter_network_add_connected.sql - ./SQL/SQLite/8/upgrade_010_alter_buffer_add_key.sql - ./SQL/SQLite/8/upgrade_020_alter_buffer_add_joined.sql - ./SQL/SQLite/8/upgrade_030_update_buffer_set_joined_for_channels.sql - ./SQL/SQLite/9/upgrade_000_create_backlog_idx.sql - ./SQL/SQLite/9/upgrade_010_create_backlog_idx2.sql + ./SQL/SQLite/1/upgrade_010_create_coreinfo.sql + ./SQL/SQLite/1/upgrade_020_update_schemaversion.sql + ./SQL/SQLite/1/upgrade_000_drop_coreinfo.sql + ./SQL/SQLite/10/upgrade_040_drop_buffer_old_table.sql + ./SQL/SQLite/10/upgrade_030_copy_buffer_table.sql + ./SQL/SQLite/10/upgrade_000_switch_to_msgid.sql + ./SQL/SQLite/10/upgrade_020_create_buffer_table.sql + ./SQL/SQLite/10/upgrade_010_rename_buffer_table.sql ./SQL/SQLite/9/upgrade_020_create_buffer_idx.sql + ./SQL/SQLite/9/upgrade_010_create_backlog_idx2.sql + ./SQL/SQLite/9/upgrade_000_create_backlog_idx.sql + ./SQL/PostgreSQL/16/upgrade_000_alter_network_add_sasl.sql + ./SQL/PostgreSQL/17/setup_120_alter_messageid_seq.sql + ./SQL/PostgreSQL/17/setup_030_identity_nick.sql + ./SQL/PostgreSQL/17/update_buffer_persistent_channel.sql + ./SQL/PostgreSQL/17/insert_network.sql + ./SQL/PostgreSQL/17/insert_identity.sql + ./SQL/PostgreSQL/17/select_checkidentity.sql + ./SQL/PostgreSQL/17/update_identity.sql + ./SQL/PostgreSQL/17/delete_buffer_for_bufferid.sql + ./SQL/PostgreSQL/17/select_networks_for_user.sql + ./SQL/PostgreSQL/17/select_networkExists.sql + ./SQL/PostgreSQL/17/migrate_write_backlog.sql + ./SQL/PostgreSQL/17/migrate_write_identity_nick.sql + ./SQL/PostgreSQL/17/select_messagesAllNew.sql + ./SQL/PostgreSQL/17/delete_ircservers_for_network.sql + ./SQL/PostgreSQL/17/select_persistent_channels.sql + ./SQL/PostgreSQL/17/update_buffer_set_channel_key.sql + ./SQL/PostgreSQL/17/migrate_write_ircserver.sql + ./SQL/PostgreSQL/17/setup_040_network.sql + ./SQL/PostgreSQL/17/migrate_write_buffer.sql + ./SQL/PostgreSQL/17/migrate_write_usersetting.sql + ./SQL/PostgreSQL/17/setup_050_buffer.sql + ./SQL/PostgreSQL/17/migrate_write_identity.sql + ./SQL/PostgreSQL/17/select_messagesNewerThan.sql + ./SQL/PostgreSQL/17/setup_070_coreinfo.sql + ./SQL/PostgreSQL/17/insert_nick.sql + ./SQL/PostgreSQL/17/select_messagesAll.sql + ./SQL/PostgreSQL/17/delete_identity.sql + ./SQL/PostgreSQL/17/setup_110_alter_sender_seq.sql + ./SQL/PostgreSQL/17/select_senderid.sql + ./SQL/PostgreSQL/17/select_buffer_markerlinemsgids.sql + ./SQL/PostgreSQL/17/select_buffer_lastseen_messages.sql + ./SQL/PostgreSQL/17/insert_sender.sql + ./SQL/PostgreSQL/17/select_nicks.sql + ./SQL/PostgreSQL/17/insert_user_setting.sql + ./SQL/PostgreSQL/17/setup_020_identity.sql + ./SQL/PostgreSQL/17/delete_buffers_for_network.sql + ./SQL/PostgreSQL/17/select_messages.sql + ./SQL/PostgreSQL/17/select_buffers.sql + ./SQL/PostgreSQL/17/select_userid.sql + ./SQL/PostgreSQL/17/update_network.sql + ./SQL/PostgreSQL/17/setup_010_sender.sql + ./SQL/PostgreSQL/17/delete_quasseluser.sql + ./SQL/PostgreSQL/17/select_network_usermode.sql + ./SQL/PostgreSQL/17/update_userpassword.sql + ./SQL/PostgreSQL/17/select_identities.sql + ./SQL/PostgreSQL/17/setup_000_quasseluser.sql + ./SQL/PostgreSQL/17/setup_080_ircservers.sql + ./SQL/PostgreSQL/17/delete_nicks.sql + ./SQL/PostgreSQL/17/migrate_write_quasseluser.sql + ./SQL/PostgreSQL/17/delete_network.sql + ./SQL/PostgreSQL/17/select_servers_for_network.sql + ./SQL/PostgreSQL/17/select_connected_networks.sql + ./SQL/PostgreSQL/17/update_network_connected.sql + ./SQL/PostgreSQL/17/select_messagesRange.sql + ./SQL/PostgreSQL/17/delete_backlog_for_network.sql + ./SQL/PostgreSQL/17/setup_060_backlog.sql + ./SQL/PostgreSQL/17/update_username.sql + ./SQL/PostgreSQL/17/insert_message.sql + ./SQL/PostgreSQL/17/select_buffer_by_id.sql + ./SQL/PostgreSQL/17/update_user_setting.sql + ./SQL/PostgreSQL/17/update_buffer_name.sql + ./SQL/PostgreSQL/17/select_bufferExists.sql + ./SQL/PostgreSQL/17/select_buffers_for_network.sql + ./SQL/PostgreSQL/17/delete_backlog_by_uid.sql + ./SQL/PostgreSQL/17/select_internaluser.sql + ./SQL/PostgreSQL/17/select_network_awaymsg.sql + ./SQL/PostgreSQL/17/setup_090_backlog_idx.sql + ./SQL/PostgreSQL/17/insert_quasseluser.sql + ./SQL/PostgreSQL/17/update_network_set_usermode.sql + ./SQL/PostgreSQL/17/delete_backlog_for_buffer.sql + ./SQL/PostgreSQL/17/update_network_set_awaymsg.sql + ./SQL/PostgreSQL/17/upgrade_000_alter_quasseluser_add_passwordversion.sql + ./SQL/PostgreSQL/17/update_backlog_bufferid.sql + ./SQL/PostgreSQL/17/update_buffer_markerlinemsgid.sql + ./SQL/PostgreSQL/17/update_buffer_lastseen.sql + ./SQL/PostgreSQL/17/insert_buffer.sql + ./SQL/PostgreSQL/17/select_authuser.sql + ./SQL/PostgreSQL/17/select_user_setting.sql + ./SQL/PostgreSQL/17/migrate_write_network.sql + ./SQL/PostgreSQL/17/select_bufferByName.sql + ./SQL/PostgreSQL/17/insert_server.sql + ./SQL/PostgreSQL/17/delete_networks_by_uid.sql + ./SQL/PostgreSQL/17/migrate_write_sender.sql + ./SQL/PostgreSQL/17/delete_buffers_by_uid.sql + ./SQL/PostgreSQL/17/setup_100_user_setting.sql + ./SQL/PostgreSQL/15/upgrade_000_alter_buffer_add_markerlinemsgid.sql diff --git a/src/core/sqlitestorage.cpp b/src/core/sqlitestorage.cpp index 837e6b8a..46e2c70e 100644 --- a/src/core/sqlitestorage.cpp +++ b/src/core/sqlitestorage.cpp @@ -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(query.value(2).toInt()); } } unlock(); - return userId; + UserId returnUserId; + if (userId != 0 && checkHashedPassword(userId, password, hashedPassword, hashVersion)) { + returnUserId = userId; + } + return returnUserId; } diff --git a/src/core/storage.cpp b/src/core/storage.cpp index 2e81de67..b8f17468 100644 --- a/src/core/storage.cpp +++ b/src/core/storage.cpp @@ -22,13 +22,93 @@ #include +#if QT_VERSION < 0x050000 +# include "../../3rdparty/sha512/sha512.h" +#endif + Storage::Storage(QObject *parent) : QObject(parent) { } +QString Storage::hashPassword(const QString &password) +{ + return hashPasswordSha2_512(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; + + case Storage::HashVersion::Sha2_512: + passwordCorrect = checkHashedPasswordSha2_512(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; +} + +QString Storage::hashPasswordSha2_512(const QString &password) +{ + // Generate a salt of 512 bits (64 bytes) using the Mersenne Twister + std::random_device seed; + std::mt19937 generator(seed()); + std::uniform_int_distribution distribution(0, 255); + QByteArray saltBytes; + saltBytes.resize(64); + for (int i = 0; i < 64; i++) { + saltBytes[i] = (unsigned char) distribution(generator); + } + QString salt(saltBytes.toHex()); + + // Append the salt to the password, hash the result, and append the salt value + return sha2_512(password + salt) + ":" + salt; +} + +bool Storage::checkHashedPasswordSha2_512(const QString &password, const QString &hashedPassword) +{ + QRegExp colonSplitter("\\:"); + QStringList hashedPasswordAndSalt = hashedPassword.split(colonSplitter); + + if (hashedPasswordAndSalt.size() == 2){ + return sha2_512(password + hashedPasswordAndSalt[1]) == hashedPasswordAndSalt[0]; + } + else { + qWarning() << "Password hash and salt were not in the correct format"; + return false; + } +} + +QString Storage::sha2_512(const QString &input) +{ +#if QT_VERSION >= 0x050000 + return QString(QCryptographicHash::hash(input.toUtf8(), QCryptographicHash::Sha512).toHex()); +#else + QByteArray inputBytes = input.toUtf8(); + unsigned char output[64]; + sha512((unsigned char*) inputBytes.constData(), inputBytes.size(), output, false); + return QString(QByteArray::fromRawData((char*) output, 64).toHex()); +#endif +} diff --git a/src/core/storage.h b/src/core/storage.h index 9984d317..87e9b842 100644 --- a/src/core/storage.h +++ b/src/core/storage.h @@ -42,6 +42,13 @@ public: NotAvailable // remove the storage backend from the list of avaliable backends }; + enum HashVersion { + Sha1, + Sha2_512, + Latest=Sha2_512 + + }; + public slots: /* General */ @@ -408,10 +415,16 @@ 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); + + QString hashPasswordSha2_512(const QString &password); + bool checkHashedPasswordSha2_512(const QString &password, const QString &hashedPassword); + QString sha2_512(const QString &input); }; diff --git a/src/qtui/CMakeLists.txt b/src/qtui/CMakeLists.txt index f17cd454..be9a14b5 100644 --- a/src/qtui/CMakeLists.txt +++ b/src/qtui/CMakeLists.txt @@ -34,6 +34,7 @@ set(SOURCES markerlineitem.cpp msgprocessorstatuswidget.cpp nicklistwidget.cpp + passwordchangedlg.cpp qtui.cpp qtuiapplication.cpp qtuimessageprocessor.cpp @@ -71,6 +72,7 @@ set(FORMS inputwidget.ui msgprocessorstatuswidget.ui nicklistwidget.ui + passwordchangedlg.ui settingsdlg.ui settingspagedlg.ui simplenetworkeditor.ui diff --git a/src/qtui/chatscene.cpp b/src/qtui/chatscene.cpp index a0d9be3b..e03d7cad 100644 --- a/src/qtui/chatscene.cpp +++ b/src/qtui/chatscene.cpp @@ -832,7 +832,8 @@ void ChatScene::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) searchSelectionText = searchSelectionText.left(_webSearchSelectionTextMaxVisible).append(QString::fromUtf8("…")); searchSelectionText = tr("Search '%1'").arg(searchSelectionText); - menu.addAction(QIcon::fromTheme("edit-find"), searchSelectionText, this, SLOT(webSearchOnSelection())); + QAction *webSearchAction = new Action(QIcon::fromTheme("edit-find"), searchSelectionText, &menu, this, SLOT(webSearchOnSelection())); + menu.insertAction(sep, webSearchAction); } if (QtUi::mainWindow()->menuBar()->isHidden()) diff --git a/src/qtui/mainwin.cpp b/src/qtui/mainwin.cpp index 84c31597..8f022cac 100644 --- a/src/qtui/mainwin.cpp +++ b/src/qtui/mainwin.cpp @@ -87,6 +87,7 @@ #include "legacysystemtray.h" #include "msgprocessorstatuswidget.h" #include "nicklistwidget.h" +#include "passwordchangedlg.h" #include "qtuiapplication.h" #include "qtuimessageprocessor.h" #include "qtuisettings.h" @@ -197,8 +198,6 @@ void MainWin::init() connect(Client::coreConnection(), SIGNAL(handleSslErrors(const QSslSocket *, bool *, bool *)), SLOT(handleSslErrors(const QSslSocket *, bool *, bool *))); #endif - connect(this, SIGNAL(changePassword(QString)), Client::instance(), SLOT(changePassword(QString))); - // Setup Dock Areas setDockNestingEnabled(true); setCorner(Qt::TopLeftCorner, Qt::LeftDockWidgetArea); @@ -363,7 +362,7 @@ void MainWin::setupActions() coll->addAction("DisconnectCore", new Action(QIcon::fromTheme("network-disconnect"), tr("&Disconnect from Core"), coll, Client::instance(), SLOT(disconnectFromCore()))); coll->addAction("ChangePassword", new Action(QIcon::fromTheme("dialog-password"), tr("Change &Password..."), coll, - this, SLOT(showChangePasswordDialog()))); + this, SLOT(showPasswordChangeDlg()))); coll->addAction("CoreInfo", new Action(QIcon::fromTheme("help-about"), tr("Core &Info..."), coll, this, SLOT(showCoreInfoDlg()))); coll->addAction("ConfigureNetworks", new Action(QIcon::fromTheme("configure"), tr("Configure &Networks..."), coll, @@ -738,14 +737,11 @@ void MainWin::changeActiveBufferView(int bufferViewId) } -void MainWin::showChangePasswordDialog() +void MainWin::showPasswordChangeDlg() { if((Client::coreFeatures() & Quassel::PasswordChange)) { - bool ok; - QString newPassword = QInputDialog::getText(this, tr("Set Core Password"), tr("New password for your Quassel Core:"), QLineEdit::Password, QString(), &ok); - if (ok && !newPassword.isEmpty()) { - emit changePassword(newPassword); - } + PasswordChangeDlg dlg(this); + dlg.exec(); } else { QMessageBox box(QMessageBox::Warning, tr("Feature Not Supported"), diff --git a/src/qtui/mainwin.h b/src/qtui/mainwin.h index 44444266..900354b1 100644 --- a/src/qtui/mainwin.h +++ b/src/qtui/mainwin.h @@ -123,6 +123,7 @@ private slots: void showNotificationsDlg(); void showIgnoreList(QString newRule = QString()); void showShortcutsDlg(); + void showPasswordChangeDlg(); void showNewTransferDlg(const ClientTransfer *transfer); void onFullScreenToggled(); @@ -164,12 +165,9 @@ private slots: void changeActiveBufferView(bool backwards); void changeActiveBufferView(int bufferViewId); - void showChangePasswordDialog(); - signals: void connectToCore(const QVariantMap &connInfo); void disconnectFromCore(); - void changePassword(QString newPassword); private: #ifdef HAVE_KDE diff --git a/src/qtui/passwordchangedlg.cpp b/src/qtui/passwordchangedlg.cpp new file mode 100644 index 00000000..7009adf6 --- /dev/null +++ b/src/qtui/passwordchangedlg.cpp @@ -0,0 +1,75 @@ +/*************************************************************************** + * Copyright (C) 2005-2015 by the Quassel Project * + * devel@quassel-irc.org * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) version 3. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#include "passwordchangedlg.h" + +#include +#include + +#include "client.h" + +PasswordChangeDlg::PasswordChangeDlg(QWidget *parent) : QDialog(parent) +{ + ui.setupUi(this); + + CoreAccount account = Client::currentCoreAccount(); + ui.infoLabel->setText(tr("This changes the password for your username %1 " + "on the Quassel Core running at %2.") + .arg(account.user(), account.hostName())); + + connect(ui.oldPasswordEdit, SIGNAL(textChanged(QString)), SLOT(inputChanged())); + connect(ui.newPasswordEdit, SIGNAL(textChanged(QString)), SLOT(inputChanged())); + connect(ui.confirmPasswordEdit, SIGNAL(textChanged(QString)), SLOT(inputChanged())); + connect(ui.buttonBox, SIGNAL(accepted()), SLOT(changePassword())); + + connect(Client::instance(), SIGNAL(passwordChanged(bool)), SLOT(passwordChanged(bool))); + + ui.buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); +} + + +void PasswordChangeDlg::inputChanged() +{ + bool ok = !ui.oldPasswordEdit->text().isEmpty() && !ui.newPasswordEdit->text().isEmpty() + && ui.newPasswordEdit->text() == ui.confirmPasswordEdit->text(); + ui.buttonBox->button(QDialogButtonBox::Ok)->setEnabled(ok); +} + + +void PasswordChangeDlg::changePassword() +{ + ui.buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); + Client::changePassword(ui.oldPasswordEdit->text(), ui.newPasswordEdit->text()); +} + + +void PasswordChangeDlg::passwordChanged(bool success) +{ + if (!success) { + QMessageBox box(QMessageBox::Warning, tr("Password Not Changed"), + tr("Password change failed"), + QMessageBox::Ok, this); + box.setInformativeText(tr("The core reported an error when trying to change your password. Make sure you entered your old password correctly!")); + box.exec(); + } + else { + accept(); + } +} diff --git a/src/qtui/passwordchangedlg.h b/src/qtui/passwordchangedlg.h new file mode 100644 index 00000000..36bfc63b --- /dev/null +++ b/src/qtui/passwordchangedlg.h @@ -0,0 +1,42 @@ +/*************************************************************************** + * Copyright (C) 2005-2015 by the Quassel Project * + * devel@quassel-irc.org * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) version 3. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#pragma once + +#include + +#include "ui_passwordchangedlg.h" + +class PasswordChangeDlg : public QDialog +{ + Q_OBJECT + +public: + PasswordChangeDlg(QWidget *parent = nullptr); + +private slots: + void inputChanged(); + void changePassword(); + void passwordChanged(bool success); + +private: + Ui::PasswordChangeDlg ui; + QString _newPassword; +}; diff --git a/src/qtui/settingspages/networkssettingspage.cpp b/src/qtui/settingspages/networkssettingspage.cpp index 011328d5..f422ebb5 100644 --- a/src/qtui/settingspages/networkssettingspage.cpp +++ b/src/qtui/settingspages/networkssettingspage.cpp @@ -869,12 +869,30 @@ ServerEditDlg::ServerEditDlg(const Network::Server &server, QWidget *parent) : Q ui.port->setValue(server.port); ui.password->setText(server.password); ui.useSSL->setChecked(server.useSsl); + ui.sslVersion->setCurrentIndex(server.sslVersion); ui.useProxy->setChecked(server.useProxy); ui.proxyType->setCurrentIndex(server.proxyType == QNetworkProxy::Socks5Proxy ? 0 : 1); ui.proxyHost->setText(server.proxyHost); ui.proxyPort->setValue(server.proxyPort); ui.proxyUsername->setText(server.proxyUser); ui.proxyPassword->setText(server.proxyPass); + + // This is a dirty hack to display the core->IRC SSL protocol dropdown + // only if the core won't use autonegotiation to determine the best + // protocol. When autonegotiation was introduced, it would have been + // a good idea to use the CoreFeatures enum to accomplish this. + // However, since multiple versions have been released since then, that + // is no longer possible. Instead, we rely on the fact that the + // Datastream protocol was introduced in the same version (0.10) as SSL + // autonegotiation. Because of that, we can display the dropdown only + // if the Legacy protocol is in use. If any other RemotePeer protocol + // is in use, that means a newer protocol is in use and therefore the + // core will use autonegotiation. + if (Client::coreConnection()->peer()->protocol() != Protocol::LegacyProtocol) { + ui.label_3->hide(); + ui.sslVersion->hide(); + } + on_host_textChanged(); } @@ -882,6 +900,7 @@ ServerEditDlg::ServerEditDlg(const Network::Server &server, QWidget *parent) : Q Network::Server ServerEditDlg::serverData() const { Network::Server server(ui.host->text().trimmed(), ui.port->value(), ui.password->text(), ui.useSSL->isChecked()); + server.sslVersion = ui.sslVersion->currentIndex(); server.useProxy = ui.useProxy->isChecked(); server.proxyType = ui.proxyType->currentIndex() == 0 ? QNetworkProxy::Socks5Proxy : QNetworkProxy::HttpProxy; server.proxyHost = ui.proxyHost->text(); diff --git a/src/qtui/settingspages/servereditdlg.ui b/src/qtui/settingspages/servereditdlg.ui index d16d1e49..29177102 100644 --- a/src/qtui/settingspages/servereditdlg.ui +++ b/src/qtui/settingspages/servereditdlg.ui @@ -119,6 +119,52 @@ Advanced + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + SSL Version: + + + + + + + Use only TLSv1 unless you know what you are doing! + + + + SSLv3 (insecure) + + + + + SSLv2 (insecure) + + + + + TLSv1 + + + + + + @@ -263,6 +309,7 @@ port password useSSL + sslVersion useProxy proxyType proxyHost diff --git a/src/qtui/ui/passwordchangedlg.ui b/src/qtui/ui/passwordchangedlg.ui new file mode 100644 index 00000000..cf68c1f9 --- /dev/null +++ b/src/qtui/ui/passwordchangedlg.ui @@ -0,0 +1,124 @@ + + + PasswordChangeDlg + + + + 0 + 0 + 455 + 173 + + + + Change Password + + + + + + + + <html><head/><body><p>This changes the password for your username <span style=" font-weight:600;">John</span> on the Quassel Core running at <span style=" font-weight:600;">example.invalid</span>.</p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + true + + + + + + + + + Old password: + + + + + + + QLineEdit::Password + + + + + + + New Password: + + + + + + + QLineEdit::Password + + + + + + + Confirm password: + + + + + + + QLineEdit::Password + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + + + buttonBox + rejected() + PasswordChangeDlg + reject() + + + 248 + 152 + + + 229 + -14 + + + + +