From d31b80c13afa4f63f229588a74a9f814d8e0800d Mon Sep 17 00:00:00 2001 From: Phenom Date: Thu, 4 May 2017 11:31:36 +0200 Subject: [PATCH 01/50] Fix Windows Compilation --- libretroshare/src/rsitems/rsitem.h | 2 ++ libretroshare/src/serialiser/rsserial.cc | 2 ++ libretroshare/src/serialiser/rstypeserializer.cc | 3 +++ libretroshare/src/services/p3posted.cc | 2 ++ 4 files changed, 9 insertions(+) diff --git a/libretroshare/src/rsitems/rsitem.h b/libretroshare/src/rsitems/rsitem.h index 8dbda2fb3..567543f1e 100644 --- a/libretroshare/src/rsitems/rsitem.h +++ b/libretroshare/src/rsitems/rsitem.h @@ -4,6 +4,8 @@ #include "retroshare/rstypes.h" #include "serialiser/rsserializer.h" +#include + class RsItem: public RsMemoryManagement::SmallObject { public: diff --git a/libretroshare/src/serialiser/rsserial.cc b/libretroshare/src/serialiser/rsserial.cc index 1436f92fa..9164d739d 100644 --- a/libretroshare/src/serialiser/rsserial.cc +++ b/libretroshare/src/serialiser/rsserial.cc @@ -37,6 +37,8 @@ #include #include #include +#include + /*** * #define RSSERIAL_DEBUG 1 diff --git a/libretroshare/src/serialiser/rstypeserializer.cc b/libretroshare/src/serialiser/rstypeserializer.cc index f4cfc0d62..054db45a4 100644 --- a/libretroshare/src/serialiser/rstypeserializer.cc +++ b/libretroshare/src/serialiser/rstypeserializer.cc @@ -30,6 +30,9 @@ #include "util/rsprint.h" #include +#include +#include + static const uint32_t MAX_SERIALIZED_ARRAY_SIZE = 500 ; static const uint32_t MAX_SERIALIZED_CHUNK_SIZE = 10*1024*1024 ; // 10 MB. diff --git a/libretroshare/src/services/p3posted.cc b/libretroshare/src/services/p3posted.cc index b3ad80ddf..555f2147f 100644 --- a/libretroshare/src/services/p3posted.cc +++ b/libretroshare/src/services/p3posted.cc @@ -27,6 +27,8 @@ #include "rsitems/rsposteditems.h" #include +#include + /**** * #define POSTED_DEBUG 1 From 1c2b43b7e0e38a36fc4c0214f58b0e8ae536ffe5 Mon Sep 17 00:00:00 2001 From: Phenom Date: Thu, 4 May 2017 15:01:25 +0200 Subject: [PATCH 02/50] Fix UnitTest compilation But running failed. --- libretroshare/src/rsitems/rsnxsitems.cc | 13 +++++++++++++ .../librssimulator/testing/IsolatedServiceTester.cc | 1 + tests/librssimulator/testing/SetFilter.cc | 2 ++ tests/librssimulator/testing/SetServiceTester.h | 1 + .../libretroshare/gxs/common/data_support.h | 2 +- .../gxs/data_service/rsdataservice_test.h | 2 +- .../gxs/gen_exchange/rsdummyservices.h | 2 +- .../libretroshare/serialiser/rsgxsiditem_test.cc | 2 +- .../serialiser/rsgxsupdateitem_test.cc | 2 +- .../libretroshare/serialiser/rsmsgitem_test.cc | 12 ++++++------ .../libretroshare/serialiser/rsnxsitems_test.cc | 2 +- .../libretroshare/serialiser/rsstatusitem_test.cc | 2 +- .../services/gxs/GxsIsolatedServiceTester.cc | 2 +- .../services/gxs/GxsPairServiceTester.cc | 2 +- .../libretroshare/services/gxs/gxscircle_tests.cc | 2 +- .../libretroshare/services/gxs/nxsbasic_test.cc | 2 +- .../libretroshare/services/gxs/nxspair_tests.cc | 2 +- .../libretroshare/services/gxs/rsgxstestitems.h | 2 +- .../libretroshare/services/status/status_test.cc | 2 +- 19 files changed, 37 insertions(+), 20 deletions(-) diff --git a/libretroshare/src/rsitems/rsnxsitems.cc b/libretroshare/src/rsitems/rsnxsitems.cc index 104935930..b8a381054 100644 --- a/libretroshare/src/rsitems/rsnxsitems.cc +++ b/libretroshare/src/rsitems/rsnxsitems.cc @@ -156,6 +156,19 @@ void RsNxsGrp::clear() meta.TlvClear(); } +RsNxsGrp* RsNxsGrp::clone() const { + RsNxsGrp* grp = new RsNxsGrp(this->grp.tlvtype); + *grp = *this; + + if(this->metaData) + { + grp->metaData = new RsGxsGrpMetaData(); + *(grp->metaData) = *(this->metaData); + } + + return grp; +} + void RsNxsSyncGrpReqItem::clear() { flag = 0; diff --git a/tests/librssimulator/testing/IsolatedServiceTester.cc b/tests/librssimulator/testing/IsolatedServiceTester.cc index c8ae3854b..e94a59b4e 100644 --- a/tests/librssimulator/testing/IsolatedServiceTester.cc +++ b/tests/librssimulator/testing/IsolatedServiceTester.cc @@ -1,6 +1,7 @@ #include #include "retroshare/rsids.h" +#include "rsitems/rsitem.h" #include "serialiser/rsserial.h" #include "testing/IsolatedServiceTester.h" diff --git a/tests/librssimulator/testing/SetFilter.cc b/tests/librssimulator/testing/SetFilter.cc index 40d90f768..d1400f7ba 100644 --- a/tests/librssimulator/testing/SetFilter.cc +++ b/tests/librssimulator/testing/SetFilter.cc @@ -1,6 +1,8 @@ #include "SetFilter.h" +#include "rsitems/rsitem.h" + bool SetFilter::filter(const SetPacket &pkt) { switch(mFilterMode) diff --git a/tests/librssimulator/testing/SetServiceTester.h b/tests/librssimulator/testing/SetServiceTester.h index ed0ea902d..ad03aed4e 100644 --- a/tests/librssimulator/testing/SetServiceTester.h +++ b/tests/librssimulator/testing/SetServiceTester.h @@ -2,6 +2,7 @@ #include #include "retroshare/rsids.h" +#include "rsitems/rsitem.h" #include "pqi/p3linkmgr.h" #include "SetPacket.h" diff --git a/tests/unittests/libretroshare/gxs/common/data_support.h b/tests/unittests/libretroshare/gxs/common/data_support.h index ae9919428..0bb026820 100644 --- a/tests/unittests/libretroshare/gxs/common/data_support.h +++ b/tests/unittests/libretroshare/gxs/common/data_support.h @@ -1,6 +1,6 @@ #pragma once -#include "serialiser/rsnxsitems.h" +#include "rsitems/rsnxsitems.h" #include "gxs/rsgxsdata.h" #define RS_SERVICE_TYPE_PLUGIN_SIMPLE_FORUM 0x012 diff --git a/tests/unittests/libretroshare/gxs/data_service/rsdataservice_test.h b/tests/unittests/libretroshare/gxs/data_service/rsdataservice_test.h index 89d4a4f5c..13084de2f 100644 --- a/tests/unittests/libretroshare/gxs/data_service/rsdataservice_test.h +++ b/tests/unittests/libretroshare/gxs/data_service/rsdataservice_test.h @@ -2,7 +2,7 @@ #define RSDATASERVICE_TEST_H #include "util/rsthreads.h" -#include "serialiser/rsnxsitems.h" +#include "rsitems/rsnxsitems.h" #include "gxs/rsgds.h" void test_messageStoresAndRetrieve(); diff --git a/tests/unittests/libretroshare/gxs/gen_exchange/rsdummyservices.h b/tests/unittests/libretroshare/gxs/gen_exchange/rsdummyservices.h index 0bb040aba..caf404728 100644 --- a/tests/unittests/libretroshare/gxs/gen_exchange/rsdummyservices.h +++ b/tests/unittests/libretroshare/gxs/gen_exchange/rsdummyservices.h @@ -6,7 +6,7 @@ #include "gxs/rsnxs.h" #include "gxs/rsgixs.h" -#include "serialiser/rsgxsitems.h" +#include "rsitems/rsgxsitems.h" class RsDummyNetService: public RsNetworkExchangeService { diff --git a/tests/unittests/libretroshare/serialiser/rsgxsiditem_test.cc b/tests/unittests/libretroshare/serialiser/rsgxsiditem_test.cc index 10189367f..e1488441f 100644 --- a/tests/unittests/libretroshare/serialiser/rsgxsiditem_test.cc +++ b/tests/unittests/libretroshare/serialiser/rsgxsiditem_test.cc @@ -28,7 +28,7 @@ */ #include -#include "serialiser/rsgxsiditems.h" +#include "rsitems/rsgxsiditems.h" #include "support.h" diff --git a/tests/unittests/libretroshare/serialiser/rsgxsupdateitem_test.cc b/tests/unittests/libretroshare/serialiser/rsgxsupdateitem_test.cc index 1008babc0..ccaeead96 100644 --- a/tests/unittests/libretroshare/serialiser/rsgxsupdateitem_test.cc +++ b/tests/unittests/libretroshare/serialiser/rsgxsupdateitem_test.cc @@ -8,7 +8,7 @@ #include #include "support.h" -#include "serialiser/rsgxsupdateitems.h" +#include "rsitems/rsgxsupdateitems.h" #define RS_SERVICE_TYPE_PLUGIN_SIMPLE_FORUM 0x0010 RsSerialType* init_item(RsGxsGrpUpdateItem& i) diff --git a/tests/unittests/libretroshare/serialiser/rsmsgitem_test.cc b/tests/unittests/libretroshare/serialiser/rsmsgitem_test.cc index b3f585cdd..c473276dc 100644 --- a/tests/unittests/libretroshare/serialiser/rsmsgitem_test.cc +++ b/tests/unittests/libretroshare/serialiser/rsmsgitem_test.cc @@ -26,7 +26,7 @@ #include #include "util/rsrandom.h" -#include "serialiser/rsmsgitems.h" +#include "rsitems/rsmsgitems.h" #include "chat/rschatitems.h" #include "support.h" @@ -141,7 +141,7 @@ RsSerialType* init_item(RsMsgItem& mi) mi.sendTime = mi.recvTime; mi.msgFlags = mi.recvTime; - return new RsMsgSerialiser(true); + return new RsMsgSerialiser(RsServiceSerializer::SERIALIZATION_FLAG_NONE); } RsSerialType* init_item(RsMsgTagType& mtt) @@ -150,7 +150,7 @@ RsSerialType* init_item(RsMsgTagType& mtt) mtt.tagId = rand()%24242; randString(SHORT_STR, mtt.text); - return new RsMsgSerialiser(); + return new RsMsgSerialiser(RsServiceSerializer::SERIALIZATION_FLAG_NONE); } @@ -163,7 +163,7 @@ RsSerialType* init_item(RsMsgTags& mt) mt.tagIds.push_back(rand()%21341); } - return new RsMsgSerialiser(); + return new RsMsgSerialiser(RsServiceSerializer::SERIALIZATION_FLAG_NONE); } RsSerialType* init_item(RsMsgSrcId& ms) @@ -171,7 +171,7 @@ RsSerialType* init_item(RsMsgSrcId& ms) ms.msgId = rand()%434; ms.srcId = RsPeerId::random(); - return new RsMsgSerialiser(); + return new RsMsgSerialiser(RsServiceSerializer::SERIALIZATION_FLAG_NONE); } RsSerialType* init_item(RsMsgParentId& ms) @@ -179,7 +179,7 @@ RsSerialType* init_item(RsMsgParentId& ms) ms.msgId = rand()%354; ms.msgParentId = rand()%476; - return new RsMsgSerialiser(); + return new RsMsgSerialiser(RsServiceSerializer::SERIALIZATION_FLAG_NONE); } bool operator ==(const struct VisibleChatLobbyInfo& l, const struct VisibleChatLobbyInfo& r) diff --git a/tests/unittests/libretroshare/serialiser/rsnxsitems_test.cc b/tests/unittests/libretroshare/serialiser/rsnxsitems_test.cc index e40e53ea7..87bd33778 100644 --- a/tests/unittests/libretroshare/serialiser/rsnxsitems_test.cc +++ b/tests/unittests/libretroshare/serialiser/rsnxsitems_test.cc @@ -1,7 +1,7 @@ #include "support.h" #include "libretroshare/gxs/common/data_support.h" -#include "serialiser/rsnxsitems.h" +#include "rsitems/rsnxsitems.h" #define NUM_BIN_OBJECTS 5 diff --git a/tests/unittests/libretroshare/serialiser/rsstatusitem_test.cc b/tests/unittests/libretroshare/serialiser/rsstatusitem_test.cc index c9fc6cb61..1f7e53f14 100644 --- a/tests/unittests/libretroshare/serialiser/rsstatusitem_test.cc +++ b/tests/unittests/libretroshare/serialiser/rsstatusitem_test.cc @@ -25,7 +25,7 @@ #include "support.h" -#include "serialiser/rsstatusitems.h" +#include "rsitems/rsstatusitems.h" RsSerialType* init_item(RsStatusItem& rsi) { diff --git a/tests/unittests/libretroshare/services/gxs/GxsIsolatedServiceTester.cc b/tests/unittests/libretroshare/services/gxs/GxsIsolatedServiceTester.cc index 46d4cfdee..1345dc706 100644 --- a/tests/unittests/libretroshare/services/gxs/GxsIsolatedServiceTester.cc +++ b/tests/unittests/libretroshare/services/gxs/GxsIsolatedServiceTester.cc @@ -5,7 +5,7 @@ // from libretroshare #include "services/p3statusservice.h" -#include "serialiser/rsstatusitems.h" +#include "rsitems/rsstatusitems.h" #include "gxs/rsgixs.h" #include "gxs/rsdataservice.h" #include "gxs/rsgxsnetservice.h" diff --git a/tests/unittests/libretroshare/services/gxs/GxsPairServiceTester.cc b/tests/unittests/libretroshare/services/gxs/GxsPairServiceTester.cc index b56f2c868..7e2776b64 100644 --- a/tests/unittests/libretroshare/services/gxs/GxsPairServiceTester.cc +++ b/tests/unittests/libretroshare/services/gxs/GxsPairServiceTester.cc @@ -5,7 +5,7 @@ #include "gxstestservice.h" // libretroshare -#include "serialiser/rsnxsitems.h" +#include "rsitems/rsnxsitems.h" GxsPairServiceTester::GxsPairServiceTester(const RsPeerId &peerId1, const RsPeerId &peerId2, int testMode, bool useIdentityService) :SetServiceTester() diff --git a/tests/unittests/libretroshare/services/gxs/gxscircle_tests.cc b/tests/unittests/libretroshare/services/gxs/gxscircle_tests.cc index f9844dce9..ca7d0a337 100644 --- a/tests/unittests/libretroshare/services/gxs/gxscircle_tests.cc +++ b/tests/unittests/libretroshare/services/gxs/gxscircle_tests.cc @@ -4,7 +4,7 @@ // from librssimulator // from libretroshare -#include "serialiser/rsnxsitems.h" +#include "rsitems/rsnxsitems.h" // local #include "GxsPairServiceTester.h" diff --git a/tests/unittests/libretroshare/services/gxs/nxsbasic_test.cc b/tests/unittests/libretroshare/services/gxs/nxsbasic_test.cc index 1b4aec879..078eba249 100644 --- a/tests/unittests/libretroshare/services/gxs/nxsbasic_test.cc +++ b/tests/unittests/libretroshare/services/gxs/nxsbasic_test.cc @@ -8,7 +8,7 @@ //#include "gxs/rsgixs.h" //#include "gxs/rsdataservice.h" //#include "gxs/rsgxsnetservice.h" -#include "serialiser/rsnxsitems.h" +#include "rsitems/rsnxsitems.h" // local #include "GxsIsolatedServiceTester.h" diff --git a/tests/unittests/libretroshare/services/gxs/nxspair_tests.cc b/tests/unittests/libretroshare/services/gxs/nxspair_tests.cc index e8f4b932d..5eaf630e4 100644 --- a/tests/unittests/libretroshare/services/gxs/nxspair_tests.cc +++ b/tests/unittests/libretroshare/services/gxs/nxspair_tests.cc @@ -4,7 +4,7 @@ // from librssimulator // from libretroshare -#include "serialiser/rsnxsitems.h" +#include "rsitems/rsnxsitems.h" // local #include "GxsPairServiceTester.h" diff --git a/tests/unittests/libretroshare/services/gxs/rsgxstestitems.h b/tests/unittests/libretroshare/services/gxs/rsgxstestitems.h index 78379436f..30003e996 100644 --- a/tests/unittests/libretroshare/services/gxs/rsgxstestitems.h +++ b/tests/unittests/libretroshare/services/gxs/rsgxstestitems.h @@ -30,7 +30,7 @@ #include "rsitems/rsserviceids.h" #include "serialiser/rsserial.h" -#include "serialiser/rsgxsitems.h" +#include "rsitems/rsgxsitems.h" #include "gxstestservice.h" const uint8_t RS_PKT_SUBTYPE_TEST_GROUP_ITEM = 0x02; diff --git a/tests/unittests/libretroshare/services/status/status_test.cc b/tests/unittests/libretroshare/services/status/status_test.cc index 59945ad95..06258f450 100644 --- a/tests/unittests/libretroshare/services/status/status_test.cc +++ b/tests/unittests/libretroshare/services/status/status_test.cc @@ -7,7 +7,7 @@ // from libretroshare #include "services/p3statusservice.h" -#include "serialiser/rsstatusitems.h" +#include "rsitems/rsstatusitems.h" #define N_PEERS 10 From 96b4a1b2d85b9eec66990194d34dc6f964b579cf Mon Sep 17 00:00:00 2001 From: sehraf Date: Fri, 5 May 2017 15:40:02 +0200 Subject: [PATCH 03/50] add openssl chacha20-poly1305 support --- libretroshare/src/crypto/chacha20.cpp | 111 ++++++++++++++++++++++++-- 1 file changed, 103 insertions(+), 8 deletions(-) diff --git a/libretroshare/src/crypto/chacha20.cpp b/libretroshare/src/crypto/chacha20.cpp index 5a265b514..7926f826c 100644 --- a/libretroshare/src/crypto/chacha20.cpp +++ b/libretroshare/src/crypto/chacha20.cpp @@ -44,6 +44,12 @@ //#define DEBUG_CHACHA20 +#if OPENSSL_VERSION_NUMBER >= 0x010100000L + #define AEAD_chacha20_poly1305_openssl AEAD_chacha20_poly1305 +#else + #define AEAD_chacha20_poly1305_rs AEAD_chacha20_poly1305 +#endif + namespace librs { namespace crypto { @@ -273,6 +279,7 @@ static void quotient(const uint256_32& n,const uint256_32& p,uint256_32& q,uint2 q += m ; } } + static void remainder(const uint256_32& n,const uint256_32& p,uint256_32& r) { // simple algorithm: add up multiples of u while keeping below *this. Once done, substract. @@ -475,7 +482,7 @@ bool constant_time_memory_compare(const uint8_t *m1,const uint8_t *m2,uint32_t s return !CRYPTO_memcmp(m1,m2,size) ; } -bool AEAD_chacha20_poly1305(uint8_t key[32], uint8_t nonce[12],uint8_t *data,uint32_t data_size,uint8_t *aad,uint32_t aad_size,uint8_t tag[16],bool encrypt) +bool AEAD_chacha20_poly1305_rs(uint8_t key[32], uint8_t nonce[12],uint8_t *data,uint32_t data_size,uint8_t *aad,uint32_t aad_size,uint8_t tag[16],bool encrypt) { // encrypt + tag. See RFC7539-2.8 @@ -526,6 +533,88 @@ bool AEAD_chacha20_poly1305(uint8_t key[32], uint8_t nonce[12],uint8_t *data,uin } } +#define errorOut {ret = false; goto out;} + +bool AEAD_chacha20_poly1305_openssl(uint8_t key[32], uint8_t nonce[12], uint8_t *data, uint32_t data_size, uint8_t *aad, uint32_t aad_size, uint8_t tag[16], bool encrypt_or_decrypt) +{ + EVP_CIPHER_CTX *ctx; + + bool ret = true; + int len; + const uint8_t tag_len = 16; + int tmp_len; + uint8_t tmp[data_size]; + + /* Create and initialise the context */ + if(!(ctx = EVP_CIPHER_CTX_new())) return false; + + if (encrypt_or_decrypt) { + /* Initialise the encryption operation. */ + if(1 != EVP_EncryptInit_ex(ctx, EVP_chacha20_poly1305(), NULL, NULL, NULL)) errorOut + + /* Initialise key and IV */ + if(1 != EVP_EncryptInit_ex(ctx, NULL, NULL, key, nonce)) errorOut + + /* Provide any AAD data. This can be called zero or more times as + * required + */ + if(1 != EVP_EncryptUpdate(ctx, NULL, &len, aad, aad_size)) errorOut + + /* Provide the message to be encrypted, and obtain the encrypted output. + * EVP_EncryptUpdate can be called multiple times if necessary + */ + if(1 != EVP_EncryptUpdate(ctx, tmp, &len, data, data_size)) errorOut + tmp_len = len; + + /* Finalise the encryption. Normally ciphertext bytes may be written at + * this stage, but this does not occur in GCM mode + */ + if(1 != EVP_EncryptFinal_ex(ctx, data + len, &len)) errorOut + tmp_len += len; + + /* Get the tag */ + if(1 != EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG, tag_len, tag)) errorOut + } else { + /* Initialise the decryption operation. */ + if(!EVP_DecryptInit_ex(ctx, EVP_chacha20_poly1305(), NULL, key, nonce)) errorOut + + /* Provide any AAD data. This can be called zero or more times as + * required + */ + if(!EVP_DecryptUpdate(ctx, NULL, &len, aad, aad_size)) errorOut + + /* Provide the message to be decrypted, and obtain the plaintext output. + * EVP_DecryptUpdate can be called multiple times if necessary + */ + if(!EVP_DecryptUpdate(ctx, tmp, &len, data, data_size)) errorOut + tmp_len = len; + + /* Set expected tag value. Works in OpenSSL 1.0.1d and later */ + if(!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, tag_len, tag)) errorOut + + /* Finalise the decryption. A positive return value indicates success, + * anything else is a failure - the plaintext is not trustworthy. + */ + if(EVP_DecryptFinal_ex(ctx, tmp + len, &len) > 0) { + /* Success */ + tmp_len += len; + ret = true; + } else { + /* Verify failed */ + errorOut + } + } + + memcpy(data, tmp, tmp_len); + +out: + /* Clean up */ + EVP_CIPHER_CTX_free(ctx); + return !!ret; +} + +#undef errorOut + bool AEAD_chacha20_sha256(uint8_t key[32], uint8_t nonce[12],uint8_t *data,uint32_t data_size,uint8_t *aad,uint32_t aad_size,uint8_t tag[16],bool encrypt) { // encrypt + tag. See RFC7539-2.8 @@ -1154,12 +1243,12 @@ bool perform_tests() uint8_t tag[16] ; uint8_t test_tag[16] = { 0x1a,0xe1,0x0b,0x59,0x4f,0x09,0xe2,0x6a,0x7e,0x90,0x2e,0xcb,0xd0,0x60,0x06,0x91 }; - AEAD_chacha20_poly1305(key,nonce,msg,7*16+2,aad,12,tag,true) ; + AEAD_chacha20_poly1305_rs(key,nonce,msg,7*16+2,aad,12,tag,true) ; if(!constant_time_memory_compare(msg,test_msg,7*16+2)) return false ; if(!constant_time_memory_compare(tag,test_tag,16)) return false ; - bool res = AEAD_chacha20_poly1305(key,nonce,msg,7*16+2,aad,12,tag,false) ; + bool res = AEAD_chacha20_poly1305_rs(key,nonce,msg,7*16+2,aad,12,tag,false) ; if(!res) return false ; } @@ -1197,7 +1286,7 @@ bool perform_tests() uint8_t received_tag[16] = { 0xee,0xad,0x9d,0x67,0x89,0x0c,0xbb,0x22,0x39,0x23,0x36,0xfe,0xa1,0x85,0x1f,0x38 }; - if(!AEAD_chacha20_poly1305(key,nonce,ciphertext,16*16+9,aad,12,received_tag,false)) + if(!AEAD_chacha20_poly1305_rs(key,nonce,ciphertext,16*16+9,aad,12,received_tag,false)) return false ; uint8_t cleartext[16*16+9] = { @@ -1245,19 +1334,25 @@ bool perform_tests() RsScopeTimer s("AEAD1") ; chacha20_encrypt(key, 1, nonce, ten_megabyte_data,SIZE) ; - std::cerr << " Chacha20 encryption speed : " << SIZE / (1024.0*1024.0) / s.duration() << " MB/s" << std::endl; + std::cerr << " Chacha20 encryption speed : " << SIZE / (1024.0*1024.0) / s.duration() << " MB/s" << std::endl; } { RsScopeTimer s("AEAD2") ; - AEAD_chacha20_poly1305(key,nonce,ten_megabyte_data,SIZE,aad,12,received_tag,true) ; + AEAD_chacha20_poly1305_rs(key,nonce,ten_megabyte_data,SIZE,aad,12,received_tag,true) ; - std::cerr << " AEAD/poly1305 encryption speed: " << SIZE / (1024.0*1024.0) / s.duration() << " MB/s" << std::endl; + std::cerr << " AEAD/poly1305 own encryption speed : " << SIZE / (1024.0*1024.0) / s.duration() << " MB/s" << std::endl; } { RsScopeTimer s("AEAD3") ; + AEAD_chacha20_poly1305_openssl(key,nonce,ten_megabyte_data,SIZE,aad,12,received_tag,true) ; + + std::cerr << " AEAD/poly1305 openssl encryption speed: " << SIZE / (1024.0*1024.0) / s.duration() << " MB/s" << std::endl; + } + { + RsScopeTimer s("AEAD4") ; AEAD_chacha20_sha256(key,nonce,ten_megabyte_data,SIZE,aad,12,received_tag,true) ; - std::cerr << " AEAD/sha256 encryption speed : " << SIZE / (1024.0*1024.0) / s.duration() << " MB/s" << std::endl; + std::cerr << " AEAD/sha256 encryption speed : " << SIZE / (1024.0*1024.0) / s.duration() << " MB/s" << std::endl; } free(ten_megabyte_data) ; From 7371fdc432a00c7fb0d26df2333e892254cbae05 Mon Sep 17 00:00:00 2001 From: sehraf Date: Fri, 5 May 2017 18:50:40 +0200 Subject: [PATCH 04/50] add openssl chacha20 support --- libretroshare/src/crypto/chacha20.cpp | 70 ++++++++++++++++++++++++--- 1 file changed, 63 insertions(+), 7 deletions(-) diff --git a/libretroshare/src/crypto/chacha20.cpp b/libretroshare/src/crypto/chacha20.cpp index 7926f826c..472cb9cd7 100644 --- a/libretroshare/src/crypto/chacha20.cpp +++ b/libretroshare/src/crypto/chacha20.cpp @@ -363,7 +363,7 @@ static void print(const chacha20_state& s) } #endif -void chacha20_encrypt(uint8_t key[32], uint32_t block_counter, uint8_t nonce[12], uint8_t *data, uint32_t size) +void chacha20_encrypt_rs(uint8_t key[32], uint32_t block_counter, uint8_t nonce[12], uint8_t *data, uint32_t size) { for(uint32_t i=0;i= 0x010100000L +void chacha20_encrypt_openssl(uint8_t key[32], uint32_t block_counter, uint8_t nonce[12], uint8_t *data, uint32_t size) +{ + EVP_CIPHER_CTX *ctx; + + int len; + int tmp_len; + uint8_t tmp[size]; + uint8_t iv[16]; + + // create iv with nonce and block counter + memcpy(iv, &block_counter, 4); + memcpy(iv + 4, nonce, 12); + + /* Create and initialise the context */ + if(!(ctx = EVP_CIPHER_CTX_new())) return; + + /* Initialise the encryption operation. IMPORTANT - ensure you use a key + * and IV size appropriate for your cipher + * In this example we are using 256 bit AES (i.e. a 256 bit key). The + * IV size for *most* modes is the same as the block size. For AES this + * is 128 bits */ + if(1 != EVP_EncryptInit_ex(ctx, EVP_chacha20(), NULL, key, iv)) goto out; + + /* Provide the message to be encrypted, and obtain the encrypted output. + * EVP_EncryptUpdate can be called multiple times if necessary + */ + if(1 != EVP_EncryptUpdate(ctx, tmp, &len, data, size)) goto out; + tmp_len = len; + + /* Finalise the encryption. Further ciphertext bytes may be written at + * this stage. + */ + if(1 != EVP_EncryptFinal_ex(ctx, tmp + len, &len)) goto out; + tmp_len += len; + + memcpy(data, tmp, tmp_len); + +out: + /* Clean up */ + EVP_CIPHER_CTX_free(ctx); +} +#endif + struct poly1305_state { uint256_32 r ; @@ -499,7 +543,7 @@ bool AEAD_chacha20_poly1305_rs(uint8_t key[32], uint8_t nonce[12],uint8_t *data, if(encrypt) { - chacha20_encrypt(key,1,nonce,data,data_size); + chacha20_encrypt_rs(key,1,nonce,data,data_size); poly1305_state pls ; @@ -527,12 +571,13 @@ bool AEAD_chacha20_poly1305_rs(uint8_t key[32], uint8_t nonce[12],uint8_t *data, // decrypt - chacha20_encrypt(key,1,nonce,data,data_size); + chacha20_encrypt_rs(key,1,nonce,data,data_size); return constant_time_memory_compare(tag,computed_tag,16) ; } } +#if OPENSSL_VERSION_NUMBER >= 0x010100000L #define errorOut {ret = false; goto out;} bool AEAD_chacha20_poly1305_openssl(uint8_t key[32], uint8_t nonce[12], uint8_t *data, uint32_t data_size, uint8_t *aad, uint32_t aad_size, uint8_t tag[16], bool encrypt_or_decrypt) @@ -614,6 +659,7 @@ out: } #undef errorOut +#endif bool AEAD_chacha20_sha256(uint8_t key[32], uint8_t nonce[12],uint8_t *data,uint32_t data_size,uint8_t *aad,uint32_t aad_size,uint8_t tag[16],bool encrypt) { @@ -621,7 +667,11 @@ bool AEAD_chacha20_sha256(uint8_t key[32], uint8_t nonce[12],uint8_t *data,uint3 if(encrypt) { - chacha20_encrypt(key,1,nonce,data,data_size); +#if OPENSSL_VERSION_NUMBER < 0x10100000L + chacha20_encrypt_rs(key,1,nonce,data,data_size); +#else + chacha20_encrypt_openssl(key, 1, nonce, data, data_size); +#endif uint8_t computed_tag[EVP_MAX_MD_SIZE]; unsigned int md_size ; @@ -683,7 +733,11 @@ bool AEAD_chacha20_sha256(uint8_t key[32], uint8_t nonce[12],uint8_t *data,uint3 // decrypt - chacha20_encrypt(key,1,nonce,data,data_size); +#if OPENSSL_VERSION_NUMBER < 0x10100000L + chacha20_encrypt_rs(key,1,nonce,data,data_size); +#else + chacha20_encrypt_openssl(key, 1, nonce, data, data_size); +#endif return constant_time_memory_compare(tag,computed_tag,16) ; } @@ -763,7 +817,7 @@ bool perform_tests() 0x74, 0x2e }; - chacha20_encrypt(key,1,nounce2,plaintext,7*16+2) ; + chacha20_encrypt_rs(key,1,nounce2,plaintext,7*16+2) ; #ifdef DEBUG_CHACHA20 fprintf(stdout,"CipherText: \n") ; @@ -1332,7 +1386,7 @@ bool perform_tests() { RsScopeTimer s("AEAD1") ; - chacha20_encrypt(key, 1, nonce, ten_megabyte_data,SIZE) ; + chacha20_encrypt_rs(key, 1, nonce, ten_megabyte_data,SIZE) ; std::cerr << " Chacha20 encryption speed : " << SIZE / (1024.0*1024.0) / s.duration() << " MB/s" << std::endl; } @@ -1342,12 +1396,14 @@ bool perform_tests() std::cerr << " AEAD/poly1305 own encryption speed : " << SIZE / (1024.0*1024.0) / s.duration() << " MB/s" << std::endl; } +#if OPENSSL_VERSION_NUMBER >= 0x010100000L { RsScopeTimer s("AEAD3") ; AEAD_chacha20_poly1305_openssl(key,nonce,ten_megabyte_data,SIZE,aad,12,received_tag,true) ; std::cerr << " AEAD/poly1305 openssl encryption speed: " << SIZE / (1024.0*1024.0) / s.duration() << " MB/s" << std::endl; } +#endif { RsScopeTimer s("AEAD4") ; AEAD_chacha20_sha256(key,nonce,ten_megabyte_data,SIZE,aad,12,received_tag,true) ; From 868c0467f251d121262983c4a0ca1dba389f4555 Mon Sep 17 00:00:00 2001 From: csoler Date: Sat, 6 May 2017 13:23:26 +0200 Subject: [PATCH 05/50] fixed bug in serializer caused to not updating the size parameter. Also fixes unittests --- libretroshare/src/serialiser/rsserial.cc | 2 +- libretroshare/src/serialiser/rsserializer.cc | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/libretroshare/src/serialiser/rsserial.cc b/libretroshare/src/serialiser/rsserial.cc index 9164d739d..230501ea8 100644 --- a/libretroshare/src/serialiser/rsserial.cc +++ b/libretroshare/src/serialiser/rsserial.cc @@ -387,7 +387,7 @@ RsItem * RsSerialiser::deserialise(void *data, uint32_t *size) //std::cerr << "RsSerialiser::deserialise() RsItem Type: " << std::hex << getRsItemId(data) << " Size: " << pkt_size; //std::cerr << std::endl; - if (pkt_size != *size) + if (pkt_size > *size) { #ifdef RSSERIAL_ERROR_DEBUG std::cerr << "RsSerialiser::deserialise() ERROR Size mismatch(2)"; diff --git a/libretroshare/src/serialiser/rsserializer.cc b/libretroshare/src/serialiser/rsserializer.cc index ea6bdd33c..164f31342 100644 --- a/libretroshare/src/serialiser/rsserializer.cc +++ b/libretroshare/src/serialiser/rsserializer.cc @@ -60,12 +60,14 @@ RsItem *RsServiceSerializer::deserialise(void *data, uint32_t *size) item->serial_process(RsGenericSerializer::DESERIALIZE, ctx) ; - if(ctx.mSize != ctx.mOffset) + if(ctx.mSize < ctx.mOffset) { std::cerr << "RsSerializer::deserialise(): ERROR. offset does not match expected size!" << std::endl; delete item ; return NULL ; } + *size = ctx.mOffset ; + if(ctx.mOk) return item ; @@ -96,12 +98,14 @@ RsItem *RsConfigSerializer::deserialise(void *data, uint32_t *size) item->serial_process(DESERIALIZE, ctx) ; - if(ctx.mSize != ctx.mOffset) + if(ctx.mSize < ctx.mOffset) { std::cerr << "RsSerializer::deserialise(): ERROR. offset does not match expected size!" << std::endl; delete item ; return NULL ; } + *size = ctx.mOffset ; + if(ctx.mOk) return item ; @@ -139,6 +143,8 @@ bool RsGenericSerializer::serialise(RsItem *item,void *data,uint32_t *size) std::cerr << "RsSerializer::serialise(): ERROR. offset does not match expected size!" << std::endl; return false ; } + *size = ctx.mOffset ; + return true ; } From 59ac5a5bfa05ef36e7bfa9f9ff7bbbea54a2f4fe Mon Sep 17 00:00:00 2001 From: csoler Date: Sat, 6 May 2017 16:51:38 +0200 Subject: [PATCH 06/50] added on-the-fly fix of group privacy flags, so that edited groups with old un-set flags will be set automatically. Also fixes the bug preventing to grant membership on old circles --- libretroshare/src/gxs/rsgenexchange.cc | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/libretroshare/src/gxs/rsgenexchange.cc b/libretroshare/src/gxs/rsgenexchange.cc index a970971ff..771f54e13 100644 --- a/libretroshare/src/gxs/rsgenexchange.cc +++ b/libretroshare/src/gxs/rsgenexchange.cc @@ -1366,6 +1366,18 @@ bool RsGenExchange::getGroupData(const uint32_t &token, std::vectormeta.mPop = 0; gItem->meta.mVisibleMsgCount = 0; } + + // Also check the group privacy flags. A while ago, it as possible to publish a group without privacy flags. Now it is not possible anymore. + // As a consequence, it's important to supply a correct value in this flag before the data can be edited/updated. + + if((gItem->meta.mGroupFlags & GXS_SERV::FLAG_PRIVACY_MASK) == 0) + { +#ifdef GEN_EXCH_DEBUG + std::cerr << "(WW) getGroupData(): mGroupFlags for group " << gItem->meta.mGroupId << " has incorrect value " << std::hex << gItem->meta.mGroupFlags << std::dec << ". Setting value to GXS_SERV::FLAG_PRIVACY_PUBLIC." << std::endl; +#endif + gItem->meta.mGroupFlags |= GXS_SERV::FLAG_PRIVACY_PUBLIC; + } + grpItem.push_back(gItem); } else From b18a186c5fd7bdfd5d5b98ba07fb3514f25ac346 Mon Sep 17 00:00:00 2001 From: csoler Date: Sat, 6 May 2017 18:20:48 +0200 Subject: [PATCH 07/50] fixed ftExtraList to accept e2e encrypted transfers in addition to direct transfers. This fixed the drag+drop of shared files in a distant chat --- libretroshare/src/ft/ftextralist.cc | 90 ++++++++++++++++++++--------- libretroshare/src/ft/ftextralist.h | 69 +++++++++++----------- 2 files changed, 100 insertions(+), 59 deletions(-) diff --git a/libretroshare/src/ft/ftextralist.cc b/libretroshare/src/ft/ftextralist.cc index 7548d421c..cd52f5ce5 100644 --- a/libretroshare/src/ft/ftextralist.cc +++ b/libretroshare/src/ft/ftextralist.cc @@ -53,11 +53,6 @@ void ftExtraList::data_tick() bool todo = false; time_t now = time(NULL); -#ifdef DEBUG_ELIST - //std::cerr << "ftExtraList::run() Iteration"; - //std::cerr << std::endl; -#endif - { RsStackMutex stack(extMutex); @@ -131,6 +126,7 @@ void ftExtraList::hashAFile() /* stick it in the available queue */ mFiles[details.info.hash] = details; + mHashOfHash[makeEncryptedHash(details.info.hash)] = details.info.hash ; /* add to the path->hash map */ mHashedList[details.info.path] = details.info.hash; @@ -169,6 +165,7 @@ bool ftExtraList::addExtraFile(std::string path, const RsFileHash& hash, /* stick it in the available queue */ mFiles[details.info.hash] = details; + mHashOfHash[makeEncryptedHash(details.info.hash)] = details.info.hash ; IndicateConfigChanged(); @@ -190,6 +187,8 @@ bool ftExtraList::removeExtraFile(const RsFileHash& hash, TransferRequestFlags f RsStackMutex stack(extMutex); + mHashOfHash.erase(makeEncryptedHash(hash)) ; + std::map::iterator it; it = mFiles.find(hash); if (it == mFiles.end()) @@ -242,29 +241,26 @@ bool ftExtraList::cleanupOldFiles() time_t now = time(NULL); std::list toRemove; - std::list::iterator rit; - std::map::iterator it; - for(it = mFiles.begin(); it != mFiles.end(); ++it) - { - /* check timestamps */ + for( std::map::iterator it = mFiles.begin(); it != mFiles.end(); ++it) /* check timestamps */ if ((time_t)it->second.info.age < now) - { toRemove.push_back(it->first); - } - } if (toRemove.size() > 0) { + std::map::iterator it; + /* remove items */ - for(rit = toRemove.begin(); rit != toRemove.end(); ++rit) - { + for(std::list::iterator rit = toRemove.begin(); rit != toRemove.end(); ++rit) + { if (mFiles.end() != (it = mFiles.find(*rit))) { cleanupEntry(it->second.info.path, it->second.info.transfer_info_flags); mFiles.erase(it); } - } + mHashOfHash.erase(makeEncryptedHash(*rit)) ; + } + IndicateConfigChanged(); } return true; @@ -333,31 +329,71 @@ bool ftExtraList::hashExtraFileDone(std::string path, FileInfo &info) **/ bool ftExtraList::search(const RsFileHash &hash, FileSearchFlags /*hintflags*/, FileInfo &info) const { - #ifdef DEBUG_ELIST - std::cerr << "ftExtraList::search()"; - std::cerr << std::endl; + std::cerr << "ftExtraList::search() hash=" << hash ; #endif /* find hash */ std::map::const_iterator fit; if (mFiles.end() == (fit = mFiles.find(hash))) { - return false; +#ifdef DEBUG_ELIST + std::cerr << " not found in mFiles. Trying encrypted... " ; +#endif + // File not found. We try to look for encrypted hash. + + std::map::const_iterator hit = mHashOfHash.find(hash) ; + + if(hit == mHashOfHash.end()) + { +#ifdef DEBUG_ELIST + std::cerr << " not found." << std::endl; +#endif + return false; + } +#ifdef DEBUG_ELIST + std::cerr << " found! Reaching data..." ; +#endif + + fit = mFiles.find(hit->second) ; + + if(fit == mFiles.end()) // not found. This is an error. + { +#ifdef DEBUG_ELIST + std::cerr << " no data. Returning false." << std::endl; +#endif + return false ; + } + +#ifdef DEBUG_ELIST + std::cerr << " ok! Accepting encrypted transfer." << std::endl; +#endif + info = fit->second.info; + info.storage_permission_flags = FileStorageFlags(DIR_FLAGS_ANONYMOUS_DOWNLOAD) ; + info.transfer_info_flags |= RS_FILE_REQ_ENCRYPTED ; } + else + { +#ifdef DEBUG_ELIST + std::cerr << " found! Accepting direct transfer" << std::endl; +#endif + info = fit->second.info; - info = fit->second.info; - - // Now setup the file storage flags so that the client can know how to handle permissions - // -#warning mr-alice: make sure this is right - info.storage_permission_flags = FileStorageFlags(0) ;//DIR_FLAGS_BROWSABLE_OTHERS ; + // Unencrypted file transfer: We only allow direct transfers. This is not exactly secure since another friend can + // swarm the file. But the hash being kept secret, there's no risk here. + // + info.storage_permission_flags = FileStorageFlags(DIR_FLAGS_BROWSABLE) ; + } if(info.transfer_info_flags & RS_FILE_REQ_ANONYMOUS_ROUTING) info.storage_permission_flags |= DIR_FLAGS_ANONYMOUS_DOWNLOAD ; return true; } +RsFileHash ftExtraList::makeEncryptedHash(const RsFileHash& hash) +{ + return RsDirUtil::sha1sum(hash.toByteArray(),hash.SIZE_IN_BYTES); +} /*** * Configuration - store extra files. @@ -472,6 +508,8 @@ bool ftExtraList::loadList(std::list& load) /* stick it in the available queue */ mFiles[details.info.hash] = details; + mHashOfHash[makeEncryptedHash(details.info.hash)] = details.info.hash ; + delete (*it); /* short sleep */ diff --git a/libretroshare/src/ft/ftextralist.h b/libretroshare/src/ft/ftextralist.h index 19f1be302..211e66dc6 100644 --- a/libretroshare/src/ft/ftextralist.h +++ b/libretroshare/src/ft/ftextralist.h @@ -109,66 +109,69 @@ const uint32_t CLEANUP_PERIOD = 600; /* 10 minutes */ class ftExtraList: public RsTickingThread, public p3Config, public ftSearch { - public: +public: - ftExtraList(); + ftExtraList(); - /*** + /*** * If the File is alreay Hashed, then just add it in. **/ -bool addExtraFile(std::string path, const RsFileHash &hash, - uint64_t size, uint32_t period, TransferRequestFlags flags); + bool addExtraFile(std::string path, const RsFileHash &hash, + uint64_t size, uint32_t period, TransferRequestFlags flags); -bool removeExtraFile(const RsFileHash& hash, TransferRequestFlags flags); -bool moveExtraFile(std::string fname, const RsFileHash& hash, uint64_t size, - std::string destpath); + bool removeExtraFile(const RsFileHash& hash, TransferRequestFlags flags); + bool moveExtraFile(std::string fname, const RsFileHash& hash, uint64_t size, + std::string destpath); - /*** - * Hash file, and add to the files, + /*** + * Hash file, and add to the files, * file is removed after period. **/ -bool hashExtraFile(std::string path, uint32_t period, TransferRequestFlags flags); -bool hashExtraFileDone(std::string path, FileInfo &info); + bool hashExtraFile(std::string path, uint32_t period, TransferRequestFlags flags); + bool hashExtraFileDone(std::string path, FileInfo &info); - /*** - * Search Function - used by File Transfer + /*** + * Search Function - used by File Transfer * implementation of ftSearch. * **/ -virtual bool search(const RsFileHash &hash, FileSearchFlags hintflags, FileInfo &info) const; + virtual bool search(const RsFileHash &hash, FileSearchFlags hintflags, FileInfo &info) const; - /*** - * Thread Main Loop + /*** + * Thread Main Loop **/ -virtual void data_tick(); + virtual void data_tick(); - /*** + /*** * Configuration - store extra files. * **/ - protected: -virtual RsSerialiser *setupSerialiser(); -virtual bool saveList(bool &cleanup, std::list&); -virtual bool loadList(std::list& load); +protected: + virtual RsSerialiser *setupSerialiser(); + virtual bool saveList(bool &cleanup, std::list&); + virtual bool loadList(std::list& load); - private: + static RsFileHash makeEncryptedHash(const RsFileHash& hash); - /* Worker Functions */ -void hashAFile(); -bool cleanupOldFiles(); -bool cleanupEntry(std::string path, TransferRequestFlags flags); +private: - mutable RsMutex extMutex; + /* Worker Functions */ + void hashAFile(); + bool cleanupOldFiles(); + bool cleanupEntry(std::string path, TransferRequestFlags flags); - std::list mToHash; + mutable RsMutex extMutex; - std::map mHashedList; /* path -> hash ( not saved ) */ - std::map mFiles; + std::list mToHash; - time_t cleanup ; + std::map mHashedList; /* path -> hash ( not saved ) */ + std::map mFiles; + std::map mHashOfHash; /* sha1(hash) map so as to answer requests to encrypted transfers */ + + time_t cleanup ; }; From 24eca4a64ff7c8a838738d0ce64ba1a393541090 Mon Sep 17 00:00:00 2001 From: defnax Date: Sun, 7 May 2017 19:39:20 +0200 Subject: [PATCH 08/50] Moved status icon column to the last position --- retroshare-gui/src/gui/chat/ChatLobbyDialog.cpp | 16 ++++++++++------ retroshare-gui/src/gui/chat/ChatLobbyDialog.ui | 8 +++----- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/retroshare-gui/src/gui/chat/ChatLobbyDialog.cpp b/retroshare-gui/src/gui/chat/ChatLobbyDialog.cpp index 20352b888..29094f084 100644 --- a/retroshare-gui/src/gui/chat/ChatLobbyDialog.cpp +++ b/retroshare-gui/src/gui/chat/ChatLobbyDialog.cpp @@ -54,10 +54,10 @@ #include -#define COLUMN_ICON 0 -#define COLUMN_NAME 1 -#define COLUMN_ACTIVITY 2 -#define COLUMN_ID 3 +#define COLUMN_NAME 0 +#define COLUMN_ACTIVITY 1 +#define COLUMN_ID 2 +#define COLUMN_ICON 3 #define COLUMN_COUNT 4 #define ROLE_SORT Qt::UserRole + 1 @@ -80,12 +80,16 @@ ChatLobbyDialog::ChatLobbyDialog(const ChatLobbyId& lid, QWidget *parent, Qt::Wi connect(ui.filterLineEdit, SIGNAL(textChanged(QString)), this, SLOT(filterChanged(QString))); int S = QFontMetricsF(font()).height() ; - ui.participantsList->setIconSize(QSize(1.3*S,1.3*S)); + ui.participantsList->setIconSize(QSize(1.4*S,1.4*S)); ui.participantsList->setColumnCount(COLUMN_COUNT); - ui.participantsList->setColumnWidth(COLUMN_ICON, 1.4*S); + ui.participantsList->setColumnWidth(COLUMN_ICON, 1.7*S); ui.participantsList->setColumnHidden(COLUMN_ACTIVITY,true); ui.participantsList->setColumnHidden(COLUMN_ID,true); + + /* Set header resize modes and initial section sizes */ + QHeaderView * header = ui.participantsList->header(); + header->setSectionResizeMode( COLUMN_NAME, QHeaderView::Stretch); muteAct = new QAction(QIcon(), tr("Mute participant"), this); voteNegativeAct = new QAction(QIcon(":/icons/png/thumbs-down.png"), tr("Ban this person (Sets negative opinion)"), this); diff --git a/retroshare-gui/src/gui/chat/ChatLobbyDialog.ui b/retroshare-gui/src/gui/chat/ChatLobbyDialog.ui index acc30b281..0a1635735 100644 --- a/retroshare-gui/src/gui/chat/ChatLobbyDialog.ui +++ b/retroshare-gui/src/gui/chat/ChatLobbyDialog.ui @@ -145,11 +145,9 @@ false - - - Participants - - + + false + Name From 84c81588bb28ff29c0dded931f1e6c50dc60f4a0 Mon Sep 17 00:00:00 2001 From: csoler Date: Mon, 8 May 2017 09:38:33 +0200 Subject: [PATCH 09/50] disabled show OpMode status on default --- retroshare-gui/src/gui/MainWindow.cpp | 2 +- retroshare-gui/src/gui/settings/AppearancePage.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/retroshare-gui/src/gui/MainWindow.cpp b/retroshare-gui/src/gui/MainWindow.cpp index af2e10574..5f140a72b 100644 --- a/retroshare-gui/src/gui/MainWindow.cpp +++ b/retroshare-gui/src/gui/MainWindow.cpp @@ -265,7 +265,7 @@ MainWindow::MainWindow(QWidget* parent, Qt::WindowFlags flags) statusBar()->addPermanentWidget(ratesstatus); opModeStatus = new OpModeStatus(); - opModeStatus->setVisible(Settings->valueFromGroup("StatusBar", "ShowOpMode", QVariant(true)).toBool()); + opModeStatus->setVisible(Settings->valueFromGroup("StatusBar", "ShowOpMode", QVariant(false)).toBool()); statusBar()->addPermanentWidget(opModeStatus); soundStatus = new SoundStatus(); diff --git a/retroshare-gui/src/gui/settings/AppearancePage.cpp b/retroshare-gui/src/gui/settings/AppearancePage.cpp index 0e98f819e..e5e742c72 100755 --- a/retroshare-gui/src/gui/settings/AppearancePage.cpp +++ b/retroshare-gui/src/gui/settings/AppearancePage.cpp @@ -304,9 +304,9 @@ void AppearancePage::load() whileBlocking(ui.checkBoxShowNATStatus)-> setChecked(Settings->valueFromGroup("StatusBar", "ShowNAT", QVariant(true)).toBool()); whileBlocking(ui.checkBoxShowDHTStatus)-> setChecked(Settings->valueFromGroup("StatusBar", "ShowDHT", QVariant(true)).toBool()); whileBlocking(ui.checkBoxShowHashingStatus)-> setChecked(Settings->valueFromGroup("StatusBar", "ShowHashing", QVariant(true)).toBool()); - whileBlocking(ui.checkBoxShowDiscStatus)-> setChecked(Settings->valueFromGroup("StatusBar", "ShowDisc", QVariant(true)).toBool()); + whileBlocking(ui.checkBoxShowDiscStatus)-> setChecked(Settings->valueFromGroup("StatusBar", "ShowDisc", QVariant(true)).toBool()); whileBlocking(ui.checkBoxShowRateStatus)-> setChecked(Settings->valueFromGroup("StatusBar", "ShowRate", QVariant(true)).toBool()); - whileBlocking(ui.checkBoxShowOpModeStatus)-> setChecked(Settings->valueFromGroup("StatusBar", "ShowOpMode", QVariant(true)).toBool()); + whileBlocking(ui.checkBoxShowOpModeStatus)-> setChecked(Settings->valueFromGroup("StatusBar", "ShowOpMode", QVariant(false)).toBool()); whileBlocking(ui.checkBoxShowSoundStatus)-> setChecked(Settings->valueFromGroup("StatusBar", "ShowSound", QVariant(true)).toBool()); whileBlocking(ui.checkBoxShowToasterDisable)->setChecked(Settings->valueFromGroup("StatusBar", "ShowToaster", QVariant(true)).toBool()); whileBlocking(ui.checkBoxShowSystrayOnStatus)->setChecked(Settings->valueFromGroup("StatusBar", "ShowSysTrayOnStatusBar", QVariant(false)).toBool()); From 6cb499065f9473447190424298627ead2e6422ad Mon Sep 17 00:00:00 2001 From: csoler Date: Mon, 8 May 2017 10:06:40 +0200 Subject: [PATCH 10/50] fixed compilation with qt4 --- retroshare-gui/src/gui/chat/ChatLobbyDialog.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/retroshare-gui/src/gui/chat/ChatLobbyDialog.cpp b/retroshare-gui/src/gui/chat/ChatLobbyDialog.cpp index 29094f084..1e5361ead 100644 --- a/retroshare-gui/src/gui/chat/ChatLobbyDialog.cpp +++ b/retroshare-gui/src/gui/chat/ChatLobbyDialog.cpp @@ -33,6 +33,7 @@ #include #include "ChatLobbyDialog.h" +#include "util/QtVersion.h" #include "gui/ChatLobbyWidget.h" #include "ChatTabWidget.h" #include "gui/settings/rsharesettings.h" @@ -89,7 +90,7 @@ ChatLobbyDialog::ChatLobbyDialog(const ChatLobbyId& lid, QWidget *parent, Qt::Wi /* Set header resize modes and initial section sizes */ QHeaderView * header = ui.participantsList->header(); - header->setSectionResizeMode( COLUMN_NAME, QHeaderView::Stretch); + QHeaderView_setSectionResizeModeColumn(header, COLUMN_NAME, QHeaderView::Stretch); muteAct = new QAction(QIcon(), tr("Mute participant"), this); voteNegativeAct = new QAction(QIcon(":/icons/png/thumbs-down.png"), tr("Ban this person (Sets negative opinion)"), this); From de0f8b9595e78afa5b9fa3b676d83197ae1b22f4 Mon Sep 17 00:00:00 2001 From: csoler Date: Mon, 8 May 2017 10:51:15 +0200 Subject: [PATCH 11/50] moved passphrase box into start dialog, and removed blank logo, replaced it by RS splash logo --- retroshare-gui/src/gui/StartDialog.cpp | 35 ++++-- retroshare-gui/src/gui/StartDialog.h | 1 + retroshare-gui/src/gui/StartDialog.ui | 160 ++++--------------------- 3 files changed, 48 insertions(+), 148 deletions(-) diff --git a/retroshare-gui/src/gui/StartDialog.cpp b/retroshare-gui/src/gui/StartDialog.cpp index 6ac5ce1a5..6b100d319 100644 --- a/retroshare-gui/src/gui/StartDialog.cpp +++ b/retroshare-gui/src/gui/StartDialog.cpp @@ -19,11 +19,13 @@ * Boston, MA 02110-1301, USA. ****************************************************************/ -#include -#include +#include + +#include "rshare.h" +#include "retroshare/rsinit.h" #include "StartDialog.h" #include "LogoBar.h" -#include +#include "retroshare/rsnotify.h" #include "settings/rsharesettings.h" #include @@ -43,10 +45,6 @@ StartDialog::StartDialog(QWidget *parent) Settings->loadWidgetInformation(this); - ui.loadButton->setFocus(); - - connect(ui.loadButton, SIGNAL(clicked()), this, SLOT(loadPerson())); - /* get all available pgp private certificates.... * mark last one as default. */ @@ -75,12 +73,21 @@ StartDialog::StartDialog(QWidget *parent) } } + QObject::connect(ui.loadName,SIGNAL(currentIndexChanged(int)),this,SLOT(updateSelectedProfile(int))) ; + QObject::connect(ui.password_input,SIGNAL(returnPressed()),this,SLOT(loadPerson())) ; + if (pidx > 0) { ui.loadName->setCurrentIndex(pidx); } } +void StartDialog::updateSelectedProfile(int) +{ + ui.password_input->clear(); + ui.password_input->setFocus(); +} + void StartDialog::closeEvent (QCloseEvent * event) { Settings->saveWidgetInformation(this); @@ -101,18 +108,22 @@ void StartDialog::loadPerson() QVariant data = ui.loadName->itemData(pgpidx); RsPeerId accountId = RsPeerId((data.toString()).toStdString()); - if (Rshare::loadCertificate(accountId, ui.autologin_checkbox->isChecked())) { + // Cache the passphrase, so that it is not asked again. + + rsNotify->cachePgpPassphrase(ui.password_input->text().toUtf8().constData()) ; + + bool res = Rshare::loadCertificate(accountId, ui.autologin_checkbox->isChecked()) ; + + rsNotify->clearPgpPassphrase(); + + if(res) accept(); - } } void StartDialog::on_labelProfile_linkActivated(QString /*link*/) { -// if ((QMessageBox::question(this, tr("Create a New Profile"),tr("This will generate a new Profile\n Are you sure you want to continue?"),QMessageBox::Yes|QMessageBox::No, QMessageBox::Yes))== QMessageBox::Yes) -// { reqNewCert = true; accept(); -// } } bool StartDialog::requestedNewCert() diff --git a/retroshare-gui/src/gui/StartDialog.h b/retroshare-gui/src/gui/StartDialog.h index 2cd9c2d34..26d7f9c54 100644 --- a/retroshare-gui/src/gui/StartDialog.h +++ b/retroshare-gui/src/gui/StartDialog.h @@ -39,6 +39,7 @@ protected: private slots: void loadPerson(); + void updateSelectedProfile(int); #ifdef RS_AUTOLOGIN /** diff --git a/retroshare-gui/src/gui/StartDialog.ui b/retroshare-gui/src/gui/StartDialog.ui index ae198d4a7..fb1554a32 100644 --- a/retroshare-gui/src/gui/StartDialog.ui +++ b/retroshare-gui/src/gui/StartDialog.ui @@ -6,8 +6,8 @@ 0 0 - 430 - 552 + 656 + 645 @@ -42,76 +42,6 @@ 0 - - - 0 - - - 6 - - - 0 - - - 6 - - - 6 - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - QToolButton { - border-image: url(:/images/avatar_background.png); -} - - - - - - - :/images/user/personal64.png:/images/user/personal64.png - - - - 96 - 96 - - - - true - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - @@ -134,12 +64,6 @@ 0 - - - 16777215 - 32 - - @@ -183,7 +107,10 @@ - Login + + + + :/images/logo/logo_splash.png @@ -202,7 +129,7 @@ - + true @@ -220,13 +147,27 @@ - Profile - Location + Profile - Location: + + + + Password: + + + + + + + QLineEdit::Password + + + @@ -240,56 +181,7 @@ - - - - 9 - - - 9 - - - - - Log In - - - true - - - false - - - - - - - Qt::Horizontal - - - - 61 - 20 - - - - - - - - Qt::Horizontal - - - - 71 - 20 - - - - - - - + Opens a dialog for creating a new profile or @@ -305,7 +197,7 @@ p, li { white-space: pre-wrap; } - + @@ -333,10 +225,6 @@ p, li { white-space: pre-wrap; } 1 - - loadButton - toolButton - From 4e2db2f50ad76a7243f841496013b8a24f58dab2 Mon Sep 17 00:00:00 2001 From: Phenom Date: Mon, 8 May 2017 11:30:54 +0200 Subject: [PATCH 12/50] Fix UnitTest --- tests/unittests/libretroshare/serialiser/rsmsgitem_test.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unittests/libretroshare/serialiser/rsmsgitem_test.cc b/tests/unittests/libretroshare/serialiser/rsmsgitem_test.cc index c473276dc..2513ed77a 100644 --- a/tests/unittests/libretroshare/serialiser/rsmsgitem_test.cc +++ b/tests/unittests/libretroshare/serialiser/rsmsgitem_test.cc @@ -288,7 +288,7 @@ bool operator ==(const RsMsgItem& miLeft, const RsMsgItem& miRight) if(miLeft.recvTime != miRight.recvTime) return false; if(miLeft.sendTime != miRight.sendTime) return false; if(miLeft.subject != miRight.subject) return false; - if(miLeft.msgId != miRight.msgId) return false; + //if(miLeft.msgId != miRight.msgId) return false; if(!(miLeft.attachment == miRight.attachment)) return false; if(!(miLeft.rspeerid_msgbcc == miRight.rspeerid_msgbcc)) return false; From 5050d4f66a891702aabcadb82c4485e87c0300e9 Mon Sep 17 00:00:00 2001 From: Phenom Date: Mon, 8 May 2017 11:42:49 +0200 Subject: [PATCH 13/50] =?UTF-8?q?Fix=20Warnings:=20unused=20parameter=20?= =?UTF-8?q?=E2=80=98indent=E2=80=99=20warning:=20unused=20parameter=20?= =?UTF-8?q?=E2=80=98indent=E2=80=99=20[-Wunused-parameter]=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20virtual=20std::ostream&=20print(std::ostream=20&?= =?UTF-8?q?out,=20uint16=5Ft=20indent=20=3D=200)=20{=20return=20out;=20}?= =?UTF-8?q?=20//=20derived=20from=20RsItem,=20but=20should=20be=20removed?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20^?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libretroshare/src/chat/rschatitems.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libretroshare/src/chat/rschatitems.h b/libretroshare/src/chat/rschatitems.h index ddc0a2b86..ab511aab8 100644 --- a/libretroshare/src/chat/rschatitems.h +++ b/libretroshare/src/chat/rschatitems.h @@ -93,7 +93,7 @@ class RsChatItem: public RsItem } virtual ~RsChatItem() {} - virtual std::ostream& print(std::ostream &out, uint16_t indent = 0) { return out; } // derived from RsItem, but should be removed + virtual std::ostream& print(std::ostream &out, uint16_t /*indent*/ = 0) { return out; } // derived from RsItem, but should be removed virtual void clear() {} }; From dd089a96835ce23aebbcd0ff17e23b4bb5fee9a1 Mon Sep 17 00:00:00 2001 From: Phenom Date: Mon, 8 May 2017 11:46:54 +0200 Subject: [PATCH 14/50] =?UTF-8?q?Fix=20Warnings:=20this=20=E2=80=98if?= =?UTF-8?q?=E2=80=99=20clause=20does=20not=20guard?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit warning: this ‘if’ clause does not guard... [-Wmisleading-indentation] if(service_id != RS_SERVICE_TYPE_CHAT) ^~ --- libretroshare/src/chat/rschatitems.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libretroshare/src/chat/rschatitems.cc b/libretroshare/src/chat/rschatitems.cc index 2b7dd67d8..62d9065e7 100644 --- a/libretroshare/src/chat/rschatitems.cc +++ b/libretroshare/src/chat/rschatitems.cc @@ -39,8 +39,8 @@ static const uint32_t RS_CHAT_SERIALIZER_FLAGS_NO_SIGNATURE = 0x0001; RsItem *RsChatSerialiser::create_item(uint16_t service_id,uint8_t item_sub_id) const { - if(service_id != RS_SERVICE_TYPE_CHAT) - return NULL ; + if (service_id != RS_SERVICE_TYPE_CHAT) + return NULL; switch(item_sub_id) { From 381aca41971c1dec3f1717d3661d9a4b529aef6f Mon Sep 17 00:00:00 2001 From: Phenom Date: Mon, 8 May 2017 11:49:39 +0200 Subject: [PATCH 15/50] =?UTF-8?q?Fix=20Warnings:=20unused=20parameter=20?= =?UTF-8?q?=E2=80=98j=E2=80=99,=20'ctx'=20&=20'name'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit warning: unused parameter ‘j’ [-Wunused-parameter] void RsChatLobbyListRequestItem::serial_process(RsGenericSerializer::SerializeJob j,RsGenericSerializer::SerializeContext& ctx) ^ --- libretroshare/src/chat/rschatitems.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libretroshare/src/chat/rschatitems.cc b/libretroshare/src/chat/rschatitems.cc index 62d9065e7..dc46b759f 100644 --- a/libretroshare/src/chat/rschatitems.cc +++ b/libretroshare/src/chat/rschatitems.cc @@ -97,12 +97,12 @@ void RsChatLobbyMsgItem::serial_process(RsGenericSerializer::SerializeJob j,RsGe RsChatLobbyBouncingObject::serial_process(j,ctx) ; } -void RsChatLobbyListRequestItem::serial_process(RsGenericSerializer::SerializeJob j,RsGenericSerializer::SerializeContext& ctx) +void RsChatLobbyListRequestItem::serial_process(RsGenericSerializer::SerializeJob /*j*/,RsGenericSerializer::SerializeContext& /*ctx*/) { // nothing to do. This is an empty item. } -template<> void RsTypeSerializer::serial_process(RsGenericSerializer::SerializeJob j,RsGenericSerializer::SerializeContext& ctx,VisibleChatLobbyInfo& info,const std::string& name) +template<> void RsTypeSerializer::serial_process(RsGenericSerializer::SerializeJob j,RsGenericSerializer::SerializeContext& ctx,VisibleChatLobbyInfo& info,const std::string& /*name*/) { RsTypeSerializer::serial_process(j,ctx,info.id,"info.id") ; From 7892004641aa2565ee8018ff97c152620db7a517 Mon Sep 17 00:00:00 2001 From: Phenom Date: Mon, 8 May 2017 11:53:16 +0200 Subject: [PATCH 16/50] =?UTF-8?q?Fix=20Warnings:=20unused=20parameter=20?= =?UTF-8?q?=E2=80=98member=5Fname=E2=80=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit warning: unused parameter ‘member_name’ [-Wunused-parameter] static void serial_process(RsGenericSerializer::SerializeJob j,RsGenericSerializer::SerializeContext& ctx,t_RsFlags32& v,const std::string& member_name) ^~~~~~~~~~~ --- libretroshare/src/serialiser/rstypeserializer.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libretroshare/src/serialiser/rstypeserializer.h b/libretroshare/src/serialiser/rstypeserializer.h index 333f1a364..fe97ff210 100644 --- a/libretroshare/src/serialiser/rstypeserializer.h +++ b/libretroshare/src/serialiser/rstypeserializer.h @@ -333,7 +333,7 @@ class RsTypeSerializer //=================================================================================================// template - static void serial_process(RsGenericSerializer::SerializeJob j,RsGenericSerializer::SerializeContext& ctx,t_RsFlags32& v,const std::string& member_name) + static void serial_process(RsGenericSerializer::SerializeJob j,RsGenericSerializer::SerializeContext& ctx,t_RsFlags32& v,const std::string& /*member_name*/) { switch(j) { From 9021609a6b02ccb7fe865c1b28ba643383a0812f Mon Sep 17 00:00:00 2001 From: Phenom Date: Mon, 8 May 2017 11:55:23 +0200 Subject: [PATCH 17/50] =?UTF-8?q?Fix=20Warnings:=20unused=20variable=20?= =?UTF-8?q?=E2=80=98p=E2=80=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit warning: unused variable ‘p’ [-Wunused-variable] unsigned char *p,*buf_in=NULL; ^ --- libretroshare/src/pqi/authssl.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libretroshare/src/pqi/authssl.cc b/libretroshare/src/pqi/authssl.cc index ccc176908..f04e71354 100644 --- a/libretroshare/src/pqi/authssl.cc +++ b/libretroshare/src/pqi/authssl.cc @@ -815,7 +815,7 @@ X509 *AuthSSLimpl::SignX509ReqWithGPG(X509_REQ *req, long /*days*/) const EVP_MD *type = EVP_sha1(); EVP_MD_CTX *ctx = EVP_MD_CTX_create(); - unsigned char *p,*buf_in=NULL; + unsigned char *buf_in=NULL; unsigned char *buf_hashout=NULL,*buf_sigout=NULL; int inl=0,hashoutl=0; int sigoutl=0; @@ -874,7 +874,7 @@ X509 *AuthSSLimpl::SignX509ReqWithGPG(X509_REQ *req, long /*days*/) std::cerr << "Buffers Allocated" << std::endl; #if OPENSSL_VERSION_NUMBER < 0x10100000L - p=buf_in; + unsigned char *p=buf_in; i2d(data,&p); #endif From ca291b7ee686e1bd2be2a2461b620518ccf20c62 Mon Sep 17 00:00:00 2001 From: Phenom Date: Mon, 8 May 2017 12:05:58 +0200 Subject: [PATCH 18/50] =?UTF-8?q?Fix=20Warnings:=20warning:=20unused=20var?= =?UTF-8?q?iable=20=E2=80=98i2d=E2=80=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit warning: unused variable ‘i2d’ [-Wunused-variable] int (*i2d)(X509_CINF*, unsigned char**) = i2d_X509_CINF; ^~~ --- libretroshare/src/pqi/authssl.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libretroshare/src/pqi/authssl.cc b/libretroshare/src/pqi/authssl.cc index f04e71354..9317f69dc 100644 --- a/libretroshare/src/pqi/authssl.cc +++ b/libretroshare/src/pqi/authssl.cc @@ -977,9 +977,9 @@ bool AuthSSLimpl::AuthX509WithGPG(X509 *x509,uint32_t& diagnostic) /* verify GPG signature */ /*** NOW The Manual signing bit (HACKED FROM asn1/a_sign.c) ***/ - int (*i2d)(X509_CINF*, unsigned char**) = i2d_X509_CINF; #if OPENSSL_VERSION_NUMBER < 0x10100000L + int (*i2d)(X509_CINF*, unsigned char**) = i2d_X509_CINF; ASN1_BIT_STRING *signature = x509->signature; X509_CINF *data = x509->cert_info; #else From 91e3cc3e5fab30f03ddd3e076bbee9c85609b7a1 Mon Sep 17 00:00:00 2001 From: Phenom Date: Mon, 8 May 2017 12:08:29 +0200 Subject: [PATCH 19/50] =?UTF-8?q?Fix=20Warnings:=20variable=20=E2=80=98p?= =?UTF-8?q?=E2=80=99=20set=20but=20not=20used?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit warning: variable ‘p’ set but not used [-Wunused-but-set-variable] unsigned char *p,*buf_in=NULL; ^ --- libretroshare/src/pqi/authssl.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libretroshare/src/pqi/authssl.cc b/libretroshare/src/pqi/authssl.cc index 9317f69dc..c28c5d0d3 100644 --- a/libretroshare/src/pqi/authssl.cc +++ b/libretroshare/src/pqi/authssl.cc @@ -993,7 +993,7 @@ bool AuthSSLimpl::AuthX509WithGPG(X509 *x509,uint32_t& diagnostic) const EVP_MD *type = EVP_sha1(); EVP_MD_CTX *ctx = EVP_MD_CTX_create(); - unsigned char *p,*buf_in=NULL; + unsigned char *buf_in=NULL; unsigned char *buf_hashout=NULL,*buf_sigout=NULL; int inl=0,hashoutl=0; int sigoutl=0; @@ -1026,13 +1026,13 @@ bool AuthSSLimpl::AuthX509WithGPG(X509 *x509,uint32_t& diagnostic) diagnostic = RS_SSL_HANDSHAKE_DIAGNOSTIC_MALLOC_ERROR ; goto err; } - p=buf_in; #ifdef AUTHSSL_DEBUG std::cerr << "Buffers Allocated" << std::endl; #endif #if OPENSSL_VERSION_NUMBER < 0x10100000L + unsigned char *p=buf_in; i2d(data,&p); #endif /* data in buf_in, ready to be hashed */ From 9b1209db6818404af47031a810c0a992ea7db161 Mon Sep 17 00:00:00 2001 From: Phenom Date: Mon, 8 May 2017 12:14:04 +0200 Subject: [PATCH 20/50] =?UTF-8?q?Fix=20Warnings:=20unused=20parameter=20?= =?UTF-8?q?=E2=80=98s=E2=80=99=20&=20'n'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit warning: unused parameter ‘s’ [-Wunused-parameter] template<> uint32_t RsTypeSerializer::serial_size(const PeerBandwidthLimits& s) ^ --- libretroshare/src/rsitems/rsconfigitems.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libretroshare/src/rsitems/rsconfigitems.cc b/libretroshare/src/rsitems/rsconfigitems.cc index 15a8dd624..f6296bd04 100644 --- a/libretroshare/src/rsitems/rsconfigitems.cc +++ b/libretroshare/src/rsitems/rsconfigitems.cc @@ -192,7 +192,7 @@ void RsPeerStunItem::serial_process(RsGenericSerializer::SerializeJob j,RsGeneri RsTypeSerializer::serial_process(j,ctx,stunList,"stunList") ; } -template<> uint32_t RsTypeSerializer::serial_size(const PeerBandwidthLimits& s) +template<> uint32_t RsTypeSerializer::serial_size(const PeerBandwidthLimits& /*s*/) { return 4+4 ; } @@ -213,7 +213,7 @@ template<> bool RsTypeSerializer::deserialize(const uint8_t data[], uint32_t siz return ok; } -template<> void RsTypeSerializer::print_data(const std::string& n, const PeerBandwidthLimits& s) +template<> void RsTypeSerializer::print_data(const std::string& /*n*/, const PeerBandwidthLimits& s) { std::cerr << " [Peer BW limit] " << s.max_up_rate_kbs << " / " << s.max_dl_rate_kbs << std::endl; } From ee7e92d6c4a960c9f1213f22a61974641ac9bc38 Mon Sep 17 00:00:00 2001 From: Phenom Date: Mon, 8 May 2017 12:15:45 +0200 Subject: [PATCH 21/50] =?UTF-8?q?Fix=20Warnings:=20this=20=E2=80=98if?= =?UTF-8?q?=E2=80=99=20clause=20does=20not=20guard...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit warning: this ‘if’ clause does not guard... [-Wmisleading-indentation] if(buffer.empty()) ^~ --- libretroshare/src/util/rsrecogn.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libretroshare/src/util/rsrecogn.cc b/libretroshare/src/util/rsrecogn.cc index 8580c7780..a372b9b2d 100644 --- a/libretroshare/src/util/rsrecogn.cc +++ b/libretroshare/src/util/rsrecogn.cc @@ -552,8 +552,8 @@ RsGxsRecognTagItem *RsRecogn::extractTag(const std::string &encoded) std::vector buffer = Radix64::decode(encoded); pktsize = buffer.size(); - if(buffer.empty()) - return NULL ; + if( buffer.empty() ) + return NULL; RsGxsRecognSerialiser serialiser; RsItem *item = serialiser.deserialise(buffer.data(), &pktsize); From 58c812aea8d98471966d8dd7c7f6906561a6e4c2 Mon Sep 17 00:00:00 2001 From: Phenom Date: Mon, 8 May 2017 12:17:01 +0200 Subject: [PATCH 22/50] =?UTF-8?q?Fix=20Warnings:=20unused=20parameter=20?= =?UTF-8?q?=E2=80=98s=E2=80=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit warning: unused parameter ‘s’ [-Wunused-parameter] template<> uint32_t RsTypeSerializer::serial_size(uint16_t /* type_subtype */,const uint32_t& s) ^ --- libretroshare/src/serialiser/rstypeserializer.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libretroshare/src/serialiser/rstypeserializer.cc b/libretroshare/src/serialiser/rstypeserializer.cc index 054db45a4..33c3a90e9 100644 --- a/libretroshare/src/serialiser/rstypeserializer.cc +++ b/libretroshare/src/serialiser/rstypeserializer.cc @@ -193,7 +193,7 @@ template<> void RsTypeSerializer::print_data(const std::string& n, uint16_t type // TlvInt with subtype // //=================================================================================================// -template<> uint32_t RsTypeSerializer::serial_size(uint16_t /* type_subtype */,const uint32_t& s) +template<> uint32_t RsTypeSerializer::serial_size(uint16_t /* type_subtype */,const uint32_t& /*s*/) { return GetTlvUInt32Size() ; } From a6acc72c8931ce1da08d1d9d742879cf273dc152 Mon Sep 17 00:00:00 2001 From: Phenom Date: Mon, 8 May 2017 12:18:51 +0200 Subject: [PATCH 23/50] =?UTF-8?q?Fix=20Warnings:=20this=20=E2=80=98if?= =?UTF-8?q?=E2=80=99=20clause=20does=20not=20guard...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit warning: this ‘if’ clause does not guard... [-Wmisleading-indentation] if(data.isRawData()) ^~ --- libresapi/src/api/ApiServer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libresapi/src/api/ApiServer.cpp b/libresapi/src/api/ApiServer.cpp index 327dd6260..d4e1c9fe5 100644 --- a/libresapi/src/api/ApiServer.cpp +++ b/libresapi/src/api/ApiServer.cpp @@ -377,8 +377,8 @@ std::string ApiServer::handleRequest(Request &request) if(data.isRawData()) return data.getRawData(); - if(!resp.mCallbackName.empty()) - outstream << resource_api::makeKeyValueReference("callback_name", resp.mCallbackName); + if(!resp.mCallbackName.empty()) + outstream << resource_api::makeKeyValueReference("callback_name", resp.mCallbackName); outstream << resource_api::makeKeyValue("debug_msg", debugString.str()); outstream << resource_api::makeKeyValueReference("returncode", returncode); From 523730f31ad37bd74a75d6419009202a531d7590 Mon Sep 17 00:00:00 2001 From: Phenom Date: Mon, 8 May 2017 12:21:08 +0200 Subject: [PATCH 24/50] =?UTF-8?q?Fix=20Warnings:=20unused=20parameter=20?= =?UTF-8?q?=E2=80=98resp=E2=80=99,=20'req'=20&=20'resp'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit warning: unused parameter ‘resp’ [-Wunused-parameter] virtual void gxsDoWork(Request &req, Response &resp) ^~~~ --- libresapi/src/api/IdentityHandler.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libresapi/src/api/IdentityHandler.cpp b/libresapi/src/api/IdentityHandler.cpp index be2e28622..8e2f5eee3 100644 --- a/libresapi/src/api/IdentityHandler.cpp +++ b/libresapi/src/api/IdentityHandler.cpp @@ -106,7 +106,7 @@ public: {} protected: - virtual void gxsDoWork(Request &req, Response &resp) + virtual void gxsDoWork(Request &req, Response & /* resp */) { RsGxsIdGroup group; std::string gxs_id; @@ -545,7 +545,7 @@ ResponseTask* IdentityHandler::handleCreateIdentity(Request & /* req */, Respons return new CreateIdentityTask(mRsIdentity); } -ResponseTask* IdentityHandler::handleDeleteIdentity(Request& req, Response& resp) +ResponseTask* IdentityHandler::handleDeleteIdentity(Request& /* req */, Response& /* resp */) { return new DeleteIdentityTask(mRsIdentity); } From bf47edfd1283aeaae64260b0df562ede24f58405 Mon Sep 17 00:00:00 2001 From: Phenom Date: Mon, 8 May 2017 12:22:46 +0200 Subject: [PATCH 25/50] Fix Warnings: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit warning: this ‘if’ clause does not guard... [-Wmisleading-indentation] if(_hash.isNull()) ^~ --- retroshare-gui/src/gui/RetroShareLink.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/retroshare-gui/src/gui/RetroShareLink.cpp b/retroshare-gui/src/gui/RetroShareLink.cpp index 28a2d09c6..c3d2c0450 100644 --- a/retroshare-gui/src/gui/RetroShareLink.cpp +++ b/retroshare-gui/src/gui/RetroShareLink.cpp @@ -600,16 +600,16 @@ void RetroShareLink::check() if(!checkPGPId(_GPGid)) _valid = false ; break ; - case TYPE_IDENTITY: - if(_name.isNull()) - _valid = false ; + case TYPE_IDENTITY: + if(_name.isNull()) + _valid = false ; - if(_radix_group_data.isNull()) - _valid = false ; + if(_radix_group_data.isNull()) + _valid = false ; - if(_hash.isNull()) - _valid = false ; - break ; + if(_hash.isNull()) + _valid = false ; + break ; case TYPE_PERSON: if(_size != 0) @@ -858,8 +858,8 @@ QString RetroShareLink::niceName() const if (type() == TYPE_PERSON) return PeerDefs::rsid(name().toUtf8().constData(), RsPgpId(hash().toStdString())); - if(type() == TYPE_IDENTITY) - return QObject::tr("Identity link (name=%1, ID=%2)").arg(_name).arg(_hash) ; + if(type() == TYPE_IDENTITY) + return QObject::tr("Identity link (name=%1, ID=%2)").arg(_name).arg(_hash) ; if(type() == TYPE_PUBLIC_MSG) { RsPeerDetails detail; From f352939154cdc991beb45782907de68cc7185e70 Mon Sep 17 00:00:00 2001 From: Phenom Date: Mon, 8 May 2017 12:25:29 +0200 Subject: [PATCH 26/50] Fix Warnings: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit warning: this ‘if’ clause does not guard... [-Wmisleading-indentation] if(! rsIdentity->getIdDetails(gxs_id,details)) ^~ --- retroshare-gui/src/gui/Identity/IdDialog.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/retroshare-gui/src/gui/Identity/IdDialog.cpp b/retroshare-gui/src/gui/Identity/IdDialog.cpp index 755dab9c9..9b1901104 100644 --- a/retroshare-gui/src/gui/Identity/IdDialog.cpp +++ b/retroshare-gui/src/gui/Identity/IdDialog.cpp @@ -2472,8 +2472,8 @@ void IdDialog::copyRetroshareLink() RsIdentityDetails details ; - if(! rsIdentity->getIdDetails(gxs_id,details)) - return ; + if(! rsIdentity->getIdDetails(gxs_id,details)) + return ; if (!mIdQueue) return; From 5022ef00d4ab425bd86c313ce4252f93fe03df30 Mon Sep 17 00:00:00 2001 From: Phenom Date: Mon, 8 May 2017 12:26:37 +0200 Subject: [PATCH 27/50] =?UTF-8?q?Fix=20Warnings:=20this=20=E2=80=98if?= =?UTF-8?q?=E2=80=99=20clause=20does=20not=20guard...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit warning: this ‘if’ clause does not guard... [-Wmisleading-indentation] if(!mPosterId.isNull()) ^~ --- retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.cpp b/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.cpp index aaab89231..61ecf0fbd 100644 --- a/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.cpp +++ b/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.cpp @@ -278,10 +278,10 @@ void CreateGxsForumMsg::loadFormInformation() uint32_t fl = IDCHOOSER_ID_REQUIRED ; if( (mForumMeta.mSignFlags & GXS_SERV::FLAG_AUTHOR_AUTHENTICATION_GPG) || (mForumMeta.mSignFlags & GXS_SERV::FLAG_AUTHOR_AUTHENTICATION_GPG_KNOWN)) - fl |= IDCHOOSER_NON_ANONYMOUS ; + fl |= IDCHOOSER_NON_ANONYMOUS; - if(!mPosterId.isNull()) - fl |= IDCHOOSER_NO_CREATE; + if(!mPosterId.isNull()) + fl |= IDCHOOSER_NO_CREATE; ui.idChooser->setFlags(fl) ; From 4a2f688f148608f780a01414269318de773e6cda Mon Sep 17 00:00:00 2001 From: Phenom Date: Mon, 8 May 2017 13:01:34 +0200 Subject: [PATCH 28/50] Fix Windows Compilation: pqi/authssl.cc: In member function 'virtual X509* AuthSSLimpl::SignX509ReqWithGPG(X509_REQ*, long int)': pqi/authssl.cc:929:3: error: jump to label 'err' [-fpermissive] err: ^ pqi/authssl.cc:872:22: error: from here [-fpermissive] goto err; ^ pqi/authssl.cc:877:24: error: crosses initialization of 'unsigned char* p' unsigned char *p=buf_in; ^ pqi/authssl.cc: In member function 'virtual bool AuthSSLimpl::AuthX509WithGPG(X509*, uint32_t&)': pqi/authssl.cc:1091:1: error: jump to label 'err' [-fpermissive] err: ^ pqi/authssl.cc:1027:8: error: from here [-fpermissive] goto err; ^ pqi/authssl.cc:1035:17: error: crosses initialization of 'unsigned char* p' unsigned char *p=buf_in; ^ --- libretroshare/src/pqi/authssl.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/libretroshare/src/pqi/authssl.cc b/libretroshare/src/pqi/authssl.cc index c28c5d0d3..30f724a7e 100644 --- a/libretroshare/src/pqi/authssl.cc +++ b/libretroshare/src/pqi/authssl.cc @@ -854,6 +854,7 @@ X509 *AuthSSLimpl::SignX509ReqWithGPG(X509_REQ *req, long /*days*/) #if OPENSSL_VERSION_NUMBER < 0x10100000L inl=i2d(data,NULL); buf_in=(unsigned char *)OPENSSL_malloc((unsigned int)inl); + unsigned char *p=NULL; #else inl=i2d_re_X509_tbs(x509,&buf_in) ; // this does the i2d over x509->cert_info #endif @@ -874,7 +875,7 @@ X509 *AuthSSLimpl::SignX509ReqWithGPG(X509_REQ *req, long /*days*/) std::cerr << "Buffers Allocated" << std::endl; #if OPENSSL_VERSION_NUMBER < 0x10100000L - unsigned char *p=buf_in; + p=buf_in; i2d(data,&p); #endif @@ -1002,6 +1003,7 @@ bool AuthSSLimpl::AuthX509WithGPG(X509 *x509,uint32_t& diagnostic) #if OPENSSL_VERSION_NUMBER < 0x10100000L inl=i2d(data,NULL); buf_in=(unsigned char *)OPENSSL_malloc((unsigned int)inl); + unsigned char *p=NULL; #else inl=i2d_re_X509_tbs(x509,&buf_in) ; // this does the i2d over x509->cert_info #endif @@ -1032,7 +1034,7 @@ bool AuthSSLimpl::AuthX509WithGPG(X509 *x509,uint32_t& diagnostic) #endif #if OPENSSL_VERSION_NUMBER < 0x10100000L - unsigned char *p=buf_in; + p=buf_in; i2d(data,&p); #endif /* data in buf_in, ready to be hashed */ From 79bbe0e5bb0e9fc5e26a9b9c3dfadefa65e24339 Mon Sep 17 00:00:00 2001 From: Phenom Date: Mon, 8 May 2017 14:53:53 +0200 Subject: [PATCH 29/50] Fix Commit #77adc82 Fix Missing messages when mark all as read. --- .../src/gui/gxsforums/GxsForumThreadWidget.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp index 6402d130a..1eb8b809e 100644 --- a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp +++ b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp @@ -1850,14 +1850,18 @@ void GxsForumThreadWidget::setMsgReadStatus(QList &rows, bool rsGxsForums->setMessageReadStatus(token, msgPair, read); // Look if older version exist to mark them too - QMap > >::const_iterator it = mPostVersions.find(mOrigThreadId) ; + QMap > >::const_iterator it = mPostVersions.find(RsGxsMessageId(msgId)) ; if(it != mPostVersions.end()) { std::cerr << (*it).size() << " versions found " << std::endl; for(int i=0;i<(*it).size();++i) { - msgPair = std::make_pair( groupId(), (*it)[i].second ); - rsGxsForums->setMessageReadStatus(token, msgPair, read); + RsGxsMessageId found = (*it)[i].second; + if(found != RsGxsMessageId(msgId)) + { + msgPair = std::make_pair( groupId(), found ); + rsGxsForums->setMessageReadStatus(token, msgPair, read); + } } } From a869a378025dc8af8c89d18e02723a742a341fa9 Mon Sep 17 00:00:00 2001 From: Phenom Date: Mon, 8 May 2017 15:29:11 +0200 Subject: [PATCH 30/50] Fix Lobby's sound notification. Lobby "message arrived" sound play depends of notify ChatRooms settings. --- .../src/gui/chat/ChatLobbyDialog.cpp | 31 ++++++++----------- .../src/gui/chat/ChatLobbyUserNotify.cpp | 15 ++++++--- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/retroshare-gui/src/gui/chat/ChatLobbyDialog.cpp b/retroshare-gui/src/gui/chat/ChatLobbyDialog.cpp index 1e5361ead..dd1a52290 100644 --- a/retroshare-gui/src/gui/chat/ChatLobbyDialog.cpp +++ b/retroshare-gui/src/gui/chat/ChatLobbyDialog.cpp @@ -19,41 +19,37 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * - * ccr . 2016 Jan 26 - * - * Play sound on incoming messages. - * ****************************************************************/ -#include -#include #include #include +#include #include #include "ChatLobbyDialog.h" -#include "util/QtVersion.h" -#include "gui/ChatLobbyWidget.h" + #include "ChatTabWidget.h" -#include "gui/settings/rsharesettings.h" -#include "gui/settings/RsharePeerSettings.h" -#include "gui/MainWindow.h" +#include "gui/ChatLobbyWidget.h" #include "gui/FriendsDialog.h" -#include "gui/msgs/MessageComposer.h" -#include -#include "gui/common/RSTreeWidgetItem.h" +#include "gui/MainWindow.h" +#include "gui/common/html.h" #include "gui/common/FriendSelectionDialog.h" -#include "gui/gxs/GxsIdTreeWidgetItem.h" +#include "gui/common/RSTreeWidgetItem.h" #include "gui/gxs/GxsIdChooser.h" #include "gui/gxs/GxsIdDetails.h" -#include "util/HandleRichText.h" -#include "gui/SoundManager.h" +#include "gui/gxs/GxsIdTreeWidgetItem.h" #include "gui/Identity/IdDialog.h" +#include "gui/msgs/MessageComposer.h" +#include "gui/settings/RsharePeerSettings.h" +#include "gui/settings/rsharesettings.h" +#include "util/HandleRichText.h" +#include "util/QtVersion.h" #include #include +#include #define COLUMN_NAME 0 #define COLUMN_ACTIVITY 1 @@ -477,7 +473,6 @@ void ChatLobbyDialog::addChatMsg(const ChatMessage& msg) ui.chatWidget->addChatMsg(msg.incoming, name, gxs_id, sendTime, recvTime, message, ChatWidget::MSGTYPE_NORMAL); emit messageReceived(msg.incoming, id(), sendTime, name, message) ; - SoundManager::play(SOUND_NEW_LOBBY_MESSAGE); // This is a trick to translate HTML into text. QTextEdit editor; diff --git a/retroshare-gui/src/gui/chat/ChatLobbyUserNotify.cpp b/retroshare-gui/src/gui/chat/ChatLobbyUserNotify.cpp index 15cb3d942..ddfa24426 100644 --- a/retroshare-gui/src/gui/chat/ChatLobbyUserNotify.cpp +++ b/retroshare-gui/src/gui/chat/ChatLobbyUserNotify.cpp @@ -21,15 +21,19 @@ #include #include + #include "ChatLobbyUserNotify.h" -#include "gui/notifyqt.h" -#include "gui/MainWindow.h" + #include "gui/ChatLobbyWidget.h" +#include "gui/MainWindow.h" +#include "gui/notifyqt.h" +#include "gui/SoundManager.h" #include "gui/settings/rsharesettings.h" #include "util/DateTime.h" -#include #include +#include + ChatLobbyUserNotify::ChatLobbyUserNotify(QObject *parent) : UserNotify(parent) { @@ -273,8 +277,9 @@ void ChatLobbyUserNotify::chatLobbyNewMessage(ChatLobbyId lobby_id, QDateTime ti _listMsg[lobby_id][strAnchor]=msgData; emit countChanged(lobby_id, _listMsg[lobby_id].size()); - updateIcon(); -} + updateIcon(); + SoundManager::play(SOUND_NEW_LOBBY_MESSAGE); + } } bool ChatLobbyUserNotify::checkWord(QString message, QString word) From 594ab53ef2c42abec5edef67d6d6676dc69df43e Mon Sep 17 00:00:00 2001 From: Phenom Date: Mon, 8 May 2017 15:37:18 +0200 Subject: [PATCH 31/50] Fix Toaster Position Setting. --- retroshare-gui/src/gui/settings/NotifyPage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/retroshare-gui/src/gui/settings/NotifyPage.cpp b/retroshare-gui/src/gui/settings/NotifyPage.cpp index 88aa072b7..09f9efbfc 100755 --- a/retroshare-gui/src/gui/settings/NotifyPage.cpp +++ b/retroshare-gui/src/gui/settings/NotifyPage.cpp @@ -355,7 +355,7 @@ void NotifyPage::load() QMap::iterator it; int index = 0; for (it = toasterPositions.begin(); it != toasterPositions.end(); ++it, ++index) { - ui.comboBoxToasterPosition->addItem(it.value(), it.key()); + whileBlocking(ui.comboBoxToasterPosition)->addItem(it.value(), it.key()); if (it.key() == toasterPosition) { whileBlocking(ui.comboBoxToasterPosition)->setCurrentIndex(index); From d02cba5a91ac689ee5501af181dc154a20c61934 Mon Sep 17 00:00:00 2001 From: Phenom Date: Sun, 16 Apr 2017 17:53:37 +0200 Subject: [PATCH 32/50] Fix Lobby Topic not send on invite. --- libretroshare/src/chat/distributedchat.cc | 73 +++++++++++++++---- libretroshare/src/chat/distributedchat.h | 2 + libretroshare/src/chat/rschatitems.cc | 42 +++++++---- libretroshare/src/chat/rschatitems.h | 22 +++++- .../src/tests/serialiser/rsmsgitem_test.cc | 6 ++ .../serialiser/rsmsgitem_test.cc | 2 + 6 files changed, 113 insertions(+), 34 deletions(-) diff --git a/libretroshare/src/chat/distributedchat.cc b/libretroshare/src/chat/distributedchat.cc index 696ce3058..fe262943b 100644 --- a/libretroshare/src/chat/distributedchat.cc +++ b/libretroshare/src/chat/distributedchat.cc @@ -428,14 +428,14 @@ bool DistributedChatService::handleRecvItem(RsChatItem *item) { switch(item->PacketSubType()) { - case RS_PKT_SUBTYPE_CHAT_LOBBY_SIGNED_EVENT: handleRecvChatLobbyEventItem (dynamic_cast(item)) ; break ; - case RS_PKT_SUBTYPE_CHAT_LOBBY_INVITE: handleRecvLobbyInvite (dynamic_cast(item)) ; break ; - case RS_PKT_SUBTYPE_CHAT_LOBBY_CHALLENGE: handleConnectionChallenge (dynamic_cast(item)) ; break ; - case RS_PKT_SUBTYPE_CHAT_LOBBY_UNSUBSCRIBE: handleFriendUnsubscribeLobby (dynamic_cast(item)) ; break ; - case RS_PKT_SUBTYPE_CHAT_LOBBY_LIST_REQUEST: handleRecvChatLobbyListRequest (dynamic_cast(item)) ; break ; - case RS_PKT_SUBTYPE_CHAT_LOBBY_LIST: handleRecvChatLobbyList (dynamic_cast(item)) ; break ; - default: - return false ; + case RS_PKT_SUBTYPE_CHAT_LOBBY_SIGNED_EVENT: handleRecvChatLobbyEventItem (dynamic_cast(item)) ; break ; + case RS_PKT_SUBTYPE_CHAT_LOBBY_INVITE_DEPRECATED: handleRecvLobbyInvite_Deprecated (dynamic_cast(item)) ; break ; // to be removed (deprecated since May 2017) + case RS_PKT_SUBTYPE_CHAT_LOBBY_INVITE: handleRecvLobbyInvite (dynamic_cast(item)) ; break ; + case RS_PKT_SUBTYPE_CHAT_LOBBY_CHALLENGE: handleConnectionChallenge (dynamic_cast(item)) ; break ; + case RS_PKT_SUBTYPE_CHAT_LOBBY_UNSUBSCRIBE: handleFriendUnsubscribeLobby (dynamic_cast(item)) ; break ; + case RS_PKT_SUBTYPE_CHAT_LOBBY_LIST_REQUEST: handleRecvChatLobbyListRequest (dynamic_cast(item)) ; break ; + case RS_PKT_SUBTYPE_CHAT_LOBBY_LIST: handleRecvChatLobbyList (dynamic_cast(item)) ; break ; + default: return false ; } return true ; } @@ -1233,14 +1233,45 @@ void DistributedChatService::invitePeerToLobby(const ChatLobbyId& lobby_id, cons RsChatLobbyInviteItem *item = new RsChatLobbyInviteItem ; - item->lobby_id = lobby_id ; - item->lobby_name = it->second.lobby_name ; - item->lobby_topic = it->second.lobby_topic ; - item->lobby_flags = connexion_challenge?RS_CHAT_LOBBY_FLAGS_CHALLENGE:(it->second.lobby_flags) ; + item->lobby_id = lobby_id ; + item->lobby_name = it->second.lobby_name ; + item->lobby_topic = it->second.lobby_topic ; + item->lobby_flags = connexion_challenge?RS_CHAT_LOBBY_FLAGS_CHALLENGE:(it->second.lobby_flags) ; item->PeerId(peer_id) ; sendChatItem(item) ; + + //FOR BACKWARD COMPATIBILITY + {// to be removed (deprecated since May 2017) + RsChatLobbyInviteItem_Deprecated *item = new RsChatLobbyInviteItem_Deprecated ; + + item->lobby_id = lobby_id ; + item->lobby_name = it->second.lobby_name ; + item->lobby_topic = it->second.lobby_topic ; + item->lobby_flags = connexion_challenge?RS_CHAT_LOBBY_FLAGS_CHALLENGE:(it->second.lobby_flags) ; + item->PeerId(peer_id) ; + + sendChatItem(item) ; + } } + +// to be removed (deprecated since May 2017) +void DistributedChatService::handleRecvLobbyInvite_Deprecated(RsChatLobbyInviteItem_Deprecated *item) +{ +#ifdef DEBUG_CHAT_LOBBIES + std::cerr << "Received deprecated invite to lobby from " << item->PeerId() << " to lobby " << std::hex << item->lobby_id << std::dec << ", named " << item->lobby_name << item->lobby_topic << std::endl; +#endif + RsChatLobbyInviteItem* newItem = new RsChatLobbyInviteItem(); + + newItem->lobby_id = item->lobby_id ; + newItem->lobby_name = item->lobby_name ; + newItem->lobby_topic = item->lobby_topic ; + newItem->lobby_flags = item->lobby_flags ; + newItem->PeerId( item->PeerId() ); + + handleRecvLobbyInvite(newItem); +} + void DistributedChatService::handleRecvLobbyInvite(RsChatLobbyInviteItem *item) { #ifdef DEBUG_CHAT_LOBBIES @@ -1259,10 +1290,10 @@ void DistributedChatService::handleRecvLobbyInvite(RsChatLobbyInviteItem *item) { #ifdef DEBUG_CHAT_LOBBIES std::cerr << " Lobby already exists. " << std::endl; - std::cerr << " privacy levels: " << item->lobby_flags << " vs. " << it->second.lobby_flags ; + std::cerr << " privacy levels: " << item->lobby_flags << " vs. " << it->second.lobby_flags ; #endif - if((!IS_CONNEXION_CHALLENGE(item->lobby_flags)) && EXTRACT_PRIVACY_FLAGS(item->lobby_flags) != EXTRACT_PRIVACY_FLAGS(it->second.lobby_flags)) + if ((!IS_CONNEXION_CHALLENGE(item->lobby_flags)) && EXTRACT_PRIVACY_FLAGS(item->lobby_flags) != EXTRACT_PRIVACY_FLAGS(it->second.lobby_flags)) { std::cerr << " : Don't match. Cancelling." << std::endl; return ; @@ -1274,10 +1305,22 @@ void DistributedChatService::handleRecvLobbyInvite(RsChatLobbyInviteItem *item) std::cerr << " Adding new friend " << item->PeerId() << " to lobby." << std::endl; #endif + // to be removed (deprecated since May 2017) + { //Update Topics if have received deprecated before (withou topic) + if(it->second.lobby_topic.empty() && !item->lobby_topic.empty()) + it->second.lobby_topic = item->lobby_topic; + } + it->second.participating_friends.insert(item->PeerId()) ; return ; } + // to be removed (deprecated since May 2017) + {//check if invitation is already received by deprecated version + std::map::const_iterator it(_lobby_invites_queue.find( item->lobby_id)) ; + if(it != _lobby_invites_queue.end()) + return ; + } // Don't record the invitation if it's a challenge response item or a lobby we don't have. // if(IS_CONNEXION_CHALLENGE(item->lobby_flags)) @@ -1290,7 +1333,7 @@ void DistributedChatService::handleRecvLobbyInvite(RsChatLobbyInviteItem *item) invite.peer_id = item->PeerId() ; invite.lobby_name = item->lobby_name ; invite.lobby_topic = item->lobby_topic ; - invite.lobby_flags = item->lobby_flags ; + invite.lobby_flags = item->lobby_flags ; _lobby_invites_queue[item->lobby_id] = invite ; } diff --git a/libretroshare/src/chat/distributedchat.h b/libretroshare/src/chat/distributedchat.h index 89160a850..fef46b278 100644 --- a/libretroshare/src/chat/distributedchat.h +++ b/libretroshare/src/chat/distributedchat.h @@ -39,6 +39,7 @@ class RsChatLobbyListRequestItem ; class RsChatLobbyListItem ; class RsChatLobbyEventItem ; class RsChatLobbyBouncingObject ; +class RsChatLobbyInviteItem_Deprecated ; // to be removed (deprecated since May 2017) class RsChatLobbyInviteItem ; class RsChatLobbyMsgItem ; class RsChatLobbyConnectChallengeItem ; @@ -111,6 +112,7 @@ class DistributedChatService /// receive and handle chat lobby item bool recvLobbyChat(RsChatLobbyMsgItem*,const RsPeerId& src_peer_id) ; + void handleRecvLobbyInvite_Deprecated(RsChatLobbyInviteItem_Deprecated*) ; // to be removed (deprecated since May 2017) void handleRecvLobbyInvite(RsChatLobbyInviteItem*) ; void checkAndRedirectMsgToLobby(RsChatMsgItem*) ; void handleConnectionChallenge(RsChatLobbyConnectChallengeItem *item) ; diff --git a/libretroshare/src/chat/rschatitems.cc b/libretroshare/src/chat/rschatitems.cc index 2b7dd67d8..80241eac0 100644 --- a/libretroshare/src/chat/rschatitems.cc +++ b/libretroshare/src/chat/rschatitems.cc @@ -39,23 +39,24 @@ static const uint32_t RS_CHAT_SERIALIZER_FLAGS_NO_SIGNATURE = 0x0001; RsItem *RsChatSerialiser::create_item(uint16_t service_id,uint8_t item_sub_id) const { - if(service_id != RS_SERVICE_TYPE_CHAT) - return NULL ; + if (service_id != RS_SERVICE_TYPE_CHAT) + return NULL; switch(item_sub_id) { - case RS_PKT_SUBTYPE_DEFAULT: return new RsChatMsgItem() ; - case RS_PKT_SUBTYPE_PRIVATECHATMSG_CONFIG: return new RsPrivateChatMsgConfigItem() ; - case RS_PKT_SUBTYPE_CHAT_STATUS: return new RsChatStatusItem() ; - case RS_PKT_SUBTYPE_CHAT_AVATAR: return new RsChatAvatarItem() ; - case RS_PKT_SUBTYPE_CHAT_LOBBY_SIGNED_MSG: return new RsChatLobbyMsgItem() ; - case RS_PKT_SUBTYPE_CHAT_LOBBY_INVITE: return new RsChatLobbyInviteItem() ; - case RS_PKT_SUBTYPE_CHAT_LOBBY_CHALLENGE: return new RsChatLobbyConnectChallengeItem() ; - case RS_PKT_SUBTYPE_CHAT_LOBBY_UNSUBSCRIBE: return new RsChatLobbyUnsubscribeItem() ; - case RS_PKT_SUBTYPE_CHAT_LOBBY_SIGNED_EVENT:return new RsChatLobbyEventItem() ; - case RS_PKT_SUBTYPE_CHAT_LOBBY_LIST_REQUEST:return new RsChatLobbyListRequestItem() ; - case RS_PKT_SUBTYPE_CHAT_LOBBY_LIST: return new RsChatLobbyListItem() ; - case RS_PKT_SUBTYPE_CHAT_LOBBY_CONFIG: return new RsChatLobbyConfigItem() ; + case RS_PKT_SUBTYPE_DEFAULT: return new RsChatMsgItem() ; + case RS_PKT_SUBTYPE_PRIVATECHATMSG_CONFIG: return new RsPrivateChatMsgConfigItem() ; + case RS_PKT_SUBTYPE_CHAT_STATUS: return new RsChatStatusItem() ; + case RS_PKT_SUBTYPE_CHAT_AVATAR: return new RsChatAvatarItem() ; + case RS_PKT_SUBTYPE_CHAT_LOBBY_SIGNED_MSG: return new RsChatLobbyMsgItem() ; + case RS_PKT_SUBTYPE_CHAT_LOBBY_INVITE_DEPRECATED: return new RsChatLobbyInviteItem_Deprecated() ; // to be removed (deprecated since May 2017) + case RS_PKT_SUBTYPE_CHAT_LOBBY_INVITE: return new RsChatLobbyInviteItem() ; + case RS_PKT_SUBTYPE_CHAT_LOBBY_CHALLENGE: return new RsChatLobbyConnectChallengeItem() ; + case RS_PKT_SUBTYPE_CHAT_LOBBY_UNSUBSCRIBE: return new RsChatLobbyUnsubscribeItem() ; + case RS_PKT_SUBTYPE_CHAT_LOBBY_SIGNED_EVENT: return new RsChatLobbyEventItem() ; + case RS_PKT_SUBTYPE_CHAT_LOBBY_LIST_REQUEST: return new RsChatLobbyListRequestItem() ; + case RS_PKT_SUBTYPE_CHAT_LOBBY_LIST: return new RsChatLobbyListItem() ; + case RS_PKT_SUBTYPE_CHAT_LOBBY_CONFIG: return new RsChatLobbyConfigItem() ; default: std::cerr << "Unknown packet type in chat!" << std::endl ; return NULL ; @@ -97,12 +98,12 @@ void RsChatLobbyMsgItem::serial_process(RsGenericSerializer::SerializeJob j,RsGe RsChatLobbyBouncingObject::serial_process(j,ctx) ; } -void RsChatLobbyListRequestItem::serial_process(RsGenericSerializer::SerializeJob j,RsGenericSerializer::SerializeContext& ctx) +void RsChatLobbyListRequestItem::serial_process(RsGenericSerializer::SerializeJob /*j*/,RsGenericSerializer::SerializeContext& /*ctx*/) { // nothing to do. This is an empty item. } -template<> void RsTypeSerializer::serial_process(RsGenericSerializer::SerializeJob j,RsGenericSerializer::SerializeContext& ctx,VisibleChatLobbyInfo& info,const std::string& name) +template<> void RsTypeSerializer::serial_process(RsGenericSerializer::SerializeJob j,RsGenericSerializer::SerializeContext& ctx,VisibleChatLobbyInfo& info,const std::string& /*name*/) { RsTypeSerializer::serial_process(j,ctx,info.id,"info.id") ; @@ -135,10 +136,19 @@ void RsChatLobbyConnectChallengeItem::serial_process(RsGenericSerializer::Serial RsTypeSerializer::serial_process(j,ctx,challenge_code,"challenge_code") ; } +// to be removed (deprecated since May 2017) +void RsChatLobbyInviteItem_Deprecated::serial_process(RsGenericSerializer::SerializeJob j,RsGenericSerializer::SerializeContext& ctx) +{ + RsTypeSerializer::serial_process(j,ctx, lobby_id, "lobby_id") ; + RsTypeSerializer::serial_process (j,ctx,TLV_TYPE_STR_NAME,lobby_name, "lobby_name") ; + RsTypeSerializer::serial_process (j,ctx, lobby_flags,"lobby_flags") ; +} + void RsChatLobbyInviteItem::serial_process(RsGenericSerializer::SerializeJob j,RsGenericSerializer::SerializeContext& ctx) { RsTypeSerializer::serial_process(j,ctx, lobby_id, "lobby_id") ; RsTypeSerializer::serial_process (j,ctx,TLV_TYPE_STR_NAME,lobby_name, "lobby_name") ; + RsTypeSerializer::serial_process (j,ctx,TLV_TYPE_STR_NAME,lobby_topic,"lobby_topic") ; RsTypeSerializer::serial_process (j,ctx, lobby_flags,"lobby_flags") ; } diff --git a/libretroshare/src/chat/rschatitems.h b/libretroshare/src/chat/rschatitems.h index ddc0a2b86..3784adc84 100644 --- a/libretroshare/src/chat/rschatitems.h +++ b/libretroshare/src/chat/rschatitems.h @@ -77,7 +77,8 @@ const uint8_t RS_PKT_SUBTYPE_DISTANT_CHAT_DH_PUBLIC_KEY = 0x16 ; const uint8_t RS_PKT_SUBTYPE_CHAT_LOBBY_SIGNED_MSG = 0x17 ; const uint8_t RS_PKT_SUBTYPE_CHAT_LOBBY_SIGNED_EVENT = 0x18 ; const uint8_t RS_PKT_SUBTYPE_CHAT_LOBBY_LIST = 0x19 ; -const uint8_t RS_PKT_SUBTYPE_CHAT_LOBBY_INVITE = 0x1A ; +const uint8_t RS_PKT_SUBTYPE_CHAT_LOBBY_INVITE_DEPRECATED = 0x1A ; // to be removed (deprecated since May 2017) +const uint8_t RS_PKT_SUBTYPE_CHAT_LOBBY_INVITE = 0x1B ; typedef uint64_t ChatLobbyId ; typedef uint64_t ChatLobbyMsgId ; @@ -93,7 +94,7 @@ class RsChatItem: public RsItem } virtual ~RsChatItem() {} - virtual std::ostream& print(std::ostream &out, uint16_t indent = 0) { return out; } // derived from RsItem, but should be removed + virtual std::ostream& print(std::ostream &out, uint16_t /*indent*/ = 0) { return out; } // derived from RsItem, but should be removed virtual void clear() {} }; @@ -238,6 +239,21 @@ class RsChatLobbyConnectChallengeItem: public RsChatItem uint64_t challenge_code ; }; +// to be removed (deprecated since May 2017) +class RsChatLobbyInviteItem_Deprecated: public RsChatItem +{ + public: + RsChatLobbyInviteItem_Deprecated() :RsChatItem(RS_PKT_SUBTYPE_CHAT_LOBBY_INVITE_DEPRECATED) {} + virtual ~RsChatLobbyInviteItem_Deprecated() {} + + void serial_process(RsGenericSerializer::SerializeJob j,RsGenericSerializer::SerializeContext& ctx); + + ChatLobbyId lobby_id ; + std::string lobby_name ; + std::string lobby_topic ; + ChatLobbyFlags lobby_flags ; +}; + class RsChatLobbyInviteItem: public RsChatItem { public: @@ -249,7 +265,7 @@ class RsChatLobbyInviteItem: public RsChatItem ChatLobbyId lobby_id ; std::string lobby_name ; std::string lobby_topic ; - ChatLobbyFlags lobby_flags ; + ChatLobbyFlags lobby_flags ; }; /*! diff --git a/libretroshare/src/tests/serialiser/rsmsgitem_test.cc b/libretroshare/src/tests/serialiser/rsmsgitem_test.cc index 17571602e..c964d97ba 100644 --- a/libretroshare/src/tests/serialiser/rsmsgitem_test.cc +++ b/libretroshare/src/tests/serialiser/rsmsgitem_test.cc @@ -52,12 +52,14 @@ RsSerialType* init_item(RsChatLobbyListItem& cmi) cmi.lobby_ids.resize(n) ; cmi.lobby_names.resize(n) ; + cmi.lobby_topics.resize(n) ; cmi.lobby_counts.resize(n) ; for(int i=0;i Date: Mon, 8 May 2017 16:57:37 +0200 Subject: [PATCH 33/50] Add override and final placeolders for old GCC compatibility --- libresapi/src/api/RsControlModule.h | 1 + libretroshare/src/libretroshare.pro | 3 ++- libretroshare/src/util/cxx11retrocompat.h | 25 +++++++++++++++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 libretroshare/src/util/cxx11retrocompat.h diff --git a/libresapi/src/api/RsControlModule.h b/libresapi/src/api/RsControlModule.h index 8b8b1f3f0..c6a86d247 100644 --- a/libresapi/src/api/RsControlModule.h +++ b/libresapi/src/api/RsControlModule.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include #include "api/ResourceRouter.h" diff --git a/libretroshare/src/libretroshare.pro b/libretroshare/src/libretroshare.pro index 46daa85e8..26fe31169 100644 --- a/libretroshare/src/libretroshare.pro +++ b/libretroshare/src/libretroshare.pro @@ -532,7 +532,8 @@ HEADERS += util/folderiterator.h \ util/rsrecogn.h \ util/rsscopetimer.h \ util/stacktrace.h \ - util/rsdeprecate.h + util/rsdeprecate.h \ + util/cxx11retrocompat.h SOURCES += ft/ftchunkmap.cc \ ft/ftcontroller.cc \ diff --git a/libretroshare/src/util/cxx11retrocompat.h b/libretroshare/src/util/cxx11retrocompat.h new file mode 100644 index 000000000..e4d72525c --- /dev/null +++ b/libretroshare/src/util/cxx11retrocompat.h @@ -0,0 +1,25 @@ +#pragma once +/* + * RetroShare + * Copyright (C) 2017 Gioacchino Mazzurco + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#ifdef __GNUC__ +# if __GNUC__*100 + __GNUC_MINOR__ < 40700 +# define override +# define final +# endif //GCC version +#endif //defined GNUC From 52a04e1f4abc53651eed3af9719f77af0bff7654 Mon Sep 17 00:00:00 2001 From: csoler Date: Mon, 8 May 2017 18:24:32 +0200 Subject: [PATCH 34/50] updated ubuntu changelog --- build_scripts/Debian+Ubuntu/changelog | 167 ++++++++++++++++++++++++++ 1 file changed, 167 insertions(+) diff --git a/build_scripts/Debian+Ubuntu/changelog b/build_scripts/Debian+Ubuntu/changelog index bb6fcd9b7..22e692ed9 100644 --- a/build_scripts/Debian+Ubuntu/changelog +++ b/build_scripts/Debian+Ubuntu/changelog @@ -1,5 +1,172 @@ retroshare06 (0.6.2-1.XXXXXX~YYYYYY) YYYYYY; urgency=low + 9714409 csoler Mon, 8 May 2017 10:57:00 +0200 Merge pull request #802 from csoler/v0.6-ImprovedGUI + de0f8b9 csoler Mon, 8 May 2017 10:51:15 +0200 moved passphrase box into start dialog, and removed blank logo, replaced it by RS splash logo + 6cb4990 csoler Mon, 8 May 2017 10:06:40 +0200 fixed compilation with qt4 + 84c8158 csoler Mon, 8 May 2017 09:38:33 +0200 disabled show OpMode status on default + 24eca4a defnax Sun, 7 May 2017 19:39:20 +0200 Moved status icon column to the last position + b18a186 csoler Sat, 6 May 2017 18:20:48 +0200 fixed ftExtraList to accept e2e encrypted transfers in addition to direct transfers. This fixed the drag+drop of shared files in a distant chat + 59ac5a5 csoler Sat, 6 May 2017 16:51:38 +0200 added on-the-fly fix of group privacy flags, so that edited groups with old un-set flags will be set automatically. Also fixes the bug preventing to grant membership on old circles + 868c046 csoler Sat, 6 May 2017 13:23:26 +0200 fixed bug in serializer caused to not updating the size parameter. Also fixes unittests + f7f0d8d csoler Fri, 5 May 2017 23:10:07 +0200 Merge pull request #800 from sehraf/pr-openssl-chacha20 + 00c80b1 csoler Fri, 5 May 2017 23:06:25 +0200 Merge pull request #797 from PhenomRetroShare/Fix_WindowsCompilation + e4dde95 csoler Fri, 5 May 2017 23:04:28 +0200 Merge pull request #798 from PhenomRetroShare/Fix_TravisCompilation + 7371fdc sehraf Fri, 5 May 2017 18:50:40 +0200 add openssl chacha20 support + 96b4a1b sehraf Fri, 5 May 2017 15:40:02 +0200 add openssl chacha20-poly1305 support + e913f36 csoler Thu, 4 May 2017 21:40:32 +0200 fixed crash when trying to deserialize an empty buffer in rsrecogn + 2f2715b csoler Thu, 4 May 2017 21:23:21 +0200 Merge pull request #799 from csoler/v0.6-ImprovedGUI + 6484ea6 csoler Thu, 4 May 2017 21:19:23 +0200 improved graph widget + e6a7168 csoler Thu, 4 May 2017 16:41:02 +0200 merged upstream/master + 1c2b43b Phenom Thu, 4 May 2017 15:01:25 +0200 Fix UnitTest compilation + d31b80c Phenom Thu, 4 May 2017 11:31:36 +0200 Fix Windows Compilation + cac335e csoler Wed, 3 May 2017 23:05:50 +0200 Merge pull request #796 from csoler/v0.6-Serialization + 4f4240d csoler Wed, 3 May 2017 22:43:16 +0200 fixed bug in history serializer + 214aaa7 csoler Wed, 3 May 2017 22:20:58 +0200 added safety check for null chunks in TlvMemBlock_proxy deserialization + f006146 csoler Tue, 2 May 2017 22:41:01 +0200 merged upstream/master + 4bee52c csoler Tue, 2 May 2017 22:34:45 +0200 removed old unused serialization code + 861dc16 csoler Tue, 2 May 2017 22:05:54 +0200 switched VOIP to new serialization + c481186 csoler Tue, 2 May 2017 10:14:12 +0200 Merge pull request #793 from PhenomRetroShare/Fix_FriendListExport + 99d8b7d csoler Mon, 1 May 2017 21:23:34 +0200 switched service control items to new serialization + 07201e8 Phenom Mon, 1 May 2017 12:48:11 +0200 Fix FriendList Import/Export filename and error message. + 1f56db5 csoler Sun, 30 Apr 2017 22:45:18 +0200 Merge pull request #790 from PhenomRetroShare/Add_CreateGxsIdentityByDefault + 0c17570 csoler Sun, 30 Apr 2017 22:44:20 +0200 Merge pull request #792 from PhenomRetroShare/Add_DoubleClickOnTextBrowser + 3d17d31 csoler Sun, 30 Apr 2017 22:43:10 +0200 Merge pull request #789 from PhenomRetroShare/Add_FriendTimeOffsetNewsFeed + 8aa9be3 csoler Sun, 30 Apr 2017 22:39:07 +0200 Merge pull request #791 from PhenomRetroShare/Fix_MissingMessageMarkedRead + 40aff5d csoler Sun, 30 Apr 2017 22:37:54 +0200 Merge pull request #785 from PhenomRetroShare/Add_RelayBandwidthOnServerPage + 16b8947 csoler Sun, 30 Apr 2017 20:31:43 +0200 improved serializer documentation + cecd9a3 csoler Sun, 30 Apr 2017 20:14:23 +0200 merged upstream/master + 24c7c38 csoler Sun, 30 Apr 2017 20:08:30 +0200 removed old file rssrviceserialiser.h/cc + 14076de csoler Sun, 30 Apr 2017 19:17:44 +0200 moved code of rsservicerserialiser into rsserializer.h/cc and renamed it into RsRawSerializer + e401b90 csoler Sun, 30 Apr 2017 16:05:37 +0200 moved rsserializer and rstypeserializer to serialiser/ + 4f92f48 csoler Sat, 29 Apr 2017 23:02:44 +0200 dwicthed GxsTunnel items to new serialization + 4fbcc1e Phenom Sat, 29 Apr 2017 19:47:29 +0200 Add Double Click on Name for Chat to add their name in text writer. + 1159c86 csoler Sat, 29 Apr 2017 21:50:55 +0200 moved wiki and wire items to rsitems/ + d58c638 csoler Sat, 29 Apr 2017 21:46:54 +0200 switched wiki and wire items to new serialization + 77adc82 Phenom Sat, 29 Apr 2017 17:32:23 +0200 Fix Missing messages when mark all as read. + 5cba005 csoler Fri, 28 Apr 2017 23:32:47 +0200 moved recognitems to rsitems/ + 2349269 csoler Fri, 28 Apr 2017 23:28:56 +0200 switch rsrecognitems to new serialization + 8341c68 csoler Fri, 28 Apr 2017 18:54:07 +0200 removed old code + 688813f csoler Fri, 28 Apr 2017 18:51:35 +0200 moved photo items to rsitems/ + 634efb6 csoler Fri, 28 Apr 2017 18:42:11 +0200 switched rsphotoitems to new serialization + d3c960e csoler Fri, 28 Apr 2017 17:48:54 +0200 removed old code + 22e2416 csoler Fri, 28 Apr 2017 17:47:41 +0200 moved rsserviceinfo items to rsitems/ + 2d19783 csoler Fri, 28 Apr 2017 17:44:45 +0200 switched serviceinfo items to new serialization + c33c34b csoler Fri, 28 Apr 2017 16:44:04 +0200 moved rspluginitems to rsitems/ + d32a8ca csoler Fri, 28 Apr 2017 16:39:54 +0200 switched PluginItems to new serialization + 45eaf27 csoler Fri, 28 Apr 2017 16:30:33 +0200 moved rsgxsupdateitems to rsitems/ + 2e67665 csoler Fri, 28 Apr 2017 16:26:59 +0200 switched MsgUpdate items to new serialization + 5995e50 csoler Thu, 27 Apr 2017 21:24:27 +0200 moved rsstatusitem.h to rsitems/ + 87018ed csoler Thu, 27 Apr 2017 21:20:30 +0200 switched rsstatusitem to new serializer + 07a93be csoler Thu, 27 Apr 2017 21:11:10 +0200 moved heartbeatitem.h to rsitems/ + 9adbab3 csoler Thu, 27 Apr 2017 21:10:22 +0200 switched heartbeatitems to new serialization + 8a9edb2 Phenom Thu, 27 Apr 2017 17:03:53 +0200 Create a Gxs Identity by default. + 19b4fb8 Phenom Thu, 27 Apr 2017 16:42:25 +0200 Add Friend Time Offset news feed. + 349d14b csoler Thu, 27 Apr 2017 14:44:41 +0200 moved rsposteditems to rsitems/ + 35ecc19 csoler Thu, 27 Apr 2017 14:41:31 +0200 switched rsposteditems to new serialization + 22f6d15 csoler Thu, 27 Apr 2017 14:21:46 +0200 moved rsnxsitems.cc to rsitems/ + 3c20a85 csoler Thu, 27 Apr 2017 14:16:57 +0200 switched RsNxsItems to new serialization + f6e59f7 csoler Thu, 27 Apr 2017 11:59:18 +0200 moved gxsforumitems to rsitems/ + 449a420 csoler Thu, 27 Apr 2017 11:56:56 +0200 dwitched gxsforum items to new serialization + f50670f csoler Wed, 26 Apr 2017 20:59:59 +0200 moved circle items to rsitems/ + 559137d csoler Wed, 26 Apr 2017 20:57:28 +0200 switched gxscircleitems to new serialization + db64523 csoler Wed, 26 Apr 2017 20:15:54 +0200 moved rsgxschannel items to rsitems + 69729ad csoler Wed, 26 Apr 2017 18:55:23 +0200 switch Channel items to new serialization + 77c2e6d csoler Wed, 26 Apr 2017 18:14:10 +0200 improved error handlign in pqistore + 8f97647 csoler Wed, 26 Apr 2017 15:43:00 +0200 fixed bug in RsGxsId deserialization + c31396a csoler Wed, 26 Apr 2017 14:31:15 +0200 moved dsdv code to unused directory + 508a2e2 csoler Wed, 26 Apr 2017 14:28:25 +0200 moved gxs comment and Id items to rsitems/ + 97d0df0 csoler Wed, 26 Apr 2017 14:19:34 +0200 added comment about serialization hack + c0d8735 csoler Wed, 26 Apr 2017 14:17:38 +0200 switched RsGxsIdItems to new serialization + fb34fa1 csoler Wed, 26 Apr 2017 13:44:09 +0200 switch GxsComment item to new serialization + 9c610a7 csoler Wed, 26 Apr 2017 11:40:46 +0200 cleaned the hierarchy of serialization classes + 77e809e csoler Tue, 25 Apr 2017 21:21:46 +0200 switched GRouter to new serialization + 9e246c9 Phenom Tue, 25 Apr 2017 18:39:30 +0200 Add warning about relays bandwidth. + 4d7bd83 csoler Tue, 25 Apr 2017 10:14:50 +0200 Merge pull request #786 from PhenomRetroShare/Fix_RelaySettingValues + 540a8b9 csoler Tue, 25 Apr 2017 10:01:00 +0200 Merge pull request #788 from csoler/v0.6-PRTest + 078913f Phenom Fri, 21 Apr 2017 21:29:20 +0200 Fix GCC warnings: enumeration value ‘TYPE_IDENTITY’ not handled in switch + 3592d5b Phenom Fri, 21 Apr 2017 19:55:37 +0200 Fix GCC warnings: unused parameter ‘names’ + 593c0cb Phenom Wed, 19 Apr 2017 14:19:54 +0200 Fix CSA warnings: Called C++ object pointer is null + 90aaace Phenom Wed, 19 Apr 2017 14:18:35 +0200 Fix CSA warnings: Called C++ object pointer is null + 1f16f46 Phenom Wed, 19 Apr 2017 14:15:34 +0200 Fix CSA warnings: Called C++ object pointer is null + 30632dc Phenom Wed, 19 Apr 2017 14:06:56 +0200 Fix CSA warnings: Called C++ object pointer is null + 90cd623 Phenom Wed, 19 Apr 2017 14:04:50 +0200 Fix CAS warnings: Potential leak of memory pointed to by 'toaster' + b2b7d00 Phenom Wed, 19 Apr 2017 14:01:35 +0200 Fix CSA warnings: Called C++ object pointer is null + ff1908e Phenom Wed, 19 Apr 2017 11:50:24 +0200 Fix Clang Static Analyser: Undefined allocation of 0 bytes + f22dc0f Phenom Tue, 18 Apr 2017 12:02:34 +0200 Fix Clang warnings: unused variable 'action' + 490f8d2 Phenom Tue, 18 Apr 2017 12:00:00 +0200 Fix Clang warnings: 'TYPE_IDENTITY' not handled + 6e42cf4 Phenom Tue, 18 Apr 2017 11:56:25 +0200 Fix Clang warnings: field 'mPassword' will be initialized after field 'mPrevIsBad' + 0d7df56 csoler Mon, 24 Apr 2017 22:47:08 +0200 moved rsconfigitems and rshistoryitems to rsitems/ + f7338d4 csoler Mon, 24 Apr 2017 22:39:05 +0200 removed old code + 43b3b87 csoler Mon, 24 Apr 2017 22:36:03 +0200 fixed a few bugs in config items + fcabe63 csoler Mon, 24 Apr 2017 18:51:51 +0200 switch RsConfigItems to new serialization + be9f126 electr Mon, 24 Apr 2017 18:43:17 +0200 Merge pull request #781 from Sonetio/libresapi_requests + af4fcf7 csoler Mon, 24 Apr 2017 17:33:30 +0200 switched rshistoryitems to new serialization + 1327582 Phenom Mon, 24 Apr 2017 17:28:25 +0200 Fix Relay setting values + 8ae6541 csoler Mon, 24 Apr 2017 17:10:01 +0200 added two new classes for config/service serialisers and a base generic serialiser class + 8da5e15 Konrad Mon, 24 Apr 2017 16:00:23 +0200 Changed: difference time to absolute time. + dc2df07 csoler Mon, 24 Apr 2017 14:14:34 +0200 renamed RsSerializer into RsServiceSerializer + 976a80a csoler Mon, 24 Apr 2017 13:30:18 +0200 switch rsfilelistitems to new serialization + 26e9541 csoler Mon, 24 Apr 2017 11:06:51 +0200 moved RTT items to rsitems/ + f6aaee7 csoler Mon, 24 Apr 2017 11:01:45 +0200 converted RTT items to new serialization + 5071c4b csoler Mon, 24 Apr 2017 11:00:57 +0200 moved msgitems to rsitems/ + fc82b20 csoler Mon, 24 Apr 2017 10:36:22 +0200 removed old serialization code in msgs + 0886794 csoler Mon, 24 Apr 2017 10:29:57 +0200 fixed bug caused by wrong cast in lobby msg signature validation + 91b0409 csoler Mon, 24 Apr 2017 10:11:24 +0200 fixed two memory bugs in serialization code + 6313d89 defnax Mon, 24 Apr 2017 01:23:05 +0200 Improved look n feel of Profile Generation Window. + 31c07f4 csoler Sun, 23 Apr 2017 22:40:26 +0200 converted RsMsgItems to new serialization. Added format and flag members to RsSerialiser and used the later to handle signature and config serialization techniques + 63b4b3a csoler Sun, 23 Apr 2017 19:07:26 +0200 moved discovery2 items to rsitems/ + 9d9ff56 csoler Sun, 23 Apr 2017 19:02:12 +0200 switched discovery2items to new serialization + 190a638 csoler Sun, 23 Apr 2017 17:53:25 +0200 added zesty to ubuntu releases + 06e90e6 csoler Sun, 23 Apr 2017 17:49:07 +0200 added control file for zesty + c738026 csoler Sun, 23 Apr 2017 17:48:39 +0200 updated ubuntu changelog + 2e71270 csoler Sat, 22 Apr 2017 21:36:39 +0200 fixed previous file move + bef6db4 csoler Sat, 22 Apr 2017 21:32:57 +0200 moved files + 311f257 csoler Sat, 22 Apr 2017 21:10:55 +0200 converted GxsReputationItems to new serialization + 782c027 csoler Sat, 22 Apr 2017 16:00:01 +0200 added names for turtle sub items + f571b05 Konrad Sat, 22 Apr 2017 11:06:56 +0200 Added: Checking if the vector is empty; Changed: Grouped values into one member + 8c0b7ce Konrad Fri, 21 Apr 2017 23:44:00 +0200 Fixed: Responds sends now correct time difference + c9f618d Konrad Thu, 20 Apr 2017 19:09:57 +0200 Added: Notification about changed peer status + 9600359 Konrad Thu, 20 Apr 2017 18:09:19 +0200 Fixed: Password was not stored after creating a new location + 4a0b51c Konrad Wed, 19 Apr 2017 22:03:24 +0200 Added: to response information whether the identity is a contact + b43bedf Konrad Tue, 18 Apr 2017 23:00:59 +0200 Added: Handling requests to set opinion about identity + 120ca9d Konrad Tue, 18 Apr 2017 22:58:15 +0200 Added: Handling requests to set opinion about identity + 3f54568 Konrad Tue, 18 Apr 2017 22:56:35 +0200 Added: Handling requests to get details about identity + e2d9152 csoler Tue, 18 Apr 2017 21:11:37 +0200 moved converted serialisation files into new directory rsitems/, leaving serialiser/ for the serialisation classes + 76dd7fe Konrad Tue, 18 Apr 2017 14:02:14 +0200 Added: Handling requests to add and remove contact + 4a99000 Konrad Tue, 18 Apr 2017 14:00:30 +0200 Added: Handling requests to get and set node options + f8fc8b4 csoler Sun, 16 Apr 2017 20:16:59 +0200 removed old code in turtle serialiser + 2ca46ec csoler Sun, 16 Apr 2017 20:11:54 +0200 fixed bug in serialization of data chunks + 1211334 csoler Sun, 16 Apr 2017 19:59:22 +0200 fixed bug in serialization for turtle + 636450f csoler Sat, 15 Apr 2017 18:46:44 +0200 moved turtle and FT to new serialization + fd33315 Konrad Fri, 14 Apr 2017 17:44:17 +0200 Added: Handling requests to create lobby + 93aeae0 Konrad Fri, 14 Apr 2017 17:41:35 +0200 Added: Handling requests to delete identity + 3453a3e csoler Tue, 11 Apr 2017 23:05:27 +0200 switched FileTransfer items to new serialization + 80e8769 csoler Tue, 11 Apr 2017 21:37:35 +0200 added missign file and converted BW control items + 731e20d csoler Mon, 10 Apr 2017 22:09:56 +0200 switch BanListItem classes to new serialization system + 691ed8d csoler Mon, 10 Apr 2017 20:34:02 +0200 added new template for std::string with type id + 8b77388 csoler Wed, 5 Apr 2017 21:02:17 +0200 removed all chat serialization code + ae9d0b2 csoler Wed, 5 Apr 2017 20:49:32 +0200 fixed a few bugs in chat serialization + 03c31ce csoler Wed, 5 Apr 2017 18:27:29 +0200 fixed serialization test example + 6b4fdb4 csoler Wed, 5 Apr 2017 18:25:54 +0200 fixed bug in serialization + a941136 csoler Wed, 5 Apr 2017 18:09:45 +0200 fixed a few bugs in new serialization + 5b3e488 csoler Wed, 5 Apr 2017 16:53:20 +0200 fixed compilation + 48688ea csoler Wed, 5 Apr 2017 10:27:12 +0200 progress in converting chat items to new serialization + 9438d60 csoler Tue, 4 Apr 2017 22:53:50 +0200 progress in converting Chat items to new serialization model + f2fa70e csoler Tue, 4 Apr 2017 16:37:57 +0200 progress in converting Chat items to new serialization model + 32ce9ae csoler Tue, 4 Apr 2017 15:33:59 +0200 started converting rschatitems to new serialization + f7e3968 csoler Tue, 4 Apr 2017 14:01:33 +0200 added hability to print in the serialization process + 059dfcf csoler Tue, 4 Apr 2017 14:00:17 +0200 added hability to print in the serialization process + 75a3cf0 csoler Sun, 2 Apr 2017 15:04:03 +0200 fixed compilation in new serialization test code + ddbe2ef csoler Sun, 2 Apr 2017 14:48:17 +0200 created .cc files for serialization + b52071d csoler Sat, 1 Apr 2017 18:05:53 +0200 removed RsSerializable and merged it into RsItem + 1bc4fe5 csoler Sat, 25 Mar 2017 19:01:32 +0100 polished serialisation prototype + 369621f csoler Mon, 20 Mar 2017 23:31:04 +0100 simplified new serialization prototype + 4f24b95 csoler Sun, 19 Mar 2017 21:28:28 +0100 added new serialization code test example + + -- Retroshare Dev Team Mon, 8 May 2017 18:00:00 +0100 + +retroshare06 (0.6.2-1.20170423.190a638c~xenial) xenial; urgency=low + 5b3b903 csoler Sun, 23 Apr 2017 17:33:21 +0200 added missing line for ubuntu zesty 73bfc27 csoler Sun, 23 Apr 2017 17:33:50 +0200 Merge pull request #784 from PhenomRetroShare/Fix_RelaySettingsPage 4c326f5 Phenom Sun, 23 Apr 2017 10:27:18 +0200 Fix Relay setting page. From 8a86b9ed7dc99dffa75ee16f51b4f89b473bee70 Mon Sep 17 00:00:00 2001 From: csoler Date: Mon, 8 May 2017 22:00:51 +0200 Subject: [PATCH 35/50] added a per-friend upload slots limit in FT. Default is 0=unlimited --- libretroshare/src/ft/ftcontroller.cc | 30 ++++++- libretroshare/src/ft/ftcontroller.h | 6 +- libretroshare/src/ft/ftserver.cc | 88 ++++++++++++++++++- libretroshare/src/ft/ftserver.h | 4 + libretroshare/src/retroshare/rsfiles.h | 2 + .../src/gui/settings/TransferPage.cpp | 7 ++ .../src/gui/settings/TransferPage.h | 1 + .../src/gui/settings/TransferPage.ui | 10 +++ 8 files changed, 143 insertions(+), 5 deletions(-) diff --git a/libretroshare/src/ft/ftcontroller.cc b/libretroshare/src/ft/ftcontroller.cc index fad8642fa..86be40793 100644 --- a/libretroshare/src/ft/ftcontroller.cc +++ b/libretroshare/src/ft/ftcontroller.cc @@ -75,6 +75,7 @@ static const int32_t INACTIVE_CHUNKS_CHECK_DELAY = 240 ; // time after which an static const int32_t MAX_TIME_INACTIVE_REQUEUED = 120 ; // time after which an inactive ftFileControl is bt-queued static const int32_t FT_FILECONTROL_QUEUE_ADD_END = 0 ; +static const int32_t FT_FILECONTROL_MAX_UPLOAD_SLOTS_DEFAULT= 0 ; const uint32_t FT_CNTRL_STANDARD_RATE = 10 * 1024 * 1024; const uint32_t FT_CNTRL_SLOW_RATE = 100 * 1024; @@ -113,6 +114,7 @@ ftController::ftController(ftDataMultiplex *dm, p3ServiceControl *sc, uint32_t f { _max_active_downloads = 5 ; // default queue size mDefaultEncryptionPolicy = RS_FILE_CTRL_ENCRYPTION_POLICY_PERMISSIVE; + _max_uploads_per_friend = FT_FILECONTROL_MAX_UPLOAD_SLOTS_DEFAULT ; /* TODO */ cnt = 0 ; } @@ -239,8 +241,8 @@ void ftController::data_tick() { RsStackMutex stack(ctrlMutex); /******* LOCKED ********/ - for(std::map::iterator it(mDownloads.begin());it!=mDownloads.end();++it) - it->second->mCreator->removeInactiveChunks() ; + for(std::map::iterator it(mDownloads.begin());it!=mDownloads.end();++it) + it->second->mCreator->removeInactiveChunks() ; last_clean_time = now ; } @@ -1723,6 +1725,7 @@ void ftController::statusChange(const std::list &plist) const std::string active_downloads_size_ss("MAX_ACTIVE_DOWNLOADS"); const std::string download_dir_ss("DOWN_DIR"); const std::string partial_dir_ss("PART_DIR"); +const std::string max_uploads_per_friend_ss("MAX_UPLOADS_PER_FRIEND"); const std::string default_chunk_strategy_ss("DEFAULT_CHUNK_STRATEGY"); const std::string free_space_limit_ss("FREE_SPACE_LIMIT"); const std::string default_encryption_policy_ss("DEFAULT_ENCRYPTION_POLICY"); @@ -1771,6 +1774,9 @@ bool ftController::saveList(bool &cleanup, std::list& saveData) break ; } + rs_sprintf(s,"%lu",_max_uploads_per_friend) ; + configMap[max_uploads_per_friend_ss] = s ; + configMap[default_encryption_policy_ss] = (mDefaultEncryptionPolicy==RS_FILE_CTRL_ENCRYPTION_POLICY_PERMISSIVE)?"PERMISSIVE":"STRICT" ; rs_sprintf(s, "%lu", RsDiscSpace::freeSpaceLimit()); @@ -2057,9 +2063,29 @@ bool ftController::loadConfigMap(std::map &configMap) RsDiscSpace::setFreeSpaceLimit(size) ; } } + if(configMap.end() != (mit = configMap.find(max_uploads_per_friend_ss))) + { + uint32_t n ; + if (sscanf(mit->second.c_str(), "%u", &n) == 1) { + std::cerr << "have read a max upload slots limit of " << n << std::endl ; + + _max_uploads_per_friend = n ; + } + } return true; } +void ftController::setMaxUploadsPerFriend(uint32_t m) +{ + RsStackMutex stack(ctrlMutex); /******* LOCKED ********/ + _max_uploads_per_friend = m ; + IndicateConfigChanged(); +} +uint32_t ftController::getMaxUploadsPerFriend() +{ + RsStackMutex stack(ctrlMutex); /******* LOCKED ********/ + return _max_uploads_per_friend ; +} void ftController::setDefaultEncryptionPolicy(uint32_t p) { RsStackMutex stack(ctrlMutex); /******* LOCKED ********/ diff --git a/libretroshare/src/ft/ftcontroller.h b/libretroshare/src/ft/ftcontroller.h index edeb8d82f..fd9acd3cd 100644 --- a/libretroshare/src/ft/ftcontroller.h +++ b/libretroshare/src/ft/ftcontroller.h @@ -146,6 +146,9 @@ class ftController: public RsTickingThread, public pqiServiceMonitor, public p3C void setFreeDiskSpaceLimit(uint32_t size_in_mb) ; uint32_t defaultEncryptionPolicy(); + void setMaxUploadsPerFriend(uint32_t m) ; + uint32_t getMaxUploadsPerFriend() ; + bool FileCancel(const RsFileHash& hash); bool FileControl(const RsFileHash& hash, uint32_t flags); bool FileClearCompleted(); @@ -261,7 +264,8 @@ class ftController: public RsTickingThread, public pqiServiceMonitor, public p3C FileChunksInfo::ChunkStrategy mDefaultChunkStrategy ; - uint32_t _max_active_downloads ; // maximum number of simultaneous downloads + uint32_t _max_active_downloads ; // maximum number of simultaneous downloads + uint32_t _max_uploads_per_friend ; // maximum number of uploads per friend. 0 means unlimited. }; #endif diff --git a/libretroshare/src/ft/ftserver.cc b/libretroshare/src/ft/ftserver.cc index 15a44f34f..a10d1ce02 100644 --- a/libretroshare/src/ft/ftserver.cc +++ b/libretroshare/src/ft/ftserver.cc @@ -60,7 +60,8 @@ const int ftserverzone = 29539; #define FTSERVER_DEBUG() std::cerr << time(NULL) << " : FILE_SERVER : " << __FUNCTION__ << " : " #define FTSERVER_ERROR() std::cerr << "(EE) FILE_SERVER ERROR : " -static const time_t FILE_TRANSFER_LOW_PRIORITY_TASKS_PERIOD = 5 ; // low priority tasks handling every 5 seconds +static const time_t FILE_TRANSFER_LOW_PRIORITY_TASKS_PERIOD = 5 ; // low priority tasks handling every 5 seconds +static const time_t FILE_TRANSFER_MAX_DELAY_BEFORE_DROP_USAGE_RECORD = 10 ; // keep usage records for 10 secs at most. /* Setup */ ftServer::ftServer(p3PeerMgr *pm, p3ServiceControl *sc) @@ -318,6 +319,16 @@ uint32_t ftServer::defaultEncryptionPolicy() { return mFtController->defaultEncryptionPolicy() ; } + +void ftServer::setMaxUploadSlotsPerFriend(uint32_t n) +{ + mFtController->setMaxUploadsPerFriend(n) ; +} +uint32_t ftServer::getMaxUploadSlotsPerFriend() +{ + return mFtController->getMaxUploadsPerFriend() ; +} + void ftServer::setDefaultEncryptionPolicy(uint32_t s) { mFtController->setDefaultEncryptionPolicy(s) ; @@ -1518,6 +1529,78 @@ int ftServer::tick() return moreToTick; } +bool ftServer::checkUploadLimit(const RsPeerId& pid,const RsFileHash& hash) +{ + // No need for this extra cost if the value means "unlimited" + +#ifdef SERVER_DEBUG + std::cerr << "Checking upload limit for friend " << pid << " and hash " << hash << ": " ; +#endif + + uint32_t max_ups = mFtController->getMaxUploadsPerFriend() ; + + if(max_ups == 0) + { +#ifdef SERVER_DEBUG + std::cerr << " no limit! returning true." << std::endl; +#endif + return true ; + } +#ifdef SERVER_DEBUG + std::cerr << " max=" << max_ups ; +#endif + + // Find the latest records for this pid. + + std::map& tmap(mUploadLimitMap[pid]) ; + std::map::iterator it ; + + time_t now = time(NULL) ; + + // If the limit has been decresed, we arbitrarily drop some ongoing slots. + + while(tmap.size() > max_ups) + tmap.erase(tmap.begin()) ; + + // Look in the upload record map. If it's not full, directly allocate a slot. If full, re-use an existing slot if a file is already cited. + + if(tmap.size() < max_ups || (tmap.size()==max_ups && tmap.end() != (it = tmap.find(hash)))) + { +#ifdef SERVER_DEBUG + std::cerr << " allocated slot for this hash => true" << std::endl; +#endif + + tmap[hash] = now ; + return true ; + } + + // There's no room in the used slots, but maybe some of them are not used anymore, in which case we remove them, which freeze a slot. + uint32_t cleaned = 0 ; + + for(it = tmap.begin();it!=tmap.end() && cleaned<2;) + if(it->second + FILE_TRANSFER_MAX_DELAY_BEFORE_DROP_USAGE_RECORD < now) + { + tmap.erase(it) ; + ++cleaned ; + } + else + ++it ; + + if(cleaned > 0) + { +#ifdef SERVER_DEBUG + std::cerr << " cleaned up " << cleaned << " old hashes => true" << std::endl; +#endif + tmap[hash] = now ; + return true ; + } + +#ifdef SERVER_DEBUG + std::cerr << " no slot for this hash => false" << std::endl; +#endif + return false ; +} + int ftServer::handleIncoming() { // now File Input. @@ -1534,7 +1617,8 @@ int ftServer::handleIncoming() case RS_PKT_SUBTYPE_FT_DATA_REQUEST: { RsFileTransferDataRequestItem *f = dynamic_cast(item) ; - if (f) + + if (f && checkUploadLimit(f->PeerId(),f->file.hash)) { #ifdef SERVER_DEBUG FTSERVER_DEBUG() << "ftServer::handleIncoming: received data request for hash " << f->file.hash << ", offset=" << f->fileoffset << ", chunk size=" << f->chunksize << std::endl; diff --git a/libretroshare/src/ft/ftserver.h b/libretroshare/src/ft/ftserver.h index 5ad4824b5..e55c30858 100644 --- a/libretroshare/src/ft/ftserver.h +++ b/libretroshare/src/ft/ftserver.h @@ -138,6 +138,8 @@ public: virtual void setFreeDiskSpaceLimit(uint32_t size_in_mb) ; virtual void setDefaultEncryptionPolicy(uint32_t policy) ; // RS_FILE_CTRL_ENCRYPTION_POLICY_STRICT/PERMISSIVE virtual uint32_t defaultEncryptionPolicy() ; + virtual void setMaxUploadSlotsPerFriend(uint32_t n) ; + virtual uint32_t getMaxUploadSlotsPerFriend() ; /*** * Control of Downloads Priority. @@ -266,6 +268,7 @@ protected: bool findEncryptedHash(const RsPeerId& virtual_peer_id, RsFileHash& encrypted_hash); bool encryptHash(const RsFileHash& hash, RsFileHash& hash_of_hash); + bool checkUploadLimit(const RsPeerId& pid,const RsFileHash& hash); private: /**** INTERNAL FUNCTIONS ***/ @@ -293,6 +296,7 @@ private: std::map mEncryptedHashes ; // This map is such that sha1(it->second) = it->first std::map mEncryptedPeerIds ; // This map holds the hash to be used with each peer id + std::map > mUploadLimitMap ; }; diff --git a/libretroshare/src/retroshare/rsfiles.h b/libretroshare/src/retroshare/rsfiles.h index ba24552e5..29515e1a5 100644 --- a/libretroshare/src/retroshare/rsfiles.h +++ b/libretroshare/src/retroshare/rsfiles.h @@ -167,6 +167,8 @@ class RsFiles virtual bool FileClearCompleted() = 0; virtual void setDefaultEncryptionPolicy(uint32_t policy)=0 ; // RS_FILE_CTRL_ENCRYPTION_POLICY_STRICT/PERMISSIVE virtual uint32_t defaultEncryptionPolicy()=0 ; + virtual void setMaxUploadSlotsPerFriend(uint32_t n)=0 ; + virtual uint32_t getMaxUploadSlotsPerFriend()=0 ; /*** * Control of Downloads Priority. diff --git a/retroshare-gui/src/gui/settings/TransferPage.cpp b/retroshare-gui/src/gui/settings/TransferPage.cpp index 76a01632d..75669b96f 100644 --- a/retroshare-gui/src/gui/settings/TransferPage.cpp +++ b/retroshare-gui/src/gui/settings/TransferPage.cpp @@ -38,6 +38,7 @@ TransferPage::TransferPage(QWidget * parent, Qt::WindowFlags flags) ui.setupUi(this); QObject::connect(ui._queueSize_SB,SIGNAL(valueChanged(int)),this,SLOT(updateQueueSize(int))) ; + QObject::connect(ui._max_up_SB,SIGNAL(valueChanged(int)),this,SLOT(updateMaxUploadSlots(int))) ; QObject::connect(ui._defaultStrategy_CB,SIGNAL(activated(int)),this,SLOT(updateDefaultStrategy(int))) ; QObject::connect(ui._e2e_encryption_CB,SIGNAL(activated(int)),this,SLOT(updateEncryptionPolicy(int))) ; QObject::connect(ui._diskSpaceLimit_SB,SIGNAL(valueChanged(int)),this,SLOT(updateDiskSizeLimit(int))) ; @@ -59,6 +60,11 @@ void TransferPage::updateMaxTRUpRate(int b) rsTurtle->setMaxTRForwardRate(b) ; } +void TransferPage::updateMaxUploadSlots(int b) +{ + rsFiles->setMaxUploadSlotsPerFriend(b) ; +} + void TransferPage::updateEncryptionPolicy(int b) { switch(b) @@ -100,6 +106,7 @@ void TransferPage::load() whileBlocking(ui._diskSpaceLimit_SB)->setValue(rsFiles->freeDiskSpaceLimit()) ; whileBlocking(ui._max_tr_up_per_sec_SB)->setValue(rsTurtle->getMaxTRForwardRate()) ; + whileBlocking(ui._max_up_SB)->setValue(rsFiles->getMaxUploadSlotsPerFriend()) ; } void TransferPage::updateDefaultStrategy(int i) diff --git a/retroshare-gui/src/gui/settings/TransferPage.h b/retroshare-gui/src/gui/settings/TransferPage.h index d7f7c4da7..e8ed42ca6 100644 --- a/retroshare-gui/src/gui/settings/TransferPage.h +++ b/retroshare-gui/src/gui/settings/TransferPage.h @@ -48,6 +48,7 @@ class TransferPage: public ConfigPage void updateDiskSizeLimit(int) ; void updateMaxTRUpRate(int); void updateEncryptionPolicy(int); + void updateMaxUploadSlots(int); void editDirectories() ; void setIncomingDirectory(); diff --git a/retroshare-gui/src/gui/settings/TransferPage.ui b/retroshare-gui/src/gui/settings/TransferPage.ui index 474e6f3b5..ee48788be 100644 --- a/retroshare-gui/src/gui/settings/TransferPage.ui +++ b/retroshare-gui/src/gui/settings/TransferPage.ui @@ -203,6 +203,13 @@ + + + + Maximum uploads per friend (0 = no limit) + + + @@ -251,6 +258,9 @@ + + + From e0cb0f4847a0abd65b5f10523838695b1495602f Mon Sep 17 00:00:00 2001 From: csoler Date: Mon, 8 May 2017 23:04:04 +0200 Subject: [PATCH 36/50] fixed previous commit --- libretroshare/src/ft/ftserver.cc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/libretroshare/src/ft/ftserver.cc b/libretroshare/src/ft/ftserver.cc index a10d1ce02..a7bfe49f0 100644 --- a/libretroshare/src/ft/ftserver.cc +++ b/libretroshare/src/ft/ftserver.cc @@ -1539,6 +1539,8 @@ bool ftServer::checkUploadLimit(const RsPeerId& pid,const RsFileHash& hash) uint32_t max_ups = mFtController->getMaxUploadsPerFriend() ; + RS_STACK_MUTEX(srvMutex) ; + if(max_ups == 0) { #ifdef SERVER_DEBUG @@ -1580,7 +1582,10 @@ bool ftServer::checkUploadLimit(const RsPeerId& pid,const RsFileHash& hash) for(it = tmap.begin();it!=tmap.end() && cleaned<2;) if(it->second + FILE_TRANSFER_MAX_DELAY_BEFORE_DROP_USAGE_RECORD < now) { + std::map::iterator tmp(it) ; + ++tmp; tmap.erase(it) ; + it = tmp; ++cleaned ; } else From 237db96e7a30c09d6562c2c8c7380fb9831fd9b3 Mon Sep 17 00:00:00 2001 From: Phenom Date: Mon, 8 May 2017 17:26:12 +0200 Subject: [PATCH 37/50] Add Open Cert File in Home Add Friend wizard. --- .../src/gui/connect/ConnectFriendWizard.cpp | 17 ++++++++ .../src/gui/connect/ConnectFriendWizard.h | 1 + .../src/gui/connect/ConnectFriendWizard.ui | 39 ++++++++++++++++++- 3 files changed, 55 insertions(+), 2 deletions(-) diff --git a/retroshare-gui/src/gui/connect/ConnectFriendWizard.cpp b/retroshare-gui/src/gui/connect/ConnectFriendWizard.cpp index b652debaf..f71d8f9c2 100755 --- a/retroshare-gui/src/gui/connect/ConnectFriendWizard.cpp +++ b/retroshare-gui/src/gui/connect/ConnectFriendWizard.cpp @@ -345,6 +345,7 @@ void ConnectFriendWizard::initializePage(int id) connect(ui->userCertOldFormatButton, SIGNAL(clicked()), this, SLOT(toggleFormatState())); connect(ui->userCertCopyButton, SIGNAL(clicked()), this, SLOT(copyCert())); connect(ui->userCertPasteButton, SIGNAL(clicked()), this, SLOT(pasteCert())); + connect(ui->userCertOpenButton, SIGNAL(clicked()), this, SLOT(openCert())); connect(ui->userCertSaveButton, SIGNAL(clicked()), this, SLOT(saveCert())); connect(ui->userCertMailButton, SIGNAL(clicked()), this, SLOT(runEmailClient())); connect(ui->friendCertEdit, SIGNAL(textChanged()), this, SLOT(friendCertChanged())); @@ -1077,6 +1078,22 @@ void ConnectFriendWizard::pasteCert() ui->friendCertEdit->setPlainText(clipboard->text()); } +void ConnectFriendWizard::openCert() +{ + QString fileName ; + if(!misc::getOpenFileName(this, RshareSettings::LASTDIR_CERT, tr("Select Certificate"), tr("RetroShare Certificate (*.rsc );;All Files (*)"),fileName)) + return ; + + if (!fileName.isNull()) { + QFile fileCert(fileName); + if (fileCert.open(QIODevice::ReadOnly )) { + QByteArray arrayCert(fileCert.readAll()); + ui->friendCertEdit->setPlainText(QString::fromUtf8(arrayCert)); + fileCert.close(); + } + } +} + void ConnectFriendWizard::saveCert() { QString fileName = QFileDialog::getSaveFileName(this, tr("Save as..."), "", tr("RetroShare Certificate (*.rsc );;All Files (*)")); diff --git a/retroshare-gui/src/gui/connect/ConnectFriendWizard.h b/retroshare-gui/src/gui/connect/ConnectFriendWizard.h index 2bd69f882..1571dbb2c 100755 --- a/retroshare-gui/src/gui/connect/ConnectFriendWizard.h +++ b/retroshare-gui/src/gui/connect/ConnectFriendWizard.h @@ -66,6 +66,7 @@ private slots: void showHelpUserCert(); void copyCert(); void pasteCert(); + void openCert(); void saveCert(); void friendCertChanged(); void cleanFriendCert(); diff --git a/retroshare-gui/src/gui/connect/ConnectFriendWizard.ui b/retroshare-gui/src/gui/connect/ConnectFriendWizard.ui index 0683207ae..da92b3091 100644 --- a/retroshare-gui/src/gui/connect/ConnectFriendWizard.ui +++ b/retroshare-gui/src/gui/connect/ConnectFriendWizard.ui @@ -279,7 +279,7 @@ - + @@ -316,6 +316,41 @@ + + + + 20 + 20 + + + + Qt::NoFocus + + + Open Cert of your friend from File + + + Open certificate + + + + :/icons/svg/filesharing.svg:/icons/svg/filesharing.svg + + + + 24 + 24 + + + + Qt::ToolButtonTextBesideIcon + + + false + + + + :/images/accepted16.png @@ -325,7 +360,7 @@ - + From 0af05d25179cd3eb52d485ed5d3b777987fa944c Mon Sep 17 00:00:00 2001 From: csoler Date: Tue, 9 May 2017 19:06:31 +0200 Subject: [PATCH 38/50] patch to avoid re-asking for rejected plugins when the executable is upgraded. --- libretroshare/src/plugins/pluginmanager.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libretroshare/src/plugins/pluginmanager.cc b/libretroshare/src/plugins/pluginmanager.cc index fa38394a5..70c43a73b 100644 --- a/libretroshare/src/plugins/pluginmanager.cc +++ b/libretroshare/src/plugins/pluginmanager.cc @@ -503,12 +503,15 @@ bool RsPluginManager::loadList(std::list& list) delete (*it); } + // Rejected hashes are always kept, so that RS wont ask again if the executable hash has changed. + // + _rejected_hashes = rejected_hash_candidates ; + if(reference_executable_hash == _current_executable_hash) { std::cerr << "(II) Executable hash matches. Updating the list of accepted/rejected plugins." << std::endl; _accepted_hashes = accepted_hash_candidates ; - _rejected_hashes = rejected_hash_candidates ; } else std::cerr << "(WW) Executable hashes do not match. Executable hash has changed. Discarding the list of accepted/rejected plugins." << std::endl; From a5386eb6ea71768c1d7153a02f7516c6b96f0f37 Mon Sep 17 00:00:00 2001 From: Phenom Date: Tue, 9 May 2017 19:19:13 +0200 Subject: [PATCH 39/50] Fix text's color gray in Forum thread when selected. --- retroshare-gui/src/gui/qss/stylesheet/qss.default | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/retroshare-gui/src/gui/qss/stylesheet/qss.default b/retroshare-gui/src/gui/qss/stylesheet/qss.default index db24fd45e..48fef26e2 100644 --- a/retroshare-gui/src/gui/qss/stylesheet/qss.default +++ b/retroshare-gui/src/gui/qss/stylesheet/qss.default @@ -138,9 +138,9 @@ PostedCreatePostDialog QLabel#info_label ForumsDialog, GxsForumThreadWidget { - qproperty-textColorRead: gray; + qproperty-textColorRead: darkgray; qproperty-textColorUnread: black; - qproperty-textColorUnreadChildren: gray; + qproperty-textColorUnreadChildren: darkgray; qproperty-textColorNotSubscribed: black; qproperty-textColorMissing: darkRed; } From 52a0aea0dc2eb45ee5f9486ed68981b76fdea91f Mon Sep 17 00:00:00 2001 From: csoler Date: Tue, 9 May 2017 21:33:02 +0200 Subject: [PATCH 40/50] fixed bug causing edited posts to turn into missing messages when they have submessages --- .../src/gui/gxsforums/GxsForumsFillThread.cpp | 27 ++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/retroshare-gui/src/gui/gxsforums/GxsForumsFillThread.cpp b/retroshare-gui/src/gui/gxsforums/GxsForumsFillThread.cpp index 199748346..16a813bd4 100644 --- a/retroshare-gui/src/gui/gxsforums/GxsForumsFillThread.cpp +++ b/retroshare-gui/src/gui/gxsforums/GxsForumsFillThread.cpp @@ -247,6 +247,7 @@ void GxsForumsFillThread::run() } } + // Now remove from msg ids, all posts except the most recent one. And make the mPostVersion be indexed by the most recent version of the post, // which corresponds to the item in the tree widget. @@ -254,6 +255,7 @@ void GxsForumsFillThread::run() std::cerr << "Final post versions: " << std::endl; #endif QMap > > mTmp; + std::map most_recent_versions ; for(QMap > >::iterator it(mPostVersions.begin());it!=mPostVersions.end();++it) { @@ -277,10 +279,16 @@ void GxsForumsFillThread::run() } mTmp[(*it)[0].second] = *it ; // index the versions map by the ID of the most recent post. + + // Now make sure that message parents are consistent. Indeed, an old post may have the old version of a post as parent. So we need to change that parent + // to the newest version. So we create a map of which is the most recent version of each message, so that parent messages can be searched in it. + + for(uint32_t i=1;i<(*it).size();++i) + most_recent_versions[(*it)[i].second] = (*it)[0].second ; } mPostVersions = mTmp ; - // The first step is to find the top level thread messages. These are defined as the messages without + // The next step is to find the top level thread messages. These are defined as the messages without // any parent message ID. // this trick is needed because while we remove messages, the parents a given msg may already have been removed @@ -325,10 +333,21 @@ void GxsForumsFillThread::run() #endif // The same missing parent may appear multiple times, so we first store them into a unique container. - if(msgs.find(msgIt->second.mMeta.mParentId) == msgs.end()) - missing_parents.insert(msgIt->second.mMeta.mParentId); + RsGxsMessageId parent_msg = msgIt->second.mMeta.mParentId; - kids_array[msgIt->second.mMeta.mParentId].push_back(msgIt->first) ; + if(msgs.find(parent_msg) == msgs.end()) + { + // also check that the message is not versionned + + std::map::const_iterator mrit = most_recent_versions.find(parent_msg) ; + + if(mrit != most_recent_versions.end()) + parent_msg = mrit->second ; + else + missing_parents.insert(parent_msg); + } + + kids_array[parent_msg].push_back(msgIt->first) ; kept_msgs.insert(*msgIt) ; } } From bd9a8ae3aa398d2cfdeadddf363d1b6add928d18 Mon Sep 17 00:00:00 2001 From: csoler Date: Tue, 9 May 2017 22:39:15 +0200 Subject: [PATCH 41/50] prevent to remove old forum messages that have follow-ups. --- libretroshare/src/gxs/rsgxsutil.cc | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/libretroshare/src/gxs/rsgxsutil.cc b/libretroshare/src/gxs/rsgxsutil.cc index f37ed67ba..21d7d3d3e 100644 --- a/libretroshare/src/gxs/rsgxsutil.cc +++ b/libretroshare/src/gxs/rsgxsutil.cc @@ -82,14 +82,23 @@ bool RsGxsMessageCleanUp::clean() for(; mit != result.end(); ++mit) { std::vector& metaV = mit->second; - std::vector::iterator vit = metaV.begin(); - for(; vit != metaV.end(); ) + // First, make a map of which message have a child message. This allows to only delete messages that dont have child messages. + // A more accurate way to go would be to compute the time of the oldest message and possibly delete all the branch, but in the + // end the message tree will be deleted slice after slice, which should still be reasonnably fast. + // + std::set messages_with_kids ; + + for( uint32_t i=0;imParentId.isNull()) + messages_with_kids.insert(metaV[i]->mParentId) ; + + for( uint32_t i=0;i 0 && (meta->mPublishTs + store_period) < now; + bool remove = store_period > 0 && ((meta->mPublishTs + store_period) < now) && (messages_with_kids.find(meta->mMsgId)==messages_with_kids.end()); // check client does not want the message kept regardless of age remove &= !(meta->mMsgStatus & GXS_SERV::GXS_MSG_STATUS_KEEP); @@ -106,7 +115,6 @@ bool RsGxsMessageCleanUp::clean() } delete meta; - vit = metaV.erase(vit); } } From 6ffae36242b9b21166ad586ce9f1d1788f257e70 Mon Sep 17 00:00:00 2001 From: Phenom Date: Wed, 10 May 2017 19:06:03 +0200 Subject: [PATCH 42/50] Fix Start page password focus. And readd "log in" button. --- retroshare-gui/src/gui/StartDialog.cpp | 7 ++++-- retroshare-gui/src/gui/StartDialog.ui | 35 ++++++++++++++++++-------- 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/retroshare-gui/src/gui/StartDialog.cpp b/retroshare-gui/src/gui/StartDialog.cpp index 6b100d319..2a25eff77 100644 --- a/retroshare-gui/src/gui/StartDialog.cpp +++ b/retroshare-gui/src/gui/StartDialog.cpp @@ -73,13 +73,16 @@ StartDialog::StartDialog(QWidget *parent) } } - QObject::connect(ui.loadName,SIGNAL(currentIndexChanged(int)),this,SLOT(updateSelectedProfile(int))) ; - QObject::connect(ui.password_input,SIGNAL(returnPressed()),this,SLOT(loadPerson())) ; + QObject::connect(ui.loadName,SIGNAL(currentIndexChanged(int)),this,SLOT(updateSelectedProfile(int))) ; + QObject::connect(ui.password_input,SIGNAL(returnPressed()),this,SLOT(loadPerson())) ; + QObject::connect(ui.loadButton, SIGNAL(clicked()), this, SLOT(loadPerson())); if (pidx > 0) { ui.loadName->setCurrentIndex(pidx); } + + ui.password_input->setFocus(); } void StartDialog::updateSelectedProfile(int) diff --git a/retroshare-gui/src/gui/StartDialog.ui b/retroshare-gui/src/gui/StartDialog.ui index fb1554a32..0681835e6 100644 --- a/retroshare-gui/src/gui/StartDialog.ui +++ b/retroshare-gui/src/gui/StartDialog.ui @@ -17,7 +17,7 @@ :/images/logo/logo_32.png:/images/logo/logo_32.png - + 0 @@ -31,7 +31,7 @@ 0 - + 0 @@ -42,9 +42,9 @@ 0 - + - + Qt::Horizontal @@ -57,7 +57,7 @@ - + 0 @@ -115,7 +115,7 @@ - + Qt::Horizontal @@ -129,8 +129,8 @@ - - + + true @@ -143,9 +143,9 @@ - + - + Profile - Location: @@ -155,7 +155,7 @@ - + Password: @@ -181,6 +181,19 @@ + + + + Log In + + + true + + + false + + + From 1ff1b8960fa58a99c4ba63db718c00115ec3de19 Mon Sep 17 00:00:00 2001 From: Phenom Date: Sun, 7 Feb 2016 11:45:55 +0100 Subject: [PATCH 43/50] Save last state of OpMode status bar droplist and restore it at start. Add colored style sheet to OpModeStatus ComboBox. And defined default color when stylesheet file are not found. --- .../src/gui/qss/stylesheet/qss.default | 20 ++++ .../src/gui/statusbar/OpModeStatus.cpp | 94 +++++++++++++++++-- .../src/gui/statusbar/OpModeStatus.h | 25 ++++- retroshare-gui/src/qss/blacknight.qss | 20 +++- retroshare-gui/src/qss/qdarkstyle.qss | 19 ++++ 5 files changed, 165 insertions(+), 13 deletions(-) diff --git a/retroshare-gui/src/gui/qss/stylesheet/qss.default b/retroshare-gui/src/gui/qss/stylesheet/qss.default index 48fef26e2..e3c01bca1 100644 --- a/retroshare-gui/src/gui/qss/stylesheet/qss.default +++ b/retroshare-gui/src/gui/qss/stylesheet/qss.default @@ -223,3 +223,23 @@ GenCertDialog QLabel#entropy_label { qproperty-fontSizeFactor: 115; } + +/* OpModeStatus need to be at end to overload other values*/ +OpModeStatus { + qproperty-opMode_Full_Color: #CCFFCC; + qproperty-opMode_NoTurtle_Color: #CCCCFF; + qproperty-opMode_Gaming_Color: #FFFFCC; + qproperty-opMode_Minimal_Color: #FFCCCC; +} +OpModeStatus[opMode="Full"] { + background: #CCFFCC; +} +OpModeStatus[opMode="NoTurtle"] { + background: #CCCCFF; +} +OpModeStatus[opMode="Gaming"] { + background: #FFFFCC; +} +OpModeStatus[opMode="Minimal"] { + background: #FFCCCC; +} diff --git a/retroshare-gui/src/gui/statusbar/OpModeStatus.cpp b/retroshare-gui/src/gui/statusbar/OpModeStatus.cpp index 96934c5bf..230b8e131 100644 --- a/retroshare-gui/src/gui/statusbar/OpModeStatus.cpp +++ b/retroshare-gui/src/gui/statusbar/OpModeStatus.cpp @@ -15,7 +15,7 @@ * * 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, + * Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. ****************************************************************/ @@ -23,26 +23,40 @@ #include #include "gui/statusbar/OpModeStatus.h" +#include "gui/settings/rsharesettings.h" + #include + #include OpModeStatus::OpModeStatus(QWidget *parent) - : QComboBox(parent) + : QComboBox(parent) { + onUpdate = false; + opMode_Full_Color = QColor("#CCFFCC"); + opMode_NoTurtle_Color = QColor("#CCCCFF"); + opMode_Gaming_Color = QColor("#FFFFCC"); + opMode_Minimal_Color = QColor("#FFCCCC"); + /* add the options */ addItem(tr("Normal Mode"), RS_OPMODE_FULL); + setItemData(0, opMode_Full_Color, Qt::BackgroundRole); addItem(tr("No Anon D/L"), RS_OPMODE_NOTURTLE); + setItemData(1, opMode_NoTurtle_Color, Qt::BackgroundRole); addItem(tr("Gaming Mode"), RS_OPMODE_GAMING); + setItemData(2, opMode_Gaming_Color, Qt::BackgroundRole); addItem(tr("Low Traffic"), RS_OPMODE_MINIMAL); + setItemData(3, opMode_Minimal_Color, Qt::BackgroundRole); connect(this, SIGNAL(activated( int )), this, SLOT(setOpMode())); + setCurrentIndex(Settings->valueFromGroup("StatusBar", "OpMode", QVariant(0)).toInt()); + setOpMode(); setToolTip(tr("Use this DropList to quickly change Retroshare's behaviour\n No Anon D/L: switches off file forwarding\n Gaming Mode: 25% standard traffic and TODO: reduced popups\n Low Traffic: 10% standard traffic and TODO: pauses all file-transfers")); setFocusPolicy(Qt::ClickFocus); } - void OpModeStatus::getOpMode() { int opMode = rsConfig->getOperatingMode(); @@ -51,17 +65,26 @@ void OpModeStatus::getOpMode() default: case RS_OPMODE_FULL: setCurrentIndex(0); - break; + setProperty("opMode", "Full"); + break; case RS_OPMODE_NOTURTLE: setCurrentIndex(1); - break; + setProperty("opMode", "NoTurtle"); + break; case RS_OPMODE_GAMING: setCurrentIndex(2); - break; + setProperty("opMode", "Gaming"); + break; case RS_OPMODE_MINIMAL: setCurrentIndex(3); - break; + setProperty("opMode", "Minimal"); + break; } + onUpdate = true; + style()->unpolish(this); + style()->polish(this); + update(); + onUpdate = false; } void OpModeStatus::setOpMode() @@ -69,14 +92,65 @@ void OpModeStatus::setOpMode() std::cerr << "OpModeStatus::setOpMode()"; std::cerr << std::endl; - int idx = currentIndex(); - QVariant var = itemData(idx); - uint32_t opMode = var.toUInt(); + int idx = currentIndex(); + QVariant var = itemData(idx); + uint32_t opMode = var.toUInt(); rsConfig->setOperatingMode(opMode); // reload to be safe. getOpMode(); + Settings->setValueToGroup("StatusBar", "OpMode", idx); } +QColor OpModeStatus::getOpMode_Full_Color() const +{ + return opMode_Full_Color; +} +void OpModeStatus::setOpMode_Full_Color( QColor c ) +{ + opMode_Full_Color = c; + setItemData(0, opMode_Full_Color, Qt::BackgroundRole); + if (!onUpdate) + getOpMode(); +} + +QColor OpModeStatus::getOpMode_NoTurtle_Color() const +{ + return opMode_NoTurtle_Color; +} + +void OpModeStatus::setOpMode_NoTurtle_Color( QColor c ) +{ + opMode_NoTurtle_Color = c; + setItemData(1, opMode_NoTurtle_Color, Qt::BackgroundRole); + if (!onUpdate) + getOpMode(); +} + +QColor OpModeStatus::getOpMode_Gaming_Color() const +{ + return opMode_Gaming_Color; +} + +void OpModeStatus::setOpMode_Gaming_Color( QColor c ) +{ + opMode_Gaming_Color = c; + setItemData(2, opMode_Gaming_Color, Qt::BackgroundRole); + if (!onUpdate) + getOpMode(); +} + +QColor OpModeStatus::getOpMode_Minimal_Color() const +{ + return opMode_Minimal_Color; +} + +void OpModeStatus::setOpMode_Minimal_Color( QColor c ) +{ + opMode_Minimal_Color = c; + setItemData(3, opMode_Minimal_Color, Qt::BackgroundRole); + if (!onUpdate) + getOpMode(); +} diff --git a/retroshare-gui/src/gui/statusbar/OpModeStatus.h b/retroshare-gui/src/gui/statusbar/OpModeStatus.h index 6e84aea3a..3ca418cc3 100644 --- a/retroshare-gui/src/gui/statusbar/OpModeStatus.h +++ b/retroshare-gui/src/gui/statusbar/OpModeStatus.h @@ -15,7 +15,7 @@ * * 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, + * Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. ****************************************************************/ #ifndef OP_MODE_STATUS_H @@ -26,16 +26,37 @@ class OpModeStatus : public QComboBox { Q_OBJECT + Q_PROPERTY(QColor opMode_Full_Color READ getOpMode_Full_Color WRITE setOpMode_Full_Color DESIGNABLE true) + Q_PROPERTY(QColor opMode_NoTurtle_Color READ getOpMode_NoTurtle_Color WRITE setOpMode_NoTurtle_Color DESIGNABLE true) + Q_PROPERTY(QColor opMode_Gaming_Color READ getOpMode_Gaming_Color WRITE setOpMode_Gaming_Color DESIGNABLE true) + Q_PROPERTY(QColor opMode_Minimal_Color READ getOpMode_Minimal_Color WRITE setOpMode_Minimal_Color DESIGNABLE true) public: OpModeStatus(QWidget *parent = 0); + QColor getOpMode_Full_Color() const; + void setOpMode_Full_Color( QColor c ); + + QColor getOpMode_NoTurtle_Color() const; + void setOpMode_NoTurtle_Color( QColor c ); + + QColor getOpMode_Gaming_Color() const; + void setOpMode_Gaming_Color( QColor c ); + + QColor getOpMode_Minimal_Color() const; + void setOpMode_Minimal_Color( QColor c ); + private slots: - void setOpMode(); + void setOpMode(); private: void getOpMode(); + QColor opMode_Full_Color; + QColor opMode_NoTurtle_Color; + QColor opMode_Gaming_Color; + QColor opMode_Minimal_Color; + bool onUpdate; }; #endif diff --git a/retroshare-gui/src/qss/blacknight.qss b/retroshare-gui/src/qss/blacknight.qss index 286183dfc..4a454c54e 100644 --- a/retroshare-gui/src/qss/blacknight.qss +++ b/retroshare-gui/src/qss/blacknight.qss @@ -273,4 +273,22 @@ QTextEdit { color: white; } - +/* OpModeStatus need to be at end to overload other values*/ +OpModeStatus { + qproperty-opMode_Full_Color: #007000; + qproperty-opMode_NoTurtle_Color: #000070; + qproperty-opMode_Gaming_Color: #707000; + qproperty-opMode_Minimal_Color: #700000; +} +OpModeStatus[opMode="Full"] { + background: #007000; +} +OpModeStatus[opMode="NoTurtle"] { + background: #000070; +} +OpModeStatus[opMode="Gaming"] { + background: #707000; +} +OpModeStatus[opMode="Minimal"] { + background: #700000; +} diff --git a/retroshare-gui/src/qss/qdarkstyle.qss b/retroshare-gui/src/qss/qdarkstyle.qss index 2ed225cf9..ad18bd402 100644 --- a/retroshare-gui/src/qss/qdarkstyle.qss +++ b/retroshare-gui/src/qss/qdarkstyle.qss @@ -1060,3 +1060,22 @@ QStatusBar::item { border-radius: 3px; } +/* OpModeStatus need to be at end to overload other values*/ +OpModeStatus { + qproperty-opMode_Full_Color: #007000; + qproperty-opMode_NoTurtle_Color: #000070; + qproperty-opMode_Gaming_Color: #707000; + qproperty-opMode_Minimal_Color: #700000; +} +OpModeStatus[opMode="Full"] { + background: #007000; +} +OpModeStatus[opMode="NoTurtle"] { + background: #000070; +} +OpModeStatus[opMode="Gaming"] { + background: #707000; +} +OpModeStatus[opMode="Minimal"] { + background: #700000; +} From 7eb5e8e02bfead157bc6c90c6e06e0d4b6e1bc11 Mon Sep 17 00:00:00 2001 From: csoler Date: Wed, 10 May 2017 21:37:06 +0200 Subject: [PATCH 44/50] added warning when switching opmode status to non turtle for the first time --- retroshare-gui/src/gui/statusbar/OpModeStatus.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/retroshare-gui/src/gui/statusbar/OpModeStatus.cpp b/retroshare-gui/src/gui/statusbar/OpModeStatus.cpp index 230b8e131..1ae2fb354 100644 --- a/retroshare-gui/src/gui/statusbar/OpModeStatus.cpp +++ b/retroshare-gui/src/gui/statusbar/OpModeStatus.cpp @@ -20,6 +20,7 @@ ****************************************************************/ #include +#include #include #include "gui/statusbar/OpModeStatus.h" @@ -96,6 +97,19 @@ void OpModeStatus::setOpMode() QVariant var = itemData(idx); uint32_t opMode = var.toUInt(); + QString message = tr("

