diff --git a/libretroshare/src/ft/ftcontroller.cc b/libretroshare/src/ft/ftcontroller.cc index 4f5b04fea..869a6d32b 100644 --- a/libretroshare/src/ft/ftcontroller.cc +++ b/libretroshare/src/ft/ftcontroller.cc @@ -2092,7 +2092,7 @@ bool ftController::saveList(bool &cleanup, std::list& saveData) // for(std::list::const_iterator it(lst.begin());it!=lst.end();++it) if(!mTurtle->isTurtlePeer(*it)) - rft->allPeerIds.ids.push_back((*it).toStdString()) ; + rft->allPeerIds.ids.push_back(*it) ; rft->transferred = fit->second->mCreator->getRecvd(); fit->second->mCreator->getAvailabilityMap(rft->compressed_chunk_map) ; @@ -2129,19 +2129,21 @@ bool ftController::saveList(bool &cleanup, std::list& saveData) rft->allPeerIds.ids.clear() ; for(std::list::const_iterator it(pit->mSrcIds.begin());it!=pit->mSrcIds.end();++it) - rft->allPeerIds.ids.push_back( (*it).toStdString() ) ; + rft->allPeerIds.ids.push_back( *it ) ; } // Remove turtle peers from sources, as they are not supposed to survive a reboot of RS, since they are dynamic sources. // Otherwize, such sources are unknown from the turtle router, at restart, and never get removed. We do that in post // process since the rft object may have been created from mPendingChunkMaps // - for(std::list::iterator sit(rft->allPeerIds.ids.begin());sit!=rft->allPeerIds.ids.end();) + for(std::list::iterator sit(rft->allPeerIds.ids.begin());sit!=rft->allPeerIds.ids.end();) if(mTurtle->isTurtlePeer(RsPeerId(*sit))) - { - std::list::iterator sittmp(sit) ; - sit = rft->allPeerIds.ids.erase(sit) ; - } + { + std::list::iterator sittmp(sit) ; + ++sittmp ; + rft->allPeerIds.ids.erase(sit) ; + sit = sittmp ; + } else ++sit ; @@ -2200,8 +2202,8 @@ bool ftController::loadList(std::list& load) std::cerr << "ftController::loadList(): requesting " << rsft->file.name << ", " << rsft->file.hash << ", " << rsft->file.filesize << std::endl ; #endif std::list src_lst ; - for(std::list::const_iterator it(rsft->allPeerIds.ids.begin());it!=rsft->allPeerIds.ids.end();++it) - src_lst.push_back(RsPeerId(*it)) ; + for(std::list::const_iterator it(rsft->allPeerIds.ids.begin());it!=rsft->allPeerIds.ids.end();++it) + src_lst.push_back(*it) ; FileRequest(rsft->file.name, rsft->file.hash, rsft->file.filesize, rsft->file.path, TransferRequestFlags(rsft->flags), src_lst, rsft->state); diff --git a/libretroshare/src/pqi/authgpg.cc b/libretroshare/src/pqi/authgpg.cc index 8838c6329..5597bcf66 100644 --- a/libretroshare/src/pqi/authgpg.cc +++ b/libretroshare/src/pqi/authgpg.cc @@ -381,7 +381,7 @@ std::string AuthGPG::getGPGEmail(const PGPIdType& id,bool *success) /**** GPG versions ***/ -PGPIdType AuthGPG::getGPGOwnId() +const PGPIdType& AuthGPG::getGPGOwnId() { RsStackMutex stack(gpgMtxData); /******* LOCKED ******/ return mOwnGpgId ; diff --git a/libretroshare/src/pqi/authgpg.h b/libretroshare/src/pqi/authgpg.h index effbb771b..46e945431 100644 --- a/libretroshare/src/pqi/authgpg.h +++ b/libretroshare/src/pqi/authgpg.h @@ -152,7 +152,7 @@ class AuthGPG: public p3Config, public RsThread, public PGPHandler virtual std::string getGPGEmail(const PGPIdType &pgp_id,bool *success = NULL); /* PGP web of trust management */ - virtual PGPIdType getGPGOwnId(); + virtual const PGPIdType& getGPGOwnId(); virtual std::string getGPGOwnName(); //virtual std::string getGPGOwnEmail(); diff --git a/libretroshare/src/retroshare/rsids.h b/libretroshare/src/retroshare/rsids.h index c66c9aadd..522f89d4b 100644 --- a/libretroshare/src/retroshare/rsids.h +++ b/libretroshare/src/retroshare/rsids.h @@ -92,7 +92,7 @@ template c inline std::string toStdString() const { return toStdString(UPPER_CASE) ; } inline uint32_t serial_size() const { return SIZE_IN_BYTES ; } - bool serialise(void *data,uint32_t pktsize,uint32_t& offset) + bool serialise(void *data,uint32_t pktsize,uint32_t& offset) const { if(offset + SIZE_IN_BYTES >= pktsize) return false ; diff --git a/libretroshare/src/serialiser/rspluginitems.cc b/libretroshare/src/serialiser/rspluginitems.cc index 97f951028..4e991f331 100644 --- a/libretroshare/src/serialiser/rspluginitems.cc +++ b/libretroshare/src/serialiser/rspluginitems.cc @@ -123,7 +123,7 @@ std::ostream& RsPluginHashSetItem::print(std::ostream& o, uint16_t) o << "Item type: RsPluginHashSetItem" << std::endl; o << " Hash list: " << std::endl; - for(std::list::const_iterator it(hashes.ids.begin());it!=hashes.ids.end();++it) + for(std::list::const_iterator it(hashes.ids.begin());it!=hashes.ids.end();++it) o << " " << *it << std::endl; return o ; diff --git a/libretroshare/src/serialiser/rstlvtypes.cc b/libretroshare/src/serialiser/rstlvtypes.cc index 0a3612a68..0c4ed3974 100644 --- a/libretroshare/src/serialiser/rstlvtypes.cc +++ b/libretroshare/src/serialiser/rstlvtypes.cc @@ -245,70 +245,6 @@ std::ostream &RsTlvBinaryData::print(std::ostream &out, uint16_t indent) /************************************* Peer Id Set ************************************/ -RsTlvPeerIdSet::RsTlvPeerIdSet(): RsTlvStringSet(TLV_TYPE_PEERSET) {} -RsTlvHashSet::RsTlvHashSet(): RsTlvStringSet(TLV_TYPE_HASHSET) {} -RsTlvPgpIdSet::RsTlvPgpIdSet(): RsTlvStringSet(TLV_TYPE_PGPIDSET) {} - - -RsTlvStringSet::RsTlvStringSet(uint16_t type) :mType(type) -{ -} - -void RsTlvStringSet::TlvClear() -{ - ids.clear(); - -} - -uint32_t RsTlvStringSet::TlvSize() -{ - - uint32_t s = TLV_HEADER_SIZE; /* header */ - - /* determine the total size of ids strings in list */ - - std::list::iterator it; - - for(it = ids.begin(); it != ids.end() ; ++it) - { - if (it->length() > 0) - s += GetTlvStringSize(*it); - } - - return s; -} - - -bool RsTlvStringSet::SetTlv(void *data, uint32_t size, uint32_t *offset) /* serialise */ -{ - /* must check sizes */ - uint32_t tlvsize = TlvSize(); - uint32_t tlvend = *offset + tlvsize; - - if (size < tlvend) - return false; /* not enough space */ - - bool ok = true; - - - /* start at data[offset] */ - ok &= SetTlvBase(data, tlvend, offset, mType , tlvsize); - - /* determine the total size of ids strings in list */ - - std::list::iterator it; - - for(it = ids.begin(); it != ids.end() ; ++it) - { - if (it->length() > 0) - ok &= SetTlvString(data, tlvend, offset, TLV_TYPE_STR_GENID, *it); - } - - return ok; - -} - - bool RsTlvStringSet::GetTlv(void *data, uint32_t size, uint32_t *offset) /* serialise */ { if (size < *offset + TLV_HEADER_SIZE) diff --git a/libretroshare/src/serialiser/rstlvtypes.h b/libretroshare/src/serialiser/rstlvtypes.h index b15e08321..0a8fe2f73 100644 --- a/libretroshare/src/serialiser/rstlvtypes.h +++ b/libretroshare/src/serialiser/rstlvtypes.h @@ -37,6 +37,10 @@ #include #include +#include +#include +#include +#include //! A base class for all tlv items @@ -112,23 +116,82 @@ virtual std::ostream &printHex(std::ostream &out, uint16_t indent); /* SPECIAL O std::list ids; /* Mandatory */ }; -class RsTlvPeerIdSet: public RsTlvStringSet +template class t_RsTlvIdSet: public RsTlvItem { - public: - RsTlvPeerIdSet(); + public: + t_RsTlvIdSet() {} + virtual ~t_RsTlvIdSet() {} + + virtual uint32_t TlvSize() { return ID_CLASS::SIZE_IN_BYTES * ids.size() + TLV_HEADER_SIZE; } + virtual void TlvClear(){ ids.clear() ; } + virtual bool SetTlv(void *data, uint32_t size, uint32_t *offset) /* serialise */ + { /* must check sizes */ + uint32_t tlvsize = TlvSize(); + uint32_t tlvend = *offset + tlvsize; + + if (size < tlvend) + return false; /* not enough space */ + + bool ok = true; + + /* start at data[offset] */ + ok = ok && SetTlvBase(data, tlvend, offset, TLV_TYPE, tlvsize); + + for(typename std::list::const_iterator it(ids.begin());it!=ids.end();++it) + ok = ok && (*it).serialise(data,size,*offset) ; + + return ok ; + } + virtual bool GetTlv(void *data, uint32_t size, uint32_t *offset) /* deserialise */ + { + if (size < *offset + TLV_HEADER_SIZE) + return false; + + uint16_t tlvtype = GetTlvType( &(((uint8_t *) data)[*offset]) ); + uint32_t tlvsize = GetTlvSize( &(((uint8_t *) data)[*offset]) ); + uint32_t tlvend = *offset + tlvsize; + + if (size < tlvend) /* check size */ + return false; /* not enough space */ + + if (tlvtype != TLV_TYPE) /* check type */ + return false; + + bool ok = true; + + /* ready to load */ + TlvClear(); + + /* skip the header */ + (*offset) += TLV_HEADER_SIZE; + + while(*offset + ID_CLASS::SIZE_IN_BYTES < tlvend) + { + ID_CLASS id ; + ok = ok && id.deserialise(data,size,*offset) ; + ids.push_back(id) ; + } + if(*offset != tlvsize) + std::cerr << "(EE) deserialisaiton error in " << __PRETTY_FUNCTION__ << std::endl; + return *offset == tlvsize ; + } + virtual std::ostream &print(std::ostream &out, uint16_t indent) + { + std::cerr << __PRETTY_FUNCTION__ << ": not implemented" << std::endl; + return out ; + } + virtual std::ostream &printHex(std::ostream &out, uint16_t indent) /* SPECIAL One */ + { + std::cerr << __PRETTY_FUNCTION__ << ": not implemented" << std::endl; + return out ; + } + + std::list ids ; }; -class RsTlvHashSet: public RsTlvStringSet -{ - public: - RsTlvHashSet(); -}; - -class RsTlvPgpIdSet: public RsTlvStringSet -{ - public: - RsTlvPgpIdSet(); -}; +typedef t_RsTlvIdSet RsTlvPeerIdSet ; +typedef t_RsTlvIdSet RsTlvPgpIdSet ; +typedef t_RsTlvIdSet RsTlvHashSet ; class RsTlvServiceIdSet: public RsTlvItem { diff --git a/libretroshare/src/services/p3msgservice.cc b/libretroshare/src/services/p3msgservice.cc index 2327d7747..eac572fbe 100644 --- a/libretroshare/src/services/p3msgservice.cc +++ b/libretroshare/src/services/p3msgservice.cc @@ -167,9 +167,9 @@ void p3MsgService::processMsg(RsMsgItem *mi, bool incoming) if (notify) { if(mi->msgFlags & RS_MSG_FLAGS_ENCRYPTED) - notify->AddPopupMessage(RS_POPUP_ENCRYPTED_MSG, mi->PeerId(), mi->subject, mi->message); + notify->AddPopupMessage(RS_POPUP_ENCRYPTED_MSG, mi->PeerId().toStdString(), mi->subject, mi->message); else - notify->AddPopupMessage(RS_POPUP_MSG, mi->PeerId(), mi->subject, mi->message); + notify->AddPopupMessage(RS_POPUP_MSG, mi->PeerId().toStdString(), mi->subject, mi->message); std::string out; rs_sprintf(out, "%lu", mi->msgId); @@ -197,7 +197,7 @@ bool p3MsgService::checkAndRebuildPartialMessage(RsMsgItem *ci) { // Check is the item is ending an incomplete item. // - std::map::iterator it = _pendingPartialMessages.find(ci->PeerId()) ; + std::map::iterator it = _pendingPartialMessages.find(ci->PeerId()) ; bool ci_is_partial = ci->msgFlags & RS_MSG_FLAGS_PARTIAL ; @@ -320,7 +320,7 @@ int p3MsgService::checkOutgoingMessages() std::list output_queue ; { - const std::string ownId = mLinkMgr->getOwnId(); + const RsPeerId& ownId = mLinkMgr->getOwnId(); std::list::iterator it; std::list toErase; @@ -334,7 +334,7 @@ int p3MsgService::checkOutgoingMessages() } /* find the certificate */ - std::string pid = mit->second->PeerId(); + RsPeerId pid = mit->second->PeerId(); bool tunnel_is_ok = false ; if(mit->second->msgFlags & RS_MSG_FLAGS_DISTANT) @@ -344,7 +344,7 @@ int p3MsgService::checkOutgoingMessages() #ifdef GROUTER tunnel_is_ok = true ; #else - const std::string& hash = mit->second->PeerId() ; + const RsPeerId& hash = mit->second->PeerId() ; std::map::iterator it = _messenging_contacts.find(hash) ; if(it != _messenging_contacts.end()) @@ -517,7 +517,7 @@ static void getStandardTagTypes(MsgTagType &tags) void p3MsgService::initStandardTagTypes() { bool bChanged = false; - std::string ownId = mLinkMgr->getOwnId(); + const RsPeerId& ownId = mLinkMgr->getOwnId(); MsgTagType tags; getStandardTagTypes(tags); @@ -527,7 +527,7 @@ void p3MsgService::initStandardTagTypes() std::map::iterator mit = mTags.find(tit->first); if (mit == mTags.end()) { RsMsgTagType* tagType = new RsMsgTagType(); - tagType->PeerId (ownId); + tagType->PeerId (ownId); tagType->tagId = tit->first; tagType->text = tit->second.first; tagType->rgb_color = tit->second.second; @@ -555,8 +555,8 @@ bool p3MsgService::loadList(std::list& load) std::list items; std::list::iterator it; std::map::iterator tagIt; - std::map srcIdMsgMap; - std::map::iterator srcIt; + std::map srcIdMsgMap; + std::map::iterator srcIt; bool distant_messaging_set = false ; @@ -593,7 +593,7 @@ bool p3MsgService::loadList(std::list& load) } else if(NULL != (msi = dynamic_cast(*it))) { - srcIdMsgMap.insert(std::pair(msi->msgId, msi->srcId)); + srcIdMsgMap.insert(std::pair(msi->msgId, msi->srcId)); mSrcIds.insert(std::pair(msi->msgId, msi)); // does not need to be kept } else if(NULL != (msp = dynamic_cast(*it))) @@ -1049,7 +1049,7 @@ int p3MsgService::sendMessage(RsMsgItem *item) bool p3MsgService::MessageSend(MessageInfo &info) { - std::list::const_iterator pit; + std::list::const_iterator pit; for(pit = info.msgto.begin(); pit != info.msgto.end(); pit++) { @@ -1082,7 +1082,7 @@ bool p3MsgService::MessageSend(MessageInfo &info) RsMsgItem *msg = initMIRsMsg(info, mLinkMgr->getOwnId()); if (msg) { - std::list::iterator it ; + std::list::iterator it ; // Update destination ids in place of distant message hash, since this Outgoing message is for display // @@ -1113,7 +1113,7 @@ bool p3MsgService::SystemMessage(const std::string &title, const std::string &me return false; } - std::string ownId = mLinkMgr->getOwnId(); + const RsPeerId& ownId = mLinkMgr->getOwnId(); RsMsgItem *msg = new RsMsgItem(); @@ -1580,10 +1580,10 @@ void p3MsgService::initRsMI(RsMsgItem *msg, MessageInfo &mi) rs_sprintf(mi.msgId, "%lu", msg->msgId); } - std::list::iterator pit; + std::list::iterator pit; for(pit = msg->msgto.ids.begin(); - pit != msg->msgto.ids.end(); pit++) + pit != msg->msgto.ids.end(); pit++) { mi.msgto.push_back(*pit); } @@ -1704,7 +1704,7 @@ void p3MsgService::initRsMIS(RsMsgItem *msg, MsgInfoSummary &mis) mis.ts = msg->sendTime; } -RsMsgItem *p3MsgService::initMIRsMsg(MessageInfo &info, const std::string &to) +RsMsgItem *p3MsgService::initMIRsMsg(MessageInfo &info, const RsPeerId &to) { RsMsgItem *msg = new RsMsgItem(); @@ -1719,7 +1719,7 @@ RsMsgItem *p3MsgService::initMIRsMsg(MessageInfo &info, const std::string &to) msg -> message = info.msg; - std::list::iterator pit; + std::list::iterator pit; for(pit = info.msgto.begin(); pit != info.msgto.end(); pit++) { msg -> msgto.ids.push_back(*pit); @@ -2028,7 +2028,7 @@ bool p3MsgService::decryptMessage(const std::string& mId) item->print(std::cerr,0) ; #endif std::string own_hash ; - std::string own_pgp_id = AuthGPG::getAuthGPG()->getGPGOwnId(); + const PGPIdType& own_pgp_id = AuthGPG::getAuthGPG()->getGPGOwnId(); getDistantMessageHash(own_pgp_id,own_hash) ; { @@ -2043,9 +2043,9 @@ bool p3MsgService::decryptMessage(const std::string& mId) msgi.msgFlags |= RS_MSG_FLAGS_DECRYPTED ; // previousy encrypted msg is now decrypted msgi.PeerId(senders_id.toStdString()) ; - for(std::list::iterator it(msgi.msgto.ids.begin());it!=msgi.msgto.ids.end();++it) if(*it == own_hash) *it = own_pgp_id ; - for(std::list::iterator it(msgi.msgcc.ids.begin());it!=msgi.msgcc.ids.end();++it) if(*it == own_hash) *it = own_pgp_id ; - for(std::list::iterator it(msgi.msgbcc.ids.begin());it!=msgi.msgbcc.ids.end();++it) if(*it == own_hash) *it = own_pgp_id ; + for(std::list::iterator it(msgi.msgto.ids.begin());it!=msgi.msgto.ids.end();++it) if(*it == own_hash) *it = own_pgp_id ; + for(std::list::iterator it(msgi.msgcc.ids.begin());it!=msgi.msgcc.ids.end();++it) if(*it == own_hash) *it = own_pgp_id ; + for(std::list::iterator it(msgi.msgbcc.ids.begin());it!=msgi.msgbcc.ids.end();++it) if(*it == own_hash) *it = own_pgp_id ; if(signature_present) { @@ -2065,14 +2065,14 @@ bool p3MsgService::decryptMessage(const std::string& mId) RsMsgSrcId* msi = new RsMsgSrcId(); msi->msgId = msgi.msgId; - msi->srcId = senders_id.toStdString() ; + msi->srcId = senders_id ; mSrcIds.insert(std::pair(msi->msgId, msi)); } else { - std::cerr << "Substituting source name for message id " << msgi.msgId << ": " << it->second->srcId << " -> " << senders_id.toStdString() << std::endl; - it->second->srcId = senders_id.toStdString() ; + std::cerr << "Substituting source name for message id " << msgi.msgId << ": " << it->second->srcId << " -> " << senders_id << std::endl; + it->second->srcId = senders_id ; } } delete item ; @@ -2101,7 +2101,7 @@ bool p3MsgService::createDistantOfflineMessengingInvite(time_t time_of_validity, unsigned char hash_bytes[DISTANT_MSG_HASH_SIZE] ; RSRandom::random_bytes( hash_bytes, DISTANT_MSG_HASH_SIZE) ; - hash = Sha1CheckSum(hash_bytes).toStdString(false) ; + hash = Sha1CheckSum(hash_bytes).toStdString() ; DistantMessengingInvite invite ; invite.time_of_validity = time_of_validity + time(NULL); @@ -2198,7 +2198,7 @@ bool p3MsgService::distantMessagingEnabled() } return res ; } -bool p3MsgService::getDistantMessageHash(const std::string& pgp_id,std::string& hash) +bool p3MsgService::getDistantMessageHash(const PGPIdType& pgp_id,Sha1CheckSum& hash) { if(pgp_id.length() != 16) { @@ -2233,11 +2233,11 @@ bool p3MsgService::getDistantOfflineMessengingInvites(std::vector::const_iterator it = _messenging_invites.find(hash) ; + std::map::const_iterator it = _messenging_invites.find(hash) ; #ifdef DEBUG_DISTANT_MSG if(it != _messenging_invites.end()) @@ -2383,7 +2383,7 @@ void p3MsgService::sendTurtleData(const std::string& hash,RsMsgItem *msgitem) // do we have a working tunnel for that hash ? // If not, put on the contact's waiting list. - std::string virtual_peer_id ; + RsPeerId virtual_peer_id ; { RsStackMutex stack(mMsgMtx); /********** STACK LOCKED MTX ******/ std::map::const_iterator it = _messenging_contacts.find(hash) ; diff --git a/libretroshare/src/services/p3msgservice.h b/libretroshare/src/services/p3msgservice.h index e0e902a14..82e7ff199 100644 --- a/libretroshare/src/services/p3msgservice.h +++ b/libretroshare/src/services/p3msgservice.h @@ -132,25 +132,25 @@ int checkOutgoingMessages(); void enableDistantMessaging(bool b) ; bool distantMessagingEnabled() ; - bool getDistantMessageHash(const PGPIdType& pgp_id,std::string& hash) ; + bool getDistantMessageHash(const PGPIdType& pgp_id,Sha1CheckSum &hash) ; void sendPrivateMsgItem(RsMsgItem *) ; private: // This maps contains the current invitations to respond to. - // + // The map is indexed by the hash std::map _messenging_invites ; // This contains the ongoing tunnel handling contacts. - // - std::map _messenging_contacts ; + // The map is indexed by the hash + std::map _messenging_contacts ; // Overloaded from RsTurtleClientService #ifdef GROUTER virtual void receiveGRouterData(RsGRouterGenericDataItem *item, const GRouterKeyId& key) ; #endif - virtual bool handleTunnelRequest(const std::string& hash,const RsPeerId& peer_id) ; + virtual bool handleTunnelRequest(const Sha1CheckSum& hash,const RsPeerId& peer_id) ; virtual void receiveTurtleData(RsTurtleGenericTunnelItem *item,const std::string& hash,const RsPeerId& virtual_peer_id,RsTurtleGenericTunnelItem::Direction direction) ; void addVirtualPeer(const TurtleFileHash&, const TurtleVirtualPeerId&,RsTurtleGenericTunnelItem::Direction dir) ; void removeVirtualPeer(const TurtleFileHash&, const TurtleVirtualPeerId&) ; @@ -197,7 +197,7 @@ void initStandardTagTypes(); /* ones that haven't made it out yet! */ std::map msgOutgoing; - std::map _pendingPartialMessages ; + std::map _pendingPartialMessages ; /* maps for tags types and msg tags */