import net.sourceforge.argparse4j.ArgumentParsers;
import net.sourceforge.argparse4j.impl.Arguments;
-import net.sourceforge.argparse4j.inf.ArgumentParser;
-import net.sourceforge.argparse4j.inf.ArgumentParserException;
-import net.sourceforge.argparse4j.inf.MutuallyExclusiveGroup;
-import net.sourceforge.argparse4j.inf.Namespace;
-import net.sourceforge.argparse4j.inf.Subparser;
-import net.sourceforge.argparse4j.inf.Subparsers;
-
+import net.sourceforge.argparse4j.inf.*;
import org.apache.http.util.TextUtils;
import org.asamk.Signal;
import org.asamk.signal.storage.contacts.ContactInfo;
import org.freedesktop.dbus.exceptions.DBusExecutionException;
import org.whispersystems.libsignal.InvalidKeyException;
import org.whispersystems.signalservice.api.crypto.UntrustedIdentityException;
-import org.whispersystems.signalservice.api.messages.SignalServiceAttachment;
-import org.whispersystems.signalservice.api.messages.SignalServiceAttachmentPointer;
-import org.whispersystems.signalservice.api.messages.SignalServiceContent;
-import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage;
-import org.whispersystems.signalservice.api.messages.SignalServiceEnvelope;
-import org.whispersystems.signalservice.api.messages.SignalServiceGroup;
-import org.whispersystems.signalservice.api.messages.multidevice.BlockedListMessage;
-import org.whispersystems.signalservice.api.messages.multidevice.DeviceInfo;
-import org.whispersystems.signalservice.api.messages.multidevice.ReadMessage;
-import org.whispersystems.signalservice.api.messages.multidevice.SentTranscriptMessage;
-import org.whispersystems.signalservice.api.messages.multidevice.SignalServiceSyncMessage;
+import org.whispersystems.signalservice.api.messages.*;
+import org.whispersystems.signalservice.api.messages.multidevice.*;
import org.whispersystems.signalservice.api.push.SignalServiceAddress;
import org.whispersystems.signalservice.api.push.exceptions.EncapsulatedExceptions;
import org.whispersystems.signalservice.api.push.exceptions.NetworkFailureException;
import java.security.Security;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.TimeZone;
+import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
break;
case "updateGroup":
- if (dBusConn != null) {
- System.err.println("updateGroup is not yet implemented via dbus");
- return 1;
- }
- if (!m.isRegistered()) {
+ if (dBusConn == null && !m.isRegistered()) {
System.err.println("User is not registered.");
return 1;
}
if (ns.getString("group") != null) {
groupId = decodeGroupId(ns.getString("group"));
}
- byte[] newGroupId = m.sendUpdateGroupMessage(groupId, ns.getString("name"), ns.<String>getList("member"), ns.getString("avatar"));
if (groupId == null) {
+ groupId = new byte[0];
+ }
+ String groupName = ns.getString("name");
+ if (groupName == null) {
+ groupName = "";
+ }
+ List<String> groupMembers = ns.<String>getList("member");
+ if (groupMembers == null) {
+ groupMembers = new ArrayList<String>();
+ }
+ String groupAvatar = ns.getString("avatar");
+ if (groupAvatar == null) {
+ groupAvatar = "";
+ }
+ byte[] newGroupId = ts.updateGroup(groupId, groupName, groupMembers, groupAvatar);
+ if (groupId.length != newGroupId.length) {
System.out.println("Creating new group \"" + Base64.encodeBytes(newGroupId) + "\" …");
}
} catch (IOException e) {
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);
}
System.out.println(String.format("%s: %s Added: %s Fingerprint: %s Safety Number: %s", theirUsername,
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",
parserUpdateGroup.addArgument("-m", "--member")
.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");
SignalServiceSyncMessage syncMessage = content.getSyncMessage().get();
if (syncMessage.getContacts().isPresent()) {
- System.out.println("Received sync contacts");
- printAttachment(syncMessage.getContacts().get());
+ final ContactsMessage contactsMessage = syncMessage.getContacts().get();
+ if (contactsMessage.isComplete()) {
+ System.out.println("Received complete sync contacts");
+ } else {
+ System.out.println("Received sync contacts");
+ }
+ printAttachment(contactsMessage.getContactsStream());
}
if (syncMessage.getGroups().isPresent()) {
System.out.println("Received sync groups");
System.out.println(" - " + number);
}
}
+ if (syncMessage.getVerified().isPresent()) {
+ System.out.println("Received sync message with verified identities:");
+ final List<VerifiedMessage> verifiedList = syncMessage.getVerified().get();
+ for (VerifiedMessage v : verifiedList) {
+ System.out.println(" - " + v.getDestination() + ": " + v.getVerified());
+ String safetyNumber = formatSafetyNumber(m.computeSafetyNumber(v.getDestination(), v.getIdentityKey()));
+ System.out.println(" " + safetyNumber);
+ }
+
+ }
}
}
} else {
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" : "<unavailable>") + (pointer.getPreview().isPresent() ? " (Preview is available: " + pointer.getPreview().get().length + " bytes)" : ""));
+ System.out.println(" Voice note: " + (pointer.getVoiceNote() ? "yes" : "no"));
File file = m.getAttachmentFile(pointer.getId());
if (file.exists()) {
System.out.println(" Stored plaintext in: " + file);