From 81d9626da9f7de4a1d195f279f7f079560799685 Mon Sep 17 00:00:00 2001 From: kote Date: Tue, 27 Aug 2019 21:56:07 +0800 Subject: [PATCH 01/12] qt: fixed logging to window in release builds --- qt/i2pd_qt/i2pd_qt.pro | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/qt/i2pd_qt/i2pd_qt.pro b/qt/i2pd_qt/i2pd_qt.pro index 51aa4246..e6349855 100644 --- a/qt/i2pd_qt/i2pd_qt.pro +++ b/qt/i2pd_qt/i2pd_qt.pro @@ -6,11 +6,16 @@ TARGET = i2pd_qt TEMPLATE = app QMAKE_CXXFLAGS *= -std=c++11 -Wno-unused-parameter -Wno-maybe-uninitialized -# For now, disable UPnP which currently crashes on Stop() -- https://github.com/PurpleI2P/i2pd/issues/1387 +# For now, disable UPnP which currently crashes in UPnP::Stop() -- https://github.com/PurpleI2P/i2pd/issues/1387 #DEFINES += USE_UPNP DEFINES -= USE_UPNP -debug: DEFINES += DEBUG_WITH_DEFAULT_LOGGING +CONFIG(debug, debug|release) { + message(Debug build) + DEFINES += DEBUG_WITH_DEFAULT_LOGGING +} else { + message(Release build) +} SOURCES += DaemonQT.cpp mainwindow.cpp \ ../../libi2pd/api.cpp \ From 90a5d02bf6118c53dd97f2e03775dc6be81fb891 Mon Sep 17 00:00:00 2001 From: orignal Date: Tue, 27 Aug 2019 10:17:32 -0400 Subject: [PATCH 02/12] 2.28.0 --- ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/ChangeLog b/ChangeLog index 89253f5b..980ae537 100644 --- a/ChangeLog +++ b/ChangeLog @@ -12,6 +12,7 @@ ### Fixed - ReceiveID changes in the same stream - "\r\n" command terminator in SAM +- Addressbook lines with signatures ## [2.27.0] - 2019-07-03 ### Added From 2900bc26a5056705c50273f5c0bd17d38bfb4054 Mon Sep 17 00:00:00 2001 From: kote Date: Fri, 6 Sep 2019 02:58:28 +0800 Subject: [PATCH 03/12] fixed #1388 : took code from https://github.com/PurpleI2P/i2pd/commit/736c95a870814f00031c75b2d4ad7af64a65918d and fixed it as https://github.com/PurpleI2P/i2pd/issues/1388#issuecomment-528495918 tells --- daemon/UPnP.cpp | 136 ++++++++++++++++++++++++++++++++---------------- daemon/UPnP.h | 56 ++++++++++++-------- 2 files changed, 124 insertions(+), 68 deletions(-) diff --git a/daemon/UPnP.cpp b/daemon/UPnP.cpp index 3aad19c6..d112c7d2 100644 --- a/daemon/UPnP.cpp +++ b/daemon/UPnP.cpp @@ -79,43 +79,58 @@ namespace transport void UPnP::Discover () { -#if MINIUPNPC_API_VERSION >= 14 - int nerror = 0; - m_Devlist = upnpDiscover (2000, m_MulticastIf, m_Minissdpdpath, 0, 0, 2, &nerror); -#elif ( MINIUPNPC_API_VERSION >= 8 || defined(UPNPDISCOVER_SUCCESS) ) - int nerror = 0; - m_Devlist = upnpDiscover (2000, m_MulticastIf, m_Minissdpdpath, 0, 0, &nerror); + bool isError; + int err; + +#if ((MINIUPNPC_API_VERSION >= 8) || defined (UPNPDISCOVER_SUCCESS)) + err = UPNPDISCOVER_SUCCESS; + +#if (MINIUPNPC_API_VERSION >= 14) + m_Devlist = upnpDiscover (UPNP_RESPONSE_TIMEOUT, NULL, NULL, 0, 0, 2, &err); #else - m_Devlist = upnpDiscover (2000, m_MulticastIf, m_Minissdpdpath, 0); + m_Devlist = upnpDiscover (UPNP_RESPONSE_TIMEOUT, NULL, NULL, 0, 0, &err); #endif + + isError = err != UPNPDISCOVER_SUCCESS; +#else // MINIUPNPC_API_VERSION >= 8 + err = 0; + m_Devlist = upnpDiscover (UPNP_RESPONSE_TIMEOUT, NULL, NULL, 0); + isError = m_Devlist == NULL; +#endif // MINIUPNPC_API_VERSION >= 8 { - // notify satrting thread + // notify starting thread std::unique_lock l(m_StartedMutex); m_Started.notify_all (); } - int r; - r = UPNP_GetValidIGD (m_Devlist, &m_upnpUrls, &m_upnpData, m_NetworkAddr, sizeof (m_NetworkAddr)); - if (r == 1) + if (isError) { - r = UPNP_GetExternalIPAddress (m_upnpUrls.controlURL, m_upnpData.first.servicetype, m_externalIPAddress); - if(r != UPNPCOMMAND_SUCCESS) + LogPrint (eLogError, "UPnP: unable to discover Internet Gateway Devices: error ", err); + return; + } + + err = UPNP_GetValidIGD (m_Devlist, &m_upnpUrls, &m_upnpData, m_NetworkAddr, sizeof (m_NetworkAddr)); + if (err == UPNP_IGD_VALID_CONNECTED) + { + err = UPNP_GetExternalIPAddress (m_upnpUrls.controlURL, m_upnpData.first.servicetype, m_externalIPAddress); + if(err != UPNPCOMMAND_SUCCESS) { - LogPrint (eLogError, "UPnP: UPNP_GetExternalIPAddress() returned ", r); + LogPrint (eLogError, "UPnP: unable to get external address: error ", err); return; } else { + LogPrint (eLogError, "UPnP: found Internet Gateway Device ", m_upnpUrls.controlURL); if (!m_externalIPAddress[0]) { - LogPrint (eLogError, "UPnP: GetExternalIPAddress() failed."); + LogPrint (eLogError, "UPnP: found Internet Gateway Device doesn't know our external address"); return; } } } else { - LogPrint (eLogError, "UPnP: GetValidIGD() failed."); + LogPrint (eLogError, "UPnP: unable to find valid Internet Gateway Device: error ", err); return; } @@ -126,6 +141,20 @@ namespace transport PortMapping (); } + int UPnP::CheckMapping (const char* port, const char* type) + { + int err = UPNPCOMMAND_SUCCESS; + +#if (MINIUPNPC_API_VERSION >= 10) + err = UPNP_GetSpecificPortMappingEntry(m_upnpUrls.controlURL, m_upnpData.first.servicetype, port, type, NULL, NULL, NULL, NULL, NULL, NULL); +#elif ((MINIUPNPC_API_VERSION >= 8) || defined (UPNPDISCOVER_SUCCESS)) + err = UPNP_GetSpecificPortMappingEntry(m_upnpUrls.controlURL, m_upnpData.first.servicetype, port, type, NULL, NULL, NULL, NULL, NULL); +#else + err = UPNP_GetSpecificPortMappingEntry(m_upnpUrls.controlURL, m_upnpData.first.servicetype, port, type, NULL, NULL); +#endif + return err; + } + void UPnP::PortMapping () { const auto& a = context.GetRouterInfo().GetAddresses(); @@ -134,13 +163,47 @@ namespace transport if (!address->host.is_v6 () && address->port) TryPortMapping (address); } - m_Timer.expires_from_now (boost::posix_time::minutes(20)); // every 20 minutes + m_Timer.expires_from_now (boost::posix_time::minutes(20)); // every 20 minutes m_Timer.async_wait ([this](const boost::system::error_code& ecode) { if (ecode != boost::asio::error::operation_aborted) PortMapping (); }); + } + void UPnP::TryPortMapping (std::shared_ptr address) + { + std::string strType (GetProto (address)), strPort (std::to_string (address->port)); + std::string strDesc; i2p::config::GetOption("upnp.name", strDesc); + int err = UPNPCOMMAND_SUCCESS; + + // check for existing mapping + err = CheckMapping (strPort.c_str (), strType.c_str ()); + if (err != UPNPCOMMAND_SUCCESS) // if mapping not found + { + LogPrint (eLogDebug, "UPnP: possibly port ", strPort, " is not forwarded: return code ", err); + +#if ((MINIUPNPC_API_VERSION >= 8) || defined (UPNPDISCOVER_SUCCESS)) + err = UPNP_AddPortMapping (m_upnpUrls.controlURL, m_upnpData.first.servicetype, strPort.c_str (), strPort.c_str (), m_NetworkAddr, strDesc.c_str (), strType.c_str (), NULL, NULL); +#else + err = UPNP_AddPortMapping (m_upnpUrls.controlURL, m_upnpData.first.servicetype, strPort.c_str (), strPort.c_str (), m_NetworkAddr, strDesc.c_str (), strType.c_str (), NULL); +#endif + if (err != UPNPCOMMAND_SUCCESS) + { + LogPrint (eLogError, "UPnP: port forwarding to ", m_NetworkAddr, ":", strPort, " failed: return code ", err); + return; + } + else + { + LogPrint (eLogInfo, "UPnP: port successfully forwarded (", m_externalIPAddress ,":", strPort, " type ", strType, " -> ", m_NetworkAddr ,":", strPort ,")"); + return; + } + } + else + { + LogPrint (eLogDebug, "UPnP: external forward from ", m_NetworkAddr, ":", strPort, " exists on current Internet Gateway Device"); + return; + } } void UPnP::CloseMapping () @@ -153,34 +216,17 @@ namespace transport } } - void UPnP::TryPortMapping (std::shared_ptr address) - { - std::string strType (GetProto (address)), strPort (std::to_string (address->port)); - int r; - std::string strDesc; i2p::config::GetOption("upnp.name", strDesc); -#ifdef UPNPDISCOVER_SUCCESS - r = UPNP_AddPortMapping (m_upnpUrls.controlURL, m_upnpData.first.servicetype, strPort.c_str (), strPort.c_str (), m_NetworkAddr, strDesc.c_str (), strType.c_str (), 0, "0"); -#else - r = UPNP_AddPortMapping (m_upnpUrls.controlURL, m_upnpData.first.servicetype, strPort.c_str (), strPort.c_str (), m_NetworkAddr, strDesc.c_str (), strType.c_str (), 0); -#endif - if (r!=UPNPCOMMAND_SUCCESS) - { - LogPrint (eLogError, "UPnP: AddPortMapping (", m_NetworkAddr, ":", strPort, ") failed with code ", r); - return; - } - else - { - LogPrint (eLogDebug, "UPnP: Port Mapping successful. (", m_NetworkAddr ,":", strPort, " type ", strType, " -> ", m_externalIPAddress ,":", strPort ,")"); - return; - } - } - void UPnP::CloseMapping (std::shared_ptr address) { std::string strType (GetProto (address)), strPort (std::to_string (address->port)); - int r = 0; - r = UPNP_DeletePortMapping (m_upnpUrls.controlURL, m_upnpData.first.servicetype, strPort.c_str (), strType.c_str (), 0); - LogPrint (eLogError, "UPnP: DeletePortMapping() returned : ", r); + int err = UPNPCOMMAND_SUCCESS; + + err = CheckMapping (strPort.c_str (), strType.c_str ()); + if (err == UPNPCOMMAND_SUCCESS) + { + err = UPNP_DeletePortMapping (m_upnpUrls.controlURL, m_upnpData.first.servicetype, strPort.c_str (), strType.c_str (), NULL); + LogPrint (eLogError, "UPnP: DeletePortMapping() returned : ", err); + } } void UPnP::Close () @@ -195,11 +241,11 @@ namespace transport switch (address->transportStyle) { case i2p::data::RouterInfo::eTransportNTCP: - return "TCP"; - break; + return "TCP"; + break; case i2p::data::RouterInfo::eTransportSSU: default: - return "UDP"; + return "UDP"; } } } diff --git a/daemon/UPnP.h b/daemon/UPnP.h index 5313a1c4..48855f0c 100644 --- a/daemon/UPnP.h +++ b/daemon/UPnP.h @@ -19,20 +19,31 @@ namespace i2p { namespace transport { + const int UPNP_RESPONSE_TIMEOUT = 2000; // in milliseconds + + enum + { + UPNP_IGD_NONE = 0, + UPNP_IGD_VALID_CONNECTED = 1, + UPNP_IGD_VALID_NOT_CONNECTED = 2, + UPNP_IGD_INVALID = 3 + }; + class UPnP { - public: + public: UPnP (); ~UPnP (); - void Close (); + void Close (); - void Start (); - void Stop (); + void Start (); + void Stop (); - private: + private: void Discover (); + int CheckMapping (const char* port, const char* type); void PortMapping (); void TryPortMapping (std::shared_ptr address); void CloseMapping (); @@ -41,23 +52,21 @@ namespace transport void Run (); std::string GetProto (std::shared_ptr address); - private: + private: bool m_IsRunning; - std::unique_ptr m_Thread; + std::unique_ptr m_Thread; std::condition_variable m_Started; std::mutex m_StartedMutex; boost::asio::io_service m_Service; boost::asio::deadline_timer m_Timer; - struct UPNPUrls m_upnpUrls; - struct IGDdatas m_upnpData; + struct UPNPUrls m_upnpUrls; + struct IGDdatas m_upnpData; - // For miniupnpc - char * m_MulticastIf = 0; - char * m_Minissdpdpath = 0; - struct UPNPDev * m_Devlist = 0; - char m_NetworkAddr[64]; - char m_externalIPAddress[40]; + // For miniupnpc + struct UPNPDev * m_Devlist = 0; + char m_NetworkAddr[64]; + char m_externalIPAddress[40]; }; } } @@ -65,14 +74,15 @@ namespace transport #else // USE_UPNP namespace i2p { namespace transport { - /* class stub */ - class UPnP { - public: - UPnP () {}; - ~UPnP () {}; - void Start () { LogPrint(eLogWarning, "UPnP: this module was disabled at compile-time"); } - void Stop () {}; - }; + /* class stub */ + class UPnP { + public: + + UPnP () {}; + ~UPnP () {}; + void Start () { LogPrint(eLogWarning, "UPnP: this module was disabled at compile-time"); } + void Stop () {}; + }; } } #endif // USE_UPNP From f7a084969a5d501fcd489a5bcde6236f67273d8e Mon Sep 17 00:00:00 2001 From: kote Date: Fri, 6 Sep 2019 03:21:26 +0800 Subject: [PATCH 04/12] fixed #1387 --- daemon/UPnP.cpp | 15 +++++++++++---- daemon/UPnP.h | 1 + qt/i2pd_qt/i2pd_qt.pro | 4 +--- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/daemon/UPnP.cpp b/daemon/UPnP.cpp index d112c7d2..b2ebb005 100644 --- a/daemon/UPnP.cpp +++ b/daemon/UPnP.cpp @@ -110,9 +110,10 @@ namespace transport } err = UPNP_GetValidIGD (m_Devlist, &m_upnpUrls, &m_upnpData, m_NetworkAddr, sizeof (m_NetworkAddr)); + m_upnpUrlsInitialized=err!=0; if (err == UPNP_IGD_VALID_CONNECTED) { - err = UPNP_GetExternalIPAddress (m_upnpUrls.controlURL, m_upnpData.first.servicetype, m_externalIPAddress); + err = UPNP_GetExternalIPAddress (m_upnpUrls.controlURL, m_upnpData.first.servicetype, m_externalIPAddress); if(err != UPNPCOMMAND_SUCCESS) { LogPrint (eLogError, "UPnP: unable to get external address: error ", err); @@ -218,11 +219,14 @@ namespace transport void UPnP::CloseMapping (std::shared_ptr address) { + if(!m_upnpUrlsInitialized) { + return; + } std::string strType (GetProto (address)), strPort (std::to_string (address->port)); int err = UPNPCOMMAND_SUCCESS; err = CheckMapping (strPort.c_str (), strType.c_str ()); - if (err == UPNPCOMMAND_SUCCESS) + if (err == UPNPCOMMAND_SUCCESS) { err = UPNP_DeletePortMapping (m_upnpUrls.controlURL, m_upnpData.first.servicetype, strPort.c_str (), strType.c_str (), NULL); LogPrint (eLogError, "UPnP: DeletePortMapping() returned : ", err); @@ -233,8 +237,11 @@ namespace transport { freeUPNPDevlist (m_Devlist); m_Devlist = 0; - FreeUPNPUrls (&m_upnpUrls); - } + if(m_upnpUrlsInitialized){ + FreeUPNPUrls (&m_upnpUrls); + m_upnpUrlsInitialized=false; + } + } std::string UPnP::GetProto (std::shared_ptr address) { diff --git a/daemon/UPnP.h b/daemon/UPnP.h index 48855f0c..e66f0aff 100644 --- a/daemon/UPnP.h +++ b/daemon/UPnP.h @@ -60,6 +60,7 @@ namespace transport std::mutex m_StartedMutex; boost::asio::io_service m_Service; boost::asio::deadline_timer m_Timer; + bool m_upnpUrlsInitialized=false; struct UPNPUrls m_upnpUrls; struct IGDdatas m_upnpData; diff --git a/qt/i2pd_qt/i2pd_qt.pro b/qt/i2pd_qt/i2pd_qt.pro index e6349855..15565c5c 100644 --- a/qt/i2pd_qt/i2pd_qt.pro +++ b/qt/i2pd_qt/i2pd_qt.pro @@ -6,9 +6,7 @@ TARGET = i2pd_qt TEMPLATE = app QMAKE_CXXFLAGS *= -std=c++11 -Wno-unused-parameter -Wno-maybe-uninitialized -# For now, disable UPnP which currently crashes in UPnP::Stop() -- https://github.com/PurpleI2P/i2pd/issues/1387 -#DEFINES += USE_UPNP -DEFINES -= USE_UPNP +DEFINES += USE_UPNP CONFIG(debug, debug|release) { message(Debug build) From b7f17d4cb1567286452baa62a25533d37a8eb7ae Mon Sep 17 00:00:00 2001 From: orignal Date: Fri, 6 Sep 2019 11:02:19 -0400 Subject: [PATCH 05/12] client auth flag for B33 address --- daemon/HTTPServer.cpp | 2 +- libi2pd/Blinding.cpp | 18 ++++++++++++++---- libi2pd/Blinding.h | 3 ++- libi2pd/Destination.cpp | 35 ++++++++++++++++++++++------------- libi2pd/Destination.h | 7 ++++--- 5 files changed, 43 insertions(+), 22 deletions(-) diff --git a/daemon/HTTPServer.cpp b/daemon/HTTPServer.cpp index 38b53ff3..7dc6a9d2 100644 --- a/daemon/HTTPServer.cpp +++ b/daemon/HTTPServer.cpp @@ -356,7 +356,7 @@ namespace http { s << dest->GetIdentity ()->ToBase64 () << "
\r\n
\r\n"; if (dest->IsEncryptedLeaseSet ()) { - i2p::data::BlindedPublicKey blinded (dest->GetIdentity ()); + i2p::data::BlindedPublicKey blinded (dest->GetIdentity (), dest->IsPerClientAuth ()); s << "
\r\n\r\n

