Close transport connection if tag isn't recognised. #281

This commit is contained in:
akwizgran
2016-04-05 11:37:38 +01:00
parent bbd14f1af4
commit 2b19e4c8db
6 changed files with 142 additions and 265 deletions

View File

@@ -3,74 +3,33 @@ package org.briarproject.plugins.droidtooth;
import android.bluetooth.BluetoothSocket; import android.bluetooth.BluetoothSocket;
import org.briarproject.api.plugins.Plugin; import org.briarproject.api.plugins.Plugin;
import org.briarproject.api.plugins.TransportConnectionReader; import org.briarproject.api.plugins.duplex.AbstractDuplexTransportConnection;
import org.briarproject.api.plugins.TransportConnectionWriter;
import org.briarproject.api.plugins.duplex.DuplexTransportConnection;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; 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 BluetoothSocket socket;
private final Reader reader;
private final Writer writer;
private final AtomicBoolean halfClosed, closed;
DroidtoothTransportConnection(Plugin plugin, BluetoothSocket socket) { DroidtoothTransportConnection(Plugin plugin, BluetoothSocket socket) {
this.plugin = plugin; super(plugin);
this.socket = socket; this.socket = socket;
reader = new Reader();
writer = new Writer();
halfClosed = new AtomicBoolean(false);
closed = new AtomicBoolean(false);
} }
public TransportConnectionReader getReader() { @Override
return reader; protected InputStream getInputStream() throws IOException {
return socket.getInputStream();
} }
public TransportConnectionWriter getWriter() { @Override
return writer; protected OutputStream getOutputStream() throws IOException {
return socket.getOutputStream();
} }
private class Reader implements TransportConnectionReader { @Override
protected void closeConnection(boolean exception) throws IOException {
public InputStream getInputStream() throws IOException { socket.close();
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();
}
} }
} }

View File

@@ -1,75 +1,34 @@
package org.briarproject.plugins.tor; package org.briarproject.plugins.tor;
import org.briarproject.api.plugins.Plugin; import org.briarproject.api.plugins.Plugin;
import org.briarproject.api.plugins.TransportConnectionReader; import org.briarproject.api.plugins.duplex.AbstractDuplexTransportConnection;
import org.briarproject.api.plugins.TransportConnectionWriter;
import org.briarproject.api.plugins.duplex.DuplexTransportConnection;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.net.Socket; 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 Socket socket;
private final Reader reader;
private final Writer writer;
private final AtomicBoolean halfClosed, closed;
TorTransportConnection(Plugin plugin, Socket socket) { TorTransportConnection(Plugin plugin, Socket socket) {
this.plugin = plugin; super(plugin);
this.socket = socket; this.socket = socket;
reader = new Reader();
writer = new Writer();
halfClosed = new AtomicBoolean(false);
closed = new AtomicBoolean(false);
} }
public TransportConnectionReader getReader() { @Override
return reader; protected InputStream getInputStream() throws IOException {
return socket.getInputStream();
} }
public TransportConnectionWriter getWriter() { @Override
return writer; protected OutputStream getOutputStream() throws IOException {
return socket.getOutputStream();
} }
private class Reader implements TransportConnectionReader { @Override
protected void closeConnection(boolean exception) throws IOException {
public InputStream getInputStream() throws IOException { socket.close();
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();
}
} }
} }

View File

@@ -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);
}
}
}

View File

@@ -1,75 +1,34 @@
package org.briarproject.plugins.tcp; package org.briarproject.plugins.tcp;
import org.briarproject.api.plugins.Plugin; import org.briarproject.api.plugins.Plugin;
import org.briarproject.api.plugins.TransportConnectionReader; import org.briarproject.api.plugins.duplex.AbstractDuplexTransportConnection;
import org.briarproject.api.plugins.TransportConnectionWriter;
import org.briarproject.api.plugins.duplex.DuplexTransportConnection;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.net.Socket; 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 Socket socket;
private final Reader reader;
private final Writer writer;
private final AtomicBoolean halfClosed, closed;
TcpTransportConnection(Plugin plugin, Socket socket) { TcpTransportConnection(Plugin plugin, Socket socket) {
this.plugin = plugin; super(plugin);
this.socket = socket; this.socket = socket;
reader = new Reader();
writer = new Writer();
halfClosed = new AtomicBoolean(false);
closed = new AtomicBoolean(false);
} }
public TransportConnectionReader getReader() { @Override
return reader; protected InputStream getInputStream() throws IOException {
return socket.getInputStream();
} }
public TransportConnectionWriter getWriter() { @Override
return writer; protected OutputStream getOutputStream() throws IOException {
return socket.getOutputStream();
} }
private class Reader implements TransportConnectionReader { @Override
protected void closeConnection(boolean exception) throws IOException {
public InputStream getInputStream() throws IOException { socket.close();
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();
}
} }
} }

