diff --git a/build.gradle b/build.gradle index 75d26497f..8d9035676 100644 --- a/build.gradle +++ b/build.gradle @@ -63,7 +63,7 @@ dependencies { compile 'org.whispersystems:jobmanager:1.0.2' compile 'org.whispersystems:libpastelog:1.0.7' - compile 'org.whispersystems:signal-service-android:2.6.10' + compile 'org.whispersystems:signal-service-android:2.6.11' compile 'org.whispersystems:webrtc-android:M59-S1' compile "me.leolin:ShortcutBadger:1.1.16" @@ -147,7 +147,7 @@ dependencyVerification { 'com.google.android.exoplayer:exoplayer:955085aa611a8f7cf6c61b88ae03d1a392f4ad94c9bfbc153f3dedb9ffb14718', 'org.whispersystems:jobmanager:506f679fc2fcf7bb6d10f00f41d6f6ea0abf75c70dc95b913398661ad538a181', 'org.whispersystems:libpastelog:bb331d9a98240fc139101128ba836c1edec3c40e000597cdbb29ebf4cbf34d88', - 'org.whispersystems:signal-service-android:784b748c15cb3d2824b8fa2b0f9d8fd8b990b39e7a50259bac27bdcad845ce20', + 'org.whispersystems:signal-service-android:89f8630cc1737c3d52178dc46926f0755d75fed3ac9b94d067c0a42e4e3169c9', 'org.whispersystems:webrtc-android:de647643afbbea45a26a4f24db75aa10bc8de45426e8eb0d9d563cc10af4f582', 'me.leolin:ShortcutBadger:e3cb3e7625892129b0c92dd5e4bc649faffdd526d5af26d9c45ee31ff8851774', 'se.emilsjolander:stickylistheaders:a08ca948aa6b220f09d82f16bbbac395f6b78897e9eeac6a9f0b0ba755928eeb', @@ -185,7 +185,7 @@ dependencyVerification { 'com.google.android.gms:play-services-basement:95dd882c5ffba15b9a99de3fefb05d3a01946623af67454ca00055d222f85a8d', 'com.google.android.gms:play-services-iid:54e919f9957b8b7820da7ee9b83471d00d0cac1cf08ddea8b5b41aea80bb1a70', 'org.whispersystems:signal-protocol-android:5b8acded7f2a40178eb90ab8e8cbfec89d170d91b3ff5e78487d1098df6185a1', - 'org.whispersystems:signal-service-java:308d9e61b753760d0f3828eb3181db58469e75c763bdce5a8335df6c4af47695', + 'org.whispersystems:signal-service-java:ef89da56b915490bb907d848eae79efdf1218e985763e7dd2e8047c7ccb03c0c', 'com.github.bumptech.glide:gifdecoder:217da4520c568a93aea9c7ce3b3cac2c61fabed5113b07ae38698054f6d2d8b6', 'com.github.bumptech.glide:disklrucache:795c13245498c0cd806c3af71ee57b3f179cbd1609440a3021c211c364ef74d3', 'com.github.bumptech.glide:annotations:057927a236f3229e72cfbac8bed0e9fb398473daf7d933390f59ea4cb79c137b', diff --git a/src/org/thoughtcrime/securesms/jobs/AttachmentDownloadJob.java b/src/org/thoughtcrime/securesms/jobs/AttachmentDownloadJob.java index 5eef85142..a2b9462a4 100644 --- a/src/org/thoughtcrime/securesms/jobs/AttachmentDownloadJob.java +++ b/src/org/thoughtcrime/securesms/jobs/AttachmentDownloadJob.java @@ -21,6 +21,7 @@ import org.thoughtcrime.securesms.mms.MmsException; import org.thoughtcrime.securesms.notifications.MessageNotifier; import org.thoughtcrime.securesms.util.AttachmentUtil; import org.thoughtcrime.securesms.util.Hex; +import org.thoughtcrime.securesms.util.Util; import org.whispersystems.jobqueue.JobParameters; import org.whispersystems.jobqueue.requirements.NetworkRequirement; import org.whispersystems.libsignal.InvalidMessageException; @@ -165,8 +166,13 @@ public class AttachmentDownloadJob extends MasterSecretJob implements Injectable Log.w(TAG, "Downloading attachment with no digest..."); } - return new SignalServiceAttachmentPointer(id, null, key, relay, Optional.fromNullable(attachment.getDigest()), Optional.fromNullable(attachment.getFileName()), attachment.isVoiceNote()); - } catch (InvalidMessageException | IOException e) { + return new SignalServiceAttachmentPointer(id, null, key, relay, + Optional.of(Util.toIntExact(attachment.getSize())), + Optional.absent(), + Optional.fromNullable(attachment.getDigest()), + Optional.fromNullable(attachment.getFileName()), + attachment.isVoiceNote()); + } catch (InvalidMessageException | IOException | ArithmeticException e) { Log.w(TAG, e); throw new InvalidPartException(e); } diff --git a/src/org/thoughtcrime/securesms/jobs/AvatarDownloadJob.java b/src/org/thoughtcrime/securesms/jobs/AvatarDownloadJob.java index bcf7a200d..4cac0165f 100644 --- a/src/org/thoughtcrime/securesms/jobs/AvatarDownloadJob.java +++ b/src/org/thoughtcrime/securesms/jobs/AvatarDownloadJob.java @@ -81,9 +81,9 @@ public class AvatarDownloadJob extends MasterSecretJob implements InjectableType attachment = File.createTempFile("avatar", "tmp", context.getCacheDir()); attachment.deleteOnExit(); - SignalServiceAttachmentPointer pointer = new SignalServiceAttachmentPointer(avatarId, contentType, key, relay, digest, fileName, false); + SignalServiceAttachmentPointer pointer = new SignalServiceAttachmentPointer(avatarId, contentType, key, relay, Optional.of(0), Optional.absent(), digest, fileName, false); InputStream inputStream = receiver.retrieveAttachment(pointer, attachment, MAX_AVATAR_SIZE); - Bitmap avatar = BitmapUtil.createScaledBitmap(context, new AttachmentModel(attachment, key), 500, 500); + Bitmap avatar = BitmapUtil.createScaledBitmap(context, new AttachmentModel(attachment, key, 0, digest), 500, 500); database.updateAvatar(encodeId, avatar); inputStream.close(); diff --git a/src/org/thoughtcrime/securesms/mms/AttachmentStreamLocalUriFetcher.java b/src/org/thoughtcrime/securesms/mms/AttachmentStreamLocalUriFetcher.java index a0462632f..17cd246ab 100644 --- a/src/org/thoughtcrime/securesms/mms/AttachmentStreamLocalUriFetcher.java +++ b/src/org/thoughtcrime/securesms/mms/AttachmentStreamLocalUriFetcher.java @@ -19,19 +19,25 @@ class AttachmentStreamLocalUriFetcher implements DataFetcher { private static final String TAG = AttachmentStreamLocalUriFetcher.class.getSimpleName(); - private File attachment; - private byte[] key; + private final File attachment; + private final byte[] key; + private final Optional digest; + private final long plaintextLength; + private InputStream is; - AttachmentStreamLocalUriFetcher(File attachment, byte[] key) { - this.attachment = attachment; - this.key = key; + AttachmentStreamLocalUriFetcher(File attachment, long plaintextLength, byte[] key, Optional digest) { + this.attachment = attachment; + this.plaintextLength = plaintextLength; + this.digest = digest; + this.key = key; } @Override public void loadData(Priority priority, DataCallback callback) { try { - is = new AttachmentCipherInputStream(attachment, key, Optional.absent()); + if (!digest.isPresent()) throw new InvalidMessageException("No attachment digest!"); + is = AttachmentCipherInputStream.createFor(attachment, plaintextLength, key, digest.get()); callback.onDataReady(is); } catch (IOException | InvalidMessageException e) { callback.onLoadFailed(e); diff --git a/src/org/thoughtcrime/securesms/mms/AttachmentStreamUriLoader.java b/src/org/thoughtcrime/securesms/mms/AttachmentStreamUriLoader.java index 253724ccb..4005936b3 100644 --- a/src/org/thoughtcrime/securesms/mms/AttachmentStreamUriLoader.java +++ b/src/org/thoughtcrime/securesms/mms/AttachmentStreamUriLoader.java @@ -10,6 +10,7 @@ import com.bumptech.glide.load.model.ModelLoaderFactory; import com.bumptech.glide.load.model.MultiModelLoaderFactory; import org.thoughtcrime.securesms.mms.AttachmentStreamUriLoader.AttachmentModel; +import org.whispersystems.libsignal.util.guava.Optional; import java.io.File; import java.io.InputStream; @@ -20,7 +21,7 @@ public class AttachmentStreamUriLoader implements ModelLoader buildLoadData(AttachmentModel attachmentModel, int width, int height, Options options) { - return new LoadData<>(attachmentModel, new AttachmentStreamLocalUriFetcher(attachmentModel.attachment, attachmentModel.key)); + return new LoadData<>(attachmentModel, new AttachmentStreamLocalUriFetcher(attachmentModel.attachment, attachmentModel.plaintextLength, attachmentModel.key, attachmentModel.digest)); } @Override @@ -42,12 +43,18 @@ public class AttachmentStreamUriLoader implements ModelLoader digest; + public long plaintextLength; - public AttachmentModel(@NonNull File attachment, @NonNull byte[] key) { - this.attachment = attachment; - this.key = key; + public AttachmentModel(@NonNull File attachment, @NonNull byte[] key, + long plaintextLength, @NonNull Optional digest) + { + this.attachment = attachment; + this.key = key; + this.digest = digest; + this.plaintextLength = plaintextLength; } @Override