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;
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) {
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");
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;
returnOnTimeout = false;
timeout = 3600;
}
+ boolean ignoreAttachments = ns.getBoolean("ignore_attachments");
try {
- m.receiveMessages((long) (timeout * 1000), TimeUnit.MILLISECONDS, returnOnTimeout, new ReceiveMessageHandler(m));
+ m.receiveMessages((long) (timeout * 1000), TimeUnit.MILLISECONDS, returnOnTimeout, ignoreAttachments, new ReceiveMessageHandler(m));
} catch (IOException e) {
System.err.println("Error while receiving messages: " + e.getMessage());
return 3;
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<GroupInfo> groups = m.getGroups();
+ boolean detailed = ns.getBoolean("detailed");
+
+ for (GroupInfo group : groups) {
+ printGroup(group, detailed);
+ }
break;
case "listIdentities":
if (dBusConn != null) {
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;
}
+ ignoreAttachments = ns.getBoolean("ignore_attachments");
try {
- m.receiveMessages(1, TimeUnit.HOURS, false, new DbusReceiveMessageHandler(m, conn));
+ m.receiveMessages(1, TimeUnit.HOURS, false, ignoreAttachments, new DbusReceiveMessageHandler(m, conn));
} catch (IOException e) {
System.err.println("Error while receiving messages: " + e.getMessage());
return 3;
}
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) {
.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.");
.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.");
parserReceive.addArgument("-t", "--timeout")
.type(double.class)
.help("Number of seconds to wait for new messages (negative values disable timeout)");
+ parserReceive.addArgument("--ignore-attachments")
+ .help("Don’t download attachments of received messages.")
+ .action(Arguments.storeTrue());
Subparser parserDaemon = subparsers.addParser("daemon");
parserDaemon.addArgument("--system")
.action(Arguments.storeTrue())
.help("Use DBus system bus instead of user bus.");
+ parserDaemon.addArgument("--ignore-attachments")
+ .help("Don’t download attachments of received messages.")
+ .action(Arguments.storeTrue());
try {
Namespace ns = parser.parseArgs(args);