From 7b00d828b2b26862920542f7dd428793869931ce Mon Sep 17 00:00:00 2001 From: Jeff Becker Date: Mon, 1 Jan 2018 08:28:42 -0500 Subject: [PATCH 01/92] fix lambda capture, don't capture copy --- libi2pd/Streaming.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libi2pd/Streaming.h b/libi2pd/Streaming.h index 93cf2a9f..6c933752 100644 --- a/libi2pd/Streaming.h +++ b/libi2pd/Streaming.h @@ -334,7 +334,7 @@ namespace stream void Stream::AsyncReceive (const Buffer& buffer, ReceiveHandler handler, int timeout) { auto s = shared_from_this(); - m_Service.post ([=](void) + m_Service.post ([s, buffer, handler, timeout](void) { if (!s->m_ReceiveQueue.empty () || s->m_Status == eStreamStatusReset) s->HandleReceiveTimer (boost::asio::error::make_error_code (boost::asio::error::operation_aborted), buffer, handler, 0); From 938d5d901ace83d785cd546d74c068aa6a3f002b Mon Sep 17 00:00:00 2001 From: Jeff Becker Date: Tue, 2 Jan 2018 11:34:58 -0500 Subject: [PATCH 02/92] implement i2cp session reconfigure --- libi2pd/Destination.cpp | 40 ++++++++++++++++++++++++++++++ libi2pd/Destination.h | 4 +++ libi2pd/TunnelPool.cpp | 12 +++++++++ libi2pd/TunnelPool.h | 5 ++++ libi2pd_client/I2CP.cpp | 55 +++++++++++++++++++++++++++++++++++++++-- 5 files changed, 114 insertions(+), 2 deletions(-) diff --git a/libi2pd/Destination.cpp b/libi2pd/Destination.cpp index cb42e480..160b95e6 100644 --- a/libi2pd/Destination.cpp +++ b/libi2pd/Destination.cpp @@ -169,6 +169,46 @@ namespace client return false; } + bool LeaseSetDestination::Reconfigure(std::map params) + { + + auto itr = params.find("i2cp.dontPublishLeaseSet"); + if (itr != params.end()) + { + m_IsPublic = itr->second != "true"; + } + + int inLen, outLen, inQuant, outQuant, numTags, minLatency, maxLatency; + std::map intOpts = { + {I2CP_PARAM_INBOUND_TUNNEL_LENGTH, inLen}, + {I2CP_PARAM_OUTBOUND_TUNNEL_LENGTH, outLen}, + {I2CP_PARAM_INBOUND_TUNNELS_QUANTITY, inQuant}, + {I2CP_PARAM_OUTBOUND_TUNNELS_QUANTITY, outQuant}, + {I2CP_PARAM_TAGS_TO_SEND, numTags}, + {I2CP_PARAM_MIN_TUNNEL_LATENCY, minLatency}, + {I2CP_PARAM_MAX_TUNNEL_LATENCY, maxLatency} + }; + + auto pool = GetTunnelPool(); + inLen = pool->GetNumInboundHops(); + outLen = pool->GetNumOutboundHops(); + inQuant = pool->GetNumInboundTunnels(); + outQuant = pool->GetNumOutboundTunnels(); + minLatency = 0; + maxLatency = 0; + + for (auto opt : intOpts) + { + itr = params.find(opt.first); + if(itr != params.end()) + { + opt.second = std::stoi(itr->second); + } + } + pool->RequireLatency(minLatency, maxLatency); + return pool->Reconfigure(inLen, outLen, inQuant, outQuant); + } + std::shared_ptr LeaseSetDestination::FindLeaseSet (const i2p::data::IdentHash& ident) { std::shared_ptr remoteLS; diff --git a/libi2pd/Destination.h b/libi2pd/Destination.h index 17daecb5..f93577e6 100644 --- a/libi2pd/Destination.h +++ b/libi2pd/Destination.h @@ -96,6 +96,10 @@ namespace client virtual bool Start (); virtual bool Stop (); + + /** i2cp reconfigure */ + virtual bool Reconfigure(std::map i2cpOpts); + bool IsRunning () const { return m_IsRunning; }; boost::asio::io_service& GetService () { return m_Service; }; std::shared_ptr GetTunnelPool () { return m_Pool; }; diff --git a/libi2pd/TunnelPool.cpp b/libi2pd/TunnelPool.cpp index a3592708..dd163993 100644 --- a/libi2pd/TunnelPool.cpp +++ b/libi2pd/TunnelPool.cpp @@ -69,6 +69,18 @@ namespace tunnel m_Tests.clear (); } + bool TunnelPool::Reconfigure(int inHops, int outHops, int inQuant, int outQuant) { + if( inHops >= 0 && outHops >= 0 && inQuant > 0 && outQuant > 0) + { + m_NumInboundHops = inHops; + m_NumOutboundHops = outHops; + m_NumInboundTunnels = inQuant; + m_NumOutboundTunnels = outQuant; + return true; + } + return false; + } + void TunnelPool::TunnelCreated (std::shared_ptr createdTunnel) { if (!m_IsActive) return; diff --git a/libi2pd/TunnelPool.h b/libi2pd/TunnelPool.h index 07c3024e..fc46930c 100644 --- a/libi2pd/TunnelPool.h +++ b/libi2pd/TunnelPool.h @@ -78,7 +78,12 @@ namespace tunnel int GetNumInboundTunnels () const { return m_NumInboundTunnels; }; int GetNumOutboundTunnels () const { return m_NumOutboundTunnels; }; + int GetNumInboundHops() const { return m_NumInboundHops; }; + int GetNumOutboundHops() const { return m_NumOutboundHops; }; + /** i2cp reconfigure */ + bool Reconfigure(int inboundHops, int outboundHops, int inboundQuant, int outboundQuant); + void SetCustomPeerSelector(ITunnelPeerSelector * selector); void UnsetCustomPeerSelector(); bool HasCustomPeerSelector(); diff --git a/libi2pd_client/I2CP.cpp b/libi2pd_client/I2CP.cpp index f98b1af3..293f4067 100644 --- a/libi2pd_client/I2CP.cpp +++ b/libi2pd_client/I2CP.cpp @@ -416,8 +416,59 @@ namespace client void I2CPSession::ReconfigureSessionMessageHandler (const uint8_t * buf, size_t len) { - // TODO: implement actual reconfiguration - SendSessionStatusMessage (2); // updated + uint8_t status = 3; // rejected + if(len > sizeof(uint16_t)) + { + uint16_t sessionID = bufbe16toh(buf); + if(sessionID == m_SessionID) + { + buf += sizeof(uint16_t); + const uint8_t * body = buf; + i2p::data::IdentityEx ident; + if(ident.FromBuffer(buf, len - sizeof(uint16_t))) + { + if (ident == *m_Destination->GetIdentity()) + { + size_t identsz = ident.GetFullLen(); + buf += identsz; + uint16_t optssize = bufbe16toh(buf); + if (optssize <= len - sizeof(uint16_t) - sizeof(uint64_t) - identsz - ident.GetSignatureLen() - sizeof(uint16_t)) + { + buf += sizeof(uint16_t); + std::map opts; + ExtractMapping(buf, optssize, opts); + buf += optssize; + //uint64_t date = bufbe64toh(buf); + buf += sizeof(uint64_t); + const uint8_t * sig = buf; + if(ident.Verify(body, len - sizeof(uint16_t), sig)) + { + if(m_Destination->Reconfigure(opts)) + { + LogPrint(eLogInfo, "I2CP: reconfigured destination"); + status = 2; // updated + } + else + LogPrint(eLogWarning, "I2CP: failed to reconfigure destination"); + } + else + LogPrint(eLogError, "I2CP: invalid reconfigure message signature"); + } + else + LogPrint(eLogError, "I2CP: mapping size missmatch"); + } + else + LogPrint(eLogError, "I2CP: destination missmatch"); + } + else + LogPrint(eLogError, "I2CP: malfromed destination"); + } + else + LogPrint(eLogError, "I2CP: session missmatch"); + } + else + LogPrint(eLogError, "I2CP: short message"); + SendSessionStatusMessage (status); } void I2CPSession::SendSessionStatusMessage (uint8_t status) From 254bf313a2e5cbc6fbcff656ea6c4da2c0eea24a Mon Sep 17 00:00:00 2001 From: Jeff Becker Date: Tue, 2 Jan 2018 11:48:38 -0500 Subject: [PATCH 03/92] fix previous commit --- libi2pd_client/I2CP.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libi2pd_client/I2CP.cpp b/libi2pd_client/I2CP.cpp index 293f4067..5717ab50 100644 --- a/libi2pd_client/I2CP.cpp +++ b/libi2pd_client/I2CP.cpp @@ -441,7 +441,7 @@ namespace client //uint64_t date = bufbe64toh(buf); buf += sizeof(uint64_t); const uint8_t * sig = buf; - if(ident.Verify(body, len - sizeof(uint16_t), sig)) + if(ident.Verify(body, len - sizeof(uint16_t) - ident.GetSignatureLen(), sig)) { if(m_Destination->Reconfigure(opts)) { From ab80def94b3c5c53e3a250135922589dbda90d1f Mon Sep 17 00:00:00 2001 From: Jeff Becker Date: Tue, 2 Jan 2018 12:06:10 -0500 Subject: [PATCH 04/92] use reference instead of copy --- libi2pd/Destination.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libi2pd/Destination.cpp b/libi2pd/Destination.cpp index 160b95e6..642be1f9 100644 --- a/libi2pd/Destination.cpp +++ b/libi2pd/Destination.cpp @@ -197,7 +197,7 @@ namespace client minLatency = 0; maxLatency = 0; - for (auto opt : intOpts) + for (auto & opt : intOpts) { itr = params.find(opt.first); if(itr != params.end()) From 1967dee50c48b474979aa6e532f5677182c86d0d Mon Sep 17 00:00:00 2001 From: Jeff Becker Date: Tue, 2 Jan 2018 12:59:16 -0500 Subject: [PATCH 05/92] don't recreate tunnels of different size --- libi2pd/Tunnel.cpp | 11 ++++++++--- libi2pd/TunnelPool.cpp | 28 ++++++++++++++++++---------- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/libi2pd/Tunnel.cpp b/libi2pd/Tunnel.cpp index 6ae1e119..e39c4fd4 100644 --- a/libi2pd/Tunnel.cpp +++ b/libi2pd/Tunnel.cpp @@ -670,10 +670,12 @@ namespace tunnel { if (!tunnel->IsRecreated () && ts + TUNNEL_RECREATION_THRESHOLD > tunnel->GetCreationTime () + TUNNEL_EXPIRATION_TIMEOUT) { - tunnel->SetIsRecreated (); auto pool = tunnel->GetTunnelPool (); - if (pool) + if (pool && tunnel->GetPeers().size() == pool->GetNumOutboundHops()) + { + tunnel->SetIsRecreated (); pool->RecreateOutboundTunnel (tunnel); + } } if (ts + TUNNEL_EXPIRATION_THRESHOLD > tunnel->GetCreationTime () + TUNNEL_EXPIRATION_TIMEOUT) tunnel->SetState (eTunnelStateExpiring); @@ -723,8 +725,11 @@ namespace tunnel { tunnel->SetIsRecreated (); auto pool = tunnel->GetTunnelPool (); - if (pool) + if (pool && tunnel->GetPeers().size() == pool->GetNumInboundHops()) + { + tunnel->SetIsRecreated (); pool->RecreateInboundTunnel (tunnel); + } } if (ts + TUNNEL_EXPIRATION_THRESHOLD > tunnel->GetCreationTime () + TUNNEL_EXPIRATION_TIMEOUT) diff --git a/libi2pd/TunnelPool.cpp b/libi2pd/TunnelPool.cpp index dd163993..7fc2592c 100644 --- a/libi2pd/TunnelPool.cpp +++ b/libi2pd/TunnelPool.cpp @@ -491,11 +491,14 @@ namespace tunnel outboundTunnel = tunnels.GetNextOutboundTunnel (); LogPrint (eLogDebug, "Tunnels: Re-creating destination inbound tunnel..."); std::shared_ptr config; - if (m_NumInboundHops > 0) config = std::make_shared(tunnel->GetPeers ()); - auto newTunnel = tunnels.CreateInboundTunnel (config, outboundTunnel); - newTunnel->SetTunnelPool (shared_from_this()); - if (newTunnel->IsEstablished ()) // zero hops - TunnelCreated (newTunnel); + if (m_NumInboundHops > 0 && tunnel->GetPeers().size() > 0) config = std::make_shared(tunnel->GetPeers ()); + if (m_NumInboundHops == 0 || config) + { + auto newTunnel = tunnels.CreateInboundTunnel (config, outboundTunnel); + newTunnel->SetTunnelPool (shared_from_this()); + if (newTunnel->IsEstablished ()) // zero hops + TunnelCreated (newTunnel); + } } void TunnelPool::CreateOutboundTunnel () @@ -533,12 +536,17 @@ namespace tunnel { LogPrint (eLogDebug, "Tunnels: Re-creating destination outbound tunnel..."); std::shared_ptr config; - if (m_NumOutboundHops > 0) + if (tunnel->GetPeers().size() > 0 && m_NumOutboundHops > 0) + { config = std::make_shared(tunnel->GetPeers (), inboundTunnel->GetNextTunnelID (), inboundTunnel->GetNextIdentHash ()); - auto newTunnel = tunnels.CreateOutboundTunnel (config); - newTunnel->SetTunnelPool (shared_from_this ()); - if (newTunnel->IsEstablished ()) // zero hops - TunnelCreated (newTunnel); + } + if(m_NumOutboundHops == 0 || config) + { + auto newTunnel = tunnels.CreateOutboundTunnel (config); + newTunnel->SetTunnelPool (shared_from_this ()); + if (newTunnel->IsEstablished ()) // zero hops + TunnelCreated (newTunnel); + } } else LogPrint (eLogDebug, "Tunnels: Can't re-create outbound tunnel, no inbound tunnels found"); From 80149342f252c1cb96c50c7835a53da12c9c2adb Mon Sep 17 00:00:00 2001 From: Jeff Becker Date: Wed, 3 Jan 2018 10:02:11 -0500 Subject: [PATCH 06/92] proper bounds check --- libi2pd/Garlic.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/libi2pd/Garlic.cpp b/libi2pd/Garlic.cpp index 3212da01..f9c297f6 100644 --- a/libi2pd/Garlic.cpp +++ b/libi2pd/Garlic.cpp @@ -538,7 +538,7 @@ namespace garlic { case eGarlicDeliveryTypeLocal: LogPrint (eLogDebug, "Garlic: type local"); - if (offset > (int)len) + if (offset > (int)len || offset <= 0) { LogPrint (eLogError, "Garlic: message is too short"); break; @@ -549,7 +549,7 @@ namespace garlic LogPrint (eLogDebug, "Garlic: type destination"); buf += 32; // destination. check it later or for multiple destinations offset = buf1 - buf; - if (offset > (int)len) + if (offset > (int)len || offset <= 0) { LogPrint (eLogError, "Garlic: message is too short"); break; @@ -563,7 +563,7 @@ namespace garlic uint8_t * gwHash = buf; buf += 32; offset = buf1 - buf; - if (offset + 4 > (int)len) + if (offset + 4 > (int)len || offset <= 0) { LogPrint (eLogError, "Garlic: message is too short"); break; @@ -594,7 +594,7 @@ namespace garlic offset = buf1 - buf; if (!from) // received directly { - if (offset > (int)len) + if (offset > (int)len || offset <= 0) { LogPrint (eLogError, "Garlic: message is too short"); break; @@ -609,7 +609,7 @@ namespace garlic default: LogPrint (eLogWarning, "Garlic: unknown delivery type ", (int)deliveryType); } - if (offset > (int)len) + if (offset > (int)len || offset <= 0) { LogPrint (eLogError, "Garlic: message is too short"); break; @@ -619,7 +619,7 @@ namespace garlic buf += 8; // Date buf += 3; // Certificate offset = buf1 - buf; - if (offset > (int)len) + if (offset > (int)len || offset <= 0) { LogPrint (eLogError, "Garlic: clove is too long"); break; From fca2693488823f5b02f770eb2fa08e1ed9461327 Mon Sep 17 00:00:00 2001 From: R4SAS Date: Thu, 1 Feb 2018 01:12:06 +0300 Subject: [PATCH 07/92] add centos/fedora build status --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 40948b34..67b82ceb 100644 --- a/README.md +++ b/README.md @@ -57,6 +57,7 @@ Build instructions: * GNU/Linux x86/x64 - [![Build Status](https://travis-ci.org/PurpleI2P/i2pd.svg?branch=openssl)](https://travis-ci.org/PurpleI2P/i2pd) * Windows - [![Build status](https://ci.appveyor.com/api/projects/status/1908qe4p48ff1x23?svg=true)](https://ci.appveyor.com/project/PurpleI2P/i2pd) * Mac OS X - [![Build Status](https://travis-ci.org/PurpleI2P/i2pd.svg?branch=openssl)](https://travis-ci.org/PurpleI2P/i2pd) +* CentOS / Fedora - [![Build Status](https://copr.fedorainfracloud.org/coprs/supervillain/i2pd/package/i2pd-git/status_image/last_build.png)](https://copr.fedorainfracloud.org/coprs/supervillain/i2pd/package/i2pd-git/) * FreeBSD * Android * iOS From 180730f9cf3138f347f764e598a5880652197d25 Mon Sep 17 00:00:00 2001 From: R4SAS Date: Thu, 1 Feb 2018 19:37:38 +0300 Subject: [PATCH 08/92] fix rpm spec's (#1084) * added spec for git package * fixed double slashes * changed versioning for stable builds --- contrib/rpm/i2pd-git.spec | 103 ++++++++++++++++++++++++++++++++++++++ contrib/rpm/i2pd.spec | 22 ++++---- 2 files changed, 116 insertions(+), 9 deletions(-) create mode 100644 contrib/rpm/i2pd-git.spec diff --git a/contrib/rpm/i2pd-git.spec b/contrib/rpm/i2pd-git.spec new file mode 100644 index 00000000..2bde7289 --- /dev/null +++ b/contrib/rpm/i2pd-git.spec @@ -0,0 +1,103 @@ +%define git_hash %(git rev-parse HEAD | cut -c -7) + +Name: i2pd-git +Version: 2.18.0 +Release: %{git_hash}.git%{?dist} +Summary: I2P router written in C++ +Obsoletes: %{name}-systemd +Conflicts: i2pd + +License: BSD +URL: https://github.com/PurpleI2P/i2pd +Source0: https://github.com/PurpleI2P/i2pd/archive/openssl/i2pd-openssl.tar.gz + +%if 0%{?rhel} == 7 +BuildRequires: cmake3 +%else +BuildRequires: cmake +%endif + +BuildRequires: chrpath +BuildRequires: gcc-c++ +BuildRequires: zlib-devel +BuildRequires: boost-devel +BuildRequires: openssl-devel +BuildRequires: miniupnpc-devel +BuildRequires: systemd-units + +Requires: systemd +Requires(pre): %{_sbindir}/useradd %{_sbindir}/groupadd + +%description +C++ implementation of I2P. + +%prep +%setup -q + + +%build +cd build +%if 0%{?rhel} == 7 +%cmake3 \ + -DWITH_LIBRARY=OFF \ + -DWITH_UPNP=ON \ + -DWITH_HARDENING=ON \ + -DBUILD_SHARED_LIBS:BOOL=OFF +%else +%cmake \ + -DWITH_LIBRARY=OFF \ + -DWITH_UPNP=ON \ + -DWITH_HARDENING=ON \ + -DBUILD_SHARED_LIBS:BOOL=OFF +%endif + +make %{?_smp_mflags} + + +%install +cd build +chrpath -d i2pd +install -D -m 755 i2pd %{buildroot}%{_sbindir}/i2pd +install -D -m 755 %{_builddir}/%{name}-%{version}/contrib/i2pd.conf %{buildroot}%{_sysconfdir}/i2pd/i2pd.conf +install -D -m 755 %{_builddir}/%{name}-%{version}/contrib/tunnels.conf %{buildroot}%{_sysconfdir}/i2pd/tunnels.conf +install -d -m 755 %{buildroot}%{_datadir}/i2pd +%{__cp} -r %{_builddir}/%{name}-%{version}/contrib/certificates/ %{buildroot}%{_datadir}/i2pd/certificates +install -D -m 644 %{_builddir}/%{name}-%{version}/contrib/rpm/i2pd.service %{buildroot}%{_unitdir}/i2pd.service +install -d -m 700 %{buildroot}%{_sharedstatedir}/i2pd +install -d -m 700 %{buildroot}%{_localstatedir}/log/i2pd +ln -s %{_datadir}/%{name}/certificates %{buildroot}%{_sharedstatedir}/i2pd/certificates + + +%pre +getent group i2pd >/dev/null || %{_sbindir}/groupadd -r i2pd +getent passwd i2pd >/dev/null || \ + %{_sbindir}/useradd -r -g i2pd -s %{_sbindir}/nologin \ + -d %{_sharedstatedir}/i2pd -c 'I2P Service' i2pd + + +%post +%systemd_post i2pd.service + + +%preun +%systemd_preun i2pd.service + + +%postun +%systemd_postun_with_restart i2pd.service + + +%files +%doc LICENSE README.md +%{_sbindir}/i2pd +%{_datadir}/i2pd/certificates +%config(noreplace) %{_sysconfdir}/i2pd/* +/%{_unitdir}/i2pd.service +%dir %attr(0700,i2pd,i2pd) %{_localstatedir}/log/i2pd +%dir %attr(0700,i2pd,i2pd) %{_sharedstatedir}/i2pd +%{_sharedstatedir}/i2pd/certificates + + +%changelog +* Thu Feb 01 2018 r4sas - 2.18.0 +- Initial i2pd-git based on i2pd 2.18.0-1 spec \ No newline at end of file diff --git a/contrib/rpm/i2pd.spec b/contrib/rpm/i2pd.spec index 316be961..ba4e3890 100644 --- a/contrib/rpm/i2pd.spec +++ b/contrib/rpm/i2pd.spec @@ -1,10 +1,9 @@ -%define build_timestamp %(date +"%Y%m%d") - Name: i2pd Version: 2.18.0 -Release: %{build_timestamp}git%{?dist} +Release: 1%{?dist} Summary: I2P router written in C++ Obsoletes: %{name}-systemd +Conflicts: i2pd-git License: BSD URL: https://github.com/PurpleI2P/i2pd @@ -59,12 +58,12 @@ chrpath -d i2pd install -D -m 755 i2pd %{buildroot}%{_sbindir}/i2pd install -D -m 755 %{_builddir}/%{name}-%{version}/contrib/i2pd.conf %{buildroot}%{_sysconfdir}/i2pd/i2pd.conf install -D -m 755 %{_builddir}/%{name}-%{version}/contrib/tunnels.conf %{buildroot}%{_sysconfdir}/i2pd/tunnels.conf -install -d -m 755 %{buildroot}/%{_datadir}/i2pd +install -d -m 755 %{buildroot}%{_datadir}/i2pd %{__cp} -r %{_builddir}/%{name}-%{version}/contrib/certificates/ %{buildroot}%{_datadir}/i2pd/certificates -install -D -m 644 %{_builddir}/%{name}-%{version}/contrib/rpm/i2pd.service %{buildroot}/%{_unitdir}/i2pd.service -install -d -m 700 %{buildroot}/%{_sharedstatedir}/i2pd -install -d -m 700 %{buildroot}/%{_localstatedir}/log/i2pd -ln -s %{_datadir}/%{name}/certificates %{buildroot}%{_sharedstatedir}/%{name}/certificates +install -D -m 644 %{_builddir}/%{name}-%{version}/contrib/rpm/i2pd.service %{buildroot}%{_unitdir}/i2pd.service +install -d -m 700 %{buildroot}%{_sharedstatedir}/i2pd +install -d -m 700 %{buildroot}%{_localstatedir}/log/i2pd +ln -s %{_datadir}/%{name}/certificates %{buildroot}%{_sharedstatedir}/i2pd/certificates %pre @@ -98,7 +97,12 @@ getent passwd i2pd >/dev/null || \ %changelog -* Tue Jan 30 2018 orignal > - 2.18.0 +* Thu Feb 01 2018 r4sas - 2.18.0-1 +- Added to conflicts i2pd-git package +- Fixed release versioning +- Fixed paths with double slashes + +* Tue Jan 30 2018 orignal - 2.18.0 - update to 2.18.0 * Sat Jan 27 2018 l-n-s - 2.17.0-1 From 80567312ed83c0221b6adac9f61919d312f4149b Mon Sep 17 00:00:00 2001 From: BOPOHA Date: Thu, 1 Feb 2018 22:11:14 +0100 Subject: [PATCH 09/92] i2pd.spec delete obsoletes tag https://github.com/PurpleI2P/i2pd/pull/1084#issuecomment-362215861 ``` Resolving Dependencies --> Running transaction check ---> Package i2pd.x86_64 0:2.17.0-20171206git.el7.centos will be updated ---> Package i2pd.x86_64 0:2.18.0-1.el7.centos will be obsoleting ---> Package i2pd-systemd.x86_64 0:2.17.0-20171206git.el7.centos will be obsoleted --> Finished Dependency Resolution Dependencies Resolved ========================================================================== Package Arch Version Repository Size ========================================================================== Installing: i2pd x86_64 2.18.0-1.el7.centos vorona-i2pd 915 k replacing i2pd-systemd.x86_64 2.17.0-20171206git.el7.centos Transaction Summary ========================================================================== Install 1 Package Total download size: 915 k Is this ok [y/d/N]: ``` @l-n-s thx, obsoletes tag is unneeded in next release) --- contrib/rpm/i2pd.spec | 1 - 1 file changed, 1 deletion(-) diff --git a/contrib/rpm/i2pd.spec b/contrib/rpm/i2pd.spec index ba4e3890..469740ce 100644 --- a/contrib/rpm/i2pd.spec +++ b/contrib/rpm/i2pd.spec @@ -2,7 +2,6 @@ Name: i2pd Version: 2.18.0 Release: 1%{?dist} Summary: I2P router written in C++ -Obsoletes: %{name}-systemd Conflicts: i2pd-git License: BSD From ce57a130fc885d342f8e6f1354d3b9f59af26bc5 Mon Sep 17 00:00:00 2001 From: BOPOHA Date: Thu, 1 Feb 2018 23:21:20 +0100 Subject: [PATCH 10/92] systemd issue in centos 7 Not working pre-create pid-file dir (/run/i2pd). It fixed with one of this ways: > PermissionsStartOnly=True or > ExecStartPre=/bin/mkdir -p -m 0700 /var/run/i2pd > ExecStartPre=/bin/chown i2pd: /var/run/i2pd First way is prefer because RuntimeDirectory's options already used. --- contrib/rpm/i2pd.service | 1 + 1 file changed, 1 insertion(+) diff --git a/contrib/rpm/i2pd.service b/contrib/rpm/i2pd.service index ec5949ff..8a9c9584 100644 --- a/contrib/rpm/i2pd.service +++ b/contrib/rpm/i2pd.service @@ -5,6 +5,7 @@ After=network.target [Service] User=i2pd Group=i2pd +PermissionsStartOnly=True RuntimeDirectory=i2pd RuntimeDirectoryMode=0700 Type=simple From fbb99911285c46931e543409ac6149f86141efdb Mon Sep 17 00:00:00 2001 From: R4SAS Date: Fri, 2 Feb 2018 10:35:07 +0300 Subject: [PATCH 11/92] remove obsoletes tag for rpm git package --- contrib/rpm/i2pd-git.spec | 1 - 1 file changed, 1 deletion(-) diff --git a/contrib/rpm/i2pd-git.spec b/contrib/rpm/i2pd-git.spec index 2bde7289..b2be3b9f 100644 --- a/contrib/rpm/i2pd-git.spec +++ b/contrib/rpm/i2pd-git.spec @@ -4,7 +4,6 @@ Name: i2pd-git Version: 2.18.0 Release: %{git_hash}.git%{?dist} Summary: I2P router written in C++ -Obsoletes: %{name}-systemd Conflicts: i2pd License: BSD From 4f84d687e413f5945bd12861187ea5af9dd950ec Mon Sep 17 00:00:00 2001 From: yangfl Date: Sat, 3 Feb 2018 02:27:22 +0800 Subject: [PATCH 12/92] add endian detection for glibc --- libi2pd/I2PEndian.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libi2pd/I2PEndian.h b/libi2pd/I2PEndian.h index e5271233..d08e90cb 100644 --- a/libi2pd/I2PEndian.h +++ b/libi2pd/I2PEndian.h @@ -5,7 +5,7 @@ #if defined(__FreeBSD__) #include -#elif defined(__linux__) || defined(__FreeBSD_kernel__) || defined(__OpenBSD__) +#elif defined(__linux__) || defined(__FreeBSD_kernel__) || defined(__OpenBSD__) || defined(__GLIBC__) #include #elif defined(__APPLE__) && defined(__MACH__) From 319d748639e870d34700ebcdc9c44a9c7d65a932 Mon Sep 17 00:00:00 2001 From: yangfl Date: Sat, 3 Feb 2018 02:29:28 +0800 Subject: [PATCH 13/92] i2pd.service: do not block system shutdown for 10 min --- contrib/debian/i2pd.service | 28 +--------------------------- contrib/i2pd.service | 29 +++++++++++++++++++++++++++++ contrib/rpm/i2pd.service | 29 +---------------------------- 3 files changed, 31 insertions(+), 55 deletions(-) mode change 100644 => 120000 contrib/debian/i2pd.service create mode 100644 contrib/i2pd.service mode change 100644 => 120000 contrib/rpm/i2pd.service diff --git a/contrib/debian/i2pd.service b/contrib/debian/i2pd.service deleted file mode 100644 index 37f26f14..00000000 --- a/contrib/debian/i2pd.service +++ /dev/null @@ -1,27 +0,0 @@ -[Unit] -Description=I2P Router written in C++ -After=network.target - -[Service] -User=i2pd -Group=i2pd -RuntimeDirectory=i2pd -RuntimeDirectoryMode=0700 -Type=simple -ExecStart=/usr/sbin/i2pd --conf=/etc/i2pd/i2pd.conf --tunconf=/etc/i2pd/tunnels.conf --pidfile=/var/run/i2pd/i2pd.pid --logfile=/var/log/i2pd/i2pd.log --daemon --service -ExecReload=/bin/kill -HUP $MAINPID -PIDFile=/var/run/i2pd/i2pd.pid -### Uncomment, if auto restart needed -#Restart=on-failure - -### Use SIGINT for graceful stop daemon. -# i2pd stops accepting new tunnels and waits ~10 min while old ones do not die. -KillSignal=SIGINT -TimeoutStopSec=10m - -# If you have problems with hanging i2pd, you can try enable this -#LimitNOFILE=4096 -PrivateDevices=yes - -[Install] -WantedBy=multi-user.target diff --git a/contrib/debian/i2pd.service b/contrib/debian/i2pd.service new file mode 120000 index 00000000..ca477e3b --- /dev/null +++ b/contrib/debian/i2pd.service @@ -0,0 +1 @@ +../i2pd.service \ No newline at end of file diff --git a/contrib/i2pd.service b/contrib/i2pd.service new file mode 100644 index 00000000..5ed31d41 --- /dev/null +++ b/contrib/i2pd.service @@ -0,0 +1,29 @@ +[Unit] +Description=I2P Router written in C++ +Documentation=man:i2pd(1) https://i2pd.readthedocs.io/en/latest/ +After=network.target + +[Service] +User=i2pd +Group=i2pd +RuntimeDirectory=i2pd +RuntimeDirectoryMode=0700 +Type=simple +ExecStart=/usr/sbin/i2pd --conf=/etc/i2pd/i2pd.conf --tunconf=/etc/i2pd/tunnels.conf --pidfile=/var/run/i2pd/i2pd.pid --logfile=/var/log/i2pd/i2pd.log --daemon --service +ExecReload=/bin/kill -HUP $MAINPID +PIDFile=/var/run/i2pd/i2pd.pid +### Uncomment, if auto restart needed +#Restart=on-failure + +KillSignal=SIGQUIT +# If you have the patience waiting 10 min on restarting/stopping it, uncomment this. +# i2pd stops accepting new tunnels and waits ~10 min while old ones do not die. +#KillSignal=SIGINT +#TimeoutStopSec=10m + +# If you have problems with hanging i2pd, you can try enable this +#LimitNOFILE=4096 +PrivateDevices=yes + +[Install] +WantedBy=multi-user.target diff --git a/contrib/rpm/i2pd.service b/contrib/rpm/i2pd.service deleted file mode 100644 index 8a9c9584..00000000 --- a/contrib/rpm/i2pd.service +++ /dev/null @@ -1,28 +0,0 @@ -[Unit] -Description=I2P Router written in C++ -After=network.target - -[Service] -User=i2pd -Group=i2pd -PermissionsStartOnly=True -RuntimeDirectory=i2pd -RuntimeDirectoryMode=0700 -Type=simple -ExecStart=/usr/sbin/i2pd --conf=/etc/i2pd/i2pd.conf --tunconf=/etc/i2pd/tunnels.conf --pidfile=/var/run/i2pd/i2pd.pid --logfile=/var/log/i2pd/i2pd.log --daemon --service -ExecReload=/bin/kill -HUP $MAINPID -PIDFile=/var/run/i2pd/i2pd.pid -### Uncomment, if auto restart needed -#Restart=on-failure - -### Use SIGINT for graceful stop daemon. -# i2pd stops accepting new tunnels and waits ~10 min while old ones do not die. -KillSignal=SIGINT -TimeoutStopSec=10m - -# If you have problems with hunging i2pd, you can try enable this -#LimitNOFILE=4096 -PrivateDevices=yes - -[Install] -WantedBy=multi-user.target diff --git a/contrib/rpm/i2pd.service b/contrib/rpm/i2pd.service new file mode 120000 index 00000000..ca477e3b --- /dev/null +++ b/contrib/rpm/i2pd.service @@ -0,0 +1 @@ +../i2pd.service \ No newline at end of file From 87f2eefd35585dbfab375cf62b9e16b670ebecf1 Mon Sep 17 00:00:00 2001 From: hypnosis-i2p Date: Sat, 3 Feb 2018 19:55:32 +0800 Subject: [PATCH 14/92] quit features replaced by stop --- .../org/purplei2p/i2pd/DaemonSingleton.java | 6 +- .../org/purplei2p/i2pd/ForegroundService.java | 2 +- .../i2pd/{I2PD.java => I2PDActivity.java} | 56 ++++++++----------- 3 files changed, 29 insertions(+), 35 deletions(-) rename android/src/org/purplei2p/i2pd/{I2PD.java => I2PDActivity.java} (85%) diff --git a/android/src/org/purplei2p/i2pd/DaemonSingleton.java b/android/src/org/purplei2p/i2pd/DaemonSingleton.java index 65afd0f5..64568f83 100644 --- a/android/src/org/purplei2p/i2pd/DaemonSingleton.java +++ b/android/src/org/purplei2p/i2pd/DaemonSingleton.java @@ -32,7 +32,7 @@ public class DaemonSingleton { private boolean startedOkay; - public static enum State {uninitialized,starting,jniLibraryLoaded,startedOkay,startFailed,gracefulShutdownInProgress}; + public static enum State {uninitialized,starting,jniLibraryLoaded,startedOkay,startFailed,gracefulShutdownInProgress,stopped}; private State state = State.uninitialized; @@ -121,6 +121,10 @@ public class DaemonSingleton { if(isStartedOkay()){ try {I2PD_JNI.stopDaemon();}catch(Throwable tr){Log.e(TAG, "", tr);} setStartedOkay(false); + synchronized (DaemonSingleton.this) { + state = State.stopped; + fireStateUpdate(); + } } } } diff --git a/android/src/org/purplei2p/i2pd/ForegroundService.java b/android/src/org/purplei2p/i2pd/ForegroundService.java index bfd650c8..74761b07 100644 --- a/android/src/org/purplei2p/i2pd/ForegroundService.java +++ b/android/src/org/purplei2p/i2pd/ForegroundService.java @@ -75,7 +75,7 @@ public class ForegroundService extends Service { // The PendingIntent to launch our activity if the user selects this notification PendingIntent contentIntent = PendingIntent.getActivity(this, 0, - new Intent(this, I2PD.class), 0); + new Intent(this, I2PDActivity.class), 0); // Set the info for the views that show in the notification panel. Notification notification = new Notification.Builder(this) diff --git a/android/src/org/purplei2p/i2pd/I2PD.java b/android/src/org/purplei2p/i2pd/I2PDActivity.java similarity index 85% rename from android/src/org/purplei2p/i2pd/I2PD.java rename to android/src/org/purplei2p/i2pd/I2PDActivity.java index a2494b2b..36e992b3 100755 --- a/android/src/org/purplei2p/i2pd/I2PD.java +++ b/android/src/org/purplei2p/i2pd/I2PDActivity.java @@ -5,13 +5,11 @@ import java.io.StringWriter; import java.util.Timer; import java.util.TimerTask; -import android.annotation.SuppressLint; import android.app.Activity; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; -import android.os.Build; import android.os.Bundle; import android.os.IBinder; import android.util.Log; @@ -20,7 +18,7 @@ import android.view.MenuItem; import android.widget.TextView; import android.widget.Toast; -public class I2PD extends Activity { +public class I2PDActivity extends Activity { private static final String TAG = "i2pd"; private TextView textView; @@ -81,11 +79,11 @@ public class I2PD extends Activity { gracefulQuitTimer.cancel(); setGracefulQuitTimer(null); } - try{ - doUnbindService(); - }catch(Throwable tr){ - Log.e(TAG, "", tr); - } +// try{ +// doUnbindService(); +// }catch(Throwable tr){ +// Log.e(TAG, "", tr); +// } } private CharSequence throwableToString(Throwable tr) { @@ -126,7 +124,8 @@ public class I2PD extends Activity { private boolean mIsBound; - private void doBindService() { + private synchronized void doBindService() { + if(mIsBound)return; // Establish a connection with the service. We use an explicit // class name because we want a specific service implementation that // we know will be running in our own process (and thus won't be @@ -159,48 +158,39 @@ public class I2PD extends Activity { int id = item.getItemId(); switch(id){ - case R.id.action_quit: - quit(); + case R.id.action_stop: + i2pdStop(); return true; - case R.id.action_graceful_quit: - gracefulQuit(); + case R.id.action_graceful_stop: + i2pdGracefulStop(); return true; } return super.onOptionsItemSelected(item); } - @SuppressLint("NewApi") - private void quit() { - try { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - finishAndRemoveTask(); - } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { - finishAffinity(); - } else { - //moveTaskToBack(true); - finish(); - } - }catch (Throwable tr) { - Log.e(TAG, "", tr); - } + private void i2pdStop() { try{ daemon.stopDaemon(); }catch (Throwable tr) { Log.e(TAG, "", tr); } - System.exit(0); } private Timer gracefulQuitTimer; private final Object gracefulQuitTimerLock = new Object(); - private void gracefulQuit() { + private synchronized void i2pdGracefulStop() { + if(daemon.getState()==DaemonSingleton.State.stopped){ + Toast.makeText(this, R.string.already_stopped, + Toast.LENGTH_SHORT).show(); + return; + } if(getGracefulQuitTimer()!=null){ - Toast.makeText(this, R.string.graceful_quit_is_already_in_progress, + Toast.makeText(this, R.string.graceful_stop_is_already_in_progress, Toast.LENGTH_SHORT).show(); return; } - Toast.makeText(this, R.string.graceful_quit_is_in_progress, + Toast.makeText(this, R.string.graceful_stop_is_in_progress, Toast.LENGTH_SHORT).show(); new Thread(new Runnable(){ @@ -216,12 +206,12 @@ public class I2PD extends Activity { @Override public void run() { - quit(); + i2pdStop(); } }, 10*60*1000/*milliseconds*/); }else{ - quit(); + i2pdStop(); } } catch(Throwable tr) { Log.e(TAG,"",tr); From 1d0791dbf53f84881b8478f6265aa33b588e7014 Mon Sep 17 00:00:00 2001 From: hypnosis-i2p Date: Sat, 3 Feb 2018 19:56:17 +0800 Subject: [PATCH 15/92] quit features replaced by stop - more --- android/res/menu/options_main.xml | 10 +++++----- android/res/values/strings.xml | 9 +++++---- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/android/res/menu/options_main.xml b/android/res/menu/options_main.xml index f66caa2a..aef67c51 100644 --- a/android/res/menu/options_main.xml +++ b/android/res/menu/options_main.xml @@ -2,15 +2,15 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" - tools:context=".I2PD"> + tools:context=".I2PDActivity"> diff --git a/android/res/values/strings.xml b/android/res/values/strings.xml index 0b8bef38..c147a808 100755 --- a/android/res/values/strings.xml +++ b/android/res/values/strings.xml @@ -4,8 +4,9 @@ i2pd started i2pd service started i2pd service stopped - Quit - Graceful Quit - Graceful quit is already in progress - Graceful quit is in progress + Stop + Graceful Stop + Graceful stop is already in progress + Graceful stop is in progress + Already stopped From b88b82a85c9a22d668c84f3fd4ce4509722e9d8d Mon Sep 17 00:00:00 2001 From: hypnosis-i2p Date: Sat, 3 Feb 2018 19:57:21 +0800 Subject: [PATCH 16/92] quit features replaced by stop - more 2 --- android/AndroidManifest.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml index 3ae952b3..95fff3ff 100755 --- a/android/AndroidManifest.xml +++ b/android/AndroidManifest.xml @@ -1,20 +1,20 @@ + android:versionName="2.18.0"> - + - From eb3f703b46e895169e7eda5dcd5a677f00b265ef Mon Sep 17 00:00:00 2001 From: hypnosis-i2p Date: Sat, 3 Feb 2018 19:58:09 +0800 Subject: [PATCH 17/92] gradle upgraded; i2pd version name updated --- android/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/android/build.gradle b/android/build.gradle index a88403fd..821dbc16 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -4,7 +4,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.1.2' + classpath 'com.android.tools.build:gradle:2.3.3' } } @@ -18,7 +18,7 @@ android { targetSdkVersion 25 minSdkVersion 14 versionCode 1 - versionName "2.17.1" + versionName "2.18.0" } sourceSets { main { From 4af0caa50639c9c080034b2ea8239eb7e06f0ba3 Mon Sep 17 00:00:00 2001 From: R4SAS Date: Mon, 5 Feb 2018 05:07:26 +0300 Subject: [PATCH 18/92] fix build on GCC 8.0.1 https://bugzilla.redhat.com/show_bug.cgi?id=1541688 --- libi2pd/TunnelBase.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libi2pd/TunnelBase.h b/libi2pd/TunnelBase.h index 97fb2b51..dce3debe 100644 --- a/libi2pd/TunnelBase.h +++ b/libi2pd/TunnelBase.h @@ -59,7 +59,8 @@ namespace tunnel struct TunnelCreationTimeCmp { - bool operator() (const std::shared_ptr & t1, const std::shared_ptr & t2) const + template + bool operator() (const std::shared_ptr & t1, const std::shared_ptr & t2) const { if (t1->GetCreationTime () != t2->GetCreationTime ()) return t1->GetCreationTime () > t2->GetCreationTime (); From f3488be7afcb261502fa95639894193e5204e3a8 Mon Sep 17 00:00:00 2001 From: R4SAS Date: Mon, 5 Feb 2018 05:52:12 +0300 Subject: [PATCH 19/92] update rpm, increase release version for Fedora and CentOS --- contrib/rpm/i2pd-git.spec | 2 +- contrib/rpm/i2pd.spec | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/contrib/rpm/i2pd-git.spec b/contrib/rpm/i2pd-git.spec index b2be3b9f..6e02779d 100644 --- a/contrib/rpm/i2pd-git.spec +++ b/contrib/rpm/i2pd-git.spec @@ -2,7 +2,7 @@ Name: i2pd-git Version: 2.18.0 -Release: %{git_hash}.git%{?dist} +Release: git%{git_hash}%{?dist} Summary: I2P router written in C++ Conflicts: i2pd diff --git a/contrib/rpm/i2pd.spec b/contrib/rpm/i2pd.spec index 469740ce..22c31192 100644 --- a/contrib/rpm/i2pd.spec +++ b/contrib/rpm/i2pd.spec @@ -1,6 +1,6 @@ Name: i2pd Version: 2.18.0 -Release: 1%{?dist} +Release: 2%{?dist} Summary: I2P router written in C++ Conflicts: i2pd-git @@ -96,6 +96,9 @@ getent passwd i2pd >/dev/null || \ %changelog +* Mon Feb 05 2018 r4sas - 2.18.0-2 +- Fixed blocking system shutdown for 10 minutes (#1089) + * Thu Feb 01 2018 r4sas - 2.18.0-1 - Added to conflicts i2pd-git package - Fixed release versioning From 5a657cff892fd8075a77d32556f5d1999fd6bf7a Mon Sep 17 00:00:00 2001 From: l-n-s Date: Sun, 4 Feb 2018 23:44:49 -0500 Subject: [PATCH 20/92] Remove broken Dockerfile and it's entrypoint --- Dockerfile | 54 --------------------------------------------------- entrypoint.sh | 24 ----------------------- 2 files changed, 78 deletions(-) delete mode 100644 Dockerfile delete mode 100644 entrypoint.sh diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 4931a709..00000000 --- a/Dockerfile +++ /dev/null @@ -1,54 +0,0 @@ -FROM alpine:latest - -MAINTAINER Mikal Villa - -ENV GIT_BRANCH="master" -ENV I2PD_PREFIX="/opt/i2pd-${GIT_BRANCH}" -ENV PATH=${I2PD_PREFIX}/bin:$PATH - -ENV GOSU_VERSION=1.7 -ENV GOSU_SHASUM="34049cfc713e8b74b90d6de49690fa601dc040021980812b2f1f691534be8a50 /usr/local/bin/gosu" - -RUN mkdir /user && adduser -S -h /user i2pd && chown -R i2pd:nobody /user - - -# -# Each RUN is a layer, adding the dependencies and building i2pd in one layer takes around 8-900Mb, so to keep the -# image under 20mb we need to remove all the build dependencies in the same "RUN" / layer. -# - -# 1. install deps, clone and build. -# 2. strip binaries. -# 3. Purge all dependencies and other unrelated packages, including build directory. -RUN apk --no-cache --virtual build-dependendencies add make gcc g++ libtool boost-dev build-base openssl-dev openssl git \ - && mkdir -p /tmp/build \ - && cd /tmp/build && git clone -b ${GIT_BRANCH} https://github.com/PurpleI2P/i2pd.git \ - && cd i2pd \ - && make -j4 \ - && mkdir -p ${I2PD_PREFIX}/bin \ - && mv i2pd ${I2PD_PREFIX}/bin/ \ - && cd ${I2PD_PREFIX}/bin \ - && strip i2pd \ - && rm -fr /tmp/build && apk --purge del build-dependendencies build-base fortify-headers boost-dev zlib-dev openssl-dev \ - boost-python3 python3 gdbm boost-unit_test_framework boost-python linux-headers boost-prg_exec_monitor \ - boost-serialization boost-signals boost-wave boost-wserialization boost-math boost-graph boost-regex git pcre \ - libtool g++ gcc pkgconfig - -# 2. Adding required libraries to run i2pd to ensure it will run. -RUN apk --no-cache add boost-filesystem boost-system boost-program_options boost-date_time boost-thread boost-iostreams openssl musl-utils libstdc++ - -# Gosu is a replacement for su/sudo in docker and not a backdoor :) See https://github.com/tianon/gosu -RUN wget -O /usr/local/bin/gosu https://github.com/tianon/gosu/releases/download/${GOSU_VERSION}/gosu-amd64 \ - && echo "${GOSU_SHASUM}" | sha256sum -c && chmod +x /usr/local/bin/gosu - -COPY entrypoint.sh /entrypoint.sh - -RUN chmod a+x /entrypoint.sh -RUN echo "export PATH=${PATH}" >> /etc/profile - -VOLUME [ "/var/lib/i2pd" ] - -EXPOSE 7070 4444 4447 7656 2827 7654 7650 - -ENTRYPOINT [ "/entrypoint.sh" ] - diff --git a/entrypoint.sh b/entrypoint.sh deleted file mode 100644 index 24a415aa..00000000 --- a/entrypoint.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh - -ARGS="" -if [ "${ENABLE_IPV6}" != "" ]; then - ARGS="${ARGS} –ipv6" -fi - -if [ "${LOGLEVEL}" != "" ]; then - ARGS="${ARGS} –loglevel=${LOGLEVEL}" -fi - -if [ "${ENABLE_AUTH}" != "" ]; then - ARGS="${ARGS} –http.auth" -fi - - -# To make ports exposeable -DEFAULT_ARGS=" –http.address=0.0.0.0 –httpproxy.address=0.0.0.0 -socksproxy.address=0.0.0.0 –sam.address=0.0.0.0 –bob.address=0.0.0.0 –i2cp.address=0.0.0.0 –i2pcontrol.port=0.0.0.0 –upnp.enabled=false -service " - -mkdir -p /var/lib/i2pd && chown -R i2pd:nobody /var/lib/i2pd && chmod u+rw /var/lib/i2pd - -gosu i2pd i2pd $DEFAULT_ARGS $ARGS - - From e77037c2b83d1dc446bf2130effa0861f75d58e6 Mon Sep 17 00:00:00 2001 From: orignal Date: Mon, 5 Feb 2018 11:13:25 -0500 Subject: [PATCH 21/92] fixed warning --- libi2pd/TunnelBase.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libi2pd/TunnelBase.h b/libi2pd/TunnelBase.h index dce3debe..53782ae3 100644 --- a/libi2pd/TunnelBase.h +++ b/libi2pd/TunnelBase.h @@ -66,7 +66,7 @@ namespace tunnel return t1->GetCreationTime () > t2->GetCreationTime (); else return t1 < t2; - }; + } }; } } From 62d9a47c3d60cb5cf224f0159135ef02c3568cc3 Mon Sep 17 00:00:00 2001 From: hypnosis-i2p Date: Wed, 7 Feb 2018 18:23:05 +0800 Subject: [PATCH 22/92] android work 1 --- .../org/purplei2p/i2pd/DaemonSingleton.java | 58 ++++++-------- .../org/purplei2p/i2pd/ForegroundService.java | 8 +- .../src/org/purplei2p/i2pd/I2PDActivity.java | 79 +++++++++---------- 3 files changed, 63 insertions(+), 82 deletions(-) diff --git a/android/src/org/purplei2p/i2pd/DaemonSingleton.java b/android/src/org/purplei2p/i2pd/DaemonSingleton.java index 64568f83..cba29a18 100644 --- a/android/src/org/purplei2p/i2pd/DaemonSingleton.java +++ b/android/src/org/purplei2p/i2pd/DaemonSingleton.java @@ -8,8 +8,8 @@ import android.util.Log; public class DaemonSingleton { private static final String TAG="i2pd"; private static final DaemonSingleton instance = new DaemonSingleton(); - public static interface StateUpdateListener { void daemonStateUpdate(); } - private final Set stateUpdateListeners = new HashSet(); + public interface StateUpdateListener { void daemonStateUpdate(); } + private final Set stateUpdateListeners = new HashSet<>(); public static DaemonSingleton getInstance() { return instance; @@ -18,63 +18,54 @@ public class DaemonSingleton { public synchronized void addStateChangeListener(StateUpdateListener listener) { stateUpdateListeners.add(listener); } public synchronized void removeStateChangeListener(StateUpdateListener listener) { stateUpdateListeners.remove(listener); } + private synchronized void setState(State newState) { + if(newState==null)throw new NullPointerException(); + State oldState = state; + if(oldState==null)throw new NullPointerException(); + if(oldState.equals(newState))return; + state=newState; + fireStateUpdate1(); + } public synchronized void stopAcceptingTunnels() { if(isStartedOkay()){ - state=State.gracefulShutdownInProgress; - fireStateUpdate(); + setState(State.gracefulShutdownInProgress); I2PD_JNI.stopAcceptingTunnels(); } } - public void onNetworkStateChange(boolean isConnected) { - I2PD_JNI.onNetworkStateChanged(isConnected); - } - - private boolean startedOkay; + private volatile boolean startedOkay; - public static enum State {uninitialized,starting,jniLibraryLoaded,startedOkay,startFailed,gracefulShutdownInProgress,stopped}; + public enum State {uninitialized,starting,jniLibraryLoaded,startedOkay,startFailed,gracefulShutdownInProgress,stopped}; - private State state = State.uninitialized; + private volatile State state = State.uninitialized; public State getState() { return state; } - public synchronized void start() { - if(state != State.uninitialized)return; - state = State.starting; - fireStateUpdate(); + { + setState(State.starting); new Thread(new Runnable(){ @Override public void run() { try { I2PD_JNI.loadLibraries(); - synchronized (DaemonSingleton.this) { - state = State.jniLibraryLoaded; - fireStateUpdate(); - } + setState(State.jniLibraryLoaded); } catch (Throwable tr) { lastThrowable=tr; - synchronized (DaemonSingleton.this) { - state = State.startFailed; - fireStateUpdate(); - } + setState(State.startFailed); return; } try { synchronized (DaemonSingleton.this) { daemonStartResult = I2PD_JNI.startDaemon(); if("ok".equals(daemonStartResult)){ - state=State.startedOkay; + setState(State.startedOkay); setStartedOkay(true); - }else state=State.startFailed; - fireStateUpdate(); + }else setState(State.startFailed); } } catch (Throwable tr) { lastThrowable=tr; - synchronized (DaemonSingleton.this) { - state = State.startFailed; - fireStateUpdate(); - } + setState(State.startFailed); return; } } @@ -84,7 +75,7 @@ public class DaemonSingleton { private Throwable lastThrowable; private String daemonStartResult="N/A"; - private synchronized void fireStateUpdate() { + private void fireStateUpdate1() { Log.i(TAG, "daemon state change: "+state); for(StateUpdateListener listener : stateUpdateListeners) { try { @@ -121,10 +112,7 @@ public class DaemonSingleton { if(isStartedOkay()){ try {I2PD_JNI.stopDaemon();}catch(Throwable tr){Log.e(TAG, "", tr);} setStartedOkay(false); - synchronized (DaemonSingleton.this) { - state = State.stopped; - fireStateUpdate(); - } + setState(State.stopped); } } } diff --git a/android/src/org/purplei2p/i2pd/ForegroundService.java b/android/src/org/purplei2p/i2pd/ForegroundService.java index 74761b07..07254439 100644 --- a/android/src/org/purplei2p/i2pd/ForegroundService.java +++ b/android/src/org/purplei2p/i2pd/ForegroundService.java @@ -34,15 +34,13 @@ public class ForegroundService extends Service { // Display a notification about us starting. We put an icon in the status bar. showNotification(); - daemon.start(); // Tell the user we started. - Toast.makeText(this, R.string.i2pd_service_started, Toast.LENGTH_SHORT).show(); +// Toast.makeText(this, R.string.i2pd_service_started, Toast.LENGTH_SHORT).show(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i("ForegroundService", "Received start id " + startId + ": " + intent); - daemon.start(); return START_STICKY; } @@ -54,7 +52,7 @@ public class ForegroundService extends Service { stopForeground(true); // Tell the user we stopped. - Toast.makeText(this, R.string.i2pd_service_stopped, Toast.LENGTH_SHORT).show(); +// Toast.makeText(this, R.string.i2pd_service_stopped, Toast.LENGTH_SHORT).show(); } @Override @@ -92,6 +90,6 @@ public class ForegroundService extends Service { startForeground(NOTIFICATION, notification); } - private final DaemonSingleton daemon = DaemonSingleton.getInstance(); + private static final DaemonSingleton daemon = DaemonSingleton.getInstance(); } diff --git a/android/src/org/purplei2p/i2pd/I2PDActivity.java b/android/src/org/purplei2p/i2pd/I2PDActivity.java index 36e992b3..64316112 100755 --- a/android/src/org/purplei2p/i2pd/I2PDActivity.java +++ b/android/src/org/purplei2p/i2pd/I2PDActivity.java @@ -23,9 +23,9 @@ public class I2PDActivity extends Activity { private TextView textView; - private final DaemonSingleton daemon = DaemonSingleton.getInstance(); + private static final DaemonSingleton daemon = DaemonSingleton.getInstance(); - private DaemonSingleton.StateUpdateListener daemonStateUpdatedListener = + private final DaemonSingleton.StateUpdateListener daemonStateUpdatedListener = new DaemonSingleton.StateUpdateListener() { @Override @@ -58,7 +58,7 @@ public class I2PDActivity extends Activity { textView = new TextView(this); setContentView(textView); - DaemonSingleton.getInstance().addStateChangeListener(daemonStateUpdatedListener); + daemon.addStateChangeListener(daemonStateUpdatedListener); daemonStateUpdatedListener.daemonStateUpdate(); //set the app be foreground @@ -68,22 +68,18 @@ public class I2PDActivity extends Activity { @Override protected void onDestroy() { super.onDestroy(); - localDestroy(); - } - - private void localDestroy() { - textView = null; - DaemonSingleton.getInstance().removeStateChangeListener(daemonStateUpdatedListener); - Timer gracefulQuitTimer = getGracefulQuitTimer(); - if(gracefulQuitTimer!=null) { - gracefulQuitTimer.cancel(); - setGracefulQuitTimer(null); + textView = null; + daemon.removeStateChangeListener(daemonStateUpdatedListener); + Timer gracefulQuitTimer = getGracefulQuitTimer(); + if(gracefulQuitTimer!=null) { + gracefulQuitTimer.cancel(); + setGracefulQuitTimer(null); + } + try{ + doUnbindService(); + }catch(Throwable tr){ + Log.e(TAG, "", tr); } -// try{ -// doUnbindService(); -// }catch(Throwable tr){ -// Log.e(TAG, "", tr); -// } } private CharSequence throwableToString(Throwable tr) { @@ -122,24 +118,27 @@ public class I2PDActivity extends Activity { }; - private boolean mIsBound; + private static volatile boolean mIsBound; - private synchronized void doBindService() { - if(mIsBound)return; - // Establish a connection with the service. We use an explicit - // class name because we want a specific service implementation that - // we know will be running in our own process (and thus won't be - // supporting component replacement by other applications). - bindService(new Intent(this, - ForegroundService.class), mConnection, Context.BIND_AUTO_CREATE); - mIsBound = true; + private void doBindService() { + synchronized (I2PDActivity.class) { + if (mIsBound) return; + // Establish a connection with the service. We use an explicit + // class name because we want a specific service implementation that + // we know will be running in our own process (and thus won't be + // supporting component replacement by other applications). + bindService(new Intent(this, ForegroundService.class), mConnection, Context.BIND_AUTO_CREATE); + mIsBound = true; + } } private void doUnbindService() { - if (mIsBound) { - // Detach our existing connection. - unbindService(mConnection); - mIsBound = false; + synchronized (I2PDActivity.class) { + if (mIsBound) { + // Detach our existing connection. + unbindService(mConnection); + mIsBound = false; + } } } @@ -177,9 +176,9 @@ public class I2PDActivity extends Activity { } } - private Timer gracefulQuitTimer; - private final Object gracefulQuitTimerLock = new Object(); - private synchronized void i2pdGracefulStop() { + private volatile Timer gracefulQuitTimer; + + private void i2pdGracefulStop() { if(daemon.getState()==DaemonSingleton.State.stopped){ Toast.makeText(this, R.string.already_stopped, Toast.LENGTH_SHORT).show(); @@ -218,18 +217,14 @@ public class I2PDActivity extends Activity { } } - },"gracQuitInit").start(); + },"gracInit").start(); } private Timer getGracefulQuitTimer() { - synchronized (gracefulQuitTimerLock) { - return gracefulQuitTimer; - } + return gracefulQuitTimer; } private void setGracefulQuitTimer(Timer gracefulQuitTimer) { - synchronized (gracefulQuitTimerLock) { - this.gracefulQuitTimer = gracefulQuitTimer; - } + this.gracefulQuitTimer = gracefulQuitTimer; } } From 0994211a48a77329282f0deeec4e37b67ffcd120 Mon Sep 17 00:00:00 2001 From: hypnosis-i2p Date: Wed, 7 Feb 2018 18:24:51 +0800 Subject: [PATCH 23/92] android gitignore --- android/.gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/android/.gitignore b/android/.gitignore index d9fa5a57..efb83e7b 100644 --- a/android/.gitignore +++ b/android/.gitignore @@ -5,4 +5,5 @@ ant.properties local.properties build.sh bin -log* \ No newline at end of file +log* +.gradle android.iml build gradle gradlew gradlew.bat From 1b56d66fc80147e0e91b6774ef63bfa81e05aa48 Mon Sep 17 00:00:00 2001 From: hypnosis-i2p Date: Wed, 7 Feb 2018 18:25:36 +0800 Subject: [PATCH 24/92] android gitignore --- android/.gitignore | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/android/.gitignore b/android/.gitignore index efb83e7b..90cd315e 100644 --- a/android/.gitignore +++ b/android/.gitignore @@ -6,4 +6,10 @@ local.properties build.sh bin log* -.gradle android.iml build gradle gradlew gradlew.bat +.gradle +android.iml +build +gradle +gradlew +gradlew.bat + From 33735b343d1205d5d4ead28d537146ba66e94334 Mon Sep 17 00:00:00 2001 From: hypnosis-i2p Date: Wed, 7 Feb 2018 19:24:43 +0800 Subject: [PATCH 25/92] fixes 1094; fixes grac stop --- android/res/values/strings.xml | 11 ++- .../org/purplei2p/i2pd/DaemonSingleton.java | 20 ++++- .../org/purplei2p/i2pd/ForegroundService.java | 40 ++++++++-- .../src/org/purplei2p/i2pd/I2PDActivity.java | 73 ++++++++++++++----- 4 files changed, 118 insertions(+), 26 deletions(-) diff --git a/android/res/values/strings.xml b/android/res/values/strings.xml index c147a808..1421b261 100755 --- a/android/res/values/strings.xml +++ b/android/res/values/strings.xml @@ -1,12 +1,17 @@ i2pd - i2pd started - i2pd service started - i2pd service stopped Stop Graceful Stop Graceful stop is already in progress Graceful stop is in progress Already stopped + i2pd initializing + i2pd is starting + i2pd: loaded JNI libraries + i2pd started + i2pd start failed + i2pd: graceful shutdown in progress + i2pd has stopped + remaining diff --git a/android/src/org/purplei2p/i2pd/DaemonSingleton.java b/android/src/org/purplei2p/i2pd/DaemonSingleton.java index cba29a18..4f3e62f7 100644 --- a/android/src/org/purplei2p/i2pd/DaemonSingleton.java +++ b/android/src/org/purplei2p/i2pd/DaemonSingleton.java @@ -35,7 +35,25 @@ public class DaemonSingleton { private volatile boolean startedOkay; - public enum State {uninitialized,starting,jniLibraryLoaded,startedOkay,startFailed,gracefulShutdownInProgress,stopped}; + public enum State { + uninitialized(R.string.uninitialized), + starting(R.string.starting), + jniLibraryLoaded(R.string.jniLibraryLoaded), + startedOkay(R.string.startedOkay), + startFailed(R.string.startFailed), + gracefulShutdownInProgress(R.string.gracefulShutdownInProgress), + stopped(R.string.stopped); + + State(int statusStringResourceId) { + this.statusStringResourceId = statusStringResourceId; + } + + private final int statusStringResourceId; + + public int getStatusStringResourceId() { + return statusStringResourceId; + } + }; private volatile State state = State.uninitialized; diff --git a/android/src/org/purplei2p/i2pd/ForegroundService.java b/android/src/org/purplei2p/i2pd/ForegroundService.java index 07254439..6116b982 100644 --- a/android/src/org/purplei2p/i2pd/ForegroundService.java +++ b/android/src/org/purplei2p/i2pd/ForegroundService.java @@ -11,11 +11,32 @@ import android.util.Log; import android.widget.Toast; public class ForegroundService extends Service { + private static final String TAG="FgService"; + + private volatile boolean shown; + + private final DaemonSingleton.StateUpdateListener daemonStateUpdatedListener = + new DaemonSingleton.StateUpdateListener() { + + @Override + public void daemonStateUpdate() { + try { + synchronized (ForegroundService.this) { + if (shown) cancelNotification(); + showNotification(); + } + } catch (Throwable tr) { + Log.e(TAG,"error ignored",tr); + } + } + }; + + private NotificationManager notificationManager; // Unique Identification Number for the Notification. // We use it on Notification start, and to cancel it. - private int NOTIFICATION = R.string.i2pd_started; + private int NOTIFICATION = 1; /** * Class for clients to access. Because we know this service always @@ -32,8 +53,10 @@ public class ForegroundService extends Service { public void onCreate() { notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE); - // Display a notification about us starting. We put an icon in the status bar. - showNotification(); + synchronized (this) { + DaemonSingleton.getInstance().addStateChangeListener(daemonStateUpdatedListener); + if (!shown) daemonStateUpdatedListener.daemonStateUpdate(); + } // Tell the user we started. // Toast.makeText(this, R.string.i2pd_service_started, Toast.LENGTH_SHORT).show(); } @@ -46,6 +69,11 @@ public class ForegroundService extends Service { @Override public void onDestroy() { + DaemonSingleton.getInstance().removeStateChangeListener(daemonStateUpdatedListener); + cancelNotification(); + } + + private synchronized void cancelNotification() { // Cancel the persistent notification. notificationManager.cancel(NOTIFICATION); @@ -53,6 +81,7 @@ public class ForegroundService extends Service { // Tell the user we stopped. // Toast.makeText(this, R.string.i2pd_service_stopped, Toast.LENGTH_SHORT).show(); + shown=false; } @Override @@ -67,9 +96,9 @@ public class ForegroundService extends Service { /** * Show a notification while this service is running. */ - private void showNotification() { + private synchronized void showNotification() { // In this sample, we'll use the same text for the ticker and the expanded notification - CharSequence text = getText(R.string.i2pd_started); + CharSequence text = getText(DaemonSingleton.getInstance().getState().getStatusStringResourceId()); // The PendingIntent to launch our activity if the user selects this notification PendingIntent contentIntent = PendingIntent.getActivity(this, 0, @@ -88,6 +117,7 @@ public class ForegroundService extends Service { // Send the notification. //mNM.notify(NOTIFICATION, notification); startForeground(NOTIFICATION, notification); + shown=true; } private static final DaemonSingleton daemon = DaemonSingleton.getInstance(); diff --git a/android/src/org/purplei2p/i2pd/I2PDActivity.java b/android/src/org/purplei2p/i2pd/I2PDActivity.java index 64316112..af0c8000 100755 --- a/android/src/org/purplei2p/i2pd/I2PDActivity.java +++ b/android/src/org/purplei2p/i2pd/I2PDActivity.java @@ -19,9 +19,10 @@ import android.widget.TextView; import android.widget.Toast; public class I2PDActivity extends Activity { - private static final String TAG = "i2pd"; + private static final String TAG = "i2pdActvt"; + public static final int GRACEFUL_DELAY_MILLIS = 10 * 60 * 1000; - private TextView textView; + private TextView textView; private static final DaemonSingleton daemon = DaemonSingleton.getInstance(); @@ -42,8 +43,11 @@ public class I2PDActivity extends Activity { return; } DaemonSingleton.State state = daemon.getState(); - textView.setText(String.valueOf(state)+ - (DaemonSingleton.State.startFailed.equals(state)?": "+daemon.getDaemonStartResult():"")); + textView.setText( + String.valueOf(state)+ + (DaemonSingleton.State.startFailed.equals(state)?": "+daemon.getDaemonStartResult():"")+ + (DaemonSingleton.State.gracefulShutdownInProgress.equals(state)?": "+formatGraceTimeRemaining()+" "+getText(R.string.remaining):"") + ); } catch (Throwable tr) { Log.e(TAG,"error ignored",tr); } @@ -51,6 +55,18 @@ public class I2PDActivity extends Activity { }); } }; + private volatile long graceStartedMillis; + private final Object graceStartedMillis_LOCK=new Object(); + + private String formatGraceTimeRemaining() { + long remainingSeconds; + synchronized (graceStartedMillis_LOCK){ + remainingSeconds=Math.round(Math.max(0,graceStartedMillis+GRACEFUL_DELAY_MILLIS-System.currentTimeMillis())/1000.0D); + } + long remainingMinutes=(long)Math.floor(remainingSeconds/60.0D); + long remSec=remainingSeconds-remainingMinutes*60; + return remainingMinutes+":"+(remSec/10)+remSec%10; + } @Override public void onCreate(Bundle savedInstanceState) { @@ -70,11 +86,7 @@ public class I2PDActivity extends Activity { super.onDestroy(); textView = null; daemon.removeStateChangeListener(daemonStateUpdatedListener); - Timer gracefulQuitTimer = getGracefulQuitTimer(); - if(gracefulQuitTimer!=null) { - gracefulQuitTimer.cancel(); - setGracefulQuitTimer(null); - } + cancelGracefulStop(); try{ doUnbindService(); }catch(Throwable tr){ @@ -82,7 +94,15 @@ public class I2PDActivity extends Activity { } } - private CharSequence throwableToString(Throwable tr) { + private void cancelGracefulStop() { + Timer gracefulQuitTimer = getGracefulQuitTimer(); + if(gracefulQuitTimer!=null) { + gracefulQuitTimer.cancel(); + setGracefulQuitTimer(null); + } + } + + private CharSequence throwableToString(Throwable tr) { StringWriter sw = new StringWriter(8192); PrintWriter pw = new PrintWriter(sw); tr.printStackTrace(pw); @@ -169,11 +189,20 @@ public class I2PDActivity extends Activity { } private void i2pdStop() { - try{ - daemon.stopDaemon(); - }catch (Throwable tr) { - Log.e(TAG, "", tr); - } + cancelGracefulStop(); + new Thread(new Runnable(){ + + @Override + public void run() { + Log.d(TAG, "stopping"); + try{ + daemon.stopDaemon(); + }catch (Throwable tr) { + Log.e(TAG, "", tr); + } + } + + },"stop").start(); } private volatile Timer gracefulQuitTimer; @@ -199,8 +228,11 @@ public class I2PDActivity extends Activity { Log.d(TAG, "grac stopping"); if(daemon.isStartedOkay()) { daemon.stopAcceptingTunnels(); - Timer gracefulQuitTimer = new Timer(true); + final Timer gracefulQuitTimer = new Timer(true); setGracefulQuitTimer(gracefulQuitTimer); + synchronized (graceStartedMillis_LOCK) { + graceStartedMillis = System.currentTimeMillis(); + } gracefulQuitTimer.schedule(new TimerTask(){ @Override @@ -208,7 +240,14 @@ public class I2PDActivity extends Activity { i2pdStop(); } - }, 10*60*1000/*milliseconds*/); + }, GRACEFUL_DELAY_MILLIS); + final TimerTask tickerTask = new TimerTask() { + @Override + public void run() { + daemonStateUpdatedListener.daemonStateUpdate(); + } + }; + gracefulQuitTimer.scheduleAtFixedRate(tickerTask,0/*start delay*/,1000/*millis period*/); }else{ i2pdStop(); } From 56f6e57118a58bc2d7c2a6ab73b6ad627bbb036a Mon Sep 17 00:00:00 2001 From: hypnosis-i2p Date: Wed, 7 Feb 2018 19:54:19 +0800 Subject: [PATCH 26/92] fixes grac stop --- .../src/org/purplei2p/i2pd/I2PDActivity.java | 70 ++++++++++++------- 1 file changed, 43 insertions(+), 27 deletions(-) diff --git a/android/src/org/purplei2p/i2pd/I2PDActivity.java b/android/src/org/purplei2p/i2pd/I2PDActivity.java index af0c8000..840e0bfa 100755 --- a/android/src/org/purplei2p/i2pd/I2PDActivity.java +++ b/android/src/org/purplei2p/i2pd/I2PDActivity.java @@ -20,7 +20,7 @@ import android.widget.Toast; public class I2PDActivity extends Activity { private static final String TAG = "i2pdActvt"; - public static final int GRACEFUL_DELAY_MILLIS = 10 * 60 * 1000; + public static final int GRACEFUL_DELAY_MILLIS = 120 * 1000; private TextView textView; @@ -55,10 +55,10 @@ public class I2PDActivity extends Activity { }); } }; - private volatile long graceStartedMillis; - private final Object graceStartedMillis_LOCK=new Object(); + private static volatile long graceStartedMillis; + private static final Object graceStartedMillis_LOCK=new Object(); - private String formatGraceTimeRemaining() { + private static String formatGraceTimeRemaining() { long remainingSeconds; synchronized (graceStartedMillis_LOCK){ remainingSeconds=Math.round(Math.max(0,graceStartedMillis+GRACEFUL_DELAY_MILLIS-System.currentTimeMillis())/1000.0D); @@ -79,6 +79,15 @@ public class I2PDActivity extends Activity { //set the app be foreground doBindService(); + + final Timer gracefulQuitTimer = getGracefulQuitTimer(); + if(gracefulQuitTimer!=null){ + long gracefulStopAtMillis; + synchronized (graceStartedMillis_LOCK) { + gracefulStopAtMillis = graceStartedMillis + GRACEFUL_DELAY_MILLIS; + } + rescheduleGraceStop(gracefulQuitTimer, gracefulStopAtMillis); + } } @Override @@ -86,7 +95,7 @@ public class I2PDActivity extends Activity { super.onDestroy(); textView = null; daemon.removeStateChangeListener(daemonStateUpdatedListener); - cancelGracefulStop(); + //cancelGracefulStop(); try{ doUnbindService(); }catch(Throwable tr){ @@ -94,7 +103,7 @@ public class I2PDActivity extends Activity { } } - private void cancelGracefulStop() { + private static void cancelGracefulStop() { Timer gracefulQuitTimer = getGracefulQuitTimer(); if(gracefulQuitTimer!=null) { gracefulQuitTimer.cancel(); @@ -205,7 +214,7 @@ public class I2PDActivity extends Activity { },"stop").start(); } - private volatile Timer gracefulQuitTimer; + private static volatile Timer gracefulQuitTimer; private void i2pdGracefulStop() { if(daemon.getState()==DaemonSingleton.State.stopped){ @@ -228,26 +237,12 @@ public class I2PDActivity extends Activity { Log.d(TAG, "grac stopping"); if(daemon.isStartedOkay()) { daemon.stopAcceptingTunnels(); - final Timer gracefulQuitTimer = new Timer(true); - setGracefulQuitTimer(gracefulQuitTimer); + long gracefulStopAtMillis; synchronized (graceStartedMillis_LOCK) { graceStartedMillis = System.currentTimeMillis(); + gracefulStopAtMillis = graceStartedMillis + GRACEFUL_DELAY_MILLIS; } - gracefulQuitTimer.schedule(new TimerTask(){ - - @Override - public void run() { - i2pdStop(); - } - - }, GRACEFUL_DELAY_MILLIS); - final TimerTask tickerTask = new TimerTask() { - @Override - public void run() { - daemonStateUpdatedListener.daemonStateUpdate(); - } - }; - gracefulQuitTimer.scheduleAtFixedRate(tickerTask,0/*start delay*/,1000/*millis period*/); + rescheduleGraceStop(null,gracefulStopAtMillis); }else{ i2pdStop(); } @@ -259,11 +254,32 @@ public class I2PDActivity extends Activity { },"gracInit").start(); } - private Timer getGracefulQuitTimer() { + private void rescheduleGraceStop(Timer gracefulQuitTimerOld, long gracefulStopAtMillis) { + if(gracefulQuitTimerOld!=null)gracefulQuitTimerOld.cancel(); + final Timer gracefulQuitTimer = new Timer(true); + setGracefulQuitTimer(gracefulQuitTimer); + gracefulQuitTimer.schedule(new TimerTask(){ + + @Override + public void run() { + i2pdStop(); + } + + }, Math.max(0,gracefulStopAtMillis-System.currentTimeMillis())); + final TimerTask tickerTask = new TimerTask() { + @Override + public void run() { + daemonStateUpdatedListener.daemonStateUpdate(); + } + }; + gracefulQuitTimer.scheduleAtFixedRate(tickerTask,0/*start delay*/,1000/*millis period*/); + } + + private static Timer getGracefulQuitTimer() { return gracefulQuitTimer; } - private void setGracefulQuitTimer(Timer gracefulQuitTimer) { - this.gracefulQuitTimer = gracefulQuitTimer; + private static void setGracefulQuitTimer(Timer gracefulQuitTimer) { + I2PDActivity.gracefulQuitTimer = gracefulQuitTimer; } } From ac495da5fe6c8e688329bab0142392e56fe51dac Mon Sep 17 00:00:00 2001 From: hypnosis-i2p Date: Wed, 7 Feb 2018 19:56:44 +0800 Subject: [PATCH 27/92] fixes grac stop --- android/src/org/purplei2p/i2pd/I2PDActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/src/org/purplei2p/i2pd/I2PDActivity.java b/android/src/org/purplei2p/i2pd/I2PDActivity.java index 840e0bfa..99672eb7 100755 --- a/android/src/org/purplei2p/i2pd/I2PDActivity.java +++ b/android/src/org/purplei2p/i2pd/I2PDActivity.java @@ -20,7 +20,7 @@ import android.widget.Toast; public class I2PDActivity extends Activity { private static final String TAG = "i2pdActvt"; - public static final int GRACEFUL_DELAY_MILLIS = 120 * 1000; + public static final int GRACEFUL_DELAY_MILLIS = 10 * 60 * 1000; private TextView textView; From badb837b46b299419ac1d3091d0bbebdcb90be33 Mon Sep 17 00:00:00 2001 From: hypnosis-i2p Date: Wed, 7 Feb 2018 23:20:50 +0800 Subject: [PATCH 28/92] fixed #1088 --- android/AndroidManifest.xml | 10 +- android/build.gradle | 22 +++- android/res/layout/activity_perms_asker.xml | 27 ++++ android/res/values/template-dimens.xml | 16 +++ .../src/org/purplei2p/i2pd/I2PDActivity.java | 3 +- .../i2pd/I2PDPermsAskerActivity.java | 121 ++++++++++++++++++ 6 files changed, 190 insertions(+), 9 deletions(-) create mode 100644 android/res/layout/activity_perms_asker.xml create mode 100644 android/res/values/template-dimens.xml create mode 100644 android/src/org/purplei2p/i2pd/I2PDPermsAskerActivity.java diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml index 95fff3ff..df817b82 100755 --- a/android/AndroidManifest.xml +++ b/android/AndroidManifest.xml @@ -6,21 +6,21 @@ android:versionName="2.18.0"> - - - + + + - + + diff --git a/android/build.gradle b/android/build.gradle index 821dbc16..750ae008 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,15 +1,31 @@ buildscript { repositories { - mavenCentral() - jcenter() + mavenCentral() + jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.3.3' + classpath 'com.android.tools.build:gradle:2.3.3' } } apply plugin: 'com.android.application' +repositories { + jcenter() + maven { + url 'https://maven.google.com' + } +} + +dependencies { +// compile "com.android.support:support-v4:26.1.0" +// compile "com.android.support:support-v13:26.1.0" +// compile "com.android.support:cardview-v7:26.1.0" +// compile "com.android.support:appcompat-v7:26.1.0" + compile 'com.android.support:support-v4:25.3.1' + compile 'com.android.support:design:25.3.1' +} + android { compileSdkVersion 25 buildToolsVersion "25.0.2" diff --git a/android/res/layout/activity_perms_asker.xml b/android/res/layout/activity_perms_asker.xml new file mode 100644 index 00000000..d2d12cb6 --- /dev/null +++ b/android/res/layout/activity_perms_asker.xml @@ -0,0 +1,27 @@ + + + + +