diff --git a/briar-android/src/androidTestOfficial/java/org/briarproject/briar/android/attachment/AttachmentRetrieverIntegrationTest.java b/briar-android/src/androidTestOfficial/java/org/briarproject/briar/android/attachment/AttachmentRetrieverIntegrationTest.java index c3661fefb..9881c74fb 100644 --- a/briar-android/src/androidTestOfficial/java/org/briarproject/briar/android/attachment/AttachmentRetrieverIntegrationTest.java +++ b/briar-android/src/androidTestOfficial/java/org/briarproject/briar/android/attachment/AttachmentRetrieverIntegrationTest.java @@ -55,7 +55,7 @@ public class AttachmentRetrieverIntegrationTest { AttachmentHeader h = new AttachmentHeader(msgId, "image/jpeg"); InputStream is = getUrlInputStream(smallKitten); Attachment a = new Attachment(h, is); - AttachmentItem item = retriever.getAttachmentItem(h, a, true); + AttachmentItem item = retriever.getAttachmentItem(a, true); assertEquals(msgId, item.getMessageId()); assertEquals(160, item.getWidth()); assertEquals(240, item.getHeight()); @@ -71,7 +71,7 @@ public class AttachmentRetrieverIntegrationTest { AttachmentHeader h = new AttachmentHeader(msgId, "image/jpeg"); InputStream is = getUrlInputStream(originalKitten); Attachment a = new Attachment(h, is); - AttachmentItem item = retriever.getAttachmentItem(h, a, true); + AttachmentItem item = retriever.getAttachmentItem(a, true); assertEquals(msgId, item.getMessageId()); assertEquals(1728, item.getWidth()); assertEquals(2592, item.getHeight()); @@ -87,7 +87,7 @@ public class AttachmentRetrieverIntegrationTest { AttachmentHeader h = new AttachmentHeader(msgId, "image/png"); InputStream is = getUrlInputStream(pngKitten); Attachment a = new Attachment(h, is); - AttachmentItem item = retriever.getAttachmentItem(h, a, true); + AttachmentItem item = retriever.getAttachmentItem(a, true); assertEquals(msgId, item.getMessageId()); assertEquals(737, item.getWidth()); assertEquals(510, item.getHeight()); @@ -103,7 +103,7 @@ public class AttachmentRetrieverIntegrationTest { AttachmentHeader h = new AttachmentHeader(msgId, "image/jpeg"); InputStream is = getUrlInputStream(uberGif); Attachment a = new Attachment(h, is); - AttachmentItem item = retriever.getAttachmentItem(h, a, true); + AttachmentItem item = retriever.getAttachmentItem(a, true); assertEquals(1, item.getWidth()); assertEquals(1, item.getHeight()); assertEquals(dimensions.minHeight, item.getThumbnailWidth()); @@ -118,7 +118,7 @@ public class AttachmentRetrieverIntegrationTest { AttachmentHeader h = new AttachmentHeader(msgId, "image/jpeg"); InputStream is = getUrlInputStream(lottaPixel); Attachment a = new Attachment(h, is); - AttachmentItem item = retriever.getAttachmentItem(h, a, true); + AttachmentItem item = retriever.getAttachmentItem(a, true); assertEquals(64250, item.getWidth()); assertEquals(64250, item.getHeight()); assertEquals(dimensions.maxWidth, item.getThumbnailWidth()); @@ -133,7 +133,7 @@ public class AttachmentRetrieverIntegrationTest { AttachmentHeader h = new AttachmentHeader(msgId, "image/jpeg"); InputStream is = getUrlInputStream(imageIoCrash); Attachment a = new Attachment(h, is); - AttachmentItem item = retriever.getAttachmentItem(h, a, true); + AttachmentItem item = retriever.getAttachmentItem(a, true); assertEquals(1184, item.getWidth()); assertEquals(448, item.getHeight()); assertEquals(dimensions.maxWidth, item.getThumbnailWidth()); @@ -148,7 +148,7 @@ public class AttachmentRetrieverIntegrationTest { AttachmentHeader h = new AttachmentHeader(msgId, "image/jpeg"); InputStream is = getUrlInputStream(gimpCrash); Attachment a = new Attachment(h, is); - AttachmentItem item = retriever.getAttachmentItem(h, a, true); + AttachmentItem item = retriever.getAttachmentItem(a, true); assertEquals(1, item.getWidth()); assertEquals(1, item.getHeight()); assertEquals(dimensions.minHeight, item.getThumbnailWidth()); @@ -163,7 +163,7 @@ public class AttachmentRetrieverIntegrationTest { AttachmentHeader h = new AttachmentHeader(msgId, "image/jpeg"); InputStream is = getUrlInputStream(optiPngAfl); Attachment a = new Attachment(h, is); - AttachmentItem item = retriever.getAttachmentItem(h, a, true); + AttachmentItem item = retriever.getAttachmentItem(a, true); assertEquals(32, item.getWidth()); assertEquals(32, item.getHeight()); assertEquals(dimensions.minHeight, item.getThumbnailWidth()); @@ -178,7 +178,7 @@ public class AttachmentRetrieverIntegrationTest { AttachmentHeader h = new AttachmentHeader(msgId, "image/jpeg"); InputStream is = getUrlInputStream(librawError); Attachment a = new Attachment(h, is); - AttachmentItem item = retriever.getAttachmentItem(h, a, true); + AttachmentItem item = retriever.getAttachmentItem(a, true); assertTrue(item.hasError()); } @@ -187,7 +187,7 @@ public class AttachmentRetrieverIntegrationTest { AttachmentHeader h = new AttachmentHeader(msgId, "image/gif"); InputStream is = getAssetInputStream("animated.gif"); Attachment a = new Attachment(h, is); - AttachmentItem item = retriever.getAttachmentItem(h, a, true); + AttachmentItem item = retriever.getAttachmentItem(a, true); assertEquals(65535, item.getWidth()); assertEquals(65535, item.getHeight()); assertEquals(dimensions.maxWidth, item.getThumbnailWidth()); @@ -202,7 +202,7 @@ public class AttachmentRetrieverIntegrationTest { AttachmentHeader h = new AttachmentHeader(msgId, "image/gif"); InputStream is = getAssetInputStream("animated2.gif"); Attachment a = new Attachment(h, is); - AttachmentItem item = retriever.getAttachmentItem(h, a, true); + AttachmentItem item = retriever.getAttachmentItem(a, true); assertEquals(10000, item.getWidth()); assertEquals(10000, item.getHeight()); assertEquals(dimensions.maxWidth, item.getThumbnailWidth()); @@ -217,7 +217,7 @@ public class AttachmentRetrieverIntegrationTest { AttachmentHeader h = new AttachmentHeader(msgId, "image/gif"); InputStream is = getAssetInputStream("error_large.gif"); Attachment a = new Attachment(h, is); - AttachmentItem item = retriever.getAttachmentItem(h, a, true); + AttachmentItem item = retriever.getAttachmentItem(a, true); assertEquals(16384, item.getWidth()); assertEquals(16384, item.getHeight()); assertEquals(dimensions.maxWidth, item.getThumbnailWidth()); @@ -232,7 +232,7 @@ public class AttachmentRetrieverIntegrationTest { AttachmentHeader h = new AttachmentHeader(msgId, "image/jpeg"); InputStream is = getAssetInputStream("error_high.jpg"); Attachment a = new Attachment(h, is); - AttachmentItem item = retriever.getAttachmentItem(h, a, true); + AttachmentItem item = retriever.getAttachmentItem(a, true); assertEquals(1, item.getWidth()); assertEquals(10000, item.getHeight()); assertEquals(dimensions.minWidth, item.getThumbnailWidth()); @@ -247,7 +247,7 @@ public class AttachmentRetrieverIntegrationTest { AttachmentHeader h = new AttachmentHeader(msgId, "image/jpeg"); InputStream is = getAssetInputStream("error_wide.jpg"); Attachment a = new Attachment(h, is); - AttachmentItem item = retriever.getAttachmentItem(h, a, true); + AttachmentItem item = retriever.getAttachmentItem(a, true); assertEquals(1920, item.getWidth()); assertEquals(1, item.getHeight()); assertEquals(dimensions.maxWidth, item.getThumbnailWidth()); diff --git a/briar-android/src/main/java/org/briarproject/briar/android/attachment/AttachmentCreator.java b/briar-android/src/main/java/org/briarproject/briar/android/attachment/AttachmentCreator.java index c22d46024..fce645c65 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/attachment/AttachmentCreator.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/attachment/AttachmentCreator.java @@ -98,7 +98,7 @@ public class AttachmentCreator { // get and cache AttachmentItem for ImagePreview try { Attachment a = retriever.getMessageAttachment(h); - AttachmentItem item = retriever.getAttachmentItem(h, a, needsSize); + AttachmentItem item = retriever.getAttachmentItem(a, needsSize); if (item.hasError()) throw new IOException(); AttachmentItemResult itemResult = new AttachmentItemResult(uri, item); diff --git a/briar-android/src/main/java/org/briarproject/briar/android/attachment/AttachmentRetriever.java b/briar-android/src/main/java/org/briarproject/briar/android/attachment/AttachmentRetriever.java index fee64d297..31ba87e4a 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/attachment/AttachmentRetriever.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/attachment/AttachmentRetriever.java @@ -9,8 +9,6 @@ import android.webkit.MimeTypeMap; import com.bumptech.glide.util.MarkEnforcingInputStream; -import org.briarproject.bramble.api.Pair; -import org.briarproject.bramble.api.db.DatabaseExecutor; import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.sync.MessageId; @@ -22,7 +20,6 @@ import org.briarproject.briar.api.messaging.MessagingManager; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; -import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -38,9 +35,7 @@ import static android.support.media.ExifInterface.TAG_ORIENTATION; import static java.util.logging.Level.WARNING; import static java.util.logging.Logger.getLogger; import static org.briarproject.bramble.util.IoUtils.tryToClose; -import static org.briarproject.bramble.util.LogUtils.logDuration; import static org.briarproject.bramble.util.LogUtils.logException; -import static org.briarproject.bramble.util.LogUtils.now; @NotNullByDefault public class AttachmentRetriever { @@ -93,7 +88,8 @@ public class AttachmentRetriever { }); } - public void cachePut(MessageId messageId, List attachments) { + public void cachePut(MessageId messageId, + List attachments) { attachmentCache.put(messageId, attachments); } @@ -102,47 +98,17 @@ public class AttachmentRetriever { return attachmentCache.get(messageId); } - @DatabaseExecutor - public List> getMessageAttachments( - List headers) throws DbException { - long start = now(); - List> attachments = - new ArrayList<>(headers.size()); - for (AttachmentHeader h : headers) { - Attachment a = messagingManager.getAttachment(h); - attachments.add(new Pair<>(h, a)); - } - logDuration(LOG, "Loading attachments", start); - return attachments; - } - - Attachment getMessageAttachment(AttachmentHeader h) throws DbException { + public Attachment getMessageAttachment(AttachmentHeader h) + throws DbException { return messagingManager.getAttachment(h); } - /** - * Creates {@link AttachmentItem}s from the passed headers and Attachments. - *

- * Note: This closes the {@link Attachment}'s {@link InputStream}. - */ - public List getAttachmentItems( - List> attachments) { - boolean needsSize = attachments.size() == 1; - List items = new ArrayList<>(attachments.size()); - for (Pair a : attachments) { - AttachmentItem item = - getAttachmentItem(a.getFirst(), a.getSecond(), needsSize); - items.add(item); - } - return items; - } - /** * Creates an {@link AttachmentItem} from the {@link Attachment}'s * {@link InputStream} which will be closed when this method returns. */ - AttachmentItem getAttachmentItem(AttachmentHeader h, Attachment a, - boolean needsSize) { + public AttachmentItem getAttachmentItem(Attachment a, boolean needsSize) { + AttachmentHeader h = a.getHeader(); if (!needsSize) { String extension = imageHelper.getExtensionFromMimeType(h.getContentType()); diff --git a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationActivity.java index 52cc1a19a..71bed46b7 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationActivity.java @@ -37,6 +37,7 @@ import org.briarproject.bramble.api.contact.event.ContactRemovedEvent; import org.briarproject.bramble.api.db.DatabaseExecutor; import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.db.NoSuchContactException; +import org.briarproject.bramble.api.db.NoSuchMessageException; import org.briarproject.bramble.api.event.Event; import org.briarproject.bramble.api.event.EventBus; import org.briarproject.bramble.api.event.EventListener; @@ -107,6 +108,7 @@ import static android.support.v7.util.SortedList.INVALID_POSITION; import static android.view.Gravity.RIGHT; import static android.widget.Toast.LENGTH_SHORT; import static java.util.Collections.emptyList; +import static java.util.Collections.singletonList; import static java.util.Collections.sort; import static java.util.Objects.requireNonNull; import static java.util.logging.Level.INFO; @@ -434,29 +436,36 @@ public class ConversationActivity extends BriarActivity }); } - private void eagerlyLoadMessageSize(PrivateMessageHeader h) - throws DbException { - MessageId id = h.getId(); - // If the message has text, load it - if (h.hasText()) { - String text = textCache.get(id); - if (text == null) { - LOG.info("Eagerly loading text for latest message"); - text = messagingManager.getMessageText(id); - textCache.put(id, requireNonNull(text)); + private void eagerlyLoadMessageSize(PrivateMessageHeader h) { + try { + MessageId id = h.getId(); + // If the message has text, load it + if (h.hasText()) { + String text = textCache.get(id); + if (text == null) { + LOG.info("Eagerly loading text for latest message"); + text = messagingManager.getMessageText(id); + textCache.put(id, requireNonNull(text)); + } } - } - // If the message has a single image, load its size - for multiple - // images we use a grid so the size is fixed - if (h.getAttachmentHeaders().size() == 1) { - List items = attachmentRetriever.cacheGet(id); - if (items == null) { - LOG.info("Eagerly loading image size for latest message"); - items = attachmentRetriever.getAttachmentItems( - attachmentRetriever.getMessageAttachments( - h.getAttachmentHeaders())); - attachmentRetriever.cachePut(id, items); + // If the message has a single image, load its size - for multiple + // images we use a grid so the size is fixed + List headers = h.getAttachmentHeaders(); + if (headers.size() == 1) { + List items = attachmentRetriever.cacheGet(id); + if (items == null) { + LOG.info("Eagerly loading image size for latest message"); + Attachment a = attachmentRetriever + .getMessageAttachment(headers.get(0)); + AttachmentItem item = + attachmentRetriever.getAttachmentItem(a, true); + attachmentRetriever.cachePut(id, singletonList(item)); + } } + } catch (NoSuchMessageException e) { + LOG.info("Attachment not received yet"); + } catch (DbException e) { + logException(LOG, WARNING, e); } } @@ -536,14 +545,23 @@ public class ConversationActivity extends BriarActivity private void loadMessageAttachments(MessageId messageId, List headers) { + // TODO: Use placeholders for missing/invalid attachments runOnDbThread(() -> { try { - List> attachments = - attachmentRetriever.getMessageAttachments(headers); // TODO move getting the items off to IoExecutor, if size == 1 - List items = - attachmentRetriever.getAttachmentItems(attachments); + boolean needsSize = headers.size() == 1; + List items = new ArrayList<>(headers.size()); + for (AttachmentHeader h : headers) { + Attachment a = attachmentRetriever.getMessageAttachment(h); + AttachmentItem item = + attachmentRetriever.getAttachmentItem(a, needsSize); + items.add(item); + } + // TODO: Don't cache items unless all are present and valid + attachmentRetriever.cachePut(messageId, items); displayMessageAttachments(messageId, items); + } catch (NoSuchMessageException e) { + LOG.info("Attachment not received yet"); } catch (DbException e) { logException(LOG, WARNING, e); } @@ -553,7 +571,6 @@ public class ConversationActivity extends BriarActivity private void displayMessageAttachments(MessageId m, List items) { runOnUiThreadUnlessDestroyed(() -> { - attachmentRetriever.cachePut(m, items); Pair pair = adapter.getMessageItem(m); if (pair != null) { @@ -567,6 +584,7 @@ public class ConversationActivity extends BriarActivity @Override public void eventOccurred(Event e) { + // TODO: Load missing attachments when they arrive if (e instanceof ContactRemovedEvent) { ContactRemovedEvent c = (ContactRemovedEvent) e; if (c.getContactId().equals(contactId)) { diff --git a/briar-android/src/test/java/org/briarproject/briar/android/attachment/AttachmentRetrieverTest.java b/briar-android/src/test/java/org/briarproject/briar/android/attachment/AttachmentRetrieverTest.java index a2e7d2108..67670e846 100644 --- a/briar-android/src/test/java/org/briarproject/briar/android/attachment/AttachmentRetrieverTest.java +++ b/briar-android/src/test/java/org/briarproject/briar/android/attachment/AttachmentRetrieverTest.java @@ -9,14 +9,11 @@ import org.briarproject.briar.api.messaging.MessagingManager; import org.jmock.Expectations; import org.junit.Test; -import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.InputStream; import static org.briarproject.bramble.test.TestUtils.getRandomBytes; import static org.briarproject.bramble.test.TestUtils.getRandomId; -import static org.briarproject.bramble.util.StringUtils.getRandomString; -import static org.briarproject.briar.api.messaging.MessagingConstants.MAX_CONTENT_TYPE_BYTES; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @@ -27,35 +24,26 @@ public class AttachmentRetrieverTest extends BrambleMockTestCase { 100, 50, 200, 75, 300 ); private final MessageId msgId = new MessageId(getRandomId()); - private final String mimeType = getRandomString(MAX_CONTENT_TYPE_BYTES); - private final AttachmentHeader header = - new AttachmentHeader(msgId, mimeType); - private final Attachment attachment = new Attachment(header, - new BufferedInputStream( - new ByteArrayInputStream(getRandomBytes(42)))); - private final MessagingManager messagingManager = context.mock(MessagingManager.class); private final ImageHelper imageHelper = context.mock(ImageHelper.class); - private final AttachmentRetriever controller = - new AttachmentRetriever( - messagingManager, - dimensions, - imageHelper - ); + private final AttachmentRetriever retriever = new AttachmentRetriever( + messagingManager, + dimensions, + imageHelper + ); @Test public void testNoSize() { String mimeType = "image/jpeg"; - AttachmentHeader h = getAttachmentHeader(mimeType); + Attachment attachment = getAttachment(mimeType); context.checking(new Expectations() {{ oneOf(imageHelper).getExtensionFromMimeType(mimeType); will(returnValue("jpg")); }}); - AttachmentItem item = - controller.getAttachmentItem(h, attachment, false); + AttachmentItem item = retriever.getAttachmentItem(attachment, false); assertEquals(mimeType, item.getMimeType()); assertEquals("jpg", item.getExtension()); assertFalse(item.hasError()); @@ -64,22 +52,21 @@ public class AttachmentRetrieverTest extends BrambleMockTestCase { @Test public void testNoSizeWrongMimeTypeProducesError() { String mimeType = "application/octet-stream"; - AttachmentHeader h = getAttachmentHeader(mimeType); + Attachment attachment = getAttachment(mimeType); context.checking(new Expectations() {{ oneOf(imageHelper).getExtensionFromMimeType(mimeType); will(returnValue(null)); }}); - AttachmentItem item = - controller.getAttachmentItem(h, attachment, false); + AttachmentItem item = retriever.getAttachmentItem(attachment, false); assertTrue(item.hasError()); } @Test public void testSmallJpegImage() { String mimeType = "image/jpeg"; - AttachmentHeader h = getAttachmentHeader(mimeType); + Attachment attachment = getAttachment(mimeType); context.checking(new Expectations() {{ oneOf(imageHelper).decodeStream(with(any(InputStream.class))); @@ -88,7 +75,7 @@ public class AttachmentRetrieverTest extends BrambleMockTestCase { will(returnValue("jpg")); }}); - AttachmentItem item = controller.getAttachmentItem(h, attachment, true); + AttachmentItem item = retriever.getAttachmentItem(attachment, true); assertEquals(msgId, item.getMessageId()); assertEquals(160, item.getWidth()); assertEquals(240, item.getHeight()); @@ -102,7 +89,7 @@ public class AttachmentRetrieverTest extends BrambleMockTestCase { @Test public void testBigJpegImage() { String mimeType = "image/jpeg"; - AttachmentHeader h = getAttachmentHeader(mimeType); + Attachment attachment = getAttachment(mimeType); context.checking(new Expectations() {{ oneOf(imageHelper).decodeStream(with(any(InputStream.class))); @@ -111,7 +98,7 @@ public class AttachmentRetrieverTest extends BrambleMockTestCase { will(returnValue("jpg")); }}); - AttachmentItem item = controller.getAttachmentItem(h, attachment, true); + AttachmentItem item = retriever.getAttachmentItem(attachment, true); assertEquals(1728, item.getWidth()); assertEquals(2592, item.getHeight()); assertEquals(dimensions.maxWidth, item.getThumbnailWidth()); @@ -121,7 +108,7 @@ public class AttachmentRetrieverTest extends BrambleMockTestCase { @Test public void testMalformedError() { - AttachmentHeader h = getAttachmentHeader("image/jpeg"); + Attachment attachment = getAttachment("image/jpeg"); context.checking(new Expectations() {{ oneOf(imageHelper).decodeStream(with(any(InputStream.class))); @@ -130,12 +117,13 @@ public class AttachmentRetrieverTest extends BrambleMockTestCase { will(returnValue(null)); }}); - AttachmentItem item = controller.getAttachmentItem(h, attachment, true); + AttachmentItem item = retriever.getAttachmentItem(attachment, true); assertTrue(item.hasError()); } - private AttachmentHeader getAttachmentHeader(String contentType) { - return new AttachmentHeader(msgId, contentType); + private Attachment getAttachment(String contentType) { + AttachmentHeader header = new AttachmentHeader(msgId, contentType); + InputStream in = new ByteArrayInputStream(getRandomBytes(42)); + return new Attachment(header, in); } - } diff --git a/briar-api/src/main/java/org/briarproject/briar/api/messaging/InvalidAttachmentException.java b/briar-api/src/main/java/org/briarproject/briar/api/messaging/InvalidAttachmentException.java new file mode 100644 index 000000000..df32602d1 --- /dev/null +++ b/briar-api/src/main/java/org/briarproject/briar/api/messaging/InvalidAttachmentException.java @@ -0,0 +1,14 @@ +package org.briarproject.briar.api.messaging; + +import org.briarproject.bramble.api.db.DbException; +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; + +/** + * An exception that is thrown when an {@link AttachmentHeader} is used to + * load an {@link Attachment}, and the header refers to a message that is not + * an attachment, or to an attachment that does not have the expected content + * type. + */ +@NotNullByDefault +public class InvalidAttachmentException extends DbException { +} diff --git a/briar-api/src/main/java/org/briarproject/briar/api/messaging/MessagingManager.java b/briar-api/src/main/java/org/briarproject/briar/api/messaging/MessagingManager.java index a4b7fb7e5..d4c6074d4 100644 --- a/briar-api/src/main/java/org/briarproject/briar/api/messaging/MessagingManager.java +++ b/briar-api/src/main/java/org/briarproject/briar/api/messaging/MessagingManager.java @@ -69,6 +69,10 @@ public interface MessagingManager extends ConversationClient { /** * Returns the attachment with the given message ID and content type. + * + * @throws InvalidAttachmentException If the header refers to a message + * that is not an attachment, or to an attachment that does not have the + * expected content type */ Attachment getAttachment(AttachmentHeader h) throws DbException; diff --git a/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java index e076235e8..c85a2a22d 100644 --- a/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java @@ -32,6 +32,7 @@ import org.briarproject.briar.api.conversation.ConversationMessageHeader; import org.briarproject.briar.api.messaging.Attachment; import org.briarproject.briar.api.messaging.AttachmentHeader; import org.briarproject.briar.api.messaging.FileTooBigException; +import org.briarproject.briar.api.messaging.InvalidAttachmentException; import org.briarproject.briar.api.messaging.MessagingManager; import org.briarproject.briar.api.messaging.PrivateMessage; import org.briarproject.briar.api.messaging.PrivateMessageHeader; @@ -380,6 +381,12 @@ class MessagingManagerImpl implements MessagingManager, IncomingMessageHook, byte[] body = clientHelper.getMessage(m).getBody(); try { BdfDictionary meta = clientHelper.getMessageMetadataAsDictionary(m); + Long messageType = meta.getOptionalLong(MSG_KEY_MSG_TYPE); + if (messageType == null || messageType != ATTACHMENT) + throw new InvalidAttachmentException(); + String contentType = meta.getString(MSG_KEY_CONTENT_TYPE); + if (!contentType.equals(h.getContentType())) + throw new InvalidAttachmentException(); int offset = meta.getLong(MSG_KEY_DESCRIPTOR_LENGTH).intValue(); return new Attachment(h, new ByteArrayInputStream(body, offset, body.length - offset));