X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/083e33c4daaa7a4de0a2cd421060e60855f80378..5c117bd863c6b01e21b2865ebffd04c5cb23003c:/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 f05bec19..e5a2288f 100644 --- a/src/main/java/org/asamk/signal/Main.java +++ b/src/main/java/org/asamk/signal/Main.java @@ -23,10 +23,13 @@ import org.apache.commons.io.IOUtils; 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; @@ -47,7 +50,7 @@ public class Main { 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) { @@ -108,7 +111,7 @@ public class Main { 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()) { @@ -123,7 +126,7 @@ public class Main { 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()) { @@ -163,6 +166,8 @@ public class Main { handleAssertionError(e); } catch (DBusExecutionException e) { handleDBusExecutionException(e); + } catch (UntrustedIdentityException e) { + e.printStackTrace(); } } else { String messageText = ns.getString("message"); @@ -201,14 +206,43 @@ public class Main { 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() { + @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."); @@ -234,7 +268,7 @@ public class Main { 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()) { @@ -252,12 +286,14 @@ public class Main { 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()) { @@ -284,6 +320,8 @@ public class Main { handleGroupNotFoundException(e); } catch (EncapsulatedExceptions e) { handleEncapsulatedExceptions(e); + } catch (UntrustedIdentityException e) { + e.printStackTrace(); } break; @@ -509,49 +547,42 @@ public class Main { } 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: "); + 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 (message.getAttachments().isPresent()) { - System.out.println("Attachments: "); - for (SignalServiceAttachment attachment : message.getAttachments().get()) { - printAttachment(attachment); - } + 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 (content.getSyncMessage().isPresent()) { - SignalServiceSyncMessage syncMessage = content.getSyncMessage().get(); - System.out.println("Received sync message"); - } } } else { System.out.println("Unknown message received."); @@ -559,6 +590,47 @@ public class Main { 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: "); + } + 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()) { @@ -573,94 +645,46 @@ public class Main { } } - private static class DbusReceiveMessageHandler implements Manager.ReceiveMessageHandler { - final Manager m; + private static class DbusReceiveMessageHandler extends ReceiveMessageHandler { final DBusConnection conn; public DbusReceiveMessageHandler(Manager m, DBusConnection conn) { - this.m = m; + super(m); this.conn = conn; } @Override public void handleMessage(SignalServiceEnvelope envelope, SignalServiceContent content, GroupInfo group) { - System.out.println("Envelope from: " + envelope.getSource()); - System.out.println("Timestamp: " + envelope.getTimestamp()); - - if (envelope.isReceipt()) { - System.out.println("Got receipt."); - } else if (envelope.isSignalMessage() | envelope.isPreKeySignalMessage()) { - if (content == null) { - System.out.println("Failed to decrypt message."); - } else { - if (content.getDataMessage().isPresent()) { - SignalServiceDataMessage message = content.getDataMessage().get(); - - 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: "); - } - 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"); - } - - List attachments = new ArrayList<>(); - if (message.getAttachments().isPresent()) { - System.out.println("Attachments: "); - for (SignalServiceAttachment attachment : message.getAttachments().get()) { - if (attachment.isPointer()) { - attachments.add(m.getAttachmentFile(attachment.asPointer().getId()).getAbsolutePath()); - } - printAttachment(attachment); - } - } - if (!message.isEndSession() && - !(message.getGroupInfo().isPresent() && message.getGroupInfo().get().getType() != SignalServiceGroup.Type.DELIVER)) { - try { - conn.sendSignal(new Signal.MessageReceived( - SIGNAL_OBJECTPATH, - envelope.getSource(), - message.getGroupInfo().isPresent() ? message.getGroupInfo().get().getGroupId() : new byte[0], - message.getBody().isPresent() ? message.getBody().get() : "", - attachments)); - } catch (DBusException e) { - e.printStackTrace(); + super.handleMessage(envelope, content, group); + + if (!envelope.isReceipt() && content != null && content.getDataMessage().isPresent()) { + SignalServiceDataMessage message = content.getDataMessage().get(); + + if (!message.isEndSession() && + !(message.getGroupInfo().isPresent() && + message.getGroupInfo().get().getType() != SignalServiceGroup.Type.DELIVER)) { + List attachments = new ArrayList<>(); + if (message.getAttachments().isPresent()) { + for (SignalServiceAttachment attachment : message.getAttachments().get()) { + if (attachment.isPointer()) { + attachments.add(m.getAttachmentFile(attachment.asPointer().getId()).getAbsolutePath()); } } } - if (content.getSyncMessage().isPresent()) { - SignalServiceSyncMessage syncMessage = content.getSyncMessage().get(); - System.out.println("Received sync message"); + + 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() : "", + attachments)); + } catch (DBusException e) { + e.printStackTrace(); } } - } else { - System.out.println("Unknown message received."); } - System.out.println(); } private void printAttachment(SignalServiceAttachment attachment) {