add logic to start and stop filter timers

This commit is contained in:
zab2
2019-03-29 16:27:10 +00:00
parent fc9ad32878
commit c0c95827ef
4 changed files with 57 additions and 20 deletions

View File

@@ -40,6 +40,7 @@ import net.i2p.client.streaming.I2PSocketManager;
import net.i2p.client.streaming.I2PSocketManagerFactory;
import net.i2p.client.streaming.RouterRestartException;
import net.i2p.client.streaming.IncomingConnectionFilter;
import net.i2p.client.streaming.StatefulConnectionFilter;
import net.i2p.crypto.SigType;
import net.i2p.data.Base64;
import net.i2p.data.Hash;
@@ -97,6 +98,8 @@ public class I2PTunnelServer extends I2PTunnelTask implements Runnable {
private int DEFAULT_LOCALPORT = 4488;
protected int localPort = DEFAULT_LOCALPORT;
private volatile StatefulConnectionFilter _filter;
/**
* Non-blocking
*
@@ -223,16 +226,18 @@ public class I2PTunnelServer extends I2PTunnelTask implements Runnable {
}
}
IncomingConnectionFilter filter = IncomingConnectionFilter.ALLOW;
if (getTunnel().filterDefinition != null) {
File filterDefinition = new File(getTunnel().filterDefinition);
I2PAppContext context = getTunnel().getContext();
try {
filter = FilterFactory.createFilter(context, filterDefinition, this);
_filter = FilterFactory.createFilter(context, filterDefinition);
} catch (IOException | InvalidDefinitionException bad) {
throw new IllegalArgumentException("Can't create socket manager", bad);
}
}
}
IncomingConnectionFilter filter = _filter == null ? IncomingConnectionFilter.ALLOW : _filter;
try {
I2PSocketManager rv = I2PSocketManagerFactory.createDisconnectedManager(privData, getTunnel().host,
portNum, props, filter);
@@ -376,6 +381,9 @@ public class I2PTunnelServer extends I2PTunnelTask implements Runnable {
*/
public synchronized void startRunning() {
connectManager();
StatefulConnectionFilter filter = _filter;
if (filter != null)
filter.start();
// prevent JVM exit when running outside the router
boolean isDaemon = getTunnel().getContext().isRouterContext();
Thread t = new I2PAppThread(this, "Server " + remoteHost + ':' + remotePort, isDaemon);
@@ -430,6 +438,9 @@ public class I2PTunnelServer extends I2PTunnelTask implements Runnable {
if (task != null) {
task.close(forced);
}
StatefulConnectionFilter filter = _filter;
if (filter != null)
filter.stop();
synchronized (lock) {
if (!forced && sockMgr.listSockets().size() != 0) {
l.log("There are still active connections!");

View File

@@ -5,6 +5,7 @@ import java.util.HashMap;
import java.util.Set;
import java.util.HashSet;
import java.util.Iterator;
import java.util.concurrent.atomic.AtomicBoolean;
import java.io.File;
import java.io.FileReader;
@@ -19,8 +20,7 @@ import net.i2p.util.Log;
import net.i2p.util.SecureFileOutputStream;
import net.i2p.data.Destination;
import net.i2p.data.Hash;
import net.i2p.i2ptunnel.I2PTunnelTask;
import net.i2p.client.streaming.IncomingConnectionFilter;
import net.i2p.client.streaming.StatefulConnectionFilter;
/**
* A filter for incoming connections which can be configured
@@ -36,14 +36,15 @@ import net.i2p.client.streaming.IncomingConnectionFilter;
*
* @since 0.9.40
*/
class AccessFilter implements IncomingConnectionFilter {
class AccessFilter implements StatefulConnectionFilter {
private static final long PURGE_INTERVAL = 1000;
private static final long SYNC_INTERVAL = 10 * 1000;
private final FilterDefinition definition;
private final I2PAppContext context;
private final I2PTunnelTask task;
private final AtomicBoolean timersRunning = new AtomicBoolean();
/**
* Trackers for known destinations defined in access lists
@@ -59,16 +60,25 @@ class AccessFilter implements IncomingConnectionFilter {
* @param definition definition of this filter
* @param task the task to query for liveness of the tunnel
*/
AccessFilter(I2PAppContext context, FilterDefinition definition, I2PTunnelTask task)
AccessFilter(I2PAppContext context, FilterDefinition definition)
throws IOException {
this.context = context;
this.definition = definition;
this.task = task;
reload();
}
new Purger();
new Syncer();
@Override
public void start() {
if (timersRunning.compareAndSet(false, true)) {
new Purger();
new Syncer();
}
}
@Override
public void stop() {
timersRunning.set(false);
}
@Override
@@ -169,7 +179,7 @@ class AccessFilter implements IncomingConnectionFilter {
super(context.simpleTimer2(), PURGE_INTERVAL);
}
public void timeReached() {
if (!task.isOpen()) {
if (!timersRunning.get()) {
synchronized(knownDests) {
knownDests.clear();
}
@@ -188,7 +198,7 @@ class AccessFilter implements IncomingConnectionFilter {
super(context.simpleTimer2(), SYNC_INTERVAL);
}
public void timeReached() {
if (!task.isOpen())
if (!timersRunning.get())
return;
try {
record();

View File

@@ -9,8 +9,7 @@ import java.util.List;
import java.util.ArrayList;
import net.i2p.I2PAppContext;
import net.i2p.i2ptunnel.I2PTunnelTask;
import net.i2p.client.streaming.IncomingConnectionFilter;
import net.i2p.client.streaming.StatefulConnectionFilter;
/**
* Factory for incoming connection filters. Only public class in this package.
@@ -25,11 +24,9 @@ public class FilterFactory {
*
* @param context the context this is running in
* @param definition file containing the filter definition
* @param task the I2PTunnelTask instance to query for liveness
*/
public static IncomingConnectionFilter createFilter(I2PAppContext context,
File definition,
I2PTunnelTask task)
public static StatefulConnectionFilter createFilter(I2PAppContext context,
File definition)
throws IOException, InvalidDefinitionException {
List<String> linesList = new ArrayList<String>();
@@ -50,6 +47,6 @@ public class FilterFactory {
}
FilterDefinition parsedDefinition = DefinitionParser.parse(linesList.toArray(new String[0]));
return new AccessFilter(context, parsedDefinition, task);
return new AccessFilter(context, parsedDefinition);
}
}