Send singed-only messages

This commit is contained in:
M66B 2019-12-01 09:51:24 +01:00
parent f256e870bb
commit 06519366e8
2 changed files with 45 additions and 54 deletions

View File

@ -110,6 +110,7 @@ import org.openintents.openpgp.util.OpenPgpApi;
import org.openintents.openpgp.util.OpenPgpServiceConnection;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
@ -133,6 +134,7 @@ import java.util.regex.Pattern;
import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.MessageRemovedException;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Part;
import javax.mail.Session;
@ -141,7 +143,6 @@ import javax.mail.internet.ContentType;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.ParseException;
import static android.app.Activity.RESULT_CANCELED;
@ -209,8 +210,6 @@ public class FragmentCompose extends FragmentBase {
private String[] pgpUserIds;
private long[] pgpKeyIds;
private long pgpSignKeyId;
private String pgpContent;
private String pgpContentType;
static final int REDUCED_IMAGE_SIZE = 1440; // pixels
static final int REDUCED_IMAGE_QUALITY = 90; // percent
@ -1537,32 +1536,35 @@ public class FragmentCompose extends FragmentBase {
if (OpenPgpApi.ACTION_GET_SIGN_KEY_ID.equals(data.getAction())) {
// Serialize content
imessage.saveChanges();
Object content = imessage.getContent();
if (content instanceof String) {
pgpContent = (String) content;
pgpContentType = imessage.getContentType();
BodyPart bpContent = new MimeBodyPart() {
@Override
public void setContent(Object content, String type) throws MessagingException {
super.setContent(content, type);
// Build plain text part with headers
BodyPart plainPart = new MimeBodyPart();
plainPart.setContent(pgpContent, pgpContentType);
Multipart plainMultiPart = new MimeMultipart();
plainMultiPart.addBodyPart(plainPart);
MimeMessage m = new MimeMessage(isession);
m.setContent(plainMultiPart);
m.saveChanges();
try (OutputStream out = new FileOutputStream(input)) {
plainPart.writeTo(out);
}
} else if (content instanceof Multipart) {
pgpContent = null;
pgpContentType = ((MimeMultipart) content).getContentType();
try (OutputStream out = new FileOutputStream(input)) {
((MimeMultipart) content).writeTo(out);
// https://javaee.github.io/javamail/FAQ#howencode
updateHeaders();
if (content instanceof Multipart) {
try {
MessageHelper.overrideContentTransferEncoding((Multipart) content);
} catch (IOException ex) {
Log.e(ex);
}
} else
throw new ParseException(content.getClass().getName());
setHeader("Content-Transfer-Encoding", "base64");
}
};
bpContent.setContent(imessage.getContent(), imessage.getContentType());
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bpContent.writeTo(bos);
String raw = new String(bos.toByteArray());
raw.replaceAll(" +$", "") // trim trailing spaces
.replace("\\r?\\n", "\\r\\n"); // normalize new lines
try (OutputStream out = new FileOutputStream(input)) {
out.write(raw.getBytes());
}
} else {
// Serialize message
try (OutputStream out = new FileOutputStream(input)) {
@ -1710,19 +1712,12 @@ public class FragmentCompose extends FragmentBase {
EntityAttachment attachment = new EntityAttachment();
attachment.message = id;
attachment.sequence = db.attachment().getAttachmentSequence(id) + 1;
attachment.name = "content.txt";
attachment.type = pgpContentType;
attachment.name = "content.asc";
attachment.type = "text/plain";
attachment.disposition = Part.INLINE;
attachment.encryption = EntityAttachment.PGP_CONTENT;
attachment.id = db.attachment().insertAttachment(attachment);
// Restore plain text without headers
ContentType ct = new ContentType(pgpContentType);
if (!"multipart".equals(ct.getPrimaryType()))
try (OutputStream out = new FileOutputStream(input)) {
out.write(pgpContent.getBytes());
}
File file = attachment.getFile(context);
input.renameTo(file);

View File

@ -252,26 +252,10 @@ public class MessageHelper {
for (final EntityAttachment content : attachments)
if (EntityAttachment.PGP_CONTENT.equals(content.encryption)) {
final ContentType ct = new ContentType(content.type);
final ContentType cts = new ContentType(attachment.type);
// Build content
FileDataSource dsContent = new FileDataSource(content.getFile(context));
dsContent.setFileTypeMap(new FileTypeMap() {
@Override
public String getContentType(File file) {
return ct.toString();
}
@Override
public String getContentType(String filename) {
return ct.toString();
}
});
BodyPart bpContent = new MimeBodyPart();
bpContent.setDataHandler(new DataHandler(dsContent));
BodyPart bpContent = new MimeBodyPart(new FileInputStream(content.getFile(context)));
// Build signature
final ContentType cts = new ContentType(attachment.type);
BodyPart bpSignature = new MimeBodyPart();
bpSignature.setFileName(attachment.name);
FileDataSource dsSignature = new FileDataSource(attachment.getFile(context));
@ -483,6 +467,18 @@ public class MessageHelper {
}
}
static void overrideContentTransferEncoding(Multipart mp) throws MessagingException, IOException {
for (int i = 0; i < mp.getCount(); i++) {
Part part = mp.getBodyPart(i);
Object content = part.getContent();
if (content instanceof Multipart) {
part.setHeader("Content-Transfer-Encoding", "7bit");
overrideContentTransferEncoding((Multipart) content);
} else
part.setHeader("Content-Transfer-Encoding", "base64");
}
}
MessageHelper(MimeMessage message) {
this.imessage = message;
}
@ -1295,7 +1291,7 @@ public class MessageHelper {
apart.attachment = new EntityAttachment();
apart.attachment.disposition = apart.disposition;
apart.attachment.name = apart.filename;
apart.attachment.type = ct.getBaseType().toLowerCase(Locale.ROOT);
apart.attachment.type = "text/plain";
apart.attachment.size = getSize();
apart.attachment.encryption = apart.encrypt;