I2P Address: [http://git.idk.i2p]

Skip to content
Snippets Groups Projects
Commit c0c95827 authored by zab2's avatar zab2
Browse files

add logic to start and stop filter timers

parent fc9ad328
No related branches found
No related tags found
No related merge requests found
...@@ -40,6 +40,7 @@ import net.i2p.client.streaming.I2PSocketManager; ...@@ -40,6 +40,7 @@ import net.i2p.client.streaming.I2PSocketManager;
import net.i2p.client.streaming.I2PSocketManagerFactory; import net.i2p.client.streaming.I2PSocketManagerFactory;
import net.i2p.client.streaming.RouterRestartException; import net.i2p.client.streaming.RouterRestartException;
import net.i2p.client.streaming.IncomingConnectionFilter; import net.i2p.client.streaming.IncomingConnectionFilter;
import net.i2p.client.streaming.StatefulConnectionFilter;
import net.i2p.crypto.SigType; import net.i2p.crypto.SigType;
import net.i2p.data.Base64; import net.i2p.data.Base64;
import net.i2p.data.Hash; import net.i2p.data.Hash;
...@@ -97,6 +98,8 @@ public class I2PTunnelServer extends I2PTunnelTask implements Runnable { ...@@ -97,6 +98,8 @@ public class I2PTunnelServer extends I2PTunnelTask implements Runnable {
private int DEFAULT_LOCALPORT = 4488; private int DEFAULT_LOCALPORT = 4488;
protected int localPort = DEFAULT_LOCALPORT; protected int localPort = DEFAULT_LOCALPORT;
private volatile StatefulConnectionFilter _filter;
/** /**
* Non-blocking * Non-blocking
* *
...@@ -223,16 +226,18 @@ public class I2PTunnelServer extends I2PTunnelTask implements Runnable { ...@@ -223,16 +226,18 @@ public class I2PTunnelServer extends I2PTunnelTask implements Runnable {
} }
} }
IncomingConnectionFilter filter = IncomingConnectionFilter.ALLOW;
if (getTunnel().filterDefinition != null) { if (getTunnel().filterDefinition != null) {
File filterDefinition = new File(getTunnel().filterDefinition); File filterDefinition = new File(getTunnel().filterDefinition);
I2PAppContext context = getTunnel().getContext(); I2PAppContext context = getTunnel().getContext();
try { try {
filter = FilterFactory.createFilter(context, filterDefinition, this); _filter = FilterFactory.createFilter(context, filterDefinition);
} catch (IOException | InvalidDefinitionException bad) { } catch (IOException | InvalidDefinitionException bad) {
throw new IllegalArgumentException("Can't create socket manager", bad); throw new IllegalArgumentException("Can't create socket manager", bad);
} }
} }
IncomingConnectionFilter filter = _filter == null ? IncomingConnectionFilter.ALLOW : _filter;
try { try {
I2PSocketManager rv = I2PSocketManagerFactory.createDisconnectedManager(privData, getTunnel().host, I2PSocketManager rv = I2PSocketManagerFactory.createDisconnectedManager(privData, getTunnel().host,
portNum, props, filter); portNum, props, filter);
...@@ -376,6 +381,9 @@ public class I2PTunnelServer extends I2PTunnelTask implements Runnable { ...@@ -376,6 +381,9 @@ public class I2PTunnelServer extends I2PTunnelTask implements Runnable {
*/ */
public synchronized void startRunning() { public synchronized void startRunning() {
connectManager(); connectManager();
StatefulConnectionFilter filter = _filter;
if (filter != null)
filter.start();
// prevent JVM exit when running outside the router // prevent JVM exit when running outside the router
boolean isDaemon = getTunnel().getContext().isRouterContext(); boolean isDaemon = getTunnel().getContext().isRouterContext();
Thread t = new I2PAppThread(this, "Server " + remoteHost + ':' + remotePort, isDaemon); Thread t = new I2PAppThread(this, "Server " + remoteHost + ':' + remotePort, isDaemon);
...@@ -430,6 +438,9 @@ public class I2PTunnelServer extends I2PTunnelTask implements Runnable { ...@@ -430,6 +438,9 @@ public class I2PTunnelServer extends I2PTunnelTask implements Runnable {
if (task != null) { if (task != null) {
task.close(forced); task.close(forced);
} }
StatefulConnectionFilter filter = _filter;
if (filter != null)
filter.stop();
synchronized (lock) { synchronized (lock) {
if (!forced && sockMgr.listSockets().size() != 0) { if (!forced && sockMgr.listSockets().size() != 0) {
l.log("There are still active connections!"); l.log("There are still active connections!");
......
...@@ -5,6 +5,7 @@ import java.util.HashMap; ...@@ -5,6 +5,7 @@ import java.util.HashMap;
import java.util.Set; import java.util.Set;
import java.util.HashSet; import java.util.HashSet;
import java.util.Iterator; import java.util.Iterator;
import java.util.concurrent.atomic.AtomicBoolean;
import java.io.File; import java.io.File;
import java.io.FileReader; import java.io.FileReader;
...@@ -19,8 +20,7 @@ import net.i2p.util.Log; ...@@ -19,8 +20,7 @@ import net.i2p.util.Log;
import net.i2p.util.SecureFileOutputStream; import net.i2p.util.SecureFileOutputStream;
import net.i2p.data.Destination; import net.i2p.data.Destination;
import net.i2p.data.Hash; import net.i2p.data.Hash;
import net.i2p.i2ptunnel.I2PTunnelTask; import net.i2p.client.streaming.StatefulConnectionFilter;
import net.i2p.client.streaming.IncomingConnectionFilter;
/** /**
* A filter for incoming connections which can be configured * A filter for incoming connections which can be configured
...@@ -36,14 +36,15 @@ import net.i2p.client.streaming.IncomingConnectionFilter; ...@@ -36,14 +36,15 @@ import net.i2p.client.streaming.IncomingConnectionFilter;
* *
* @since 0.9.40 * @since 0.9.40
*/ */
class AccessFilter implements IncomingConnectionFilter { class AccessFilter implements StatefulConnectionFilter {
private static final long PURGE_INTERVAL = 1000; private static final long PURGE_INTERVAL = 1000;
private static final long SYNC_INTERVAL = 10 * 1000; private static final long SYNC_INTERVAL = 10 * 1000;
private final FilterDefinition definition; private final FilterDefinition definition;
private final I2PAppContext context; private final I2PAppContext context;
private final I2PTunnelTask task;
private final AtomicBoolean timersRunning = new AtomicBoolean();
/** /**
* Trackers for known destinations defined in access lists * Trackers for known destinations defined in access lists
...@@ -59,16 +60,25 @@ class AccessFilter implements IncomingConnectionFilter { ...@@ -59,16 +60,25 @@ class AccessFilter implements IncomingConnectionFilter {
* @param definition definition of this filter * @param definition definition of this filter
* @param task the task to query for liveness of the tunnel * @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 { throws IOException {
this.context = context; this.context = context;
this.definition = definition; this.definition = definition;
this.task = task;
reload(); reload();
}
new Purger(); @Override
new Syncer(); public void start() {
if (timersRunning.compareAndSet(false, true)) {
new Purger();
new Syncer();
}
}
@Override
public void stop() {
timersRunning.set(false);
} }
@Override @Override
...@@ -169,7 +179,7 @@ class AccessFilter implements IncomingConnectionFilter { ...@@ -169,7 +179,7 @@ class AccessFilter implements IncomingConnectionFilter {
super(context.simpleTimer2(), PURGE_INTERVAL); super(context.simpleTimer2(), PURGE_INTERVAL);
} }
public void timeReached() { public void timeReached() {
if (!task.isOpen()) { if (!timersRunning.get()) {
synchronized(knownDests) { synchronized(knownDests) {
knownDests.clear(); knownDests.clear();
} }
...@@ -188,7 +198,7 @@ class AccessFilter implements IncomingConnectionFilter { ...@@ -188,7 +198,7 @@ class AccessFilter implements IncomingConnectionFilter {
super(context.simpleTimer2(), SYNC_INTERVAL); super(context.simpleTimer2(), SYNC_INTERVAL);
} }
public void timeReached() { public void timeReached() {
if (!task.isOpen()) if (!timersRunning.get())
return; return;
try { try {
record(); record();
......
...@@ -9,8 +9,7 @@ import java.util.List; ...@@ -9,8 +9,7 @@ import java.util.List;
import java.util.ArrayList; import java.util.ArrayList;
import net.i2p.I2PAppContext; import net.i2p.I2PAppContext;
import net.i2p.i2ptunnel.I2PTunnelTask; import net.i2p.client.streaming.StatefulConnectionFilter;
import net.i2p.client.streaming.IncomingConnectionFilter;
/** /**
* Factory for incoming connection filters. Only public class in this package. * Factory for incoming connection filters. Only public class in this package.
...@@ -25,11 +24,9 @@ public class FilterFactory { ...@@ -25,11 +24,9 @@ public class FilterFactory {
* *
* @param context the context this is running in * @param context the context this is running in
* @param definition file containing the filter definition * @param definition file containing the filter definition
* @param task the I2PTunnelTask instance to query for liveness
*/ */
public static IncomingConnectionFilter createFilter(I2PAppContext context, public static StatefulConnectionFilter createFilter(I2PAppContext context,
File definition, File definition)
I2PTunnelTask task)
throws IOException, InvalidDefinitionException { throws IOException, InvalidDefinitionException {
List<String> linesList = new ArrayList<String>(); List<String> linesList = new ArrayList<String>();
...@@ -50,6 +47,6 @@ public class FilterFactory { ...@@ -50,6 +47,6 @@ public class FilterFactory {
} }
FilterDefinition parsedDefinition = DefinitionParser.parse(linesList.toArray(new String[0])); FilterDefinition parsedDefinition = DefinitionParser.parse(linesList.toArray(new String[0]));
return new AccessFilter(context, parsedDefinition, task); return new AccessFilter(context, parsedDefinition);
} }
} }
package net.i2p.client.streaming;
/**
* A ConnectionFilter that may hold state, can be started and stopped
* @since 0.9.40
*/
public interface StatefulConnectionFilter extends IncomingConnectionFilter {
/**
* Tells this filter to start
*/
public void start();
/**
* Tells this filter to stop and release any resources
*/
public void stop();
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment