Diff
Modified: trunk/jopenssl/src/java/org/jruby/ext/openssl/impl/Mime.java (1067 => 1068)
--- trunk/jopenssl/src/java/org/jruby/ext/openssl/impl/Mime.java 2008-07-21 18:42:59 UTC (rev 1067)
+++ trunk/jopenssl/src/java/org/jruby/ext/openssl/impl/Mime.java 2008-07-21 18:43:02 UTC (rev 1068)
@@ -43,4 +43,9 @@
*
*/
MimeHeader findHeader(List<MimeHeader> headers, String key);
+
+ /* c: mime_param_find
+ *
+ */
+ MimeParam findParam(MimeHeader header, String key);
}// Mime
Modified: trunk/jopenssl/src/java/org/jruby/ext/openssl/impl/MimeHeader.java (1067 => 1068)
--- trunk/jopenssl/src/java/org/jruby/ext/openssl/impl/MimeHeader.java 2008-07-21 18:42:59 UTC (rev 1067)
+++ trunk/jopenssl/src/java/org/jruby/ext/openssl/impl/MimeHeader.java 2008-07-21 18:43:02 UTC (rev 1068)
@@ -27,6 +27,9 @@
***** END LICENSE BLOCK *****/
package org.jruby.ext.openssl.impl;
+import java.util.ArrayList;
+import java.util.List;
+
/** MIME_HEADER
*
* @author <a href="" PROTECTED]">Ola Bini</a>
@@ -35,6 +38,11 @@
private String name;
private String value;
+ /**
+ * Describe params here.
+ */
+ private List<MimeParam> params = new ArrayList<MimeParam>();
+
public MimeHeader(String name, String value) {
this.name = name;
this.value = value;
@@ -43,4 +51,22 @@
public String getValue() {
return this.value;
}
+
+ /**
+ * Get the <code>Params</code> value.
+ *
+ * @return a <code>List<MimeParam></code> value
+ */
+ public final List<MimeParam> getParams() {
+ return params;
+ }
+
+ /**
+ * Set the <code>Params</code> value.
+ *
+ * @param newParams The new Params value.
+ */
+ public final void setParams(final List<MimeParam> newParams) {
+ this.params = newParams;
+ }
}// MimeHeader
Modified: trunk/jopenssl/src/java/org/jruby/ext/openssl/impl/SMIME.java (1067 => 1068)
--- trunk/jopenssl/src/java/org/jruby/ext/openssl/impl/SMIME.java 2008-07-21 18:42:59 UTC (rev 1067)
+++ trunk/jopenssl/src/java/org/jruby/ext/openssl/impl/SMIME.java 2008-07-21 18:43:02 UTC (rev 1068)
@@ -27,6 +27,7 @@
***** END LICENSE BLOCK *****/
package org.jruby.ext.openssl.impl;
+import java.util.Arrays;
import java.util.List;
/** SMIME methods for PKCS7
@@ -43,10 +44,17 @@
/* c: B64_read_PKCS7
*
*/
- public PKCS7 readBase64PKCS7(BIO bio) {
+ public PKCS7 readPKCS7Base64(BIO bio) {
return null;
}
+ /* c: static multi_split
+ *
+ */
+ public List<BIO> multiSplit(BIO bio, String boundary) {
+ return Arrays.<BIO>asList(null, null);
+ }
+
/* c: SMIME_read_PKCS7
*
*/
@@ -65,32 +73,30 @@
throw new PKCS7Exception(PKCS7.F_SMIME_READ_PKCS7, PKCS7.R_NO_CONTENT_TYPE);
}
+ if("multipart/signed".equals(hdr.getValue())) {
+ MimeParam prm = mime.findParam(hdr, "boundary");
+ if(prm == null || prm.getParamValue() == null) {
+ throw new PKCS7Exception(PKCS7.F_SMIME_READ_PKCS7, PKCS7.R_NO_MULTIPART_BOUNDARY);
+ }
+ List<BIO> parts = multiSplit(bio, prm.getParamValue());
+ if(parts == null || parts.size() != 2) {
+ throw new PKCS7Exception(PKCS7.F_SMIME_READ_PKCS7, PKCS7.R_NO_MULTIPART_BODY_FAILURE);
+ }
+
+
+ return null;
+ }
if(!"application/x-pkcs7-mime".equals(hdr.getValue()) &&
!"application/pkcs7-mime".equals(hdr.getValue())) {
throw new PKCS7Exception(PKCS7.F_SMIME_READ_PKCS7, PKCS7.R_INVALID_MIME_TYPE, "type: " + hdr.getValue());
}
- return readBase64PKCS7(bio);
+ return readPKCS7Base64(bio);
// /* Handle multipart/signed */
-// if(!strcmp(hdr->value, "multipart/signed")) {
-// /* Split into two parts */
-// prm = mime_param_find(hdr, "boundary");
-// if(!prm || !prm->param_value) {
-// sk_MIME_HEADER_pop_free(headers, mime_hdr_free);
-// PKCS7err(PKCS7_F_SMIME_READ_PKCS7, PKCS7_R_NO_MULTIPART_BOUNDARY);
-// return NULL;
-// }
-// ret = multi_split(bio, prm->param_value, &parts);
-// sk_MIME_HEADER_pop_free(headers, mime_hdr_free);
-// if(!ret || (sk_BIO_num(parts) != 2) ) {
-// PKCS7err(PKCS7_F_SMIME_READ_PKCS7, PKCS7_R_NO_MULTIPART_BODY_FAILURE);
-// sk_BIO_pop_free(parts, BIO_vfree);
-// return NULL;
-// }
// /* Parse the signature piece */
// p7in = sk_BIO_value(parts, 1);
Modified: trunk/jopenssl/test/test_java_pkcs7.rb (1067 => 1068)
--- trunk/jopenssl/test/test_java_pkcs7.rb 2008-07-21 18:42:59 UTC (rev 1067)
+++ trunk/jopenssl/test/test_java_pkcs7.rb 2008-07-21 18:43:02 UTC (rev 1068)
@@ -27,6 +27,7 @@
SMIME = org.jruby.ext.openssl.impl.SMIME unless defined?(SMIME)
Mime = org.jruby.ext.openssl.impl.Mime unless defined?(Mime)
MimeHeader = org.jruby.ext.openssl.impl.MimeHeader unless defined?(MimeHeader)
+ MimeParam = org.jruby.ext.openssl.impl.MimeParam unless defined?(MimeParam)
BIO = org.jruby.ext.openssl.impl.BIO unless defined?(BIO)
PKCS7Exception = org.jruby.ext.openssl.impl.PKCS7Exception unless defined?(PKCS7Exception)
@@ -172,6 +173,46 @@
end
end
+ def test_read_pkcs7_with_multipart_should_fail_if_no_boundary_found
+ bio = BIO.new
+ mime = Mime.new
+
+ headers = ArrayList.new
+ hdr = MimeHeader.new("content-type", "multipart/signed")
+ mime.expects(:parseHeaders).with(bio).returns(headers)
+ mime.expects(:findHeader).with(headers, "content-type").returns(hdr)
+
+ mime.expects(:findParam).with(hdr, "boundary").returns(nil)
+
+ begin
+ SMIME.new(mime).readPKCS7(bio, nil)
+ assert false
+ rescue PKCS7Exception => e
+ assert_equal PKCS7::F_SMIME_READ_PKCS7, e.cause.get_method
+ assert_equal PKCS7::R_NO_MULTIPART_BOUNDARY, e.cause.get_reason
+ end
+ end
+
+ def test_read_pkcs7_with_multipart_should_fail_if_null_boundary_value
+ bio = BIO.new
+ mime = Mime.new
+
+ headers = ArrayList.new
+ hdr = MimeHeader.new("content-type", "multipart/signed")
+ mime.expects(:parseHeaders).with(bio).returns(headers)
+ mime.expects(:findHeader).with(headers, "content-type").returns(hdr)
+
+ mime.expects(:findParam).with(hdr, "boundary").returns(MimeParam.new("boundary", nil))
+
+ begin
+ SMIME.new(mime).readPKCS7(bio, nil)
+ assert false
+ rescue PKCS7Exception => e
+ assert_equal PKCS7::F_SMIME_READ_PKCS7, e.cause.get_method
+ assert_equal PKCS7::R_NO_MULTIPART_BOUNDARY, e.cause.get_reason
+ end
+ end
+
def test_read_pkcs7_happy_path_without_multipart
bio = BIO.new
mime = Mime.new