From c542fb87cb7c5ff7146c0853328189a5a1ebbb6d Mon Sep 17 00:00:00 2001 From: AsamK Date: Sat, 26 Nov 2016 12:44:17 +0100 Subject: [PATCH 01/16] Add missing close of attachment input stream --- src/main/java/org/asamk/signal/Manager.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/asamk/signal/Manager.java b/src/main/java/org/asamk/signal/Manager.java index b16c8eae..ee5aeeb3 100644 --- a/src/main/java/org/asamk/signal/Manager.java +++ b/src/main/java/org/asamk/signal/Manager.java @@ -1320,6 +1320,7 @@ class Manager implements Signal { if (output != null) { output.close(); } + input.close(); if (!tmpFile.delete()) { System.err.println("Failed to delete temp file: " + tmpFile); } -- 2.51.0 From 5b839bbae08762cc6012f5941a46bb613801b126 Mon Sep 17 00:00:00 2001 From: AsamK Date: Sat, 26 Nov 2016 13:26:04 +0100 Subject: [PATCH 02/16] Fix crash when receiving group request for unkown group Fixes #33 --- src/main/java/org/asamk/signal/Manager.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/asamk/signal/Manager.java b/src/main/java/org/asamk/signal/Manager.java index ee5aeeb3..8de14b2d 100644 --- a/src/main/java/org/asamk/signal/Manager.java +++ b/src/main/java/org/asamk/signal/Manager.java @@ -938,10 +938,14 @@ class Manager implements Signal { } break; case REQUEST_INFO: - try { - sendUpdateGroupMessage(groupInfo.getGroupId(), source); - } catch (IOException | EncapsulatedExceptions e) { - e.printStackTrace(); + if (group != null) { + try { + sendUpdateGroupMessage(groupInfo.getGroupId(), source); + } catch (IOException | EncapsulatedExceptions e) { + e.printStackTrace(); + } catch (NotAGroupMemberException e) { + // We have left this group, so don't send a group update message + } } break; } -- 2.51.0 From eb0860d350fd0fda94536f369deddf8b938fd169 Mon Sep 17 00:00:00 2001 From: AsamK Date: Sat, 26 Nov 2016 13:42:29 +0100 Subject: [PATCH 03/16] Add another missing close() --- src/main/java/org/asamk/signal/Manager.java | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/asamk/signal/Manager.java b/src/main/java/org/asamk/signal/Manager.java index 8de14b2d..77647d27 100644 --- a/src/main/java/org/asamk/signal/Manager.java +++ b/src/main/java/org/asamk/signal/Manager.java @@ -1372,13 +1372,17 @@ class Manager implements Signal { if (groupsFile.exists() && groupsFile.length() > 0) { FileInputStream contactsFileStream = new FileInputStream(groupsFile); - SignalServiceAttachmentStream attachmentStream = SignalServiceAttachment.newStreamBuilder() - .withStream(contactsFileStream) - .withContentType("application/octet-stream") - .withLength(groupsFile.length()) - .build(); - - sendSyncMessage(SignalServiceSyncMessage.forGroups(attachmentStream)); + try { + SignalServiceAttachmentStream attachmentStream = SignalServiceAttachment.newStreamBuilder() + .withStream(contactsFileStream) + .withContentType("application/octet-stream") + .withLength(groupsFile.length()) + .build(); + + sendSyncMessage(SignalServiceSyncMessage.forGroups(attachmentStream)); + } finally { + contactsFileStream.close(); + } } } finally { groupsFile.delete(); -- 2.51.0 From 9dc42e4d33ae51441f39da97f7768483d0e030df Mon Sep 17 00:00:00 2001 From: Lars Wallenborn Date: Mon, 28 Nov 2016 10:20:32 +0100 Subject: [PATCH 04/16] Update README.md (#31) --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 617742c2..8aa5cfb2 100644 --- a/README.md +++ b/README.md @@ -105,6 +105,12 @@ usage: signal-cli [-h] [-v] [--config CONFIG] [-u USERNAME | --dbus | --dbus-sys signal-cli -u USERNAME trust -a NUMBER +* Set configuration directory + + signal-cli --config=/home/other_user/.config/signal + + This is particularily useful in the case, when you would like to run the signal-cli tool as a different user as the one, that was used to register the account. You should make sure, that the caller has full read/write access to the given directory. + ## DBus service signal-cli can run in daemon mode and provides an experimental dbus interface. -- 2.51.0 From ae3e5be1241b3ae9d27fff950c3bb54bdcdc32e7 Mon Sep 17 00:00:00 2001 From: AsamK Date: Mon, 28 Nov 2016 10:30:52 +0100 Subject: [PATCH 05/16] Update README.md --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8aa5cfb2..984f2d67 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,8 @@ sudo ln -sf /opt/signal-cli-"${VERSION}"/bin/signal-cli /usr/local/bin/ usage: signal-cli [-h] [-v] [--config CONFIG] [-u USERNAME | --dbus | --dbus-system] {link,addDevice,listDevices,removeDevice,register,verify,send,quitGroup,updateGroup,listIdentities,trust,receive,daemon} ... +See also: [man page in asciidoc format](https://github.com/AsamK/signal-cli/blob/master/man/signal-cli.1.txt) + * Register a number (with SMS verification) signal-cli -u USERNAME register @@ -109,7 +111,7 @@ usage: signal-cli [-h] [-v] [--config CONFIG] [-u USERNAME | --dbus | --dbus-sys signal-cli --config=/home/other_user/.config/signal - This is particularily useful in the case, when you would like to run the signal-cli tool as a different user as the one, that was used to register the account. You should make sure, that the caller has full read/write access to the given directory. + This is particularily useful in the case, when you would like to run the signal-cli tool as a different user as the one, that was used to register the account. You should make sure, that the caller has full read/write access to the given directory. ## DBus service -- 2.51.0 From e364610c9304d6770118f36d02f8df74e452a43f Mon Sep 17 00:00:00 2001 From: Benedikt Constantin Radtke Date: Sun, 27 Nov 2016 19:11:44 +0100 Subject: [PATCH 06/16] use java7's nio api to get more detailed error messages --- src/main/java/org/asamk/signal/Manager.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/asamk/signal/Manager.java b/src/main/java/org/asamk/signal/Manager.java index 77647d27..d329990d 100644 --- a/src/main/java/org/asamk/signal/Manager.java +++ b/src/main/java/org/asamk/signal/Manager.java @@ -1325,8 +1325,11 @@ class Manager implements Signal { output.close(); } input.close(); - if (!tmpFile.delete()) { - System.err.println("Failed to delete temp file: " + tmpFile); + try { + Files.delete(tmpFile.toPath()); + } catch(Exception e) { + System.out.println("Failed to delete temp file: " + tmpFile); + e.printStackTrace(); } } return outputFile; -- 2.51.0 From 2351a89b0046d54f0830c536cc504a04436cf2b4 Mon Sep 17 00:00:00 2001 From: AsamK Date: Mon, 28 Nov 2016 12:28:44 +0100 Subject: [PATCH 07/16] Use nio Files.delete instead of File.delete everywhere --- src/main/java/org/asamk/signal/Manager.java | 93 +++++++++++++-------- src/main/java/org/asamk/signal/Util.java | 6 ++ 2 files changed, 65 insertions(+), 34 deletions(-) diff --git a/src/main/java/org/asamk/signal/Manager.java b/src/main/java/org/asamk/signal/Manager.java index d329990d..d06a07c0 100644 --- a/src/main/java/org/asamk/signal/Manager.java +++ b/src/main/java/org/asamk/signal/Manager.java @@ -993,7 +993,6 @@ class Manager implements Signal { continue; } - String sender = dir.getName(); for (final File fileEntry : dir.listFiles()) { if (!fileEntry.isFile()) { continue; @@ -1019,7 +1018,11 @@ class Manager implements Signal { } save(); handler.handleMessage(envelope, content, null); - fileEntry.delete(); + try { + Files.delete(fileEntry.toPath()); + } catch (IOException e) { + System.out.println("Failed to delete cached message file “" + fileEntry + "”: " + e.getMessage()); + } } } } @@ -1069,12 +1072,12 @@ class Manager implements Signal { save(); handler.handleMessage(envelope, content, exception); if (exception == null || !(exception instanceof org.whispersystems.libsignal.UntrustedIdentityException)) { + File cacheFile = null; try { - File cacheFile = getMessageCacheFile(envelope.getSource(), now, envelope.getTimestamp()); - cacheFile.delete(); + cacheFile = getMessageCacheFile(envelope.getSource(), now, envelope.getTimestamp()); + Files.delete(cacheFile.toPath()); } catch (IOException e) { - // Ignoring - return; + System.out.println("Failed to delete cached message file “" + cacheFile + "”: " + e.getMessage()); } } } @@ -1114,8 +1117,10 @@ class Manager implements Signal { } } if (syncMessage.getGroups().isPresent()) { + File tmpFile = null; try { - DeviceGroupsInputStream s = new DeviceGroupsInputStream(retrieveAttachmentAsStream(syncMessage.getGroups().get().asPointer())); + tmpFile = Util.createTempFile(); + DeviceGroupsInputStream s = new DeviceGroupsInputStream(retrieveAttachmentAsStream(syncMessage.getGroups().get().asPointer(), tmpFile)); DeviceGroup g; while ((g = s.read()) != null) { GroupInfo syncGroup = groupStore.getGroup(g.getId()); @@ -1135,14 +1140,24 @@ class Manager implements Signal { } } catch (Exception e) { e.printStackTrace(); + } finally { + if (tmpFile != null) { + try { + Files.delete(tmpFile.toPath()); + } catch (IOException e) { + System.out.println("Failed to delete temp file “" + tmpFile + "”: " + e.getMessage()); + } + } } if (syncMessage.getBlockedList().isPresent()) { // TODO store list of blocked numbers } } if (syncMessage.getContacts().isPresent()) { + File tmpFile = null; try { - DeviceContactsInputStream s = new DeviceContactsInputStream(retrieveAttachmentAsStream(syncMessage.getContacts().get().asPointer())); + tmpFile = Util.createTempFile(); + DeviceContactsInputStream s = new DeviceContactsInputStream(retrieveAttachmentAsStream(syncMessage.getContacts().get().asPointer(), tmpFile)); DeviceContact c; while ((c = s.read()) != null) { ContactInfo contact = contactStore.getContact(c.getNumber()); @@ -1164,6 +1179,14 @@ class Manager implements Signal { } } catch (Exception e) { e.printStackTrace(); + } finally { + if (tmpFile != null) { + try { + Files.delete(tmpFile.toPath()); + } catch (IOException e) { + System.out.println("Failed to delete temp file “" + tmpFile + "”: " + e.getMessage()); + } + } } } } @@ -1305,7 +1328,7 @@ class Manager implements Signal { final SignalServiceMessageReceiver messageReceiver = new SignalServiceMessageReceiver(URL, TRUST_STORE, username, password, deviceId, signalingKey, USER_AGENT); - File tmpFile = File.createTempFile("ts_attach_" + pointer.getId(), ".tmp"); + File tmpFile = Util.createTempFile(); InputStream input = messageReceiver.retrieveAttachment(pointer, tmpFile); OutputStream output = null; @@ -1327,20 +1350,16 @@ class Manager implements Signal { input.close(); try { Files.delete(tmpFile.toPath()); - } catch(Exception e) { - System.out.println("Failed to delete temp file: " + tmpFile); - e.printStackTrace(); + } catch (IOException e) { + System.out.println("Failed to delete temp file “" + tmpFile + "”: " + e.getMessage()); } } return outputFile; } - private InputStream retrieveAttachmentAsStream(SignalServiceAttachmentPointer pointer) throws IOException, InvalidMessageException { + private InputStream retrieveAttachmentAsStream(SignalServiceAttachmentPointer pointer, File tmpFile) throws IOException, InvalidMessageException { final SignalServiceMessageReceiver messageReceiver = new SignalServiceMessageReceiver(URL, TRUST_STORE, username, password, deviceId, signalingKey, USER_AGENT); - File file = File.createTempFile("ts_tmp", "tmp"); - file.deleteOnExit(); - - return messageReceiver.retrieveAttachment(pointer, file); + return messageReceiver.retrieveAttachment(pointer, tmpFile); } private String canonicalizeNumber(String number) throws InvalidNumberException { @@ -1359,7 +1378,7 @@ class Manager implements Signal { } private void sendGroups() throws IOException, UntrustedIdentityException { - File groupsFile = File.createTempFile("multidevice-group-update", ".tmp"); + File groupsFile = Util.createTempFile(); try { DeviceGroupsOutputStream out = new DeviceGroupsOutputStream(new FileOutputStream(groupsFile)); @@ -1374,26 +1393,27 @@ class Manager implements Signal { } if (groupsFile.exists() && groupsFile.length() > 0) { - FileInputStream contactsFileStream = new FileInputStream(groupsFile); - try { + try (FileInputStream groupsFileStream = new FileInputStream(groupsFile)) { SignalServiceAttachmentStream attachmentStream = SignalServiceAttachment.newStreamBuilder() - .withStream(contactsFileStream) + .withStream(groupsFileStream) .withContentType("application/octet-stream") .withLength(groupsFile.length()) .build(); sendSyncMessage(SignalServiceSyncMessage.forGroups(attachmentStream)); - } finally { - contactsFileStream.close(); } } } finally { - groupsFile.delete(); + try { + Files.delete(groupsFile.toPath()); + } catch (IOException e) { + System.out.println("Failed to delete temp file “" + groupsFile + "”: " + e.getMessage()); + } } } private void sendContacts() throws IOException, UntrustedIdentityException { - File contactsFile = File.createTempFile("multidevice-contact-update", ".tmp"); + File contactsFile = Util.createTempFile(); try { DeviceContactsOutputStream out = new DeviceContactsOutputStream(new FileOutputStream(contactsFile)); @@ -1407,17 +1427,22 @@ class Manager implements Signal { } if (contactsFile.exists() && contactsFile.length() > 0) { - FileInputStream contactsFileStream = new FileInputStream(contactsFile); - SignalServiceAttachmentStream attachmentStream = SignalServiceAttachment.newStreamBuilder() - .withStream(contactsFileStream) - .withContentType("application/octet-stream") - .withLength(contactsFile.length()) - .build(); - - sendSyncMessage(SignalServiceSyncMessage.forContacts(attachmentStream)); + try (FileInputStream contactsFileStream = new FileInputStream(contactsFile)) { + SignalServiceAttachmentStream attachmentStream = SignalServiceAttachment.newStreamBuilder() + .withStream(contactsFileStream) + .withContentType("application/octet-stream") + .withLength(contactsFile.length()) + .build(); + + sendSyncMessage(SignalServiceSyncMessage.forContacts(attachmentStream)); + } } } finally { - contactsFile.delete(); + try { + Files.delete(contactsFile.toPath()); + } catch (IOException e) { + System.out.println("Failed to delete temp file “" + contactsFile + "”: " + e.getMessage()); + } } } diff --git a/src/main/java/org/asamk/signal/Util.java b/src/main/java/org/asamk/signal/Util.java index 66a08731..4eeabf1c 100644 --- a/src/main/java/org/asamk/signal/Util.java +++ b/src/main/java/org/asamk/signal/Util.java @@ -1,5 +1,7 @@ package org.asamk.signal; +import java.io.File; +import java.io.IOException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; @@ -22,4 +24,8 @@ class Util { throw new AssertionError(e); } } + + public static File createTempFile() throws IOException { + return File.createTempFile("signal_tmp_", ".tmp"); + } } -- 2.51.0 From c5cf78a50ad213fb21728f4d648de51dfac7f07e Mon Sep 17 00:00:00 2001 From: AsamK Date: Mon, 28 Nov 2016 12:38:43 +0100 Subject: [PATCH 08/16] Allow millisecond timeouts --- src/main/java/org/asamk/signal/Main.java | 13 +++++++------ src/main/java/org/asamk/signal/Manager.java | 4 ++-- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/asamk/signal/Main.java b/src/main/java/org/asamk/signal/Main.java index b2550fe7..d67bfca0 100644 --- a/src/main/java/org/asamk/signal/Main.java +++ b/src/main/java/org/asamk/signal/Main.java @@ -46,6 +46,7 @@ import java.security.Security; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.*; +import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; public class Main { @@ -365,9 +366,9 @@ public class Main { System.err.println("User is not registered."); return 1; } - int timeout = 5; - if (ns.getInt("timeout") != null) { - timeout = ns.getInt("timeout"); + double timeout = 5; + if (ns.getDouble("timeout") != null) { + timeout = ns.getDouble("timeout"); } boolean returnOnTimeout = true; if (timeout < 0) { @@ -375,7 +376,7 @@ public class Main { timeout = 3600; } try { - m.receiveMessages(timeout, returnOnTimeout, new ReceiveMessageHandler(m)); + m.receiveMessages((long) (timeout * 1000), TimeUnit.MILLISECONDS, returnOnTimeout, new ReceiveMessageHandler(m)); } catch (IOException e) { System.err.println("Error while receiving messages: " + e.getMessage()); return 3; @@ -549,7 +550,7 @@ public class Main { return 2; } try { - m.receiveMessages(3600, false, new DbusReceiveMessageHandler(m, conn)); + m.receiveMessages(1, TimeUnit.HOURS, false, new DbusReceiveMessageHandler(m, conn)); } catch (IOException e) { System.err.println("Error while receiving messages: " + e.getMessage()); return 3; @@ -719,7 +720,7 @@ public class Main { Subparser parserReceive = subparsers.addParser("receive"); parserReceive.addArgument("-t", "--timeout") - .type(int.class) + .type(double.class) .help("Number of seconds to wait for new messages (negative values disable timeout)"); Subparser parserDaemon = subparsers.addParser("daemon"); diff --git a/src/main/java/org/asamk/signal/Manager.java b/src/main/java/org/asamk/signal/Manager.java index d06a07c0..6598bfde 100644 --- a/src/main/java/org/asamk/signal/Manager.java +++ b/src/main/java/org/asamk/signal/Manager.java @@ -1027,7 +1027,7 @@ class Manager implements Signal { } } - public void receiveMessages(int timeoutSeconds, boolean returnOnTimeout, ReceiveMessageHandler handler) throws IOException { + public void receiveMessages(long timeout, TimeUnit unit, boolean returnOnTimeout, ReceiveMessageHandler handler) throws IOException { retryFailedReceivedMessages(handler); final SignalServiceMessageReceiver messageReceiver = new SignalServiceMessageReceiver(URL, TRUST_STORE, username, password, deviceId, signalingKey, USER_AGENT); SignalServiceMessagePipe messagePipe = null; @@ -1041,7 +1041,7 @@ class Manager implements Signal { Exception exception = null; final long now = new Date().getTime(); try { - envelope = messagePipe.read(timeoutSeconds, TimeUnit.SECONDS, new SignalServiceMessagePipe.MessagePipeCallback() { + envelope = messagePipe.read(timeout, unit, new SignalServiceMessagePipe.MessagePipeCallback() { @Override public void onMessage(SignalServiceEnvelope envelope) { // store message on disk, before acknowledging receipt to the server -- 2.51.0 From c3bfcff5a887d9cc706f087b5fe6c6c524ab8ced Mon Sep 17 00:00:00 2001 From: AsamK Date: Tue, 29 Nov 2016 11:00:49 +0100 Subject: [PATCH 09/16] Update gradle --- gradle/wrapper/gradle-wrapper.jar | Bin 54224 -> 54227 bytes gradle/wrapper/gradle-wrapper.properties | 4 ++-- gradlew | 11 ++++++----- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index d6e2637affb74a80bfbe87bd2da57e81b2f3c661..51288f9c2f05faf8d42e1a751a387ca7923882c3 100644 GIT binary patch delta 2024 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 MFB`G#Is|eH0BY%zNB{r; diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 6032e29a..05ab972d 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Mon Nov 14 16:58:51 CET 2016 +#Tue Nov 29 10:59:02 CET 2016 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-3.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-3.2.1-bin.zip diff --git a/gradlew b/gradlew index 4ef3a871..4453ccea 100755 --- a/gradlew +++ b/gradlew @@ -155,13 +155,14 @@ if $cygwin ; then fi # Escape application args -for s in "${@}" ; do - s=\"$s\" - APP_ARGS=$APP_ARGS" "$s -done +save ( ) { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") # Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- "$DEFAULT_JVM_OPTS" "$JAVA_OPTS" "$GRADLE_OPTS" "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then -- 2.51.0 From 447a188ff96ab6802a88d0fe2950b334047b1a67 Mon Sep 17 00:00:00 2001 From: AsamK Date: Tue, 29 Nov 2016 11:15:27 +0100 Subject: [PATCH 10/16] Use try-with-ressource statements instead of manually closing stream --- src/main/java/org/asamk/signal/Manager.java | 92 ++++++++------------- 1 file changed, 35 insertions(+), 57 deletions(-) diff --git a/src/main/java/org/asamk/signal/Manager.java b/src/main/java/org/asamk/signal/Manager.java index 6598bfde..78b66da7 100644 --- a/src/main/java/org/asamk/signal/Manager.java +++ b/src/main/java/org/asamk/signal/Manager.java @@ -1223,26 +1223,26 @@ class Manager implements Signal { private void storeEnvelope(SignalServiceEnvelope envelope, File file) throws IOException { try (FileOutputStream f = new FileOutputStream(file)) { - DataOutputStream out = new DataOutputStream(f); - out.writeInt(1); // version - out.writeInt(envelope.getType()); - out.writeUTF(envelope.getSource()); - out.writeInt(envelope.getSourceDevice()); - out.writeUTF(envelope.getRelay()); - out.writeLong(envelope.getTimestamp()); - if (envelope.hasContent()) { - out.writeInt(envelope.getContent().length); - out.write(envelope.getContent()); - } else { - out.writeInt(0); - } - if (envelope.hasLegacyMessage()) { - out.writeInt(envelope.getLegacyMessage().length); - out.write(envelope.getLegacyMessage()); - } else { - out.writeInt(0); + try (DataOutputStream out = new DataOutputStream(f)) { + out.writeInt(1); // version + out.writeInt(envelope.getType()); + out.writeUTF(envelope.getSource()); + out.writeInt(envelope.getSourceDevice()); + out.writeUTF(envelope.getRelay()); + out.writeLong(envelope.getTimestamp()); + if (envelope.hasContent()) { + out.writeInt(envelope.getContent().length); + out.write(envelope.getContent()); + } else { + out.writeInt(0); + } + if (envelope.hasLegacyMessage()) { + out.writeInt(envelope.getLegacyMessage().length); + out.write(envelope.getLegacyMessage()); + } else { + out.writeInt(0); + } } - out.close(); } } @@ -1288,9 +1288,7 @@ class Manager implements Signal { private File retrieveAttachment(SignalServiceAttachmentStream stream, File outputFile) throws IOException, InvalidMessageException { InputStream input = stream.getInputStream(); - OutputStream output = null; - try { - output = new FileOutputStream(outputFile); + try (OutputStream output = new FileOutputStream(outputFile)) { byte[] buffer = new byte[4096]; int read; @@ -1300,10 +1298,6 @@ class Manager implements Signal { } catch (FileNotFoundException e) { e.printStackTrace(); return null; - } finally { - if (output != null) { - output.close(); - } } return outputFile; } @@ -1311,43 +1305,31 @@ class Manager implements Signal { private File retrieveAttachment(SignalServiceAttachmentPointer pointer, File outputFile, boolean storePreview) throws IOException, InvalidMessageException { if (storePreview && pointer.getPreview().isPresent()) { File previewFile = new File(outputFile + ".preview"); - OutputStream output = null; - try { - output = new FileOutputStream(previewFile); + try (OutputStream output = new FileOutputStream(previewFile)) { byte[] preview = pointer.getPreview().get(); output.write(preview, 0, preview.length); } catch (FileNotFoundException e) { e.printStackTrace(); return null; - } finally { - if (output != null) { - output.close(); - } } } final SignalServiceMessageReceiver messageReceiver = new SignalServiceMessageReceiver(URL, TRUST_STORE, username, password, deviceId, signalingKey, USER_AGENT); File tmpFile = Util.createTempFile(); - InputStream input = messageReceiver.retrieveAttachment(pointer, tmpFile); - - OutputStream output = null; - try { - output = new FileOutputStream(outputFile); - byte[] buffer = new byte[4096]; - int read; + try (InputStream input = messageReceiver.retrieveAttachment(pointer, tmpFile)) { + try (OutputStream output = new FileOutputStream(outputFile)) { + byte[] buffer = new byte[4096]; + int read; - while ((read = input.read(buffer)) != -1) { - output.write(buffer, 0, read); + while ((read = input.read(buffer)) != -1) { + output.write(buffer, 0, read); + } + } catch (FileNotFoundException e) { + e.printStackTrace(); + return null; } - } catch (FileNotFoundException e) { - e.printStackTrace(); - return null; } finally { - if (output != null) { - output.close(); - } - input.close(); try { Files.delete(tmpFile.toPath()); } catch (IOException e) { @@ -1381,15 +1363,13 @@ class Manager implements Signal { File groupsFile = Util.createTempFile(); try { - DeviceGroupsOutputStream out = new DeviceGroupsOutputStream(new FileOutputStream(groupsFile)); - try { + try (OutputStream fos = new FileOutputStream(groupsFile)) { + DeviceGroupsOutputStream out = new DeviceGroupsOutputStream(fos); for (GroupInfo record : groupStore.getGroups()) { out.write(new DeviceGroup(record.groupId, Optional.fromNullable(record.name), new ArrayList<>(record.members), createGroupAvatarAttachment(record.groupId), record.active)); } - } finally { - out.close(); } if (groupsFile.exists() && groupsFile.length() > 0) { @@ -1416,14 +1396,12 @@ class Manager implements Signal { File contactsFile = Util.createTempFile(); try { - DeviceContactsOutputStream out = new DeviceContactsOutputStream(new FileOutputStream(contactsFile)); - try { + try (OutputStream fos = new FileOutputStream(contactsFile)) { + DeviceContactsOutputStream out = new DeviceContactsOutputStream(fos); for (ContactInfo record : contactStore.getContacts()) { out.write(new DeviceContact(record.number, Optional.fromNullable(record.name), createContactAvatarAttachment(record.number), Optional.fromNullable(record.color))); } - } finally { - out.close(); } if (contactsFile.exists() && contactsFile.length() > 0) { -- 2.51.0 From 1b7c46b1c239dc485ed821e00f26701ce59dd737 Mon Sep 17 00:00:00 2001 From: AsamK Date: Fri, 16 Dec 2016 11:32:26 +0100 Subject: [PATCH 11/16] Update dependency --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index e61d0d99..86783766 100644 --- a/build.gradle +++ b/build.gradle @@ -18,7 +18,7 @@ repositories { } dependencies { - compile 'com.github.turasa:signal-service-java:2.4.1_unofficial_1' + compile 'com.github.turasa:signal-service-java:2.4.2_unofficial_1' compile 'org.bouncycastle:bcprov-jdk15on:1.55' compile 'net.sourceforge.argparse4j:argparse4j:0.7.0' compile 'org.freedesktop.dbus:dbus-java:2.7.0' -- 2.51.0 From aa9aadacf1711100decbd7c00e8c18b4ee1e9e9a Mon Sep 17 00:00:00 2001 From: AsamK Date: Fri, 16 Dec 2016 11:32:47 +0100 Subject: [PATCH 12/16] Bump version --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 86783766..d97111d2 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ targetCompatibility = JavaVersion.VERSION_1_7 mainClassName = 'org.asamk.signal.Main' -version = '0.5.1' +version = '0.5.2' compileJava.options.encoding = 'UTF-8' -- 2.51.0 From d89e93ad473cc1c6dd5f4dc615b7d0c5721e3dc2 Mon Sep 17 00:00:00 2001 From: AsamK Date: Thu, 22 Dec 2016 12:27:43 +0100 Subject: [PATCH 13/16] Add --ignore-attachments flag to receive and daemon command Fixes #41 --- man/signal-cli.1.txt | 4 ++++ src/main/java/org/asamk/signal/Main.java | 12 ++++++++++-- src/main/java/org/asamk/signal/Manager.java | 20 ++++++++++---------- 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/man/signal-cli.1.txt b/man/signal-cli.1.txt index 52d56f68..c4800d61 100644 --- a/man/signal-cli.1.txt +++ b/man/signal-cli.1.txt @@ -120,6 +120,8 @@ attachments are downloaded to the config directory. *-t* TIMEOUT, *--timeout* TIMEOUT:: Number of seconds to wait for new messages (negative values disable timeout). Default is 5 seconds. +*--ignore-attachments*:: + Don’t download attachments of received messages. updateGroup ~~~~~~~~~~~ @@ -179,6 +181,8 @@ libunixsocket-java ArchLinux: libmatthew-unix-java (AUR)). *--system*:: Use DBus system bus instead of user bus. +*--ignore-attachments*:: + Don’t download attachments of received messages. Examples diff --git a/src/main/java/org/asamk/signal/Main.java b/src/main/java/org/asamk/signal/Main.java index d67bfca0..7d89d480 100644 --- a/src/main/java/org/asamk/signal/Main.java +++ b/src/main/java/org/asamk/signal/Main.java @@ -375,8 +375,9 @@ public class Main { 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; @@ -549,8 +550,9 @@ public class Main { 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; @@ -722,11 +724,17 @@ public class Main { 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); diff --git a/src/main/java/org/asamk/signal/Manager.java b/src/main/java/org/asamk/signal/Manager.java index 78b66da7..e5214302 100644 --- a/src/main/java/org/asamk/signal/Manager.java +++ b/src/main/java/org/asamk/signal/Manager.java @@ -883,7 +883,7 @@ class Manager implements Signal { void handleMessage(SignalServiceEnvelope envelope, SignalServiceContent decryptedContent, Throwable e); } - private void handleSignalServiceDataMessage(SignalServiceDataMessage message, boolean isSync, String source, String destination) { + private void handleSignalServiceDataMessage(SignalServiceDataMessage message, boolean isSync, String source, String destination, boolean ignoreAttachments) { String threadId; if (message.getGroupInfo().isPresent()) { SignalServiceGroup groupInfo = message.getGroupInfo().get(); @@ -970,7 +970,7 @@ class Manager implements Signal { threadStore.updateThread(thread); } } - if (message.getAttachments().isPresent()) { + if (message.getAttachments().isPresent() && !ignoreAttachments) { for (SignalServiceAttachment attachment : message.getAttachments().get()) { if (attachment.isPointer()) { try { @@ -983,7 +983,7 @@ class Manager implements Signal { } } - public void retryFailedReceivedMessages(ReceiveMessageHandler handler) { + public void retryFailedReceivedMessages(ReceiveMessageHandler handler, boolean ignoreAttachments) { final File cachePath = new File(getMessageCachePath()); if (!cachePath.exists()) { return; @@ -1014,7 +1014,7 @@ class Manager implements Signal { } catch (Exception e) { continue; } - handleMessage(envelope, content); + handleMessage(envelope, content, ignoreAttachments); } save(); handler.handleMessage(envelope, content, null); @@ -1027,8 +1027,8 @@ class Manager implements Signal { } } - public void receiveMessages(long timeout, TimeUnit unit, boolean returnOnTimeout, ReceiveMessageHandler handler) throws IOException { - retryFailedReceivedMessages(handler); + public void receiveMessages(long timeout, TimeUnit unit, boolean returnOnTimeout, boolean ignoreAttachments, ReceiveMessageHandler handler) throws IOException { + retryFailedReceivedMessages(handler, ignoreAttachments); final SignalServiceMessageReceiver messageReceiver = new SignalServiceMessageReceiver(URL, TRUST_STORE, username, password, deviceId, signalingKey, USER_AGENT); SignalServiceMessagePipe messagePipe = null; @@ -1067,7 +1067,7 @@ class Manager implements Signal { } catch (Exception e) { exception = e; } - handleMessage(envelope, content); + handleMessage(envelope, content, ignoreAttachments); } save(); handler.handleMessage(envelope, content, exception); @@ -1087,17 +1087,17 @@ class Manager implements Signal { } } - private void handleMessage(SignalServiceEnvelope envelope, SignalServiceContent content) { + private void handleMessage(SignalServiceEnvelope envelope, SignalServiceContent content, boolean ignoreAttachments) { if (content != null) { if (content.getDataMessage().isPresent()) { SignalServiceDataMessage message = content.getDataMessage().get(); - handleSignalServiceDataMessage(message, false, envelope.getSource(), username); + handleSignalServiceDataMessage(message, false, envelope.getSource(), username, ignoreAttachments); } if (content.getSyncMessage().isPresent()) { SignalServiceSyncMessage syncMessage = content.getSyncMessage().get(); if (syncMessage.getSent().isPresent()) { SignalServiceDataMessage message = syncMessage.getSent().get().getMessage(); - handleSignalServiceDataMessage(message, true, envelope.getSource(), syncMessage.getSent().get().getDestination().get()); + handleSignalServiceDataMessage(message, true, envelope.getSource(), syncMessage.getSent().get().getDestination().get(), ignoreAttachments); } if (syncMessage.getRequest().isPresent()) { RequestMessage rm = syncMessage.getRequest().get(); -- 2.51.0 From d83e0526fbcc08b3abb355dbff9ad3d6c79a2851 Mon Sep 17 00:00:00 2001 From: AsamK Date: Thu, 22 Dec 2016 12:37:59 +0100 Subject: [PATCH 14/16] Show better error message, if libunix-java.so is not available Fixes #39 --- src/main/java/org/asamk/signal/Main.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/org/asamk/signal/Main.java b/src/main/java/org/asamk/signal/Main.java index 7d89d480..633ef469 100644 --- a/src/main/java/org/asamk/signal/Main.java +++ b/src/main/java/org/asamk/signal/Main.java @@ -88,6 +88,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) { @@ -350,6 +353,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; @@ -546,6 +552,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; -- 2.51.0 From 6411b09aab88b891608bdb70c1a717c550f83052 Mon Sep 17 00:00:00 2001 From: AsamK Date: Sat, 7 Jan 2017 17:07:56 +0100 Subject: [PATCH 15/16] Update dependencies --- build.gradle | 2 +- src/main/java/org/asamk/signal/Manager.java | 18 ++++++++++-------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/build.gradle b/build.gradle index d97111d2..fdb28534 100644 --- a/build.gradle +++ b/build.gradle @@ -18,7 +18,7 @@ repositories { } dependencies { - compile 'com.github.turasa:signal-service-java:2.4.2_unofficial_1' + compile 'com.github.turasa:signal-service-java:2.4.4_unofficial_1' compile 'org.bouncycastle:bcprov-jdk15on:1.55' compile 'net.sourceforge.argparse4j:argparse4j:0.7.0' compile 'org.freedesktop.dbus:dbus-java:2.7.0' diff --git a/src/main/java/org/asamk/signal/Manager.java b/src/main/java/org/asamk/signal/Manager.java index e5214302..a272883b 100644 --- a/src/main/java/org/asamk/signal/Manager.java +++ b/src/main/java/org/asamk/signal/Manager.java @@ -53,6 +53,7 @@ import org.whispersystems.signalservice.api.push.exceptions.*; import org.whispersystems.signalservice.api.util.InvalidNumberException; import org.whispersystems.signalservice.api.util.PhoneNumberFormatter; import org.whispersystems.signalservice.internal.push.SignalServiceProtos; +import org.whispersystems.signalservice.internal.push.SignalServiceUrl; import java.io.*; import java.net.URI; @@ -77,6 +78,7 @@ import static java.nio.file.attribute.PosixFilePermission.*; class Manager implements Signal { private final static String URL = "https://textsecure-service.whispersystems.org"; private final static TrustStore TRUST_STORE = new WhisperTrustStore(); + private final static SignalServiceUrl[] serviceUrls = new SignalServiceUrl[]{new SignalServiceUrl(URL, TRUST_STORE)}; public final static String PROJECT_NAME = Manager.class.getPackage().getImplementationTitle(); public final static String PROJECT_VERSION = Manager.class.getPackage().getImplementationVersion(); @@ -217,7 +219,7 @@ class Manager implements Signal { migrateLegacyConfigs(); - accountManager = new SignalServiceAccountManager(URL, TRUST_STORE, username, password, deviceId, USER_AGENT); + accountManager = new SignalServiceAccountManager(serviceUrls, username, password, deviceId, USER_AGENT); try { if (registered && accountManager.getPreKeysCount() < PREKEY_MINIMUM_COUNT) { refreshPreKeys(); @@ -342,7 +344,7 @@ class Manager implements Signal { public void register(boolean voiceVerification) throws IOException { password = Util.getSecret(18); - accountManager = new SignalServiceAccountManager(URL, TRUST_STORE, username, password, USER_AGENT); + accountManager = new SignalServiceAccountManager(serviceUrls, username, password, USER_AGENT); if (voiceVerification) accountManager.requestVoiceVerificationCode(); @@ -356,7 +358,7 @@ class Manager implements Signal { public URI getDeviceLinkUri() throws TimeoutException, IOException { password = Util.getSecret(18); - accountManager = new SignalServiceAccountManager(URL, TRUST_STORE, username, password, USER_AGENT); + accountManager = new SignalServiceAccountManager(serviceUrls, username, password, USER_AGENT); String uuid = accountManager.getNewDeviceUuid(); registered = false; @@ -783,7 +785,7 @@ class Manager implements Signal { private void sendSyncMessage(SignalServiceSyncMessage message) throws IOException, UntrustedIdentityException { - SignalServiceMessageSender messageSender = new SignalServiceMessageSender(URL, TRUST_STORE, username, password, + SignalServiceMessageSender messageSender = new SignalServiceMessageSender(serviceUrls, username, password, deviceId, signalProtocolStore, USER_AGENT, Optional.absent()); try { messageSender.sendMessage(message); @@ -800,7 +802,7 @@ class Manager implements Signal { SignalServiceDataMessage message = null; try { - SignalServiceMessageSender messageSender = new SignalServiceMessageSender(URL, TRUST_STORE, username, password, + SignalServiceMessageSender messageSender = new SignalServiceMessageSender(serviceUrls, username, password, deviceId, signalProtocolStore, USER_AGENT, Optional.absent()); message = messageBuilder.build(); @@ -1029,7 +1031,7 @@ class Manager implements Signal { public void receiveMessages(long timeout, TimeUnit unit, boolean returnOnTimeout, boolean ignoreAttachments, ReceiveMessageHandler handler) throws IOException { retryFailedReceivedMessages(handler, ignoreAttachments); - final SignalServiceMessageReceiver messageReceiver = new SignalServiceMessageReceiver(URL, TRUST_STORE, username, password, deviceId, signalingKey, USER_AGENT); + final SignalServiceMessageReceiver messageReceiver = new SignalServiceMessageReceiver(serviceUrls, username, password, deviceId, signalingKey, USER_AGENT); SignalServiceMessagePipe messagePipe = null; try { @@ -1314,7 +1316,7 @@ class Manager implements Signal { } } - final SignalServiceMessageReceiver messageReceiver = new SignalServiceMessageReceiver(URL, TRUST_STORE, username, password, deviceId, signalingKey, USER_AGENT); + final SignalServiceMessageReceiver messageReceiver = new SignalServiceMessageReceiver(serviceUrls, username, password, deviceId, signalingKey, USER_AGENT); File tmpFile = Util.createTempFile(); try (InputStream input = messageReceiver.retrieveAttachment(pointer, tmpFile)) { @@ -1340,7 +1342,7 @@ class Manager implements Signal { } private InputStream retrieveAttachmentAsStream(SignalServiceAttachmentPointer pointer, File tmpFile) throws IOException, InvalidMessageException { - final SignalServiceMessageReceiver messageReceiver = new SignalServiceMessageReceiver(URL, TRUST_STORE, username, password, deviceId, signalingKey, USER_AGENT); + final SignalServiceMessageReceiver messageReceiver = new SignalServiceMessageReceiver(serviceUrls, username, password, deviceId, signalingKey, USER_AGENT); return messageReceiver.retrieveAttachment(pointer, tmpFile); } -- 2.51.0 From 1e639d18bfc984b8c4ffc27703f5c14125b0bb52 Mon Sep 17 00:00:00 2001 From: Christoph Haefner Date: Wed, 25 Jan 2017 05:57:59 +0100 Subject: [PATCH 16/16] Clarify to use --dbus-system if system bus is isntalled --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 984f2d67..960fe814 100644 --- a/README.md +++ b/README.md @@ -142,7 +142,7 @@ systemctl enable signal.service systemctl reload dbus.service ``` -Then just execute the send command from above, the service will be autostarted by dbus the first time it is requested. +Make sure to use "--dbus-system" with the send command, the service will be autostarted by dbus the first time it is requested. ## Storage -- 2.51.0