From: Manuel Nickschas Date: Wed, 11 Mar 2015 19:13:12 +0000 (+0100) Subject: Merge pull request #111 from mamarley/nosslloopback X-Git-Tag: 0.12-rc1~5 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=4988547cbb3c35016872a4ed8dbcc1376473ad80;hp=86399b61aa6f0d5101bf02588eb99fdcfdea3c63 Merge pull request #111 from mamarley/nosslloopback Don't require SSL for loopback connections with --require-ssl --- 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 1cd2ccab..baf926d0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,7 +12,7 @@ project(QuasselIRC) set(QUASSEL_MAJOR 0) set(QUASSEL_MINOR 12) set(QUASSEL_PATCH 0) -set(QUASSEL_VERSION_STRING "0.12-pre") +set(QUASSEL_VERSION_STRING "0.12-beta1") # Tell CMake about or own modules set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) @@ -262,7 +262,7 @@ if (USE_QT5) endif() if (WITH_KDE) - find_package(KF5 COMPONENTS ConfigWidgets CoreAddons 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" @@ -563,6 +563,17 @@ include(GetGitRevisionDescription) get_git_head_revision(GIT_REFSPEC GIT_HEAD) git_describe(GIT_DESCRIBE --long) +# If not in a Git repo try to read GIT_HEAD and GIT_DESCRIBE from +# enviroment +if (NOT GIT_HEAD OR NOT GIT_DESCRIBE) + if (DEFINED ENV{GIT_HEAD}) + set(GIT_HEAD ${GIT_HEAD}) + endif () + if (DEFINED ENV{GIT_DESCRIBE}) + set(GIT_DESCRIBE ${GIT_DESCRIBE}) + endif() +endif() + # Sanitize things if we're not in a Git repo if (NOT GIT_HEAD OR NOT GIT_DESCRIBE) set(GIT_HEAD "") diff --git a/ChangeLog b/ChangeLog index 562928d0..617cd84e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -13,6 +13,18 @@ changes, the git history at is your friend. Without further ado, let's start: +Version 0.12.0 (TBA) +==================== + +* Full support for KDE Frameworks +* Remote password change +* Core connection improvements +* Build system improvements +* PostgreSQL connection improvements +* Improve Qt5 support +* Qt 4.8+ or Qt 5.2+ now required +* Several tweaks and fixes + Version 0.11.0 (2014-09-23) =========================== diff --git a/INSTALL b/INSTALL index a9dc9e2b..d4e39209 100644 --- a/INSTALL +++ b/INSTALL @@ -27,14 +27,14 @@ example a compiler. As we use a subset of the C++11 standard, we require a fairly recent compiler: - gcc 4.7+ (available for most platforms), or -- Clang 3.2+ (available for most platforms, or +- Clang 3.2+ (available for most platforms), or - XCode 4.6+ (available for Max OS X and based on Clang), or -- Visual C++ 2013 (available for Windows™), or +- Visual C++ Nov 2013 CTP (available for Windows™), or - any other compiler with decent C++11 support -Furthermore, CMake 2.8.9 or later is required. +Furthermore, CMake 2.8.9 or later is required (2.8.12 for KDE Frameworks). -As Quassel is a Qt application, you need the Qt SDK, either Qt 4.6+ or Qt 5.2+. +As Quassel is a Qt application, you need the Qt SDK, either Qt 4.8+ or Qt 5.2+. There are several optional dependencies; we will talk about that later. @@ -58,7 +58,7 @@ First of all, it is highly recommended for any CMake-based project to be built in a separate build directory rather than in-source. That way, your source checkout remains pristine, and you can easily remove any build artifacts by just deleting the build directory. This directory can be located anywhere; in the -short example above, we just created a directory called "build" inside the +short example above, we've just created a directory called "build" inside the source checkout. From inside the build directory, you can then run the "cmake" command, followed @@ -80,7 +80,7 @@ options here: things may happen. -DWITH_KDE=ON - Enable integration into KDE4; only available if -DUSE_QT5=OFF + Enable integration into KDE4 (with Qt4) or KDE Frameworks (with Qt5). -DWITH_OXYGEN=(ON|OFF) Install the parts of the Oxygen icon set Quassel uses. Oxygen is the default @@ -92,7 +92,8 @@ options here: -DWITH_WEBKIT=OFF Use Webkit for showing previews of webpages linked in the chat. Requires the QtWebkit module to be available, and increases the client's RAM usage - by *a lot* if enabled at runtime. + by *a lot* if enabled at runtime. Note also that Webkit frequently crashes + especially on Windows. -DEMBED_DATA=(ON|OFF) Specifies whether Quassel's data files (icons, translations and so on) diff --git a/data/CMakeLists.txt b/data/CMakeLists.txt index 04b322b3..5c6762d5 100644 --- a/data/CMakeLists.txt +++ b/data/CMakeLists.txt @@ -8,9 +8,13 @@ if (BUILD_GUI) install(FILES quassel.desktop DESTINATION ${CMAKE_INSTALL_APPDIR}) endif() - if (KDE4_FOUND) + if (WITH_KDE4) install(FILES quassel.notifyrc DESTINATION ${CMAKE_INSTALL_DATADIR}/quassel) endif() + + if (WITH_KF5) + install(FILES quassel.notifyrc DESTINATION ${CMAKE_INSTALL_KNOTIFY5RCDIR}) + endif() endif() if (EMBED_DATA) diff --git a/src/client/client.cpp b/src/client/client.cpp index 7bbbefe7..54a93fb3 100644 --- a/src/client/client.cpp +++ b/src/client/client.cpp @@ -48,6 +48,7 @@ #include "quassel.h" #include "signalproxy.h" #include "util.h" +#include "clientauthhandler.h" #include #include @@ -152,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())); @@ -383,32 +387,34 @@ void Client::setSyncedToCore() connect(bufferSyncer(), SIGNAL(buffersPermanentlyMerged(BufferId, BufferId)), _messageModel, SLOT(buffersPermanentlyMerged(BufferId, BufferId))); connect(bufferSyncer(), SIGNAL(bufferMarkedAsRead(BufferId)), SIGNAL(bufferMarkedAsRead(BufferId))); connect(networkModel(), SIGNAL(requestSetLastSeenMsg(BufferId, MsgId)), bufferSyncer(), SLOT(requestSetLastSeenMsg(BufferId, const MsgId &))); - signalProxy()->synchronize(bufferSyncer()); + + SignalProxy *p = signalProxy(); + p->synchronize(bufferSyncer()); // create a new BufferViewManager Q_ASSERT(!_bufferViewManager); - _bufferViewManager = new ClientBufferViewManager(signalProxy(), this); + _bufferViewManager = new ClientBufferViewManager(p, this); connect(_bufferViewManager, SIGNAL(initDone()), _bufferViewOverlay, SLOT(restore())); // create AliasManager Q_ASSERT(!_aliasManager); _aliasManager = new ClientAliasManager(this); connect(aliasManager(), SIGNAL(initDone()), SLOT(sendBufferedUserInput())); - signalProxy()->synchronize(aliasManager()); + p->synchronize(aliasManager()); // create NetworkConfig Q_ASSERT(!_networkConfig); _networkConfig = new NetworkConfig("GlobalNetworkConfig", this); - signalProxy()->synchronize(networkConfig()); + p->synchronize(networkConfig()); // create IgnoreListManager Q_ASSERT(!_ignoreListManager); _ignoreListManager = new ClientIgnoreListManager(this); - signalProxy()->synchronize(ignoreListManager()); + p->synchronize(ignoreListManager()); Q_ASSERT(!_transferManager); _transferManager = new ClientTransferManager(this); - signalProxy()->synchronize(transferManager()); + p->synchronize(transferManager()); // trigger backlog request once all active bufferviews are initialized connect(bufferViewOverlay(), SIGNAL(initDone()), this, SLOT(requestInitialBacklog())); @@ -646,6 +652,22 @@ void Client::markBufferAsRead(BufferId id) } +void Client::changePassword(const QString &oldPassword, const QString &newPassword) { + CoreAccount account = currentCoreAccount(); + account.setPassword(newPassword); + coreAccountModel()->createOrUpdateAccount(account); + emit instance()->requestPasswordChange(nullptr, account.user(), oldPassword, newPassword); +} + + +void Client::corePasswordChanged(PeerPtr, bool success) +{ + if (success) + coreAccountModel()->save(); + emit passwordChanged(success); +} + + #if QT_VERSION < 0x050000 void Client::logMessage(QtMsgType type, const char *msg) { diff --git a/src/client/client.h b/src/client/client.h index 8c707f34..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,6 +193,10 @@ signals: */ void bufferMarkedAsRead(BufferId id); + //! 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(); @@ -214,6 +220,8 @@ private slots: void coreNetworkCreated(NetworkId); void coreNetworkRemoved(NetworkId); + void corePasswordChanged(PeerPtr, bool success); + void requestInitialBacklog(); void sendBufferedUserInput(); 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/main.cpp b/src/common/main.cpp index d4833a4f..b13d3eef 100644 --- a/src/common/main.cpp +++ b/src/common/main.cpp @@ -49,6 +49,7 @@ # include "kcmdlinewrapper.h" #elif defined HAVE_KF5 # include +# include # include "qt5cliparser.h" #elif defined HAVE_QT5 # include "qt5cliparser.h" @@ -102,6 +103,13 @@ int main(int argc, char **argv) # endif #endif + // Migrate settings from KDE4 to KF5 if appropriate +#ifdef HAVE_KF5 + Kdelibs4ConfigMigrator migrator(QCoreApplication::applicationName()); + migrator.setConfigFiles(QStringList() << "quasselrc" << "quassel.notifyrc"); + migrator.migrate(); +#endif + AbstractCliParser *cliParser; #ifdef HAVE_KDE4 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..b9dfed16 100644 --- a/src/common/peer.h +++ b/src/common/peer.h @@ -86,6 +86,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/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/quassel.h b/src/common/quassel.h index bcfad072..30d3d35f 100644 --- a/src/common/quassel.h +++ b/src/common/quassel.h @@ -71,8 +71,9 @@ public: SaslAuthentication = 0x0002, SaslExternal = 0x0004, HideInactiveNetworks = 0x0008, + PasswordChange = 0x0010, - NumFeatures = 0x0008 + NumFeatures = 0x0010 }; Q_DECLARE_FLAGS(Features, Feature); 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 e7b56392..2049b63b 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -818,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 a17211d8..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 @@ -524,6 +533,8 @@ private slots: void socketError(QAbstractSocket::SocketError err, const QString &errorString); void setupClientSession(RemotePeer *, UserId); + void changeUserPass(const QString &username); + private: Core(); ~Core(); @@ -541,7 +552,6 @@ private: void unregisterStorageBackend(Storage *); bool selectBackend(const QString &backend); void createUser(); - void changeUserPass(const QString &username); void saveBackendSettings(const QString &backend, const QVariantMap &settings); QVariantMap promptForSettings(const Storage *storage); diff --git a/src/core/coresession.cpp b/src/core/coresession.cpp index 112aa856..5fd5bdcf 100644 --- a/src/core/coresession.cpp +++ b/src/core/coresession.cpp @@ -100,6 +100,9 @@ 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(changePassword(PeerPtr,QString,QString,QString)), this, SLOT(changePassword(PeerPtr,QString,QString,QString))); + p->attachSignal(this, SIGNAL(passwordChanged(PeerPtr,bool))); + loadSettings(); initScriptEngine(); @@ -638,3 +641,13 @@ void CoreSession::globalAway(const QString &msg) net->userInputHandler()->issueAway(msg, false /* no force away */); } } + +void CoreSession::changePassword(PeerPtr peer, const QString &userName, const QString &oldPassword, const QString &newPassword) +{ + 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 3eecc4bb..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,6 +127,8 @@ 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 @@ -158,6 +160,8 @@ signals: void networkRemoved(NetworkId); void networkDisconnected(NetworkId); + void passwordChanged(PeerPtr peer, bool success); + protected: virtual void customEvent(QEvent *event); diff --git a/src/core/coreuserinputhandler.cpp b/src/core/coreuserinputhandler.cpp index 832c2e0c..33d1f67a 100644 --- a/src/core/coreuserinputhandler.cpp +++ b/src/core/coreuserinputhandler.cpp @@ -545,6 +545,16 @@ void CoreUserInputHandler::handlePing(const BufferInfo &bufferInfo, const QStrin } +void CoreUserInputHandler::handlePrint(const BufferInfo &bufferInfo, const QString &msg) +{ + if (bufferInfo.bufferName().isEmpty() || !bufferInfo.acceptsRegularMessages()) + return; // server buffer + + QByteArray encMsg = channelEncode(bufferInfo.bufferName(), msg); + emit displayMsg(Message::Info, bufferInfo.type(), bufferInfo.bufferName(), msg, network()->myNick(), Message::Self); +} + + // TODO: implement queries void CoreUserInputHandler::handleQuery(const BufferInfo &bufferInfo, const QString &msg) { diff --git a/src/core/coreuserinputhandler.h b/src/core/coreuserinputhandler.h index dd9696c4..69a429ee 100644 --- a/src/core/coreuserinputhandler.h +++ b/src/core/coreuserinputhandler.h @@ -63,6 +63,7 @@ public slots: void handleHalfop(const BufferInfo& bufferInfo, const QString &nicks); void handlePart(const BufferInfo &bufferInfo, const QString &text); void handlePing(const BufferInfo &bufferInfo, const QString &text); + void handlePrint(const BufferInfo &bufferInfo, const QString &text); void handleQuery(const BufferInfo &bufferInfo, const QString &text); void handleQuit(const BufferInfo &bufferInfo, const QString &text); void handleQuote(const BufferInfo &bufferInfo, const QString &text); 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/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 f54c00e0..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 @@ -89,7 +91,8 @@ if (WITH_KDE4) endif() if (WITH_KF5) - list(APPEND LIBS KF5::ConfigWidgets KF5::XmlGui) + list(APPEND SOURCES knotificationbackend.cpp) + list(APPEND LIBS KF5::ConfigWidgets KF5::Notifications KF5::NotifyConfig KF5::WidgetsAddons KF5::XmlGui) endif() if (LIBSNORE_FOUND) diff --git a/src/qtui/knotificationbackend.cpp b/src/qtui/knotificationbackend.cpp index 41d56385..1b09927a 100644 --- a/src/qtui/knotificationbackend.cpp +++ b/src/qtui/knotificationbackend.cpp @@ -18,13 +18,19 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ -#include -#include +#include "knotificationbackend.h" + #include #include #include -#include "knotificationbackend.h" +#ifdef HAVE_KDE4 +# include +# include +#else +# include +# include +#endif #include "client.h" #include "mainwin.h" diff --git a/src/qtui/knotificationbackend.h b/src/qtui/knotificationbackend.h index 2f21c9ef..25abcf93 100644 --- a/src/qtui/knotificationbackend.h +++ b/src/qtui/knotificationbackend.h @@ -18,8 +18,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ -#ifndef KNOTIFICATIONBACKEND_H_ -#define KNOTIFICATIONBACKEND_H_ +#pragma once #include @@ -52,7 +51,7 @@ private: void removeNotificationById(uint id); void updateToolTip(); - QList > > _notifications; + QList>> _notifications; }; @@ -72,6 +71,3 @@ private slots: private: KNotifyConfigWidget *_widget; }; - - -#endif diff --git a/src/qtui/mainwin.cpp b/src/qtui/mainwin.cpp index b64a0d93..8f022cac 100644 --- a/src/qtui/mainwin.cpp +++ b/src/qtui/mainwin.cpp @@ -25,22 +25,23 @@ #include #include #include +#include #ifdef HAVE_KDE4 -# include -# include # include # include # include # include # include # include -# include #endif #ifdef HAVE_KF5 # include # include +# include +# include +# include #endif #ifdef Q_WS_X11 @@ -86,6 +87,7 @@ #include "legacysystemtray.h" #include "msgprocessorstatuswidget.h" #include "nicklistwidget.h" +#include "passwordchangedlg.h" #include "qtuiapplication.h" #include "qtuimessageprocessor.h" #include "qtuisettings.h" @@ -98,7 +100,7 @@ #include "topicwidget.h" #include "verticaldock.h" -#ifndef HAVE_KDE4 +#ifndef HAVE_KDE # ifdef HAVE_PHONON # include "phononnotificationbackend.h" # endif @@ -107,9 +109,9 @@ # endif # include "systraynotificationbackend.h" # include "taskbarnotificationbackend.h" -#else /* HAVE_KDE4 */ +#else /* HAVE_KDE */ # include "knotificationbackend.h" -#endif /* HAVE_KDE4 */ +#endif /* HAVE_KDE */ #ifdef HAVE_SSL # include "sslinfodlg.h" @@ -145,7 +147,7 @@ #include "settingspages/notificationssettingspage.h" #include "settingspages/topicwidgetsettingspage.h" -#ifndef HAVE_KDE4 +#ifndef HAVE_KDE # include "settingspages/shortcutssettingspage.h" #endif @@ -218,7 +220,7 @@ void MainWin::init() setupTitleSetter(); setupHotList(); -#ifndef HAVE_KDE4 +#ifndef HAVE_KDE # ifdef HAVE_PHONON QtUi::registerNotificationBackend(new PhononNotificationBackend(this)); # endif @@ -230,9 +232,9 @@ void MainWin::init() QtUi::registerNotificationBackend(new TaskbarNotificationBackend(this)); -#else /* HAVE_KDE4 */ +#else /* HAVE_KDE */ QtUi::registerNotificationBackend(new KNotificationBackend(this)); -#endif /* HAVE_KDE4 */ +#endif /* HAVE_KDE */ #ifdef HAVE_INDICATEQT QtUi::registerNotificationBackend(new IndicatorNotificationBackend(this)); @@ -359,6 +361,8 @@ void MainWin::setupActions() this, SLOT(showCoreConnectionDlg()))); 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(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, @@ -385,14 +389,14 @@ void MainWin::setupActions() coll->addAction("ToggleStatusBar", new Action(tr("Show Status &Bar"), coll, 0, 0))->setCheckable(true); -#ifdef HAVE_KDE4 - QAction *fullScreenAct = KStandardAction::fullScreen(this, SLOT(onFullScreenToggled()), this, coll); +#ifdef HAVE_KDE + _fullScreenAction = KStandardAction::fullScreen(this, SLOT(onFullScreenToggled()), this, coll); #else - QAction *fullScreenAct = new Action(QIcon::fromTheme("view-fullscreen"), tr("&Full Screen Mode"), coll, + _fullScreenAction = new Action(QIcon::fromTheme("view-fullscreen"), tr("&Full Screen Mode"), coll, this, SLOT(onFullScreenToggled()), QKeySequence(Qt::Key_F11)); - fullScreenAct->setCheckable(true); + _fullScreenAction->setCheckable(true); + coll->addAction("ToggleFullScreen", _fullScreenAction); #endif - coll->addAction("ToggleFullScreen", fullScreenAct); // Settings QAction *configureShortcutsAct = new Action(QIcon::fromTheme("configure-shortcuts"), tr("Configure &Shortcuts..."), coll, @@ -512,7 +516,7 @@ void MainWin::setupMenus() _fileMenu = menuBar()->addMenu(tr("&File")); static const QStringList coreActions = QStringList() - << "ConnectCore" << "DisconnectCore" << "CoreInfo"; + << "ConnectCore" << "DisconnectCore" << "ChangePassword" << "CoreInfo"; QAction *coreAction; foreach(QString actionName, coreActions) { @@ -546,7 +550,7 @@ void MainWin::setupMenus() _viewMenu->addAction(coll->action("LockLayout")); _settingsMenu = menuBar()->addMenu(tr("&Settings")); -#ifdef HAVE_KDE4 +#ifdef HAVE_KDE _settingsMenu->addAction(KStandardAction::configureNotifications(this, SLOT(showNotificationsDlg()), this)); _settingsMenu->addAction(KStandardAction::keyBindings(this, SLOT(showShortcutsDlg()), this)); #else @@ -554,6 +558,7 @@ void MainWin::setupMenus() #endif _settingsMenu->addAction(coll->action("ConfigureQuassel")); + _helpMenu = menuBar()->addMenu(tr("&Help")); _helpMenu->addAction(coll->action("AboutQuassel")); @@ -732,6 +737,22 @@ void MainWin::changeActiveBufferView(int bufferViewId) } +void MainWin::showPasswordChangeDlg() +{ + if((Client::coreFeatures() & Quassel::PasswordChange)) { + PasswordChangeDlg dlg(this); + dlg.exec(); + } + else { + QMessageBox box(QMessageBox::Warning, tr("Feature Not Supported"), + tr("Your Quassel Core does not support this feature"), + QMessageBox::Ok, this); + box.setInformativeText(tr("You need a Quassel Core v0.12.0 or newer in order to be able to remotely change your password.")); + box.exec(); + } +} + + void MainWin::changeActiveBufferView(bool backwards) { BufferView *current = activeBufferView(); @@ -922,7 +943,7 @@ void MainWin::setupTopicWidget() void MainWin::setupViewMenuTail() { _viewMenu->addSeparator(); - _viewMenu->addAction(QtUi::actionCollection("General")->action("ToggleFullScreen")); + _viewMenu->addAction(_fullScreenAction); } @@ -1003,7 +1024,7 @@ void MainWin::setupToolBars() setUnifiedTitleAndToolBarOnMac(true); #endif -#ifdef HAVE_KDE4 +#ifdef HAVE_KDE _mainToolBar = new KToolBar("MainToolBar", this, Qt::TopToolBarArea, false, true, true); #else _mainToolBar = new QToolBar(this); @@ -1054,6 +1075,7 @@ void MainWin::setConnectedState() coll->action("ConnectCore")->setEnabled(false); coll->action("DisconnectCore")->setEnabled(true); + coll->action("ChangePassword")->setEnabled(true); coll->action("CoreInfo")->setEnabled(true); foreach(QAction *action, _fileMenu->actions()) { @@ -1170,6 +1192,7 @@ void MainWin::setDisconnectedState() coll->action("ConnectCore")->setEnabled(true); coll->action("DisconnectCore")->setEnabled(false); coll->action("CoreInfo")->setEnabled(false); + coll->action("ChangePassword")->setEnabled(false); //_viewMenu->setEnabled(false); statusBar()->showMessage(tr("Not connected to core.")); if (_msgProcessorStatusWidget) @@ -1368,11 +1391,11 @@ void MainWin::showAboutDlg() void MainWin::showShortcutsDlg() { -#ifdef HAVE_KDE4 +#ifdef HAVE_KDE KShortcutsDialog dlg(KShortcutsEditor::AllActions, KShortcutsEditor::LetterShortcutsDisallowed, this); foreach(KActionCollection *coll, QtUi::actionCollections()) dlg.addCollection(coll, coll->property("Category").toString()); - dlg.exec(); + dlg.configure(true); #else SettingsPageDlg dlg(new ShortcutsSettingsPage(QtUi::actionCollections(), this), this); dlg.exec(); @@ -1392,15 +1415,10 @@ void MainWin::onFullScreenToggled() // Relying on QWidget::isFullScreen is discouraged, see the KToggleFullScreenAction docs // Also, one should not use showFullScreen() or showNormal(), as those reset all other window flags - QAction *action = QtUi::actionCollection("General")->action("ToggleFullScreen"); - if (!action) - return; - -#ifdef HAVE_KDE4 - KToggleFullScreenAction *kAct = static_cast(action); - kAct->setFullScreen(this, kAct->isChecked()); +#ifdef HAVE_KDE + static_cast(_fullScreenAction)->setFullScreen(this, _fullScreenAction->isChecked()); #else - if (action->isChecked()) + if (_fullScreenAction->isChecked()) setWindowState(windowState() | Qt::WindowFullScreen); else setWindowState(windowState() & ~Qt::WindowFullScreen); diff --git a/src/qtui/mainwin.h b/src/qtui/mainwin.h index f7d279d5..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(); @@ -203,6 +204,7 @@ private: ChatMonitorView *_chatMonitorView; TopicWidget *_topicWidget; + QAction *_fullScreenAction; QMenu *_fileMenu, *_networksMenu, *_viewMenu, *_bufferViewsMenu, *_settingsMenu, *_helpMenu, *_helpDebugMenu; QMenu *_toolbarMenu; QToolBar *_mainToolBar, *_chatViewToolBar, *_nickToolBar; 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/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 + + + + + diff --git a/src/uisupport/CMakeLists.txt b/src/uisupport/CMakeLists.txt index 0b78acc9..37ea3114 100644 --- a/src/uisupport/CMakeLists.txt +++ b/src/uisupport/CMakeLists.txt @@ -59,5 +59,5 @@ if (WITH_KDE4) endif() if (WITH_KF5) - target_link_libraries(mod_uisupport KF5::CoreAddons KF5::TextWidgets) + target_link_libraries(mod_uisupport KF5::CoreAddons KF5::TextWidgets KF5::XmlGui) endif() diff --git a/src/uisupport/aboutdata.cpp b/src/uisupport/aboutdata.cpp index 17356fda..4ca69840 100644 --- a/src/uisupport/aboutdata.cpp +++ b/src/uisupport/aboutdata.cpp @@ -195,7 +195,7 @@ void AboutData::setQuasselPersons(AboutData *aboutData) { "Bruno Patri", "", tr("French translation"), "", QLocale::French }, { "Celeste Paul", "seele", tr("Usability review") }, { "Chris Fuenty", "stitch", tr("SASL support") }, - { "Chris H", "Zren", tr("Various improvements") }, + { "Chris Holland", "Shade / Zren", tr("Various improvements") }, { "Chris Le Sueur", "Fish-Face", tr("Various fixes and improvements") }, { "Chris Moeller", "kode54", tr("Various fixes and improvements") }, { "", "Condex", tr("Galician translation"), "", QLocale::Galician }, @@ -242,6 +242,7 @@ void AboutData::setQuasselPersons(AboutData *aboutData) { "Jussi Schultink", "jussi01", tr("Tireless tester, {Ku|U}buntu tester and lobbyist, liters of delicious Finnish alcohol") }, { "K. Ernest Lee", "iFire", tr("Qt5 porting help, Travis CI setup") }, { "Kevin Funk", "KRF", tr("German translation"), "", QLocale::German }, + { "Kimmo Huoman", "kipe", tr("Buffer merge improvements") }, { "", "Larso", tr("Finnish translation"), "", QLocale::Finnish }, { "Lasse Liehu", "", tr("Finnish translation"), "", QLocale::Finnish }, { "Leo Franchi", "", tr("OSX improvements") }, @@ -265,6 +266,7 @@ void AboutData::setQuasselPersons(AboutData *aboutData) { "Pavel Volkovitskiy", "int", tr("Early beta tester and bughunter") }, { "Per Nielsen", "", tr("Danish translation"), "", QLocale::Danish }, { "Pete Beardmore", "elbeardmorez", tr("Linewrap for input line") }, + { "Pierre-Hugues Husson", "", tr("/print command") }, { "Ramanathan Sivagurunathan", "", tr("Bugfixes") }, { "Regis Perrin", "ZRegis", tr("French translation"), "", QLocale::French }, { "Rolf Eike Beer", "", tr("Build system fixes") }, diff --git a/src/uisupport/actioncollection.cpp b/src/uisupport/actioncollection.cpp index b862ae85..593b236e 100644 --- a/src/uisupport/actioncollection.cpp +++ b/src/uisupport/actioncollection.cpp @@ -20,7 +20,7 @@ * Parts of this implementation are based on KDE's KActionCollection. * ***************************************************************************/ -#ifndef HAVE_KDE4 +#ifndef HAVE_KDE #include #include @@ -305,4 +305,4 @@ bool ActionCollection::unlistAction(QAction *action) } -#endif /* HAVE_KDE4 */ +#endif /* HAVE_KDE */ diff --git a/src/uisupport/actioncollection.h b/src/uisupport/actioncollection.h index a76fc04a..c920adc5 100644 --- a/src/uisupport/actioncollection.h +++ b/src/uisupport/actioncollection.h @@ -20,10 +20,9 @@ * This is a subset of the API of KDE's KActionCollection. * ***************************************************************************/ -#ifndef ACTIONCOLLECTION_H_ -#define ACTIONCOLLECTION_H_ +#pragma once -#ifndef HAVE_KDE4 +#ifndef HAVE_KDE #include #include @@ -123,9 +122,12 @@ private: int ActionCollection::count() const { return actions().count(); } bool ActionCollection::isEmpty() const { return actions().count(); } -#else /* HAVE_KDE4 */ - -#include +#else /* HAVE_KDE */ +# ifdef HAVE_KDE4 +# include +# else +# include +# endif class ActionCollection : public KActionCollection { @@ -135,7 +137,4 @@ public: explicit ActionCollection(QObject *parent) : KActionCollection(parent) {}; }; - -#endif - -#endif +#endif /* HAVE_KDE */ diff --git a/src/uisupport/bufferview.cpp b/src/uisupport/bufferview.cpp index 7973785e..d0921466 100644 --- a/src/uisupport/bufferview.cpp +++ b/src/uisupport/bufferview.cpp @@ -253,7 +253,6 @@ void BufferView::dropEvent(QDropEvent *event) if (bufferList.count() != 1) return QTreeView::dropEvent(event); - NetworkId networkId = bufferList[0].first; BufferId bufferId2 = bufferList[0].second; if (index.data(NetworkModel::ItemTypeRole) != NetworkModel::BufferItemType) @@ -262,9 +261,6 @@ void BufferView::dropEvent(QDropEvent *event) if (index.data(NetworkModel::BufferTypeRole) != BufferInfo::QueryBuffer) return QTreeView::dropEvent(event); - if (index.data(NetworkModel::NetworkIdRole).value() != networkId) - return QTreeView::dropEvent(event); - BufferId bufferId1 = index.data(NetworkModel::BufferIdRole).value(); if (bufferId1 == bufferId2) return QTreeView::dropEvent(event); diff --git a/src/uisupport/contextmenuactionprovider.cpp b/src/uisupport/contextmenuactionprovider.cpp index 0d9e483a..87d104fd 100644 --- a/src/uisupport/contextmenuactionprovider.cpp +++ b/src/uisupport/contextmenuactionprovider.cpp @@ -44,6 +44,7 @@ ContextMenuActionProvider::ContextMenuActionProvider(QObject *parent) : NetworkM registerAction(BufferRemove, tr("Delete Chat(s)...")); registerAction(BufferSwitchTo, tr("Go to Chat")); + registerAction(HideJoinPartQuit, tr("Joins/Parts/Quits")); registerAction(HideJoin, tr("Joins"), true); registerAction(HidePart, tr("Parts"), true); registerAction(HideQuit, tr("Quits"), true); @@ -92,6 +93,8 @@ ContextMenuActionProvider::ContextMenuActionProvider(QObject *parent) : NetworkM registerAction(ShowIgnoreList, tr("Show Ignore List")); QMenu *hideEventsMenu = new QMenu(); + hideEventsMenu->addAction(action(HideJoinPartQuit)); + hideEventsMenu->addSeparator(); hideEventsMenu->addAction(action(HideJoin)); hideEventsMenu->addAction(action(HidePart)); hideEventsMenu->addAction(action(HideQuit)); diff --git a/src/uisupport/networkmodelcontroller.cpp b/src/uisupport/networkmodelcontroller.cpp index e4472380..a8946ede 100644 --- a/src/uisupport/networkmodelcontroller.cpp +++ b/src/uisupport/networkmodelcontroller.cpp @@ -307,6 +307,19 @@ void NetworkModelController::handleHideAction(ActionType type, QAction *action) { Q_UNUSED(action) + if (type == HideJoinPartQuit) { + bool anyChecked = NetworkModelController::action(HideJoin)->isChecked(); + anyChecked |= NetworkModelController::action(HidePart)->isChecked(); + anyChecked |= NetworkModelController::action(HideQuit)->isChecked(); + + // If any are checked, uncheck them all. + // If none are checked, check them all. + bool newCheckedState = !anyChecked; + NetworkModelController::action(HideJoin)->setChecked(newCheckedState); + NetworkModelController::action(HidePart)->setChecked(newCheckedState); + NetworkModelController::action(HideQuit)->setChecked(newCheckedState); + } + int filter = 0; if (NetworkModelController::action(HideJoin)->isChecked()) filter |= Message::Join | Message::NetsplitJoin; @@ -324,6 +337,7 @@ void NetworkModelController::handleHideAction(ActionType type, QAction *action) filter |= Message::Topic; switch (type) { + case HideJoinPartQuit: case HideJoin: case HidePart: case HideQuit: diff --git a/src/uisupport/networkmodelcontroller.h b/src/uisupport/networkmodelcontroller.h index 3f1b29fc..f83e23f3 100644 --- a/src/uisupport/networkmodelcontroller.h +++ b/src/uisupport/networkmodelcontroller.h @@ -64,6 +64,7 @@ public: HideMode = 0x0500, HideDayChange = 0x0600, HideTopic = 0x0700, + HideJoinPartQuit = 0xd00, HideUseDefaults = 0xe00, HideApplyToAll = 0xf00, diff --git a/src/uisupport/uistyle.cpp b/src/uisupport/uistyle.cpp index 944b6049..ea0cb19d 100644 --- a/src/uisupport/uistyle.cpp +++ b/src/uisupport/uistyle.cpp @@ -104,8 +104,22 @@ void UiStyle::loadStyleSheet() QString styleSheet; styleSheet += loadStyleSheet("file:///" + Quassel::findDataFilePath("stylesheets/default.qss")); styleSheet += loadStyleSheet("file:///" + Quassel::configDirPath() + "settings.qss"); - if (s.value("UseCustomStyleSheet", false).toBool()) - styleSheet += loadStyleSheet("file:///" + s.value("CustomStyleSheetPath").toString(), true); + if (s.value("UseCustomStyleSheet", false).toBool()) { + QString customSheetPath(s.value("CustomStyleSheetPath").toString()); + QString customSheet = loadStyleSheet("file:///" + customSheetPath, true); + if (customSheet.isEmpty()) { + // MIGRATION: changed default install path for data from /usr/share/apps to /usr/share + if (customSheetPath.startsWith("/usr/share/apps/quassel")) { + customSheetPath.replace(QRegExp("^/usr/share/apps"), "/usr/share"); + customSheet = loadStyleSheet("file:///" + customSheetPath, true); + if (!customSheet.isEmpty()) { + s.setValue("CustomStyleSheetPath", customSheetPath); + qDebug() << "Custom stylesheet path migrated to" << customSheetPath; + } + } + } + styleSheet += customSheet; + } styleSheet += loadStyleSheet("file:///" + Quassel::optionValue("qss"), true); if (!styleSheet.isEmpty()) {