X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/d89e93ad473cc1c6dd5f4dc615b7d0c5721e3dc2..3c3d3e92dd68c381d3e03b6447a73614e6a86ff4:/src/main/java/org/asamk/signal/Main.java diff --git a/src/main/java/org/asamk/signal/Main.java b/src/main/java/org/asamk/signal/Main.java index 7d89d480..c8963659 100644 --- a/src/main/java/org/asamk/signal/Main.java +++ b/src/main/java/org/asamk/signal/Main.java @@ -21,6 +21,11 @@ import net.sourceforge.argparse4j.impl.Arguments; import net.sourceforge.argparse4j.inf.*; import org.apache.http.util.TextUtils; import org.asamk.Signal; +import org.asamk.signal.storage.contacts.ContactInfo; +import org.asamk.signal.storage.groups.GroupInfo; +import org.asamk.signal.storage.protocol.JsonIdentityKeyStore; +import org.asamk.signal.util.Base64; +import org.asamk.signal.util.Hex; import org.freedesktop.dbus.DBusConnection; import org.freedesktop.dbus.DBusSigHandler; import org.freedesktop.dbus.exceptions.DBusException; @@ -88,6 +93,9 @@ public class Main { ts = (Signal) dBusConn.getRemoteObject( SIGNAL_BUSNAME, SIGNAL_OBJECTPATH, Signal.class); + } catch (UnsatisfiedLinkError e) { + System.err.println("Missing native library dependency for dbus service: " + e.getMessage()); + return 1; } catch (DBusException e) { e.printStackTrace(); if (dBusConn != null) { @@ -135,6 +143,38 @@ public class Main { return 3; } break; + case "unregister": + if (dBusConn != null) { + System.err.println("unregister is not yet implemented via dbus"); + return 1; + } + if (!m.isRegistered()) { + System.err.println("User is not registered."); + return 1; + } + try { + m.unregister(); + } catch (IOException e) { + System.err.println("Unregister error: " + e.getMessage()); + return 3; + } + break; + case "updateAccount": + if (dBusConn != null) { + System.err.println("updateAccount is not yet implemented via dbus"); + return 1; + } + if (!m.isRegistered()) { + System.err.println("User is not registered."); + return 1; + } + try { + m.updateAccountAttributes(); + } catch (IOException e) { + System.err.println("UpdateAccount error: " + e.getMessage()); + return 3; + } + break; case "verify": if (dBusConn != null) { System.err.println("verify is not yet implemented via dbus"); @@ -350,6 +390,9 @@ public class Main { System.out.println(); } }); + } catch (UnsatisfiedLinkError e) { + System.err.println("Missing native library dependency for dbus service: " + e.getMessage()); + return 1; } catch (DBusException e) { e.printStackTrace(); return 1; @@ -453,6 +496,23 @@ public class Main { return 3; } + break; + case "listGroups": + if (dBusConn != null) { + System.err.println("listGroups is not yet implemented via dbus"); + return 1; + } + if (!m.isRegistered()) { + System.err.println("User is not registered."); + return 1; + } + + List groups = m.getGroups(); + boolean detailed = ns.getBoolean("detailed"); + + for (GroupInfo group : groups) { + printGroup(group, detailed); + } break; case "listIdentities": if (dBusConn != null) { @@ -546,6 +606,9 @@ public class Main { conn = DBusConnection.getConnection(busType); conn.exportObject(SIGNAL_OBJECTPATH, m); conn.requestBusName(SIGNAL_BUSNAME); + } catch (UnsatisfiedLinkError e) { + System.err.println("Missing native library dependency for dbus service: " + e.getMessage()); + return 1; } catch (DBusException e) { e.printStackTrace(); return 2; @@ -577,9 +640,19 @@ public class Main { } private static void printIdentityFingerprint(Manager m, String theirUsername, JsonIdentityKeyStore.Identity theirId) { - String digits = formatSafetyNumber(m.computeSafetyNumber(theirUsername, theirId.identityKey)); + String digits = formatSafetyNumber(m.computeSafetyNumber(theirUsername, theirId.getIdentityKey())); System.out.println(String.format("%s: %s Added: %s Fingerprint: %s Safety Number: %s", theirUsername, - theirId.trustLevel, theirId.added, Hex.toStringCondensed(theirId.getFingerprint()), digits)); + theirId.getTrustLevel(), theirId.getDateAdded(), Hex.toStringCondensed(theirId.getFingerprint()), digits)); + } + + private static void printGroup(GroupInfo group, boolean detailed) { + if (detailed) { + System.out.println(String.format("Id: %s Name: %s Active: %s Members: %s", + Base64.encodeBytes(group.groupId), group.name, group.active, group.members)); + } else { + System.out.println(String.format("Id: %s Name: %s Active: %s", Base64.encodeBytes(group.groupId), + group.name, group.active)); + } } private static String formatSafetyNumber(String digits) { @@ -670,6 +743,12 @@ public class Main { .help("The verification should be done over voice, not sms.") .action(Arguments.storeTrue()); + Subparser parserUnregister = subparsers.addParser("unregister"); + parserUnregister.help("Unregister the current device from the signal server."); + + Subparser parserUpdateAccount = subparsers.addParser("updateAccount"); + parserUpdateAccount.help("Update the account attributes on the signal server."); + Subparser parserVerify = subparsers.addParser("verify"); parserVerify.addArgument("verificationCode") .help("The verification code you received via sms or voice call."); @@ -705,6 +784,11 @@ public class Main { .nargs("*") .help("Specify one or more members to add to the group"); + Subparser parserListGroups = subparsers.addParser("listGroups"); + parserListGroups.addArgument("-d", "--detailed").action(Arguments.storeTrue()) + .help("List members of each group"); + parserListGroups.help("List group name and ids"); + Subparser parserListIdentities = subparsers.addParser("listIdentities"); parserListIdentities.addArgument("-n", "--number") .help("Only show identity keys for the given phone number."); @@ -954,6 +1038,7 @@ public class Main { if (attachment.isPointer()) { final SignalServiceAttachmentPointer pointer = attachment.asPointer(); System.out.println(" Id: " + pointer.getId() + " Key length: " + pointer.getKey().length + (pointer.getRelay().isPresent() ? " Relay: " + pointer.getRelay().get() : "")); + System.out.println(" Filename: " + (pointer.getFileName().isPresent() ? pointer.getFileName().get() : "-")); System.out.println(" Size: " + (pointer.getSize().isPresent() ? pointer.getSize().get() + " bytes" : "") + (pointer.getPreview().isPresent() ? " (Preview is available: " + pointer.getPreview().get().length + " bytes)" : "")); File file = m.getAttachmentFile(pointer.getId()); if (file.exists()) {