Support for encrypted attachments

Refs #66
pull/91/head
M66B 6 years ago
parent 7e3f4563d1
commit 6d3c4a96fa

@ -39,6 +39,12 @@ public interface DaoAttachment {
" WHERE message = :message") " WHERE message = :message")
int getAttachmentCount(long message); int getAttachmentCount(long message);
@Query("SELECT COUNT(id)" +
" FROM attachment" +
" WHERE message = :message" +
" AND name = :name")
int getAttachmentCount(long message, String name);
@Query("SELECT COUNT(id)" + @Query("SELECT COUNT(id)" +
" FROM attachment" + " FROM attachment" +
" WHERE id = :id") " WHERE id = :id")

@ -68,6 +68,7 @@ import org.openintents.openpgp.util.OpenPgpApi;
import org.openintents.openpgp.util.OpenPgpServiceConnection; import org.openintents.openpgp.util.OpenPgpServiceConnection;
import org.xml.sax.XMLReader; import org.xml.sax.XMLReader;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.File; import java.io.File;
@ -75,6 +76,7 @@ import java.io.FileInputStream;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL; import java.net.URL;
import java.text.Collator; import java.text.Collator;
import java.text.DateFormat; import java.text.DateFormat;
@ -86,8 +88,6 @@ import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import javax.mail.Multipart;
import javax.mail.Part;
import javax.mail.internet.InternetAddress; import javax.mail.internet.InternetAddress;
import javax.mail.internet.InternetHeaders; import javax.mail.internet.InternetHeaders;
import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeBodyPart;
@ -1185,24 +1185,68 @@ public class FragmentMessage extends FragmentEx {
Log.i(Helper.TAG, "Decrypted"); Log.i(Helper.TAG, "Decrypted");
String decrypted = os.toString("UTF-8"); String decrypted = os.toString("UTF-8");
if (isPart) { if (isPart) {
String plain = null;
String html = null;
InternetHeaders ih = new InternetHeaders(); InternetHeaders ih = new InternetHeaders();
ih.addHeader("Content-Type", "multipart/alternative"); ih.addHeader("Content-Type", "multipart/alternative");
MimeBodyPart part = new MimeBodyPart(ih, decrypted.getBytes()); final MimeBodyPart part = new MimeBodyPart(ih, decrypted.getBytes());
Multipart mp = (Multipart) part.getContent(); FragmentMessage.this.decrypted = MessageHelper.getHtml(part);
for (int i = 0; i < mp.getCount(); i++) {
Part bp = mp.getBodyPart(i); // Store attachments
if (bp.isMimeType("text/plain")) new Thread(new Runnable() {
plain = bp.getContent().toString(); @Override
else if (bp.isMimeType("text/html")) public void run() {
html = bp.getContent().toString(); try {
} DB db = DB.getInstance(getContext());
int sequence = db.attachment().getAttachmentCount(message.id);
if (html != null)
FragmentMessage.this.decrypted = html; for (EntityAttachment attachment : MessageHelper.getAttachments(part))
else if (plain != null) if (db.attachment().getAttachmentCount(message.id, attachment.name) == 0)
FragmentMessage.this.decrypted = "<pre>" + plain.replaceAll("\\r?\\n", "<br />") + "</pre>"; try {
db.beginTransaction();
attachment.message = message.id;
attachment.sequence = ++sequence;
attachment.id = db.attachment().insertAttachment(attachment);
File file = EntityAttachment.getFile(getContext(), attachment.id);
// Store attachment
InputStream is = null;
OutputStream os = null;
try {
is = attachment.part.getInputStream();
os = new BufferedOutputStream(new FileOutputStream(file));
int size = 0;
byte[] buffer = new byte[4096];
for (int len = is.read(buffer); len != -1; len = is.read(buffer)) {
size += len;
os.write(buffer, 0, len);
}
// Store attachment data
attachment.size = size;
attachment.progress = null;
attachment.available = true;
db.attachment().updateAttachment(attachment);
} finally {
try {
if (is != null)
is.close();
} finally {
if (os != null)
os.close();
}
}
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
} catch (Throwable ex) {
Log.e(Helper.TAG, ex + "\n" + Log.getStackTraceString(ex));
}
}
}).start();
} else } else
FragmentMessage.this.decrypted = "<pre>" + decrypted.replaceAll("\\r?\\n", "<br />") + "</pre>"; FragmentMessage.this.decrypted = "<pre>" + decrypted.replaceAll("\\r?\\n", "<br />") + "</pre>";

@ -281,7 +281,7 @@ public class MessageHelper {
return getHtml(imessage); return getHtml(imessage);
} }
private String getHtml(Part part) throws MessagingException, IOException { static String getHtml(Part part) throws MessagingException, IOException {
if (part.isMimeType("text/*")) { if (part.isMimeType("text/*")) {
String s; String s;
try { try {
@ -361,7 +361,7 @@ public class MessageHelper {
return result; return result;
} }
private List<EntityAttachment> getAttachments(BodyPart part) throws static List<EntityAttachment> getAttachments(BodyPart part) throws
IOException, MessagingException { IOException, MessagingException {
List<EntityAttachment> result = new ArrayList<>(); List<EntityAttachment> result = new ArrayList<>();

Loading…
Cancel
Save