\r\n"; s << blinded.ToB33 () << ".b32.i2p
\r\n"; s << "

\r\n
\r\n"; diff --git a/libi2pd/Blinding.cpp b/libi2pd/Blinding.cpp index e51c0fcc..6bf11c9e 100644 --- a/libi2pd/Blinding.cpp +++ b/libi2pd/Blinding.cpp @@ -124,8 +124,14 @@ namespace data return publicKeyLength; } +//---------------------------------------------------------- - BlindedPublicKey::BlindedPublicKey (std::shared_ptr identity) + const uint8_t B33_TWO_BYTES_SIGTYPE_FLAG = 0x01; + const uint8_t B33_PER_SECRET_FLAG = 0x02; // not used for now + const uint8_t B33_PER_CLIENT_AUTH_FLAG = 0x04; + + BlindedPublicKey::BlindedPublicKey (std::shared_ptr identity, bool clientAuth): + m_IsClientAuth (clientAuth) { if (!identity) return; auto len = identity->GetSigningPublicKeyLen (); @@ -147,9 +153,9 @@ namespace data uint32_t checksum = crc32 (0, addr + 3, l - 3); // checksum is Little Endian addr[0] ^= checksum; addr[1] ^= (checksum >> 8); addr[2] ^= (checksum >> 16); - uint8_t flag = addr[0]; + uint8_t flags = addr[0]; size_t offset = 1; - if (flag & 0x01) // two bytes signatures + if (flags & B33_TWO_BYTES_SIGTYPE_FLAG) // two bytes signatures { m_SigType = bufbe16toh (addr + offset); offset += 2; m_BlindedSigType = bufbe16toh (addr + offset); offset += 2; @@ -159,6 +165,8 @@ namespace data m_SigType = addr[offset]; offset++; m_BlindedSigType = addr[offset]; offset++; } + m_IsClientAuth = flags & B33_PER_CLIENT_AUTH_FLAG; + std::unique_ptr blindedVerifier (i2p::data::IdentityEx::CreateVerifier (m_SigType)); if (blindedVerifier) { @@ -179,7 +187,9 @@ namespace data { if (m_PublicKey.size () > 32) return ""; // assume 25519 uint8_t addr[35]; char str[60]; // TODO: define actual length - addr[0] = 0; // flags + uint8_t flags = 0; + if (m_IsClientAuth) flags |= B33_PER_CLIENT_AUTH_FLAG; + addr[0] = flags; // flags addr[1] = m_SigType; // sig type addr[2] = m_BlindedSigType; // blinded sig type memcpy (addr + 3, m_PublicKey.data (), m_PublicKey.size ()); diff --git a/libi2pd/Blinding.h b/libi2pd/Blinding.h index 9a3fe633..9d274fd0 100644 --- a/libi2pd/Blinding.h +++ b/libi2pd/Blinding.h @@ -14,7 +14,7 @@ namespace data { public: - BlindedPublicKey (std::shared_ptr identity); + BlindedPublicKey (std::shared_ptr identity, bool clientAuth = false); BlindedPublicKey (const std::string& b33); // from b33 without .b32.i2p std::string ToB33 () const; @@ -38,6 +38,7 @@ namespace data std::vector m_PublicKey; i2p::data::SigningKeyType m_SigType, m_BlindedSigType; + bool m_IsClientAuth = false; }; } } diff --git a/libi2pd/Destination.cpp b/libi2pd/Destination.cpp index 34ff374f..ca60f0fb 100644 --- a/libi2pd/Destination.cpp +++ b/libi2pd/Destination.cpp @@ -17,7 +17,7 @@ namespace client m_IsRunning (false), m_Thread (nullptr), m_IsPublic (isPublic), m_PublishReplyToken (0), m_LastSubmissionTime (0), m_PublishConfirmationTimer (m_Service), m_PublishVerificationTimer (m_Service), m_PublishDelayTimer (m_Service), m_CleanupTimer (m_Service), - m_LeaseSetType (DEFAULT_LEASESET_TYPE) + m_LeaseSetType (DEFAULT_LEASESET_TYPE), m_AuthType (i2p::data::ENCRYPTED_LEASESET_AUTH_TYPE_NONE) { int inLen = DEFAULT_INBOUND_TUNNEL_LENGTH; int inQty = DEFAULT_INBOUND_TUNNELS_QUANTITY; @@ -70,6 +70,19 @@ namespace client it = params->find (I2CP_PARAM_LEASESET_TYPE); if (it != params->end ()) m_LeaseSetType = std::stoi(it->second); + if (m_LeaseSetType == i2p::data::NETDB_STORE_TYPE_ENCRYPTED_LEASESET2) + { + // authentication for encrypted LeaseSet + it = params->find (I2CP_PARAM_LEASESET_AUTH_TYPE); + if (it != params->end ()) + { + auto authType = std::stoi (it->second); + if (authType >= i2p::data::ENCRYPTED_LEASESET_AUTH_TYPE_NONE && authType <= i2p::data::ENCRYPTED_LEASESET_AUTH_TYPE_PSK) + m_AuthType = authType; + else + LogPrint (eLogError, "Destination: Unknown auth type ", authType); + } + } it = params->find (I2CP_PARAM_LEASESET_PRIV_KEY); if (it != params->end ()) { @@ -846,7 +859,7 @@ namespace client ClientDestination::ClientDestination (const i2p::data::PrivateKeys& keys, bool isPublic, const std::map * params): LeaseSetDestination (isPublic, params), m_Keys (keys), m_StreamingAckDelay (DEFAULT_INITIAL_ACK_DELAY), m_DatagramDestination (nullptr), m_RefCounter (0), - m_ReadyChecker(GetService()), m_AuthType (i2p::data::ENCRYPTED_LEASESET_AUTH_TYPE_NONE) + m_ReadyChecker(GetService()) { if (keys.IsOfflineSignature () && GetLeaseSetType () == i2p::data::NETDB_STORE_TYPE_LEASESET) SetLeaseSetType (i2p::data::NETDB_STORE_TYPE_STANDARD_LEASESET2); // offline keys can be published with LS2 only @@ -880,25 +893,21 @@ namespace client if (GetLeaseSetType () == i2p::data::NETDB_STORE_TYPE_ENCRYPTED_LEASESET2) { // authentication for encrypted LeaseSet - it = params->find (I2CP_PARAM_LEASESET_AUTH_TYPE); - m_AuthType = std::stoi (it->second); - if (m_AuthType > 0) + auto authType = GetAuthType (); + if (authType > 0) { m_AuthKeys = std::make_shared >(); - if (m_AuthType == i2p::data::ENCRYPTED_LEASESET_AUTH_TYPE_DH) + if (authType == i2p::data::ENCRYPTED_LEASESET_AUTH_TYPE_DH) ReadAuthKey (I2CP_PARAM_LEASESET_CLIENT_DH, params); - else if (m_AuthType == i2p::data::ENCRYPTED_LEASESET_AUTH_TYPE_PSK) + else if (authType == i2p::data::ENCRYPTED_LEASESET_AUTH_TYPE_PSK) ReadAuthKey (I2CP_PARAM_LEASESET_CLIENT_PSK, params); else - { - LogPrint (eLogError, "Destination: Unexpected auth type ", m_AuthType); - m_AuthType = 0; - } + LogPrint (eLogError, "Destination: Unexpected auth type ", authType); if (m_AuthKeys->size ()) LogPrint (eLogInfo, "Destination: ", m_AuthKeys->size (), " auth keys read"); else { - LogPrint (eLogError, "Destination: No auth keys read for auth type ", m_AuthType); + LogPrint (eLogError, "Destination: No auth keys read for auth type ", authType); m_AuthKeys = nullptr; } } @@ -1184,7 +1193,7 @@ namespace client auto ls2 = std::make_shared (i2p::data::NETDB_STORE_TYPE_STANDARD_LEASESET2, m_Keys, m_EncryptionKeyType, keyLen, m_EncryptionPublicKey, tunnels, IsPublic (), isPublishedEncrypted); if (isPublishedEncrypted) // encrypt if type 5 - ls2 = std::make_shared (ls2, m_Keys, m_AuthType, m_AuthKeys); + ls2 = std::make_shared (ls2, m_Keys, GetAuthType (), m_AuthKeys); leaseSet = ls2; } SetLeaseSet (leaseSet); diff --git a/libi2pd/Destination.h b/libi2pd/Destination.h index 148a6101..a32d3ed1 100644 --- a/libi2pd/Destination.h +++ b/libi2pd/Destination.h @@ -134,6 +134,7 @@ namespace client void SetLeaseSet (std::shared_ptr newLeaseSet); int GetLeaseSetType () const { return m_LeaseSetType; }; void SetLeaseSetType (int leaseSetType) { m_LeaseSetType = leaseSetType; }; + int GetAuthType () const { return m_AuthType; }; bool IsPublic () const { return m_IsPublic; }; virtual void CleanupDestination () {}; // additional clean up in derived classes // I2CP @@ -179,7 +180,7 @@ namespace client boost::asio::deadline_timer m_PublishConfirmationTimer, m_PublishVerificationTimer, m_PublishDelayTimer, m_CleanupTimer; std::string m_Nickname; - int m_LeaseSetType; + int m_LeaseSetType, m_AuthType; std::unique_ptr > m_LeaseSetPrivKey; // non-null if presented public: @@ -188,6 +189,7 @@ namespace client int GetNumRemoteLeaseSets () const { return m_RemoteLeaseSets.size (); }; const decltype(m_RemoteLeaseSets)& GetLeaseSets () const { return m_RemoteLeaseSets; }; bool IsEncryptedLeaseSet () const { return m_LeaseSetType == i2p::data::NETDB_STORE_TYPE_ENCRYPTED_LEASESET2; }; + bool IsPerClientAuth () const { return m_AuthType > 0; }; }; class ClientDestination: public LeaseSetDestination @@ -270,8 +272,7 @@ namespace client boost::asio::deadline_timer m_ReadyChecker; - int m_AuthType; - std::shared_ptr > m_AuthKeys; + std::shared_ptr > m_AuthKeys; // we don't need them for I2CP public: From 9a7aed20e947f7c9836e0deea47c6362f2d35368 Mon Sep 17 00:00:00 2001 From: orignal Date: Thu, 19 Sep 2019 16:54:23 -0400 Subject: [PATCH 06/12] handle error for SessionConfrimed send --- libi2pd/NTCP2.cpp | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/libi2pd/NTCP2.cpp b/libi2pd/NTCP2.cpp index 6d235abe..12b4605f 100644 --- a/libi2pd/NTCP2.cpp +++ b/libi2pd/NTCP2.cpp @@ -602,20 +602,29 @@ namespace transport void NTCP2Session::HandleSessionConfirmedSent (const boost::system::error_code& ecode, std::size_t bytes_transferred) { - LogPrint (eLogDebug, "NTCP2: SessionConfirmed sent"); - KeyDerivationFunctionDataPhase (); - // Alice data phase keys - m_SendKey = m_Kab; - m_ReceiveKey = m_Kba; - SetSipKeys (m_Sipkeysab, m_Sipkeysba); - memcpy (m_ReceiveIV.buf, m_Sipkeysba + 16, 8); - memcpy (m_SendIV.buf, m_Sipkeysab + 16, 8); - Established (); - ReceiveLength (); + (void) bytes_transferred; + if (ecode) + { + LogPrint (eLogWarning, "NTCP2: couldn't send SessionConfirmed message: ", ecode.message ()); + Terminate (); + } + else + { + LogPrint (eLogDebug, "NTCP2: SessionConfirmed sent"); + KeyDerivationFunctionDataPhase (); + // Alice data phase keys + m_SendKey = m_Kab; + m_ReceiveKey = m_Kba; + SetSipKeys (m_Sipkeysab, m_Sipkeysba); + memcpy (m_ReceiveIV.buf, m_Sipkeysba + 16, 8); + memcpy (m_SendIV.buf, m_Sipkeysab + 16, 8); + Established (); + ReceiveLength (); - // TODO: remove - // m_SendQueue.push_back (CreateDeliveryStatusMsg (1)); - // SendQueue (); + // TODO: remove + // m_SendQueue.push_back (CreateDeliveryStatusMsg (1)); + // SendQueue (); + } } void NTCP2Session::HandleSessionCreatedSent (const boost::system::error_code& ecode, std::size_t bytes_transferred) From 03a861745ba35cab857b04a036add9a651501360 Mon Sep 17 00:00:00 2001 From: orignal Date: Fri, 20 Sep 2019 20:09:25 -0400 Subject: [PATCH 07/12] removed CloseSession --- libi2pd/Transports.cpp | 22 ---------------------- libi2pd/Transports.h | 2 -- 2 files changed, 24 deletions(-) diff --git a/libi2pd/Transports.cpp b/libi2pd/Transports.cpp index a2783f6c..93db02d8 100644 --- a/libi2pd/Transports.cpp +++ b/libi2pd/Transports.cpp @@ -503,28 +503,6 @@ namespace transport } } } - - void Transports::CloseSession (std::shared_ptr router) - { - if (!router) return; - m_Service->post (std::bind (&Transports::PostCloseSession, this, router)); - } - - void Transports::PostCloseSession (std::shared_ptr router) - { - auto ssuSession = m_SSUServer ? m_SSUServer->FindSession (router) : nullptr; - if (ssuSession) // try SSU first - { - m_SSUServer->DeleteSession (ssuSession); - LogPrint (eLogDebug, "Transports: SSU session closed"); - } - auto ntcpSession = m_NTCPServer ? m_NTCPServer->FindNTCPSession(router->GetIdentHash()) : nullptr; - if (ntcpSession) // try deleting ntcp session too - { - ntcpSession->Terminate (); - LogPrint(eLogDebug, "Transports: NTCP session closed"); - } - } void Transports::DetectExternalIP () { diff --git a/libi2pd/Transports.h b/libi2pd/Transports.h index 798c90a9..117092ad 100644 --- a/libi2pd/Transports.h +++ b/libi2pd/Transports.h @@ -92,7 +92,6 @@ namespace transport void SendMessage (const i2p::data::IdentHash& ident, std::shared_ptr msg); void SendMessages (const i2p::data::IdentHash& ident, const std::vector >& msgs); - void CloseSession (std::shared_ptr router); void PeerConnected (std::shared_ptr session); void PeerDisconnected (std::shared_ptr session); @@ -131,7 +130,6 @@ namespace transport void RequestComplete (std::shared_ptr r, const i2p::data::IdentHash& ident); void HandleRequestComplete (std::shared_ptr r, i2p::data::IdentHash ident); void PostMessages (i2p::data::IdentHash ident, std::vector > msgs); - void PostCloseSession (std::shared_ptr router); bool ConnectToPeer (const i2p::data::IdentHash& ident, Peer& peer); void HandlePeerCleanupTimer (const boost::system::error_code& ecode); void HandlePeerTestTimer (const boost::system::error_code& ecode); From d6b1d0d4fb12440c4ba02939e588090cc88b634c Mon Sep 17 00:00:00 2001 From: orignal Date: Sun, 22 Sep 2019 21:01:34 -0400 Subject: [PATCH 08/12] remove incoming session from pending list when established --- libi2pd/NTCP2.cpp | 6 ++++-- libi2pd/NTCP2.h | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/libi2pd/NTCP2.cpp b/libi2pd/NTCP2.cpp index 12b4605f..9918efbc 100644 --- a/libi2pd/NTCP2.cpp +++ b/libi2pd/NTCP2.cpp @@ -719,7 +719,7 @@ namespace transport // ready to communicate auto existing = i2p::data::netdb.FindRouter (ri.GetRouterIdentity ()->GetIdentHash ()); // check if exists already SetRemoteIdentity (existing ? existing->GetRouterIdentity () : ri.GetRouterIdentity ()); - m_Server.AddNTCP2Session (shared_from_this ()); + m_Server.AddNTCP2Session (shared_from_this (), true); Established (); ReceiveLength (); } @@ -1258,7 +1258,7 @@ namespace transport } } - bool NTCP2Server::AddNTCP2Session (std::shared_ptr session) + bool NTCP2Server::AddNTCP2Session (std::shared_ptr session, bool incoming) { if (!session || !session->GetRemoteIdentity ()) return false; auto& ident = session->GetRemoteIdentity ()->GetIdentHash (); @@ -1270,6 +1270,8 @@ namespace transport return false; } m_NTCP2Sessions.insert (std::make_pair (ident, session)); + if (incoming) + m_PendingIncomingSessions.remove (session); return true; } diff --git a/libi2pd/NTCP2.h b/libi2pd/NTCP2.h index 2bfc72b9..10f4f483 100644 --- a/libi2pd/NTCP2.h +++ b/libi2pd/NTCP2.h @@ -227,7 +227,7 @@ namespace transport void Start (); void Stop (); - bool AddNTCP2Session (std::shared_ptr session); + bool AddNTCP2Session (std::shared_ptr session, bool incoming = false); void RemoveNTCP2Session (std::shared_ptr session); std::shared_ptr FindNTCP2Session (const i2p::data::IdentHash& ident); From c2f47119ceb4eadc11d3f91959ab4f25c27dbd6c Mon Sep 17 00:00:00 2001 From: orignal Date: Mon, 23 Sep 2019 13:42:15 -0400 Subject: [PATCH 09/12] fixed #1424. Check if .b32.i2p address string is valid --- libi2pd/Blinding.cpp | 3 ++- libi2pd/Blinding.h | 1 + libi2pd_client/AddressBook.cpp | 15 ++++++++++----- libi2pd_client/AddressBook.h | 3 ++- 4 files changed, 15 insertions(+), 7 deletions(-) diff --git a/libi2pd/Blinding.cpp b/libi2pd/Blinding.cpp index 6bf11c9e..8d3f4b40 100644 --- a/libi2pd/Blinding.cpp +++ b/libi2pd/Blinding.cpp @@ -141,7 +141,8 @@ namespace data m_BlindedSigType = m_SigType; } - BlindedPublicKey::BlindedPublicKey (const std::string& b33) + BlindedPublicKey::BlindedPublicKey (const std::string& b33): + m_SigType (0) // 0 means invalid, we can't blind DSA, set it later { uint8_t addr[40]; // TODO: define length from b33 size_t l = i2p::data::Base32ToByteStream (b33.c_str (), b33.length (), addr, 40); diff --git a/libi2pd/Blinding.h b/libi2pd/Blinding.h index 9d274fd0..65b8c0f8 100644 --- a/libi2pd/Blinding.h +++ b/libi2pd/Blinding.h @@ -22,6 +22,7 @@ namespace data size_t GetPublicKeyLen () const { return m_PublicKey.size (); }; SigningKeyType GetSigType () const { return m_SigType; }; SigningKeyType GetBlindedSigType () const { return m_BlindedSigType; }; + bool IsValid () const { return GetSigType (); }; // signature type 0 means invalid void GetSubcredential (const uint8_t * blinded, size_t len, uint8_t * subcredential) const; // 32 bytes size_t GetBlindedKey (const char * date, uint8_t * blindedKey) const; // date is 8 chars "YYYYMMDD", return public key length diff --git a/libi2pd_client/AddressBook.cpp b/libi2pd_client/AddressBook.cpp index 14ed89a7..0e40c76e 100644 --- a/libi2pd_client/AddressBook.cpp +++ b/libi2pd_client/AddressBook.cpp @@ -237,17 +237,19 @@ namespace client //--------------------------------------------------------------------- - Address::Address (const std::string& b32) + Address::Address (const std::string& b32): + addressType (eAddressInvalid) { if (b32.length () <= B33_ADDRESS_THRESHOLD) { - addressType = eAddressIndentHash; - identHash.FromBase32 (b32); + if (identHash.FromBase32 (b32) > 0) + addressType = eAddressIndentHash; } else { - addressType = eAddressBlindedPublicKey; blindedPublicKey = std::make_shared(b32); + if (blindedPublicKey->IsValid ()) + addressType = eAddressBlindedPublicKey; } } @@ -320,7 +322,10 @@ namespace client { auto pos = address.find(".b32.i2p"); if (pos != std::string::npos) - return std::make_shared(address.substr (0, pos)); + { + auto addr = std::make_shared(address.substr (0, pos)); + return addr->IsValid () ? addr : nullptr; + } else { pos = address.find (".i2p"); diff --git a/libi2pd_client/AddressBook.h b/libi2pd_client/AddressBook.h index 47ad9993..82ba167b 100644 --- a/libi2pd_client/AddressBook.h +++ b/libi2pd_client/AddressBook.h @@ -33,13 +33,14 @@ namespace client struct Address { - enum { eAddressIndentHash, eAddressBlindedPublicKey } addressType; + enum { eAddressIndentHash, eAddressBlindedPublicKey, eAddressInvalid } addressType; i2p::data::IdentHash identHash; std::shared_ptr blindedPublicKey; Address (const std::string& b32); Address (const i2p::data::IdentHash& hash); bool IsIdentHash () const { return addressType == eAddressIndentHash; }; + bool IsValid () const { return addressType != eAddressInvalid; }; }; inline std::string GetB32Address(const i2p::data::IdentHash& ident) { return ident.ToBase32().append(".b32.i2p"); } From 28aac6f93bf5d5299ebae9b39fbb34a747f4802b Mon Sep 17 00:00:00 2001 From: R4SAS Date: Mon, 7 Oct 2019 21:18:46 +0300 Subject: [PATCH 10/12] fix bogus date in changelogs Signed-off-by: R4SAS --- contrib/rpm/i2pd.spec | 2 +- debian/changelog | 2 +- qt/i2pd_qt/data/website.i2pd.i2pd.appdata.xml | 44 +++++++++---------- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/contrib/rpm/i2pd.spec b/contrib/rpm/i2pd.spec index 61271680..e18d1427 100644 --- a/contrib/rpm/i2pd.spec +++ b/contrib/rpm/i2pd.spec @@ -130,7 +130,7 @@ getent passwd i2pd >/dev/null || \ - update to 2.22.0 - add support of tunnelsdir option -* Thu Oct 22 2018 orignal - 2.21.1 +* Mon Oct 22 2018 orignal - 2.21.1 - update to 2.21.1 * Thu Oct 4 2018 orignal - 2.21.0 diff --git a/debian/changelog b/debian/changelog index 4a6fbfd8..2e88d9e3 100644 --- a/debian/changelog +++ b/debian/changelog @@ -48,7 +48,7 @@ i2pd (2.21.1-1) unstable; urgency=medium * updated to version 2.21.1 - -- orignal Thu, 22 Oct 2018 16:00:00 +0000 + -- orignal Mon, 22 Oct 2018 16:00:00 +0000 i2pd (2.21.0-1) unstable; urgency=medium diff --git a/qt/i2pd_qt/data/website.i2pd.i2pd.appdata.xml b/qt/i2pd_qt/data/website.i2pd.i2pd.appdata.xml index 65683584..5227655e 100644 --- a/qt/i2pd_qt/data/website.i2pd.i2pd.appdata.xml +++ b/qt/i2pd_qt/data/website.i2pd.i2pd.appdata.xml @@ -8,19 +8,19 @@ i2pd Invisible Internet -

i2pd (I2P Daemon) is a full-featured C++ implementation of I2P client.

-

I2P (Invisible Internet Protocol) is a universal anonymous network layer. - All communications over I2P are anonymous and end-to-end encrypted, participants - don't reveal their real IP addresses.

-

I2P allows people from all around the world to communicate and share information - without restrictions.

-

Features:

-
    -
  • Distributed anonymous networking framework
  • -
  • End-to-end encrypted communications
  • -
  • Small footprint, simple dependencies, fast performance
  • -
  • Rich set of APIs for developers of secure applications
  • -
+

i2pd (I2P Daemon) is a full-featured C++ implementation of I2P client.

+

I2P (Invisible Internet Protocol) is a universal anonymous network layer. + All communications over I2P are anonymous and end-to-end encrypted, participants + don't reveal their real IP addresses.

+

I2P allows people from all around the world to communicate and share information + without restrictions.

+

Features:

+
    +
  • Distributed anonymous networking framework
  • +
  • End-to-end encrypted communications
  • +
  • Small footprint, simple dependencies, fast performance
  • +
  • Rich set of APIs for developers of secure applications
  • +
@@ -35,15 +35,15 @@ - - - - - - - - - + + + + + + + + + From dfdd76a1bb0fa5b616f116f428e1e72cb9ed1818 Mon Sep 17 00:00:00 2001 From: orignal Date: Tue, 15 Oct 2019 10:32:29 -0400 Subject: [PATCH 11/12] fixed #1429. Don't use monotonic timer for Win32 --- libi2pd/RouterContext.cpp | 10 ++++++++++ libi2pd/RouterContext.h | 4 ++++ 2 files changed, 14 insertions(+) diff --git a/libi2pd/RouterContext.cpp b/libi2pd/RouterContext.cpp index 5ac26f7c..3323de87 100644 --- a/libi2pd/RouterContext.cpp +++ b/libi2pd/RouterContext.cpp @@ -27,7 +27,12 @@ namespace i2p void RouterContext::Init () { srand (i2p::util::GetMillisecondsSinceEpoch () % 1000); +#ifdef WIN32 + // for compatibility with WinXP + m_StartupTime = i2p::util::GetSecondsSinceEpoch (); +#else m_StartupTime = std::chrono::steady_clock::now(); +#endif if (!Load ()) CreateNewRouter (); m_Decryptor = m_Keys.CreateDecryptor (nullptr); @@ -716,7 +721,12 @@ namespace i2p uint32_t RouterContext::GetUptime () const { +#ifdef WIN32 + // for compatibility with WinXP + return i2p::util::GetSecondsSinceEpoch () - m_StartupTime; +#else return std::chrono::duration_cast (std::chrono::steady_clock::now() - m_StartupTime).count (); +#endif } bool RouterContext::Decrypt (const uint8_t * encrypted, uint8_t * data, BN_CTX * ctx) const diff --git a/libi2pd/RouterContext.h b/libi2pd/RouterContext.h index fc4b90dc..9385e11f 100644 --- a/libi2pd/RouterContext.h +++ b/libi2pd/RouterContext.h @@ -137,7 +137,11 @@ namespace i2p std::shared_ptr m_Decryptor; uint64_t m_LastUpdateTime; // in seconds bool m_AcceptsTunnels, m_IsFloodfill; +#ifdef WIN32 + uint64_t m_StartupTime = 0; // in seconds since epoch +#else std::chrono::time_point m_StartupTime; +#endif uint64_t m_BandwidthLimit; // allowed bandwidth int m_ShareRatio; RouterStatus m_Status; From a7e8dd04feb00d9ede8010f4bcba0e289a5b3469 Mon Sep 17 00:00:00 2001 From: orignal Date: Mon, 21 Oct 2019 11:50:59 -0400 Subject: [PATCH 12/12] 2.29.0 --- ChangeLog | 10 ++++++++++ Win32/installer.iss | 2 +- android/build.gradle | 4 ++-- appveyor.yml | 2 +- contrib/rpm/i2pd-git.spec | 5 ++++- contrib/rpm/i2pd.spec | 5 ++++- debian/changelog | 6 ++++++ libi2pd/version.h | 4 ++-- qt/i2pd_qt/data/website.i2pd.i2pd.appdata.xml | 1 + 9 files changed, 31 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index 980ae537..0afe2316 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,16 @@ # for this file format description, # see https://github.com/olivierlacan/keep-a-changelog +## [2.29.0] - 2019-10-21 +### Added +- Client auth flag for b33 address +### Changed +- Remove incoming NTCP2 session from pending list when established +- Handle errors for NTCP2 SessionConfrimed send +### Fixed +- Failure to start on Windows XP +- SAM crash if invalid lookup address + ## [2.28.0] - 2019-08-27 ### Added - RAW datagrams in SAM diff --git a/Win32/installer.iss b/Win32/installer.iss index 4c78bb6a..736c7038 100644 --- a/Win32/installer.iss +++ b/Win32/installer.iss @@ -1,5 +1,5 @@ #define I2Pd_AppName "i2pd" -#define I2Pd_ver "2.28.0" +#define I2Pd_ver "2.29.0" #define I2Pd_Publisher "PurpleI2P" [Setup] diff --git a/android/build.gradle b/android/build.gradle index 441f6be8..291d90ea 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -30,8 +30,8 @@ android { applicationId "org.purplei2p.i2pd" targetSdkVersion 29 minSdkVersion 14 - versionCode 2280 - versionName "2.28.0" + versionCode 2290 + versionName "2.29.0" ndk { abiFilters 'armeabi-v7a' abiFilters 'x86' diff --git a/appveyor.yml b/appveyor.yml index 67693ac3..fe827ec5 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -version: 2.28.0.{build} +version: 2.29.0.{build} pull_requests: do_not_increment_build_number: true branches: diff --git a/contrib/rpm/i2pd-git.spec b/contrib/rpm/i2pd-git.spec index ed4bad86..31b8d4a5 100644 --- a/contrib/rpm/i2pd-git.spec +++ b/contrib/rpm/i2pd-git.spec @@ -1,7 +1,7 @@ %define git_hash %(git rev-parse HEAD | cut -c -7) Name: i2pd-git -Version: 2.28.0 +Version: 2.29.0 Release: git%{git_hash}%{?dist} Summary: I2P router written in C++ Conflicts: i2pd @@ -110,6 +110,9 @@ getent passwd i2pd >/dev/null || \ %changelog +* Mon Oct 21 2019 orignal - 2.29.0 +- update to 2.29.0 + * Tue Aug 27 2019 orignal - 2.28.0 - update to 2.28.0 diff --git a/contrib/rpm/i2pd.spec b/contrib/rpm/i2pd.spec index e18d1427..3db99af0 100644 --- a/contrib/rpm/i2pd.spec +++ b/contrib/rpm/i2pd.spec @@ -1,5 +1,5 @@ Name: i2pd -Version: 2.28.0 +Version: 2.29.0 Release: 1%{?dist} Summary: I2P router written in C++ Conflicts: i2pd-git @@ -108,6 +108,9 @@ getent passwd i2pd >/dev/null || \ %changelog +* Mon Oct 21 2019 orignal - 2.29.0 +- update to 2.29.0 + * Tue Aug 27 2019 orignal - 2.28.0 - update to 2.28.0 diff --git a/debian/changelog b/debian/changelog index 2e88d9e3..f5f98680 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +i2pd (2.29.0-1) unstable; urgency=medium + + * updated to version 2.29.0/0.9.43 + + -- orignal Mon, 21 Oct 2019 16:00:00 +0000 + i2pd (2.28.0-1) unstable; urgency=medium * updated to version 2.28.0/0.9.42 diff --git a/libi2pd/version.h b/libi2pd/version.h index 1c08a362..3b69a658 100644 --- a/libi2pd/version.h +++ b/libi2pd/version.h @@ -7,7 +7,7 @@ #define MAKE_VERSION(a,b,c) STRINGIZE(a) "." STRINGIZE(b) "." STRINGIZE(c) #define I2PD_VERSION_MAJOR 2 -#define I2PD_VERSION_MINOR 28 +#define I2PD_VERSION_MINOR 29 #define I2PD_VERSION_MICRO 0 #define I2PD_VERSION_PATCH 0 #define I2PD_VERSION MAKE_VERSION(I2PD_VERSION_MAJOR, I2PD_VERSION_MINOR, I2PD_VERSION_MICRO) @@ -21,7 +21,7 @@ #define I2P_VERSION_MAJOR 0 #define I2P_VERSION_MINOR 9 -#define I2P_VERSION_MICRO 42 +#define I2P_VERSION_MICRO 43 #define I2P_VERSION_PATCH 0 #define I2P_VERSION MAKE_VERSION(I2P_VERSION_MAJOR, I2P_VERSION_MINOR, I2P_VERSION_MICRO) diff --git a/qt/i2pd_qt/data/website.i2pd.i2pd.appdata.xml b/qt/i2pd_qt/data/website.i2pd.i2pd.appdata.xml index 5227655e..2c30a2d6 100644 --- a/qt/i2pd_qt/data/website.i2pd.i2pd.appdata.xml +++ b/qt/i2pd_qt/data/website.i2pd.i2pd.appdata.xml @@ -35,6 +35,7 @@ +