Implement device linking

This commit is contained in:
AsamK 2016-04-07 16:30:20 +02:00
parent f6b9222eda
commit 33956bde62
4 changed files with 114 additions and 6 deletions

View file

@ -26,6 +26,7 @@ import org.freedesktop.dbus.DBusConnection;
import org.freedesktop.dbus.DBusSigHandler;
import org.freedesktop.dbus.exceptions.DBusException;
import org.freedesktop.dbus.exceptions.DBusExecutionException;
import org.whispersystems.libsignal.InvalidKeyException;
import org.whispersystems.signalservice.api.crypto.UntrustedIdentityException;
import org.whispersystems.signalservice.api.messages.*;
import org.whispersystems.signalservice.api.messages.multidevice.ReadMessage;
@ -42,6 +43,7 @@ import java.io.IOException;
import java.security.Security;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeoutException;
public class Main {
@ -144,6 +146,37 @@ public class Main {
System.exit(3);
}
break;
case "link":
if (dBusConn != null) {
System.err.println("link is not yet implemented via dbus");
System.exit(1);
}
// When linking, username is null and we always have to create keys
m.createNewIdentity();
String deviceName = ns.getString("name");
if (deviceName == null) {
deviceName = "cli";
}
try {
System.out.println(m.getDeviceLinkUri());
m.finishDeviceLink(deviceName);
System.out.println("Associated with: " + m.getUsername());
} catch (TimeoutException e) {
System.err.println("Link request timed out, please try again.");
System.exit(3);
} catch (IOException e) {
System.err.println("Link request error: " + e.getMessage());
System.exit(3);
} catch (InvalidKeyException e) {
e.printStackTrace();
System.exit(3);
} catch (UserAlreadyExists e) {
System.err.println("The user " + e.getUsername() + " already exists\nDelete \"" + e.getFileName() + "\" before trying again.");
System.exit(3);
}
break;
case "send":
if (dBusConn == null && !m.isRegistered()) {
System.err.println("User is not registered.");
@ -425,6 +458,10 @@ public class Main {
.description("valid subcommands")
.help("additional help");
Subparser parserLink = subparsers.addParser("link");
parserLink.addArgument("-n", "--name")
.help("Specify a name to describe this new device.");
Subparser parserRegister = subparsers.addParser("register");
parserRegister.addArgument("-v", "--voice")
.help("The verification should be done over voice, not sms.")
@ -477,7 +514,13 @@ public class Main {
try {
Namespace ns = parser.parseArgs(args);
if (!ns.getBoolean("dbus") && !ns.getBoolean("dbus_system")) {
if ("link".equals(ns.getString("command"))) {
if (ns.getString("username") != null) {
parser.printUsage();
System.err.println("You cannot specify a username (phone number) when linking");
System.exit(2);
}
} else if (!ns.getBoolean("dbus") && !ns.getBoolean("dbus_system")) {
if (ns.getString("username") == null) {
parser.printUsage();
System.err.println("You need to specify a username (phone number)");