View File

@@ -1,76 +1,35 @@
package org.briarproject.plugins.bluetooth; package org.briarproject.plugins.bluetooth;
import org.briarproject.api.plugins.Plugin; import org.briarproject.api.plugins.Plugin;
import org.briarproject.api.plugins.TransportConnectionReader; import org.briarproject.api.plugins.duplex.AbstractDuplexTransportConnection;
import org.briarproject.api.plugins.TransportConnectionWriter;
import org.briarproject.api.plugins.duplex.DuplexTransportConnection;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.util.concurrent.atomic.AtomicBoolean;
import javax.microedition.io.StreamConnection; import javax.microedition.io.StreamConnection;
class BluetoothTransportConnection implements DuplexTransportConnection { class BluetoothTransportConnection extends AbstractDuplexTransportConnection {
private final Plugin plugin;
private final StreamConnection stream; private final StreamConnection stream;
private final Reader reader;
private final Writer writer;
private final AtomicBoolean halfClosed, closed;
BluetoothTransportConnection(Plugin plugin, StreamConnection stream) { BluetoothTransportConnection(Plugin plugin, StreamConnection stream) {
this.plugin = plugin; super(plugin);
this.stream = stream; this.stream = stream;
reader = new Reader();
writer = new Writer();
halfClosed = new AtomicBoolean(false);
closed = new AtomicBoolean(false);
} }
public TransportConnectionReader getReader() { @Override
return reader; protected InputStream getInputStream() throws IOException {
return stream.openInputStream();
} }
public TransportConnectionWriter getWriter() { @Override
return writer; protected OutputStream getOutputStream() throws IOException {
return stream.openOutputStream();
} }
private class Reader implements TransportConnectionReader { @Override
protected void closeConnection(boolean exception) throws IOException {
public InputStream getInputStream() throws IOException { stream.close();
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();
}
} }
} }

View File

@@ -5,8 +5,7 @@ import org.briarproject.api.contact.ContactId;
import org.briarproject.api.crypto.PseudoRandom; import org.briarproject.api.crypto.PseudoRandom;
import org.briarproject.api.keyagreement.KeyAgreementListener; import org.briarproject.api.keyagreement.KeyAgreementListener;
import org.briarproject.api.keyagreement.TransportDescriptor; import org.briarproject.api.keyagreement.TransportDescriptor;
import org.briarproject.api.plugins.TransportConnectionReader; import org.briarproject.api.plugins.duplex.AbstractDuplexTransportConnection;
import org.briarproject.api.plugins.TransportConnectionWriter;
import org.briarproject.api.plugins.duplex.DuplexPlugin; import org.briarproject.api.plugins.duplex.DuplexPlugin;
import org.briarproject.api.plugins.duplex.DuplexPluginCallback; import org.briarproject.api.plugins.duplex.DuplexPluginCallback;
import org.briarproject.api.plugins.duplex.DuplexTransportConnection; import org.briarproject.api.plugins.duplex.DuplexTransportConnection;
@@ -17,8 +16,6 @@ import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.util.Collection; import java.util.Collection;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.logging.Logger; import java.util.logging.Logger;
import static java.util.logging.Level.INFO; import static java.util.logging.Level.INFO;
@@ -180,23 +177,24 @@ class ModemPlugin implements DuplexPlugin, Modem.Callback {
} }
private class ModemTransportConnection private class ModemTransportConnection
implements DuplexTransportConnection { extends AbstractDuplexTransportConnection {
private final AtomicBoolean halfClosed = new AtomicBoolean(false); private ModemTransportConnection() {
private final AtomicBoolean closed = new AtomicBoolean(false); super(ModemPlugin.this);
private final CountDownLatch disposalFinished = new CountDownLatch(1);
private final Reader reader = new Reader();
private final Writer writer = new Writer();
public TransportConnectionReader getReader() {
return reader;
} }
public TransportConnectionWriter getWriter() { @Override
return writer; protected InputStream getInputStream() throws IOException {
return modem.getInputStream();
} }
private void hangUp(boolean exception) { @Override
protected OutputStream getOutputStream() throws IOException {
return modem.getOutputStream();
}
@Override
protected void closeConnection(boolean exception) {
LOG.info("Call disconnected"); LOG.info("Call disconnected");
try { try {
modem.hangUp(); modem.hangUp();
@@ -205,43 +203,6 @@ class ModemPlugin implements DuplexPlugin, Modem.Callback {
exception = true; exception = true;
} }
if (exception) resetModem(); 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);
}
} }
} }
} }