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 org.columba.core.io.CloneStreamMaster; 23 import org.columba.ristretto.composer.MimePartRenderer; 24 import org.columba.ristretto.composer.MimeTreeRenderer; 25 import org.columba.ristretto.io.SequenceInputStream; 26 import org.columba.ristretto.message.InputStreamMimePart; 27 import org.columba.ristretto.message.MimeHeader; 28 import org.columba.ristretto.message.MimePart; 29 import org.columba.ristretto.message.StreamableMimePart; 30 import org.waffel.jscf.JSCFConnection; 31 import org.waffel.jscf.JSCFResultSet; 32 import org.waffel.jscf.JSCFStatement; 33 34 40 public class MultipartSignedRenderer extends MimePartRenderer { 41 private MimeHeader signatureHeader; 42 43 48 public MultipartSignedRenderer() { 49 this.signatureHeader = new MimeHeader("application", "pgp-signature"); 50 } 51 52 57 public String getRegisterString() { 58 return "multipart/signed"; 59 } 60 61 66 public InputStream render(MimePart part) throws Exception { 67 Vector streams = new Vector ((2 * 2) + 3); 68 69 MimeHeader header = part.getHeader(); 70 71 String boundary = createUniqueBoundary().toString(); 73 header.putContentParameter("boundary", boundary); 74 75 byte[] startBoundary = ("\r\n--" + boundary + "\r\n").getBytes(); 76 byte[] endBoundary = ("\r\n--" + boundary + "--\r\n").getBytes(); 77 78 header.putContentParameter("micalg", "pgp-sha1"); 81 header.putContentParameter("protocol", "application/pgp-signature"); 82 83 streams.add(header.getHeader().getInputStream()); 85 86 streams.add(new ByteArrayInputStream (startBoundary)); 88 89 CloneStreamMaster signedPartCloneModel = new CloneStreamMaster( 90 MimeTreeRenderer.getInstance().renderMimePart(part.getChild(0))); 91 92 streams.add(signedPartCloneModel.getClone()); 93 94 streams.add(new ByteArrayInputStream (startBoundary)); 96 97 StreamableMimePart signatureMimePart; 98 99 signatureMimePart = null; 100 101 JSCFController controller = JSCFController.getInstance(); 102 JSCFConnection con = controller.getConnection(); 103 104 PGPPassChecker passCheck = PGPPassChecker.getInstance(); 105 boolean check = passCheck.checkPassphrase(con); 106 107 if (!check) { 108 throw new WrongPassphraseException("wrong passphrase"); 109 } 110 111 JSCFStatement stmt = con.createStatement(); 112 JSCFResultSet res = stmt.executeSign(signedPartCloneModel.getClone()); 113 114 signatureMimePart = new InputStreamMimePart(this.signatureHeader, res 115 .getResultStream()); 116 117 streams.add(MimeTreeRenderer.getInstance().renderMimePart( 118 signatureMimePart)); 119 120 streams.add(new ByteArrayInputStream (endBoundary)); 122 123 return new SequenceInputStream(streams); 124 } 125 } 126 | Popular Tags |