diff --git a/app/src/main/java/eu/faircode/email/MessageHelper.java b/app/src/main/java/eu/faircode/email/MessageHelper.java index 1ddade7ba2..de6c88dd41 100644 --- a/app/src/main/java/eu/faircode/email/MessageHelper.java +++ b/app/src/main/java/eu/faircode/email/MessageHelper.java @@ -32,6 +32,7 @@ import org.jsoup.nodes.Document; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedReader; +import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; @@ -53,6 +54,7 @@ import java.util.Map; import java.util.Objects; import java.util.Properties; import java.util.TimeZone; +import java.util.regex.Pattern; import javax.activation.DataHandler; import javax.activation.FileDataSource; @@ -1171,9 +1173,25 @@ public class MessageHelper { db.attachment().setProgress(local.id, null); if (EntityAttachment.PGP_CONTENT.equals(apart.encrypt)) { + ContentType ct = new ContentType(apart.part.getContentType()); + String boundary = ct.getParameter("boundary"); + if (TextUtils.isEmpty(boundary)) + throw new ParseException("Signed boundary missing"); + + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + apart.part.writeTo(bos); + String raw = new String(bos.toByteArray()); + String[] parts = raw.split("\\r?\\n" + Pattern.quote("--" + boundary) + "\\r?\\n"); + if (parts.length < 2) + throw new ParseException("Signed part missing"); + + String c = parts[1] + .replaceAll(" +$", "") // trim trailing spaces + .replace("\\r?\\n", "\\r\\n"); // normalize new lines try (OutputStream os = new FileOutputStream(file)) { - apart.part.writeTo(os); + os.write(c.getBytes()); } + db.attachment().setDownloaded(local.id, file.length()); } else try (InputStream is = apart.part.getInputStream()) { @@ -1263,7 +1281,7 @@ public class MessageHelper { } try { - if (imessage.isMimeType("_multipart/signed_")) { + if (imessage.isMimeType("multipart/signed")) { Multipart multipart = (Multipart) imessage.getContent(); if (multipart.getCount() == 2) { getMessageParts(multipart.getBodyPart(0), parts, null); @@ -1273,15 +1291,15 @@ public class MessageHelper { apart.disposition = Part.INLINE; apart.filename = "content.asc"; apart.encrypt = EntityAttachment.PGP_CONTENT; - apart.part = multipart.getBodyPart(0); + apart.part = imessage; - ContentType ct = new ContentType(apart.part.getContentType()); + ContentType ct = new ContentType(multipart.getBodyPart(0).getContentType()); apart.attachment = new EntityAttachment(); apart.attachment.disposition = apart.disposition; apart.attachment.name = apart.filename; apart.attachment.type = ct.getBaseType().toLowerCase(Locale.ROOT); - apart.attachment.size = (long) apart.part.getSize(); + apart.attachment.size = getSize(); apart.attachment.encryption = apart.encrypt; parts.attachments.add(apart); diff --git a/app/src/main/res/layout/fragment_legend_messages.xml b/app/src/main/res/layout/fragment_legend_messages.xml index ee4cfd6596..ccd28fdfbe 100644 --- a/app/src/main/res/layout/fragment_legend_messages.xml +++ b/app/src/main/res/layout/fragment_legend_messages.xml @@ -153,7 +153,6 @@ android:layout_height="wrap_content" android:contentDescription="@string/title_legend_priority" android:padding="12dp" - android:visibility="gone" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/ivLowPriority" app:srcCompat="@drawable/baseline_security_24" /> @@ -165,7 +164,6 @@ android:gravity="center_vertical" android:text="@string/title_legend_signed" android:textAppearance="@style/TextAppearance.AppCompat.Medium" - android:visibility="gone" app:layout_constraintBottom_toBottomOf="@id/ivSigned" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@id/ivSigned"