From 2b19e4c8db3eef697d810cab6e2f39a8ec57886f Mon Sep 17 00:00:00 2001
From: akwizgran <akwizgran@users.sourceforge.net>
Date: Tue, 5 Apr 2016 11:37:38 +0100
Subject: [PATCH] Close transport connection if tag isn't recognised. #281

---
 .../DroidtoothTransportConnection.java        | 65 +++------------
 .../plugins/tor/TorTransportConnection.java   | 65 +++------------
 .../AbstractDuplexTransportConnection.java    | 80 +++++++++++++++++++
 .../plugins/tcp/TcpTransportConnection.java   | 65 +++------------
 .../BluetoothTransportConnection.java         | 65 +++------------
 .../plugins/modem/ModemPlugin.java            | 65 +++------------
 6 files changed, 141 insertions(+), 264 deletions(-)
 create mode 100644 briar-api/src/org/briarproject/api/plugins/duplex/AbstractDuplexTransportConnection.java

diff --git a/briar-android/src/org/briarproject/plugins/droidtooth/DroidtoothTransportConnection.java b/briar-android/src/org/briarproject/plugins/droidtooth/DroidtoothTransportConnection.java
index e4db5673d2..60520b563c 100644
--- a/briar-android/src/org/briarproject/plugins/droidtooth/DroidtoothTransportConnection.java
+++ b/briar-android/src/org/briarproject/plugins/droidtooth/DroidtoothTransportConnection.java
@@ -3,74 +3,33 @@ package org.briarproject.plugins.droidtooth;
 import android.bluetooth.BluetoothSocket;
 
 import org.briarproject.api.plugins.Plugin;
-import org.briarproject.api.plugins.TransportConnectionReader;
-import org.briarproject.api.plugins.TransportConnectionWriter;
-import org.briarproject.api.plugins.duplex.DuplexTransportConnection;
+import org.briarproject.api.plugins.duplex.AbstractDuplexTransportConnection;
 
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
-import java.util.concurrent.atomic.AtomicBoolean;
 
