mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-14 03:39:05 +01:00
Basic handshake implementation
This commit is contained in:
@@ -1,16 +1,16 @@
|
|||||||
package org.briarproject.briar.socialbackup.recovery;
|
package org.briarproject.briar.socialbackup.recovery;
|
||||||
|
|
||||||
import org.briarproject.bramble.api.FormatException;
|
|
||||||
import org.briarproject.bramble.api.client.ClientHelper;
|
import org.briarproject.bramble.api.client.ClientHelper;
|
||||||
import org.briarproject.bramble.api.crypto.AgreementPublicKey;
|
import org.briarproject.bramble.api.crypto.AgreementPublicKey;
|
||||||
import org.briarproject.bramble.api.data.BdfList;
|
import org.briarproject.bramble.api.data.BdfList;
|
||||||
import org.briarproject.briar.api.socialbackup.recovery.CustodianTask;
|
import org.briarproject.briar.api.socialbackup.recovery.CustodianTask;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
import java.net.InetAddress;
|
import java.net.InetAddress;
|
||||||
import java.net.InetSocketAddress;
|
import java.net.InetSocketAddress;
|
||||||
import java.net.Socket;
|
import java.net.Socket;
|
||||||
import java.security.PublicKey;
|
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
@@ -20,6 +20,8 @@ public class CustodianTaskImpl implements CustodianTask {
|
|||||||
private Observer observer;
|
private Observer observer;
|
||||||
private ClientHelper clientHelper;
|
private ClientHelper clientHelper;
|
||||||
private InetSocketAddress remoteSocketAddress;
|
private InetSocketAddress remoteSocketAddress;
|
||||||
|
private Socket socket = new Socket();
|
||||||
|
private final int TIMEOUT = 120 * 1000;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
CustodianTaskImpl(ClientHelper clientHelper) {
|
CustodianTaskImpl(ClientHelper clientHelper) {
|
||||||
@@ -34,30 +36,68 @@ public class CustodianTaskImpl implements CustodianTask {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void cancel() {
|
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
|
@Override
|
||||||
public void qrCodeDecoded(byte[] qrCodePayloadRaw) {
|
public void qrCodeDecoded(byte[] qrCodePayloadRaw) {
|
||||||
try {
|
try {
|
||||||
BdfList qrCodePayload = clientHelper.toList(qrCodePayloadRaw);
|
BdfList qrCodePayload = clientHelper.toList(qrCodePayloadRaw);
|
||||||
AgreementPublicKey publicKey = new AgreementPublicKey(qrCodePayload.getRaw(0));
|
AgreementPublicKey publicKey =
|
||||||
byte[] addressRaw = qrCodePayload.getRaw(1);
|
new AgreementPublicKey(qrCodePayload.getRaw(0));
|
||||||
int port = qrCodePayload.getLong(2).intValue();
|
byte[] addressRaw = qrCodePayload.getRaw(1);
|
||||||
remoteSocketAddress = new InetSocketAddress(InetAddress.getByAddress(addressRaw), port);
|
int port = qrCodePayload.getLong(2).intValue();
|
||||||
System.out.println(" Qr code decoded " + publicKey.getEncoded().length + " " + remoteSocketAddress);
|
remoteSocketAddress =
|
||||||
observer.onStateChanged(new CustodianTask.State.SendingShard());
|
new InetSocketAddress(InetAddress.getByAddress(addressRaw),
|
||||||
} catch (Exception e) {
|
port);
|
||||||
observer.onStateChanged(new CustodianTask.State.Failure(State.Failure.Reason.QR_CODE_INVALID));
|
System.out.println(
|
||||||
return;
|
" 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();
|
private void connectAndSendShard() {
|
||||||
try {
|
observer.onStateChanged(new CustodianTask.State.SendingShard());
|
||||||
s.connect(remoteSocketAddress, 120 * 1000);
|
try {
|
||||||
} catch (IOException e) {
|
socket.connect(remoteSocketAddress, TIMEOUT);
|
||||||
observer.onStateChanged(new CustodianTask.State.Failure(State.Failure.Reason.QR_CODE_INVALID));
|
OutputStream outputStream = socket.getOutputStream();
|
||||||
}
|
outputStream.write("crunchy".getBytes());
|
||||||
System.out.println("Connected *****");
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,9 +9,12 @@ import org.briarproject.bramble.api.lifecycle.IoExecutor;
|
|||||||
import org.briarproject.briar.api.socialbackup.recovery.SecretOwnerTask;
|
import org.briarproject.briar.api.socialbackup.recovery.SecretOwnerTask;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
import java.net.InetAddress;
|
import java.net.InetAddress;
|
||||||
import java.net.InetSocketAddress;
|
import java.net.InetSocketAddress;
|
||||||
import java.net.ServerSocket;
|
import java.net.ServerSocket;
|
||||||
|
import java.net.Socket;
|
||||||
import java.util.concurrent.Executor;
|
import java.util.concurrent.Executor;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
@@ -24,6 +27,10 @@ public class SecretOwnerTaskImpl implements SecretOwnerTask {
|
|||||||
private boolean cancelled = false;
|
private boolean cancelled = false;
|
||||||
private InetSocketAddress socketAddress;
|
private InetSocketAddress socketAddress;
|
||||||
private ClientHelper clientHelper;
|
private ClientHelper clientHelper;
|
||||||
|
private final int PORT = 3002;
|
||||||
|
private Observer observer;
|
||||||
|
private ServerSocket serverSocket;
|
||||||
|
private Socket socket;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
SecretOwnerTaskImpl(CryptoComponent crypto,
|
SecretOwnerTaskImpl(CryptoComponent crypto,
|
||||||
@@ -36,15 +43,15 @@ public class SecretOwnerTaskImpl implements SecretOwnerTask {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void start(Observer observer, InetAddress inetAddress) {
|
public void start(Observer observer, InetAddress inetAddress) {
|
||||||
|
this.observer = observer;
|
||||||
if (inetAddress == null) observer.onStateChanged(new State.Failure());
|
if (inetAddress == null) observer.onStateChanged(new State.Failure());
|
||||||
System.out.println("InetAddress is " + inetAddress);
|
System.out.println("InetAddress is " + inetAddress);
|
||||||
socketAddress = new InetSocketAddress(inetAddress, 3002);
|
socketAddress = new InetSocketAddress(inetAddress, PORT);
|
||||||
|
|
||||||
// start listening on socketAddress
|
// start listening on socketAddress
|
||||||
ServerSocket ss = null;
|
|
||||||
try {
|
try {
|
||||||
ss = new ServerSocket();
|
serverSocket = new ServerSocket();
|
||||||
ss.bind(socketAddress);
|
serverSocket.bind(socketAddress);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
observer.onStateChanged(new State.Failure());
|
observer.onStateChanged(new State.Failure());
|
||||||
// TODO could try incrementing the port number
|
// TODO could try incrementing the port number
|
||||||
@@ -61,11 +68,36 @@ public class SecretOwnerTaskImpl implements SecretOwnerTask {
|
|||||||
new State.Listening(clientHelper.toByteArray(payloadList)));
|
new State.Listening(clientHelper.toByteArray(payloadList)));
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
observer.onStateChanged(new State.Failure());
|
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
|
@Override
|
||||||
public void cancel() {
|
public void cancel() {
|
||||||
cancelled = true;
|
cancelled = true;
|
||||||
|
try {
|
||||||
|
serverSocket.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
observer.onStateChanged(new State.Failure());
|
||||||
|
}
|
||||||
|
observer.onStateChanged(new State.Failure());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user