diff --git a/.gitignore b/.gitignore index eb9b055b3..85b1c28a6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,8 @@ /RetroShare.pro.user *.o +*.sw? +*.so +*.so.* moc_*.cpp qrc_*.cpp ui_*.h diff --git a/build_scripts/Debian+Ubuntu/changelog b/build_scripts/Debian+Ubuntu/changelog index 31a9a39fa..22357aac9 100644 --- a/build_scripts/Debian+Ubuntu/changelog +++ b/build_scripts/Debian+Ubuntu/changelog @@ -1,5 +1,11 @@ retroshare06 (0.6.0-1.XXXXXX~YYYYYY) YYYYYY; urgency=low + 9f7ef8b csoler Tue, 28 Jun 2016 20:59:56 -0400 fixed possible cross deadlocks between RsGxsGenExchange and RsGxsNetService + 00bdc50 csoler Tue, 28 Jun 2016 17:56:37 -0400 updated changelog + bb82b6e csoler Tue, 28 Jun 2016 14:35:59 -0400 Merge pull request #429 from PhenomRetroShare/Fix_StandardQSS + 456751a Phenom Tue, 28 Jun 2016 20:23:32 +0200 Fix ProgressBar Chunk with Standard.qss + 019ed12 csoler Tue, 28 Jun 2016 12:37:04 -0400 Merge pull request #428 from sehraf/pr-fix-udp + ea07a13 sehraf Tue, 28 Jun 2016 17:37:22 +0200 fix TcpPacket::readPacket c15c979 csoler Mon, 27 Jun 2016 17:17:28 +0100 Merge pull request #426 from sehraf/pr-disable-dht-stunner ff86678 csoler Sun, 26 Jun 2016 23:14:01 -0400 clear error queue before calling SSL_read()/SSL_write(), to avoid remaining errors to corrupt the next connection attempts and cause disconnections 31089d7 csoler Sat, 25 Jun 2016 19:12:35 +0100 added auto-clean of pending data in pqistreamer after connection is closed, to avoid confusing the peer after re-connecting (probably not the cause of the SSL error) diff --git a/libbitdht/src/udp/udpstack.cc b/libbitdht/src/udp/udpstack.cc index 381fc182d..a66f4c6e2 100644 --- a/libbitdht/src/udp/udpstack.cc +++ b/libbitdht/src/udp/udpstack.cc @@ -87,8 +87,10 @@ bool UdpStack::getLocalAddress(struct sockaddr_in &local) bool UdpStack::resetAddress(struct sockaddr_in &local) { - std::cerr << "UdpStack::resetAddress(" << local << ")"; +#ifdef DEBUG_UDP_RECV + std::cerr << "UdpStack::resetAddress(" << local << ")"; std::cerr << std::endl; +#endif laddr = local; return udpLayer->reset(local); diff --git a/libretroshare/src/chat/distributedchat.cc b/libretroshare/src/chat/distributedchat.cc index 88460f1f7..2ed75fd1b 100644 --- a/libretroshare/src/chat/distributedchat.cc +++ b/libretroshare/src/chat/distributedchat.cc @@ -34,7 +34,6 @@ #include "pqi/p3historymgr.h" #include "retroshare/rspeers.h" #include "retroshare/rsiface.h" -#include "retroshare/rsreputations.h" #include "retroshare/rsidentity.h" #include "rsserver/p3face.h" #include "gxs/rsgixs.h" @@ -139,7 +138,7 @@ bool DistributedChatService::handleRecvChatLobbyMsgItem(RsChatMsgItem *ci) return false ; } - if(rsReputations->isIdentityBanned(cli->signature.keyId)) + if(rsIdentity->isBanned(cli->signature.keyId)) { std::cerr << "(WW) Received lobby msg/item from banned identity " << cli->signature.keyId << ". Dropping it." << std::endl; return false ; @@ -648,7 +647,7 @@ void DistributedChatService::handleRecvChatLobbyEventItem(RsChatLobbyEventItem * #endif time_t now = time(NULL) ; - if(rsReputations->isIdentityBanned(item->signature.keyId)) + if(rsIdentity->isBanned(item->signature.keyId)) { std::cerr << "(WW) Received lobby msg/item from banned identity " << item->signature.keyId << ". Dropping it." << std::endl; return ; diff --git a/libretroshare/src/dbase/fimonitor.cc b/libretroshare/src/dbase/fimonitor.cc index c4f60ee81..765798484 100644 --- a/libretroshare/src/dbase/fimonitor.cc +++ b/libretroshare/src/dbase/fimonitor.cc @@ -431,7 +431,7 @@ int FileIndexMonitor::filterResults(std::list& firesults,std::list& parent_groups) const +bool FileIndexMonitor::findLocalFile(const RsFileHash& hash,FileSearchFlags hint_flags, const RsPeerId& peer_id,std::string &fullpath, uint64_t &size,FileStorageFlags& storage_flags,std::list& parent_groups) const { std::list results; bool ok = false; @@ -1668,7 +1668,7 @@ int FileIndexMonitor::RequestDirDetails(void *ref, DirDetails &details, FileSear return true ; } -void FileIndexMonitor::locked_findShareFlagsAndParentGroups(FileEntry *file,FileStorageFlags& flags,std::list& parent_groups) const +void FileIndexMonitor::locked_findShareFlagsAndParentGroups(FileEntry *file,FileStorageFlags& flags,std::list& parent_groups) const { flags.clear() ; static const FileStorageFlags PERMISSION_MASK = DIR_FLAGS_BROWSABLE_OTHERS | DIR_FLAGS_NETWORK_WIDE_OTHERS | DIR_FLAGS_BROWSABLE_GROUPS | DIR_FLAGS_NETWORK_WIDE_GROUPS ; diff --git a/libretroshare/src/dbase/fimonitor.h b/libretroshare/src/dbase/fimonitor.h index dc616625d..f57ebb5c8 100644 --- a/libretroshare/src/dbase/fimonitor.h +++ b/libretroshare/src/dbase/fimonitor.h @@ -110,7 +110,7 @@ class FileIndexMonitor: public CacheSource, public RsTickingThread virtual ~FileIndexMonitor(); /* external interface for filetransfer */ - bool findLocalFile(const RsFileHash& hash,FileSearchFlags flags,const RsPeerId& peer_id, std::string &fullpath, uint64_t &size,FileStorageFlags& storage_flags,std::list& parent_groups) const; + bool findLocalFile(const RsFileHash& hash,FileSearchFlags flags,const RsPeerId& peer_id, std::string &fullpath, uint64_t &size,FileStorageFlags& storage_flags,std::list& parent_groups) const; int SearchKeywords(std::list keywords, std::list &results,FileSearchFlags flags,const RsPeerId& peer_id) ; int SearchBoolExp(Expression *exp, std::list &results,FileSearchFlags flags,const RsPeerId& peer_id) const ; @@ -176,7 +176,7 @@ class FileIndexMonitor: public CacheSource, public RsTickingThread time_t locked_saveFileIndexes(bool update_cache) ; // Finds the share flags associated with this file entry. - void locked_findShareFlagsAndParentGroups(FileEntry *fe,FileStorageFlags& shareflags,std::list& parent_groups) const ; + void locked_findShareFlagsAndParentGroups(FileEntry *fe, FileStorageFlags& shareflags, std::list &parent_groups) const ; std::string locked_findRealRoot(std::string base) const; diff --git a/libretroshare/src/ft/ftdbase.cc b/libretroshare/src/ft/ftdbase.cc index fd0285552..ef68304d8 100644 --- a/libretroshare/src/ft/ftdbase.cc +++ b/libretroshare/src/ft/ftdbase.cc @@ -25,6 +25,7 @@ #include "ft/ftdbase.h" #include "util/rsdir.h" +#include "retroshare/rspeers.h" #include "serialiser/rsconfigitems.h" @@ -237,11 +238,13 @@ bool ftFiMonitor::saveList(bool &cleanup, std::list& sList) for(it = dirList.begin(); it != dirList.end(); ++it) { - RsFileConfigItem *fi = new RsFileConfigItem(); + RsFileConfigItem *fi = new RsFileConfigItem(); fi->file.path = (*it).filename ; fi->file.name = (*it).virtualname ; fi->flags = (*it).shareflags.toUInt32() ; - fi->parent_groups = (*it).parent_groups ; + + for(std::list::const_iterator it2( (*it).parent_groups.begin());it2!=(*it).parent_groups.end();++it2) + fi->parent_groups.ids.insert(*it2) ; sList.push_back(fi); } @@ -332,25 +335,53 @@ bool ftFiMonitor::loadList(std::list& load) continue ; } - RsFileConfigItem *fi = dynamic_cast(*it); - if (!fi) - { - delete (*it); - continue; - } + // 07/05/2016 - This ensures backward compatibility. Can be removed in a few weeks. + RsFileConfigItem_deprecated *fib = dynamic_cast(*it); + if (fib) + { + /* ensure that it exists? */ - /* ensure that it exists? */ + SharedDirInfo info ; + info.filename = RsDirUtil::convertPathToUnix(fib->file.path); + info.virtualname = fib->file.name; + info.shareflags = FileStorageFlags(fib->flags) ; + info.shareflags &= PERMISSION_MASK ; + info.shareflags &= ~DIR_FLAGS_NETWORK_WIDE_GROUPS ; // disabling this flag for know, for consistency reasons - SharedDirInfo info ; - info.filename = RsDirUtil::convertPathToUnix(fi->file.path); - info.virtualname = fi->file.name; - info.parent_groups = fi->parent_groups; - info.shareflags = FileStorageFlags(fi->flags) ; - info.shareflags &= PERMISSION_MASK ; - info.shareflags &= ~DIR_FLAGS_NETWORK_WIDE_GROUPS ; // disabling this flag for know, for consistency reasons + for(std::list::const_iterator itt(fib->parent_groups.begin());itt!=fib->parent_groups.end();++itt) + { + RsGroupInfo ginfo; + + if(rsPeers->getGroupInfoByName(*itt,ginfo) ) + { + info.parent_groups.push_back(ginfo.id) ; + std::cerr << "(II) converted old group ID \"" << *itt << "\" into corresponding new group id " << ginfo.id << std::endl; + } + else + std::cerr << "(EE) cannot convert old group ID \"" << *itt << "\" into corresponding new group id: no candidate found. " << std::endl; + } + + dirList.push_back(info) ; + } + + RsFileConfigItem *fi = dynamic_cast(*it); + if (fi) + { + /* ensure that it exists? */ + + SharedDirInfo info ; + info.filename = RsDirUtil::convertPathToUnix(fi->file.path); + info.virtualname = fi->file.name; + info.shareflags = FileStorageFlags(fi->flags) ; + info.shareflags &= PERMISSION_MASK ; + info.shareflags &= ~DIR_FLAGS_NETWORK_WIDE_GROUPS ; // disabling this flag for know, for consistency reasons + + for(std::set::const_iterator itt(fi->parent_groups.ids.begin());itt!=fi->parent_groups.ids.end();++itt) + info.parent_groups.push_back(*itt) ; + + dirList.push_back(info) ; + } - dirList.push_back(info) ; - delete *it ; } diff --git a/libretroshare/src/ft/ftextralist.cc b/libretroshare/src/ft/ftextralist.cc index d2fb76151..094e07c8d 100644 --- a/libretroshare/src/ft/ftextralist.cc +++ b/libretroshare/src/ft/ftextralist.cc @@ -395,7 +395,7 @@ bool ftExtraList::saveList(bool &cleanup, std::list& sList) std::map::const_iterator it; for(it = mFiles.begin(); it != mFiles.end(); ++it) { - RsFileConfigItem *fi = new RsFileConfigItem(); + RsFileConfigItem_deprecated *fi = new RsFileConfigItem_deprecated(); fi->file.path = (it->second).info.path; fi->file.name = (it->second).info.fname; fi->file.hash = (it->second).info.hash; @@ -428,7 +428,7 @@ bool ftExtraList::loadList(std::list& load) for(it = load.begin(); it != load.end(); ++it) { - RsFileConfigItem *fi = dynamic_cast(*it); + RsFileConfigItem_deprecated *fi = dynamic_cast(*it); if (!fi) { delete (*it); diff --git a/libretroshare/src/grouter/p3grouter.cc b/libretroshare/src/grouter/p3grouter.cc index 9b6f9a8de..1d698881c 100644 --- a/libretroshare/src/grouter/p3grouter.cc +++ b/libretroshare/src/grouter/p3grouter.cc @@ -191,7 +191,6 @@ #include "turtle/p3turtle.h" #include "gxs/rsgixs.h" #include "retroshare/rspeers.h" -#include "retroshare/rsreputations.h" #include "p3grouter.h" #include "grouteritems.h" @@ -1994,7 +1993,7 @@ bool p3GRouter::verifySignedDataItem(RsGRouterAbstractMsgItem *item,uint32_t& er { try { - if(rsReputations->isIdentityBanned(item->signature.keyId)) + if(rsIdentity->isBanned(item->signature.keyId)) { std::cerr << "(WW) received global router message from banned identity " << item->signature.keyId << ". Rejecting the message." << std::endl; return false ; diff --git a/libretroshare/src/gxs/rsdataservice.cc b/libretroshare/src/gxs/rsdataservice.cc index c0fe58f4d..b8eadb55d 100644 --- a/libretroshare/src/gxs/rsdataservice.cc +++ b/libretroshare/src/gxs/rsdataservice.cc @@ -27,6 +27,7 @@ /***** * #define RS_DATA_SERVICE_DEBUG 1 * #define RS_DATA_SERVICE_DEBUG_TIME 1 + * #define RS_DATA_SERVICE_DEBUG_CACHE 1 ****/ #include @@ -123,6 +124,7 @@ RsDataService::RsDataService(const std::string &serviceDir, const std::string &d : RsGeneralDataService(), mDbMutex("RsDataService"), mServiceDir(serviceDir), mDbName(dbName), mDbPath(mServiceDir + "/" + dbName), mServType(serviceType), mDb(NULL) { bool isNewDatabase = !RsDirUtil::fileExists(mDbPath); + mGrpMetaDataCache_ContainsAllDatabase = false ; mDb = new RetroDb(mDbPath, RetroDb::OPEN_READWRITE_CREATE, key); @@ -1231,6 +1233,9 @@ int RsDataService::retrieveGxsMsgMetaData(const GxsMsgReq& reqIds, GxsMsgMetaRes if (c) { locked_retrieveMsgMeta(c, metaSet); +#ifdef RS_DATA_SERVICE_DEBUG_CACHE + std::cerr << "Retrieving (all) Msg metadata grpId=" << grpId << ", " << std::dec << metaSet.size() << " messages" << std::endl; +#endif } }else{ @@ -1245,6 +1250,9 @@ int RsDataService::retrieveGxsMsgMetaData(const GxsMsgReq& reqIds, GxsMsgMetaRes if (c) { locked_retrieveMsgMeta(c, metaSet); +#ifdef RS_DATA_SERVICE_DEBUG_CACHE + std::cerr << "Retrieving Msg metadata grpId=" << grpId << ", " << std::dec << metaSet.size() << " messages" << std::endl; +#endif } } } @@ -1296,11 +1304,21 @@ int RsDataService::retrieveGxsGrpMetaData(std::map::const_iterator it(mGrpMetaDataCache.begin());it!=mGrpMetaDataCache.end();++it) + grp[it->first] = new RsGxsGrpMetaData(it->second); + } + else + { #ifdef RS_DATA_SERVICE_DEBUG - std::cerr << "RsDataService::retrieveGxsGrpMetaData() retrieving all"; - std::cerr << std::endl; + std::cerr << "RsDataService::retrieveGxsGrpMetaData() retrieving all" << std::endl; #endif RetroCursor* c = mDb->sqlQuery(GRP_TABLE_NAME, mGrpMetaColumns, "", ""); @@ -1315,6 +1333,10 @@ int RsDataService::retrieveGxsGrpMetaData(std::mapmGroupId] = g; + mGrpMetaDataCache[g->mGroupId] = *g ; +#ifdef RS_DATA_SERVICE_DEBUG_CACHE + std::cerr << (void *)this << ": Retrieving (all) Grp metadata grpId=" << g->mGroupId << std::endl; +#endif } valid = c->moveToNext(); @@ -1325,12 +1347,29 @@ int RsDataService::retrieveGxsGrpMetaData(std::map::iterator mit = grp.begin(); for(; mit != grp.end(); ++mit) { + std::map::const_iterator itt = mGrpMetaDataCache.find(mit->first) ; + if(itt != mGrpMetaDataCache.end()) + { +#ifdef RS_DATA_SERVICE_DEBUG_CACHE + std::cerr << "Retrieving Grp metadata grpId=" << mit->first << " from cache!" << std::endl; +#endif + grp[mit->first] = new RsGxsGrpMetaData(itt->second) ; + } + else + { +#ifdef RS_DATA_SERVICE_DEBUG_CACHE + std::cerr << "Retrieving Grp metadata grpId=" << mit->first ; +#endif + const RsGxsGroupId& grpId = mit->first; RetroCursor* c = mDb->sqlQuery(GRP_TABLE_NAME, mGrpMetaColumns, "grpId='" + grpId.toStdString() + "'", ""); @@ -1338,6 +1377,10 @@ int RsDataService::retrieveGxsGrpMetaData(std::mapmoveToFirst(); +#ifdef RS_DATA_SERVICE_DEBUG_CACHE + if(!valid) + std::cerr << " Empty query! GrpId " << grpId << " is not in database" << std::endl; +#endif while(valid) { RsGxsGrpMetaData* g = locked_getGrpMeta(*c, 0); @@ -1345,6 +1388,10 @@ int RsDataService::retrieveGxsGrpMetaData(std::mapmGroupId] = g; + mGrpMetaDataCache[g->mGroupId] = *g ; +#ifdef RS_DATA_SERVICE_DEBUG_CACHE + std::cerr << ". Got it. Updating cache." << std::endl; +#endif } valid = c->moveToNext(); @@ -1354,7 +1401,11 @@ int RsDataService::retrieveGxsGrpMetaData(std::mapsqlUpdate(GRP_TABLE_NAME, KEY_GRP_ID+ "='" + grpId.toStdString() + "'", meta.val) ? 1 : 0; } int RsDataService::updateMessageMetaData(MsgLocMetaData &metaData) { +#ifdef RS_DATA_SERVICE_DEBUG_CACHE + std::cerr << (void*)this << ": Updating Msg Meta data: grpId = " << metaData.msgId.first << " msgId = " << metaData.msgId.second << std::endl; +#endif + RsStackMutex stack(mDbMutex); RsGxsGroupId& grpId = metaData.msgId.first; RsGxsMessageId& msgId = metaData.msgId.second; diff --git a/libretroshare/src/gxs/rsdataservice.h b/libretroshare/src/gxs/rsdataservice.h index b15f08c27..451d630cc 100644 --- a/libretroshare/src/gxs/rsdataservice.h +++ b/libretroshare/src/gxs/rsdataservice.h @@ -340,6 +340,13 @@ private: uint16_t mServType; RetroDb* mDb; + + // used to store metadata instead of reading it from the database. + // The boolean variable below is also used to force re-reading when + // the entre list of grp metadata is requested (which happens quite often) + + std::map mGrpMetaDataCache ; + bool mGrpMetaDataCache_ContainsAllDatabase ; }; #endif // RSDATASERVICE_H diff --git a/libretroshare/src/gxs/rsgenexchange.cc b/libretroshare/src/gxs/rsgenexchange.cc index 615c96e3e..e4c83d5db 100644 --- a/libretroshare/src/gxs/rsgenexchange.cc +++ b/libretroshare/src/gxs/rsgenexchange.cc @@ -881,8 +881,15 @@ int RsGenExchange::validateMsg(RsNxsMsg *msg, const uint32_t& grpFlag, const uin { // now check reputation of the message author - float reputation_threshold = ( (signFlag & GXS_SERV::FLAG_AUTHOR_AUTHENTICATION_GPG) && !(details.mFlags & RS_IDENTITY_FLAGS_PGP_LINKED)) ? (RsReputations::REPUTATION_THRESHOLD_ANTI_SPAM): (RsReputations::REPUTATION_THRESHOLD_DEFAULT) ; - + float reputation_threshold = RsReputations::REPUTATION_THRESHOLD_DEFAULT; + + if( (signFlag & GXS_SERV::FLAG_AUTHOR_AUTHENTICATION_GPG_KNOWN) && !(details.mFlags & RS_IDENTITY_FLAGS_PGP_KNOWN)) + reputation_threshold = RsReputations::REPUTATION_THRESHOLD_ANTI_SPAM; + else if( (signFlag & GXS_SERV::FLAG_AUTHOR_AUTHENTICATION_GPG) && !(details.mFlags & RS_IDENTITY_FLAGS_PGP_LINKED)) + reputation_threshold = RsReputations::REPUTATION_THRESHOLD_ANTI_SPAM; + else + reputation_threshold = RsReputations::REPUTATION_THRESHOLD_DEFAULT; + if(details.mReputation.mOverallReputationScore < reputation_threshold) { #ifdef GEN_EXCH_DEBUG diff --git a/libretroshare/src/gxs/rsgxsnetservice.cc b/libretroshare/src/gxs/rsgxsnetservice.cc index 8df2bea19..7d4e81dd0 100644 --- a/libretroshare/src/gxs/rsgxsnetservice.cc +++ b/libretroshare/src/gxs/rsgxsnetservice.cc @@ -204,9 +204,9 @@ #include "rsgxsnetservice.h" #include "gxssecurity.h" #include "retroshare/rsconfig.h" -#include "retroshare/rsreputations.h" #include "retroshare/rsgxsflags.h" #include "retroshare/rsgxscircles.h" +#include "retroshare/rspeers.h" #include "pgp/pgpauxutils.h" #include "util/rsdir.h" #include "util/rsmemory.h" @@ -266,7 +266,7 @@ static const uint32_t RS_NXS_ITEM_ENCRYPTION_STATUS_GXS_KEY_MISSING = 0x05 ; || defined(NXS_NET_DEBUG_4) || defined(NXS_NET_DEBUG_5) || defined(NXS_NET_DEBUG_6) || defined(NXS_NET_DEBUG_7) static const RsPeerId peer_to_print = RsPeerId(std::string("")) ; -static const RsGxsGroupId group_id_to_print = RsGxsGroupId(std::string("" )) ; // use this to allow to this group id only, or "" for all IDs +static const RsGxsGroupId group_id_to_print = RsGxsGroupId(std::string("87c769d3ffeafdc4433f557d50cdf2e8" )) ; // use this to allow to this group id only, or "" for all IDs static const uint32_t service_to_print = 0x215 ; // use this to allow to this service id only, or 0 for all services // warning. Numbers should be SERVICE IDS (see serialiser/rsserviceids.h. E.g. 0x0215 for forums) @@ -2928,9 +2928,8 @@ void RsGxsNetService::locked_genReqMsgTransaction(NxsTransaction* tr) #endif continue; } - // FIXTESTS global variable rsReputations not available in unittests! - if(rsReputations == 0){ std::cerr << "rsReputations==0, accepting all messages!" << std::endl; } - if(rsReputations && rsReputations->isIdentityBanned(syncItem->authorId)) + + if(rsIdentity && rsIdentity->isBanned(syncItem->authorId)) { #ifdef NXS_NET_DEBUG_1 GXSNETDEBUG_PG(item->PeerId(),grpId) << ", Identity " << syncItem->authorId << " is banned. Not requesting message!" << std::endl; @@ -3174,8 +3173,8 @@ void RsGxsNetService::locked_genReqGrpTransaction(NxsTransaction* tr) latestVersion = grpSyncItem->publishTs > metaIter->second->mPublishTs; } // FIXTESTS global variable rsReputations not available in unittests! - if(rsReputations == 0){ std::cerr << "rsReputations==0, accepting all groups!" << std::endl; } - if(!grpSyncItem->authorId.isNull() && rsReputations && rsReputations->isIdentityBanned(grpSyncItem->authorId)) + + if(!grpSyncItem->authorId.isNull() && rsIdentity && rsIdentity->isBanned(grpSyncItem->authorId)) { #ifdef NXS_NET_DEBUG_0 GXSNETDEBUG_PG(tr->mTransaction->PeerId(),grpId) << " Identity " << grpSyncItem->authorId << " is banned. Not syncing group." << std::endl; @@ -4094,7 +4093,7 @@ void RsGxsNetService::handleRecvSyncGroup(RsNxsSyncGrpReqItem *item) -bool RsGxsNetService::canSendGrpId(const RsPeerId& sslId, RsGxsGrpMetaData& grpMeta, std::vector& toVet, bool& should_encrypt) +bool RsGxsNetService::canSendGrpId(const RsPeerId& sslId, RsGxsGrpMetaData& grpMeta, std::vector& /* toVet */, bool& should_encrypt) { #ifdef NXS_NET_DEBUG_4 GXSNETDEBUG_PG(sslId,grpMeta.mGroupId) << "RsGxsNetService::canSendGrpId()"<< std::endl; @@ -4125,101 +4124,21 @@ bool RsGxsNetService::canSendGrpId(const RsPeerId& sslId, RsGxsGrpMetaData& grpM #endif should_encrypt = true ; return true ; - -#ifdef TO_BE_REMOVED_OLD_VETTING_FOR_EXTERNAL_CIRCLES - const RsGxsCircleId& circleId = grpMeta.mCircleId; - if(circleId.isNull()) - { - std::cerr << " EXTERNAL_CIRCLE missing NULL CircleId: " << grpMeta.mGroupId<< std::endl; - - // ERROR, will never be shared. - return false; - } - - if(mCircles->isLoaded(circleId)) - { -#ifdef NXS_NET_DEBUG_4 - GXSNETDEBUG_PG(sslId,grpMeta.mGroupId)<< " EXTERNAL_CIRCLE, checking mCircles->canSend"<< std::endl; -#endif - // the sending authorisation is based on: - // getPgpId(peer_id) being a signer of one GxsId in the Circle - // - const RsPgpId& pgpId = mPgpUtils->getPGPId(sslId); - - bool res = mCircles->canSend(circleId, pgpId); -#ifdef NXS_NET_DEBUG_4 - GXSNETDEBUG_PG(sslId,grpMeta.mGroupId)<< " answer is: " << res << std::endl; -#endif - return res ; - } -#ifdef NXS_NET_DEBUG_4 - GXSNETDEBUG_PG(sslId,grpMeta.mGroupId)<< " grp not ready. Adding to vetting list." << std::endl; -#endif - - toVet.push_back(GrpIdCircleVet(grpMeta.mGroupId, circleId, grpMeta.mAuthorId)); - return false; -#endif } if(circleType == GXS_CIRCLE_TYPE_YOUR_FRIENDS_ONLY) { +#ifdef NXS_NET_DEBUG_4 + GXSNETDEBUG_PG(sslId,grpMeta.mGroupId) << " YOUREYESONLY, checking further" << std::endl; +#endif + bool res = checkPermissionsForFriendGroup(sslId,grpMeta) ; +#ifdef NXS_NET_DEBUG_4 + GXSNETDEBUG_PG(sslId,grpMeta.mGroupId) << " Final answer: " << res << std::endl; +#endif + return res ; #ifdef NXS_NET_DEBUG_4 GXSNETDEBUG_PG(sslId,grpMeta.mGroupId)<< " YOUREYESONLY, checking further"<< std::endl; #endif - // a non empty internal circle id means this - // is the personal circle owner - if(!grpMeta.mInternalCircle.isNull()) - { - const RsGxsCircleId& internalCircleId = grpMeta.mInternalCircle; -#ifdef NXS_NET_DEBUG_4 - GXSNETDEBUG_PG(sslId,grpMeta.mGroupId) << " have mInternalCircle - we are Group creator" << std::endl; - GXSNETDEBUG_PG(sslId,grpMeta.mGroupId) << " mCircleId: " << grpMeta.mCircleId << std::endl; - GXSNETDEBUG_PG(sslId,grpMeta.mGroupId) << " mInternalCircle: " << grpMeta.mInternalCircle << std::endl; -#endif - - if(mCircles->isLoaded(internalCircleId)) - { -#ifdef NXS_NET_DEBUG_4 - GXSNETDEBUG_PG(sslId,grpMeta.mGroupId) << " circle Loaded - checking mCircles->canSend" << std::endl; -#endif - const RsPgpId& pgpId = mPgpUtils->getPGPId(sslId); - bool should_encrypt = false ; - - bool res = mCircles->canSend(internalCircleId, pgpId,should_encrypt); -#ifdef NXS_NET_DEBUG_4 - GXSNETDEBUG_PG(sslId,grpMeta.mGroupId) << " answer is: " << res << std::endl; -#endif - return res ; - } - -#ifdef NXS_NET_DEBUG_4 - GXSNETDEBUG_PG(sslId,grpMeta.mGroupId) << " Circle Not Loaded - add to vetting"<< std::endl; -#endif - toVet.push_back(GrpIdCircleVet(grpMeta.mGroupId, internalCircleId, grpMeta.mAuthorId)); - return false; - } - else - { - // an empty internal circle id means this peer can only - // send circle related info from peer he received it -#ifdef NXS_NET_DEBUG_4 - GXSNETDEBUG_PG(sslId,grpMeta.mGroupId) << " mInternalCircle not set, someone else's personal circle"<< std::endl; -#endif - if(grpMeta.mOriginator == sslId) - { -#ifdef NXS_NET_DEBUG_4 - GXSNETDEBUG_PG(sslId,grpMeta.mGroupId) << " Originator matches -> can send"<< std::endl; -#endif - return true; - } - else - { -#ifdef NXS_NET_DEBUG_4 - GXSNETDEBUG_PG(sslId,grpMeta.mGroupId) << " Originator doesn't match -> cannot send"<< std::endl; -#endif - return false; - } - } } return true; @@ -4229,121 +4148,51 @@ bool RsGxsNetService::checkCanRecvMsgFromPeer(const RsPeerId& sslId, const RsGxs { #ifdef NXS_NET_DEBUG_4 - GXSNETDEBUG_PG(sslId,grpMeta.mGroupId) << "RsGxsNetService::checkCanRecvMsgFromPeer()"; - GXSNETDEBUG_PG(sslId,grpMeta.mGroupId) << " peer Id = " << sslId << ", grpId=" << grpMeta.mGroupId < returning true. Msgs will be encrypted." << std::endl; -#endif - should_encrypt_id = grpMeta.mCircleId ; - return true ; -#ifdef TO_BE_REMOVED_OLD_VETTING_FOR_EXTERNAL_CIRCLES - const RsGxsCircleId& circleId = grpMeta.mCircleId; - if(circleId.isNull()) - { -#ifdef NXS_NET_DEBUG_0 - GXSNETDEBUG_PG(sslId,grpMeta.mGroupId) << " ERROR; EXTERNAL_CIRCLE missing NULL CircleId"; - GXSNETDEBUG_PG(sslId,grpMeta.mGroupId) << grpMeta.mGroupId; - GXSNETDEBUG_PG(sslId,grpMeta.mGroupId) << std::endl; + GXSNETDEBUG_PG(sslId,grpMeta.mGroupId) << " Circle type: EXTERNAL => returning true. Msgs will be encrypted." << std::endl; #endif + should_encrypt_id = grpMeta.mCircleId ; + return true ; + } - // should just be shared. ? no - this happens for - // Circle Groups which lose their CircleIds. - // return true; - } + if(circleType == GXS_CIRCLE_TYPE_YOUR_FRIENDS_ONLY) // do not attempt to sync msg unless to originator or those permitted + { +#ifdef NXS_NET_DEBUG_4 + GXSNETDEBUG_PG(sslId,grpMeta.mGroupId) << " YOUREYESONLY, checking further" << std::endl; +#endif + bool res = checkPermissionsForFriendGroup(sslId,grpMeta) ; +#ifdef NXS_NET_DEBUG_4 + GXSNETDEBUG_PG(sslId,grpMeta.mGroupId) << " Final answer: " << res << std::endl; +#endif + return res ; + } - if(mCircles->isLoaded(circleId)) - { -#ifdef NXS_NET_DEBUG_4 - GXSNETDEBUG_PG(sslId,grpMeta.mGroupId) << " EXTERNAL_CIRCLE, checking mCircles->canSend" << std::endl; -#endif - const RsPgpId& pgpId = mPgpUtils->getPGPId(sslId); - return mCircles->canSend(circleId, pgpId); - } - else - mCircles->loadCircle(circleId); // simply request for next pass - - return false; -#endif - } - - if(circleType == GXS_CIRCLE_TYPE_YOUR_FRIENDS_ONLY) // do not attempt to sync msg unless to originator or those permitted - { -#ifdef NXS_NET_DEBUG_4 - GXSNETDEBUG_PG(sslId,grpMeta.mGroupId) << " YOUREYESONLY, checking further" << std::endl; -#endif - // a non empty internal circle id means this - // is the personal circle owner - if(!grpMeta.mInternalCircle.isNull()) - { - const RsGxsCircleId& internalCircleId = grpMeta.mInternalCircle; -#ifdef NXS_NET_DEBUG_4 - GXSNETDEBUG_PG(sslId,grpMeta.mGroupId) << " have mInternalCircle - we are Group creator" << std::endl; - GXSNETDEBUG_PG(sslId,grpMeta.mGroupId) << " mCircleId: " << grpMeta.mCircleId << std::endl; - GXSNETDEBUG_PG(sslId,grpMeta.mGroupId) << " mInternalCircle: " << grpMeta.mInternalCircle << std::endl; -#endif - - if(mCircles->isLoaded(internalCircleId)) - { -#ifdef NXS_NET_DEBUG_4 - GXSNETDEBUG_PG(sslId,grpMeta.mGroupId) << " circle Loaded - checking mCircles->canSend" << std::endl; -#endif - const RsPgpId& pgpId = mPgpUtils->getPGPId(sslId); - bool should_encrypt ; - return mCircles->canSend(internalCircleId, pgpId,should_encrypt); - } - else - mCircles->loadCircle(internalCircleId); // request for next pass - - return false; - } - else - { - // an empty internal circle id means this peer can only - // send circle related info from peer he received it -#ifdef NXS_NET_DEBUG_4 - GXSNETDEBUG_PG(sslId,grpMeta.mGroupId) << " mInternalCircle not set, someone else's personal circle" << std::endl; -#endif - if(grpMeta.mOriginator == sslId) - { -#ifdef NXS_NET_DEBUG_4 - GXSNETDEBUG_PG(sslId,grpMeta.mGroupId) << " Originator matches -> can send" << std::endl; -#endif - return true; - } - else - { -#ifdef NXS_NET_DEBUG_4 - GXSNETDEBUG_PG(sslId,grpMeta.mGroupId) << " Originator doesn't match -> cannot send"<< std::endl; -#endif - return false; - } - } - } - - return true; + return true; } bool RsGxsNetService::locked_CanReceiveUpdate(RsNxsSyncMsgReqItem *item,bool& grp_is_known) @@ -4620,17 +4469,17 @@ bool RsGxsNetService::canSendMsgIds(std::vector& msgMetas, co if(circleType == GXS_CIRCLE_TYPE_LOCAL) { #ifdef NXS_NET_DEBUG_4 - GXSNETDEBUG_PG(sslId,grpMeta.mGroupId) << " Circle type: LOCAL => returning false" << std::endl; + GXSNETDEBUG_PG(sslId,grpMeta.mGroupId) << " Circle type: LOCAL => returning false" << std::endl; #endif - return false; + return false; } if(circleType == GXS_CIRCLE_TYPE_PUBLIC) { #ifdef NXS_NET_DEBUG_4 - GXSNETDEBUG_PG(sslId,grpMeta.mGroupId) << " Circle type: PUBLIC => returning true" << std::endl; + GXSNETDEBUG_PG(sslId,grpMeta.mGroupId) << " Circle type: PUBLIC => returning true" << std::endl; #endif - return true; + return true; } const RsGxsCircleId& circleId = grpMeta.mCircleId; @@ -4638,119 +4487,116 @@ bool RsGxsNetService::canSendMsgIds(std::vector& msgMetas, co if(circleType == GXS_CIRCLE_TYPE_EXTERNAL) { #ifdef NXS_NET_DEBUG_4 - GXSNETDEBUG_PG(sslId,grpMeta.mGroupId) << " Circle type: EXTERNAL => returning true. Msgs ids list will be encrypted." << std::endl; + GXSNETDEBUG_PG(sslId,grpMeta.mGroupId) << " Circle type: EXTERNAL => returning true. Msgs ids list will be encrypted." << std::endl; #endif - should_encrypt_id = circleId ; + should_encrypt_id = circleId ; - // For each message ID, check that the author is in the circle. If not, do not send the message, which means, remove it from the list. - // Unsigned messages are still transmitted. This is because in some groups (channels) the posts are not signed. Whether an unsigned post - // is allowed at this point is anyway already vetted by the RsGxsGenExchange service. + // For each message ID, check that the author is in the circle. If not, do not send the message, which means, remove it from the list. + // Unsigned messages are still transmitted. This is because in some groups (channels) the posts are not signed. Whether an unsigned post + // is allowed at this point is anyway already vetted by the RsGxsGenExchange service. - // Messages that stay in the list will be sent. As a consequence true is always returned. - // Messages put in vetting list will be dealt with later + // Messages that stay in the list will be sent. As a consequence true is always returned. + // Messages put in vetting list will be dealt with later - std::vector toVet; + std::vector toVet; - for(uint32_t i=0;imAuthorId.isNull() ) // keep the message in this case - ++i ; - else - { - if(mCircles->isLoaded(circleId) && mCircles->isRecipient(circleId, grpMeta.mGroupId, msgMetas[i]->mAuthorId)) - { - ++i ; - continue ; - } + for(uint32_t i=0;imAuthorId.isNull() ) // keep the message in this case + ++i ; + else + { + if(mCircles->isLoaded(circleId) && mCircles->isRecipient(circleId, grpMeta.mGroupId, msgMetas[i]->mAuthorId)) + { + ++i ; + continue ; + } - MsgIdCircleVet mic(msgMetas[i]->mMsgId, msgMetas[i]->mAuthorId); - toVet.push_back(mic); + MsgIdCircleVet mic(msgMetas[i]->mMsgId, msgMetas[i]->mAuthorId); + toVet.push_back(mic); #ifdef NXS_NET_DEBUG_4 - GXSNETDEBUG_PG(sslId,grpMeta.mGroupId) << " deleting MsgMeta entry for msg ID " << msgMetas[i]->mMsgId << " signed by " << msgMetas[i]->mAuthorId << " who is not in group circle " << circleId << std::endl; + GXSNETDEBUG_PG(sslId,grpMeta.mGroupId) << " deleting MsgMeta entry for msg ID " << msgMetas[i]->mMsgId << " signed by " << msgMetas[i]->mAuthorId << " who is not in group circle " << circleId << std::endl; #endif - delete msgMetas[i] ; - msgMetas[i] = msgMetas[msgMetas.size()-1] ; - msgMetas.pop_back() ; - } + delete msgMetas[i] ; + msgMetas[i] = msgMetas[msgMetas.size()-1] ; + msgMetas.pop_back() ; + } #ifdef NXS_NET_DEBUG_4 - GXSNETDEBUG_PG(sslId,grpMeta.mGroupId) << " Circle info not loaded. Putting in vetting list and returning false." << std::endl; + GXSNETDEBUG_PG(sslId,grpMeta.mGroupId) << " Circle info not loaded. Putting in vetting list and returning false." << std::endl; #endif - if(!toVet.empty()) - mPendingCircleVets.push_back(new MsgCircleIdsRequestVetting(mCircles, mPgpUtils, toVet, grpMeta.mGroupId, sslId, grpMeta.mCircleId)); + if(!toVet.empty()) + mPendingCircleVets.push_back(new MsgCircleIdsRequestVetting(mCircles, mPgpUtils, toVet, grpMeta.mGroupId, sslId, grpMeta.mCircleId)); - return true ; + return true ; } - if(circleType == GXS_CIRCLE_TYPE_YOUR_FRIENDS_ONLY) - { + if(circleType == GXS_CIRCLE_TYPE_YOUR_FRIENDS_ONLY) + { #ifdef NXS_NET_DEBUG_4 - GXSNETDEBUG_PG(sslId,grpMeta.mGroupId) << " Circle type: YOUR EYES ONLY" << std::endl; + GXSNETDEBUG_PG(sslId,grpMeta.mGroupId) << " YOUREYESONLY, checking further" << std::endl; #endif - // a non empty internal circle id means this - // is the personal circle owner - if(!grpMeta.mInternalCircle.isNull()) - { - const RsGxsCircleId& internalCircleId = grpMeta.mInternalCircle; + bool res = checkPermissionsForFriendGroup(sslId,grpMeta) ; #ifdef NXS_NET_DEBUG_4 - GXSNETDEBUG_PG(sslId,grpMeta.mGroupId) << " Group internal circle: " << internalCircleId << std::endl; -#endif - if(mCircles->isLoaded(internalCircleId)) - { - const RsPgpId& pgpId = mPgpUtils->getPGPId(sslId); - bool should_encrypt = false ; - - bool res= mCircles->canSend(internalCircleId, pgpId,should_encrypt); - - if(should_encrypt) - std::cerr << "(EE) inconsistent response: vetting requests to encrypt circle of type YOUR_EYES_ONLY" << std::endl; -#ifdef NXS_NET_DEBUG_4 - GXSNETDEBUG_PG(sslId,grpMeta.mGroupId) << " Answer from circle::canSend(): " << res << std::endl; -#endif - return res ; - } -#ifdef NXS_NET_DEBUG_4 - GXSNETDEBUG_PG(sslId,grpMeta.mGroupId) << " Not loaded. Putting in vetting list and returning false." << std::endl; + GXSNETDEBUG_PG(sslId,grpMeta.mGroupId) << " Final answer: " << res << std::endl; #endif + return res ; + } - std::vector toVet; - std::vector::const_iterator vit = msgMetas.begin(); - - for(; vit != msgMetas.end(); ++vit) - { - const RsGxsMsgMetaData* const& meta = *vit; - - MsgIdCircleVet mic(meta->mMsgId, meta->mAuthorId); - toVet.push_back(mic); - } - - if(!toVet.empty()) - mPendingCircleVets.push_back(new MsgCircleIdsRequestVetting(mCircles, mPgpUtils, - toVet, grpMeta.mGroupId, - sslId, grpMeta.mCircleId)); - - return false; - } - else - { - // an empty internal circle id means this peer can only - // send circle related info from peer he received it - -#ifdef NXS_NET_DEBUG_4 - GXSNETDEBUG_PG(sslId,grpMeta.mGroupId) << " Empty internal circle: cannot only send info from Peer we received it (grpMeta.mOriginator=" << grpMeta.mOriginator << " answer is: " << (grpMeta.mOriginator == sslId) << std::endl; -#endif - if(grpMeta.mOriginator == sslId) - return true; - else - return false; - } - } - - return false; + return false; } /** inherited methods **/ +bool RsGxsNetService::checkPermissionsForFriendGroup(const RsPeerId& sslId,const RsGxsGrpMetaData& grpMeta) +{ +#ifdef NXS_NET_DEBUG_4 + GXSNETDEBUG_PG(sslId,grpMeta.mGroupId) << " Circle type: YOUR EYES ONLY - ID = " << grpMeta.mInternalCircle << std::endl; +#endif + // a non empty internal circle id means this + // is the personal circle owner + if(!grpMeta.mInternalCircle.isNull()) + { + RsGroupInfo ginfo ; + RsPgpId pgpId = mPgpUtils->getPGPId(sslId) ; + +#ifdef NXS_NET_DEBUG_4 + GXSNETDEBUG_PG(sslId,grpMeta.mGroupId) << " Group internal circle: " << grpMeta.mInternalCircle << ", We're owner. Sending to everyone in the group." << std::endl; + GXSNETDEBUG_PG(sslId,grpMeta.mGroupId) << " Current destination is PGP Id: " << pgpId << std::endl; +#endif + if(!rsPeers->getGroupInfo(RsNodeGroupId(grpMeta.mInternalCircle),ginfo)) + { + std::cerr << "(EE) Cannot get information for internal circle (group node) ID " << grpMeta.mInternalCircle << " which conditions dissemination of GXS group " << grpMeta.mGroupId << std::endl; + return false ; + } + + bool res = (ginfo.peerIds.find(pgpId) != ginfo.peerIds.end()); + +#ifdef NXS_NET_DEBUG_4 + GXSNETDEBUG_PG(sslId,grpMeta.mGroupId) << " Final Answer is: " << res << std::endl; +#endif + return res ; + } + else + { + // An empty internal circle id means this peer can only + // send circle related info from peer he received it from. + // Normally this should be a pgp-based decision, but if we do that, + // A ---> B ----> A' ---...--->B' , then A' will also send to B' since B is the + // originator for A'. So A will lose control of who can see the data. This should + // be discussed further... + +#ifdef NXS_NET_DEBUG_4 + GXSNETDEBUG_PG(sslId,grpMeta.mGroupId) << " Empty internal circle: cannot only send/recv info to/from Peer we received it from (grpMeta.mOriginator=" << grpMeta.mOriginator << ")" << std::endl; + GXSNETDEBUG_PG(sslId,grpMeta.mGroupId) << " Final answer is: " << (grpMeta.mOriginator == sslId) << std::endl; +#endif + if(grpMeta.mOriginator == sslId) + return true; + else + return false; + } +} + void RsGxsNetService::pauseSynchronisation(bool /* enabled */) { diff --git a/libretroshare/src/gxs/rsgxsnetservice.h b/libretroshare/src/gxs/rsgxsnetservice.h index d289a9cae..296e17937 100644 --- a/libretroshare/src/gxs/rsgxsnetservice.h +++ b/libretroshare/src/gxs/rsgxsnetservice.h @@ -354,6 +354,15 @@ private: bool canSendGrpId(const RsPeerId& sslId, RsGxsGrpMetaData& grpMeta, std::vector& toVet, bool &should_encrypt); bool canSendMsgIds(std::vector& msgMetas, const RsGxsGrpMetaData&, const RsPeerId& sslId, RsGxsCircleId &should_encrypt_id); + /*! + * \brief checkPermissionsForFriendGroup + * Checks that we can send/recv from that node, given that the grpMeta has a distribution limited to a local circle. + * \param sslId Candidate peer to send to or to receive from. + * \param grpMeta Contains info about the group id, internal circle id, etc. + * \return true only when the internal exists and validates as a friend node group, and contains the owner of sslId. + */ + bool checkPermissionsForFriendGroup(const RsPeerId& sslId,const RsGxsGrpMetaData& grpMeta) ; + bool checkCanRecvMsgFromPeer(const RsPeerId& sslId, const RsGxsGrpMetaData& meta, RsGxsCircleId& should_encrypt_id); void locked_createTransactionFromPending(MsgRespPending* grpPend); diff --git a/libretroshare/src/gxs/rsgxsutil.cc b/libretroshare/src/gxs/rsgxsutil.cc index 0187e9cb4..22e2e8661 100644 --- a/libretroshare/src/gxs/rsgxsutil.cc +++ b/libretroshare/src/gxs/rsgxsutil.cc @@ -28,7 +28,6 @@ #include "rsgxsutil.h" #include "retroshare/rsgxsflags.h" #include "retroshare/rspeers.h" -#include "retroshare/rsreputations.h" #include "pqi/pqihash.h" #include "gxs/rsgixs.h" @@ -165,7 +164,7 @@ bool RsGxsIntegrityCheck::check() std::cerr << "TimeStamping group authors' key ID " << grp->metaData->mAuthorId << " in group ID " << grp->grpId << std::endl; #endif - if(rsReputations!=NULL && !rsReputations->isIdentityBanned(grp->metaData->mAuthorId)) + if(rsIdentity!=NULL && !rsIdentity->isBanned(grp->metaData->mAuthorId)) used_gxs_ids.insert(grp->metaData->mAuthorId) ; } } @@ -247,7 +246,7 @@ bool RsGxsIntegrityCheck::check() #ifdef GXSUTIL_DEBUG std::cerr << "TimeStamping message authors' key ID " << msg->metaData->mAuthorId << " in message " << msg->msgId << ", group ID " << msg->grpId<< std::endl; #endif - if(rsReputations!=NULL && !rsReputations->isIdentityBanned(msg->metaData->mAuthorId)) + if(rsIdentity!=NULL && !rsIdentity->isBanned(msg->metaData->mAuthorId)) used_gxs_ids.insert(msg->metaData->mAuthorId) ; } diff --git a/libretroshare/src/pqi/p3linkmgr.cc b/libretroshare/src/pqi/p3linkmgr.cc index 2e58b8f4b..26a27dc45 100644 --- a/libretroshare/src/pqi/p3linkmgr.cc +++ b/libretroshare/src/pqi/p3linkmgr.cc @@ -138,8 +138,6 @@ p3LinkMgrIMPL::p3LinkMgrIMPL(p3PeerMgrIMPL *peerMgr, p3NetMgrIMPL *netMgr) mDNSResolver = new DNSResolver(); mRetryPeriod = MIN_RETRY_PERIOD; - lastGroupId = 1; - /* setup Banned Ip Address - static for now */ diff --git a/libretroshare/src/pqi/p3linkmgr.h b/libretroshare/src/pqi/p3linkmgr.h index c7a551177..1fee7d6f2 100644 --- a/libretroshare/src/pqi/p3linkmgr.h +++ b/libretroshare/src/pqi/p3linkmgr.h @@ -132,7 +132,7 @@ class peerConnectState }; class p3tunnel; -class RsPeerGroupItem; +class RsPeerGroupItem_deprecated; class RsGroupInfo; class p3PeerMgr; @@ -339,9 +339,6 @@ private: std::map mFriendList; std::map mOthersList; - std::list groupList; - uint32_t lastGroupId; - /* relatively static list of banned ip addresses */ std::list mBannedIpList; }; diff --git a/libretroshare/src/pqi/p3peermgr.cc b/libretroshare/src/pqi/p3peermgr.cc index 53ac4f12f..a2c21284c 100644 --- a/libretroshare/src/pqi/p3peermgr.cc +++ b/libretroshare/src/pqi/p3peermgr.cc @@ -130,8 +130,6 @@ p3PeerMgrIMPL::p3PeerMgrIMPL(const RsPeerId& ssl_own_id, const RsPgpId& gpg_own_ mOwnState.vs_disc = RS_VS_DISC_FULL; mOwnState.vs_dht = RS_VS_DHT_FULL; - lastGroupId = 1; - // setup default ProxyServerAddress. // Tor sockaddr_storage_clear(mProxyServerAddressTor); @@ -1071,7 +1069,7 @@ bool p3PeerMgrIMPL::removeFriend(const RsPgpId &id) std::list ids ; ids.push_back(id) ; - assignPeersToGroup("", ids, false); + assignPeersToGroup(RsNodeGroupId(), ids, false); IndicateConfigChanged(); /**** INDICATE MSG CONFIG CHANGED! *****/ @@ -1145,7 +1143,7 @@ bool p3PeerMgrIMPL::removeFriend(const RsPeerId &id, bool removePgpId) /* remove id from all groups */ - assignPeersToGroup("", pgpid_toRemove, false); + assignPeersToGroup(RsNodeGroupId(), pgpid_toRemove, false); IndicateConfigChanged(); /**** INDICATE MSG CONFIG CHANGED! *****/ @@ -1915,7 +1913,7 @@ RsSerialiser *p3PeerMgrIMPL::setupSerialiser() bool p3PeerMgrIMPL::saveList(bool &cleanup, std::list& saveData) { /* create a list of current peers */ - cleanup = false; + cleanup = true; bool useExtAddrFinder = mNetMgr->getIPServersEnabled(); /* gather these information before mPeerMtx is locked! */ @@ -1971,7 +1969,6 @@ bool p3PeerMgrIMPL::saveList(bool &cleanup, std::list& saveData) #endif saveData.push_back(item); - saveCleanupList.push_back(item); /* iterate through all friends and save */ std::map::iterator it; @@ -2003,7 +2000,6 @@ bool p3PeerMgrIMPL::saveList(bool &cleanup, std::list& saveData) item->domain_port = (it->second).hiddenPort; saveData.push_back(item); - saveCleanupList.push_back(item); #ifdef PEER_DEBUG std::cerr << "p3PeerMgrIMPL::saveList() Peer Config Item:" << std::endl; item->print(std::cerr, 10); @@ -2024,7 +2020,6 @@ bool p3PeerMgrIMPL::saveList(bool &cleanup, std::list& saveData) } saveData.push_back(sitem) ; - saveCleanupList.push_back(sitem); // Now save config for network digging strategies @@ -2066,14 +2061,14 @@ bool p3PeerMgrIMPL::saveList(bool &cleanup, std::list& saveData) vitem->tlvkvs.pairs.push_back(kv) ; saveData.push_back(vitem); - saveCleanupList.push_back(vitem); /* save groups */ - std::list::iterator groupIt; - for (groupIt = groupList.begin(); groupIt != groupList.end(); ++groupIt) { - saveData.push_back(*groupIt); // no delete - } + for ( std::map::iterator groupIt = groupList.begin(); groupIt != groupList.end(); ++groupIt) + { + RsNodeGroupItem *itm = new RsNodeGroupItem(groupIt->second); + saveData.push_back(itm) ; + } return true; } @@ -2294,7 +2289,8 @@ bool p3PeerMgrIMPL::loadList(std::list& load) continue; } - RsPeerGroupItem *gitem = dynamic_cast(*it) ; + RsPeerGroupItem_deprecated *gitem = dynamic_cast(*it) ; + if (gitem) { RsStackMutex stack(mPeerMtx); /****** STACK LOCK MUTEX *******/ @@ -2304,20 +2300,54 @@ bool p3PeerMgrIMPL::loadList(std::list& load) gitem->print(std::cerr, 10); std::cerr << std::endl; #endif + RsGroupInfo ginfo ; + ginfo.flag = gitem->flag ; + ginfo.name = gitem->name ; + ginfo.peerIds = gitem->pgpList.ids ; - groupList.push_back(gitem); // don't delete + do { ginfo.id = RsNodeGroupId::random(); } while(groupList.find(ginfo.id) != groupList.end()) ; - if ((gitem->flag & RS_GROUP_FLAG_STANDARD) == 0) { - /* calculate group id */ - uint32_t groupId = atoi(gitem->id.c_str()); - if (groupId > lastGroupId) { - lastGroupId = groupId; - } - } + // Ensure backward compatibility when loading the group in old format. The id must matchthe standard default id. - continue; + if(gitem->id == std::string(RS_GROUP_DEFAULT_NAME_FRIENDS )) ginfo.id = RS_GROUP_ID_FRIENDS ; + if(gitem->id == std::string(RS_GROUP_DEFAULT_NAME_COWORKERS)) ginfo.id = RS_GROUP_ID_COWORKERS ; + if(gitem->id == std::string(RS_GROUP_DEFAULT_NAME_FAMILY )) ginfo.id = RS_GROUP_ID_FAMILY ; + if(gitem->id == std::string(RS_GROUP_DEFAULT_NAME_FAVORITES)) ginfo.id = RS_GROUP_ID_FAVORITES ; + if(gitem->id == std::string(RS_GROUP_DEFAULT_NAME_OTHERS )) ginfo.id = RS_GROUP_ID_OTHERS ; + + if(!ginfo.id.isNull()) + { + groupList[ginfo.id] = ginfo ; + std::cerr << "(II) Creating new group for old format local group \"" << gitem->name << "\". Id=" << ginfo.id << std::endl; + } + else + std::cerr << "(EE) no group corresponding to old format group with ID=\"" << gitem->id << "\"" << std::endl; + + continue; } - + + RsNodeGroupItem *gitem2 = dynamic_cast(*it) ; + + if (gitem2) + { + RsStackMutex stack(mPeerMtx); /****** STACK LOCK MUTEX *******/ + +#ifdef PEER_DEBUG + std::cerr << "p3PeerMgrIMPL::loadList() Peer group item:" << std::endl; + gitem->print(std::cerr, 10); + std::cerr << std::endl; +#endif + RsGroupInfo info ; + info.peerIds = gitem2->pgpList.ids ; + info.id = gitem2->id ; + info.name = gitem2->name ; + info.flag = gitem2->flag ; + + std::cerr << "(II) Loaded group in new format. ID = " << info.id << std::endl; + groupList[info.id] = info ; + + continue; + } RsPeerBandwidthLimitsItem *pblitem = dynamic_cast(*it) ; if(pblitem) @@ -2363,42 +2393,19 @@ bool p3PeerMgrIMPL::loadList(std::list& load) /* Standard groups */ const int standardGroupCount = 5; - const char *standardGroup[standardGroupCount] = { RS_GROUP_ID_FRIENDS, RS_GROUP_ID_FAMILY, RS_GROUP_ID_COWORKERS, RS_GROUP_ID_OTHERS, RS_GROUP_ID_FAVORITES }; - bool foundStandardGroup[standardGroupCount] = { false, false, false, false, false }; + const RsNodeGroupId standardGroupIds [standardGroupCount] = { RS_GROUP_ID_FRIENDS, RS_GROUP_ID_FAMILY, RS_GROUP_ID_COWORKERS, RS_GROUP_ID_OTHERS, RS_GROUP_ID_FAVORITES }; + const char *standardGroupNames[standardGroupCount] = { RS_GROUP_DEFAULT_NAME_FRIENDS, RS_GROUP_DEFAULT_NAME_FAMILY, RS_GROUP_DEFAULT_NAME_COWORKERS, RS_GROUP_DEFAULT_NAME_OTHERS, RS_GROUP_DEFAULT_NAME_FAVORITES }; - std::list::iterator groupIt; - for (groupIt = groupList.begin(); groupIt != groupList.end(); ++groupIt) { - if ((*groupIt)->flag & RS_GROUP_FLAG_STANDARD) { - int i; - for (i = 0; i < standardGroupCount; ++i) { - if ((*groupIt)->id == standardGroup[i]) { - foundStandardGroup[i] = true; - break; - } - } + for(uint32_t k=0;k= standardGroupCount) { - /* No more a standard group, remove the flag standard */ - (*groupIt)->flag &= ~RS_GROUP_FLAG_STANDARD; - } - } else { - uint32_t groupId = atoi((*groupIt)->id.c_str()); - if (groupId == 0) { - rs_sprintf((*groupIt)->id, "%lu", lastGroupId++); - } + groupList[info.id] = info; } - } - - /* Initialize standard groups */ - for (int i = 0; i < standardGroupCount; ++i) { - if (foundStandardGroup[i] == false) { - RsPeerGroupItem *gitem = new RsPeerGroupItem; - gitem->id = standardGroup[i]; - gitem->name = standardGroup[i]; - gitem->flag |= RS_GROUP_FLAG_STANDARD; - groupList.push_back(gitem); - } - } } // If we are hidden - don't want ExtAddrFinder - ever! @@ -2478,19 +2485,16 @@ bool p3PeerMgrIMPL::addGroup(RsGroupInfo &groupInfo) { RsStackMutex stack(mPeerMtx); /****** STACK LOCK MUTEX *******/ - RsPeerGroupItem *groupItem = new RsPeerGroupItem; - groupItem->set(groupInfo); + do { groupInfo.id = RsNodeGroupId::random(); } while(groupList.find(groupInfo.id) != groupList.end()) ; - rs_sprintf(groupItem->id, "%lu", ++lastGroupId); + RsGroupInfo groupItem(groupInfo) ; // remove standard flag - groupItem->flag &= ~RS_GROUP_FLAG_STANDARD; - groupItem->PeerId(getOwnId()); + groupItem.flag &= ~RS_GROUP_FLAG_STANDARD; + groupList[groupInfo.id] = groupItem; - groupList.push_back(groupItem); - - groupInfo.id = groupItem->id; + std::cerr << "(II) Added new group with ID " << groupInfo.id << ", name=\"" << groupInfo.name << "\"" << std::endl; } RsServer::notify()->notifyListChange(NOTIFY_LIST_GROUPLIST, NOTIFY_TYPE_ADD); @@ -2500,35 +2504,39 @@ bool p3PeerMgrIMPL::addGroup(RsGroupInfo &groupInfo) return true; } -bool p3PeerMgrIMPL::editGroup(const std::string &groupId, RsGroupInfo &groupInfo) +bool p3PeerMgrIMPL::editGroup(const RsNodeGroupId& groupId, RsGroupInfo &groupInfo) { - if (groupId.empty()) { + if (groupId.isNull()) return false; - } bool changed = false; - { - RsStackMutex stack(mPeerMtx); /****** STACK LOCK MUTEX *******/ + { + RsStackMutex stack(mPeerMtx); /****** STACK LOCK MUTEX *******/ - std::list::iterator groupIt; - for (groupIt = groupList.begin(); groupIt != groupList.end(); ++groupIt) { - if ((*groupIt)->id == groupId) { - break; - } - } + std::map::iterator it = groupList.find(groupId) ; - if (groupIt != groupList.end()) { - if ((*groupIt)->flag & RS_GROUP_FLAG_STANDARD) { - // can't edit standard groups - } else { - changed = true; - (*groupIt)->set(groupInfo); - } - } - } + if(it == groupList.end()) + { + std::cerr << "(EE) cannot find local node group with ID " << groupId << std::endl; + return false ; + } - if (changed) { + if (it->second.flag & RS_GROUP_FLAG_STANDARD) + { + // can't edit standard groups + std::cerr << "(EE) cannot edit standard group with ID " << groupId << std::endl; + return false ; + } + else + { + changed = true; + it->second = groupInfo; + } + } + + if (changed) + { RsServer::notify()->notifyListChange(NOTIFY_LIST_GROUPLIST, NOTIFY_TYPE_MOD); IndicateConfigChanged(); @@ -2537,31 +2545,35 @@ bool p3PeerMgrIMPL::editGroup(const std::string &groupId, RsGroupInfo &groupInfo return changed; } -bool p3PeerMgrIMPL::removeGroup(const std::string &groupId) +bool p3PeerMgrIMPL::removeGroup(const RsNodeGroupId& groupId) { - if (groupId.empty()) { - return false; - } - bool changed = false; { RsStackMutex stack(mPeerMtx); /****** STACK LOCK MUTEX *******/ - std::list::iterator groupIt; - for (groupIt = groupList.begin(); groupIt != groupList.end(); ++groupIt) { - if ((*groupIt)->id == groupId) { - break; - } - } + std::map::iterator it = groupList.find(groupId) ; - if (groupIt != groupList.end()) { - if ((*groupIt)->flag & RS_GROUP_FLAG_STANDARD) { + if (it != groupList.end()) { + if (it->second.flag & RS_GROUP_FLAG_STANDARD) + { // can't remove standard groups - } else { + std::cerr << "(EE) cannot remove standard group with ID " << groupId << std::endl; + return false ; + } +#warning we need to check that the local group is not used. Otherwise deleting it is going to cause problems! +// else if(!it->second.used_gxs_groups.empty()) +// { +// std::cerr << "(EE) cannot remove standard group with ID " << groupId << " because it is used in the following groups: " << std::endl; +// for(std::set::const_iterator it2(it->second.used_gxs_groups.begin());it2!=it->second.used_gxs_groups.end();++it2) +// std::cerr << " " << *it2 << std::endl; +// +// return false ; +// } + else + { changed = true; - delete(*groupIt); - groupList.erase(groupIt); + groupList.erase(it); } } } @@ -2575,82 +2587,83 @@ bool p3PeerMgrIMPL::removeGroup(const std::string &groupId) return changed; } -bool p3PeerMgrIMPL::getGroupInfo(const std::string &groupId, RsGroupInfo &groupInfo) +bool p3PeerMgrIMPL::getGroupInfoByName(const std::string& groupName, RsGroupInfo &groupInfo) { - if (groupId.empty()) { - return false; - } + RsStackMutex stack(mPeerMtx); /****** STACK LOCK MUTEX *******/ + for(std::map::iterator it = groupList.begin();it!=groupList.end();++it) + if(it->second.name == groupName) + { + groupInfo = it->second ; + return true ; + } + + std::cerr << "(EE) getGroupInfoByName: no known group for name " << groupName << std::endl; + return false ; +} +bool p3PeerMgrIMPL::getGroupInfo(const RsNodeGroupId& groupId, RsGroupInfo &groupInfo) +{ RsStackMutex stack(mPeerMtx); /****** STACK LOCK MUTEX *******/ - std::list::iterator groupIt; - for (groupIt = groupList.begin(); groupIt != groupList.end(); ++groupIt) { - if ((*groupIt)->id == groupId) { - (*groupIt)->get(groupInfo); + std::map::iterator it = groupList.find(groupId) ; - return true; - } - } + if(it == groupList.end()) + return false ; - return false; + groupInfo = it->second; + + return true; } -bool p3PeerMgrIMPL::getGroupInfoList(std::list &groupInfoList) +bool p3PeerMgrIMPL::getGroupInfoList(std::list& groupInfoList) { RsStackMutex stack(mPeerMtx); /****** STACK LOCK MUTEX *******/ - std::list::iterator groupIt; - for (groupIt = groupList.begin(); groupIt != groupList.end(); ++groupIt) { - RsGroupInfo groupInfo; - (*groupIt)->get(groupInfo); - groupInfoList.push_back(groupInfo); - } + for (std::map ::const_iterator groupIt = groupList.begin(); groupIt != groupList.end(); ++groupIt) + groupInfoList.push_back(groupIt->second); return true; } -// groupId == "" && assign == false -> remove from all groups -bool p3PeerMgrIMPL::assignPeersToGroup(const std::string &groupId, const std::list &peerIds, bool assign) -{ - if (groupId.empty() && assign == true) { - return false; - } +// groupId.isNull() && assign == false -> remove from all groups - if (peerIds.empty()) { +bool p3PeerMgrIMPL::assignPeersToGroup(const RsNodeGroupId &groupId, const std::list &peerIds, bool assign) +{ + if (groupId.isNull() && assign == true) + return false; + + if (peerIds.empty()) return false; - } bool changed = false; { RsStackMutex stack(mPeerMtx); /****** STACK LOCK MUTEX *******/ - std::list::iterator groupIt; - for (groupIt = groupList.begin(); groupIt != groupList.end(); ++groupIt) { - if (groupId.empty() || (*groupIt)->id == groupId) { - RsPeerGroupItem *groupItem = *groupIt; + for (std::map::iterator groupIt = groupList.begin(); groupIt != groupList.end(); ++groupIt) + if (groupId.isNull() || groupIt->first == groupId) + { + RsGroupInfo& groupItem = groupIt->second; - std::list::const_iterator peerIt; - for (peerIt = peerIds.begin(); peerIt != peerIds.end(); ++peerIt) { - std::set::iterator peerIt1 = std::find(groupItem->pgpList.ids.begin(), groupItem->pgpList.ids.end(), *peerIt); - if (assign) { - if (peerIt1 == groupItem->pgpList.ids.end()) { - groupItem->pgpList.ids.insert(*peerIt); - changed = true; - } - } else { - if (peerIt1 != groupItem->pgpList.ids.end()) { - groupItem->pgpList.ids.erase(peerIt1); - changed = true; - } + for (std::list::const_iterator peerIt = peerIds.begin(); peerIt != peerIds.end(); ++peerIt) + { + std::set::iterator peerIt1 = groupItem.peerIds.find(*peerIt); + + if (assign) + { + groupItem.peerIds.insert(*peerIt); + changed = true; + } + else + { + groupItem.peerIds.erase(*peerIt); + changed = true; } } - if (groupId.empty() == false) { + if (!groupId.isNull()) break; - } } - } } if (changed) { diff --git a/libretroshare/src/pqi/p3peermgr.h b/libretroshare/src/pqi/p3peermgr.h index 62c194bbf..ee581b275 100644 --- a/libretroshare/src/pqi/p3peermgr.h +++ b/libretroshare/src/pqi/p3peermgr.h @@ -106,7 +106,7 @@ class peerState uint32_t maxDnRate ; }; -class RsPeerGroupItem; +class RsNodeGroupItem; class RsGroupInfo; std::string textPeerState(peerState &state); @@ -139,11 +139,12 @@ virtual bool removeAllFriendLocations(const RsPgpId &gpgid) = 0; /* This is solely used by p3peers - makes sense */ virtual bool addGroup(RsGroupInfo &groupInfo) = 0; -virtual bool editGroup(const std::string &groupId, RsGroupInfo &groupInfo) = 0; -virtual bool removeGroup(const std::string &groupId) = 0; -virtual bool getGroupInfo(const std::string &groupId, RsGroupInfo &groupInfo) = 0; +virtual bool editGroup(const RsNodeGroupId &groupId, RsGroupInfo &groupInfo) = 0; +virtual bool removeGroup(const RsNodeGroupId &groupId) = 0; +virtual bool getGroupInfo(const RsNodeGroupId &groupId, RsGroupInfo &groupInfo) = 0; +virtual bool getGroupInfoByName(const std::string& groupName, RsGroupInfo &groupInfo) = 0; virtual bool getGroupInfoList(std::list &groupInfoList) = 0; -virtual bool assignPeersToGroup(const std::string &groupId, const std::list &peerIds, bool assign) = 0; +virtual bool assignPeersToGroup(const RsNodeGroupId &groupId, const std::list &peerIds, bool assign) = 0; virtual bool resetOwnExternalAddressList() = 0 ; @@ -231,181 +232,182 @@ virtual bool locked_computeCurrentBestOwnExtAddressCandidate(sockaddr_storage class p3PeerMgrIMPL: public p3PeerMgr, public p3Config { - public: +public: -/************************************************************************************************/ -/* EXTERNAL INTERFACE */ -/************************************************************************************************/ + /************************************************************************************************/ + /* EXTERNAL INTERFACE */ + /************************************************************************************************/ -virtual bool addFriend(const RsPeerId&ssl_id, const RsPgpId&gpg_id, uint32_t netMode = RS_NET_MODE_UDP, - uint16_t vsDisc = RS_VS_DISC_FULL, uint16_t vsDht = RS_VS_DHT_FULL, - time_t lastContact = 0,ServicePermissionFlags = ServicePermissionFlags(RS_NODE_PERM_DEFAULT)); -virtual bool removeFriend(const RsPeerId &ssl_id, bool removePgpId); -virtual bool removeFriend(const RsPgpId &pgp_id); + virtual bool addFriend(const RsPeerId&ssl_id, const RsPgpId&gpg_id, uint32_t netMode = RS_NET_MODE_UDP, + uint16_t vsDisc = RS_VS_DISC_FULL, uint16_t vsDht = RS_VS_DHT_FULL, + time_t lastContact = 0,ServicePermissionFlags = ServicePermissionFlags(RS_NODE_PERM_DEFAULT)); + virtual bool removeFriend(const RsPeerId &ssl_id, bool removePgpId); + virtual bool removeFriend(const RsPgpId &pgp_id); -virtual bool isFriend(const RsPeerId &ssl_id); + virtual bool isFriend(const RsPeerId &ssl_id); -virtual bool getAssociatedPeers(const RsPgpId &gpg_id, std::list &ids); -virtual bool removeAllFriendLocations(const RsPgpId &gpgid); + virtual bool getAssociatedPeers(const RsPgpId &gpg_id, std::list &ids); + virtual bool removeAllFriendLocations(const RsPgpId &gpgid); - /******************** Groups **********************/ - /* This is solely used by p3peers - makes sense */ + /******************** Groups **********************/ + /* This is solely used by p3peers - makes sense */ -virtual bool addGroup(RsGroupInfo &groupInfo); -virtual bool editGroup(const std::string &groupId, RsGroupInfo &groupInfo); -virtual bool removeGroup(const std::string &groupId); -virtual bool getGroupInfo(const std::string &groupId, RsGroupInfo &groupInfo); -virtual bool getGroupInfoList(std::list &groupInfoList); -virtual bool assignPeersToGroup(const std::string &groupId, const std::list &peerIds, bool assign); + virtual bool addGroup(RsGroupInfo &groupInfo); + virtual bool editGroup(const RsNodeGroupId &groupId, RsGroupInfo &groupInfo); + virtual bool removeGroup(const RsNodeGroupId &groupId); + virtual bool getGroupInfo(const RsNodeGroupId &groupId, RsGroupInfo &groupInfo); + virtual bool getGroupInfoByName(const std::string& groupName, RsGroupInfo &groupInfo) ; + virtual bool getGroupInfoList(std::list &groupInfoList); + virtual bool assignPeersToGroup(const RsNodeGroupId &groupId, const std::list &peerIds, bool assign); virtual ServicePermissionFlags servicePermissionFlags(const RsPgpId& gpg_id) ; - virtual ServicePermissionFlags servicePermissionFlags(const RsPeerId& ssl_id) ; - virtual void setServicePermissionFlags(const RsPgpId& gpg_id,const ServicePermissionFlags& flags) ; + virtual ServicePermissionFlags servicePermissionFlags(const RsPeerId& ssl_id) ; + virtual void setServicePermissionFlags(const RsPgpId& gpg_id,const ServicePermissionFlags& flags) ; - /**************** Set Net Info ****************/ - /* - * These functions are used by: - * 1) p3linkmgr - * 2) p3peers - reasonable - * 3) p3disc - reasonable - */ + /**************** Set Net Info ****************/ + /* + * These functions are used by: + * 1) p3linkmgr + * 2) p3peers - reasonable + * 3) p3disc - reasonable + */ -virtual bool setLocalAddress(const RsPeerId &id, const struct sockaddr_storage &addr); -virtual bool setExtAddress(const RsPeerId &id, const struct sockaddr_storage &addr); -virtual bool setDynDNS(const RsPeerId &id, const std::string &dyndns); -virtual bool addCandidateForOwnExternalAddress(const RsPeerId& from, const struct sockaddr_storage &addr) ; -virtual bool getExtAddressReportedByFriends(struct sockaddr_storage& addr, uint8_t &isstable) ; + virtual bool setLocalAddress(const RsPeerId &id, const struct sockaddr_storage &addr); + virtual bool setExtAddress(const RsPeerId &id, const struct sockaddr_storage &addr); + virtual bool setDynDNS(const RsPeerId &id, const std::string &dyndns); + virtual bool addCandidateForOwnExternalAddress(const RsPeerId& from, const struct sockaddr_storage &addr) ; + virtual bool getExtAddressReportedByFriends(struct sockaddr_storage& addr, uint8_t &isstable) ; -virtual bool setNetworkMode(const RsPeerId &id, uint32_t netMode); -virtual bool setVisState(const RsPeerId &id, uint16_t vs_disc, uint16_t vs_dht); + virtual bool setNetworkMode(const RsPeerId &id, uint32_t netMode); + virtual bool setVisState(const RsPeerId &id, uint16_t vs_disc, uint16_t vs_dht); -virtual bool setLocation(const RsPeerId &pid, const std::string &location); -virtual bool setHiddenDomainPort(const RsPeerId &id, const std::string &domain_addr, const uint16_t domain_port); - -virtual bool updateCurrentAddress(const RsPeerId& id, const pqiIpAddress &addr); -virtual bool updateLastContact(const RsPeerId& id); -virtual bool updateAddressList(const RsPeerId& id, const pqiIpAddrSet &addrs); + virtual bool setLocation(const RsPeerId &pid, const std::string &location); + virtual bool setHiddenDomainPort(const RsPeerId &id, const std::string &domain_addr, const uint16_t domain_port); + + virtual bool updateCurrentAddress(const RsPeerId& id, const pqiIpAddress &addr); + virtual bool updateLastContact(const RsPeerId& id); + virtual bool updateAddressList(const RsPeerId& id, const pqiIpAddrSet &addrs); virtual bool resetOwnExternalAddressList() ; - // THIS MUST ONLY BE CALLED BY NETMGR!!!! -virtual bool UpdateOwnAddress(const struct sockaddr_storage &local_addr, const struct sockaddr_storage &ext_addr); - /**************** Net Status Info ****************/ - /* - * MUST RATIONALISE THE DATA FROM THESE FUNCTIONS - * These functions are used by: - * 1) p3face-config ... to remove! - * 2) p3peers - reasonable - * 3) p3disc - reasonable - */ + // THIS MUST ONLY BE CALLED BY NETMGR!!!! + virtual bool UpdateOwnAddress(const struct sockaddr_storage &local_addr, const struct sockaddr_storage &ext_addr); + /**************** Net Status Info ****************/ + /* + * MUST RATIONALISE THE DATA FROM THESE FUNCTIONS + * These functions are used by: + * 1) p3face-config ... to remove! + * 2) p3peers - reasonable + * 3) p3disc - reasonable + */ -virtual bool getOwnNetStatus(peerState &state); -virtual bool getFriendNetStatus(const RsPeerId &id, peerState &state); -virtual bool getOthersNetStatus(const RsPeerId &id, peerState &state); + virtual bool getOwnNetStatus(peerState &state); + virtual bool getFriendNetStatus(const RsPeerId &id, peerState &state); + virtual bool getOthersNetStatus(const RsPeerId &id, peerState &state); -virtual bool getPeerName(const RsPeerId& ssl_id, std::string& name); -virtual bool getGpgId(const RsPeerId& sslId, RsPgpId& gpgId); -virtual uint32_t getConnectionType(const RsPeerId& sslId); + virtual bool getPeerName(const RsPeerId& ssl_id, std::string& name); + virtual bool getGpgId(const RsPeerId& sslId, RsPgpId& gpgId); + virtual uint32_t getConnectionType(const RsPeerId& sslId); -virtual bool setProxyServerAddress(const uint32_t type, const struct sockaddr_storage &proxy_addr); -virtual bool getProxyServerAddress(const uint32_t type, struct sockaddr_storage &proxy_addr); -virtual bool getProxyServerStatus(const uint32_t type, uint32_t &proxy_status); -virtual bool isHidden(); -virtual bool isHidden(const uint32_t type); -virtual bool isHiddenPeer(const RsPeerId &ssl_id); -virtual bool isHiddenPeer(const RsPeerId &ssl_id, const uint32_t type); -virtual bool getProxyAddress(const RsPeerId& ssl_id, struct sockaddr_storage &proxy_addr, std::string &domain_addr, uint16_t &domain_port); -virtual uint32_t hiddenDomainToHiddenType(const std::string &domain); -virtual uint32_t getHiddenType(const RsPeerId &ssl_id); + virtual bool setProxyServerAddress(const uint32_t type, const struct sockaddr_storage &proxy_addr); + virtual bool getProxyServerAddress(const uint32_t type, struct sockaddr_storage &proxy_addr); + virtual bool getProxyServerStatus(const uint32_t type, uint32_t &proxy_status); + virtual bool isHidden(); + virtual bool isHidden(const uint32_t type); + virtual bool isHiddenPeer(const RsPeerId &ssl_id); + virtual bool isHiddenPeer(const RsPeerId &ssl_id, const uint32_t type); + virtual bool getProxyAddress(const RsPeerId& ssl_id, struct sockaddr_storage &proxy_addr, std::string &domain_addr, uint16_t &domain_port); + virtual uint32_t hiddenDomainToHiddenType(const std::string &domain); + virtual uint32_t getHiddenType(const RsPeerId &ssl_id); -virtual int getFriendCount(bool ssl, bool online); + virtual int getFriendCount(bool ssl, bool online); - /************* DEPRECIATED FUNCTIONS (TO REMOVE) ********/ + /************* DEPRECIATED FUNCTIONS (TO REMOVE) ********/ - // Single Use Function... shouldn't be here. used by p3serverconfig.cc -virtual bool haveOnceConnected(); + // Single Use Function... shouldn't be here. used by p3serverconfig.cc + virtual bool haveOnceConnected(); -virtual bool setMaxRates(const RsPgpId& pid,uint32_t maxUp,uint32_t maxDn); -virtual bool getMaxRates(const RsPgpId& pid,uint32_t& maxUp,uint32_t& maxDn); -virtual bool getMaxRates(const RsPeerId& pid,uint32_t& maxUp,uint32_t& maxDn); + virtual bool setMaxRates(const RsPgpId& pid,uint32_t maxUp,uint32_t maxDn); + virtual bool getMaxRates(const RsPgpId& pid,uint32_t& maxUp,uint32_t& maxDn); + virtual bool getMaxRates(const RsPeerId& pid,uint32_t& maxUp,uint32_t& maxDn); -/************************************************************************************************/ -/* Extra IMPL Functions (used by p3LinkMgr, p3NetMgr + Setup) */ -/************************************************************************************************/ + /************************************************************************************************/ + /* Extra IMPL Functions (used by p3LinkMgr, p3NetMgr + Setup) */ + /************************************************************************************************/ - p3PeerMgrIMPL( const RsPeerId& ssl_own_id, - const RsPgpId& gpg_own_id, - const std::string& gpg_own_name, - const std::string& ssl_own_location) ; + p3PeerMgrIMPL( const RsPeerId& ssl_own_id, + const RsPgpId& gpg_own_id, + const std::string& gpg_own_name, + const std::string& ssl_own_location) ; -void setManagers(p3LinkMgrIMPL *linkMgr, p3NetMgrIMPL *netMgr); + void setManagers(p3LinkMgrIMPL *linkMgr, p3NetMgrIMPL *netMgr); -bool forceHiddenNode(); -bool setupHiddenNode(const std::string &hiddenAddress, const uint16_t hiddenPort); + bool forceHiddenNode(); + bool setupHiddenNode(const std::string &hiddenAddress, const uint16_t hiddenPort); -void tick(); + void tick(); -const RsPeerId& getOwnId(); -bool setOwnNetworkMode(uint32_t netMode); -bool setOwnVisState(uint16_t vs_disc, uint16_t vs_dht); + const RsPeerId& getOwnId(); + bool setOwnNetworkMode(uint32_t netMode); + bool setOwnVisState(uint16_t vs_disc, uint16_t vs_dht); -int getConnectAddresses(const RsPeerId &id, - struct sockaddr_storage &lAddr, struct sockaddr_storage &eAddr, - pqiIpAddrSet &histAddrs, std::string &dyndns); + int getConnectAddresses(const RsPeerId &id, + struct sockaddr_storage &lAddr, struct sockaddr_storage &eAddr, + pqiIpAddrSet &histAddrs, std::string &dyndns); protected: - /* Internal Functions */ + /* Internal Functions */ -bool removeUnusedLocations(); -bool removeBannedIps(); + bool removeUnusedLocations(); + bool removeBannedIps(); -void printPeerLists(std::ostream &out); + void printPeerLists(std::ostream &out); -virtual bool locked_computeCurrentBestOwnExtAddressCandidate(sockaddr_storage &addr, uint32_t &count); + virtual bool locked_computeCurrentBestOwnExtAddressCandidate(sockaddr_storage &addr, uint32_t &count); - protected: -/*****************************************************************/ -/*********************** p3config ******************************/ - /* Key Functions to be overloaded for Full Configuration */ - virtual RsSerialiser *setupSerialiser(); - virtual bool saveList(bool &cleanup, std::list&); - virtual void saveDone(); - virtual bool loadList(std::list& load); -/*****************************************************************/ +protected: + /*****************************************************************/ + /*********************** p3config ******************************/ + /* Key Functions to be overloaded for Full Configuration */ + virtual RsSerialiser *setupSerialiser(); + virtual bool saveList(bool &cleanup, std::list&); + virtual void saveDone(); + virtual bool loadList(std::list& load); + /*****************************************************************/ - /* other important managers */ + /* other important managers */ + + p3LinkMgrIMPL *mLinkMgr; + p3NetMgrIMPL *mNetMgr; - p3LinkMgrIMPL *mLinkMgr; - p3NetMgrIMPL *mNetMgr; - private: - RsMutex mPeerMtx; /* protects below */ + RsMutex mPeerMtx; /* protects below */ - bool mStatusChanged; + bool mStatusChanged; - std::list clients; + std::list clients; - peerState mOwnState; + peerState mOwnState; - std::map mFriendList; // - std::map mOthersList; + std::map mFriendList; // + std::map mOthersList; - std::map mReportedOwnAddresses ; - - std::list groupList; - uint32_t lastGroupId; + std::map mReportedOwnAddresses ; - std::list saveCleanupList; /* TEMPORARY LIST WHEN SAVING */ + std::map groupList; + uint32_t lastGroupId; - std::map mFriendsPermissionFlags ; // permission flags for each gpg key - std::map mPeerBandwidthLimits ; // bandwidth limits for each gpg key + std::list saveCleanupList; /* TEMPORARY LIST WHEN SAVING */ - struct sockaddr_storage mProxyServerAddressTor; - struct sockaddr_storage mProxyServerAddressI2P; - uint32_t mProxyServerStatusTor ; - uint32_t mProxyServerStatusI2P ; + std::map mFriendsPermissionFlags ; // permission flags for each gpg key + std::map mPeerBandwidthLimits ; // bandwidth limits for each gpg key + + struct sockaddr_storage mProxyServerAddressTor; + struct sockaddr_storage mProxyServerAddressI2P; + uint32_t mProxyServerStatusTor ; + uint32_t mProxyServerStatusI2P ; }; diff --git a/libretroshare/src/retroshare/rsfiles.h b/libretroshare/src/retroshare/rsfiles.h index c6480b540..e528fa916 100644 --- a/libretroshare/src/retroshare/rsfiles.h +++ b/libretroshare/src/retroshare/rsfiles.h @@ -99,7 +99,7 @@ struct SharedDirInfo std::string filename ; std::string virtualname ; FileStorageFlags shareflags ; // DIR_FLAGS_NETWORK_WIDE_OTHERS | DIR_FLAGS_BROWSABLE_GROUPS | ... - std::list parent_groups ; + std::list parent_groups ; }; class RsFiles diff --git a/libretroshare/src/retroshare/rsgxsflags.h b/libretroshare/src/retroshare/rsgxsflags.h index c9b92c6f1..6233fc1fd 100644 --- a/libretroshare/src/retroshare/rsgxsflags.h +++ b/libretroshare/src/retroshare/rsgxsflags.h @@ -34,6 +34,7 @@ namespace GXS_SERV { static const uint32_t FLAG_AUTHOR_AUTHENTICATION_REQUIRED = 0x00000200; static const uint32_t FLAG_AUTHOR_AUTHENTICATION_IFNOPUBSIGN = 0x00000400; static const uint32_t FLAG_AUTHOR_AUTHENTICATION_TRACK_MESSAGES = 0x00000800; + static const uint32_t FLAG_AUTHOR_AUTHENTICATION_GPG_KNOWN = 0x00001000; static const uint32_t FLAG_GROUP_SIGN_PUBLISH_MASK = 0x000000ff; static const uint32_t FLAG_GROUP_SIGN_PUBLISH_ENCRYPTED = 0x00000001; @@ -105,6 +106,7 @@ namespace GXS_SERV { #define IS_MSG_UNPROCESSED(status) (status & GXS_SERV::GXS_MSG_STATUS_UNPROCESSED) #define IS_GROUP_PGP_AUTHED(signFlags) (signFlags & GXS_SERV::FLAG_AUTHOR_AUTHENTICATION_GPG) +#define IS_GROUP_PGP_KNOWN_AUTHED(signFlags) (signFlags & GXS_SERV::FLAG_AUTHOR_AUTHENTICATION_GPG_KNOWN) #define IS_GROUP_MESSAGE_TRACKING(signFlags) (signFlags & GXS_SERV::FLAG_AUTHOR_AUTHENTICATION_TRACK_MESSAGES) #define IS_GROUP_ADMIN(subscribeFlags) (subscribeFlags & GXS_SERV::GROUP_SUBSCRIBE_ADMIN) diff --git a/libretroshare/src/retroshare/rsidentity.h b/libretroshare/src/retroshare/rsidentity.h index e57d43162..bf6a80724 100644 --- a/libretroshare/src/retroshare/rsidentity.h +++ b/libretroshare/src/retroshare/rsidentity.h @@ -221,46 +221,48 @@ public: RsIdentity(RsGxsIface *gxs): RsGxsIfaceHelper(gxs) { return; } virtual ~RsIdentity() { return; } -/********************************************************************************************/ -/********************************************************************************************/ - - // For Other Services.... - // It should be impossible for them to get a message which we don't have the identity. - // Its a major error if we don't have the identity. + /********************************************************************************************/ + /********************************************************************************************/ - // We cache all identities, and provide alternative (instantaneous) - // functions to extract info, rather than the standard Token system. + // For Other Services.... + // It should be impossible for them to get a message which we don't have the identity. + // Its a major error if we don't have the identity. -//virtual bool getNickname(const RsGxsId &id, std::string &nickname) = 0; -virtual bool getIdDetails(const RsGxsId &id, RsIdentityDetails &details) = 0; + // We cache all identities, and provide alternative (instantaneous) + // functions to extract info, rather than the standard Token system. -// Fills up list of all own ids. Returns false if ids are not yet loaded. -virtual bool getOwnIds(std::list &ownIds) = 0; -virtual bool isOwnId(const RsGxsId& id) = 0; + //virtual bool getNickname(const RsGxsId &id, std::string &nickname) = 0; + virtual bool getIdDetails(const RsGxsId &id, RsIdentityDetails &details) = 0; - // -virtual bool submitOpinion(uint32_t& token, const RsGxsId &id, - bool absOpinion, int score) = 0; -virtual bool createIdentity(uint32_t& token, RsIdentityParameters ¶ms) = 0; + // Fills up list of all own ids. Returns false if ids are not yet loaded. + virtual bool getOwnIds(std::list &ownIds) = 0; + virtual bool isOwnId(const RsGxsId& id) = 0; -virtual bool updateIdentity(uint32_t& token, RsGxsIdGroup &group) = 0; -virtual bool deleteIdentity(uint32_t& token, RsGxsIdGroup &group) = 0; + // + virtual bool submitOpinion(uint32_t& token, const RsGxsId &id, + bool absOpinion, int score) = 0; + virtual bool createIdentity(uint32_t& token, RsIdentityParameters ¶ms) = 0; -virtual bool parseRecognTag(const RsGxsId &id, const std::string &nickname, - const std::string &tag, RsRecognTagDetails &details) = 0; -virtual bool getRecognTagRequest(const RsGxsId &id, const std::string &comment, - uint16_t tag_class, uint16_t tag_type, std::string &tag) = 0; + virtual bool updateIdentity(uint32_t& token, RsGxsIdGroup &group) = 0; + virtual bool deleteIdentity(uint32_t& token, RsGxsIdGroup &group) = 0; + + virtual bool parseRecognTag(const RsGxsId &id, const std::string &nickname, + const std::string &tag, RsRecognTagDetails &details) = 0; + virtual bool getRecognTagRequest(const RsGxsId &id, const std::string &comment, + uint16_t tag_class, uint16_t tag_type, std::string &tag) = 0; virtual bool setAsRegularContact(const RsGxsId& id,bool is_a_contact) = 0 ; virtual bool isARegularContact(const RsGxsId& id) = 0 ; - - // Specific RsIdentity Functions.... - /* Specific Service Data */ - /* We expose these initially for testing / GUI purposes. + virtual bool isBanned(const RsGxsId& id) =0; + virtual time_t getLastUsageTS(const RsGxsId &id) =0; + + // Specific RsIdentity Functions.... + /* Specific Service Data */ + /* We expose these initially for testing / GUI purposes. */ -virtual bool getGroupData(const uint32_t &token, std::vector &groups) = 0; -//virtual bool getMsgData(const uint32_t &token, std::vector &opinions) = 0; + virtual bool getGroupData(const uint32_t &token, std::vector &groups) = 0; + //virtual bool getMsgData(const uint32_t &token, std::vector &opinions) = 0; }; diff --git a/libretroshare/src/retroshare/rsids.h b/libretroshare/src/retroshare/rsids.h index 6cd97f5ad..60b5392c7 100644 --- a/libretroshare/src/retroshare/rsids.h +++ b/libretroshare/src/retroshare/rsids.h @@ -73,14 +73,13 @@ template c memcpy(bytes,id.toByteArray(),ID_SIZE_IN_BYTES) ; } - // Random initialization. Can be useful for testing. + // Random initialization. Can be useful for testing and to generate new ids. // static t_RsGenericIdType random() { t_RsGenericIdType id ; - for(uint32_t i=0;i SSLIdType ; typedef t_RsGenericIdType< PGP_KEY_ID_SIZE , true, RS_GENERIC_ID_PGP_ID_TYPE> PGPIdType ; @@ -231,4 +231,5 @@ typedef t_RsGenericIdType< CERT_SIGN_LEN , false, RS_GENERIC_ID_GXS_I typedef t_RsGenericIdType< CERT_SIGN_LEN , false, RS_GENERIC_ID_GXS_CIRCLE_ID_TYPE > GXSCircleId ; typedef t_RsGenericIdType< SSL_ID_SIZE , false, RS_GENERIC_ID_GXS_TUNNEL_ID_TYPE > GXSTunnelId ; typedef t_RsGenericIdType< SSL_ID_SIZE , false, RS_GENERIC_ID_GXS_DISTANT_CHAT_ID_TYPE > DistantChatPeerId ; +typedef t_RsGenericIdType< CERT_SIGN_LEN , false, RS_GENERIC_ID_NODE_GROUP_ID_TYPE > RsNodeGroupId ; diff --git a/libretroshare/src/retroshare/rspeers.h b/libretroshare/src/retroshare/rspeers.h index 3cad47cad..073700b71 100644 --- a/libretroshare/src/retroshare/rspeers.h +++ b/libretroshare/src/retroshare/rspeers.h @@ -185,11 +185,17 @@ const uint32_t RS_NET_PROXY_STATUS_OK = 0x0001 ; /* Groups */ -#define RS_GROUP_ID_FRIENDS "Friends" -#define RS_GROUP_ID_FAMILY "Family" -#define RS_GROUP_ID_COWORKERS "Co-Workers" -#define RS_GROUP_ID_OTHERS "Other Contacts" -#define RS_GROUP_ID_FAVORITES "Favorites" +static const RsNodeGroupId RS_GROUP_ID_FRIENDS ("00000000000000000000000000000001"); +static const RsNodeGroupId RS_GROUP_ID_FAMILY ("00000000000000000000000000000002"); +static const RsNodeGroupId RS_GROUP_ID_COWORKERS ("00000000000000000000000000000003"); +static const RsNodeGroupId RS_GROUP_ID_OTHERS ("00000000000000000000000000000004"); +static const RsNodeGroupId RS_GROUP_ID_FAVORITES ("00000000000000000000000000000005"); + +#define RS_GROUP_DEFAULT_NAME_FRIENDS "Friends" +#define RS_GROUP_DEFAULT_NAME_FAMILY "Family" +#define RS_GROUP_DEFAULT_NAME_COWORKERS "Co-Workers" +#define RS_GROUP_DEFAULT_NAME_OTHERS "Other Contacts" +#define RS_GROUP_DEFAULT_NAME_FAVORITES "Favorites" const uint32_t RS_GROUP_FLAG_STANDARD = 0x0001; @@ -295,7 +301,7 @@ class RsGroupInfo public: RsGroupInfo(); - std::string id; + RsNodeGroupId id; std::string name; uint32_t flag; @@ -399,14 +405,15 @@ public: virtual bool trustGPGCertificate(const RsPgpId &gpg_id, uint32_t trustlvl) = 0; /* Group Stuff */ - virtual bool addGroup(RsGroupInfo &groupInfo) = 0; - virtual bool editGroup(const std::string &groupId, RsGroupInfo &groupInfo) = 0; - virtual bool removeGroup(const std::string &groupId) = 0; - virtual bool getGroupInfo(const std::string &groupId, RsGroupInfo &groupInfo) = 0; - virtual bool getGroupInfoList(std::list &groupInfoList) = 0; + virtual bool addGroup(RsGroupInfo& groupInfo) = 0; + virtual bool editGroup(const RsNodeGroupId& groupId, RsGroupInfo& groupInfo) = 0; + virtual bool removeGroup(const RsNodeGroupId& groupId) = 0; + virtual bool getGroupInfo(const RsNodeGroupId& groupId, RsGroupInfo& groupInfo) = 0; + virtual bool getGroupInfoByName(const std::string& groupId, RsGroupInfo& groupInfo) = 0; + virtual bool getGroupInfoList(std::list& groupInfoList) = 0; // groupId == "" && assign == false -> remove from all groups - virtual bool assignPeerToGroup(const std::string &groupId, const RsPgpId& peerId, bool assign) = 0; - virtual bool assignPeersToGroup(const std::string &groupId, const std::list &peerIds, bool assign) = 0; + virtual bool assignPeerToGroup(const RsNodeGroupId& groupId, const RsPgpId& peerId, bool assign) = 0; + virtual bool assignPeersToGroup(const RsNodeGroupId& groupId, const std::list& peerIds, bool assign) = 0; /* Group sharing permission */ @@ -421,7 +428,7 @@ public: // virtual FileSearchFlags computePeerPermissionFlags( const RsPeerId& peer_id, FileStorageFlags file_sharing_flags, - const std::list& file_parent_groups) = 0; + const std::list& file_parent_groups) = 0; /* Service permission flags */ diff --git a/libretroshare/src/retroshare/rsreputations.h b/libretroshare/src/retroshare/rsreputations.h index 6445efd09..f620f3d5e 100644 --- a/libretroshare/src/retroshare/rsreputations.h +++ b/libretroshare/src/retroshare/rsreputations.h @@ -50,14 +50,14 @@ public: }; virtual bool setOwnOpinion(const RsGxsId& key_id, const Opinion& op) =0; - virtual bool getReputationInfo(const RsGxsId& id,ReputationInfo& info) =0 ; + virtual bool getReputationInfo(const RsGxsId& id,const RsPgpId& owner_id,ReputationInfo& info) =0 ; virtual void setNodeAutoBanThreshold(uint32_t n) =0; virtual uint32_t nodeAutoBanThreshold() =0; // This one is a proxy designed to allow fast checking of a GXS id. // it basically returns true if assessment is not ASSESSMENT_OK - virtual bool isIdentityBanned(const RsGxsId& id) =0; + virtual bool isIdentityBanned(const RsGxsId& id,const RsPgpId& owner_node) =0; }; // To access reputations from anywhere diff --git a/libretroshare/src/retroshare/rstypes.h b/libretroshare/src/retroshare/rstypes.h index 37975d605..0ef72e9dc 100644 --- a/libretroshare/src/retroshare/rstypes.h +++ b/libretroshare/src/retroshare/rstypes.h @@ -211,7 +211,7 @@ class FileInfo DwlSpeed priority ; time_t lastTS; - std::list parent_groups ; + std::list parent_groups ; }; std::ostream &operator<<(std::ostream &out, const FileInfo &info); @@ -243,7 +243,7 @@ class DirDetails uint32_t min_age ; // minimum age of files in this subtree std::list children; - std::list parent_groups; // parent groups for the shared directory + std::list parent_groups; // parent groups for the shared directory }; class FileDetail diff --git a/libretroshare/src/rsserver/p3peers.cc b/libretroshare/src/rsserver/p3peers.cc index a415f4987..cbe2a2dde 100644 --- a/libretroshare/src/rsserver/p3peers.cc +++ b/libretroshare/src/rsserver/p3peers.cc @@ -1280,7 +1280,7 @@ bool p3Peers::addGroup(RsGroupInfo &groupInfo) return res ; } -bool p3Peers::editGroup(const std::string &groupId, RsGroupInfo &groupInfo) +bool p3Peers::editGroup(const RsNodeGroupId &groupId, RsGroupInfo &groupInfo) { #ifdef P3PEERS_DEBUG std::cerr << "p3Peers::editGroup()" << std::endl; @@ -1292,7 +1292,7 @@ bool p3Peers::editGroup(const std::string &groupId, RsGroupInfo &groupInfo) return res ; } -bool p3Peers::removeGroup(const std::string &groupId) +bool p3Peers::removeGroup(const RsNodeGroupId &groupId) { #ifdef P3PEERS_DEBUG std::cerr << "p3Peers::removeGroup()" << std::endl; @@ -1303,7 +1303,15 @@ bool p3Peers::removeGroup(const std::string &groupId) return res ; } -bool p3Peers::getGroupInfo(const std::string &groupId, RsGroupInfo &groupInfo) +bool p3Peers::getGroupInfoByName(const std::string& groupName, RsGroupInfo &groupInfo) +{ +#ifdef P3PEERS_DEBUG + std::cerr << "p3Peers::getGroupInfo()" << std::endl; +#endif + + return mPeerMgr->getGroupInfoByName(groupName, groupInfo); +} +bool p3Peers::getGroupInfo(const RsNodeGroupId &groupId, RsGroupInfo &groupInfo) { #ifdef P3PEERS_DEBUG std::cerr << "p3Peers::getGroupInfo()" << std::endl; @@ -1321,7 +1329,7 @@ bool p3Peers::getGroupInfoList(std::list &groupInfoList) return mPeerMgr->getGroupInfoList(groupInfoList); } -bool p3Peers::assignPeerToGroup(const std::string &groupId, const RsPgpId& peerId, bool assign) +bool p3Peers::assignPeerToGroup(const RsNodeGroupId &groupId, const RsPgpId& peerId, bool assign) { std::list peerIds; peerIds.push_back(peerId); @@ -1329,7 +1337,7 @@ bool p3Peers::assignPeerToGroup(const std::string &groupId, const RsPgpId& peerI return assignPeersToGroup(groupId, peerIds, assign); } -bool p3Peers::assignPeersToGroup(const std::string &groupId, const std::list &peerIds, bool assign) +bool p3Peers::assignPeersToGroup(const RsNodeGroupId &groupId, const std::list &peerIds, bool assign) { #ifdef P3PEERS_DEBUG std::cerr << "p3Peers::assignPeersToGroup()" << std::endl; @@ -1343,7 +1351,7 @@ bool p3Peers::assignPeersToGroup(const std::string &groupId, const std::list& directory_parent_groups) + const std::list& directory_parent_groups) { // We should be able to do that in O(1), using groups based on packs of bits. // @@ -1354,7 +1362,7 @@ FileSearchFlags p3Peers::computePeerPermissionFlags(const RsPeerId& peer_ssl_id, bool found = false ; RsPgpId pgp_id = getGPGId(peer_ssl_id) ; - for(std::list::const_iterator it(directory_parent_groups.begin());it!=directory_parent_groups.end() && !found;++it) + for(std::list::const_iterator it(directory_parent_groups.begin());it!=directory_parent_groups.end() && !found;++it) { RsGroupInfo info ; if(!getGroupInfo(*it,info)) diff --git a/libretroshare/src/rsserver/p3peers.h b/libretroshare/src/rsserver/p3peers.h index 25d38c9a3..38fad1c7b 100644 --- a/libretroshare/src/rsserver/p3peers.h +++ b/libretroshare/src/rsserver/p3peers.h @@ -124,14 +124,15 @@ public: /* Group Stuff */ virtual bool addGroup(RsGroupInfo &groupInfo); - virtual bool editGroup(const std::string &groupId, RsGroupInfo &groupInfo); - virtual bool removeGroup(const std::string &groupId); - virtual bool getGroupInfo(const std::string &groupId, RsGroupInfo &groupInfo); - virtual bool getGroupInfoList(std::list &groupInfoList); - virtual bool assignPeerToGroup(const std::string &groupId, const RsPgpId &peerId, bool assign); - virtual bool assignPeersToGroup(const std::string &groupId, const std::list& peerIds, bool assign); + virtual bool editGroup(const RsNodeGroupId &groupId, RsGroupInfo &groupInfo); + virtual bool removeGroup(const RsNodeGroupId &groupId); + virtual bool getGroupInfo(const RsNodeGroupId &groupId, RsGroupInfo &groupInfo); + virtual bool getGroupInfoByName(const std::string& groupName, RsGroupInfo& groupInfo); + virtual bool getGroupInfoList(std::list &groupInfoList); + virtual bool assignPeerToGroup(const RsNodeGroupId &groupId, const RsPgpId &peerId, bool assign); + virtual bool assignPeersToGroup(const RsNodeGroupId &groupId, const std::list& peerIds, bool assign); - virtual FileSearchFlags computePeerPermissionFlags(const RsPeerId& peer_id,FileStorageFlags share_flags,const std::list& parent_groups); + virtual FileSearchFlags computePeerPermissionFlags(const RsPeerId& peer_id, FileStorageFlags share_flags, const std::list &parent_groups); // service permission stuff diff --git a/libretroshare/src/serialiser/rsconfigitems.cc b/libretroshare/src/serialiser/rsconfigitems.cc index 313beb33a..9b94d454d 100644 --- a/libretroshare/src/serialiser/rsconfigitems.cc +++ b/libretroshare/src/serialiser/rsconfigitems.cc @@ -43,34 +43,34 @@ uint32_t RsFileConfigSerialiser::size(RsItem *i) { RsFileTransfer *rft; - RsFileConfigItem *rfi; + RsFileConfigItem *rfj; if (NULL != (rft = dynamic_cast(i))) { return sizeTransfer(rft); } - if (NULL != (rfi = dynamic_cast(i))) - { - return sizeFileItem(rfi); - } - return 0; + if (NULL != (rfj = dynamic_cast(i))) + { + return sizeFileItem(rfj); + } + return 0; } /* serialise the data to the buffer */ bool RsFileConfigSerialiser::serialise(RsItem *i, void *data, uint32_t *pktsize) { RsFileTransfer *rft; - RsFileConfigItem *rfi; + RsFileConfigItem *rfj; if (NULL != (rft = dynamic_cast(i))) { return serialiseTransfer(rft, data, pktsize); } - if (NULL != (rfi = dynamic_cast(i))) - { - return serialiseFileItem(rfi, data, pktsize); - } - return false; + if (NULL != (rfj = dynamic_cast(i))) + { + return serialiseFileItem(rfj, data, pktsize); + } + return false; } RsItem *RsFileConfigSerialiser::deserialise(void *data, uint32_t *pktsize) @@ -90,10 +90,13 @@ RsItem *RsFileConfigSerialiser::deserialise(void *data, uint32_t *pktsize) case RS_PKT_SUBTYPE_FILE_TRANSFER: return deserialiseTransfer(data, pktsize); break; - case RS_PKT_SUBTYPE_FILE_ITEM: - return deserialiseFileItem(data, pktsize); + case RS_PKT_SUBTYPE_FILE_ITEM_deprecated: + return deserialiseFileItem_deprecated(data, pktsize); break; - default: + case RS_PKT_SUBTYPE_FILE_ITEM: + return deserialiseFileItem(data, pktsize); + break; + default: return NULL; break; } @@ -158,20 +161,20 @@ std::ostream &RsFileTransfer::print(std::ostream &out, uint16_t indent) /*************************************************************************/ /*************************************************************************/ -RsFileConfigItem::~RsFileConfigItem() +void RsFileConfigItem_deprecated::clear() { - return; -} - -void RsFileConfigItem::clear() -{ - file.TlvClear(); flags = 0; parent_groups.clear() ; } -std::ostream &RsFileConfigItem::print(std::ostream &out, uint16_t indent) +void RsFileConfigItem::clear() +{ + file.TlvClear(); + flags = 0; + parent_groups.TlvClear() ; +} +std::ostream &RsFileConfigItem_deprecated::print(std::ostream &out, uint16_t indent) { printRsItemBase(out, "RsFileConfigItem", indent); uint16_t int_Indent = indent + 2; @@ -188,6 +191,22 @@ std::ostream &RsFileConfigItem::print(std::ostream &out, uint16_t indent) return out; } +std::ostream &RsFileConfigItem::print(std::ostream &out, uint16_t indent) +{ + printRsItemBase(out, "RsFileConfigItem", indent); + uint16_t int_Indent = indent + 2; + file.print(out, int_Indent); + + printIndent(out, int_Indent); out << "flags: " << flags << std::endl; + printIndent(out, int_Indent); out << "groups:" ; + + for(std::set::const_iterator it(parent_groups.ids.begin());it!=parent_groups.ids.end();++it) + out << (*it) << " " ; + out << std::endl; + + printRsItemEnd(out, "RsFileConfigItem", indent); + return out; +} /*************************************************************************/ /*************************************************************************/ @@ -351,8 +370,7 @@ uint32_t RsFileConfigSerialiser::sizeFileItem(RsFileConfigItem *item) s += item->file.TlvSize(); s += 4; // flags - for(std::list::const_iterator it(item->parent_groups.begin());it!=item->parent_groups.end();++it) // parent groups - s += GetTlvStringSize(*it); + s += item->parent_groups.TlvSize() ; return s; } @@ -382,9 +400,7 @@ bool RsFileConfigSerialiser::serialiseFileItem(RsFileConfigItem *item, void /* add mandatory parts first */ ok &= item->file.SetTlv(data, tlvsize, &offset); ok &= setRawUInt32(data, tlvsize, &offset, item->flags); - - for(std::list::const_iterator it(item->parent_groups.begin());ok && it!=item->parent_groups.end();++it) // parent groups - ok &= SetTlvString(data, tlvsize, &offset, TLV_TYPE_STR_GROUPID, *it); + ok &= item->parent_groups.SetTlv(data, tlvsize, &offset); if (offset != tlvsize) { @@ -397,6 +413,66 @@ bool RsFileConfigSerialiser::serialiseFileItem(RsFileConfigItem *item, void return ok; } +RsFileConfigItem_deprecated *RsFileConfigSerialiser::deserialiseFileItem_deprecated(void *data, uint32_t *pktsize) +{ + /* get the type and size */ + uint32_t rstype = getRsItemId(data); + uint32_t rssize = getRsItemSize(data); + + uint32_t offset = 0; + + + if ((RS_PKT_VERSION1 != getRsItemVersion(rstype)) || + (RS_PKT_CLASS_CONFIG != getRsItemClass(rstype)) || + (RS_PKT_TYPE_FILE_CONFIG != getRsItemType(rstype)) || + (RS_PKT_SUBTYPE_FILE_ITEM_deprecated != getRsItemSubType(rstype))) + { + return NULL; /* wrong type */ + } + + if (*pktsize < rssize) /* check size */ + return NULL; /* not enough data */ + + /* set the packet length */ + *pktsize = rssize; + + bool ok = true; + + /* ready to load */ + RsFileConfigItem_deprecated *item = new RsFileConfigItem_deprecated(); + item->clear(); + + /* skip the header */ + offset += 8; + + /* get mandatory parts first */ + ok &= item->file.GetTlv(data, rssize, &offset); + ok &= getRawUInt32(data, rssize, &offset, &(item->flags)); + + while(offset < rssize) + { + std::string tmp ; + if(GetTlvString(data, rssize, &offset, TLV_TYPE_STR_GROUPID, tmp)) + item->parent_groups.push_back(tmp) ; + else + break ; + } + + if (offset != rssize) + { + /* error */ + delete item; + return NULL; + } + + if (!ok) + { + delete item; + return NULL; + } + + return item; +} RsFileConfigItem *RsFileConfigSerialiser::deserialiseFileItem(void *data, uint32_t *pktsize) { /* get the type and size */ @@ -409,7 +485,7 @@ RsFileConfigItem *RsFileConfigSerialiser::deserialiseFileItem(void *data, uint32 if ((RS_PKT_VERSION1 != getRsItemVersion(rstype)) || (RS_PKT_CLASS_CONFIG != getRsItemClass(rstype)) || (RS_PKT_TYPE_FILE_CONFIG != getRsItemType(rstype)) || - (RS_PKT_SUBTYPE_FILE_ITEM != getRsItemSubType(rstype))) + (RS_PKT_SUBTYPE_FILE_ITEM != getRsItemSubType(rstype))) { return NULL; /* wrong type */ } @@ -423,7 +499,7 @@ RsFileConfigItem *RsFileConfigSerialiser::deserialiseFileItem(void *data, uint32 bool ok = true; /* ready to load */ - RsFileConfigItem *item = new RsFileConfigItem(); + RsFileConfigItem *item = new RsFileConfigItem(); item->clear(); /* skip the header */ @@ -432,15 +508,7 @@ RsFileConfigItem *RsFileConfigSerialiser::deserialiseFileItem(void *data, uint32 /* get mandatory parts first */ ok &= item->file.GetTlv(data, rssize, &offset); ok &= getRawUInt32(data, rssize, &offset, &(item->flags)); - - while(offset < rssize) - { - std::string tmp ; - if(GetTlvString(data, rssize, &offset, TLV_TYPE_STR_GROUPID, tmp)) - item->parent_groups.push_back(tmp) ; - else - break ; - } + ok &= item->parent_groups.GetTlv(data, rssize, &offset) ; if (offset != rssize) { @@ -682,7 +750,7 @@ uint32_t RsPeerConfigSerialiser::size(RsItem *i) { RsPeerStunItem *psi; RsPeerNetItem *pni; - RsPeerGroupItem *pgi; + RsNodeGroupItem *pgi; RsPeerServicePermissionItem *pri; RsPeerBandwidthLimitsItem *pblitem; @@ -694,7 +762,7 @@ uint32_t RsPeerConfigSerialiser::size(RsItem *i) { return sizeStun(psi); } - else if (NULL != (pgi = dynamic_cast(i))) + else if (NULL != (pgi = dynamic_cast(i))) { return sizeGroup(pgi); } @@ -715,7 +783,7 @@ bool RsPeerConfigSerialiser::serialise(RsItem *i, void *data, uint32_t *pktsi { RsPeerNetItem *pni; RsPeerStunItem *psi; - RsPeerGroupItem *pgi; + RsNodeGroupItem *pgi; RsPeerServicePermissionItem *pri; RsPeerBandwidthLimitsItem *pblitem; @@ -727,7 +795,7 @@ bool RsPeerConfigSerialiser::serialise(RsItem *i, void *data, uint32_t *pktsi { return serialiseStun(psi, data, pktsize); } - else if (NULL != (pgi = dynamic_cast(i))) + else if (NULL != (pgi = dynamic_cast(i))) { return serialiseGroup(pgi, data, pktsize); } @@ -764,9 +832,11 @@ RsItem *RsPeerConfigSerialiser::deserialise(void *data, uint32_t *pktsize) return deserialiseNet(data, pktsize); case RS_PKT_SUBTYPE_PEER_STUN: return deserialiseStun(data, pktsize); - case RS_PKT_SUBTYPE_PEER_GROUP: - return deserialiseGroup(data, pktsize); - case RS_PKT_SUBTYPE_PEER_PERMISSIONS: + case RS_PKT_SUBTYPE_PEER_GROUP_deprecated: + return deserialiseGroup_deprecated(data, pktsize); + case RS_PKT_SUBTYPE_NODE_GROUP: + return deserialiseGroup(data, pktsize); + case RS_PKT_SUBTYPE_PEER_PERMISSIONS: return deserialisePermissions(data, pktsize); case RS_PKT_SUBTYPE_PEER_BANDLIMITS: return deserialisePeerBandwidthLimits(data, pktsize); @@ -1312,16 +1382,64 @@ RsPeerStunItem *RsPeerConfigSerialiser::deserialiseStun(void *data, uint32_t *si } /*************************************************************************/ - -RsPeerGroupItem::RsPeerGroupItem() : RsItem(RS_PKT_VERSION1, RS_PKT_CLASS_CONFIG, RS_PKT_TYPE_PEER_CONFIG, RS_PKT_SUBTYPE_PEER_GROUP) +RsNodeGroupItem::RsNodeGroupItem() : RsItem(RS_PKT_VERSION1, RS_PKT_CLASS_CONFIG, RS_PKT_TYPE_PEER_CONFIG, RS_PKT_SUBTYPE_NODE_GROUP) { } -RsPeerGroupItem::~RsPeerGroupItem() +RsNodeGroupItem::RsNodeGroupItem(const RsGroupInfo& g) + :RsItem(RS_PKT_VERSION1, RS_PKT_CLASS_CONFIG, RS_PKT_TYPE_PEER_CONFIG, RS_PKT_SUBTYPE_NODE_GROUP) +{ + id = g.id ; + name = g.name ; + flag = g.flag ; + pgpList.ids = g.peerIds; +} + +void RsNodeGroupItem::clear() +{ + id.clear(); + name.clear(); + flag = 0; + pgpList.ids.clear(); +} + +std::ostream &RsNodeGroupItem::print(std::ostream &out, uint16_t indent) +{ + printRsItemBase(out, "RsNodeGroupItem", indent); + uint16_t int_Indent = indent + 2; + + printIndent(out, int_Indent); + out << "groupId: " << id << std::endl; + + printIndent(out, int_Indent); + out << "groupName: " << name << std::endl; + + printIndent(out, int_Indent); + out << "groupFlag: " << flag << std::endl; + + std::set::iterator it; + for (it = pgpList.ids.begin(); it != pgpList.ids.end(); ++it) { + printIndent(out, int_Indent); + out << "peerId: " << it->toStdString() << std::endl; + } + + printRsItemEnd(out, "RsNodeGroupItem", indent); + return out; +} + +/*************************************************************************/ +/* DEPRECATED CODE. SHOULD BE REMOVED WHEN EVERYONE USES THE NEW CLASS */ +/*************************************************************************/ + +RsPeerGroupItem_deprecated::RsPeerGroupItem_deprecated() : RsItem(RS_PKT_VERSION1, RS_PKT_CLASS_CONFIG, RS_PKT_TYPE_PEER_CONFIG, RS_PKT_SUBTYPE_PEER_GROUP_deprecated) { } -void RsPeerGroupItem::clear() +RsPeerGroupItem_deprecated::~RsPeerGroupItem_deprecated() +{ +} + +void RsPeerGroupItem_deprecated::clear() { id.clear(); name.clear(); @@ -1329,7 +1447,7 @@ void RsPeerGroupItem::clear() pgpList.ids.clear(); } -std::ostream &RsPeerGroupItem::print(std::ostream &out, uint16_t indent) +std::ostream &RsPeerGroupItem_deprecated::print(std::ostream &out, uint16_t indent) { printRsItemBase(out, "RsPeerGroupItem", indent); uint16_t int_Indent = indent + 2; @@ -1353,38 +1471,67 @@ std::ostream &RsPeerGroupItem::print(std::ostream &out, uint16_t indent) return out; } -/* set data from RsGroupInfo to RsPeerGroupItem */ -void RsPeerGroupItem::set(RsGroupInfo &groupInfo) +RsPeerGroupItem_deprecated *RsPeerConfigSerialiser::deserialiseGroup_deprecated(void *data, uint32_t *size) { - id = groupInfo.id; - name = groupInfo.name; - flag = groupInfo.flag; - pgpList.ids = groupInfo.peerIds; -} + /* get the type and size */ + uint32_t rstype = getRsItemId(data); + uint32_t rssize = getRsItemSize(data); -/* get data from RsGroupInfo to RsPeerGroupItem */ -void RsPeerGroupItem::get(RsGroupInfo &groupInfo) -{ - groupInfo.id = id; - groupInfo.name = name; - groupInfo.flag = flag; - groupInfo.peerIds = pgpList.ids; -} + uint32_t offset = 0; + if ((RS_PKT_VERSION1 != getRsItemVersion(rstype)) || + (RS_PKT_CLASS_CONFIG != getRsItemClass(rstype)) || + (RS_PKT_TYPE_PEER_CONFIG != getRsItemType(rstype)) || + (RS_PKT_SUBTYPE_PEER_GROUP_deprecated != getRsItemSubType(rstype))) + { + return NULL; /* wrong type */ + } + + if (*size < rssize) /* check size */ + return NULL; /* not enough data */ + + /* set the packet length */ + *size = rssize; + + bool ok = true; + + RsPeerGroupItem_deprecated *item = new RsPeerGroupItem_deprecated(); + item->clear(); + + /* skip the header */ + offset += 8; + + /* get mandatory parts first */ + uint32_t version; + ok &= getRawUInt32(data, rssize, &offset, &version); + ok &= GetTlvString(data, rssize, &offset, TLV_TYPE_STR_KEY, item->id); + ok &= GetTlvString(data, rssize, &offset, TLV_TYPE_STR_NAME, item->name); + ok &= getRawUInt32(data, rssize, &offset, &(item->flag)); + ok &= item->pgpList.GetTlv(data, rssize, &offset); + + if (offset != rssize) + { + /* error */ + delete item; + return NULL; + } + + return item; +} /*************************************************************************/ -uint32_t RsPeerConfigSerialiser::sizeGroup(RsPeerGroupItem *i) +uint32_t RsPeerConfigSerialiser::sizeGroup(RsNodeGroupItem *i) { uint32_t s = 8; /* header */ s += 4; /* version */ - s += GetTlvStringSize(i->id); + s += RsNodeGroupId::serial_size(); s += GetTlvStringSize(i->name); s += 4; /* flag */ s += i->pgpList.TlvSize(); return s; } -bool RsPeerConfigSerialiser::serialiseGroup(RsPeerGroupItem *item, void *data, uint32_t *size) +bool RsPeerConfigSerialiser::serialiseGroup(RsNodeGroupItem *item, void *data, uint32_t *size) { uint32_t tlvsize = RsPeerConfigSerialiser::sizeGroup(item); uint32_t offset = 0; @@ -1410,7 +1557,7 @@ bool RsPeerConfigSerialiser::serialiseGroup(RsPeerGroupItem *item, void *data, u /* add mandatory parts first */ ok &= setRawUInt32(data, tlvsize, &offset, 0); - ok &= SetTlvString(data, tlvsize, &offset, TLV_TYPE_STR_KEY, item->id); + ok &= item->id.serialise(data, tlvsize, offset); ok &= SetTlvString(data, tlvsize, &offset, TLV_TYPE_STR_NAME, item->name); ok &= setRawUInt32(data, tlvsize, &offset, item->flag); ok &= item->pgpList.SetTlv(data, tlvsize, &offset); @@ -1426,7 +1573,7 @@ bool RsPeerConfigSerialiser::serialiseGroup(RsPeerGroupItem *item, void *data, u return ok; } -RsPeerGroupItem *RsPeerConfigSerialiser::deserialiseGroup(void *data, uint32_t *size) +RsNodeGroupItem *RsPeerConfigSerialiser::deserialiseGroup(void *data, uint32_t *size) { /* get the type and size */ uint32_t rstype = getRsItemId(data); @@ -1437,7 +1584,7 @@ RsPeerGroupItem *RsPeerConfigSerialiser::deserialiseGroup(void *data, uint32_t * if ((RS_PKT_VERSION1 != getRsItemVersion(rstype)) || (RS_PKT_CLASS_CONFIG != getRsItemClass(rstype)) || (RS_PKT_TYPE_PEER_CONFIG != getRsItemType(rstype)) || - (RS_PKT_SUBTYPE_PEER_GROUP != getRsItemSubType(rstype))) + (RS_PKT_SUBTYPE_NODE_GROUP != getRsItemSubType(rstype))) { return NULL; /* wrong type */ } @@ -1450,7 +1597,7 @@ RsPeerGroupItem *RsPeerConfigSerialiser::deserialiseGroup(void *data, uint32_t * bool ok = true; - RsPeerGroupItem *item = new RsPeerGroupItem(); + RsNodeGroupItem *item = new RsNodeGroupItem(); item->clear(); /* skip the header */ @@ -1459,7 +1606,7 @@ RsPeerGroupItem *RsPeerConfigSerialiser::deserialiseGroup(void *data, uint32_t * /* get mandatory parts first */ uint32_t version; ok &= getRawUInt32(data, rssize, &offset, &version); - ok &= GetTlvString(data, rssize, &offset, TLV_TYPE_STR_KEY, item->id); + ok &= item->id.deserialise(data, rssize, offset); ok &= GetTlvString(data, rssize, &offset, TLV_TYPE_STR_NAME, item->name); ok &= getRawUInt32(data, rssize, &offset, &(item->flag)); ok &= item->pgpList.GetTlv(data, rssize, &offset); diff --git a/libretroshare/src/serialiser/rsconfigitems.h b/libretroshare/src/serialiser/rsconfigitems.h index 6fc9f1f6d..3d3d50a97 100644 --- a/libretroshare/src/serialiser/rsconfigitems.h +++ b/libretroshare/src/serialiser/rsconfigitems.h @@ -50,15 +50,17 @@ const uint8_t RS_PKT_TYPE_HISTORY_CONFIG = 0x06; const uint8_t RS_PKT_SUBTYPE_KEY_VALUE = 0x01; /* PEER CONFIG SUBTYPES */ -const uint8_t RS_PKT_SUBTYPE_PEER_STUN = 0x02; -const uint8_t RS_PKT_SUBTYPE_PEER_NET = 0x03; -const uint8_t RS_PKT_SUBTYPE_PEER_GROUP = 0x04; -const uint8_t RS_PKT_SUBTYPE_PEER_PERMISSIONS = 0x05; -const uint8_t RS_PKT_SUBTYPE_PEER_BANDLIMITS = 0x06; +const uint8_t RS_PKT_SUBTYPE_PEER_STUN = 0x02; +const uint8_t RS_PKT_SUBTYPE_PEER_NET = 0x03; +const uint8_t RS_PKT_SUBTYPE_PEER_GROUP_deprecated = 0x04; +const uint8_t RS_PKT_SUBTYPE_PEER_PERMISSIONS = 0x05; +const uint8_t RS_PKT_SUBTYPE_PEER_BANDLIMITS = 0x06; +const uint8_t RS_PKT_SUBTYPE_NODE_GROUP = 0x07; /* FILE CONFIG SUBTYPES */ -const uint8_t RS_PKT_SUBTYPE_FILE_TRANSFER = 0x01; -const uint8_t RS_PKT_SUBTYPE_FILE_ITEM = 0x02; +const uint8_t RS_PKT_SUBTYPE_FILE_TRANSFER = 0x01; +const uint8_t RS_PKT_SUBTYPE_FILE_ITEM_deprecated = 0x02; +const uint8_t RS_PKT_SUBTYPE_FILE_ITEM = 0x03; /**************************************************************************/ @@ -134,11 +136,11 @@ class RsPeerBandwidthLimitsItem : public RsItem std::map peers ; }; -class RsPeerGroupItem : public RsItem +class RsPeerGroupItem_deprecated : public RsItem { public: - RsPeerGroupItem(); - virtual ~RsPeerGroupItem(); + RsPeerGroupItem_deprecated(); + virtual ~RsPeerGroupItem_deprecated(); virtual void clear(); std::ostream &print(std::ostream &out, uint16_t indent = 0); @@ -156,6 +158,29 @@ public: RsTlvPgpIdSet pgpList; }; +class RsNodeGroupItem: public RsItem +{ +public: + RsNodeGroupItem(); + virtual ~RsNodeGroupItem() {} + + virtual void clear(); + std::ostream &print(std::ostream &out, uint16_t indent = 0); + + explicit RsNodeGroupItem(const RsGroupInfo&) ; + + // /* set data from RsGroupInfo to RsPeerGroupItem */ + // void set(RsGroupInfo &groupInfo); + // /* get data from RsGroupInfo to RsPeerGroupItem */ + // void get(RsGroupInfo &groupInfo); + + /* Mandatory */ + RsNodeGroupId id; + std::string name; + uint32_t flag; + + RsTlvPgpIdSet pgpList; +}; class RsPeerStunItem: public RsItem { @@ -197,9 +222,10 @@ virtual uint32_t sizeStun(RsPeerStunItem *); virtual bool serialiseStun (RsPeerStunItem *item, void *data, uint32_t *size); virtual RsPeerStunItem * deserialiseStun(void *data, uint32_t *size); -virtual uint32_t sizeGroup(RsPeerGroupItem *); -virtual bool serialiseGroup (RsPeerGroupItem *item, void *data, uint32_t *size); -virtual RsPeerGroupItem * deserialiseGroup(void *data, uint32_t *size); +virtual uint32_t sizeGroup(RsNodeGroupItem *); +virtual bool serialiseGroup (RsNodeGroupItem *item, void *data, uint32_t *size); +virtual RsNodeGroupItem *deserialiseGroup(void *data, uint32_t *size); +virtual RsPeerGroupItem_deprecated * deserialiseGroup_deprecated(void *data, uint32_t *size); virtual uint32_t sizePeerBandwidthLimits(RsPeerBandwidthLimitsItem *); virtual bool serialisePeerBandwidthLimits (RsPeerBandwidthLimitsItem *item, void *data, uint32_t *size); @@ -303,23 +329,39 @@ class RsFileTransfer: public RsItem const uint32_t RS_FILE_CONFIG_CLEANUP_DELETE = 0x0001; /* Used by ft / extralist / configdirs / anyone who wants a basic file */ -class RsFileConfigItem: public RsItem +class RsFileConfigItem_deprecated: public RsItem { - public: - RsFileConfigItem() - :RsItem(RS_PKT_VERSION1, RS_PKT_CLASS_CONFIG, - RS_PKT_TYPE_FILE_CONFIG, - RS_PKT_SUBTYPE_FILE_ITEM) - { return; } -virtual ~RsFileConfigItem(); -virtual void clear(); -std::ostream &print(std::ostream &out, uint16_t indent = 0); +public: + RsFileConfigItem_deprecated() + :RsItem(RS_PKT_VERSION1, RS_PKT_CLASS_CONFIG, + RS_PKT_TYPE_FILE_CONFIG, + RS_PKT_SUBTYPE_FILE_ITEM_deprecated) + {} + virtual ~RsFileConfigItem_deprecated() {} + virtual void clear(); + std::ostream &print(std::ostream &out, uint16_t indent = 0); - RsTlvFileItem file; - uint32_t flags; - std::list parent_groups ; + RsTlvFileItem file; + uint32_t flags; + std::list parent_groups ; }; +class RsFileConfigItem: public RsItem +{ +public: + RsFileConfigItem() + :RsItem(RS_PKT_VERSION1, RS_PKT_CLASS_CONFIG, + RS_PKT_TYPE_FILE_CONFIG, + RS_PKT_SUBTYPE_FILE_ITEM) + {} + virtual ~RsFileConfigItem() {} + virtual void clear(); + std::ostream &print(std::ostream &out, uint16_t indent = 0); + + RsTlvFileItem file; + uint32_t flags; + RsTlvNodeGroupIdSet parent_groups ; +}; /**************************************************************************/ class RsFileConfigSerialiser: public RsSerialType @@ -341,9 +383,11 @@ virtual uint32_t sizeTransfer(RsFileTransfer *); virtual bool serialiseTransfer(RsFileTransfer *item, void *data, uint32_t *size); virtual RsFileTransfer * deserialiseTransfer(void *data, uint32_t *size); +virtual RsFileConfigItem_deprecated * deserialiseFileItem_deprecated(void *data, uint32_t *size); + virtual uint32_t sizeFileItem(RsFileConfigItem *); virtual bool serialiseFileItem(RsFileConfigItem *item, void *data, uint32_t *size); -virtual RsFileConfigItem * deserialiseFileItem(void *data, uint32_t *size); +virtual RsFileConfigItem *deserialiseFileItem(void *data, uint32_t *size); }; diff --git a/libretroshare/src/serialiser/rstlvbase.h b/libretroshare/src/serialiser/rstlvbase.h index 73e0112f4..f33a7d8ee 100644 --- a/libretroshare/src/serialiser/rstlvbase.h +++ b/libretroshare/src/serialiser/rstlvbase.h @@ -204,6 +204,7 @@ const uint16_t TLV_TYPE_PGPIDSET = 0x1023; const uint16_t TLV_TYPE_RECOGNSET = 0x1024; const uint16_t TLV_TYPE_GXSIDSET = 0x1025; const uint16_t TLV_TYPE_GXSCIRCLEIDSET= 0x1026; +const uint16_t TLV_TYPE_NODEGROUPIDSET= 0x1027; const uint16_t TLV_TYPE_SERVICESET = 0x1030; diff --git a/libretroshare/src/serialiser/rstlvidset.h b/libretroshare/src/serialiser/rstlvidset.h index e5b3d257b..e70b055cf 100644 --- a/libretroshare/src/serialiser/rstlvidset.h +++ b/libretroshare/src/serialiser/rstlvidset.h @@ -115,11 +115,12 @@ template class t_RsTlvIdSet: public RsTlvItem std::set ids ; }; -typedef t_RsTlvIdSet RsTlvPeerIdSet ; -typedef t_RsTlvIdSet RsTlvPgpIdSet ; -typedef t_RsTlvIdSet RsTlvHashSet ; -typedef t_RsTlvIdSet RsTlvGxsIdSet ; -typedef t_RsTlvIdSet RsTlvGxsCircleIdSet ; +typedef t_RsTlvIdSet RsTlvPeerIdSet ; +typedef t_RsTlvIdSet RsTlvPgpIdSet ; +typedef t_RsTlvIdSet RsTlvHashSet ; +typedef t_RsTlvIdSet RsTlvGxsIdSet ; +typedef t_RsTlvIdSet RsTlvGxsCircleIdSet ; +typedef t_RsTlvIdSet RsTlvNodeGroupIdSet ; class RsTlvServiceIdSet: public RsTlvItem { diff --git a/libretroshare/src/services/p3gxscircles.cc b/libretroshare/src/services/p3gxscircles.cc index a3cd4d7e7..5c717faf2 100644 --- a/libretroshare/src/services/p3gxscircles.cc +++ b/libretroshare/src/services/p3gxscircles.cc @@ -380,6 +380,7 @@ bool p3GxsCircles::loadCircle(const RsGxsCircleId &circleId) return cache_request_load(circleId); } + int p3GxsCircles::canSend(const RsGxsCircleId &circleId, const RsPgpId &id, bool& should_encrypt) { RsStackMutex stack(mCircleMtx); /********** STACK LOCKED MTX ******/ diff --git a/libretroshare/src/services/p3gxsreputation.cc b/libretroshare/src/services/p3gxsreputation.cc index f806b4748..56c2d8cc2 100644 --- a/libretroshare/src/services/p3gxsreputation.cc +++ b/libretroshare/src/services/p3gxsreputation.cc @@ -116,13 +116,13 @@ * 10 | 1.0 | 0 | 0.25 | 1.0 * * To check: - * [ ] Opinions are saved/loaded accross restart - * [ ] Opinions are transmitted to friends - * [ ] Opinions are transmitted to friends when updated + * [X] Opinions are saved/loaded accross restart + * [X] Opinions are transmitted to friends + * [X] Opinions are transmitted to friends when updated * * To do: - * [ ] Add debug info - * [ ] Test the whole thing + * [X] Add debug info + * [X] Test the whole thing * [X] Implement a system to allow not storing info when we don't have it */ @@ -138,6 +138,7 @@ static const float REPUTATION_ASSESSMENT_THRESHOLD_X1 = 0.5f ; // reputat static const uint32_t PGP_AUTO_BAN_THRESHOLD_DEFAULT = 2 ; // above this, auto ban any GXS id signed by this node static const uint32_t IDENTITY_FLAGS_UPDATE_DELAY = 100 ; // static const uint32_t BANNED_NODES_UPDATE_DELAY = 313 ; // update approx every 5 mins. Chosen to not be a multiple of IDENTITY_FLAGS_UPDATE_DELAY +static const uint32_t REPUTATION_INFO_KEEP_DELAY = 86400*35; // remove old reputation info 5 days after last usage limit, in case the ID would come back.. p3GxsReputation::p3GxsReputation(p3LinkMgr *lm) :p3Service(), p3Config(), @@ -149,7 +150,7 @@ p3GxsReputation::p3GxsReputation(p3LinkMgr *lm) mRequestTime = 0; mStoreTime = 0; mReputationsUpdated = false; - mLastActiveFriendsUpdate = 0 ; + mLastActiveFriendsUpdate = time(NULL) - 0.5*ACTIVE_FRIENDS_UPDATE_PERIOD; // avoids doing it too soon since the TS from rsIdentity needs to be loaded already mAverageActiveFriends = 0 ; mLastBannedNodesUpdate = 0 ; } @@ -332,12 +333,57 @@ void p3GxsReputation::updateIdentityFlags() void p3GxsReputation::cleanup() { - // remove opinions from friends that havn't been seen online for more than the specified delay - + // remove opinions from friends that havn't been seen online for more than the specified delay + #ifdef DEBUG_REPUTATION - std::cerr << "p3GxsReputation::cleanup() " << std::endl; #endif - std::cerr << __PRETTY_FUNCTION__ << ": not implemented. TODO!" << std::endl; + std::cerr << "p3GxsReputation::cleanup() " << std::endl; + + // remove optionions about identities that do not exist anymore. That will in particular avoid asking p3idservice about deleted + // identities, which would cause an excess of hits to the database. + // We do it in two steps to avoid a deadlock when calling rsIdentity from here. + + bool updated = false ; + time_t now = time(NULL) ; + + std::list ids_to_check_for_last_usage_ts; + + { + RsStackMutex stack(mReputationMtx); /****** LOCKED MUTEX *******/ + + for(std::map::iterator it(mReputations.begin());it!=mReputations.end();) + if(it->second.mOpinions.empty() && it->second.mOwnOpinion == RsReputations::OPINION_NEUTRAL) + { + std::map::iterator tmp(it) ; + ++tmp ; + mReputations.erase(it) ; + it = tmp ; +#ifdef DEBUG_REPUTATION + std::cerr << " ID " << it->first << ": own is neutral and no opinions from friends => remove entry" << std::endl; +#endif + updated = true ; + } + else + { + ids_to_check_for_last_usage_ts.push_back(it->first) ; + ++it; + } + } + + for(std::list::const_iterator it(ids_to_check_for_last_usage_ts.begin());it!=ids_to_check_for_last_usage_ts.end();++it) + if(rsIdentity->getLastUsageTS(*it) + REPUTATION_INFO_KEEP_DELAY < now) + { +#ifdef DEBUG_REPUTATION + std::cerr << " Identity " << *it << " has a last usage TS of " << now - rsIdentity->getLastUsageTS(*it) << " secs ago: deleting it." << std::endl; +#endif + + RsStackMutex stack(mReputationMtx); /****** LOCKED MUTEX *******/ + mReputations.erase(*it) ; + updated = true ; + } + + if(updated) + IndicateConfigChanged() ; } void p3GxsReputation::updateActiveFriends() @@ -668,7 +714,7 @@ bool p3GxsReputation::updateLatestUpdate(RsPeerId peerid,time_t latest_update) * Opinion ****/ -bool p3GxsReputation::getReputationInfo(const RsGxsId& gxsid, RsReputations::ReputationInfo& info) +bool p3GxsReputation::getReputationInfo(const RsGxsId& gxsid, const RsPgpId& owner_id, RsReputations::ReputationInfo& info) { if(gxsid.isNull()) return false ; @@ -678,25 +724,34 @@ bool p3GxsReputation::getReputationInfo(const RsGxsId& gxsid, RsReputations::Rep #ifdef DEBUG_REPUTATION std::cerr << "getReputationInfo() for " << gxsid << std::endl; #endif - Reputation& rep(mReputations[gxsid]) ; + std::map::const_iterator it = mReputations.find(gxsid) ; - info.mOwnOpinion = RsReputations::Opinion(rep.mOwnOpinion) ; - info.mOverallReputationScore = rep.mReputation ; - info.mFriendAverage = rep.mFriendAverage ; - - if( (rep.mIdentityFlags & REPUTATION_IDENTITY_FLAG_PGP_LINKED) && (mBannedPgpIds.find(rep.mOwnerNode) != mBannedPgpIds.end())) + if(it == mReputations.end()) { - info.mAssessment = RsReputations::ASSESSMENT_BAD ; -#ifdef DEBUG_REPUTATION - std::cerr << "p3GxsReputations: identity " << gxsid << " is banned because owner node ID " << rep.mOwnerNode << " is banned." << std::endl; -#endif - return true; + info.mOwnOpinion = RsReputations::OPINION_NEUTRAL ; + info.mOverallReputationScore = RsReputations::REPUTATION_THRESHOLD_DEFAULT ; + info.mFriendAverage = REPUTATION_THRESHOLD_DEFAULT ; } - - if(info.mOverallReputationScore > REPUTATION_ASSESSMENT_THRESHOLD_X1) - info.mAssessment = RsReputations::ASSESSMENT_OK ; else - info.mAssessment = RsReputations::ASSESSMENT_BAD ; + { + const Reputation& rep(it->second) ; + + info.mOwnOpinion = RsReputations::Opinion(rep.mOwnOpinion) ; + info.mOverallReputationScore = rep.mReputation ; + info.mFriendAverage = rep.mFriendAverage ; + } + + if(!owner_id.isNull() && (mBannedPgpIds.find(owner_id) != mBannedPgpIds.end())) + { +#ifdef DEBUG_REPUTATION + std::cerr << "p3GxsReputations: identity " << gxsid << " is banned because owner node ID " << owner_id << " is banned." << std::endl; +#endif + info.mAssessment = RsReputations::ASSESSMENT_BAD ; + } + else if(info.mOverallReputationScore <= REPUTATION_ASSESSMENT_THRESHOLD_X1) + info.mAssessment = RsReputations::ASSESSMENT_BAD ; + else + info.mAssessment = RsReputations::ASSESSMENT_OK ; #ifdef DEBUG_REPUTATION std::cerr << " information present. OwnOp = " << info.mOwnOpinion << ", overall score=" << info.mAssessment << std::endl; @@ -705,12 +760,13 @@ bool p3GxsReputation::getReputationInfo(const RsGxsId& gxsid, RsReputations::Rep return true ; } -bool p3GxsReputation::isIdentityBanned(const RsGxsId &id) +bool p3GxsReputation::isIdentityBanned(const RsGxsId &id,const RsPgpId& owner_node) { RsReputations::ReputationInfo info ; - getReputationInfo(id,info) ; - + if(!getReputationInfo(id,owner_node,info)) + return false ; + #ifdef DEBUG_REPUTATION std::cerr << "isIdentityBanned(): returning " << (info.mAssessment == RsReputations::ASSESSMENT_BAD) << " for GXS id " << id << std::endl; #endif diff --git a/libretroshare/src/services/p3gxsreputation.h b/libretroshare/src/services/p3gxsreputation.h index ae49517e5..8dca8cd5a 100644 --- a/libretroshare/src/services/p3gxsreputation.h +++ b/libretroshare/src/services/p3gxsreputation.h @@ -97,8 +97,8 @@ class p3GxsReputation: public p3Service, public p3Config, public RsReputations / /***** Interface for RsReputations *****/ virtual bool setOwnOpinion(const RsGxsId& key_id, const Opinion& op) ; - virtual bool getReputationInfo(const RsGxsId& id,ReputationInfo& info) ; - virtual bool isIdentityBanned(const RsGxsId& id) ; + virtual bool getReputationInfo(const RsGxsId& id, const RsPgpId &owner_id, ReputationInfo& info) ; + virtual bool isIdentityBanned(const RsGxsId& id, const RsPgpId &owner_node) ; virtual void setNodeAutoBanThreshold(uint32_t n) ; virtual uint32_t nodeAutoBanThreshold() ; diff --git a/libretroshare/src/services/p3idservice.cc b/libretroshare/src/services/p3idservice.cc index 6536d384d..29b5e0794 100644 --- a/libretroshare/src/services/p3idservice.cc +++ b/libretroshare/src/services/p3idservice.cc @@ -258,16 +258,13 @@ time_t p3IdService::locked_getLastUsageTS(const RsGxsId& gxs_id) std::map::const_iterator it = mKeysTS.find(gxs_id) ; if(it == mKeysTS.end()) - { - slowIndicateConfigChanged() ; - return mKeysTS[gxs_id] = time(NULL) ; - } + return 0 ; else return it->second ; } void p3IdService::timeStampKey(const RsGxsId& gxs_id) { - if(rsReputations->isIdentityBanned(gxs_id)) + if(isBanned(gxs_id)) { std::cerr << "(II) p3IdService:timeStampKey(): refusing to time stamp key " << gxs_id << " because it is banned." << std::endl; return; @@ -327,7 +324,7 @@ public: time_t now = time(NULL); const RsGxsId& gxs_id = entry.details.mId ; - bool is_id_banned = rsReputations->isIdentityBanned(gxs_id) ; + bool is_id_banned = rsReputations->isIdentityBanned(gxs_id,entry.details.mPgpId) ; bool is_own_id = (bool)(entry.details.mFlags & RS_IDENTITY_FLAGS_IS_OWN_ID) ; bool is_known_id = (bool)(entry.details.mFlags & RS_IDENTITY_FLAGS_PGP_KNOWN) ; bool is_signed_id = (bool)(entry.details.mFlags & RS_IDENTITY_FLAGS_PGP_LINKED) ; @@ -343,17 +340,15 @@ public: std::map::const_iterator it = mLastUsageTS.find(gxs_id) ; - if(it == mLastUsageTS.end()) - { - std::cerr << "No Ts for this ID" << std::endl; - return true ; - } + bool no_ts = (it == mLastUsageTS.end()) ; - time_t last_usage_ts = it->second; + time_t last_usage_ts = no_ts?0:(it->second); time_t max_keep_time ; - if(is_id_banned) - max_keep_time = MAX_KEEP_KEYS_BANNED ; + if(no_ts) + max_keep_time = 0 ; + else if(is_id_banned) + max_keep_time = MAX_KEEP_KEYS_BANNED ; else if(is_known_id) max_keep_time = MAX_KEEP_KEYS_SIGNED_KNOWN ; else if(is_signed_id) @@ -413,10 +408,7 @@ void p3IdService::cleanUnusedKeys() { RS_STACK_MUTEX(mIdMtx) ; - std::map::iterator tmp = mKeysTS.find(*it) ; - - if(mKeysTS.end() != tmp) - mKeysTS.erase(tmp) ; + mKeysTS.erase(*it) ; // mPublicKeyCache.erase(*it) ; no need to do it now. It's done in p3IdService::deleteGroup() } @@ -509,7 +501,13 @@ bool p3IdService:: getNickname(const RsGxsId &id, std::string &nickname) } #endif -bool p3IdService:: getIdDetails(const RsGxsId &id, RsIdentityDetails &details) +time_t p3IdService::getLastUsageTS(const RsGxsId &id) +{ + RsStackMutex stack(mIdMtx); /********** STACK LOCKED MTX ******/ + return locked_getLastUsageTS(id) ; +} + +bool p3IdService::getIdDetails(const RsGxsId &id, RsIdentityDetails &details) { #ifdef DEBUG_IDS std::cerr << "p3IdService::getIdDetails(" << id << ")"; @@ -530,7 +528,7 @@ bool p3IdService:: getIdDetails(const RsGxsId &id, RsIdentityDetails &details) if(details.mNickname.length() > RSID_MAXIMUM_NICKNAME_SIZE*4) details.mNickname = "[too long a name]" ; - rsReputations->getReputationInfo(id,details.mReputation) ; + rsReputations->getReputationInfo(id,details.mPgpId,details.mReputation) ; return true; } @@ -542,6 +540,16 @@ bool p3IdService:: getIdDetails(const RsGxsId &id, RsIdentityDetails &details) return false; } +bool p3IdService::isBanned(const RsGxsId &id) +{ + RsIdentityDetails det ; + getIdDetails(id,det) ; + +#ifdef DEBUG_REPUTATION + std::cerr << "isIdentityBanned(): returning " << (det.mReputation.mAssessment == RsReputations::ASSESSMENT_BAD) << " for GXS id " << id << std::endl; +#endif + return det.mReputation.mAssessment == RsReputations::ASSESSMENT_BAD ; +} bool p3IdService::isOwnId(const RsGxsId& id) { diff --git a/libretroshare/src/services/p3idservice.h b/libretroshare/src/services/p3idservice.h index 316fad106..8efc3aea8 100644 --- a/libretroshare/src/services/p3idservice.h +++ b/libretroshare/src/services/p3idservice.h @@ -218,34 +218,34 @@ private: class p3IdService: public RsGxsIdExchange, public RsIdentity, public GxsTokenQueue, public RsTickEvent, public p3Config { - public: +public: p3IdService(RsGeneralDataService* gds, RsNetworkExchangeService* nes, PgpAuxUtils *pgpUtils); -virtual RsServiceInfo getServiceInfo(); -static uint32_t idAuthenPolicy(); + virtual RsServiceInfo getServiceInfo(); + static uint32_t idAuthenPolicy(); virtual void service_tick(); // needed for background processing. - /*! - * Design hack, id service must be constructed first as it - * is need for construction of subsequent net services - */ - void setNes(RsNetworkExchangeService* nes); + /*! + * Design hack, id service must be constructed first as it + * is need for construction of subsequent net services + */ + void setNes(RsNetworkExchangeService* nes); /* General Interface is provided by RsIdentity / RsGxsIfaceImpl. */ /* Data Specific Interface */ // These are exposed via RsIdentity. -virtual bool getGroupData(const uint32_t &token, std::vector &groups); -//virtual bool getMsgData(const uint32_t &token, std::vector &opinions); + virtual bool getGroupData(const uint32_t &token, std::vector &groups); + //virtual bool getMsgData(const uint32_t &token, std::vector &opinions); // These are local - and not exposed via RsIdentity. -virtual bool createGroup(uint32_t& token, RsGxsIdGroup &group); -virtual bool updateGroup(uint32_t& token, RsGxsIdGroup &group); -virtual bool deleteGroup(uint32_t& token, RsGxsIdGroup &group); -//virtual bool createMsg(uint32_t& token, RsGxsIdOpinion &opinion); + virtual bool createGroup(uint32_t& token, RsGxsIdGroup &group); + virtual bool updateGroup(uint32_t& token, RsGxsIdGroup &group); + virtual bool deleteGroup(uint32_t& token, RsGxsIdGroup &group); + //virtual bool createMsg(uint32_t& token, RsGxsIdOpinion &opinion); /**************** RsIdentity External Interface. * Notes: @@ -256,86 +256,88 @@ virtual bool deleteGroup(uint32_t& token, RsGxsIdGroup &group); * Also need to handle Cache updates / invalidation from internal changes. * */ -//virtual bool getNickname(const RsGxsId &id, std::string &nickname); -virtual bool getIdDetails(const RsGxsId &id, RsIdentityDetails &details); + //virtual bool getNickname(const RsGxsId &id, std::string &nickname); + virtual bool getIdDetails(const RsGxsId &id, RsIdentityDetails &details); - // -virtual bool submitOpinion(uint32_t& token, const RsGxsId &id, - bool absOpinion, int score); -virtual bool createIdentity(uint32_t& token, RsIdentityParameters ¶ms); + // + virtual bool submitOpinion(uint32_t& token, const RsGxsId &id, + bool absOpinion, int score); + virtual bool createIdentity(uint32_t& token, RsIdentityParameters ¶ms); -virtual bool updateIdentity(uint32_t& token, RsGxsIdGroup &group); -virtual bool deleteIdentity(uint32_t& token, RsGxsIdGroup &group); + virtual bool updateIdentity(uint32_t& token, RsGxsIdGroup &group); + virtual bool deleteIdentity(uint32_t& token, RsGxsIdGroup &group); -virtual bool parseRecognTag(const RsGxsId &id, const std::string &nickname, - const std::string &tag, RsRecognTagDetails &details); -virtual bool getRecognTagRequest(const RsGxsId &id, const std::string &comment, - uint16_t tag_class, uint16_t tag_type, std::string &tag); + virtual bool parseRecognTag(const RsGxsId &id, const std::string &nickname, + const std::string &tag, RsRecognTagDetails &details); + virtual bool getRecognTagRequest(const RsGxsId &id, const std::string &comment, + uint16_t tag_class, uint16_t tag_type, std::string &tag); -virtual bool setAsRegularContact(const RsGxsId& id,bool is_a_contact) ; - virtual bool isARegularContact(const RsGxsId& id) ; - - /**************** RsGixs Implementation ***************/ + virtual bool setAsRegularContact(const RsGxsId& id,bool is_a_contact) ; + virtual bool isARegularContact(const RsGxsId& id) ; + virtual bool isBanned(const RsGxsId& id) ; + virtual time_t getLastUsageTS(const RsGxsId &id) ; - virtual bool getOwnIds(std::list &ownIds); + /**************** RsGixs Implementation ***************/ - //virtual bool getPublicKey(const RsGxsId &id, RsTlvSecurityKey &key) ; - //virtual void networkRequestPublicKey(const RsGxsId& key_id,const std::list& peer_ids) ; + virtual bool getOwnIds(std::list &ownIds); - virtual bool isOwnId(const RsGxsId& key_id) ; + //virtual bool getPublicKey(const RsGxsId &id, RsTlvSecurityKey &key) ; + //virtual void networkRequestPublicKey(const RsGxsId& key_id,const std::list& peer_ids) ; - virtual bool signData(const uint8_t *data,uint32_t data_size,const RsGxsId& signer_id,RsTlvKeySignature& signature,uint32_t& signing_error) ; - virtual bool validateData(const uint8_t *data,uint32_t data_size,const RsTlvKeySignature& signature,bool force_load,uint32_t& signing_error) ; + virtual bool isOwnId(const RsGxsId& key_id) ; - virtual bool encryptData(const uint8_t *decrypted_data,uint32_t decrypted_data_size,uint8_t *& encrypted_data,uint32_t& encrypted_data_size,const RsGxsId& encryption_key_id,bool force_load,uint32_t& encryption_error) ; - virtual bool decryptData(const uint8_t *encrypted_data,uint32_t encrypted_data_size,uint8_t *& decrypted_data,uint32_t& decrypted_data_size,const RsGxsId& encryption_key_id,uint32_t& encryption_error) ; + virtual bool signData(const uint8_t *data,uint32_t data_size,const RsGxsId& signer_id,RsTlvKeySignature& signature,uint32_t& signing_error) ; + virtual bool validateData(const uint8_t *data,uint32_t data_size,const RsTlvKeySignature& signature,bool force_load,uint32_t& signing_error) ; - virtual bool haveKey(const RsGxsId &id); - virtual bool havePrivateKey(const RsGxsId &id); + virtual bool encryptData(const uint8_t *decrypted_data,uint32_t decrypted_data_size,uint8_t *& encrypted_data,uint32_t& encrypted_data_size,const RsGxsId& encryption_key_id,bool force_load,uint32_t& encryption_error) ; + virtual bool decryptData(const uint8_t *encrypted_data,uint32_t encrypted_data_size,uint8_t *& decrypted_data,uint32_t& decrypted_data_size,const RsGxsId& encryption_key_id,uint32_t& encryption_error) ; - virtual bool getKey(const RsGxsId &id, RsTlvPublicRSAKey &key); - virtual bool getPrivateKey(const RsGxsId &id, RsTlvPrivateRSAKey &key); + virtual bool haveKey(const RsGxsId &id); + virtual bool havePrivateKey(const RsGxsId &id); - virtual bool requestKey(const RsGxsId &id, const std::list &peers); - virtual bool requestPrivateKey(const RsGxsId &id); + virtual bool getKey(const RsGxsId &id, RsTlvPublicRSAKey &key); + virtual bool getPrivateKey(const RsGxsId &id, RsTlvPrivateRSAKey &key); + + virtual bool requestKey(const RsGxsId &id, const std::list &peers); + virtual bool requestPrivateKey(const RsGxsId &id); - /**************** RsGixsReputation Implementation ****************/ + /**************** RsGixsReputation Implementation ****************/ - // get Reputation. -virtual bool haveReputation(const RsGxsId &id); -virtual bool loadReputation(const RsGxsId &id, const std::list& peers); -virtual bool getReputation(const RsGxsId &id, GixsReputation &rep); + // get Reputation. + virtual bool haveReputation(const RsGxsId &id); + virtual bool loadReputation(const RsGxsId &id, const std::list& peers); + virtual bool getReputation(const RsGxsId &id, GixsReputation &rep); - protected: - /** Notifications **/ -virtual void notifyChanges(std::vector& changes); +protected: + /** Notifications **/ + virtual void notifyChanges(std::vector& changes); /** Overloaded to add PgpIdHash to Group Definition **/ -virtual ServiceCreate_Return service_CreateGroup(RsGxsGrpItem* grpItem, RsTlvSecurityKeySet& keySet); + virtual ServiceCreate_Return service_CreateGroup(RsGxsGrpItem* grpItem, RsTlvSecurityKeySet& keySet); - // Overloaded from GxsTokenQueue for Request callbacks. -virtual void handleResponse(uint32_t token, uint32_t req_type); + // Overloaded from GxsTokenQueue for Request callbacks. + virtual void handleResponse(uint32_t token, uint32_t req_type); - // Overloaded from RsTickEvent. -virtual void handle_event(uint32_t event_type, const std::string &elabel); + // Overloaded from RsTickEvent. + virtual void handle_event(uint32_t event_type, const std::string &elabel); - //===================================================// - // p3Config methods // - //===================================================// + //===================================================// + // p3Config methods // + //===================================================// - // Load/save the routing info, the pending items in transit, and the config variables. - // - virtual bool loadList(std::list& items) ; - virtual bool saveList(bool& cleanup,std::list& items) ; + // Load/save the routing info, the pending items in transit, and the config variables. + // + virtual bool loadList(std::list& items) ; + virtual bool saveList(bool& cleanup,std::list& items) ; - virtual RsSerialiser *setupSerialiser() ; + virtual RsSerialiser *setupSerialiser() ; - private: +private: -/************************************************************************ + /************************************************************************ * This is the Cache for minimising calls to the DataStore. * */ @@ -348,7 +350,7 @@ virtual void handle_event(uint32_t event_type, const std::string &elabel); bool cache_store(const RsGxsIdGroupItem *item); bool cache_update_if_cached(const RsGxsId &id, std::string serviceString); - bool isPendingNetworkRequest(const RsGxsId& gxsId); + bool isPendingNetworkRequest(const RsGxsId& gxsId); void requestIdsFromNet(); // Mutex protected. @@ -359,7 +361,7 @@ virtual void handle_event(uint32_t event_type, const std::string &elabel); // Switching to RsMemCache for Key Caching. RsMemCache mKeyCache; -/************************************************************************ + /************************************************************************ * Refreshing own Ids. * */ @@ -368,7 +370,7 @@ virtual void handle_event(uint32_t event_type, const std::string &elabel); std::list mOwnIds; -/************************************************************************ + /************************************************************************ * Test fns for Caching. * */ @@ -376,7 +378,7 @@ virtual void handle_event(uint32_t event_type, const std::string &elabel); bool cachetest_getlist(); bool cachetest_handlerequest(uint32_t token); -/************************************************************************ + /************************************************************************ * for processing background tasks that use the serviceString. * - must be mutually exclusive to avoid clashes. */ @@ -386,7 +388,7 @@ virtual void handle_event(uint32_t event_type, const std::string &elabel); bool mBgSchedule_Active; uint32_t mBgSchedule_Mode; -/************************************************************************ + /************************************************************************ * pgphash processing. * */ @@ -394,7 +396,7 @@ virtual void handle_event(uint32_t event_type, const std::string &elabel); bool pgphash_handlerequest(uint32_t token); bool pgphash_process(); - bool checkId(const RsGxsIdGroup &grp, RsPgpId &pgp_id, bool &error); + bool checkId(const RsGxsIdGroup &grp, RsPgpId &pgp_id, bool &error); void getPgpIdList(); /* MUTEX PROTECTED DATA (mIdMtx - maybe should use a 2nd?) */ @@ -402,7 +404,7 @@ virtual void handle_event(uint32_t event_type, const std::string &elabel); std::map mPgpFingerprintMap; std::list mGroupsToProcess; -/************************************************************************ + /************************************************************************ * recogn processing. * */ @@ -420,7 +422,7 @@ virtual void handle_event(uint32_t event_type, const std::string &elabel); void loadRecognKeys(); -/************************************************************************ + /************************************************************************ * opinion processing. * */ @@ -448,24 +450,24 @@ virtual void handle_event(uint32_t event_type, const std::string &elabel); std::map mRecognSignKeys; std::map mRecognOldSignKeys; -/************************************************************************ + /************************************************************************ * Below is the background task for processing opinions => reputations * */ -virtual void generateDummyData(); + virtual void generateDummyData(); void generateDummy_OwnIds(); void generateDummy_FriendPGP(); void generateDummy_UnknownPGP(); void generateDummy_UnknownPseudo(); - void cleanUnusedKeys() ; - void slowIndicateConfigChanged() ; + void cleanUnusedKeys() ; + void slowIndicateConfigChanged() ; - virtual void timeStampKey(const RsGxsId& id) ; - time_t locked_getLastUsageTS(const RsGxsId& gxs_id); + virtual void timeStampKey(const RsGxsId& id) ; + time_t locked_getLastUsageTS(const RsGxsId& gxs_id); -std::string genRandomId(int len = 20); + std::string genRandomId(int len = 20); #if 0 bool reputation_start(); @@ -478,7 +480,7 @@ std::string genRandomId(int len = 20); bool background_processNewMessages(); bool background_FullCalcRequest(); bool background_processFullCalc(); - + bool background_cleanup(); #endif @@ -488,40 +490,40 @@ std::string genRandomId(int len = 20); /***** below here is locked *****/ bool mLastBgCheck; bool mBgProcessing; - + uint32_t mBgToken; uint32_t mBgPhase; - + std::map mBgGroupMap; std::list mBgFullCalcGroups; #endif -/************************************************************************ + /************************************************************************ * Other Data that is protected by the Mutex. */ - private: +private: std::map > mIdsPendingCache; std::map > mGroupNotPresent; std::map > mIdsNotPresent; std::map mKeysTS ; - - // keep a list of regular contacts. This is useful to sort IDs, and allow some services to priviledged ids only. - std::set mContacts; + + // keep a list of regular contacts. This is useful to sort IDs, and allow some services to priviledged ids only. + std::set mContacts; RsNetworkExchangeService* mNes; /************************** - * AuxUtils provides interface to Security Function (e.g. GPGAuth(), notify etc.) + * AuxUtils provides interface to Security Function (e.g. GPGAuth(), notify etc.) * without depending directly on all these classes. */ - PgpAuxUtils *mPgpUtils; + PgpAuxUtils *mPgpUtils; - time_t mLastKeyCleaningTime ; - time_t mLastConfigUpdate ; + time_t mLastKeyCleaningTime ; + time_t mLastConfigUpdate ; - bool mOwnIdsLoaded ; + bool mOwnIdsLoaded ; }; #endif // P3_IDENTITY_SERVICE_HEADER diff --git a/libretroshare/src/tcponudp/rsudpstack.h b/libretroshare/src/tcponudp/rsudpstack.h index 007a2e845..e2dec61b0 100644 --- a/libretroshare/src/tcponudp/rsudpstack.h +++ b/libretroshare/src/tcponudp/rsudpstack.h @@ -64,8 +64,8 @@ class rsUdpStack: public UdpStack, public pqiNetListener /* from pqiNetListener */ virtual bool resetListener(const struct sockaddr_storage &local) { - std::cerr << "rsUdpStack::resetListener(" << sockaddr_storage_tostring(local) << ")"; - std::cerr << std::endl; + //std::cerr << "rsUdpStack::resetListener(" << sockaddr_storage_tostring(local) << ")"; + //std::cerr << std::endl; if (local.ss_family != AF_INET) { @@ -90,16 +90,16 @@ class rsFixedUdpStack: public UdpStack, public pqiNetListener :UdpStack(testmode, local) { return; } /* from pqiNetListener */ -virtual bool resetListener(const struct sockaddr_storage &local) +virtual bool resetListener(const struct sockaddr_storage & /* local */) { struct sockaddr_in addr; getLocalAddress(addr); // The const_cast below is not so nice but without it, the compiler can't // find the correct operator<<(). No idea why! - std::cerr << "rsFixedUdpStack::resetListener(" << sockaddr_storage_tostring(local) << ")"; - std::cerr << " Resetting with original addr: " << const_cast(addr); - std::cerr << std::endl; + //std::cerr << "rsFixedUdpStack::resetListener(" << sockaddr_storage_tostring(local) << ")"; + //std::cerr << " Resetting with original addr: " << const_cast(addr); + //std::cerr << std::endl; return resetAddress(addr); } diff --git a/retroshare-gui/src/gui/Circles/CreateCircleDialog.cpp b/retroshare-gui/src/gui/Circles/CreateCircleDialog.cpp index 337b34e50..f7dfb91f8 100644 --- a/retroshare-gui/src/gui/Circles/CreateCircleDialog.cpp +++ b/retroshare-gui/src/gui/Circles/CreateCircleDialog.cpp @@ -103,7 +103,7 @@ CreateCircleDialog::CreateCircleDialog() #endif //ui.idChooser->loadIds(0,RsGxsId()); - ui.circleComboBox->loadCircles(GXS_CIRCLE_CHOOSER_EXTERNAL, RsGxsCircleId()); + ui.circleComboBox->loadCircles(RsGxsCircleId()); } CreateCircleDialog::~CreateCircleDialog() @@ -604,7 +604,7 @@ void CreateCircleDialog::updateCircleGUI() else ui.radioButton_Restricted->setChecked(true); - ui.circleComboBox->loadCircles(GXS_CIRCLE_CHOOSER_EXTERNAL, mCircleGroup.mMeta.mCircleId); + ui.circleComboBox->loadCircles(mCircleGroup.mMeta.mCircleId); break; diff --git a/retroshare-gui/src/gui/Identity/IdDetailsDialog.cpp b/retroshare-gui/src/gui/Identity/IdDetailsDialog.cpp index 57e83c1b4..dcc3c78fb 100644 --- a/retroshare-gui/src/gui/Identity/IdDetailsDialog.cpp +++ b/retroshare-gui/src/gui/Identity/IdDetailsDialog.cpp @@ -26,7 +26,6 @@ #include "gui/common/UIStateHelper.h" #include -#include // Data Requests. #define IDDETAILSDIALOG_IDDETAILS 1 @@ -261,7 +260,7 @@ void IdDetailsDialog::insertIdDetails(uint32_t token) #endif RsReputations::ReputationInfo info ; - rsReputations->getReputationInfo(RsGxsId(data.mMeta.mGroupId),info) ; + rsReputations->getReputationInfo(RsGxsId(data.mMeta.mGroupId),data.mPgpId,info) ; ui->neighborNodesOpinion_TF->setText(QString::number(info.mOverallReputationScore-1.0f)); diff --git a/retroshare-gui/src/gui/Identity/IdDialog.cpp b/retroshare-gui/src/gui/Identity/IdDialog.cpp index 583c83375..c9c66fa2b 100644 --- a/retroshare-gui/src/gui/Identity/IdDialog.cpp +++ b/retroshare-gui/src/gui/Identity/IdDialog.cpp @@ -41,7 +41,6 @@ #include "util/QtVersion.h" #include -#include #include "retroshare/rsgxsflags.h" #include "retroshare/rsmsgs.h" #include @@ -1360,25 +1359,31 @@ bool IdDialog::fillIdListItem(const RsGxsIdGroup& data, QTreeWidgetItem *&item, if (!item) item = new TreeWidgetItem(); - RsReputations::ReputationInfo info ; - rsReputations->getReputationInfo(RsGxsId(data.mMeta.mGroupId),info) ; + RsIdentityDetails idd ; + rsIdentity->getIdDetails(RsGxsId(data.mMeta.mGroupId),idd) ; item->setText(RSID_COL_NICKNAME, QString::fromUtf8(data.mMeta.mGroupName.c_str()).left(RSID_MAXIMUM_NICKNAME_SIZE)); item->setText(RSID_COL_KEYID, QString::fromStdString(data.mMeta.mGroupId.toStdString())); - //time_t now = time(NULL) ; - //item->setText(RSID_COL_LASTUSED, getHumanReadableDuration(now - data.mLastUsageTS)) ; + if(idd.mReputation.mAssessment == RsReputations::ASSESSMENT_BAD) + { + item->setForeground(RSID_COL_NICKNAME,QBrush(Qt::red)); + item->setForeground(RSID_COL_KEYID,QBrush(Qt::red)); + item->setForeground(RSID_COL_IDTYPE,QBrush(Qt::red)); + } + else + { + item->setForeground(RSID_COL_NICKNAME,QBrush(Qt::black)); + item->setForeground(RSID_COL_KEYID,QBrush(Qt::black)); + item->setForeground(RSID_COL_IDTYPE,QBrush(Qt::black)); + } item->setData(RSID_COL_KEYID, Qt::UserRole,QVariant(item_flags)) ; - item->setTextAlignment(RSID_COL_VOTES, Qt::AlignRight); - item->setData(RSID_COL_VOTES,Qt::DisplayRole, QString::number(info.mOverallReputationScore - 1.0f,'f',3)); + item->setData(RSID_COL_VOTES,Qt::DisplayRole, QString::number(idd.mReputation.mOverallReputationScore - 1.0f,'f',3)); if(isOwnId) { - RsIdentityDetails idd ; - rsIdentity->getIdDetails(RsGxsId(data.mMeta.mGroupId),idd) ; - QFont font = item->font(RSID_COL_NICKNAME) ; font.setBold(true) ; @@ -1740,12 +1745,12 @@ void IdDialog::insertIdDetails(uint32_t token) #endif RsReputations::ReputationInfo info ; - rsReputations->getReputationInfo(RsGxsId(data.mMeta.mGroupId),info) ; - - ui->neighborNodesOpinion_TF->setText(QString::number(info.mFriendAverage - 1.0f)); + rsReputations->getReputationInfo(RsGxsId(data.mMeta.mGroupId),data.mPgpId,info) ; - ui->overallOpinion_TF->setText(QString::number(info.mOverallReputationScore - 1.0f) +" ("+ - ((info.mAssessment == RsReputations::ASSESSMENT_OK)? tr("OK") : tr("Banned")) +")" ) ; + ui->neighborNodesOpinion_TF->setText(QString::number(info.mFriendAverage - 1.0f)); + + ui->overallOpinion_TF->setText(QString::number(info.mOverallReputationScore - 1.0f) +" ("+ + ((info.mAssessment == RsReputations::ASSESSMENT_OK)? tr("OK") : tr("Banned")) +")" ) ; switch(info.mOwnOpinion) { @@ -2021,10 +2026,10 @@ void IdDialog::IdListCustomPopupMenu( QPoint ) #endif RsGxsId keyId((*it)->text(RSID_COL_KEYID).toStdString()); - RsReputations::ReputationInfo info ; - rsReputations->getReputationInfo(keyId,info) ; + RsIdentityDetails det ; + rsIdentity->getIdDetails(keyId,det) ; - switch(info.mOwnOpinion) + switch(det.mReputation.mOwnOpinion) { case RsReputations::OPINION_NEGATIVE: ++n_negative_reputations ; break ; diff --git a/retroshare-gui/src/gui/MessengerWindow.cpp b/retroshare-gui/src/gui/MessengerWindow.cpp index 542f6f4e8..13ad9d844 100644 --- a/retroshare-gui/src/gui/MessengerWindow.cpp +++ b/retroshare-gui/src/gui/MessengerWindow.cpp @@ -56,8 +56,9 @@ *****/ MessengerWindow* MessengerWindow::_instance = NULL; -static std::set *expandedPeers = NULL; -static std::set *expandedGroups = NULL; + +std::set MessengerWindow::expandedPeers ; +std::set MessengerWindow::expandedGroups ; /*static*/ void MessengerWindow::showYourself () { @@ -79,16 +80,6 @@ void MessengerWindow::releaseInstance() if (_instance) { delete _instance; } - if (expandedPeers) { - /* delete saved expanded peers */ - delete(expandedPeers); - expandedPeers = NULL; - } - if (expandedGroups) { - /* delete saved expanded groups */ - delete(expandedGroups); - expandedGroups = NULL; - } } /** Constructor */ @@ -108,21 +99,15 @@ MessengerWindow::MessengerWindow(QWidget* parent, Qt::WindowFlags flags) connect(NotifyQt::getInstance(), SIGNAL(ownStatusMessageChanged()), this, SLOT(loadmystatusmessage())); connect(NotifyQt::getInstance(), SIGNAL(peerStatusChanged(QString,int)), this, SLOT(updateOwnStatus(QString,int))); - if (expandedPeers != NULL) { - for (std::set::iterator peerIt = expandedPeers->begin(); peerIt != expandedPeers->end(); ++peerIt) { + for (std::set::iterator peerIt = expandedPeers.begin(); peerIt != expandedPeers.end(); ++peerIt) { ui.friendList->addPeerToExpand(*peerIt); } - delete expandedPeers; - expandedPeers = NULL; - } + expandedPeers.clear(); - if (expandedGroups != NULL) { - for (std::set::iterator groupIt = expandedGroups->begin(); groupIt != expandedGroups->end(); ++groupIt) { + for (std::set::iterator groupIt = expandedGroups.begin(); groupIt != expandedGroups.end(); ++groupIt) { ui.friendList->addGroupToExpand(*groupIt); } - delete expandedGroups; - expandedGroups = NULL; - } + expandedGroups.clear(); ui.messagelineEdit->setMinimumWidth(20); @@ -203,22 +188,12 @@ void MessengerWindow::addFriend() void MessengerWindow::closeEvent (QCloseEvent * /*event*/) { /* save the expanded peers */ - if (expandedPeers == NULL) { - expandedPeers = new std::set; - } else { - expandedPeers->clear(); - } - - ui.friendList->getExpandedPeers(*expandedPeers); + expandedPeers.clear(); + ui.friendList->getExpandedPeers(expandedPeers); /* save the expanded groups */ - if (expandedGroups == NULL) { - expandedGroups = new std::set; - } else { - expandedGroups->clear(); - } - - ui.friendList->getExpandedGroups(*expandedGroups); + expandedGroups.clear(); + ui.friendList->getExpandedGroups(expandedGroups); } /** Shows Share Manager */ diff --git a/retroshare-gui/src/gui/MessengerWindow.h b/retroshare-gui/src/gui/MessengerWindow.h index ff262be11..cd8f23742 100644 --- a/retroshare-gui/src/gui/MessengerWindow.h +++ b/retroshare-gui/src/gui/MessengerWindow.h @@ -66,6 +66,9 @@ private: /** Qt Designer generated object */ Ui::MessengerWindow ui; + + static std::set expandedPeers ; + static std::set expandedGroups ; }; #endif diff --git a/retroshare-gui/src/gui/RemoteDirModel.cpp b/retroshare-gui/src/gui/RemoteDirModel.cpp index a2220f2ff..d6c95b091 100644 --- a/retroshare-gui/src/gui/RemoteDirModel.cpp +++ b/retroshare-gui/src/gui/RemoteDirModel.cpp @@ -212,12 +212,12 @@ QString RetroshareDirModel::getFlagsString(FileStorageFlags flags) return QString(str) ; } -QString RetroshareDirModel::getGroupsString(const std::list& group_ids) +QString RetroshareDirModel::getGroupsString(const std::list& group_ids) { QString groups_str ; RsGroupInfo group_info ; - for(std::list::const_iterator it(group_ids.begin());it!=group_ids.end();) + for(std::list::const_iterator it(group_ids.begin());it!=group_ids.end();) if(rsPeers->getGroupInfo(*it,group_info)) { groups_str += GroupDefs::name(group_info) ; diff --git a/retroshare-gui/src/gui/RemoteDirModel.h b/retroshare-gui/src/gui/RemoteDirModel.h index a16dcfc3f..f308e7c70 100644 --- a/retroshare-gui/src/gui/RemoteDirModel.h +++ b/retroshare-gui/src/gui/RemoteDirModel.h @@ -91,7 +91,7 @@ class RetroshareDirModel : public QAbstractItemModel void treeStyle(); void downloadDirectory(const DirDetails & details, int prefixLen); static QString getFlagsString(FileStorageFlags f) ; - static QString getGroupsString(const std::list&) ; + static QString getGroupsString(const std::list &) ; QString getAgeIndicatorString(const DirDetails &) const; // void getAgeIndicatorRec(const DirDetails &details, QString &ret) const; diff --git a/retroshare-gui/src/gui/ShareManager.cpp b/retroshare-gui/src/gui/ShareManager.cpp index 5b335bbf1..3e9477fdd 100644 --- a/retroshare-gui/src/gui/ShareManager.cpp +++ b/retroshare-gui/src/gui/ShareManager.cpp @@ -249,7 +249,7 @@ void ShareManager::updateGroups() QString group_string; int n = 0; - for (std::list::const_iterator it2((*it).parent_groups.begin());it2!=(*it).parent_groups.end();++it2,++n) + for (std::list::const_iterator it2((*it).parent_groups.begin());it2!=(*it).parent_groups.end();++it2,++n) { if (n>0) group_string += ", " ; diff --git a/retroshare-gui/src/gui/common/FriendList.cpp b/retroshare-gui/src/gui/common/FriendList.cpp index d7caa0176..47b5c67ed 100644 --- a/retroshare-gui/src/gui/common/FriendList.cpp +++ b/retroshare-gui/src/gui/common/FriendList.cpp @@ -116,9 +116,7 @@ FriendList::FriendList(QWidget *parent) : mShowGroups(true), mShowState(false), mHideUnconnected(false), - groupsHasChanged(false), - openGroups(NULL), - openPeers(NULL) + groupsHasChanged(false) { ui->setupUi(this); @@ -219,7 +217,17 @@ void FriendList::processSettings(bool load) int arrayIndex = Settings->beginReadArray("Groups"); for (int index = 0; index < arrayIndex; ++index) { Settings->setArrayIndex(index); - addGroupToExpand(Settings->value("open").toString().toStdString()); + + std::string gids = Settings->value("open").toString().toStdString(); + + RsGroupInfo ginfo ; + + if(rsPeers->getGroupInfoByName(gids,ginfo)) // backward compatibility + addGroupToExpand(ginfo.id) ; + else if(rsPeers->getGroupInfo(RsNodeGroupId(gids),ginfo)) // backward compatibility + addGroupToExpand(ginfo.id) ; + else + std::cerr << "(EE) Cannot find group info for openned group \"" << gids << "\"" << std::endl; } Settings->endArray(); } else { @@ -236,11 +244,11 @@ void FriendList::processSettings(bool load) // open groups Settings->beginWriteArray("Groups"); int arrayIndex = 0; - std::set expandedPeers; + std::set expandedPeers; getExpandedGroups(expandedPeers); - foreach (std::string groupId, expandedPeers) { + foreach (RsNodeGroupId groupId, expandedPeers) { Settings->setArrayIndex(arrayIndex++); - Settings->setValue("open", QString::fromStdString(groupId)); + Settings->setValue("open", QString::fromStdString(groupId.toStdString())); } Settings->endArray(); } @@ -369,7 +377,7 @@ void FriendList::peerTreeWidgetCustomPopupMenu() addToGroupMenu = new QMenu(tr("Add to group"), &contextMnu); } QAction* addToGroupAction = new QAction(GroupDefs::name(*groupIt), addToGroupMenu); - addToGroupAction->setData(QString::fromStdString(groupIt->id)); + addToGroupAction->setData(QString::fromStdString(groupIt->id.toStdString())); connect(addToGroupAction, SIGNAL(triggered()), this, SLOT(addToGroup())); addToGroupMenu->addAction(addToGroupAction); } @@ -378,7 +386,7 @@ void FriendList::peerTreeWidgetCustomPopupMenu() moveToGroupMenu = new QMenu(tr("Move to group"), &contextMnu); } QAction* moveToGroupAction = new QAction(GroupDefs::name(*groupIt), moveToGroupMenu); - moveToGroupAction->setData(QString::fromStdString(groupIt->id)); + moveToGroupAction->setData(QString::fromStdString(groupIt->id.toStdString())); connect(moveToGroupAction, SIGNAL(triggered()), this, SLOT(moveToGroup())); moveToGroupMenu->addAction(moveToGroupAction); } else { @@ -456,7 +464,7 @@ void FriendList::peerTreeWidgetCustomPopupMenu() void FriendList::createNewGroup() { - CreateGroup createGrpDialog ("", this); + CreateGroup createGrpDialog (RsNodeGroupId(), this); createGrpDialog.exec(); } @@ -596,7 +604,7 @@ void FriendList::insertPeers() if (mShowGroups && groupsHasChanged) { if (parent) { if (parent->type() == TYPE_GROUP) { - std::string groupId = getRsId(parent); + RsNodeGroupId groupId(getRsId(parent)); // the parent is a group, check if the gpg id is assigned to the group for (groupIt = groupInfoList.begin(); groupIt != groupInfoList.end(); ++groupIt) { @@ -630,7 +638,7 @@ void FriendList::insertPeers() } } else if (groupsHasChanged) { // remove deleted groups - std::string groupId = getRsId(item); + RsNodeGroupId groupId ( getRsId(item)); for (groupIt = groupInfoList.begin(); groupIt != groupInfoList.end(); ++groupIt) { if (groupIt->id == groupId) { break; @@ -671,7 +679,7 @@ void FriendList::insertPeers() int itemCount = peerTreeWidget->topLevelItemCount(); for (int index = 0; index < itemCount; ++index) { QTreeWidgetItem *groupItemLoop = peerTreeWidget->topLevelItem(index); - if (groupItemLoop->type() == TYPE_GROUP && getRsId(groupItemLoop) == groupInfo->id) { + if (groupItemLoop->type() == TYPE_GROUP && RsNodeGroupId(getRsId(groupItemLoop)) == groupInfo->id) { groupItem = groupItemLoop; break; } @@ -690,7 +698,7 @@ void FriendList::insertPeers() groupItem->setForeground(COLUMN_NAME, QBrush(textColorGroup())); /* used to find back the item */ - groupItem->setData(COLUMN_DATA, ROLE_ID, QString::fromStdString(groupInfo->id)); + groupItem->setData(COLUMN_DATA, ROLE_ID, QString::fromStdString(groupInfo->id.toStdString())); groupItem->setData(COLUMN_DATA, ROLE_STANDARD, (groupInfo->flag & RS_GROUP_FLAG_STANDARD) ? true : false); /* Sort data */ @@ -716,7 +724,7 @@ void FriendList::insertPeers() } } - if (openGroups != NULL && openGroups->find(groupInfo->id) != openGroups->end()) { + if (openGroups.find(groupInfo->id) != openGroups.end()) { groupItem->setExpanded(true); } @@ -1182,7 +1190,7 @@ void FriendList::insertPeers() gpgItem->setFont(i, gpgFont); } - if (openPeers != NULL && openPeers->find(gpgId.toStdString()) != openPeers->end()) { + if (openPeers.find(gpgId.toStdString()) != openPeers.end()) { gpgItem->setExpanded(true); } } @@ -1217,14 +1225,6 @@ void FriendList::insertPeers() } groupsHasChanged = false; - if (openGroups != NULL) { - delete(openGroups); - openGroups = NULL; - } - if (openPeers != NULL) { - delete(openPeers); - openPeers = NULL; - } ui->peerTreeWidget->resort(); } @@ -1232,13 +1232,13 @@ void FriendList::insertPeers() /** * Returns a list with all groupIds that are expanded */ -bool FriendList::getExpandedGroups(std::set &groups) const +bool FriendList::getExpandedGroups(std::set &groups) const { int itemCount = ui->peerTreeWidget->topLevelItemCount(); for (int index = 0; index < itemCount; ++index) { QTreeWidgetItem *item = ui->peerTreeWidget->topLevelItem(index); if (item->type() == TYPE_GROUP && item->isExpanded()) { - groups.insert(item->data(COLUMN_DATA, ROLE_ID).toString().toStdString()); + groups.insert(RsNodeGroupId(item->data(COLUMN_DATA, ROLE_ID).toString().toStdString())); } } return true; @@ -1626,7 +1626,7 @@ void FriendList::getSslIdsFromItem(QTreeWidgetItem *item, std::list &s case TYPE_GROUP: { RsGroupInfo groupInfo; - if (rsPeers->getGroupInfo(peerId, groupInfo)) { + if (rsPeers->getGroupInfo(RsNodeGroupId(peerId), groupInfo)) { std::set::iterator gpgIt; for (gpgIt = groupInfo.peerIds.begin(); gpgIt != groupInfo.peerIds.end(); ++gpgIt) { rsPeers->getAssociatedSSLIds(*gpgIt, sslIds); @@ -1649,10 +1649,10 @@ void FriendList::addToGroup() return; } - std::string groupId = qobject_cast(sender())->data().toString().toStdString(); + RsNodeGroupId groupId ( qobject_cast(sender())->data().toString().toStdString()); RsPgpId gpgId ( getRsId(c)); - if (gpgId.isNull() || groupId.empty()) { + if (gpgId.isNull() || groupId.isNull()) { return; } @@ -1675,15 +1675,15 @@ void FriendList::moveToGroup() return; } - std::string groupId = qobject_cast(sender())->data().toString().toStdString(); + RsNodeGroupId groupId ( qobject_cast(sender())->data().toString().toStdString()); RsPgpId gpgId ( getRsId(c)); - if (gpgId.isNull() || groupId.empty()) { + if (gpgId.isNull() || groupId.isNull()) { return; } // remove from all groups - rsPeers->assignPeerToGroup("", gpgId, false); + rsPeers->assignPeerToGroup(RsNodeGroupId(), gpgId, false); // automatically expand the group, the peer is added to addGroupToExpand(groupId); @@ -1704,7 +1704,7 @@ void FriendList::removeFromGroup() return; } - std::string groupId = qobject_cast(sender())->data().toString().toStdString(); + RsNodeGroupId groupId ( qobject_cast(sender())->data().toString().toStdString()); RsPgpId gpgId ( getRsId(c)); if (gpgId.isNull()) { @@ -1727,14 +1727,13 @@ void FriendList::editGroup() return; } - std::string groupId = getRsId(c); + RsNodeGroupId groupId ( getRsId(c)); - if (groupId.empty()) { - return; + if (!groupId.isNull()) + { + CreateGroup editGrpDialog(groupId, this); + editGrpDialog.exec(); } - - CreateGroup editGrpDialog(groupId, this); - editGrpDialog.exec(); } void FriendList::removeGroup() @@ -1749,13 +1748,10 @@ void FriendList::removeGroup() return; } - std::string groupId = getRsId(c); + RsNodeGroupId groupId ( getRsId(c)); - if (groupId.empty()) { - return; - } - - rsPeers->removeGroup(groupId); + if (!groupId.isNull()) + rsPeers->removeGroup(groupId); } void FriendList::exportFriendlistClicked() @@ -2089,7 +2085,7 @@ bool FriendList::importFriendlist(QString &fileName, bool &errorPeers, bool &err // get name and flags and try to get the group ID std::string groupName = group.attribute("name").toStdString(); uint32_t flag = group.attribute("flag").toInt(); - std::string groupId; + RsNodeGroupId groupId; if(getOrCreateGroup(groupName, flag, groupId)) { // group id found! QDomElement pgpID = group.firstChildElement("pgpID"); @@ -2123,7 +2119,7 @@ bool FriendList::importFriendlist(QString &fileName, bool &errorPeers, bool &err * @param id groupd id for the given name * @return success or fail */ -bool FriendList::getGroupIdByName(const std::string &name, std::string &id) +bool FriendList::getGroupIdByName(const std::string &name, RsNodeGroupId &id) { std::list grpList; if(!rsPeers->getGroupInfoList(grpList)) @@ -2146,14 +2142,14 @@ bool FriendList::getGroupIdByName(const std::string &name, std::string &id) * @param id groupd id * @return success or failure */ -bool FriendList::getOrCreateGroup(const std::string &name, const uint &flag, std::string &id) +bool FriendList::getOrCreateGroup(const std::string &name, const uint &flag, RsNodeGroupId &id) { if(getGroupIdByName(name, id)) return true; // -> create one RsGroupInfo grp; - grp.id = "0"; // RS will generate an ID + grp.id.clear(); // RS will generate an ID grp.name = name; grp.flag = flag; @@ -2271,12 +2267,9 @@ void FriendList::filterItems(const QString &text) * Add a groupId to the openGroups list. These groups * will be expanded, when they're added to the QTreeWidget */ -void FriendList::addGroupToExpand(const std::string &groupId) +void FriendList::addGroupToExpand(const RsNodeGroupId &groupId) { - if (openGroups == NULL) { - openGroups = new std::set; - } - openGroups->insert(groupId); + openGroups.insert(groupId); } /** @@ -2285,10 +2278,7 @@ void FriendList::addGroupToExpand(const std::string &groupId) */ void FriendList::addPeerToExpand(const std::string &gpgId) { - if (openPeers == NULL) { - openPeers = new std::set; - } - openPeers->insert(gpgId); + openPeers.insert(gpgId); } void FriendList::createDisplayMenu() diff --git a/retroshare-gui/src/gui/common/FriendList.h b/retroshare-gui/src/gui/common/FriendList.h index cd950a639..6b92530d8 100644 --- a/retroshare-gui/src/gui/common/FriendList.h +++ b/retroshare-gui/src/gui/common/FriendList.h @@ -63,8 +63,8 @@ public: // Add a tool button to the tool area void addToolButton(QToolButton *toolButton); void processSettings(bool load); - void addGroupToExpand(const std::string &groupId); - bool getExpandedGroups(std::set &groups) const; + void addGroupToExpand(const RsNodeGroupId &groupId); + bool getExpandedGroups(std::set &groups) const; void addPeerToExpand(const std::string &gpgId); bool getExpandedPeers(std::set &peers) const; @@ -119,8 +119,9 @@ private: QString mFilterText; bool groupsHasChanged; - std::set *openGroups; - std::set *openPeers; + std::set openGroups; +#warning this would needs an ID, not a std::string. + std::set openPeers; /* Color definitions (for standard see qss.default) */ QColor mTextColorGroup; @@ -129,8 +130,8 @@ private: QTreeWidgetItem *getCurrentPeer() const; void getSslIdsFromItem(QTreeWidgetItem *item, std::list &sslIds); - bool getOrCreateGroup(const std::string &name, const uint &flag, std::string &id); - bool getGroupIdByName(const std::string &name, std::string &id); + bool getOrCreateGroup(const std::string &name, const uint &flag, RsNodeGroupId &id); + bool getGroupIdByName(const std::string &name, RsNodeGroupId &id); bool importExportFriendlistFileDialog(QString &fileName, bool import); bool exportFriendlist(QString &fileName); diff --git a/retroshare-gui/src/gui/common/FriendSelectionWidget.cpp b/retroshare-gui/src/gui/common/FriendSelectionWidget.cpp index f6eb99e13..1f9d694fd 100644 --- a/retroshare-gui/src/gui/common/FriendSelectionWidget.cpp +++ b/retroshare-gui/src/gui/common/FriendSelectionWidget.cpp @@ -271,9 +271,9 @@ void FriendSelectionWidget::secured_fillList() selectedIds(sslIdsSelected,true); } - std::set groupIdsSelected; + std::set groupIdsSelected; if (mShowTypes & SHOW_GROUP) { - selectedIds(groupIdsSelected,true); + selectedIds(groupIdsSelected,true); } std::set gpgIdsSelected; @@ -305,6 +305,9 @@ void FriendSelectionWidget::secured_fillList() else rsPeers->getGPGAcceptedList(gpgIds); + // add own pgp id to the list + gpgIds.push_back(rsPeers->getGPGOwnId()) ; + std::list sslIds; std::list::iterator sslIt; @@ -347,7 +350,7 @@ void FriendSelectionWidget::secured_fillList() groupItem->setTextAlignment(COLUMN_NAME, Qt::AlignLeft | Qt::AlignVCenter); groupItem->setIcon(COLUMN_NAME, QIcon(IMAGE_GROUP16)); - groupItem->setData(COLUMN_DATA, ROLE_ID, QString::fromStdString(groupInfo->id)); + groupItem->setData(COLUMN_DATA, ROLE_ID, QString::fromStdString(groupInfo->id.toStdString())); groupItem->setExpanded(true); @@ -363,7 +366,7 @@ void FriendSelectionWidget::secured_fillList() groupItem->setCheckState(0, Qt::Unchecked); } - emit itemAdded(IDTYPE_GROUP, QString::fromStdString(groupInfo->id), groupItem); + emit itemAdded(IDTYPE_GROUP, QString::fromStdString(groupInfo->id.toStdString()), groupItem); if (std::find(groupIdsSelected.begin(), groupIdsSelected.end(), groupInfo->id) != groupIdsSelected.end()) { setSelected(mListModus, groupItem, true); diff --git a/retroshare-gui/src/gui/common/GroupChooser.cpp b/retroshare-gui/src/gui/common/GroupChooser.cpp new file mode 100644 index 000000000..02b43fb56 --- /dev/null +++ b/retroshare-gui/src/gui/common/GroupChooser.cpp @@ -0,0 +1,117 @@ +/* + * Retroshare Gxs Support + * + * Copyright 2012-2013 by Robert Fernie. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License Version 2.1 as published by the Free Software Foundation. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA. + * + * Please report all bugs and problems to "retroshare@lunamutt.com". + * + */ + +#include "GroupChooser.h" + +#include +#include + +#include + +/** Constructor */ +GroupChooser::GroupChooser(QWidget *parent) +: QComboBox(parent), mFlags(0) +{ + return; +} + +void GroupChooser::loadGroups(uint32_t chooserFlags, const RsNodeGroupId& defaultId) +{ + mFlags = chooserFlags; + mDefaultGroupId = defaultId; + + loadGroups(); +} + + +bool GroupChooser::makeNodeGroupDesc(const RsGroupInfo& info, QString &desc) +{ + desc.clear(); + + if(info.name.empty()) + desc = tr("[Unknown]") ; + else + desc = "\"" + QString::fromUtf8(info.name.c_str()) + "\""; + + desc += " [" ; + desc += QString::fromStdString(info.id.toStdString().substr(0,3)); + desc += "..."; + desc += QString::fromStdString(info.id.toStdString().substr(info.id.toStdString().length()-2,2)); + desc += "]"; + + return true; +} + + +void GroupChooser::loadGroups() +{ + std::list ids; + + rsPeers->getGroupInfoList(ids); + + if (ids.empty()) + { + std::cerr << "GroupChooser::loadGroups() ERROR no ids"; + std::cerr << std::endl; + return; + } + + int i = 0; + int def = -1; + for( std::list::iterator it = ids.begin(); it != ids.end(); ++it, ++i) + { + /* add to Chooser */ + QString str; + if (!makeNodeGroupDesc(*it, str)) + { + std::cerr << "GroupChooser::loadGroups() ERROR Desc for Id: " << it->id; + std::cerr << std::endl; + continue; + } + QString id = QString::fromStdString(it->id.toStdString()); + + addItem(str, id); + + if (mDefaultGroupId == it->id) + def = i; + } + + if (def >= 0) + { + setCurrentIndex(def); + } +} + +bool GroupChooser::getChosenGroup(RsNodeGroupId& id) +{ + if (count() < 1) + return false; + + int idx = currentIndex(); + + QVariant var = itemData(idx); + id = RsNodeGroupId(var.toString().toStdString()); + + return true; +} + diff --git a/retroshare-gui/src/gui/common/GroupChooser.h b/retroshare-gui/src/gui/common/GroupChooser.h new file mode 100644 index 000000000..fe7cb553b --- /dev/null +++ b/retroshare-gui/src/gui/common/GroupChooser.h @@ -0,0 +1,45 @@ +/* + * Retroshare Gxs Support + * + * Copyright 2012-2013 by Robert Fernie. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License Version 2.1 as published by the Free Software Foundation. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA. + * + * Please report all bugs and problems to "retroshare@lunamutt.com". + * + */ + + +#pragma once + +#include +#include + +class GroupChooser : public QComboBox +{ +public: + GroupChooser(QWidget *parent = NULL); + + void loadGroups(uint32_t chooserFlags, const RsNodeGroupId& defaultId); + bool getChosenGroup(RsNodeGroupId& id); + + static bool makeNodeGroupDesc(const RsGroupInfo& info, QString &desc); +private: + void loadGroups(); + uint32_t mFlags; + + RsNodeGroupId mDefaultGroupId; +}; + diff --git a/retroshare-gui/src/gui/common/GroupDefs.cpp b/retroshare-gui/src/gui/common/GroupDefs.cpp index 2b493124e..8a5e85ecd 100644 --- a/retroshare-gui/src/gui/common/GroupDefs.cpp +++ b/retroshare-gui/src/gui/common/GroupDefs.cpp @@ -51,7 +51,7 @@ const QString GroupDefs::name(const RsGroupInfo &groupInfo) return qApp->translate("GroupDefs", "Favorites"); } - std::cerr << "GroupDefs::name: Unknown group id requested " << groupInfo.id; + std::cerr << "GroupDefs::name: Unknown group id requested " << groupInfo.id << std::endl; return ""; } diff --git a/retroshare-gui/src/gui/common/GroupSelectionBox.cpp b/retroshare-gui/src/gui/common/GroupSelectionBox.cpp index 613459019..2e0cc9c32 100644 --- a/retroshare-gui/src/gui/common/GroupSelectionBox.cpp +++ b/retroshare-gui/src/gui/common/GroupSelectionBox.cpp @@ -20,7 +20,7 @@ GroupSelectionBox::GroupSelectionBox(QWidget *parent) void GroupSelectionBox::fillGroups() { - std::list selectedIds; + std::list selectedIds; selectedGroupIds(selectedIds); clear(); @@ -30,7 +30,7 @@ void GroupSelectionBox::fillGroups() for (std::list::const_iterator it(groupIds.begin()); it != groupIds.end(); ++it) { QListWidgetItem *item = new QListWidgetItem(GroupDefs::name(*it)); - item->setData(ROLE_ID, QString::fromStdString(it->id)); + item->setData(ROLE_ID, QString::fromStdString(it->id.toStdString())); item->setBackgroundColor(QColor(183,236,181)); addItem(item); } @@ -38,27 +38,27 @@ void GroupSelectionBox::fillGroups() setSelectedGroupIds(selectedIds); } -void GroupSelectionBox::selectedGroupIds(std::list &groupIds) const +void GroupSelectionBox::selectedGroupIds(std::list &groupIds) const { int itemCount = count(); for (int i = 0; i < itemCount; ++i) { QListWidgetItem *listItem = item(i); if (listItem->checkState() == Qt::Checked) { - groupIds.push_back(item(i)->data(ROLE_ID).toString().toStdString()); + groupIds.push_back(RsNodeGroupId(item(i)->data(ROLE_ID).toString().toStdString())); std::cerr << "Adding selected item " << groupIds.back() << std::endl; } } } -void GroupSelectionBox::setSelectedGroupIds(const std::list& groupIds) +void GroupSelectionBox::setSelectedGroupIds(const std::list& groupIds) { int itemCount = count(); for (int i = 0; i < itemCount; ++i) { QListWidgetItem *listItem = item(i); - if (std::find(groupIds.begin(), groupIds.end(), listItem->data(ROLE_ID).toString().toStdString()) != groupIds.end()) { + if (std::find(groupIds.begin(), groupIds.end(), RsNodeGroupId(listItem->data(ROLE_ID).toString().toStdString())) != groupIds.end()) { listItem->setCheckState(Qt::Checked); } else { listItem->setCheckState(Qt::Unchecked); diff --git a/retroshare-gui/src/gui/common/GroupSelectionBox.h b/retroshare-gui/src/gui/common/GroupSelectionBox.h index f8e8477fb..4afc9cc94 100644 --- a/retroshare-gui/src/gui/common/GroupSelectionBox.h +++ b/retroshare-gui/src/gui/common/GroupSelectionBox.h @@ -1,4 +1,5 @@ #include +#include class GroupSelectionBox: public QListWidget { @@ -7,10 +8,10 @@ class GroupSelectionBox: public QListWidget public: GroupSelectionBox(QWidget *parent); - void selectedGroupIds(std::list &groupIds) const; + void selectedGroupIds(std::list &groupIds) const; void selectedGroupNames(QList &groupNames) const; - void setSelectedGroupIds(const std::list &groupIds); + void setSelectedGroupIds(const std::list &groupIds); private slots: void fillGroups(); diff --git a/retroshare-gui/src/gui/connect/ConnectFriendWizard.cpp b/retroshare-gui/src/gui/connect/ConnectFriendWizard.cpp index 7990b92c4..afbcb4422 100755 --- a/retroshare-gui/src/gui/connect/ConnectFriendWizard.cpp +++ b/retroshare-gui/src/gui/connect/ConnectFriendWizard.cpp @@ -297,7 +297,7 @@ static void fillGroups(ConnectFriendWizard *wizard, QComboBox *comboBox, const Q GroupDefs::sortByName(groupInfoList); comboBox->addItem("", ""); // empty value for (std::list::iterator groupIt = groupInfoList.begin(); groupIt != groupInfoList.end(); ++groupIt) { - comboBox->addItem(GroupDefs::name(*groupIt), QString::fromStdString(groupIt->id)); + comboBox->addItem(GroupDefs::name(*groupIt), QString::fromStdString(groupIt->id.toStdString())); } if (groupId.isEmpty() == false) { @@ -853,7 +853,7 @@ void ConnectFriendWizard::accept() } if (!groupId.isEmpty()) - rsPeers->assignPeerToGroup(groupId.toStdString(), peerDetails.gpg_id, true); + rsPeers->assignPeerToGroup(RsNodeGroupId(groupId.toStdString()), peerDetails.gpg_id, true); } if ((accept_connection) && (!peerDetails.id.isNull())) diff --git a/retroshare-gui/src/gui/groups/CreateGroup.cpp b/retroshare-gui/src/gui/groups/CreateGroup.cpp index 7a919f93a..913b86a38 100644 --- a/retroshare-gui/src/gui/groups/CreateGroup.cpp +++ b/retroshare-gui/src/gui/groups/CreateGroup.cpp @@ -31,7 +31,7 @@ #include /** Default constructor */ -CreateGroup::CreateGroup(const std::string &groupId, QWidget *parent) +CreateGroup::CreateGroup(const RsNodeGroupId &groupId, QWidget *parent) : QDialog(parent, Qt::WindowSystemMenuHint | Qt::WindowTitleHint | Qt::WindowCloseButtonHint) { /* Invoke Qt Designer generated QObject setup routine */ @@ -45,13 +45,18 @@ CreateGroup::CreateGroup(const std::string &groupId, QWidget *parent) mGroupId = groupId; + if(!mGroupId.isNull()) + ui.groupId_LE->setText(QString::fromStdString(mGroupId.toStdString())) ; + else + ui.groupId_LE->setText(tr("To be defined")) ; + /* Initialize friends list */ ui.friendList->setHeaderText(tr("Friends")); ui.friendList->setModus(FriendSelectionWidget::MODUS_CHECK); ui.friendList->setShowType(FriendSelectionWidget::SHOW_GROUP | FriendSelectionWidget::SHOW_GPG); ui.friendList->start(); - if (mGroupId.empty() == false) { + if (!mGroupId.isNull()) { /* edit exisiting group */ RsGroupInfo groupInfo; if (rsPeers->getGroupInfo(mGroupId, groupInfo)) { @@ -83,7 +88,7 @@ CreateGroup::CreateGroup(const std::string &groupId, QWidget *parent) std::list::iterator groupIt; for (groupIt = groupInfoList.begin(); groupIt != groupInfoList.end(); ++groupIt) { - if (mGroupId.empty() || groupIt->id != mGroupId) { + if (mGroupId.isNull() || groupIt->id != mGroupId) { mUsedGroupNames.append(GroupDefs::name(*groupIt)); } } @@ -104,9 +109,9 @@ CreateGroup::~CreateGroup() void CreateGroup::groupNameChanged(QString text) { if (text.isEmpty() || mUsedGroupNames.contains(misc::removeNewLine(text))) { - ui.buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); + ui.buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); } else { - ui.buttonBox->button(QDialogButtonBox::Ok)->setEnabled(true); + ui.buttonBox->button(QDialogButtonBox::Ok)->setEnabled(true); } } @@ -114,14 +119,19 @@ void CreateGroup::changeGroup() { RsGroupInfo groupInfo; - if (mGroupId.empty()) { + if (mGroupId.isNull()) + { // add new group groupInfo.name = misc::removeNewLine(ui.groupName->text()).toUtf8().constData(); - if (!rsPeers->addGroup(groupInfo)) { + + if (!rsPeers->addGroup(groupInfo)) return; - } - } else { - if (rsPeers->getGroupInfo(mGroupId, groupInfo) == true) { + + } + else + { + if (rsPeers->getGroupInfo(mGroupId, groupInfo)) + { if (!mIsStandard) { groupInfo.name = misc::removeNewLine(ui.groupName->text()).toUtf8().constData(); if (!rsPeers->editGroup(mGroupId, groupInfo)) { diff --git a/retroshare-gui/src/gui/groups/CreateGroup.h b/retroshare-gui/src/gui/groups/CreateGroup.h index b8177c611..59d75dc42 100644 --- a/retroshare-gui/src/gui/groups/CreateGroup.h +++ b/retroshare-gui/src/gui/groups/CreateGroup.h @@ -30,7 +30,7 @@ class CreateGroup : public QDialog public: /** Default constructor */ - CreateGroup(const std::string &groupId, QWidget *parent = 0); + CreateGroup(const RsNodeGroupId &groupId, QWidget *parent = 0); /** Default destructor */ ~CreateGroup(); @@ -39,7 +39,7 @@ private slots: void groupNameChanged(QString); private: - std::string mGroupId; + RsNodeGroupId mGroupId; QStringList mUsedGroupNames; bool mIsStandard; diff --git a/retroshare-gui/src/gui/groups/CreateGroup.ui b/retroshare-gui/src/gui/groups/CreateGroup.ui index 3eb4bc2fd..7abcd5a4e 100644 --- a/retroshare-gui/src/gui/groups/CreateGroup.ui +++ b/retroshare-gui/src/gui/groups/CreateGroup.ui @@ -6,8 +6,8 @@ 0 0 - 386 - 298 + 575 + 485 @@ -23,9 +23,6 @@ 0 - - - @@ -36,27 +33,35 @@ - - - 6 - - - 0 - - + + - Group Name + Group Name: - + Enter a name for your group + + + + Group ID: + + + + + + + true + + + @@ -79,6 +84,9 @@ + + + diff --git a/retroshare-gui/src/gui/gxs/GxsCircleChooser.cpp b/retroshare-gui/src/gui/gxs/GxsCircleChooser.cpp index 07cc27c6d..2b9927dc8 100644 --- a/retroshare-gui/src/gui/gxs/GxsCircleChooser.cpp +++ b/retroshare-gui/src/gui/gxs/GxsCircleChooser.cpp @@ -31,14 +31,13 @@ /** Constructor */ GxsCircleChooser::GxsCircleChooser(QWidget *parent) -: QComboBox(parent), mFlags(0) +: QComboBox(parent) { return; } -void GxsCircleChooser::loadCircles(uint32_t chooserFlags, const RsGxsCircleId &defaultId) +void GxsCircleChooser::loadCircles(const RsGxsCircleId &defaultId) { - mFlags = chooserFlags; mDefaultCircleId = defaultId; loadGxsCircles(); } @@ -68,14 +67,7 @@ bool MakeGxsCircleDesc(const RsGxsCircleId &id, QString &desc) void GxsCircleChooser::loadGxsCircles() { std::list ids; - if (mFlags & GXS_CIRCLE_CHOOSER_EXTERNAL) - { - rsGxsCircles->getCircleExternalIdList(ids); - } - if (mFlags & GXS_CIRCLE_CHOOSER_PERSONAL) - { - rsGxsCircles->getCirclePersonalIdList(ids); - } + rsGxsCircles->getCircleExternalIdList(ids); if (ids.empty()) { diff --git a/retroshare-gui/src/gui/gxs/GxsCircleChooser.h b/retroshare-gui/src/gui/gxs/GxsCircleChooser.h index 1a5f01fb3..474fbbc22 100644 --- a/retroshare-gui/src/gui/gxs/GxsCircleChooser.h +++ b/retroshare-gui/src/gui/gxs/GxsCircleChooser.h @@ -28,11 +28,6 @@ #include #include - -#define GXS_CIRCLE_CHOOSER_EXTERNAL 0x0001 -#define GXS_CIRCLE_CHOOSER_PERSONAL 0x0002 -#define GXS_CIRCLE_CHOOSER_ALLCIRCLES 0x0003 // OR of other two. - class GxsCircleChooser : public QComboBox { Q_OBJECT @@ -40,12 +35,11 @@ class GxsCircleChooser : public QComboBox public: GxsCircleChooser(QWidget *parent = NULL); - void loadCircles(uint32_t chooserFlags, const RsGxsCircleId &defaultId); + void loadCircles(const RsGxsCircleId &defaultId); bool getChosenCircle(RsGxsCircleId &id); private: void loadGxsCircles(); - uint32_t mFlags; RsGxsCircleId mDefaultCircleId; }; diff --git a/retroshare-gui/src/gui/gxs/GxsGroupDialog.cpp b/retroshare-gui/src/gui/gxs/GxsGroupDialog.cpp index f519cb4bf..adde35455 100644 --- a/retroshare-gui/src/gui/gxs/GxsGroupDialog.cpp +++ b/retroshare-gui/src/gui/gxs/GxsGroupDialog.cpp @@ -124,8 +124,8 @@ void GxsGroupDialog::init() /* Setup Reasonable Defaults */ ui.idChooser->loadIds(0,RsGxsId()); - ui.circleComboBox->loadCircles(GXS_CIRCLE_CHOOSER_EXTERNAL, RsGxsCircleId()); - ui.localComboBox->loadCircles(GXS_CIRCLE_CHOOSER_PERSONAL, RsGxsCircleId()); + ui.circleComboBox->loadCircles(RsGxsCircleId()); + ui.localComboBox->loadGroups(0, RsNodeGroupId()); ui.groupDesc->setPlaceholderText(tr("Set a descriptive description here")); @@ -302,7 +302,13 @@ void GxsGroupDialog::setupDefaults() } } ui.antiSpam_trackMessages->setChecked((bool)(mDefaultsFlags & GXS_GROUP_DEFAULTS_ANTISPAM_TRACK)); - ui.antiSpam_signedIds->setChecked((bool)(mDefaultsFlags & GXS_GROUP_DEFAULTS_ANTISPAM_FAVOR_PGP)); + + if( (mDefaultsFlags & GXS_GROUP_DEFAULTS_ANTISPAM_FAVOR_PGP) && (mDefaultsFlags & GXS_GROUP_DEFAULTS_ANTISPAM_FAVOR_PGP_KNOWN)) + ui.antiSpam_perms_CB->setCurrentIndex(2) ; + else if(mDefaultsFlags & GXS_GROUP_DEFAULTS_ANTISPAM_FAVOR_PGP) + ui.antiSpam_perms_CB->setCurrentIndex(1) ; + else + ui.antiSpam_perms_CB->setCurrentIndex(0) ; QString antispam_string ; if(mDefaultsFlags & GXS_GROUP_DEFAULTS_ANTISPAM_TRACK) antispam_string += tr("Message tracking") ; @@ -315,8 +321,6 @@ void GxsGroupDialog::setupDefaults() ui.typeGroup_3->setEnabled(false); ui.typeLocal_3->setEnabled(false); #endif - ui.typeLocal->setEnabled(false); // for now, since local circles not fully tested. - ui.typeLocal->setToolTip(tr("This feature is not yet available, but it will be available very soon!")); // for now, since local circles not fully tested. } void GxsGroupDialog::setupVisibility() @@ -394,85 +398,97 @@ void GxsGroupDialog::newGroup() void GxsGroupDialog::updateFromExistingMeta(const QString &description) { - std::cerr << "void GxsGroupDialog::updateFromExistingMeta()"; - std::cerr << std::endl; + std::cerr << "void GxsGroupDialog::updateFromExistingMeta()"; + std::cerr << std::endl; - std::cerr << "void GxsGroupDialog::updateFromExistingMeta() mGrpMeta.mCircleType: "; - std::cerr << mGrpMeta.mCircleType << " Internal: " << mGrpMeta.mInternalCircle; - std::cerr << " External: " << mGrpMeta.mCircleId; - std::cerr << std::endl; + std::cerr << "void GxsGroupDialog::updateFromExistingMeta() mGrpMeta.mCircleType: "; + std::cerr << mGrpMeta.mCircleType << " Internal: " << mGrpMeta.mInternalCircle; + std::cerr << " External: " << mGrpMeta.mCircleId; + std::cerr << std::endl; - setupDefaults(); - setupVisibility(); - setupReadonly(); - clearForm(); - setGroupSignFlags(mGrpMeta.mSignFlags) ; + setupDefaults(); + setupVisibility(); + setupReadonly(); + clearForm(); + setGroupSignFlags(mGrpMeta.mSignFlags) ; - /* setup name */ - ui.groupName->setText(QString::fromUtf8(mGrpMeta.mGroupName.c_str())); - - /* Show Mode */ - ui.nameline->setText(QString::fromUtf8(mGrpMeta.mGroupName.c_str())); - ui.popline->setText(QString::number( mGrpMeta.mPop)) ; - ui.postsline->setText(QString::number(mGrpMeta.mVisibleMsgCount)); - ui.lastpostline->setText(DateTime::formatLongDateTime(mGrpMeta.mLastPost)); + /* setup name */ + ui.groupName->setText(QString::fromUtf8(mGrpMeta.mGroupName.c_str())); + + /* Show Mode */ + ui.nameline->setText(QString::fromUtf8(mGrpMeta.mGroupName.c_str())); + ui.popline->setText(QString::number( mGrpMeta.mPop)) ; + ui.postsline->setText(QString::number(mGrpMeta.mVisibleMsgCount)); + ui.lastpostline->setText(DateTime::formatLongDateTime(mGrpMeta.mLastPost)); ui.authorLabel->setId(mGrpMeta.mAuthorId); - ui.IDline->setText(QString::fromStdString(mGrpMeta.mGroupId.toStdString())); - ui.descriptiontextEdit->setPlainText(description); - - switch (mode()) - { - case MODE_CREATE:{ - } - break; - case MODE_SHOW:{ - ui.headerFrame->setHeaderText(QString::fromUtf8(mGrpMeta.mGroupName.c_str())); - if (!mPicture.isNull()) - ui.headerFrame->setHeaderImage(mPicture); - } - break; - case MODE_EDIT:{ - } - break; - } - /* set description */ - ui.groupDesc->setPlainText(description); - QString distribution_string = "[Unknown]"; + ui.IDline->setText(QString::fromStdString(mGrpMeta.mGroupId.toStdString())); + ui.descriptiontextEdit->setPlainText(description); - switch(mGrpMeta.mCircleType) - { - case GXS_CIRCLE_TYPE_YOUR_FRIENDS_ONLY: - ui.typeLocal->setChecked(true); - distribution_string = tr("Your friends only") ; - ui.localComboBox->loadCircles(GXS_CIRCLE_CHOOSER_PERSONAL, mGrpMeta.mInternalCircle); - ui.distributionCircleComboBox->setVisible(true) ; - ui.distributionCircleComboBox->loadCircles(GXS_CIRCLE_CHOOSER_PERSONAL, mGrpMeta.mInternalCircle); - break; - case GXS_CIRCLE_TYPE_PUBLIC: - ui.typePublic->setChecked(true); - distribution_string = tr("Public") ; - ui.distributionCircleComboBox->setVisible(false) ; - break; - case GXS_CIRCLE_TYPE_EXTERNAL: - ui.typeGroup->setChecked(true); - distribution_string = tr("Restricted to circle:") ; - ui.distributionCircleComboBox->setVisible(true) ; - ui.distributionCircleComboBox->loadCircles(GXS_CIRCLE_CHOOSER_EXTERNAL, mGrpMeta.mCircleId); - ui.circleComboBox->loadCircles(GXS_CIRCLE_CHOOSER_EXTERNAL, mGrpMeta.mCircleId); - break; - default: - std::cerr << "CreateCircleDialog::updateCircleGUI() INVALID mCircleType"; - std::cerr << std::endl; - break; - } + switch (mode()) + { + case MODE_CREATE:{ + } + break; + case MODE_SHOW:{ + ui.headerFrame->setHeaderText(QString::fromUtf8(mGrpMeta.mGroupName.c_str())); + if (!mPicture.isNull()) + ui.headerFrame->setHeaderImage(mPicture); + } + break; + case MODE_EDIT:{ + } + break; + } + /* set description */ + ui.groupDesc->setPlainText(description); + QString distribution_string = "[Unknown]"; + + switch(mGrpMeta.mCircleType) + { + case GXS_CIRCLE_TYPE_YOUR_FRIENDS_ONLY: + { + ui.typeLocal->setChecked(true); + distribution_string = tr("Only friends nodes in group ") ; + + RsGroupInfo ginfo ; + rsPeers->getGroupInfo(RsNodeGroupId(mGrpMeta.mInternalCircle),ginfo) ; + + QString desc; + GroupChooser::makeNodeGroupDesc(ginfo, desc); + distribution_string += desc ; + + ui.localComboBox->loadGroups(0, RsNodeGroupId(mGrpMeta.mInternalCircle)); + ui.distributionCircleComboBox->setVisible(false) ; + ui.localComboBox->setVisible(true) ; + } + break; + case GXS_CIRCLE_TYPE_PUBLIC: + ui.typePublic->setChecked(true); + distribution_string = tr("Public") ; + ui.distributionCircleComboBox->setVisible(false) ; + ui.localComboBox->setVisible(false) ; + break; + case GXS_CIRCLE_TYPE_EXTERNAL: + ui.typeGroup->setChecked(true); + distribution_string = tr("Restricted to circle:") ; + ui.localComboBox->setVisible(false) ; + ui.distributionCircleComboBox->setVisible(true) ; + ui.distributionCircleComboBox->loadCircles(mGrpMeta.mCircleId); + ui.circleComboBox->loadCircles(mGrpMeta.mCircleId); + break; + default: + std::cerr << "CreateCircleDialog::updateCircleGUI() INVALID mCircleType"; + std::cerr << std::endl; + break; + } ui.distributionValueLabel->setText(distribution_string) ; - ui.idChooser->loadIds(0, mGrpMeta.mAuthorId); - - if(!mGrpMeta.mAuthorId.isNull()) - ui.idChooser->setChosenId(mGrpMeta.mAuthorId) ; + ui.idChooser->loadIds(0, mGrpMeta.mAuthorId); - updateCircleOptions(); + if(!mGrpMeta.mAuthorId.isNull()) + ui.idChooser->setChosenId(mGrpMeta.mAuthorId) ; + + updateCircleOptions(); } void GxsGroupDialog::submitGroup() @@ -613,32 +629,37 @@ void GxsGroupDialog::createGroup() uint32_t GxsGroupDialog::getGroupSignFlags() { - /* grab from the ui options -> */ - uint32_t signFlags = 0; - if (ui.publish_encrypt->isChecked()) { - signFlags |= GXS_SERV::FLAG_GROUP_SIGN_PUBLISH_ENCRYPTED; - } else if (ui.publish_required->isChecked()) { - signFlags |= GXS_SERV::FLAG_GROUP_SIGN_PUBLISH_ALLSIGNED; - } else if (ui.publish_threads->isChecked()) { - signFlags |= GXS_SERV::FLAG_GROUP_SIGN_PUBLISH_THREADHEAD; - } else { // publish_open (default). - signFlags |= GXS_SERV::FLAG_GROUP_SIGN_PUBLISH_NONEREQ; - } + /* grab from the ui options -> */ + uint32_t signFlags = 0; + if (ui.publish_encrypt->isChecked()) { + signFlags |= GXS_SERV::FLAG_GROUP_SIGN_PUBLISH_ENCRYPTED; + } else if (ui.publish_required->isChecked()) { + signFlags |= GXS_SERV::FLAG_GROUP_SIGN_PUBLISH_ALLSIGNED; + } else if (ui.publish_threads->isChecked()) { + signFlags |= GXS_SERV::FLAG_GROUP_SIGN_PUBLISH_THREADHEAD; + } else { // publish_open (default). + signFlags |= GXS_SERV::FLAG_GROUP_SIGN_PUBLISH_NONEREQ; + } - if (ui.personal_required->isChecked()) - signFlags |= GXS_SERV::FLAG_AUTHOR_AUTHENTICATION_REQUIRED; - - if (ui.personal_ifnopub->isChecked()) - signFlags |= GXS_SERV::FLAG_AUTHOR_AUTHENTICATION_IFNOPUBSIGN; - - // Author Signature. - if (ui.antiSpam_signedIds->isChecked()) - signFlags |= GXS_SERV::FLAG_AUTHOR_AUTHENTICATION_GPG; - - if (ui.antiSpam_trackMessages->isChecked()) - signFlags |= GXS_SERV::FLAG_AUTHOR_AUTHENTICATION_TRACK_MESSAGES; - - return signFlags; + if (ui.personal_required->isChecked()) + signFlags |= GXS_SERV::FLAG_AUTHOR_AUTHENTICATION_REQUIRED; + + if (ui.personal_ifnopub->isChecked()) + signFlags |= GXS_SERV::FLAG_AUTHOR_AUTHENTICATION_IFNOPUBSIGN; + + // Author Signature. + switch(ui.antiSpam_perms_CB->currentIndex()) + { + case 0: break ; + case 2: signFlags |= GXS_SERV::FLAG_AUTHOR_AUTHENTICATION_GPG_KNOWN; // no break below, since we want *both* flags in this case. + case 1: signFlags |= GXS_SERV::FLAG_AUTHOR_AUTHENTICATION_GPG; + break ; + } + + if (ui.antiSpam_trackMessages->isChecked()) + signFlags |= GXS_SERV::FLAG_AUTHOR_AUTHENTICATION_TRACK_MESSAGES; + + return signFlags; } void GxsGroupDialog::setGroupSignFlags(uint32_t signFlags) @@ -660,11 +681,19 @@ void GxsGroupDialog::setGroupSignFlags(uint32_t signFlags) ui.personal_ifnopub->setChecked(true); ui.antiSpam_trackMessages ->setChecked((bool)(signFlags & GXS_SERV::FLAG_AUTHOR_AUTHENTICATION_TRACK_MESSAGES) ); - ui.antiSpam_signedIds ->setChecked((bool)(signFlags & GXS_SERV::FLAG_AUTHOR_AUTHENTICATION_GPG) ); + if( (signFlags & GXS_SERV::FLAG_AUTHOR_AUTHENTICATION_GPG_KNOWN) && (signFlags & GXS_SERV::FLAG_AUTHOR_AUTHENTICATION_GPG)) + ui.antiSpam_perms_CB->setCurrentIndex(2) ; + else if(signFlags & GXS_SERV::FLAG_AUTHOR_AUTHENTICATION_GPG) + ui.antiSpam_perms_CB->setCurrentIndex(1) ; + else + ui.antiSpam_perms_CB->setCurrentIndex(0) ; + QString antispam_string ; if(signFlags & GXS_SERV::FLAG_AUTHOR_AUTHENTICATION_TRACK_MESSAGES) antispam_string += tr("Message tracking") ; - if(signFlags & GXS_SERV::FLAG_AUTHOR_AUTHENTICATION_GPG) antispam_string += (antispam_string.isNull()?"":" and ")+tr("PGP signature required") ; + if(signFlags & GXS_SERV::FLAG_AUTHOR_AUTHENTICATION_GPG_KNOWN) antispam_string += (antispam_string.isNull()?"":" and ")+tr("PGP signature from known ID required") ; + else + if(signFlags & GXS_SERV::FLAG_AUTHOR_AUTHENTICATION_GPG) antispam_string += (antispam_string.isNull()?"":" and ")+tr("PGP signature required") ; ui.antiSpamValueLabel->setText(antispam_string) ; //ui.antiSpam_trackMessages_2->setChecked((bool)(signFlags & GXS_SERV::FLAG_AUTHOR_AUTHENTICATION_TRACK_MESSAGES) ); @@ -720,41 +749,42 @@ void GxsGroupDialog::updateCircleOptions() bool GxsGroupDialog::setCircleParameters(RsGroupMetaData &meta) { - meta.mCircleType = GXS_CIRCLE_TYPE_PUBLIC; - meta.mCircleId.clear(); - meta.mOriginator.clear(); - meta.mInternalCircle.clear(); + meta.mCircleType = GXS_CIRCLE_TYPE_PUBLIC; + meta.mCircleId.clear(); + meta.mOriginator.clear(); + meta.mInternalCircle.clear(); - if (ui.typePublic->isChecked()) - { - meta.mCircleType = GXS_CIRCLE_TYPE_PUBLIC; - meta.mCircleId.clear(); - } - else if (ui.typeGroup->isChecked()) - { - meta.mCircleType = GXS_CIRCLE_TYPE_EXTERNAL; - if (!ui.circleComboBox->getChosenCircle(meta.mCircleId)) - { - return false; - } - } - else if (ui.typeLocal->isChecked()) - { - meta.mCircleType = GXS_CIRCLE_TYPE_YOUR_FRIENDS_ONLY; - meta.mCircleId.clear(); - meta.mOriginator.clear(); - meta.mInternalCircle.clear() ; - - if (!ui.localComboBox->getChosenCircle(meta.mInternalCircle)) - { - return false; - } - } - else - { - return false; - } - return true; + if (ui.typePublic->isChecked()) + { + meta.mCircleType = GXS_CIRCLE_TYPE_PUBLIC; + meta.mCircleId.clear(); + } + else if (ui.typeGroup->isChecked()) + { + meta.mCircleType = GXS_CIRCLE_TYPE_EXTERNAL; + if (!ui.circleComboBox->getChosenCircle(meta.mCircleId)) + { + return false; + } + } + else if (ui.typeLocal->isChecked()) + { + meta.mCircleType = GXS_CIRCLE_TYPE_YOUR_FRIENDS_ONLY; + meta.mCircleId.clear(); + meta.mOriginator.clear(); + meta.mInternalCircle.clear() ; + + RsNodeGroupId ngi ; + + if (!ui.localComboBox->getChosenGroup(ngi)) + return false; + + meta.mInternalCircle = RsGxsCircleId(ngi) ; + } + else + return false; + + return true; } void GxsGroupDialog::cancelDialog() diff --git a/retroshare-gui/src/gui/gxs/GxsGroupDialog.h b/retroshare-gui/src/gui/gxs/GxsGroupDialog.h index 7f94c32db..b71a39952 100644 --- a/retroshare-gui/src/gui/gxs/GxsGroupDialog.h +++ b/retroshare-gui/src/gui/gxs/GxsGroupDialog.h @@ -90,8 +90,9 @@ public: #define GXS_GROUP_DEFAULTS_COMMENTS_YES 0x00001000 #define GXS_GROUP_DEFAULTS_COMMENTS_NO 0x00002000 -#define GXS_GROUP_DEFAULTS_ANTISPAM_FAVOR_PGP 0x00100000 -#define GXS_GROUP_DEFAULTS_ANTISPAM_TRACK 0x00200000 +#define GXS_GROUP_DEFAULTS_ANTISPAM_FAVOR_PGP 0x00100000 +#define GXS_GROUP_DEFAULTS_ANTISPAM_TRACK 0x00200000 +#define GXS_GROUP_DEFAULTS_ANTISPAM_FAVOR_PGP_KNOWN 0x00400000 /*! * The aim of this dialog is to be convenient to encapsulate group diff --git a/retroshare-gui/src/gui/gxs/GxsGroupDialog.ui b/retroshare-gui/src/gui/gxs/GxsGroupDialog.ui index eb5228c81..81dd84c91 100644 --- a/retroshare-gui/src/gui/gxs/GxsGroupDialog.ui +++ b/retroshare-gui/src/gui/gxs/GxsGroupDialog.ui @@ -1,882 +1,864 @@ - - - GxsGroupDialog - - - - 0 - 0 - 828 - 612 - - - - Create New - - - - 0 - - - 0 - - - 0 - - - 0 - - - 6 - - - 0 - - - - - - - - QFrame::NoFrame - - - QFrame::Raised - - - 0 - - - - - - - - - - - 0 - - - 4 - - - 4 - - - 4 - - - 4 - - - - - 6 - - - 0 - - - - - - 64 - 64 - - - - - 64 - 64 - - - - QFrame::StyledPanel - - - QFrame::Raised - - - :/images/channels.png - - - true - - - - - - - 6 - - - 6 - - - - - Name - - - - - - - - - - - - 9 - - - 3 - - - 3 - - - 3 - - - 3 - - - - - Add Icon - - - - :/images/add_image24.png:/images/add_image24.png - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Will be used to send feedback - - - Owner: - - - - - - - - - - Key recipients can publish to restricted-type group and can view and publish for private-type channels - - - Share Publish Key - - - - - - - - - - - - - - Description - - - - - - - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - - - true - - - - 0 - 0 - - - - - 300 - 524287 - - - - - 220 - 0 - - - - - 0 - 0 - - - - check peers you would like to share private publish key with - - - false - - - QDockWidget::NoDockWidgetFeatures - - - Share Key With - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 0 - 4 - - - - - 20 - 0 - - - - - 300 - 16777215 - - - - - 220 - 0 - - - - - 200 - 0 - - - - - - - - - - - - - 0 - 0 - - - - Message Distribution - - - - 0 - - - - - - 0 - 0 - - - - Public - - - - :/images/network.png:/images/network.png - - - - 24 - 24 - - - - - - - - - - - 0 - 0 - - - - Restricted to Circle - - - - :/images/circles/circles_32.png:/images/circles/circles_32.png - - - - 24 - 24 - - - - - - - - - - - - - - - - 0 - 0 - - - - Only For Your Friends - - - - :/images/user/friends24.png:/images/user/friends24.png - - - - 24 - 24 - - - - - - - - - - - - - - - - Publish Signatures - - - - 6 - - - 9 - - - 4 - - - 9 - - - 4 - - - - - Open - - - - - - - New Thread - - - - - - - Required - - - - - - - Encrypted Msgs - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - Personal Signatures - - - - - - PGP Required - - - - - - - Signature Required - - - - - - - If No Publish Signature - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - Comments - - - - 6 - - - 9 - - - 4 - - - 9 - - - 4 - - - - - Allow Comments - - - - - - - No Comments - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - Spam-protection - - - - 6 - - - 9 - - - 4 - - - 9 - - - 4 - - - - - <html><head/><body><p>This makes the media increase the reputation threshold to 0.4 for anonymous ids, while keeping it to 0.0 for PGP-linked ids. Therefore, anonymous ids can still post, if their local reputation score is above that threshold.</p></body></html> - - - Favor PGP-signed ids - - - - - - - <html><head/><body><p align="justify">This feature allows Retroshare to locally keep a record of who forwarded each message to you, for the last 10 days. Although useless if alone (and already available whatsoever) this information can be used by a group of collaborative friends to easily locate the source of spams. To be used with care, since it significantly decreases the anonymity of message posts.</p></body></html> - - - Keep track of posts - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - - - - Info - - - - - - Name - - - - - - - true - - - - - - - Popularity - - - - - - - true - - - - - - - Posts - - - - - - - - - - true - - - - - - - Last Post - - - - - - - true - - - - - - - Author - - - - - - - GxsIdLabel - - - - - - - ID - - - - - - - true - - - - - - - Comments: - - - - - - - TextLabel - - - - - - - - - TextLabel - - - - - - - - 0 - 0 - - - - - - - - - - Distribution: - - - - - - - Anti Spam: - - - - - - - TextLabel - - - - - - - - - - Description - - - - - - true - - - - - - - - - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - GxsIdLabel - QLabel -
gui/gxs/GxsIdLabel.h
-
- - GxsIdChooser - QComboBox -
gui/gxs/GxsIdChooser.h
-
- - GxsCircleChooser - QComboBox -
gui/gxs/GxsCircleChooser.h
-
- - HeaderFrame - QFrame -
gui/common/HeaderFrame.h
- 1 -
- - FriendSelectionWidget - QWidget -
gui/common/FriendSelectionWidget.h
- 1 -
- - MimeTextEdit - QTextEdit -
gui/common/MimeTextEdit.h
-
-
- - - - -
+ + + GxsGroupDialog + + + + 0 + 0 + 860 + 775 + + + + Create New + + + + 6 + + + 0 + + + 0 + + + + + + + + QFrame::NoFrame + + + QFrame::Raised + + + 0 + + + + + + + + + + + 0 + + + 4 + + + + + 6 + + + 0 + + + + + + 64 + 64 + + + + + 64 + 64 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + :/images/channels.png + + + true + + + + + + + 6 + + + 6 + + + + + Name + + + + + + + + + + + + 9 + + + 3 + + + + + Add Icon + + + + :/images/add_image24.png:/images/add_image24.png + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Will be used to send feedback + + + Owner: + + + + + + + + + + Key recipients can publish to restricted-type group and can view and publish for private-type channels + + + Share Publish Key + + + + + + + + + + + + + + Description + + + + + + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + true + + + + 0 + 0 + + + + + 300 + 524287 + + + + + 220 + 0 + + + + + 0 + 0 + + + + check peers you would like to share private publish key with + + + false + + + QDockWidget::NoDockWidgetFeatures + + + Share Key With + + + + + 0 + + + 0 + + + + + + 0 + 4 + + + + + 20 + 0 + + + + + 300 + 16777215 + + + + + 220 + 0 + + + + + 200 + 0 + + + + + + + + + + + + + 0 + 0 + + + + Message Distribution + + + + 0 + + + + + + 0 + 0 + + + + <html><head/><body><p>Messsages will spread way beyond your friend nodes, as long as people subscribe to the channel/forum/posted you're creating.</p></body></html> + + + Public + + + + :/images/network.png:/images/network.png + + + + 24 + 24 + + + + + + + + + + + 0 + 0 + + + + <html><head/><body><p>Messages will spread among Retroshare nodes that host one of the identities listed as member of the circle and who also subscribe the media. Only these nodes will be able to see that this forum/channel/posted media exists. </p></body></html> + + + Restricted to Circle + + + + :/images/circles/circles_32.png:/images/circles/circles_32.png + + + + 24 + 24 + + + + + + + + + + + + + + + + 0 + 0 + + + + <html><head/><body><p>Messages will only be distributed to the selected subset of your friend nodes. They will not forward messages with each other, but only use your own node as a central hub to distribute them.</p></body></html> + + + Only For Your Friends + + + + :/images/user/friends24.png:/images/user/friends24.png + + + + 24 + 24 + + + + + + + + + + + + + + + + Publish Signatures + + + + 6 + + + 9 + + + 4 + + + 9 + + + 4 + + + + + Open + + + + + + + New Thread + + + + + + + Required + + + + + + + Encrypted Msgs + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + Personal Signatures + + + + + + PGP Required + + + + + + + Signature Required + + + + + + + If No Publish Signature + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + Comments + + + + 6 + + + 9 + + + 4 + + + 9 + + + 4 + + + + + Allow Comments + + + + + + + No Comments + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + Spam-protection + + + + + + Posts permissions: + + + + + + + <html><head/><body><p>This combo box allows you to choose how posts are handled depending on the node the poster belongs to.</p><p><span style=" font-weight:600;">All allowed</span>: all posts are treated equally.</p><p><span style=" font-weight:600;">Defavor posts from unsigned IDs</span>: anonymous IDs will require a reputation of 0.4 to be received/forwarded.</p><p><span style=" font-weight:600;">Defavor posts from unsigned IDs and IDs from unknown nodes</span>: anonymous IDs and IDs signed by unknown Retroshare nodes will require a reputation of 0.4 to be received/forwarded.</p></body></html> + + + + All allowed + + + + + Defavor unsigned IDs + + + + + Defavor unsigned IDs and IDs from unknown nodes + + + + + + + + <html><head/><body><p align="justify">This feature allows Retroshare to locally keep a record of who forwarded each message to you, for the last 10 days. Although useless if alone (and already available whatsoever) this information can be used by a group of teamed-up friends to easily locate a source of spams. To be used with care, since it significantly decreases the anonymity of message posts.</p></body></html> + + + Keep track of posts + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + + Info + + + + + + Name + + + + + + + true + + + + + + + Popularity + + + + + + + true + + + + + + + Posts + + + + + + + + + + true + + + + + + + Last Post + + + + + + + true + + + + + + + Author + + + + + + + GxsIdLabel + + + + + + + ID + + + + + + + true + + + + + + + Comments: + + + + + + + TextLabel + + + + + + + + + TextLabel + + + + + + + + 0 + 0 + + + + + + + + + + Distribution: + + + + + + + Anti Spam: + + + + + + + TextLabel + + + + + + + + + + Description + + + + + + true + + + + + + + + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + GxsIdLabel + QLabel +
gui/gxs/GxsIdLabel.h
+
+ + GxsIdChooser + QComboBox +
gui/gxs/GxsIdChooser.h
+
+ + GxsCircleChooser + QComboBox +
gui/gxs/GxsCircleChooser.h
+
+ + HeaderFrame + QFrame +
gui/common/HeaderFrame.h
+ 1 +
+ + FriendSelectionWidget + QWidget +
gui/common/FriendSelectionWidget.h
+ 1 +
+ + MimeTextEdit + QTextEdit +
gui/common/MimeTextEdit.h
+
+ + GroupChooser + QComboBox +
gui/common/GroupChooser.h
+
+
+ + + + +
diff --git a/retroshare-gui/src/gui/gxs/GxsIdDetails.cpp b/retroshare-gui/src/gui/gxs/GxsIdDetails.cpp index 7458e0406..5c7d00dd7 100644 --- a/retroshare-gui/src/gui/gxs/GxsIdDetails.cpp +++ b/retroshare-gui/src/gui/gxs/GxsIdDetails.cpp @@ -29,7 +29,6 @@ #include #include "GxsIdDetails.h" #include "retroshare-gui/RsAutoUpdatePage.h" -#include "retroshare/rsreputations.h" #include @@ -905,7 +904,7 @@ bool GxsIdDetails::MakeIdDesc(const RsGxsId &id, bool doIcons, QString &str, QLi QString GxsIdDetails::getName(const RsIdentityDetails &details) { - if(rsReputations->isIdentityBanned(details.mId)) + if(rsIdentity->isBanned(details.mId)) return tr("[Banned]") ; QString name = QString::fromUtf8(details.mNickname.c_str()).left(RSID_MAXIMUM_NICKNAME_SIZE); @@ -924,7 +923,7 @@ QString GxsIdDetails::getComment(const RsIdentityDetails &details) QString comment; QString nickname ; - bool banned = rsReputations->isIdentityBanned(details.mId) ; + bool banned = rsIdentity->isBanned(details.mId) ; if(details.mNickname.empty()) nickname = tr("[Unknown]") ; @@ -963,7 +962,7 @@ void GxsIdDetails::getIcons(const RsIdentityDetails &details, QList &icon { QPixmap pix ; - if(rsReputations->isIdentityBanned(details.mId)) + if(rsIdentity->isBanned(details.mId)) { icons.clear() ; icons.push_back(QIcon(IMAGE_BANNED)) ; diff --git a/retroshare-gui/src/gui/gxs/GxsIdTreeWidgetItem.cpp b/retroshare-gui/src/gui/gxs/GxsIdTreeWidgetItem.cpp index d002e9541..0177f892f 100644 --- a/retroshare-gui/src/gui/gxs/GxsIdTreeWidgetItem.cpp +++ b/retroshare-gui/src/gui/gxs/GxsIdTreeWidgetItem.cpp @@ -25,7 +25,6 @@ #include "GxsIdTreeWidgetItem.h" #include "GxsIdDetails.h" #include "util/HandleRichText.h" -#include "retroshare/rsreputations.h" #define BANNED_IMAGE ":/icons/yellow_biohazard64.png" @@ -117,14 +116,14 @@ void GxsIdRSTreeWidgetItem::setId(const RsGxsId &id, int column, bool retryWhenF void GxsIdRSTreeWidgetItem::updateBannedState() { - if(mBannedState != rsReputations->isIdentityBanned(mId)) + if(mBannedState != rsIdentity->isBanned(mId)) forceUpdate() ; } void GxsIdRSTreeWidgetItem::forceUpdate() { mIdFound = false; - mBannedState = rsReputations->isIdentityBanned(mId) ; + mBannedState = rsIdentity->isBanned(mId) ; startProcess(); } @@ -170,7 +169,7 @@ QVariant GxsIdRSTreeWidgetItem::data(int column, int role) const if(mId.isNull()) return RSTreeWidgetItem::data(column, role); - else if(rsReputations->isIdentityBanned(mId)) + else if(rsIdentity->isBanned(mId)) pix = QImage(BANNED_IMAGE) ; else if (mAvatar.mSize == 0 || !pix.loadFromData(mAvatar.mData, mAvatar.mSize, "PNG")) pix = GxsIdDetails::makeDefaultIcon(mId); diff --git a/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.cpp b/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.cpp index 6898ce228..f73aeef91 100644 --- a/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.cpp +++ b/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.cpp @@ -212,7 +212,7 @@ void CreateGxsForumMsg::loadFormInformation() //std::cerr << "CreateGxsForumMsg::loadMsgInformation() using signFlags=" << std::hex << mForumMeta.mSignFlags << std::dec << std::endl; - if(mForumMeta.mSignFlags & GXS_SERV::FLAG_AUTHOR_AUTHENTICATION_GPG) + if( (mForumMeta.mSignFlags & GXS_SERV::FLAG_AUTHOR_AUTHENTICATION_GPG) || (mForumMeta.mSignFlags & GXS_SERV::FLAG_AUTHOR_AUTHENTICATION_GPG_KNOWN)) ui.idChooser->setFlags(IDCHOOSER_ID_REQUIRED | IDCHOOSER_NON_ANONYMOUS) ; else ui.idChooser->setFlags(IDCHOOSER_ID_REQUIRED) ; diff --git a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp index 82ed1e6dd..4d6f69d5b 100644 --- a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp +++ b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp @@ -44,7 +44,6 @@ #include #include -#include #include // These should be in retroshare/ folder. #include "retroshare/rsgxsflags.h" @@ -791,7 +790,8 @@ void GxsForumThreadWidget::insertGroupData() tw->ui->forumName->setText(QString::fromUtf8(group.mMeta.mGroupName.c_str())); QString anti_spam_features1 ; - if(IS_GROUP_PGP_AUTHED(tw->mSignFlags)) anti_spam_features1 = tr("Anonymous IDs reputation threshold set to 0.4"); + if(IS_GROUP_PGP_KNOWN_AUTHED(tw->mSignFlags)) anti_spam_features1 = tr("Anonymous/unknown node IDs reputation threshold set to 0.4"); + else if(IS_GROUP_PGP_AUTHED(tw->mSignFlags)) anti_spam_features1 = tr("Anonymous IDs reputation threshold set to 0.4"); QString anti_spam_features2 ; if(IS_GROUP_MESSAGE_TRACKING(tw->mSignFlags)) anti_spam_features2 = tr("Message routing info kept for 10 days"); @@ -817,9 +817,20 @@ void GxsForumThreadWidget::insertGroupData() distrib_string = tr("Restricted to members of circle ")+QString::fromStdString(group.mMeta.mCircleId.toStdString()) ; } break ; - case GXS_CIRCLE_TYPE_YOUR_FRIENDS_ONLY: distrib_string = tr("Your eyes only"); - break ; - case GXS_CIRCLE_TYPE_LOCAL: distrib_string = tr("You and your friend nodes"); + case GXS_CIRCLE_TYPE_YOUR_FRIENDS_ONLY: + { + distrib_string = tr("Only friends nodes in group ") ; + + RsGroupInfo ginfo ; + rsPeers->getGroupInfo(RsNodeGroupId(group.mMeta.mInternalCircle),ginfo) ; + + QString desc; + GroupChooser::makeNodeGroupDesc(ginfo, desc); + distrib_string += desc ; + } + break ; + + case GXS_CIRCLE_TYPE_LOCAL: distrib_string = tr("Your eyes only"); // this is not yet supported. If you see this, it is a bug! break ; default: std::cerr << "(EE) badly initialised group distribution ID = " << group.mMeta.mCircleType << std::endl; @@ -985,7 +996,7 @@ QTreeWidgetItem *GxsForumThreadWidget::convertMsgToThreadWidget(const RsGxsForum // is flagged with a bad reputation - bool redacted = rsReputations->isIdentityBanned(msg.mMeta.mAuthorId) ; + bool redacted = rsIdentity->isBanned(msg.mMeta.mAuthorId) ; GxsIdRSTreeWidgetItem *item = new GxsIdRSTreeWidgetItem(mThreadCompareRole,GxsIdDetails::ICON_TYPE_ALL || (redacted?(GxsIdDetails::ICON_TYPE_REDACTED):0)); item->moveToThread(ui->threadTreeWidget->thread()); @@ -1408,7 +1419,7 @@ void GxsForumThreadWidget::insertMessageData(const RsGxsForumMsg &msg) return; } - bool redacted = rsReputations->isIdentityBanned(msg.mMeta.mAuthorId) ; + bool redacted = rsIdentity->isBanned(msg.mMeta.mAuthorId) ; mStateHelper->setActive(mTokenTypeMessageData, true); diff --git a/retroshare-gui/src/gui/msgs/MessageComposer.cpp b/retroshare-gui/src/gui/msgs/MessageComposer.cpp index 0a3bf70af..a190e9c3e 100644 --- a/retroshare-gui/src/gui/msgs/MessageComposer.cpp +++ b/retroshare-gui/src/gui/msgs/MessageComposer.cpp @@ -887,7 +887,7 @@ void MessageComposer::calculateTitle() setWindowTitle(tr("Compose") + ": " + misc::removeNewLine(ui.titleEdit->text())); } -static void calculateGroupsOfSslIds(const std::list &existingGroupInfos, std::list &checkSslIds, std::list &checkGroupIds) +static void calculateGroupsOfSslIds(const std::list &existingGroupInfos, std::list &checkSslIds, std::list &checkGroupIds) { checkGroupIds.clear(); @@ -1342,7 +1342,7 @@ bool MessageComposer::sendMessage_internal(bool bDraftbox) { case PEER_TYPE_GROUP: { RsGroupInfo groupInfo; - if (rsPeers->getGroupInfo(id, groupInfo) == false) { + if (rsPeers->getGroupInfo(RsNodeGroupId(id), groupInfo) == false) { // group not found continue; } @@ -1587,7 +1587,7 @@ void MessageComposer::setRecipientToRow(int row, enumType type, destinationType icon = QIcon(IMAGE_GROUP16); RsGroupInfo groupInfo; - if (rsPeers->getGroupInfo(id, groupInfo)) { + if (rsPeers->getGroupInfo(RsNodeGroupId(id), groupInfo)) { name = GroupDefs::name(groupInfo); } else { name = tr("Unknown"); @@ -1771,7 +1771,7 @@ void MessageComposer::editingRecipientFinished() QString groupName = GroupDefs::name(*groupIt); if (text.compare(groupName, Qt::CaseSensitive) == 0) { // found it - setRecipientToRow(row, type, PEER_TYPE_GROUP, groupIt->id); + setRecipientToRow(row, type, PEER_TYPE_GROUP, groupIt->id.toStdString()); return; } } diff --git a/retroshare-gui/src/retroshare-gui.pro b/retroshare-gui/src/retroshare-gui.pro index 69278042a..7a6c372a3 100644 --- a/retroshare-gui/src/retroshare-gui.pro +++ b/retroshare-gui/src/retroshare-gui.pro @@ -14,6 +14,13 @@ DEFINES += TARGET=\\\"$TARGET\\\" #CONFIG += debug #DEFINES *= SIGFPE_DEBUG +profiling { + QMAKE_CXXFLAGS -= -fomit-frame-pointer + QMAKE_CXXFLAGS *= -pg -g -fno-omit-frame-pointer + QMAKE_LFLAGS *= -pg +} + + #QMAKE_CFLAGS += -fmudflap #LIBS *= /usr/lib/gcc/x86_64-linux-gnu/4.4/libmudflap.a /usr/lib/gcc/x86_64-linux-gnu/4.4/libmudflapth.a @@ -69,7 +76,7 @@ linux-* { PKGCONFIG *= x11 xscrnsaver - LIBS *= -rdynamic + LIBS *= -rdynamic DEFINES *= HAVE_XSS # for idle time, libx screensaver extensions DEFINES *= HAS_GNOME_KEYRING } @@ -466,6 +473,7 @@ HEADERS += rshare.h \ gui/common/AvatarDefs.h \ gui/common/GroupFlagsWidget.h \ gui/common/GroupSelectionBox.h \ + gui/common/GroupChooser.h \ gui/common/StatusDefs.h \ gui/common/TagDefs.h \ gui/common/GroupDefs.h \ @@ -775,6 +783,7 @@ SOURCES += main.cpp \ gui/common/AvatarDialog.cpp \ gui/common/GroupFlagsWidget.cpp \ gui/common/GroupSelectionBox.cpp \ + gui/common/GroupChooser.cpp \ gui/common/StatusDefs.cpp \ gui/common/TagDefs.cpp \ gui/common/GroupDefs.cpp \