1 package org.columba.mail.pgp; 17 18 import java.io.ByteArrayInputStream ; 19 import java.io.InputStream ; 20 import java.util.Vector ; 21 22 import javax.swing.JOptionPane ; 23 24 import org.columba.core.gui.frame.FrameManager; 25 import org.columba.core.io.StreamUtils; 26 import org.columba.mail.config.SecurityItem; 27 import org.columba.mail.message.PGPMimePart; 28 import org.columba.ristretto.composer.MimePartRenderer; 29 import org.columba.ristretto.composer.MimeTreeRenderer; 30 import org.columba.ristretto.io.CharSequenceSource; 31 import org.columba.ristretto.io.SequenceInputStream; 32 import org.columba.ristretto.io.Source; 33 import org.columba.ristretto.message.InputStreamMimePart; 34 import org.columba.ristretto.message.LocalMimePart; 35 import org.columba.ristretto.message.MimeHeader; 36 import org.columba.ristretto.message.MimePart; 37 import org.columba.ristretto.message.StreamableMimePart; 38 import org.waffel.jscf.JSCFConnection; 39 import org.waffel.jscf.JSCFResultSet; 40 import org.waffel.jscf.JSCFStatement; 41 42 43 public class MultipartEncryptedRenderer extends MimePartRenderer { 44 private StreamableMimePart controlPart; 45 private MimeHeader encryptedHeader; 46 47 public MultipartEncryptedRenderer() { 48 MimeHeader controlHeader = new MimeHeader("application", "pgp-encrypted"); 49 Source controlBody = new CharSequenceSource("Version: 1\r\n"); 50 controlPart = new LocalMimePart(controlHeader, controlBody); 51 52 encryptedHeader = new MimeHeader("application", "octet-stream"); 53 } 54 55 58 public String getRegisterString() { 59 return "multipart/encrypted"; 60 } 61 62 65 public InputStream render(MimePart part) throws Exception { 66 Vector streams = new Vector ((2 * 2) + 3); 67 68 MimeHeader header = part.getHeader(); 69 70 String boundary = createUniqueBoundary().toString(); 72 header.putContentParameter("boundary", boundary); 73 74 byte[] startBoundary = ("\r\n--" + boundary + "\r\n").getBytes(); 75 byte[] endBoundary = ("\r\n--" + boundary + "--\r\n").getBytes(); 76 77 header.putContentParameter("protocol", "application/pgp-encrypted"); 79 80 streams.add(header.getHeader().getInputStream()); 82 83 SecurityItem pgpItem = ((PGPMimePart) part).getPgpItem(); 84 85 streams.add(new ByteArrayInputStream (startBoundary)); 87 streams.add(MimeTreeRenderer.getInstance().renderMimePart(controlPart)); 88 89 streams.add(new ByteArrayInputStream (startBoundary)); 91 92 StreamableMimePart encryptedPart; 93 encryptedPart = null; 94 95 99 JSCFController controller = JSCFController.getInstance(); 100 JSCFConnection con = controller.getConnection(); 101 102 JSCFStatement stmt = con.createStatement(); 104 JSCFResultSet res = stmt.executeEncrypt(MimeTreeRenderer.getInstance() 105 .renderMimePart(part.getChild( 106 0)), pgpItem.get("recipients")); 107 108 if (res.isError()) { 109 JOptionPane.showMessageDialog(FrameManager.getInstance() 110 .getActiveFrame(), 111 StreamUtils.readCharacterStream(res.getErrorStream()).toString()); 112 } 113 114 encryptedPart = new InputStreamMimePart(encryptedHeader, 115 res.getResultStream()); 116 streams.add(MimeTreeRenderer.getInstance().renderMimePart(encryptedPart)); 117 118 streams.add(new ByteArrayInputStream (endBoundary)); 120 121 return new SequenceInputStream(streams); 122 } 123 } 124 | Popular Tags |