-class DroidtoothTransportConnection implements DuplexTransportConnection {
+class DroidtoothTransportConnection extends AbstractDuplexTransportConnection {
 
-	private final Plugin plugin;
 	private final BluetoothSocket socket;
-	private final Reader reader;
-	private final Writer writer;
-	private final AtomicBoolean halfClosed, closed;
 
 	DroidtoothTransportConnection(Plugin plugin, BluetoothSocket socket) {
-		this.plugin = plugin;
+		super(plugin);
 		this.socket = socket;
-		reader = new Reader();
-		writer = new Writer();
-		halfClosed = new AtomicBoolean(false);
-		closed = new AtomicBoolean(false);
 	}
 
-	public TransportConnectionReader getReader() {
-		return reader;
+	@Override
+	protected InputStream getInputStream() throws IOException {
+		return socket.getInputStream();
 	}
 
-	public TransportConnectionWriter getWriter() {
-		return writer;
+	@Override
+	protected OutputStream getOutputStream() throws IOException {
+		return socket.getOutputStream();
 	}
 
-	private class Reader implements TransportConnectionReader {
-
-		public InputStream getInputStream() throws IOException {
-			return socket.getInputStream();
-		}
-
-		public void dispose(boolean exception, boolean recognised)
-				throws IOException {
-			if (halfClosed.getAndSet(true) || exception)
-				if (!closed.getAndSet(true)) socket.close();
-		}
-	}
-
-	private class Writer implements TransportConnectionWriter {
-
-		public int getMaxLatency() {
-			return plugin.getMaxLatency();
-		}
-
-		public int getMaxIdleTime() {
-			return plugin.getMaxIdleTime();
-		}
-
-		public long getCapacity() {
-			return Long.MAX_VALUE;
-		}
-
-		public OutputStream getOutputStream() throws IOException {
-			return socket.getOutputStream();
-		}
-
-		public void dispose(boolean exception) throws IOException {
-			if (halfClosed.getAndSet(true) || exception)
-				if (!closed.getAndSet(true)) socket.close();
-		}
+	@Override
+	protected void closeConnection(boolean exception) throws IOException {
+		socket.close();
 	}
 }
diff --git a/briar-android/src/org/briarproject/plugins/tor/TorTransportConnection.java b/briar-android/src/org/briarproject/plugins/tor/TorTransportConnection.java
index f6d806c880..f44669188e 100644
--- a/briar-android/src/org/briarproject/plugins/tor/TorTransportConnection.java
+++ b/briar-android/src/org/briarproject/plugins/tor/TorTransportConnection.java
@@ -1,75 +1,34 @@
 package org.briarproject.plugins.tor;
 
 import org.briarproject.api.plugins.Plugin;
-import org.briarproject.api.plugins.TransportConnectionReader;
-import org.briarproject.api.plugins.TransportConnectionWriter;
-import org.briarproject.api.plugins.duplex.DuplexTransportConnection;
+import org.briarproject.api.plugins.duplex.AbstractDuplexTransportConnection;
 
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.net.Socket;
-import java.util.concurrent.atomic.AtomicBoolean;
 
-class TorTransportConnection implements DuplexTransportConnection {
+class TorTransportConnection extends AbstractDuplexTransportConnection {
 
-	private final Plugin plugin;
 	private final Socket socket;
-	private final Reader reader;
-	private final Writer writer;
-	private final AtomicBoolean halfClosed, closed;
 
 	TorTransportConnection(Plugin plugin, Socket socket) {
-		this.plugin = plugin;
+		super(plugin);
 		this.socket = socket;
-		reader = new Reader();
-		writer = new Writer();
-		halfClosed = new AtomicBoolean(false);
-		closed = new AtomicBoolean(false);
 	}
 
-	public TransportConnectionReader getReader() {
-		return reader;
+	@Override
+	protected InputStream getInputStream() throws IOException {
+		return socket.getInputStream();
 	}
 
-	public TransportConnectionWriter getWriter() {
-		return writer;
+	@Override
+	protected OutputStream getOutputStream() throws IOException {
+		return socket.getOutputStream();
 	}
 
-	private class Reader implements TransportConnectionReader {
-
-		public InputStream getInputStream() throws IOException {
-			return socket.getInputStream();
-		}
-
-		public void dispose(boolean exception, boolean recognised)
-				throws IOException {
-			if (halfClosed.getAndSet(true) || exception)
-				if (!closed.getAndSet(true)) socket.close();
-		}
-	}
-
-	private class Writer implements TransportConnectionWriter {
-
-		public int getMaxLatency() {
-			return plugin.getMaxLatency();
-		}
-
-		public int getMaxIdleTime() {
-			return plugin.getMaxIdleTime();
-		}
-
-		public long getCapacity() {
-			return Long.MAX_VALUE;
-		}
-
-		public OutputStream getOutputStream() throws IOException {
-			return socket.getOutputStream();
-		}
-
-		public void dispose(boolean exception) throws IOException {
-			if (halfClosed.getAndSet(true) || exception)
-				if (!closed.getAndSet(true)) socket.close();
-		}
+	@Override
+	protected void closeConnection(boolean exception) throws IOException {
+		socket.close();
 	}
 }
diff --git a/briar-api/src/org/briarproject/api/plugins/duplex/AbstractDuplexTransportConnection.java b/briar-api/src/org/briarproject/api/plugins/duplex/AbstractDuplexTransportConnection.java
new file mode 100644
index 0000000000..575e43dc68
--- /dev/null
+++ b/briar-api/src/org/briarproject/api/plugins/duplex/AbstractDuplexTransportConnection.java
@@ -0,0 +1,80 @@
+package org.briarproject.api.plugins.duplex;
+
+import org.briarproject.api.plugins.Plugin;
+import org.briarproject.api.plugins.TransportConnectionReader;
+import org.briarproject.api.plugins.TransportConnectionWriter;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+public abstract class AbstractDuplexTransportConnection
+		implements DuplexTransportConnection {
+
+	private final Plugin plugin;
+	private final Reader reader;
+	private final Writer writer;
+	private final AtomicBoolean halfClosed, closed;
+
+	protected AbstractDuplexTransportConnection(Plugin plugin) {
+		this.plugin = plugin;
+		reader = new Reader();
+		writer = new Writer();
+		halfClosed = new AtomicBoolean(false);
+		closed = new AtomicBoolean(false);
+	}
+
+	protected abstract InputStream getInputStream() throws IOException;
+
+	protected abstract OutputStream getOutputStream() throws IOException;
+
+	protected abstract void closeConnection(boolean exception)
+			throws IOException;
+
+	@Override
+	public TransportConnectionReader getReader() {
+		return reader;
+	}
+
+	@Override
+	public TransportConnectionWriter getWriter() {
+		return writer;
+	}
+	private class Reader implements TransportConnectionReader {
+
+		public InputStream getInputStream() throws IOException {
+			return AbstractDuplexTransportConnection.this.getInputStream();
+		}
+
+		public void dispose(boolean exception, boolean recognised)
+				throws IOException {
+			if (halfClosed.getAndSet(true) || exception || !recognised)
+				if (!closed.getAndSet(true)) closeConnection(exception);
+		}
+	}
+
+	private class Writer implements TransportConnectionWriter {
+
+		public int getMaxLatency() {
+			return plugin.getMaxLatency();
+		}
+
+		public int getMaxIdleTime() {
+			return plugin.getMaxIdleTime();
+		}
+
+		public long getCapacity() {
+			return Long.MAX_VALUE;
+		}
+
+		public OutputStream getOutputStream() throws IOException {
+			return AbstractDuplexTransportConnection.this.getOutputStream();
+		}
+
+		public void dispose(boolean exception) throws IOException {
+			if (halfClosed.getAndSet(true) || exception)
+				if (!closed.getAndSet(true)) closeConnection(exception);
+		}
+	}
+}
diff --git a/briar-core/src/org/briarproject/plugins/tcp/TcpTransportConnection.java b/briar-core/src/org/briarproject/plugins/tcp/TcpTransportConnection.java
index c400975bf3..7d8d33a9ae 100644
--- a/briar-core/src/org/briarproject/plugins/tcp/TcpTransportConnection.java
+++ b/briar-core/src/org/briarproject/plugins/tcp/TcpTransportConnection.java
@@ -1,75 +1,34 @@
 package org.briarproject.plugins.tcp;
 
 import org.briarproject.api.plugins.Plugin;
-import org.briarproject.api.plugins.TransportConnectionReader;
-import org.briarproject.api.plugins.TransportConnectionWriter;
-import org.briarproject.api.plugins.duplex.DuplexTransportConnection;
+import org.briarproject.api.plugins.duplex.AbstractDuplexTransportConnection;
 
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.net.Socket;
-import java.util.concurrent.atomic.AtomicBoolean;
 
-class TcpTransportConnection implements DuplexTransportConnection {
+class TcpTransportConnection extends AbstractDuplexTransportConnection {
 
-	private final Plugin plugin;
 	private final Socket socket;
-	private final Reader reader;
-	private final Writer writer;
-	private final AtomicBoolean halfClosed, closed;
 
 	TcpTransportConnection(Plugin plugin, Socket socket) {
-		this.plugin = plugin;
+		super(plugin);
 		this.socket = socket;
-		reader = new Reader();
-		writer = new Writer();
-		halfClosed = new AtomicBoolean(false);
-		closed = new AtomicBoolean(false);
 	}
 
-	public TransportConnectionReader getReader() {
-		return reader;
+	@Override
+	protected InputStream getInputStream() throws IOException {
+		return socket.getInputStream();
 	}
 
-	public TransportConnectionWriter getWriter() {
-		return writer;
+	@Override
+	protected OutputStream getOutputStream() throws IOException {
+		return socket.getOutputStream();
 	}
 
-	private class Reader implements TransportConnectionReader {
-
-		public InputStream getInputStream() throws IOException {
-			return socket.getInputStream();
-		}
-
-		public void dispose(boolean exception, boolean recognised)
-				throws IOException {
-			if (halfClosed.getAndSet(true) || exception)
-				if (!closed.getAndSet(true)) socket.close();
-		}
-	}
-
-	private class Writer implements TransportConnectionWriter {
-
-		public int getMaxLatency() {
-			return plugin.getMaxLatency();
-		}
-
-		public int getMaxIdleTime() {
-			return plugin.getMaxIdleTime();
-		}
-
-		public long getCapacity() {
-			return Long.MAX_VALUE;
-		}
-
-		public OutputStream getOutputStream() throws IOException {
-			return socket.getOutputStream();
-		}
-
-		public void dispose(boolean exception) throws IOException {
-			if (halfClosed.getAndSet(true) || exception)
-				if (!closed.getAndSet(true)) socket.close();
-		}
+	@Override
+	protected void closeConnection(boolean exception) throws IOException {
+		socket.close();
 	}
 }
diff --git a/briar-desktop/src/org/briarproject/plugins/bluetooth/BluetoothTransportConnection.java b/briar-desktop/src/org/briarproject/plugins/bluetooth/BluetoothTransportConnection.java
index 6139b8c14b..a68dd001f2 100644
--- a/briar-desktop/src/org/briarproject/plugins/bluetooth/BluetoothTransportConnection.java
+++ b/briar-desktop/src/org/briarproject/plugins/bluetooth/BluetoothTransportConnection.java
@@ -1,76 +1,35 @@
 package org.briarproject.plugins.bluetooth;
 
 import org.briarproject.api.plugins.Plugin;
-import org.briarproject.api.plugins.TransportConnectionReader;
-import org.briarproject.api.plugins.TransportConnectionWriter;
-import org.briarproject.api.plugins.duplex.DuplexTransportConnection;
+import org.briarproject.api.plugins.duplex.AbstractDuplexTransportConnection;
 
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
-import java.util.concurrent.atomic.AtomicBoolean;
 
 import javax.microedition.io.StreamConnection;
 
-class BluetoothTransportConnection implements DuplexTransportConnection {
+class BluetoothTransportConnection extends AbstractDuplexTransportConnection {
 
-	private final Plugin plugin;
 	private final StreamConnection stream;
-	private final Reader reader;
-	private final Writer writer;
-	private final AtomicBoolean halfClosed, closed;
 
 	BluetoothTransportConnection(Plugin plugin, StreamConnection stream) {
-		this.plugin = plugin;
+		super(plugin);
 		this.stream = stream;
-		reader = new Reader();
-		writer = new Writer();
-		halfClosed = new AtomicBoolean(false);
-		closed = new AtomicBoolean(false);
 	}
 
-	public TransportConnectionReader getReader() {
-		return reader;
+	@Override
+	protected InputStream getInputStream() throws IOException {
+		return stream.openInputStream();
 	}
 
-	public TransportConnectionWriter getWriter() {
-		return writer;
+	@Override
+	protected OutputStream getOutputStream() throws IOException {
+		return stream.openOutputStream();
 	}
 
-	private class Reader implements TransportConnectionReader {
-
-		public InputStream getInputStream() throws IOException {
-			return stream.openInputStream();
-		}
-
-		public void dispose(boolean exception, boolean recognised)
-				throws IOException {
-			if (halfClosed.getAndSet(true) || exception)
-				if (!closed.getAndSet(true)) stream.close();
-		}
-	}
-
-	private class Writer implements TransportConnectionWriter {
-
-		public int getMaxLatency() {
-			return plugin.getMaxLatency();
-		}
-
-		public int getMaxIdleTime() {
-			return plugin.getMaxIdleTime();
-		}
-
-		public long getCapacity() {
-			return Long.MAX_VALUE;
-		}
-
-		public OutputStream getOutputStream() throws IOException {
-			return stream.openOutputStream();
-		}
-
-		public void dispose(boolean exception) throws IOException {
-			if (halfClosed.getAndSet(true) || exception)
-				if (!closed.getAndSet(true)) stream.close();
-		}
+	@Override
+	protected void closeConnection(boolean exception) throws IOException {
+		stream.close();
 	}
 }
diff --git a/briar-desktop/src/org/briarproject/plugins/modem/ModemPlugin.java b/briar-desktop/src/org/briarproject/plugins/modem/ModemPlugin.java
index bbf71da9c0..10a68aa56f 100644
--- a/briar-desktop/src/org/briarproject/plugins/modem/ModemPlugin.java
+++ b/briar-desktop/src/org/briarproject/plugins/modem/ModemPlugin.java
@@ -5,8 +5,7 @@ import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.crypto.PseudoRandom;
 import org.briarproject.api.keyagreement.KeyAgreementListener;
 import org.briarproject.api.keyagreement.TransportDescriptor;
-import org.briarproject.api.plugins.TransportConnectionReader;
-import org.briarproject.api.plugins.TransportConnectionWriter;
+import org.briarproject.api.plugins.duplex.AbstractDuplexTransportConnection;
 import org.briarproject.api.plugins.duplex.DuplexPlugin;
 import org.briarproject.api.plugins.duplex.DuplexPluginCallback;
 import org.briarproject.api.plugins.duplex.DuplexTransportConnection;
@@ -17,8 +16,6 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.util.Collection;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.logging.Logger;
 
 import static java.util.logging.Level.INFO;
@@ -180,23 +177,24 @@ class ModemPlugin implements DuplexPlugin, Modem.Callback {
 	}
 
 	private class ModemTransportConnection
-	implements DuplexTransportConnection {
+			extends AbstractDuplexTransportConnection {
 
-		private final AtomicBoolean halfClosed = new AtomicBoolean(false);
-		private final AtomicBoolean closed = new AtomicBoolean(false);
-		private final CountDownLatch disposalFinished = new CountDownLatch(1);
-		private final Reader reader = new Reader();
-		private final Writer writer = new Writer();
+		private ModemTransportConnection() {
+			super(ModemPlugin.this);
+		}
 
-		public TransportConnectionReader getReader() {
-			return reader;
+		@Override
+		protected InputStream getInputStream() throws IOException {
+			return modem.getInputStream();
 		}
 
-		public TransportConnectionWriter getWriter() {
-			return writer;
+		@Override
+		protected OutputStream getOutputStream() throws IOException {
+			return modem.getOutputStream();
 		}
 
-		private void hangUp(boolean exception) {
+		@Override
+		protected void closeConnection(boolean exception) {
 			LOG.info("Call disconnected");
 			try {
 				modem.hangUp();
@@ -205,43 +203,6 @@ class ModemPlugin implements DuplexPlugin, Modem.Callback {
 				exception = true;
 			}
 			if (exception) resetModem();
-			disposalFinished.countDown();
-		}
-
-		private class Reader implements TransportConnectionReader {
-
-			public InputStream getInputStream() throws IOException {
-				return modem.getInputStream();
-			}
-
-			public void dispose(boolean exception, boolean recognised) {
-				if (halfClosed.getAndSet(true) || exception)
-					if (!closed.getAndSet(true)) hangUp(exception);
-			}
-		}
-
-		private class Writer implements TransportConnectionWriter {
-
-			public int getMaxLatency() {
-				return ModemPlugin.this.getMaxLatency();
-			}
-
-			public int getMaxIdleTime() {
-				return ModemPlugin.this.getMaxIdleTime();
-			}
-
-			public long getCapacity() {
-				return Long.MAX_VALUE;
-			}
-
-			public OutputStream getOutputStream() throws IOException {
-				return modem.getOutputStream();
-			}
-
-			public void dispose(boolean exception) {
-				if (halfClosed.getAndSet(true) || exception)
-					if (!closed.getAndSet(true)) hangUp(exception);
-			}
 		}
 	}
 }
-- 
GitLab