diff --git a/libi2pd/RouterContext.cpp b/libi2pd/RouterContext.cpp index 100d9c44..9529a757 100644 --- a/libi2pd/RouterContext.cpp +++ b/libi2pd/RouterContext.cpp @@ -146,7 +146,7 @@ namespace i2p bool updated = false; for (auto& address : m_RouterInfo.GetAddresses ()) { - if (address->port != port) + if (!address->IsNTCP2 () && address->port != port) { address->port = port; updated = true; @@ -156,6 +156,22 @@ namespace i2p UpdateRouterInfo (); } + void RouterContext::PublishNTCP2Address (int port) + { + bool updated = false; + for (auto& address : m_RouterInfo.GetAddresses ()) + { + if (address->IsNTCP2 () && address->port != port) + { + address->port = port; + address->ntcp2->isPublished = true; + updated = true; + } + } + if (updated) + UpdateRouterInfo (); + } + void RouterContext::UpdateAddress (const boost::asio::ip::address& host) { bool updated = false; diff --git a/libi2pd/RouterContext.h b/libi2pd/RouterContext.h index ae4aa17e..b840e19a 100644 --- a/libi2pd/RouterContext.h +++ b/libi2pd/RouterContext.h @@ -76,8 +76,9 @@ namespace i2p void SetNetID (int netID) { m_NetID = netID; }; bool DecryptTunnelBuildRecord (const uint8_t * encrypted, uint8_t * data, BN_CTX * ctx) const; - void UpdatePort (int port); // called from Daemon + void UpdatePort (int port); // called from Daemon void UpdateAddress (const boost::asio::ip::address& host); // called from SSU or Daemon + void PublishNTCP2Address (int port); bool AddIntroducer (const i2p::data::RouterInfo::Introducer& introducer); void RemoveIntroducer (const boost::asio::ip::udp::endpoint& e); bool IsUnreachable () const; diff --git a/libi2pd/RouterInfo.cpp b/libi2pd/RouterInfo.cpp index 535c7bd8..a38d8fa7 100644 --- a/libi2pd/RouterInfo.cpp +++ b/libi2pd/RouterInfo.cpp @@ -456,7 +456,7 @@ namespace data else WriteString ("", s); - if (!address.IsNTCP2 ()) // we don't publish NTCP2 address fow now. TODO: implement + if (!address.IsNTCP2 () || address.IsPublishedNTCP2 ()) { WriteString ("host", properties); properties << '='; @@ -538,7 +538,7 @@ namespace data } } - if (!address.IsNTCP2 ()) // we don't publish NTCP2 address fow now. TODO: implement + if (!address.IsNTCP2 () || address.IsPublishedNTCP2 ()) { WriteString ("port", properties); properties << '='; @@ -552,7 +552,11 @@ namespace data WriteString (address.ntcp2->staticKey.ToBase64 (), properties); properties << ';'; WriteString ("v", properties); properties << '='; WriteString ("2", properties); properties << ';'; - // TODO: publish "i" + if (address.IsPublishedNTCP2 ()) + { + WriteString ("i", properties); properties << '='; + WriteString (address.ntcp2->iv.ToBase64 (), properties); properties << ';'; + } } uint16_t size = htobe16 (properties.str ().size ());