From 67cf8baf77f151d5057b9f0bb00aa18cd867cd78 Mon Sep 17 00:00:00 2001 From: csoler Date: Wed, 3 Feb 2021 22:36:24 +0100 Subject: [PATCH 01/10] added early check of ExtAddrFinder and notify about its results --- libretroshare/src/pqi/p3netmgr.cc | 40 ++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/libretroshare/src/pqi/p3netmgr.cc b/libretroshare/src/pqi/p3netmgr.cc index c2ea41351..f9caad6ee 100644 --- a/libretroshare/src/pqi/p3netmgr.cc +++ b/libretroshare/src/pqi/p3netmgr.cc @@ -464,7 +464,31 @@ void p3NetMgrIMPL::netStatusTick() netStatus = mNetStatus; age = time(NULL) - mNetInitTS; - } + } + + if(netStatus <= RS_NET_UPNP_SETUP && mUseExtAddrFinder) + { + sockaddr_storage tmpip; + + if(mExtAddrFinder->hasValidIP(tmpip) && sockaddr_storage_ipv6_to_ipv4(tmpip)) + { +#if defined(NETMGR_DEBUG_TICK) || defined(NETMGR_DEBUG_RESET) + std::cerr << "p3NetMgrIMPL::netExtCheck() Ext supplied by ExtAddrFinder" << std::endl; +#endif + sockaddr_storage_setport(tmpip, guessNewExtPort()); + +#if defined(NETMGR_DEBUG_TICK) || defined(NETMGR_DEBUG_RESET) + std::cerr << "p3NetMgrIMPL::netExtCheck() "; + std::cerr << "ExtAddr: " << sockaddr_storage_tostring(tmpip); + std::cerr << std::endl; +#endif + /* XXX HACK TO FIX drbob: ALLOWING + * ExtAddrFinder -> ExtAddrStableOk = true + * (which it is not normally) */ + + setExtAddress(tmpip); + } + } switch(netStatus) { @@ -514,14 +538,18 @@ void p3NetMgrIMPL::netStatusTick() break; - case RS_NET_EXT_SETUP: + case RS_NET_EXT_SETUP: #if defined(NETMGR_DEBUG_TICK) || defined(NETMGR_DEBUG_RESET) - std::cerr << "p3NetMgrIMPL::netTick() STATUS: EXT_SETUP" << std::endl; + std::cerr << "p3NetMgrIMPL::netTick() STATUS: EXT_SETUP" << std::endl; #endif - netExtCheck(); - break; + // This could take a lot of time on some systems to get there: + // (e.g. 10 mins to get passed upnp on windows), so it would be better to call it right away, so other external address finding + // systems still have a chance to run early. - case RS_NET_DONE: + netExtCheck(); + break; + + case RS_NET_DONE: #ifdef NETMGR_DEBUG_TICK std::cerr << "p3NetMgrIMPL::netTick() STATUS: DONE" << std::endl; #endif From d87de5121a92b405bf73e321ced96dc5b5bd8c29 Mon Sep 17 00:00:00 2001 From: csoler Date: Wed, 3 Feb 2021 23:35:23 +0100 Subject: [PATCH 02/10] small fix to make setLocalAddress() and setExtAddress() also call mPeerMgr-UpdateOwnAddresses() --- libretroshare/src/pqi/p3netmgr.cc | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/libretroshare/src/pqi/p3netmgr.cc b/libretroshare/src/pqi/p3netmgr.cc index f9caad6ee..3ffa8a1fe 100644 --- a/libretroshare/src/pqi/p3netmgr.cc +++ b/libretroshare/src/pqi/p3netmgr.cc @@ -482,10 +482,6 @@ void p3NetMgrIMPL::netStatusTick() std::cerr << "ExtAddr: " << sockaddr_storage_tostring(tmpip); std::cerr << std::endl; #endif - /* XXX HACK TO FIX drbob: ALLOWING - * ExtAddrFinder -> ExtAddrStableOk = true - * (which it is not normally) */ - setExtAddress(tmpip); } } @@ -1152,7 +1148,8 @@ bool p3NetMgrIMPL::setLocalAddress(const struct sockaddr_storage &addr) } mLocalAddr = addr; - } + mPeerMgr->UpdateOwnAddress(mLocalAddr, mExtAddr); + } if (changed) { @@ -1188,7 +1185,8 @@ bool p3NetMgrIMPL::setExtAddress(const struct sockaddr_storage &addr) } mExtAddr = addr; - } + mPeerMgr->UpdateOwnAddress(mLocalAddr, mExtAddr); + } if (changed) { From 6c83b5cd27afc43ace7f212a645b6d2ae9efc39d Mon Sep 17 00:00:00 2001 From: csoler Date: Thu, 4 Feb 2021 16:12:18 +0100 Subject: [PATCH 03/10] added double check in ext IP hack to avoid re-calling UpdateOwnAdress() --- libretroshare/src/pqi/p3netmgr.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libretroshare/src/pqi/p3netmgr.cc b/libretroshare/src/pqi/p3netmgr.cc index 3ffa8a1fe..cfc18bbd2 100644 --- a/libretroshare/src/pqi/p3netmgr.cc +++ b/libretroshare/src/pqi/p3netmgr.cc @@ -469,13 +469,13 @@ void p3NetMgrIMPL::netStatusTick() if(netStatus <= RS_NET_UPNP_SETUP && mUseExtAddrFinder) { sockaddr_storage tmpip; + sockaddr_storage_setport(tmpip, guessNewExtPort()); - if(mExtAddrFinder->hasValidIP(tmpip) && sockaddr_storage_ipv6_to_ipv4(tmpip)) + if(mExtAddrFinder->hasValidIP(tmpip) && sockaddr_storage_ipv6_to_ipv4(tmpip) && !sockaddr_storage_same(tmpip,mExtAddr)) { #if defined(NETMGR_DEBUG_TICK) || defined(NETMGR_DEBUG_RESET) std::cerr << "p3NetMgrIMPL::netExtCheck() Ext supplied by ExtAddrFinder" << std::endl; #endif - sockaddr_storage_setport(tmpip, guessNewExtPort()); #if defined(NETMGR_DEBUG_TICK) || defined(NETMGR_DEBUG_RESET) std::cerr << "p3NetMgrIMPL::netExtCheck() "; From 251d022ae1ed199f41c4ef31668f473df590d186 Mon Sep 17 00:00:00 2001 From: csoler Date: Thu, 4 Feb 2021 22:22:21 +0100 Subject: [PATCH 04/10] attempt to fix error in setting external port when guessing external IP --- libretroshare/src/pqi/p3netmgr.cc | 85 ++++++++++++++----------- libretroshare/src/util/extaddrfinder.cc | 2 +- 2 files changed, 49 insertions(+), 38 deletions(-) diff --git a/libretroshare/src/pqi/p3netmgr.cc b/libretroshare/src/pqi/p3netmgr.cc index cfc18bbd2..32b413e7b 100644 --- a/libretroshare/src/pqi/p3netmgr.cc +++ b/libretroshare/src/pqi/p3netmgr.cc @@ -379,8 +379,10 @@ void p3NetMgrIMPL::netStartup() break; case RS_NET_MODE_TRY_LOOPBACK: - std::cerr << "p3NetMgrIMPL::netStartup() TRY_LOOPBACK mode"; +#ifdef NETMGR_DEBUG_RESET + std::cerr << "p3NetMgrIMPL::netStartup() TRY_LOOPBACK mode"; std::cerr << std::endl; +#endif mNetMode |= RS_NET_MODE_HIDDEN; mNetStatus = RS_NET_LOOPBACK; break; @@ -468,8 +470,10 @@ void p3NetMgrIMPL::netStatusTick() if(netStatus <= RS_NET_UPNP_SETUP && mUseExtAddrFinder) { - sockaddr_storage tmpip; - sockaddr_storage_setport(tmpip, guessNewExtPort()); + sockaddr_storage tmpip = mLocalAddr; // copies local port and correctly inits the IP family +#if defined(NETMGR_DEBUG_TICK) || defined(NETMGR_DEBUG_RESET) + std::cerr << "Asking ExtAddrFinder for IP. Initializing port with " << sockaddr_storage_port(tmpip) << std::endl; +#endif if(mExtAddrFinder->hasValidIP(tmpip) && sockaddr_storage_ipv6_to_ipv4(tmpip) && !sockaddr_storage_same(tmpip,mExtAddr)) { @@ -743,7 +747,10 @@ void p3NetMgrIMPL::netExtCheck() #if defined(NETMGR_DEBUG_TICK) || defined(NETMGR_DEBUG_RESET) std::cerr << "p3NetMgrIMPL::netExtCheck() checking ExtAddrFinder" << std::endl; #endif - bool extFinderOk = mExtAddrFinder->hasValidIP(tmpip); + sockaddr_storage tmpip = mLocalAddr; // copies local port and correctly inits the IP family + + bool extFinderOk = mExtAddrFinder->hasValidIP(tmpip); + if (extFinderOk && sockaddr_storage_ipv6_to_ipv4(tmpip)) { #if defined(NETMGR_DEBUG_TICK) || defined(NETMGR_DEBUG_RESET) @@ -783,11 +790,10 @@ void p3NetMgrIMPL::netExtCheck() uint8_t isstable; // unused sockaddr_storage tmpaddr; - if ( mPeerMgr->getExtAddressReportedByFriends(tmpaddr, isstable) && - sockaddr_storage_ipv6_to_ipv4(tmpaddr) ) + if ( mPeerMgr->getExtAddressReportedByFriends(tmpaddr, isstable) && sockaddr_storage_ipv6_to_ipv4(tmpaddr) ) { #if defined(NETMGR_DEBUG_TICK) || defined(NETMGR_DEBUG_RESET) - std::cerr << "p3NetMgrIMPL::netExtCheck() Ext supplied by ExtAddrFinder" << std::endl; + std::cerr << "p3NetMgrIMPL::netExtCheck() Ext supplied by friends" << std::endl; #endif sockaddr_storage_setport(tmpaddr, guessNewExtPort()); @@ -988,7 +994,7 @@ void p3NetMgrIMPL::netExtCheck() bool p3NetMgrIMPL::checkNetAddress() { bool addrChanged = false; - bool validAddr = false; + bool validAddr = false; sockaddr_storage prefAddr; sockaddr_storage oldAddr; @@ -1087,25 +1093,27 @@ bool p3NetMgrIMPL::checkNetAddress() /* Using same port as external may make some NAT happier */ uint16_t port = sockaddr_storage_port(mExtAddr); - /* Avoid to automatically set a local port to a reserved one < 1024 + /* Avoid to automatically set a local port to a reserved one < 1024 * that needs special permissions or root access. * This do not impede the user to set a reserved port manually, * which make sense in some cases. */ - while (port < 1025) + + std::cerr << __PRETTY_FUNCTION__ << " local port is 0. Ext port is " << port ; + + while (port < 1025) port = static_cast(RsRandom::random_u32()); - sockaddr_storage_setport(mLocalAddr, htons(port)); - addrChanged = true; + std::cerr << " new ext port is " << port << ": using these for local/ext ports" << std::endl; - RsWarn() << __PRETTY_FUNCTION__ << " local port was 0, corrected " - <<"to: " << port << std::endl; + sockaddr_storage_setport(mLocalAddr, port); + sockaddr_storage_setport(mExtAddr, port); // this accounts for when the port was updated + addrChanged = true; } } // RS_STACK_MUTEX(mNetMtx); - if (addrChanged) - { - RsInfo() << __PRETTY_FUNCTION__ << " local address changed, resetting" - <<" network." << std::endl; + if (addrChanged) + { + RsInfo() << __PRETTY_FUNCTION__ << " local address changed, resetting network." << std::endl; if(rsEvents) { @@ -1115,10 +1123,10 @@ bool p3NetMgrIMPL::checkNetAddress() rsEvents->postEvent(ev); } - if (mPeerMgr) mPeerMgr->UpdateOwnAddress(mLocalAddr, mExtAddr); + if (mPeerMgr) mPeerMgr->UpdateOwnAddress(mLocalAddr, mExtAddr); - netReset(); - } + netReset(); + } return true; } @@ -1771,19 +1779,19 @@ void p3NetMgrIMPL::updateNetStateBox_temporal() { RsStackMutex stack(mNetMtx); /****** STACK LOCK MUTEX *******/ - uint32_t netstate = mNetStateBox.getNetStateMode(); - uint32_t netMode = mNetStateBox.getNetworkMode(); - uint32_t natType = mNetStateBox.getNatTypeMode(); - uint32_t natHole = mNetStateBox.getNatHoleMode(); - uint32_t connect = mNetStateBox.getConnectModes(); + auto netstate = mNetStateBox.getNetStateMode(); + auto netMode = mNetStateBox.getNetworkMode(); + auto natType = mNetStateBox.getNatTypeMode(); + auto natHole = mNetStateBox.getNatHoleMode(); + auto connect = mNetStateBox.getConnectModes(); +#ifdef SUSPENDED + auto netstatestr = NetStateNetStateString(netstate); + auto connectstr = NetStateConnectModesString(connect); + auto natholestr = NetStateNatHoleString(natHole); + auto nattypestr = NetStateNatTypeString(natType); + auto netmodestr = NetStateNetworkModeString(netMode); - std::string netstatestr = NetStateNetStateString(netstate); - std::string connectstr = NetStateConnectModesString(connect); - std::string natholestr = NetStateNatHoleString(natHole); - std::string nattypestr = NetStateNatTypeString(natType); - std::string netmodestr = NetStateNetworkModeString(netMode); - - std::cerr << "p3NetMgrIMPL::updateNetStateBox_temporal() NetStateBox Thinking"; + std::cerr << "p3NetMgrIMPL::updateNetStateBox_temporal() NetStateBox Thinking"; std::cerr << std::endl; std::cerr << "\tNetState: " << netstatestr; std::cerr << std::endl; @@ -1794,7 +1802,8 @@ void p3NetMgrIMPL::updateNetStateBox_temporal() std::cerr << "\tNatHole: " << natholestr; std::cerr << std::endl; std::cerr << "\tNatType: " << nattypestr; - std::cerr << std::endl; + std::cerr << std::endl; +#endif } #endif @@ -1826,8 +1835,8 @@ void p3NetMgrIMPL::updateNatSetting() #ifdef NETMGR_DEBUG_STATEBOX std::cerr << "p3NetMgrIMPL::updateNetStateBox_temporal() NatType Change!"; - std::cerr << "\tNatType: " << NetStateNatTypeString(natType); - std::cerr << "\tNatHole: " << NetStateNatHoleString(natHole); +// std::cerr << "\tNatType: " << NetStateNatTypeString(natType); +// std::cerr << "\tNatHole: "k << NetStateNatHoleString(natHole); std::cerr << std::endl; #endif @@ -1964,7 +1973,9 @@ void p3NetMgrIMPL::updateNetStateBox_startup() /* ExtAddrFinder */ if (mUseExtAddrFinder) { - bool extFinderOk = mExtAddrFinder->hasValidIP(tmpip); + tmpip = mLocalAddr; + bool extFinderOk = mExtAddrFinder->hasValidIP(tmpip); + if (extFinderOk) { sockaddr_storage_setport(tmpip, guessNewExtPort()); diff --git a/libretroshare/src/util/extaddrfinder.cc b/libretroshare/src/util/extaddrfinder.cc index 315d4f650..b214dc779 100644 --- a/libretroshare/src/util/extaddrfinder.cc +++ b/libretroshare/src/util/extaddrfinder.cc @@ -250,7 +250,7 @@ bool ExtAddrFinder::hasValidIP(struct sockaddr_storage &addr) #ifdef EXTADDRSEARCH_DEBUG std::cerr << "ExtAddrFinder: Has stored ip: responding with this ip." << std::endl ; #endif - addr = mAddr; + sockaddr_storage_copyip(addr,mAddr); // just copy the IP so we dont erase the port. } } rstime_t delta; From 37dc37ce4a5ee5536bc5709959b54d8029fa3e4d Mon Sep 17 00:00:00 2001 From: csoler Date: Fri, 5 Feb 2021 23:25:55 +0100 Subject: [PATCH 05/10] fixed parsing and exporting of local+ext IPs in short invites (not compatible with IPv6) --- libretroshare/src/rsserver/p3peers.cc | 97 +++++++++++++++---- .../src/gui/connect/ConnectFriendWizard.cpp | 15 +-- 2 files changed, 85 insertions(+), 27 deletions(-) diff --git a/libretroshare/src/rsserver/p3peers.cc b/libretroshare/src/rsserver/p3peers.cc index 22d9a2ae6..7223eec90 100644 --- a/libretroshare/src/rsserver/p3peers.cc +++ b/libretroshare/src/rsserver/p3peers.cc @@ -1165,7 +1165,8 @@ enum class RsShortInviteFieldType : uint8_t * trasport layer will be implemented */ HIDDEN_LOCATOR = 0x90, DNS_LOCATOR = 0x91, - EXT4_LOCATOR = 0x92 + EXT4_LOCATOR = 0x92, // external IPv4 address + LOC4_LOCATOR = 0x93 // local IPv4 address }; static void addPacketHeader(RsShortInviteFieldType ptag, size_t size, unsigned char *& buf, uint32_t& offset, uint32_t& buf_size) @@ -1213,7 +1214,7 @@ bool p3Peers::getShortInvite(std::string& invite, const RsPeerId& _sslId, Retros offset += tDetails.name.size(); /* If it is a hidden node, always use hidden address and port as locator */ - sockaddr_storage tExt; + if(tDetails.isHiddenNode) { addPacketHeader(RsShortInviteFieldType::HIDDEN_LOCATOR,4 + 2 + tDetails.hiddenNodeAddress.size(),buf,offset,buf_size); @@ -1243,24 +1244,6 @@ bool p3Peers::getShortInvite(std::string& invite, const RsPeerId& _sslId, Retros offset += 2 + tDetails.dyndns.size(); } - if( !!(invite_flags & RetroshareInviteFlags::CURRENT_IP) && sockaddr_storage_inet_pton(tExt, tDetails.extAddr) - && sockaddr_storage_isValidNet(tExt) && sockaddr_storage_ipv6_to_ipv4(tExt) && tDetails.extPort ) - { - uint32_t t4Addr = reinterpret_cast(tExt).sin_addr.s_addr; - - addPacketHeader(RsShortInviteFieldType::EXT4_LOCATOR, 4 + 2,buf,offset,buf_size); - - buf[offset+0] = (uint8_t)((t4Addr >> 24) & 0xff); - buf[offset+1] = (uint8_t)((t4Addr >> 16) & 0xff); - buf[offset+2] = (uint8_t)((t4Addr >> 8) & 0xff); - buf[offset+3] = (uint8_t)((t4Addr ) & 0xff); - - buf[offset+4] = (uint8_t)((tDetails.extPort >> 8) & 0xff); - buf[offset+5] = (uint8_t)((tDetails.extPort ) & 0xff); - - offset += 4+2; - } - if( !!(invite_flags & RetroshareInviteFlags::FULL_IP_HISTORY) && (!tDetails.ipAddressList.empty())) for(auto& s: tDetails.ipAddressList) { @@ -1272,6 +1255,69 @@ bool p3Peers::getShortInvite(std::string& invite, const RsPeerId& _sslId, Retros offset += tLocator.size(); } + else if( !!(invite_flags & RetroshareInviteFlags::CURRENT_IP) ) // only add at least the local and external IPs + { +#ifdef USE_NEW_LOCATOR_SYSTEM + // This new locator system as some advantages, but here it also has major drawbacks: (1) it cannot differentiate local and external addresses, + // and (2) it's quite larger than the old system, which tends to make certificates more than 1 line long. + + sockaddr_storage tLocal; + + if(sockaddr_storage_inet_pton(tLocal, tDetails.localAddr) && sockaddr_storage_isValidNet(tLocal) && tDetails.localPort ) + { + addPacketHeader(RsShortInviteFieldType::LOCATOR, tDetails.localAddr.size(),buf,offset,buf_size); + memcpy(&buf[offset],tDetails.localAddr.c_str(),tDetails.localAddr.size()); + + offset += tDetails.localAddr.size(); + } + sockaddr_storage tExt; + + if(sockaddr_storage_inet_pton(tExt, tDetails.extAddr) && sockaddr_storage_isValidNet(tExt) && tDetails.extPort ) + { + addPacketHeader(RsShortInviteFieldType::LOCATOR, tDetails.extAddr.size(),buf,offset,buf_size); + memcpy(&buf[offset],tDetails.extAddr.c_str(),tDetails.extAddr.size()); + + offset += tDetails.extAddr.size(); + } +#else + sockaddr_storage tLocal; + if(sockaddr_storage_inet_pton(tLocal, tDetails.localAddr) && sockaddr_storage_isValidNet(tLocal) && sockaddr_storage_ipv6_to_ipv4(tLocal) && tDetails.localPort ) + { + uint32_t t4Addr = reinterpret_cast(tLocal).sin_addr.s_addr; + + addPacketHeader(RsShortInviteFieldType::LOC4_LOCATOR, 4 + 2,buf,offset,buf_size); + + buf[offset+0] = (uint8_t)((t4Addr >> 24) & 0xff); + buf[offset+1] = (uint8_t)((t4Addr >> 16) & 0xff); + buf[offset+2] = (uint8_t)((t4Addr >> 8) & 0xff); + buf[offset+3] = (uint8_t)((t4Addr ) & 0xff); + + buf[offset+4] = (uint8_t)((tDetails.localPort >> 8) & 0xff); + buf[offset+5] = (uint8_t)((tDetails.localPort ) & 0xff); + + offset += 4+2; + } + + sockaddr_storage tExt; + if(sockaddr_storage_inet_pton(tExt, tDetails.extAddr) && sockaddr_storage_isValidNet(tExt) && sockaddr_storage_ipv6_to_ipv4(tExt) && tDetails.extPort ) + { + uint32_t t4Addr = reinterpret_cast(tExt).sin_addr.s_addr; + + addPacketHeader(RsShortInviteFieldType::EXT4_LOCATOR, 4 + 2,buf,offset,buf_size); + + buf[offset+0] = (uint8_t)((t4Addr >> 24) & 0xff); + buf[offset+1] = (uint8_t)((t4Addr >> 16) & 0xff); + buf[offset+2] = (uint8_t)((t4Addr >> 8) & 0xff); + buf[offset+3] = (uint8_t)((t4Addr ) & 0xff); + + buf[offset+4] = (uint8_t)((tDetails.extPort >> 8) & 0xff); + buf[offset+5] = (uint8_t)((tDetails.extPort ) & 0xff); + + offset += 4+2; + } +#endif + + } uint32_t computed_crc = PGPKeyManagement::compute24bitsCRC(buf,offset) ; @@ -1374,6 +1420,17 @@ bool p3Peers::parseShortInvite(const std::string& inviteStrUrl, RsPeerDetails& d details.dyndns = std::string((char*)&buf[2],s-2); break; + case RsShortInviteFieldType::LOC4_LOCATOR: + { + uint32_t t4Addr = (((uint32_t)buf[0]) << 24)+(((uint32_t)buf[1])<<16)+(((uint32_t)buf[2])<<8) + (uint32_t)buf[3]; + sockaddr_in tLocalAddr; + tLocalAddr.sin_addr.s_addr = t4Addr; + + details.localAddr = rs_inet_ntoa(tLocalAddr.sin_addr); + details.localPort = (((uint32_t)buf[4])<<8) + (uint32_t)buf[5]; + } + break; + case RsShortInviteFieldType::EXT4_LOCATOR: { uint32_t t4Addr = (((uint32_t)buf[0]) << 24)+(((uint32_t)buf[1])<<16)+(((uint32_t)buf[2])<<8) + (uint32_t)buf[3]; diff --git a/retroshare-gui/src/gui/connect/ConnectFriendWizard.cpp b/retroshare-gui/src/gui/connect/ConnectFriendWizard.cpp index 7c1bc8cb2..39b5410e2 100755 --- a/retroshare-gui/src/gui/connect/ConnectFriendWizard.cpp +++ b/retroshare-gui/src/gui/connect/ConnectFriendWizard.cpp @@ -551,24 +551,25 @@ void ConnectFriendWizard::initializePage(int id) ui->nodeEdit->setText(loc); - std::string s; + QString s; + if(peerDetails.isHiddenNode) - s += peerDetails.hiddenNodeAddress; + s += QString::fromStdString(peerDetails.hiddenNodeAddress); else { if(peerDetails.localAddr!="0.0.0.0")// This is not so nice, but because we deal we string there's no way - s += peerDetails.localAddr; // to ask about if the ip is null. We really need a proper IP class. + s += QString::fromStdString(peerDetails.localAddr)+":"+QString::number(peerDetails.localPort); // to ask about if the ip is null. We really need a proper IP class. if(peerDetails.extAddr!="0.0.0.0") { - if(!s.empty()) s += " / " ; - s += peerDetails.extAddr; + if(!s.isNull()) s += " / " ; + s += QString::fromStdString(peerDetails.extAddr) + ":"+QString::number(peerDetails.extPort); } if(!peerDetails.dyndns.empty()) - s += "(" + peerDetails.dyndns + ")" ; + s += " (" + QString::fromStdString(peerDetails.dyndns) + ")" ; } - ui->ipEdit->setText(QString::fromStdString(s)); + ui->ipEdit->setText(s); ui->signersEdit->setPlainText(ts); fillGroups(this, ui->groupComboBox, groupId); From 3f89a3300d23f216d0d09a7f219b3ec7b29f2efa Mon Sep 17 00:00:00 2001 From: csoler Date: Sat, 6 Feb 2021 14:57:22 +0100 Subject: [PATCH 06/10] added event handling when peer discovery is received --- .../src/gossipdiscovery/p3gossipdiscovery.cc | 22 ++++++++++++++++++- .../src/retroshare/rsgossipdiscovery.h | 12 +++++----- .../src/gui/common/NewFriendList.cpp | 13 ++++++----- retroshare-gui/src/gui/common/NewFriendList.h | 3 ++- 4 files changed, 38 insertions(+), 12 deletions(-) diff --git a/libretroshare/src/gossipdiscovery/p3gossipdiscovery.cc b/libretroshare/src/gossipdiscovery/p3gossipdiscovery.cc index cba29915a..0060316ef 100644 --- a/libretroshare/src/gossipdiscovery/p3gossipdiscovery.cc +++ b/libretroshare/src/gossipdiscovery/p3gossipdiscovery.cc @@ -388,6 +388,15 @@ void p3discovery2::recvOwnContactInfo(const RsPeerId &fromId, const RsDiscContac if(!mPeerMgr->isHiddenNode(rsPeers->getOwnId())) updatePeerAddresses(item); + if(rsEvents) + { + auto ev = std::make_shared(); + ev->mGossipDiscoveryEventType = RsGossipDiscoveryEventType::FRIEND_PEER_INFO_RECEIVED; + ev->mFromId = fromId; + ev->mAboutId = item->sslId; + rsEvents->postEvent(ev); + } + // if the peer is not validated, we stop the exchange here if(det.skip_pgp_signature_validation) @@ -977,7 +986,18 @@ void p3discovery2::processContactInfo(const RsPeerId &fromId, const RsDiscContac RsServer::notify()->notifyListChange(NOTIFY_LIST_NEIGHBOURS, NOTIFY_TYPE_MOD); if(should_notify_discovery) - RsServer::notify()->notifyDiscInfoChanged(); + { + RsServer::notify()->notifyDiscInfoChanged(); + + if(rsEvents) + { + auto ev = std::make_shared(); + ev->mGossipDiscoveryEventType = RsGossipDiscoveryEventType::FRIEND_PEER_INFO_RECEIVED; + ev->mFromId = fromId; + ev->mAboutId = item->sslId; + rsEvents->postEvent(ev); + } + } } /* we explictly request certificates, instead of getting them all the time diff --git a/libretroshare/src/retroshare/rsgossipdiscovery.h b/libretroshare/src/retroshare/rsgossipdiscovery.h index ca1ab0d7c..9a6e2a792 100644 --- a/libretroshare/src/retroshare/rsgossipdiscovery.h +++ b/libretroshare/src/retroshare/rsgossipdiscovery.h @@ -47,8 +47,8 @@ extern std::shared_ptr rsGossipDiscovery; */ enum class RsGossipDiscoveryEventType: uint32_t { - UNKNOWN = 0x00, - PEER_INVITE_RECEIVED = 0x01 + UNKNOWN = 0x00, + FRIEND_PEER_INFO_RECEIVED = 0x01, }; struct RsGossipDiscoveryEvent : RsEvent @@ -57,7 +57,8 @@ struct RsGossipDiscoveryEvent : RsEvent virtual ~RsGossipDiscoveryEvent() override {} RsGossipDiscoveryEventType mGossipDiscoveryEventType; - std::string mInvite; + RsPeerId mFromId; + RsPeerId mAboutId; /// @see RsSerializable virtual void serial_process( RsGenericSerializer::SerializeJob j, @@ -65,8 +66,9 @@ struct RsGossipDiscoveryEvent : RsEvent { RsEvent::serial_process(j,ctx); RS_SERIAL_PROCESS(mGossipDiscoveryEventType); - RS_SERIAL_PROCESS(mInvite); - } + RS_SERIAL_PROCESS(mFromId); + RS_SERIAL_PROCESS(mAboutId); + } }; class RsGossipDiscovery diff --git a/retroshare-gui/src/gui/common/NewFriendList.cpp b/retroshare-gui/src/gui/common/NewFriendList.cpp index 4d794e6c4..561f7b524 100644 --- a/retroshare-gui/src/gui/common/NewFriendList.cpp +++ b/retroshare-gui/src/gui/common/NewFriendList.cpp @@ -177,10 +177,11 @@ NewFriendList::NewFriendList(QWidget */*parent*/) : /* RsAutoUpdatePage(5000,par ui->filterLineEdit->setPlaceholderText(tr("Search")) ; ui->filterLineEdit->showFilterIcon(); - mEventHandlerId=0; // forces initialization - rsEvents->registerEventsHandler( - [this](std::shared_ptr e) { handleEvent(e); }, - mEventHandlerId, RsEventType::PEER_CONNECTION ); + mEventHandlerId_peer=0; // forces initialization + mEventHandlerId_gssp=0; // forces initialization + + rsEvents->registerEventsHandler( [this](std::shared_ptr e) { handleEvent(e); }, mEventHandlerId_peer, RsEventType::PEER_CONNECTION ); + rsEvents->registerEventsHandler( [this](std::shared_ptr e) { handleEvent(e); }, mEventHandlerId_gssp, RsEventType::GOSSIP_DISCOVERY ); mModel = new RsFriendListModel(); mProxyModel = new FriendListSortFilterProxyModel(ui->peerTreeWidget->header(),this); @@ -269,7 +270,9 @@ void NewFriendList::handleEvent(std::shared_ptr /*e*/) NewFriendList::~NewFriendList() { - rsEvents->unregisterEventsHandler(mEventHandlerId); + rsEvents->unregisterEventsHandler(mEventHandlerId_peer); + rsEvents->unregisterEventsHandler(mEventHandlerId_gssp); + delete mModel; delete mProxyModel; delete ui; diff --git a/retroshare-gui/src/gui/common/NewFriendList.h b/retroshare-gui/src/gui/common/NewFriendList.h index 6d4b8d0a4..79b2d0a5a 100644 --- a/retroshare-gui/src/gui/common/NewFriendList.h +++ b/retroshare-gui/src/gui/common/NewFriendList.h @@ -121,7 +121,8 @@ private: // Settings for peer list display bool mShowState; - RsEventsHandlerId_t mEventHandlerId; + RsEventsHandlerId_t mEventHandlerId_peer; + RsEventsHandlerId_t mEventHandlerId_gssp; std::set openGroups; std::set openPeers; From 894570e2b7e6699c761e3d85fa7fcdd9d2af1c9b Mon Sep 17 00:00:00 2001 From: csoler Date: Sat, 6 Feb 2021 17:31:33 +0100 Subject: [PATCH 07/10] improved name and tooltip of subscribe button when no data is available --- .../src/gui/gxschannels/GxsChannelPostsWidgetWithModel.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/retroshare-gui/src/gui/gxschannels/GxsChannelPostsWidgetWithModel.cpp b/retroshare-gui/src/gui/gxschannels/GxsChannelPostsWidgetWithModel.cpp index 5247c6324..865eaaad1 100644 --- a/retroshare-gui/src/gui/gxschannels/GxsChannelPostsWidgetWithModel.cpp +++ b/retroshare-gui/src/gui/gxschannels/GxsChannelPostsWidgetWithModel.cpp @@ -1295,13 +1295,13 @@ void GxsChannelPostsWidgetWithModel::setSubscribeButtonText(const RsGxsGroupId& ui->subscribeToolButton->setEnabled(true); break; case DistantSearchGroupStatus::CAN_BE_REQUESTED: // means no search ongoing. This is not a distant search - ui->subscribeToolButton->setText(tr("Subscribe")); - ui->subscribeToolButton->setToolTip(tr("Hit this button to retrieve the data you need to subscribe to this channel") ); + ui->subscribeToolButton->setText(tr("Channel info missing")); + ui->subscribeToolButton->setToolTip(tr("To subscribe, first request the channel information by right-clicking Request Data in the search results.") ); ui->subscribeToolButton->setSubscribed(false); ui->subscribeToolButton->setEnabled(false); break; case DistantSearchGroupStatus::ONGOING_REQUEST: - ui->subscribeToolButton->setText(tr("Subscribe")); + ui->subscribeToolButton->setText(tr("Channel info requested...")); ui->subscribeToolButton->setToolTip(""); ui->subscribeToolButton->setSubscribed(true); ui->subscribeToolButton->setEnabled(false); From 1f1a226f87787c6633fffa23fe4d22af49946d59 Mon Sep 17 00:00:00 2001 From: csoler Date: Sat, 6 Feb 2021 17:31:43 +0100 Subject: [PATCH 08/10] removed soem dead code --- libretroshare/src/gxs/rsgxsnetservice.cc | 9 +- libretroshare/src/services/p3gxschannels.cc | 104 ++------------------ 2 files changed, 12 insertions(+), 101 deletions(-) diff --git a/libretroshare/src/gxs/rsgxsnetservice.cc b/libretroshare/src/gxs/rsgxsnetservice.cc index 9d024261e..05d40c729 100644 --- a/libretroshare/src/gxs/rsgxsnetservice.cc +++ b/libretroshare/src/gxs/rsgxsnetservice.cc @@ -5368,14 +5368,13 @@ void RsGxsNetService::receiveTurtleSearchResults(TurtleRequestId req,const unsig #endif uint32_t used_size = clear_group_data_len; RsItem *item = RsNxsSerialiser(mServType).deserialise(clear_group_data,&used_size) ; - RsNxsGrp *nxs_identity_grp=nullptr; if(used_size < clear_group_data_len) { uint32_t remaining_size = clear_group_data_len-used_size ; RsItem *item2 = RsNxsSerialiser(RS_SERVICE_GXS_TYPE_GXSID).deserialise(clear_group_data+used_size,&remaining_size) ; - nxs_identity_grp = dynamic_cast(item2); + auto nxs_identity_grp = dynamic_cast(item2); if(!nxs_identity_grp) std::cerr << "(EE) decrypted item contains more data that cannot be deserialized as a GxsId. Unexpected!" << std::endl; @@ -5383,6 +5382,9 @@ void RsGxsNetService::receiveTurtleSearchResults(TurtleRequestId req,const unsig // We should probably check that the identity that is sent corresponds to the group author and don't add // it otherwise. But in any case, this won't harm to add a new public identity. If that identity is banned, // the group will be discarded in RsGenExchange anyway. + + if(nxs_identity_grp) + mGixs->receiveNewIdentity(nxs_identity_grp); } free(clear_group_data); @@ -5413,9 +5415,6 @@ void RsGxsNetService::receiveTurtleSearchResults(TurtleRequestId req,const unsig #endif mObserver->receiveNewGroups(new_grps); mObserver->receiveDistantSearchResults(req, grpId); - - if(nxs_identity_grp) - mGixs->receiveNewIdentity(nxs_identity_grp); } bool RsGxsNetService::search( const std::string& substring, diff --git a/libretroshare/src/services/p3gxschannels.cc b/libretroshare/src/services/p3gxschannels.cc index 9045b96f3..41c21db10 100644 --- a/libretroshare/src/services/p3gxschannels.cc +++ b/libretroshare/src/services/p3gxschannels.cc @@ -2654,90 +2654,9 @@ void p3GxsChannels::receiveDistantSearchResults( TurtleRequestId id, const RsGxs // So we put some data in there and will send an event with all of them at once every 1 sec at most. mSearchResultsToNotify[id].insert(grpId); - -#ifdef TO_REMOVE - std::cerr << __PRETTY_FUNCTION__ << "(" << id << ", " << grpId << ")" << std::endl; - - { - RsGenExchange::receiveDistantSearchResults(id, grpId); - RsGxsGroupSearchResults gs; - netService()->retrieveDistantGroupSummary(grpId, gs); - - { - RS_STACK_MUTEX(mSearchCallbacksMapMutex); - auto cbpt = mSearchCallbacksMap.find(id); - if(cbpt != mSearchCallbacksMap.end()) - { - cbpt->second.first(gs); - return; - } - } // end RS_STACK_MUTEX(mSearchCallbacksMapMutex); - } - - { - RS_STACK_MUTEX(mDistantChannelsCallbacksMapMutex); - auto cbpt = mDistantChannelsCallbacksMap.find(id); - if(cbpt != mDistantChannelsCallbacksMap.end()) - { - std::function callback = - cbpt->second.first; - RsThread::async([this, callback, grpId]() - { - std::list chanIds({grpId}); - std::vector channelsInfo; - if(!getChannelsInfo(chanIds, channelsInfo)) - { - std::cerr << __PRETTY_FUNCTION__ << " Error! Received " - << "distant channel result grpId: " << grpId - << " but failed getting channel info" - << std::endl; - return; - } - - for(const RsGxsChannelGroup& chan : channelsInfo) - callback(chan); - } ); - - return; - } - } // RS_STACK_MUTEX(mDistantChannelsCallbacksMapMutex); -#endif } -#ifdef TO_REMOVE -void p3GxsChannels::cleanTimedOutCallbacks() -{ - auto now = std::chrono::system_clock::now(); - - { - RS_STACK_MUTEX(mSearchCallbacksMapMutex); - for( auto cbpt = mSearchCallbacksMap.begin(); - cbpt != mSearchCallbacksMap.end(); ) - if(cbpt->second.second <= now) - { - clearDistantSearchResults(cbpt->first); - cbpt = mSearchCallbacksMap.erase(cbpt); - } - else ++cbpt; - } // RS_STACK_MUTEX(mSearchCallbacksMapMutex); - - { - RS_STACK_MUTEX(mDistantChannelsCallbacksMapMutex); - for( auto cbpt = mDistantChannelsCallbacksMap.begin(); - cbpt != mDistantChannelsCallbacksMap.end(); ) - if(cbpt->second.second <= now) - { - clearDistantSearchResults(cbpt->first); - cbpt = mDistantChannelsCallbacksMap.erase(cbpt); - } - else ++cbpt; - } // RS_STACK_MUTEX(mDistantChannelsCallbacksMapMutex) -} -#endif - -bool p3GxsChannels::exportChannelLink( - std::string& link, const RsGxsGroupId& chanId, bool includeGxsData, - const std::string& baseUrl, std::string& errMsg ) +bool p3GxsChannels::exportChannelLink( std::string& link, const RsGxsGroupId& chanId, bool includeGxsData, const std::string& baseUrl, std::string& errMsg ) { constexpr auto fname = __PRETTY_FUNCTION__; const auto failure = [&](const std::string& err) @@ -2773,8 +2692,7 @@ bool p3GxsChannels::exportChannelLink( return true; } -bool p3GxsChannels::importChannelLink( - const std::string& link, RsGxsGroupId& chanId, std::string& errMsg ) +bool p3GxsChannels::importChannelLink( const std::string& link, RsGxsGroupId& chanId, std::string& errMsg ) { constexpr auto fname = __PRETTY_FUNCTION__; const auto failure = [&](const std::string& err) @@ -2801,18 +2719,12 @@ bool p3GxsChannels::importChannelLink( return true; } -/*static*/ const std::string RsGxsChannels::DEFAULT_CHANNEL_BASE_URL = - "retroshare:///channels"; -/*static*/ const std::string RsGxsChannels::CHANNEL_URL_NAME_FIELD = - "chanName"; -/*static*/ const std::string RsGxsChannels::CHANNEL_URL_ID_FIELD = - "chanId"; -/*static*/ const std::string RsGxsChannels::CHANNEL_URL_DATA_FIELD = - "chanData"; -/*static*/ const std::string RsGxsChannels::CHANNEL_URL_MSG_TITLE_FIELD = - "chanMsgTitle"; -/*static*/ const std::string RsGxsChannels::CHANNEL_URL_MSG_ID_FIELD = - "chanMsgId"; +/*static*/ const std::string RsGxsChannels::DEFAULT_CHANNEL_BASE_URL = "retroshare:///channels"; +/*static*/ const std::string RsGxsChannels::CHANNEL_URL_NAME_FIELD = "chanName"; +/*static*/ const std::string RsGxsChannels::CHANNEL_URL_ID_FIELD = "chanId"; +/*static*/ const std::string RsGxsChannels::CHANNEL_URL_DATA_FIELD = "chanData"; +/*static*/ const std::string RsGxsChannels::CHANNEL_URL_MSG_TITLE_FIELD = "chanMsgTitle"; +/*static*/ const std::string RsGxsChannels::CHANNEL_URL_MSG_ID_FIELD = "chanMsgId"; RsGxsChannelGroup::~RsGxsChannelGroup() = default; RsGxsChannelPost::~RsGxsChannelPost() = default; From abe352763535a38c16eb8b8ca2ea520b4661e52b Mon Sep 17 00:00:00 2001 From: csoler Date: Sat, 6 Feb 2021 21:42:07 +0100 Subject: [PATCH 09/10] update friends IP from own net info sent by discovery --- .../src/gossipdiscovery/p3gossipdiscovery.cc | 18 +++++++++++++++++- libretroshare/src/pqi/p3linkmgr.cc | 13 +++++++++++++ libretroshare/src/pqi/p3peermgr.cc | 11 +++-------- .../src/gui/connect/ConfCertDialog.ui | 12 ++++++------ 4 files changed, 39 insertions(+), 15 deletions(-) diff --git a/libretroshare/src/gossipdiscovery/p3gossipdiscovery.cc b/libretroshare/src/gossipdiscovery/p3gossipdiscovery.cc index 0060316ef..eb6378ce4 100644 --- a/libretroshare/src/gossipdiscovery/p3gossipdiscovery.cc +++ b/libretroshare/src/gossipdiscovery/p3gossipdiscovery.cc @@ -379,7 +379,23 @@ void p3discovery2::recvOwnContactInfo(const RsPeerId &fromId, const RsDiscContac mPeerMgr->setLocation(fromId, item->location); mPeerMgr->setVisState(fromId, item->vs_disc, item->vs_dht); - setPeerVersion(fromId, item->version); + if(!det.localAddr.empty()) + { + if(sockaddr_storage_isValidNet(item->localAddrV4.addr)) + mPeerMgr->setLocalAddress(fromId,item->localAddrV4.addr); + else if(sockaddr_storage_isValidNet(item->localAddrV6.addr)) + mPeerMgr->setLocalAddress(fromId,item->localAddrV6.addr); + } + + if(!det.extAddr.empty()) + { + if(sockaddr_storage_isValidNet(item->extAddrV4.addr)) + mPeerMgr->setExtAddress(fromId,item->extAddrV4.addr); + else if(sockaddr_storage_isValidNet(item->extAddrV6.addr)) + mPeerMgr->setExtAddress(fromId,item->extAddrV6.addr); + } + + setPeerVersion(fromId, item->version); // Hidden nodes do not need IP information. So that information is dropped. // However, that doesn't mean hidden nodes do not know that information. Normally diff --git a/libretroshare/src/pqi/p3linkmgr.cc b/libretroshare/src/pqi/p3linkmgr.cc index 4ea635c78..5ce4008aa 100644 --- a/libretroshare/src/pqi/p3linkmgr.cc +++ b/libretroshare/src/pqi/p3linkmgr.cc @@ -472,6 +472,17 @@ void p3LinkMgrIMPL::tickMonitors() std::cerr << std::endl; #endif +// if(peer.actions & RS_PEER_CONNECTED) +// { +// pqiIpAddress ip; +// ip.mAddr = it->second.currentConnAddrAttempt.addr; +// ip.mSeenTime = time(NULL); +// ip.mSrc = time(NULL); +// +// mPeerMgr->updateCurrentAddress(it->second.id,) +// std::cerr << "Peer " << it->second.id << " connected with IP " << sockaddr_storage_tostring(it->second.currentConnAddrAttempt.addr) << std::endl; +// } + /* notify GUI */ if (rsEvents && (peer.actions & RS_PEER_CONNECTED)) { @@ -788,6 +799,8 @@ bool p3LinkMgrIMPL::connectResult(const RsPeerId &id, bool success, bool isIncom bool updatePeerAddr = false; bool updateLastContact = false; + std::cerr << "Connection result with peer " << id << ": " << success << ". Is incoming: " << isIncomingConnection << ", remote addr: " << sockaddr_storage_tostring(remote_peer_address) << std::endl; + { RsStackMutex stack(mLinkMtx); /****** STACK LOCK MUTEX *******/ diff --git a/libretroshare/src/pqi/p3peermgr.cc b/libretroshare/src/pqi/p3peermgr.cc index b072a55de..dc3d93845 100644 --- a/libretroshare/src/pqi/p3peermgr.cc +++ b/libretroshare/src/pqi/p3peermgr.cc @@ -1066,8 +1066,7 @@ bool p3PeerMgrIMPL::addFriend(const RsPeerId& input_id, const RsPgpId& input_gpg } -bool p3PeerMgrIMPL::addSslOnlyFriend( - const RsPeerId& sslId, const RsPgpId& pgp_id, const RsPeerDetails& dt ) +bool p3PeerMgrIMPL::addSslOnlyFriend( const RsPeerId& sslId, const RsPgpId& pgp_id, const RsPeerDetails& dt ) { constexpr auto fname = __PRETTY_FUNCTION__; const auto failure = [&](const std::string& err) @@ -1598,9 +1597,7 @@ bool p3PeerMgrIMPL::setLocalAddress( const RsPeerId &id, std::map::iterator it; if (mFriendList.end() == (it = mFriendList.find(id))) { -#ifdef PEER_DEBUG - std::cerr << "p3PeerMgrIMPL::setLocalAddress() cannot add addres " << "info : peer id not found in friend list id: " << id << std::endl; -#endif + std::cerr << "(EE) p3PeerMgrIMPL::setLocalAddress() cannot add addres " << "info : peer id not found in friend list id: " << id << std::endl; return false; } @@ -1659,9 +1656,7 @@ bool p3PeerMgrIMPL::setExtAddress( const RsPeerId &id, std::map::iterator it; if (mFriendList.end() == (it = mFriendList.find(id))) { -#ifdef PEER_DEBUG - std::cerr << "p3PeerMgrIMPL::setExtAddress() cannot add addres " << "info : peer id not found in friend list id: " << id << std::endl; -#endif + std::cerr << "(EE) p3PeerMgrIMPL::setExtAddress() cannot add addres " << "info : peer id not found in friend list id: " << id << std::endl; return false; } diff --git a/retroshare-gui/src/gui/connect/ConfCertDialog.ui b/retroshare-gui/src/gui/connect/ConfCertDialog.ui index 77a866471..83b15ed92 100644 --- a/retroshare-gui/src/gui/connect/ConfCertDialog.ui +++ b/retroshare-gui/src/gui/connect/ConfCertDialog.ui @@ -7,7 +7,7 @@ 0 0 658 - 400 + 419 @@ -441,17 +441,17 @@ + + RSTextBrowser + QTextBrowser +
gui/common/RSTextBrowser.h
+
HeaderFrame QFrame
gui/common/HeaderFrame.h
1
- - RSTextBrowser - QTextBrowser -
gui/common/RSTextBrowser.h
-
AvatarWidget QLabel From 90a11a123637aec321b0343a4090135072b787d2 Mon Sep 17 00:00:00 2001 From: csoler Date: Sat, 6 Feb 2021 21:55:43 +0100 Subject: [PATCH 10/10] only update peer IPs form discovery for non hidden nodes --- .../src/gossipdiscovery/p3gossipdiscovery.cc | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/libretroshare/src/gossipdiscovery/p3gossipdiscovery.cc b/libretroshare/src/gossipdiscovery/p3gossipdiscovery.cc index eb6378ce4..732967f44 100644 --- a/libretroshare/src/gossipdiscovery/p3gossipdiscovery.cc +++ b/libretroshare/src/gossipdiscovery/p3gossipdiscovery.cc @@ -373,26 +373,30 @@ void p3discovery2::recvOwnContactInfo(const RsPeerId &fromId, const RsDiscContac } // Peer Own Info replaces the existing info, because the - // peer is the primary source of his own IPs. + // peer is the primary source of his own IPs, except for hidden nodes + // that normally send nothing. We still ignore it as a double security. mPeerMgr->setNetworkMode(fromId, item->netMode); mPeerMgr->setLocation(fromId, item->location); mPeerMgr->setVisState(fromId, item->vs_disc, item->vs_dht); - if(!det.localAddr.empty()) + if(!mPeerMgr->isHiddenNode(fromId)) { - if(sockaddr_storage_isValidNet(item->localAddrV4.addr)) - mPeerMgr->setLocalAddress(fromId,item->localAddrV4.addr); - else if(sockaddr_storage_isValidNet(item->localAddrV6.addr)) - mPeerMgr->setLocalAddress(fromId,item->localAddrV6.addr); - } + if(!det.localAddr.empty()) + { + if(sockaddr_storage_isValidNet(item->localAddrV4.addr)) + mPeerMgr->setLocalAddress(fromId,item->localAddrV4.addr); + else if(sockaddr_storage_isValidNet(item->localAddrV6.addr)) + mPeerMgr->setLocalAddress(fromId,item->localAddrV6.addr); + } - if(!det.extAddr.empty()) - { - if(sockaddr_storage_isValidNet(item->extAddrV4.addr)) - mPeerMgr->setExtAddress(fromId,item->extAddrV4.addr); - else if(sockaddr_storage_isValidNet(item->extAddrV6.addr)) - mPeerMgr->setExtAddress(fromId,item->extAddrV6.addr); + if(!det.extAddr.empty()) + { + if(sockaddr_storage_isValidNet(item->extAddrV4.addr)) + mPeerMgr->setExtAddress(fromId,item->extAddrV4.addr); + else if(sockaddr_storage_isValidNet(item->extAddrV6.addr)) + mPeerMgr->setExtAddress(fromId,item->extAddrV6.addr); + } } setPeerVersion(fromId, item->version);