diff --git a/briar-core/src/main/java/org/briarproject/briar/socialbackup/recovery/CustodianTaskImpl.java b/briar-core/src/main/java/org/briarproject/briar/socialbackup/recovery/CustodianTaskImpl.java index 70a8f106a..348b914f9 100644 --- a/briar-core/src/main/java/org/briarproject/briar/socialbackup/recovery/CustodianTaskImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/socialbackup/recovery/CustodianTaskImpl.java @@ -1,16 +1,16 @@ package org.briarproject.briar.socialbackup.recovery; -import org.briarproject.bramble.api.FormatException; import org.briarproject.bramble.api.client.ClientHelper; import org.briarproject.bramble.api.crypto.AgreementPublicKey; import org.briarproject.bramble.api.data.BdfList; import org.briarproject.briar.api.socialbackup.recovery.CustodianTask; import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.Socket; -import java.security.PublicKey; import javax.inject.Inject; @@ -20,6 +20,8 @@ public class CustodianTaskImpl implements CustodianTask { private Observer observer; private ClientHelper clientHelper; private InetSocketAddress remoteSocketAddress; + private Socket socket = new Socket(); + private final int TIMEOUT = 120 * 1000; @Inject CustodianTaskImpl(ClientHelper clientHelper) { @@ -34,30 +36,68 @@ public class CustodianTaskImpl implements CustodianTask { @Override public void cancel() { - cancelled = true; + cancelled = true; + try { + socket.close(); + } catch (IOException e) { + observer.onStateChanged(new CustodianTask.State.Failure( + State.Failure.Reason.NO_CONNECTION)); + } + observer.onStateChanged( + new CustodianTask.State.Failure(State.Failure.Reason.OTHER)); } @Override public void qrCodeDecoded(byte[] qrCodePayloadRaw) { - try { - BdfList qrCodePayload = clientHelper.toList(qrCodePayloadRaw); - AgreementPublicKey publicKey = new AgreementPublicKey(qrCodePayload.getRaw(0)); - byte[] addressRaw = qrCodePayload.getRaw(1); - int port = qrCodePayload.getLong(2).intValue(); - remoteSocketAddress = new InetSocketAddress(InetAddress.getByAddress(addressRaw), port); - System.out.println(" Qr code decoded " + publicKey.getEncoded().length + " " + remoteSocketAddress); - observer.onStateChanged(new CustodianTask.State.SendingShard()); - } catch (Exception e) { - observer.onStateChanged(new CustodianTask.State.Failure(State.Failure.Reason.QR_CODE_INVALID)); - return; - } + try { + BdfList qrCodePayload = clientHelper.toList(qrCodePayloadRaw); + AgreementPublicKey publicKey = + new AgreementPublicKey(qrCodePayload.getRaw(0)); + byte[] addressRaw = qrCodePayload.getRaw(1); + int port = qrCodePayload.getLong(2).intValue(); + remoteSocketAddress = + new InetSocketAddress(InetAddress.getByAddress(addressRaw), + port); + System.out.println( + " Qr code decoded " + publicKey.getEncoded().length + " " + + remoteSocketAddress); + } catch (Exception e) { + observer.onStateChanged(new CustodianTask.State.Failure( + State.Failure.Reason.QR_CODE_INVALID)); + return; + } + connectAndSendShard(); + } - Socket s = new Socket(); - try { - s.connect(remoteSocketAddress, 120 * 1000); - } catch (IOException e) { - observer.onStateChanged(new CustodianTask.State.Failure(State.Failure.Reason.QR_CODE_INVALID)); - } - System.out.println("Connected *****"); + private void connectAndSendShard() { + observer.onStateChanged(new CustodianTask.State.SendingShard()); + try { + socket.connect(remoteSocketAddress, TIMEOUT); + OutputStream outputStream = socket.getOutputStream(); + outputStream.write("crunchy".getBytes()); + observer.onStateChanged(new CustodianTask.State.ReceivingAck()); + } catch (IOException e) { + observer.onStateChanged(new CustodianTask.State.Failure( + State.Failure.Reason.QR_CODE_INVALID)); + return; + } + System.out.println("Connected *****"); + receiveAck(); + } + + private void receiveAck() { + try { + InputStream inputStream = socket.getInputStream(); + byte[] ackMessage = new byte[3]; + int read = inputStream.read(ackMessage); + if (read < 0) throw new IOException("Ack not read"); + System.out.println("ack message: " + new String(ackMessage)); + observer.onStateChanged(new CustodianTask.State.Success()); + socket.close(); + } catch (IOException e) { + observer.onStateChanged(new CustodianTask.State.Failure( + State.Failure.Reason.QR_CODE_INVALID)); + return; + } } } diff --git a/briar-core/src/main/java/org/briarproject/briar/socialbackup/recovery/SecretOwnerTaskImpl.java b/briar-core/src/main/java/org/briarproject/briar/socialbackup/recovery/SecretOwnerTaskImpl.java index 4da5659d8..e9f007d4c 100644 --- a/briar-core/src/main/java/org/briarproject/briar/socialbackup/recovery/SecretOwnerTaskImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/socialbackup/recovery/SecretOwnerTaskImpl.java @@ -9,9 +9,12 @@ import org.briarproject.bramble.api.lifecycle.IoExecutor; import org.briarproject.briar.api.socialbackup.recovery.SecretOwnerTask; import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.ServerSocket; +import java.net.Socket; import java.util.concurrent.Executor; import javax.inject.Inject; @@ -24,6 +27,10 @@ public class SecretOwnerTaskImpl implements SecretOwnerTask { private boolean cancelled = false; private InetSocketAddress socketAddress; private ClientHelper clientHelper; + private final int PORT = 3002; + private Observer observer; + private ServerSocket serverSocket; + private Socket socket; @Inject SecretOwnerTaskImpl(CryptoComponent crypto, @@ -36,15 +43,15 @@ public class SecretOwnerTaskImpl implements SecretOwnerTask { @Override public void start(Observer observer, InetAddress inetAddress) { + this.observer = observer; if (inetAddress == null) observer.onStateChanged(new State.Failure()); System.out.println("InetAddress is " + inetAddress); - socketAddress = new InetSocketAddress(inetAddress, 3002); + socketAddress = new InetSocketAddress(inetAddress, PORT); // start listening on socketAddress - ServerSocket ss = null; try { - ss = new ServerSocket(); - ss.bind(socketAddress); + serverSocket = new ServerSocket(); + serverSocket.bind(socketAddress); } catch (IOException e) { observer.onStateChanged(new State.Failure()); // TODO could try incrementing the port number @@ -61,11 +68,36 @@ public class SecretOwnerTaskImpl implements SecretOwnerTask { new State.Listening(clientHelper.toByteArray(payloadList))); } catch (Exception e) { observer.onStateChanged(new State.Failure()); + return; + } + receiveShard(); + } + + private void receiveShard() { + try { + socket = serverSocket.accept(); + observer.onStateChanged(new State.ReceivingShard()); + InputStream inputStream = socket.getInputStream(); + byte[] payloadRaw = new byte[7]; + int read = inputStream.read(payloadRaw); + if (read < 0) throw new IOException("Payload not read"); + System.out.println("payload message: " + new String(payloadRaw)); + OutputStream outputStream = socket.getOutputStream(); + outputStream.write("ack".getBytes()); + serverSocket.close(); + } catch (IOException e) { + observer.onStateChanged(new State.Failure()); } } @Override public void cancel() { cancelled = true; + try { + serverSocket.close(); + } catch (IOException e) { + observer.onStateChanged(new State.Failure()); + } + observer.onStateChanged(new State.Failure()); } }