import org.apache.http.util.TextUtils;
import org.asamk.Signal;
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.signalservice.api.crypto.UntrustedIdentityException;
import org.whispersystems.signalservice.api.messages.*;
+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.push.SignalServiceAddress;
import org.whispersystems.signalservice.api.push.exceptions.EncapsulatedExceptions;
public static void main(String[] args) {
// Workaround for BKS truststore
- Security.insertProviderAt(new org.spongycastle.jce.provider.BouncyCastleProvider(), 1);
+ Security.insertProviderAt(new org.bouncycastle.jce.provider.BouncyCastleProvider(), 1);
Namespace ns = parseArgs(args);
if (ns == null) {
switch (ns.getString("command")) {
case "register":
if (dBusConn != null) {
- System.err.println("register is not yet implementd via dbus");
+ System.err.println("register is not yet implemented via dbus");
System.exit(1);
}
if (!m.userHasKeys()) {
break;
case "verify":
if (dBusConn != null) {
- System.err.println("verify is not yet implementd via dbus");
+ System.err.println("verify is not yet implemented via dbus");
System.exit(1);
}
if (!m.userHasKeys()) {
handleAssertionError(e);
} catch (DBusExecutionException e) {
handleDBusExecutionException(e);
+ } catch (UntrustedIdentityException e) {
+ e.printStackTrace();
}
} else {
String messageText = ns.getString("message");
System.exit(1);
} catch (DBusExecutionException e) {
handleDBusExecutionException(e);
+ } catch (UntrustedIdentityException e) {
+ e.printStackTrace();
}
}
break;
case "receive":
if (dBusConn != null) {
- System.err.println("receive is not yet implementd via dbus");
- System.exit(1);
+ try {
+ dBusConn.addSigHandler(Signal.MessageReceived.class, new DBusSigHandler<Signal.MessageReceived>() {
+ @Override
+ public void handle(Signal.MessageReceived s) {
+ System.out.print(String.format("Envelope from: %s\nTimestamp: %d\nBody: %s\n",
+ s.getSender(), s.getTimestamp(), s.getMessage()));
+ if (s.getGroupId().length > 0) {
+ System.out.println("Group info:");
+ System.out.println(" Id: " + Base64.encodeBytes(s.getGroupId()));
+ }
+ if (s.getAttachments().size() > 0) {
+ System.out.println("Attachments: ");
+ for (String attachment : s.getAttachments()) {
+ System.out.println("- Stored plaintext in: " + attachment);
+ }
+ }
+ System.out.println();
+ }
+ });
+ } catch (DBusException e) {
+ e.printStackTrace();
+ }
+ while (true) {
+ try {
+ Thread.sleep(10000);
+ } catch (InterruptedException e) {
+ System.exit(0);
+ }
+ }
}
if (!m.isRegistered()) {
System.err.println("User is not registered.");
break;
case "quitGroup":
if (dBusConn != null) {
- System.err.println("quitGroup is not yet implementd via dbus");
+ System.err.println("quitGroup is not yet implemented via dbus");
System.exit(1);
}
if (!m.isRegistered()) {
handleAssertionError(e);
} catch (GroupNotFoundException e) {
handleGroupNotFoundException(e);
+ } catch (UntrustedIdentityException e) {
+ e.printStackTrace();
}
break;
case "updateGroup":
if (dBusConn != null) {
- System.err.println("updateGroup is not yet implementd via dbus");
+ System.err.println("updateGroup is not yet implemented via dbus");
System.exit(1);
}
if (!m.isRegistered()) {
handleGroupNotFoundException(e);
} catch (EncapsulatedExceptions e) {
handleEncapsulatedExceptions(e);
+ } catch (UntrustedIdentityException e) {
+ e.printStackTrace();
}
break;
} else {
if (content.getDataMessage().isPresent()) {
SignalServiceDataMessage message = content.getDataMessage().get();
+ handleSignalServiceDataMessage(message, group);
+ }
+ if (content.getSyncMessage().isPresent()) {
+ SignalServiceSyncMessage syncMessage = content.getSyncMessage().get();
- System.out.println("Message timestamp: " + message.getTimestamp());
-
- if (message.getBody().isPresent()) {
- System.out.println("Body: " + message.getBody().get());
+ if (syncMessage.getContacts().isPresent()) {
+ System.out.println("Received sync contacts");
+ printAttachment(syncMessage.getContacts().get());
}
- if (message.getGroupInfo().isPresent()) {
- SignalServiceGroup groupInfo = message.getGroupInfo().get();
- System.out.println("Group info:");
- System.out.println(" Id: " + Base64.encodeBytes(groupInfo.getGroupId()));
- if (groupInfo.getName().isPresent()) {
- System.out.println(" Name: " + groupInfo.getName().get());
- } else if (group != null) {
- System.out.println(" Name: " + group.name);
- } else {
- System.out.println(" Name: <Unknown group>");
+ if (syncMessage.getGroups().isPresent()) {
+ System.out.println("Received sync groups");
+ printAttachment(syncMessage.getGroups().get());
+ }
+ if (syncMessage.getRead().isPresent()) {
+ System.out.println("Received sync read messages list");
+ for (ReadMessage rm : syncMessage.getRead().get()) {
+ System.out.println("From: " + rm.getSender() + " Message timestamp: " + rm.getTimestamp());
}
- System.out.println(" Type: " + groupInfo.getType());
- if (groupInfo.getMembers().isPresent()) {
- for (String member : groupInfo.getMembers().get()) {
- System.out.println(" Member: " + member);
- }
+ }
+ if (syncMessage.getRequest().isPresent()) {
+ System.out.println("Received sync request");
+ if (syncMessage.getRequest().get().isContactsRequest()) {
+ System.out.println(" - contacts request");
}
- if (groupInfo.getAvatar().isPresent()) {
- System.out.println(" Avatar:");
- printAttachment(groupInfo.getAvatar().get());
+ if (syncMessage.getRequest().get().isGroupsRequest()) {
+ System.out.println(" - groups request");
}
}
- if (message.isEndSession()) {
- System.out.println("Is end session");
+ if (syncMessage.getSent().isPresent()) {
+ System.out.println("Received sync sent message");
+ final SentTranscriptMessage sentTranscriptMessage = syncMessage.getSent().get();
+ System.out.println("To: " + (sentTranscriptMessage.getDestination().isPresent() ? sentTranscriptMessage.getDestination().get() : "Unknown") + " , Message timestamp: " + sentTranscriptMessage.getTimestamp());
+ SignalServiceDataMessage message = sentTranscriptMessage.getMessage();
+ handleSignalServiceDataMessage(message, null);
}
-
- if (message.getAttachments().isPresent()) {
- System.out.println("Attachments: ");
- for (SignalServiceAttachment attachment : message.getAttachments().get()) {
- printAttachment(attachment);
- }
- }
- }
- if (content.getSyncMessage().isPresent()) {
- SignalServiceSyncMessage syncMessage = content.getSyncMessage().get();
- System.out.println("Received sync message");
}
}
} else {
System.out.println();
}
+ // TODO remove group parameter
+ private void handleSignalServiceDataMessage(SignalServiceDataMessage message, GroupInfo group) {
+ System.out.println("Message timestamp: " + message.getTimestamp());
+
+ if (message.getBody().isPresent()) {
+ System.out.println("Body: " + message.getBody().get());
+ }
+ if (message.getGroupInfo().isPresent()) {
+ SignalServiceGroup groupInfo = message.getGroupInfo().get();
+ System.out.println("Group info:");
+ System.out.println(" Id: " + Base64.encodeBytes(groupInfo.getGroupId()));
+ if (groupInfo.getName().isPresent()) {
+ System.out.println(" Name: " + groupInfo.getName().get());
+ } else if (group != null) {
+ System.out.println(" Name: " + group.name);
+ } else {
+ System.out.println(" Name: <Unknown group>");
+ }
+ System.out.println(" Type: " + groupInfo.getType());
+ if (groupInfo.getMembers().isPresent()) {
+ for (String member : groupInfo.getMembers().get()) {
+ System.out.println(" Member: " + member);
+ }
+ }
+ if (groupInfo.getAvatar().isPresent()) {
+ System.out.println(" Avatar:");
+ printAttachment(groupInfo.getAvatar().get());
+ }
+ }
+ if (message.isEndSession()) {
+ System.out.println("Is end session");
+ }
+
+ if (message.getAttachments().isPresent()) {
+ System.out.println("Attachments: ");
+ for (SignalServiceAttachment attachment : message.getAttachments().get()) {
+ printAttachment(attachment);
+ }
+ }
+ }
+
private void printAttachment(SignalServiceAttachment attachment) {
System.out.println("- " + attachment.getContentType() + " (" + (attachment.isPointer() ? "Pointer" : "") + (attachment.isStream() ? "Stream" : "") + ")");
if (attachment.isPointer()) {
try {
conn.sendSignal(new Signal.MessageReceived(
SIGNAL_OBJECTPATH,
+ message.getTimestamp(),
envelope.getSource(),
message.getGroupInfo().isPresent() ? message.getGroupInfo().get().getGroupId() : new byte[0],
message.getBody().isPresent() ? message.getBody().get() : "",