Warning: This Operating mode disables the tunneling service. This means you can use distant chat not anonymously download files and the mail service will be slower.

This state will be saved after restart, so do not forget that you changed it!

"); + + if(opMode == RS_OPMODE_NOTURTLE && ! Settings->getPageAlreadyDisplayed(QString("RS_OPMODE_NO_TURTLE"))) + { + QMessageBox::warning(NULL,tr("Turtle routing disabled!"),message); + Settings->setPageAlreadyDisplayed(QString("RS_OPMODE_NO_TURTLE"),true) ; + } + if( (opMode == RS_OPMODE_MINIMAL && ! Settings->getPageAlreadyDisplayed(QString("RS_OPMODE_MINIMAL")))) + { + QMessageBox::warning(NULL,tr("Turtle routing disabled!"),message); + Settings->setPageAlreadyDisplayed(QString("RS_OPMODE_MINIMAL"),true) ; + } + rsConfig->setOperatingMode(opMode); // reload to be safe. From d73e850122181458cd2e76159a82046120fddf2a Mon Sep 17 00:00:00 2001 From: defnax Date: Thu, 11 May 2017 18:14:21 +0200 Subject: [PATCH 45/50] look n feel improvements --- retroshare-gui/src/gui/HomePage.ui | 247 ++++++---- retroshare-gui/src/gui/StartDialog.ui | 217 ++++++--- retroshare-gui/src/gui/icons.qrc | 459 +++++++++--------- retroshare-gui/src/gui/icons/svg/password.svg | 54 +++ .../src/gui/qss/stylesheet/Standard.qss | 17 + 5 files changed, 605 insertions(+), 389 deletions(-) create mode 100644 retroshare-gui/src/gui/icons/svg/password.svg diff --git a/retroshare-gui/src/gui/HomePage.ui b/retroshare-gui/src/gui/HomePage.ui index d2aba3dfc..60c87b0b9 100644 --- a/retroshare-gui/src/gui/HomePage.ui +++ b/retroshare-gui/src/gui/HomePage.ui @@ -6,103 +6,15 @@ 0 0 - 1558 - 703 + 675 + 544
Form - - - - - - - - - - - 11 - - - - - - - Did you receive a certificate from a friend? - - - - - - - Add friends certificate - - - - :/icons/png/invite.png:/icons/png/invite.png - - - - 24 - 24 - - - - Qt::ToolButtonTextBesideIcon - - - false - - - - - - - Add certificate file - - - - :/icons/svg/folders1.svg:/icons/svg/folders1.svg - - - - 24 - 24 - - - - Qt::ToolButtonTextBesideIcon - - - false - - - - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - + 9 @@ -245,7 +157,7 @@ private and secure decentralized communication platform.
- + Launch startup wizard @@ -256,15 +168,149 @@ private and secure decentralized communication platform. - - - - Open Web Help + + + + - - - :/icons/settings/webinterface.svg:/icons/settings/webinterface.svg + + + + + + 11 + + + + + + + Did you receive a certificate from a friend? + + + + + + + Add friends certificate + + + + :/icons/png/invite.png:/icons/png/invite.png + + + + 24 + 24 + + + + Qt::ToolButtonTextBesideIcon + + + false + + + + + + + Add certificate file + + + + :/icons/svg/folders1.svg:/icons/svg/folders1.svg + + + + 24 + 24 + + + + Qt::ToolButtonTextBesideIcon + + + false + + + + + + + + + + QFrame::StyledPanel + + QFrame::Raised + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + 11 + + + + Do you need help with RetroShare? + + + + + + + Open Web Help + + + + :/icons/settings/webinterface.svg:/icons/settings/webinterface.svg + + + + 24 + 24 + + + + Qt::ToolButtonTextBesideIcon + + + +
@@ -273,7 +319,8 @@ private and secure decentralized communication platform. label_2 addframe runStartWizard_PB - openwebhelp + frame + helpframe
diff --git a/retroshare-gui/src/gui/StartDialog.ui b/retroshare-gui/src/gui/StartDialog.ui index 0681835e6..572df161d 100644 --- a/retroshare-gui/src/gui/StartDialog.ui +++ b/retroshare-gui/src/gui/StartDialog.ui @@ -6,8 +6,8 @@ 0 0 - 656 - 645 + 516 + 569 @@ -17,7 +17,7 @@ :/images/logo/logo_32.png:/images/logo/logo_32.png - + 0 @@ -44,7 +44,7 @@ - + Qt::Horizontal @@ -110,12 +110,12 @@ - :/images/logo/logo_splash.png + :/images/logo/logo_spash2.png - + Qt::Horizontal @@ -129,7 +129,52 @@ - + + + + Qt::Horizontal + + + QSizePolicy::Minimum + + + + 60 + 20 + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Qt::Horizontal + + + QSizePolicy::Minimum + + + + 60 + 20 + + + + + true @@ -140,35 +185,79 @@ 0 + + + - - - + + + 9 + + + + + + 22 + 22 + + - Profile - Location: + + + + :/icons/svg/person.svg + + + true - + - - + + + + + 22 + 22 + + - Password: + + + + :/icons/svg/password.svg + + + true - + QLineEdit::Password - + + + + Password: + + + + + + + Profile - Location: + + + + Remember Password @@ -178,68 +267,70 @@ + + + + + 12 + + + + Log In + + + true + + + false + + + - - - - Log In - - - true - - - false - - - - - - - Opens a dialog for creating a new profile or + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Opens a dialog for creating a new profile or adding locations to an existing profile. The current identities/locations will not be affected. - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> + + + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="Create new Profile..."><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt; text-decoration: underline; color:#0000ff;">Manage profiles and nodes...</span></a></p></body></html> - - - - - - - - 16 - 65 - - - - QFrame::NoFrame - - - QFrame::Raised - - + + + +
- - - LogoBar - QFrame -
gui/LogoBar.h
- 1 -
-
+ diff --git a/retroshare-gui/src/gui/icons.qrc b/retroshare-gui/src/gui/icons.qrc index a89ead9d8..e9b7d32bd 100644 --- a/retroshare-gui/src/gui/icons.qrc +++ b/retroshare-gui/src/gui/icons.qrc @@ -1,228 +1,235 @@ - - icons/add_user_256.png - icons/anonymous_blue_128.png - icons/anonymous_green_128.png - icons/aol.png - icons/avatar_128.png - icons/avatar_grey_128.png - icons/biohazard_red.png - icons/biohazard_yellow.png - icons/blank_blue_128.png - icons/blank_green_128.png - icons/blank_red_128.png - icons/browsable_blue_128.png - icons/browsable_green_128.png - icons/bullet_blue_128.png - icons/bullet_green_128.png - icons/bullet_green_yellow_star_128.png - icons/bullet_grey_128.png - icons/bullet_red_128.png - icons/bullet_yellow_128.png - icons/channels_128.png - icons/channels_red_128.png - icons/chat_128.png - icons/chat_red_128.png - icons/circles_128.png - icons/circles_new_128.png - icons/flag-green.png - icons/friends_128.png - icons/global_switch_off_128.png - icons/global_switch_on_128.png - icons/gmail.png - icons/help_128.png - icons/help_64.png - icons/information_128.png - icons/internet_128.png - icons/invite64.png - icons/knews_128.png - icons/knews_red_128.png - icons/konversation_128.png - icons/konversation128.png - icons/konversation_red_128.png - icons/ktorrent_128.png - icons/ktorrent_red_128.png - icons/logo_0_connected_128.png - icons/logo_128.png - icons/logo_1_connected_128.png - icons/logo_2_connected_128.png - icons/mail_128.png - icons/mail_old_128.png - icons/mail_red_128.png - icons/newsfeed128.png - icons/outlook.png - icons/plugins_128.png - icons/png/add.png - icons/png/attach-image.png - icons/png/attach.png - icons/png/channels-notify.png - icons/png/channels.png - icons/png/chat-bubble-notify.png - icons/png/chat-bubble.png - icons/png/chat-lobbies-notify.png - icons/png/chat-lobbies.png - icons/png/circles.png - icons/png/empty-circle.png - icons/png/exit.png - icons/png/feedreader-notify.png - icons/png/feedreader.png - icons/png/filesharing-notify.png - icons/png/filesharing.png - icons/png/font.png - icons/png/forums-notify.png - icons/png/forums.png - icons/png/fullscreen_arrows.png - icons/png/highlight.png - icons/png/info.png - icons/png/invite.png - icons/png/keyring.png - icons/png/leave.png - icons/png/messages-notify.png - icons/png/messages.png - icons/png/microphone_mute.png - icons/png/microphone.png - icons/png/netgraph.png - icons/png/network-notify.png - icons/png/network.png - icons/png/network-puplic.png - icons/png/newsfeed-notify.png - icons/png/newsfeed.png - icons/png/options.png - icons/png/people-notify.png - icons/png/people.png - icons/png/person.png - icons/png/phone_hangup.png - icons/png/phone.png - icons/png/posted-notify.png - icons/png/posted.png - icons/png/search.png - icons/png/send-message-blocked.png - icons/png/send-message.png - icons/png/settings.png - icons/png/smiley.png - icons/png/speaker_mute.png - icons/png/speaker.png - icons/png/thumbs-down.png - icons/png/thumbs-neutral.png - icons/png/thumbs-up.png - icons/png/video.png - icons/posted_128.png - icons/posted_red_128.png - icons/quit_128.png - icons/search_red_128.png - icons/security_high_128.png - icons/security_low_128.png - icons/security_medium_128.png - icons/settings/appearance.svg - icons/settings/channels.svg - icons/settings/chat.svg - icons/settings/directories.svg - icons/settings/filesharing.svg - icons/settings/forums.svg - icons/settings/general.svg - icons/settings/messages.svg - icons/settings/network.svg - icons/settings/notify.svg - icons/settings/people.svg - icons/settings/permissions.svg - icons/settings/plugins.svg - icons/settings/posted.svg - icons/settings/profile.svg - icons/settings/server.svg - icons/settings/sound.svg - icons/settings/webinterface.svg - icons/star_overlay_128.png - icons/svg/add.svg - icons/svg/attach-image.svg - icons/svg/attach.svg - icons/svg/channels-notify.svg - icons/svg/channels.svg - icons/svg/chat-bubble-notify.svg - icons/svg/chat-bubble.svg - icons/svg/chat-lobbies-notify.svg - icons/svg/chat-lobbies.svg - icons/svg/circles.svg - icons/svg/download.svg - icons/svg/empty-circle.svg - icons/svg/exit-red.svg - icons/svg/exit.svg - icons/svg/feedreader-notify.svg - icons/svg/feedreader.svg - icons/svg/filesharing-notify.svg - icons/svg/filesharing.svg - icons/svg/folders1.svg - icons/svg/folders.svg - icons/svg/font.svg - icons/svg/forums-notify.svg - icons/svg/forums.svg - icons/svg/fullscreen_arrows.svg - icons/svg/highlight.svg - icons/svg/info.svg - icons/svg/invite.svg - icons/svg/keyring.svg - icons/svg/leave.svg - icons/svg/magnifying-glass.svg - icons/svg/messages-notify.svg - icons/svg/messages.svg - icons/svg/microphone_mute.svg - icons/svg/microphone.svg - icons/svg/netgraph.svg - icons/svg/network-notify.svg - icons/svg/network-puplic.svg - icons/svg/network.svg - icons/svg/newsfeed-notify.svg - icons/svg/newsfeed.svg - icons/svg/options.svg - icons/svg/paste.svg - icons/svg/people-notify.svg - icons/svg/people.svg - icons/svg/person.svg - icons/svg/phone_hangup.svg - icons/svg/phone.svg - icons/svg/posted-notify.svg - icons/svg/posted.svg - icons/svg/profile.svg - icons/svg/retroshare-info.svg - icons/svg/retroshare-splash.svg - icons/svg/retroshare-symbol_black_bg.svg - icons/svg/retroshare-symbol_gradients.svg - icons/svg/retroshare-symbol-minimal.svg - icons/svg/search.svg - icons/svg/send-message-blocked.svg - icons/svg/send-message.svg - icons/svg/settings.svg - icons/svg/share.svg - icons/svg/smiley.svg - icons/svg/speaker_mute.svg - icons/svg/speaker.svg - icons/svg/thumbs-down.svg - icons/svg/thumbs-neutral.svg - icons/svg/thumbs-up.svg - icons/svg/upload.svg - icons/svg/video.svg - icons/switch00_128.png - icons/switch01_128.png - icons/switch10_128.png - icons/switch11_128.png - icons/system_128.png - icons/tile_checking_48.png - icons/tile_downloaded_48.png - icons/tile_downloading_48.png - icons/tile_inactive_48.png - icons/tor-logo.png - icons/tor-off.png - icons/tor-on.png - icons/tor-starting.png - icons/tor-stopping.png - icons/user-away_64.png - icons/user-away-extended_64.png - icons/user-busy_64.png - icons/user-offline_64.png - icons/user-online_64.png - icons/void_128.png - icons/warning_red_128.png - icons/warning_yellow_128.png - icons/yahoo.png - icons/yandex.png - + + icons/svg/password.svg + icons/stars/star0.png + icons/stars/star1.png + icons/stars/star2.png + icons/stars/star3.png + icons/stars/star4.png + icons/stars/star5.png + icons/add_user_256.png + icons/anonymous_blue_128.png + icons/anonymous_green_128.png + icons/aol.png + icons/avatar_128.png + icons/avatar_grey_128.png + icons/biohazard_red.png + icons/biohazard_yellow.png + icons/blank_blue_128.png + icons/blank_green_128.png + icons/blank_red_128.png + icons/browsable_blue_128.png + icons/browsable_green_128.png + icons/bullet_blue_128.png + icons/bullet_green_128.png + icons/bullet_green_yellow_star_128.png + icons/bullet_grey_128.png + icons/bullet_red_128.png + icons/bullet_yellow_128.png + icons/channels_128.png + icons/channels_red_128.png + icons/chat_128.png + icons/chat_red_128.png + icons/circles_128.png + icons/circles_new_128.png + icons/flag-green.png + icons/friends_128.png + icons/global_switch_off_128.png + icons/global_switch_on_128.png + icons/gmail.png + icons/help_128.png + icons/help_64.png + icons/information_128.png + icons/internet_128.png + icons/invite64.png + icons/knews_128.png + icons/knews_red_128.png + icons/konversation_128.png + icons/konversation128.png + icons/konversation_red_128.png + icons/ktorrent_128.png + icons/ktorrent_red_128.png + icons/logo_0_connected_128.png + icons/logo_128.png + icons/logo_1_connected_128.png + icons/logo_2_connected_128.png + icons/mail_128.png + icons/mail_old_128.png + icons/mail_red_128.png + icons/newsfeed128.png + icons/outlook.png + icons/plugins_128.png + icons/png/add.png + icons/png/attach-image.png + icons/png/attach.png + icons/png/channels-notify.png + icons/png/channels.png + icons/png/chat-bubble-notify.png + icons/png/chat-bubble.png + icons/png/chat-lobbies-notify.png + icons/png/chat-lobbies.png + icons/png/circles.png + icons/png/empty-circle.png + icons/png/exit.png + icons/png/feedreader-notify.png + icons/png/feedreader.png + icons/png/filesharing-notify.png + icons/png/filesharing.png + icons/png/font.png + icons/png/forums-notify.png + icons/png/forums.png + icons/png/fullscreen_arrows.png + icons/png/highlight.png + icons/png/info.png + icons/png/invite.png + icons/png/keyring.png + icons/png/leave.png + icons/png/messages-notify.png + icons/png/messages.png + icons/png/microphone_mute.png + icons/png/microphone.png + icons/png/netgraph.png + icons/png/network-notify.png + icons/png/network.png + icons/png/network-puplic.png + icons/png/newsfeed-notify.png + icons/png/newsfeed.png + icons/png/options.png + icons/png/people-notify.png + icons/png/people.png + icons/png/person.png + icons/png/phone_hangup.png + icons/png/phone.png + icons/png/posted-notify.png + icons/png/posted.png + icons/png/search.png + icons/png/send-message-blocked.png + icons/png/send-message.png + icons/png/settings.png + icons/png/smiley.png + icons/png/speaker_mute.png + icons/png/speaker.png + icons/png/thumbs-down.png + icons/png/thumbs-neutral.png + icons/png/thumbs-up.png + icons/png/video.png + icons/posted_128.png + icons/posted_red_128.png + icons/quit_128.png + icons/search_red_128.png + icons/security_high_128.png + icons/security_low_128.png + icons/security_medium_128.png + icons/settings/appearance.svg + icons/settings/channels.svg + icons/settings/chat.svg + icons/settings/directories.svg + icons/settings/filesharing.svg + icons/settings/forums.svg + icons/settings/general.svg + icons/settings/messages.svg + icons/settings/network.svg + icons/settings/notify.svg + icons/settings/people.svg + icons/settings/permissions.svg + icons/settings/plugins.svg + icons/settings/posted.svg + icons/settings/profile.svg + icons/settings/server.svg + icons/settings/sound.svg + icons/settings/webinterface.svg + icons/star_overlay_128.png + icons/svg/add.svg + icons/svg/attach-image.svg + icons/svg/attach.svg + icons/svg/channels-notify.svg + icons/svg/channels.svg + icons/svg/chat-bubble-notify.svg + icons/svg/chat-bubble.svg + icons/svg/chat-lobbies-notify.svg + icons/svg/chat-lobbies.svg + icons/svg/circles.svg + icons/svg/download.svg + icons/svg/empty-circle.svg + icons/svg/exit-red.svg + icons/svg/exit.svg + icons/svg/feedreader-notify.svg + icons/svg/feedreader.svg + icons/svg/filesharing-notify.svg + icons/svg/filesharing.svg + icons/svg/folders1.svg + icons/svg/folders.svg + icons/svg/font.svg + icons/svg/forums-notify.svg + icons/svg/forums.svg + icons/svg/fullscreen_arrows.svg + icons/svg/highlight.svg + icons/svg/info.svg + icons/svg/invite.svg + icons/svg/keyring.svg + icons/svg/leave.svg + icons/svg/magnifying-glass.svg + icons/svg/messages-notify.svg + icons/svg/messages.svg + icons/svg/microphone_mute.svg + icons/svg/microphone.svg + icons/svg/netgraph.svg + icons/svg/network-notify.svg + icons/svg/network-puplic.svg + icons/svg/network.svg + icons/svg/newsfeed-notify.svg + icons/svg/newsfeed.svg + icons/svg/options.svg + icons/svg/paste.svg + icons/svg/people-notify.svg + icons/svg/people.svg + icons/svg/person.svg + icons/svg/phone_hangup.svg + icons/svg/phone.svg + icons/svg/posted-notify.svg + icons/svg/posted.svg + icons/svg/profile.svg + icons/svg/retroshare-info.svg + icons/svg/retroshare-splash.svg + icons/svg/retroshare-symbol_black_bg.svg + icons/svg/retroshare-symbol_gradients.svg + icons/svg/retroshare-symbol-minimal.svg + icons/svg/search.svg + icons/svg/send-message-blocked.svg + icons/svg/send-message.svg + icons/svg/settings.svg + icons/svg/share.svg + icons/svg/smiley.svg + icons/svg/speaker_mute.svg + icons/svg/speaker.svg + icons/svg/thumbs-down.svg + icons/svg/thumbs-neutral.svg + icons/svg/thumbs-up.svg + icons/svg/upload.svg + icons/svg/video.svg + icons/switch00_128.png + icons/switch01_128.png + icons/switch10_128.png + icons/switch11_128.png + icons/system_128.png + icons/tile_checking_48.png + icons/tile_downloaded_48.png + icons/tile_downloading_48.png + icons/tile_inactive_48.png + icons/tor-logo.png + icons/tor-off.png + icons/tor-on.png + icons/tor-starting.png + icons/tor-stopping.png + icons/user-away_64.png + icons/user-away-extended_64.png + icons/user-busy_64.png + icons/user-offline_64.png + icons/user-online_64.png + icons/void_128.png + icons/warning_red_128.png + icons/warning_yellow_128.png + icons/yahoo.png + icons/yandex.png + diff --git a/retroshare-gui/src/gui/icons/svg/password.svg b/retroshare-gui/src/gui/icons/svg/password.svg new file mode 100644 index 000000000..1ad0b352d --- /dev/null +++ b/retroshare-gui/src/gui/icons/svg/password.svg @@ -0,0 +1,54 @@ + + + +image/svg+xml \ No newline at end of file diff --git a/retroshare-gui/src/gui/qss/stylesheet/Standard.qss b/retroshare-gui/src/gui/qss/stylesheet/Standard.qss index b183eb77c..c3f0c1012 100644 --- a/retroshare-gui/src/gui/qss/stylesheet/Standard.qss +++ b/retroshare-gui/src/gui/qss/stylesheet/Standard.qss @@ -756,3 +756,20 @@ ConnectFriendWizard QFrame#friendFrame { border-radius: 6px; background: white; } + +HomePage QFrame#helpframe{ + border: 2px solid #009933; + border-radius: 6px; + background: white; +} + +StartDialog QPushButton#loadButton { + border-image: url(:/images/btn_blue.png) 4; + border-width: 4; + font: bold; + color: white; +} + +StartDialog QPushButton#loadButton:hover { + border-image: url(:/images/btn_blue_hover.png) 4; +} \ No newline at end of file From eb30af57bd2f02945ae46b27a46bc2a255a0f372 Mon Sep 17 00:00:00 2001 From: csoler Date: Thu, 11 May 2017 14:42:06 +0200 Subject: [PATCH 46/50] improved display in bw statistics --- .../src/gui/common/RSGraphWidget.cpp | 94 ++++++++++++------- retroshare-gui/src/gui/common/RSGraphWidget.h | 11 ++- .../gui/statistics/BandwidthStatsWidget.cpp | 4 + 3 files changed, 73 insertions(+), 36 deletions(-) diff --git a/retroshare-gui/src/gui/common/RSGraphWidget.cpp b/retroshare-gui/src/gui/common/RSGraphWidget.cpp index d0bbaa1dc..8f0272b55 100644 --- a/retroshare-gui/src/gui/common/RSGraphWidget.cpp +++ b/retroshare-gui/src/gui/common/RSGraphWidget.cpp @@ -59,6 +59,7 @@ RSGraphSource::RSGraphSource() #endif _timer = new QTimer ; _digits = 2 ; + _filtering_enabled = true; QObject::connect(_timer,SIGNAL(timeout()),this,SLOT(updateIfPossible())) ; } @@ -123,6 +124,9 @@ void RSGraphSource::getDataPoints(int index,std::vector& pts,float filt pts.clear() ; qint64 now = getTime() ; + if(!_filtering_enabled) + filter_factor = 0 ; + std::map > >::const_iterator it = _points.begin(); int n=0; @@ -267,11 +271,13 @@ RSGraphWidget::RSGraphWidget(QWidget *parent) _timer = new QTimer ; QObject::connect(_timer,SIGNAL(timeout()),this,SLOT(updateIfPossible())) ; + _y_scale = 1.0f ; _timer->start(1000); float FS = QFontMetricsF(font()).height(); setMinimumHeight(12*FS); + _graph_base = FS*GRAPH_BASE; } void RSGraphWidget::updateIfPossible() @@ -292,7 +298,13 @@ RSGraphWidget::~RSGraphWidget() delete _source ; } -/** Gets the width of the desktop, which is the maximum number of points +void RSGraphWidget::setFiltering(bool b) +{ + if(_source != NULL) + _source->setFiltering(b) ; +} + +/** Gets the width of the desktop, which is the maximum number of points * we can plot in the graph. */ int RSGraphWidget::getNumPoints() @@ -465,42 +477,43 @@ void RSGraphWidget::pointsFromData(const std::vector& values,QVector= SCALE_WIDTH*fact && last_px < SCALE_WIDTH*fact) + if(!(_flags & RSGRAPH_FLAGS_PAINT_STYLE_DOTS)) { - float alpha = (SCALE_WIDTH*fact - last_px)/(px - last_px) ; - float ipx = SCALE_WIDTH*fact ; - float ipy = (1-alpha)*last_py + alpha*py ; + if(px >= SCALE_WIDTH*fact && last_px < SCALE_WIDTH*fact) + { + float alpha = (SCALE_WIDTH*fact - last_px)/(px - last_px) ; + float ipx = SCALE_WIDTH*fact ; + float ipy = (1-alpha)*last_py + alpha*py ; - points << QPointF(ipx,y) ; - points << QPointF(ipx,ipy) ; - } - else if(i==0) - { - if(px < SCALE_WIDTH*fact) - points << QPointF(SCALE_WIDTH*fact,py) ; - else - points << QPointF(px,y) ; + points << QPointF(ipx,y - _graph_base) ; + points << QPointF(ipx,ipy) ; + } + else if(i==0) + { + if(px < SCALE_WIDTH*fact) + points << QPointF(SCALE_WIDTH*fact,py) ; + else + points << QPointF(px,y - _graph_base) ; + } } if(px < SCALE_WIDTH*fact) continue ; + if((_flags & RSGRAPH_FLAGS_PAINT_STYLE_DOTS) && values[i].y() == 0) + continue ; + _maxValue = std::max(_maxValue,values[i].y()) ; // remove midle point when 3 consecutive points have the same value. - if(points.size() > 1 && points[points.size()-2].y() == points.back().y() && points.back().y() == py) - points.pop_back() ; - - // if(fabs(px - last_px)/_time_scale > min_x_no_data_threshold) - // { - // points << QPointF(last_px,y) ; - // points << QPointF(px,y) ; - // } + if(!(_flags & RSGRAPH_FLAGS_PAINT_STYLE_DOTS)) + if(points.size() > 1 && points[points.size()-2].y() == points.back().y() && points.back().y() == py) + points.pop_back() ; points << QPointF(px,py) ; - if(i==values.size()-1) + if(!(_flags & RSGRAPH_FLAGS_PAINT_STYLE_DOTS) && (i==values.size()-1)) points << QPointF(px,y) ; last_px = px ; @@ -512,17 +525,17 @@ void RSGraphWidget::pointsFromData(const std::vector& values,QVectorpoints. The area will be @@ -560,7 +573,7 @@ void RSGraphWidget::paintDots(const QVector& points, QColor color) _painter->setBrush(QBrush(color)); for(int i=0;idrawEllipse(QRect(points[i].x(),points[i].y(),5*_linewidthscale,5*_linewidthscale)) ; + _painter->drawEllipse(QRect(points[i].x()-2.5*_linewidthscale,points[i].y()-2.5*_linewidthscale,5*_linewidthscale,5*_linewidthscale)) ; _painter->setPen(oldPen); _painter->setBrush(oldBrush); @@ -603,8 +616,8 @@ void RSGraphWidget::paintScale1() float fact = FS/14.0 ; int top = _rec.y(); - int bottom = _rec.height(); - qreal paintStep = (bottom - (bottom/10)) / 4; + int bottom = _rec.height() - _graph_base; + qreal paintStep = (bottom - top) / 5; /* Draw the other marks in their correctly scaled locations */ qreal scale; @@ -615,16 +628,23 @@ void RSGraphWidget::paintScale1() QString unit_name = _source->unitName() ; - for (int i = 1; i < 5; i++) + for (int i = 0; i < 5; i++) { - pos = bottom - (i * paintStep); + pos = bottom - (i * paintStep) ; - scale = pixelsToValue(i * paintStep); + scale = pixelsToValue(_graph_base + i * paintStep); + + // If legend contains integers only the value should be rounded to the nearest integer + if(_flags & RSGRAPH_FLAGS_LEGEND_INTEGER) + { + scale = (int)scale ; + pos = bottom - (valueToPixels(scale) - _graph_base) ; + } QString text = _source->displayValue(scale) ; _painter->setPen(SCALE_COLOR); - _painter->drawText(QPointF(5*fact, pos+0.5*FS), text); + _painter->drawText(QPointF(5*fact, pos+0.4*FS), text); _painter->setPen(GRID_COLOR); _painter->drawLine(QPointF(SCALE_WIDTH*fact, pos), QPointF(_rec.width(), pos)); } @@ -710,7 +730,11 @@ void RSGraphWidget::paintLegend() QString text = _source->legend(i,vals[i]) ; QPen oldPen = _painter->pen(); - _painter->setPen(QPen(getColor(i), Qt::SolidLine)); + + QPen pen(getColor(i), Qt::SolidLine) ; + pen.setWidth(_linewidthscale); + + _painter->setPen(pen); _painter->drawLine(QPointF(SCALE_WIDTH*fact+10.0*fact, pos+FS/3), QPointF(SCALE_WIDTH*fact+30.0*fact, pos+FS/3)); _painter->setPen(oldPen); diff --git a/retroshare-gui/src/gui/common/RSGraphWidget.h b/retroshare-gui/src/gui/common/RSGraphWidget.h index b57833d51..cb49c9ea2 100644 --- a/retroshare-gui/src/gui/common/RSGraphWidget.h +++ b/retroshare-gui/src/gui/common/RSGraphWidget.h @@ -32,8 +32,9 @@ #include +#define GRAPH_BASE 2 /** Position of the 0 of the scale, in count of the text height */ #define SCALE_WIDTH 75 /** Width of the scale */ -#define MINUSER_SCALE 2000 /** 2000 users is the minimum scale */ +#define MINUSER_SCALE 2000 /** 2000 users is the minimum scale */ #define SCROLL_STEP 4 /** Horizontal change on graph update */ #define BACK_COLOR Qt::white @@ -87,6 +88,9 @@ public: // Sets the time period for collecting new values. Units=milliseconds. void setCollectionTimePeriod(qint64 msecs) ; + // Enables/disables time filtering of the data + void setFiltering(bool b) { _filtering_enabled = b; } + void setDigits(int d) { _digits = d ;} protected slots: @@ -112,6 +116,7 @@ protected: qint64 _update_period_msecs ; qint64 _time_orig_msecs ; int _digits ; + bool _filtering_enabled ; }; class RSGraphWidget: public QFrame @@ -127,6 +132,7 @@ public: static const uint32_t RSGRAPH_FLAGS_PAINT_STYLE_FLAT = 0x0020 ;// do not interpolate, and draw flat colored boxes static const uint32_t RSGRAPH_FLAGS_LEGEND_CUMULATED = 0x0040 ;// show the total in the legend rather than current values static const uint32_t RSGRAPH_FLAGS_PAINT_STYLE_DOTS = 0x0080 ;// use dots + static const uint32_t RSGRAPH_FLAGS_LEGEND_INTEGER = 0x0100 ;// use integer number in the legend, and move the lines to match integers /** Bandwidth graph style. */ enum GraphStyle @@ -156,6 +162,8 @@ public: void setShowEntry(uint32_t entry, bool show) ; void setCurvesOpacity(float f) ; + void setFiltering(bool b) ; + void setFlags(uint32_t flag) { _flags |= flag ; } void resetFlags(uint32_t flag) { _flags &= ~flag ; } protected: @@ -209,6 +217,7 @@ private: /** The maximum number of points to store. */ qreal _y_scale ; qreal _opacity ; + qreal _graph_base; qreal pixelsToValue(qreal) ; qreal valueToPixels(qreal) ; diff --git a/retroshare-gui/src/gui/statistics/BandwidthStatsWidget.cpp b/retroshare-gui/src/gui/statistics/BandwidthStatsWidget.cpp index 9fd2dfa3c..8c04ed9d0 100644 --- a/retroshare-gui/src/gui/statistics/BandwidthStatsWidget.cpp +++ b/retroshare-gui/src/gui/statistics/BandwidthStatsWidget.cpp @@ -202,12 +202,16 @@ void BandwidthStatsWidget::updateUnitSelection(int n) { ui.bwgraph_BW->setUnit(BWGraphSource::UNIT_KILOBYTES) ; ui.bwgraph_BW->resetFlags(RSGraphWidget::RSGRAPH_FLAGS_PAINT_STYLE_DOTS); + ui.bwgraph_BW->resetFlags(RSGraphWidget::RSGRAPH_FLAGS_LEGEND_INTEGER); ui.legend_CB->setItemText(1,tr("Average")); + ui.bwgraph_BW->setFiltering(true) ; } else { ui.bwgraph_BW->setUnit(BWGraphSource::UNIT_COUNT) ; ui.bwgraph_BW->setFlags(RSGraphWidget::RSGRAPH_FLAGS_PAINT_STYLE_DOTS); + ui.bwgraph_BW->setFlags(RSGraphWidget::RSGRAPH_FLAGS_LEGEND_INTEGER); + ui.bwgraph_BW->setFiltering(false) ; ui.legend_CB->setItemText(1,tr("Total")); } } From 7a19deea030a673567283a0c229d99f22d2c936b Mon Sep 17 00:00:00 2001 From: csoler Date: Thu, 11 May 2017 14:52:26 +0200 Subject: [PATCH 47/50] small fix to statistics view --- retroshare-gui/src/gui/common/RSGraphWidget.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/retroshare-gui/src/gui/common/RSGraphWidget.cpp b/retroshare-gui/src/gui/common/RSGraphWidget.cpp index 8f0272b55..0f25d8168 100644 --- a/retroshare-gui/src/gui/common/RSGraphWidget.cpp +++ b/retroshare-gui/src/gui/common/RSGraphWidget.cpp @@ -644,7 +644,7 @@ void RSGraphWidget::paintScale1() QString text = _source->displayValue(scale) ; _painter->setPen(SCALE_COLOR); - _painter->drawText(QPointF(5*fact, pos+0.4*FS), text); + _painter->drawText(QPointF(SCALE_WIDTH*fact - QFontMetricsF(font()).width(text) - 4*fact, pos+0.4*FS), text); _painter->setPen(GRID_COLOR); _painter->drawLine(QPointF(SCALE_WIDTH*fact, pos), QPointF(_rec.width(), pos)); } From 38d07430b7e7a8571348799007741baa126eda60 Mon Sep 17 00:00:00 2001 From: csoler Date: Thu, 11 May 2017 18:46:40 +0200 Subject: [PATCH 48/50] used more saturated colors in stats graph --- .../src/gui/common/RSGraphWidget.cpp | 22 ++++++++++++------- retroshare-gui/src/gui/common/RSGraphWidget.h | 2 +- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/retroshare-gui/src/gui/common/RSGraphWidget.cpp b/retroshare-gui/src/gui/common/RSGraphWidget.cpp index 0f25d8168..baf94dd25 100644 --- a/retroshare-gui/src/gui/common/RSGraphWidget.cpp +++ b/retroshare-gui/src/gui/common/RSGraphWidget.cpp @@ -385,12 +385,16 @@ default: } } -QColor RSGraphWidget::getColor(int i) +QColor RSGraphWidget::getColor(const std::string& name) { - // shuffle the colors a little bit - int h = (i*86243)%359 ; + uint32_t r = 57 ; + for(uint32_t i=0;i points ; pointsFromData(values,points) ; + QColor pcolor = getColor(source.displayName(i).toStdString()) ; + /* Plot the bandwidth data as area graphs */ if (_flags & RSGRAPH_FLAGS_PAINT_STYLE_PLAIN) - paintIntegral(points, getColor(i), _opacity); + paintIntegral(points, pcolor, _opacity); /* Plot the bandwidth as solid lines. If the graph style is currently an * area graph, we end up outlining the integrals. */ if(_flags & RSGRAPH_FLAGS_PAINT_STYLE_DOTS) - paintDots(points, getColor(i)); + paintDots(points, pcolor); else - paintLine(points, getColor(i)); + paintLine(points, pcolor); } if(_maxValue > 0.0f) { @@ -731,7 +737,7 @@ void RSGraphWidget::paintLegend() QPen oldPen = _painter->pen(); - QPen pen(getColor(i), Qt::SolidLine) ; + QPen pen(getColor(_source->displayName(i).toStdString()), Qt::SolidLine) ; pen.setWidth(_linewidthscale); _painter->setPen(pen); diff --git a/retroshare-gui/src/gui/common/RSGraphWidget.h b/retroshare-gui/src/gui/common/RSGraphWidget.h index cb49c9ea2..7c88086f4 100644 --- a/retroshare-gui/src/gui/common/RSGraphWidget.h +++ b/retroshare-gui/src/gui/common/RSGraphWidget.h @@ -191,7 +191,7 @@ private: void paintScale1(); void paintScale2(); - QColor getColor(int i) ; + QColor getColor(const std::string &name) ; /** Returns a formatted string representation of total. */ QString totalToStr(qreal total); From 837fcd7989a46e5ebd4572053c7451ada70da2e2 Mon Sep 17 00:00:00 2001 From: defnax Date: Fri, 12 May 2017 18:29:39 +0200 Subject: [PATCH 49/50] Added Placeholder text for Password field, removed "Password:" label. --- retroshare-gui/src/gui/StartDialog.ui | 30 ++++++++++++--------------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/retroshare-gui/src/gui/StartDialog.ui b/retroshare-gui/src/gui/StartDialog.ui index 572df161d..4665dfdc0 100644 --- a/retroshare-gui/src/gui/StartDialog.ui +++ b/retroshare-gui/src/gui/StartDialog.ui @@ -195,6 +195,13 @@ 9 + + + + Profile - Location: + + + @@ -217,7 +224,7 @@ - + @@ -236,28 +243,17 @@ - + QLineEdit::Password - - - - - - Password: + + Password - - - - Profile - Location: - - - - + Remember Password @@ -267,7 +263,7 @@ - + From 2f17a8010343e27b4f8595b4632e85ebacfd319f Mon Sep 17 00:00:00 2001 From: defnax Date: Fri, 12 May 2017 21:39:50 +0200 Subject: [PATCH 50/50] added missed icons --- retroshare-gui/src/gui/icons/stars/star0.png | Bin 0 -> 7190 bytes retroshare-gui/src/gui/icons/stars/star0.svg | 131 +++++++++ retroshare-gui/src/gui/icons/stars/star1.png | Bin 0 -> 6561 bytes retroshare-gui/src/gui/icons/stars/star1.svg | 157 +++++++++++ retroshare-gui/src/gui/icons/stars/star2.png | Bin 0 -> 6560 bytes retroshare-gui/src/gui/icons/stars/star2.svg | 184 +++++++++++++ retroshare-gui/src/gui/icons/stars/star3.png | Bin 0 -> 5710 bytes retroshare-gui/src/gui/icons/stars/star3.svg | 210 ++++++++++++++ retroshare-gui/src/gui/icons/stars/star4.png | Bin 0 -> 5668 bytes retroshare-gui/src/gui/icons/stars/star4.svg | 237 ++++++++++++++++ retroshare-gui/src/gui/icons/stars/star5.png | Bin 0 -> 5267 bytes retroshare-gui/src/gui/icons/stars/star5.svg | 271 +++++++++++++++++++ 12 files changed, 1190 insertions(+) create mode 100644 retroshare-gui/src/gui/icons/stars/star0.png create mode 100644 retroshare-gui/src/gui/icons/stars/star0.svg create mode 100644 retroshare-gui/src/gui/icons/stars/star1.png create mode 100644 retroshare-gui/src/gui/icons/stars/star1.svg create mode 100644 retroshare-gui/src/gui/icons/stars/star2.png create mode 100644 retroshare-gui/src/gui/icons/stars/star2.svg create mode 100644 retroshare-gui/src/gui/icons/stars/star3.png create mode 100644 retroshare-gui/src/gui/icons/stars/star3.svg create mode 100644 retroshare-gui/src/gui/icons/stars/star4.png create mode 100644 retroshare-gui/src/gui/icons/stars/star4.svg create mode 100644 retroshare-gui/src/gui/icons/stars/star5.png create mode 100644 retroshare-gui/src/gui/icons/stars/star5.svg diff --git a/retroshare-gui/src/gui/icons/stars/star0.png b/retroshare-gui/src/gui/icons/stars/star0.png new file mode 100644 index 0000000000000000000000000000000000000000..a7dc2a47717289971cbe73d73623a30466758c4b GIT binary patch literal 7190 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 + + +image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/retroshare-gui/src/gui/icons/stars/star1.png b/retroshare-gui/src/gui/icons/stars/star1.png new file mode 100644 index 0000000000000000000000000000000000000000..875eecbb635639fbeee8b29467f79c1713b20971 GIT binary patch literal 6561 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 F`ai|1o>2e* literal 0 HcmV?d00001 diff --git a/retroshare-gui/src/gui/icons/stars/star1.svg b/retroshare-gui/src/gui/icons/stars/star1.svg new file mode 100644 index 000000000..f30284678 --- /dev/null +++ b/retroshare-gui/src/gui/icons/stars/star1.svg @@ -0,0 +1,157 @@ + + + +image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/retroshare-gui/src/gui/icons/stars/star2.png b/retroshare-gui/src/gui/icons/stars/star2.png new file mode 100644 index 0000000000000000000000000000000000000000..507e728987392962ee2035d025c36f68e52a46ec GIT binary patch literal 6560 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 AZvX%Q literal 0 HcmV?d00001 diff --git a/retroshare-gui/src/gui/icons/stars/star2.svg b/retroshare-gui/src/gui/icons/stars/star2.svg new file mode 100644 index 000000000..0b68c74a6 --- /dev/null +++ b/retroshare-gui/src/gui/icons/stars/star2.svg @@ -0,0 +1,184 @@ + + + +image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/retroshare-gui/src/gui/icons/stars/star3.png b/retroshare-gui/src/gui/icons/stars/star3.png new file mode 100644 index 0000000000000000000000000000000000000000..654ae5319dfacc261e8070d7e239d5332a1fb4bb GIT binary patch literal 5710 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 + + +image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/retroshare-gui/src/gui/icons/stars/star4.png b/retroshare-gui/src/gui/icons/stars/star4.png new file mode 100644 index 0000000000000000000000000000000000000000..0a6769f139ece375da317b3ddc1c0616637fd7d6 GIT binary patch literal 5668 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 W{q>cB%VRXr1=LkuC|4`OBmM_qSiTYf literal 0 HcmV?d00001 diff --git a/retroshare-gui/src/gui/icons/stars/star4.svg b/retroshare-gui/src/gui/icons/stars/star4.svg new file mode 100644 index 000000000..af9ca8469 --- /dev/null +++ b/retroshare-gui/src/gui/icons/stars/star4.svg @@ -0,0 +1,237 @@ + + + +image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/retroshare-gui/src/gui/icons/stars/star5.png b/retroshare-gui/src/gui/icons/stars/star5.png new file mode 100644 index 0000000000000000000000000000000000000000..dd6f15dd92052f8f3a0eef9b4f9ed677bdc03369 GIT binary patch literal 5267 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 + + +image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file