From 5ccb7436068719ff341b3d975a4f908c93dc4ef1 Mon Sep 17 00:00:00 2001 From: Brice Figureau Date: Sat, 23 May 2009 15:00:44 +0200 Subject: [PATCH 4/4] Implement OpenSSL::X509::Store#add_file Signed-off-by: Brice Figureau --- src/java/org/jruby/ext/openssl/X509Store.java | 32 +++++++++++++++++++++++- test/openssl/test_x509store.rb | 28 +++++++++++++++++++++ 2 files changed, 58 insertions(+), 2 deletions(-) diff --git a/src/java/org/jruby/ext/openssl/X509Store.java b/src/java/org/jruby/ext/openssl/X509Store.java index f74bf68..553c16f 100644 --- a/src/java/org/jruby/ext/openssl/X509Store.java +++ b/src/java/org/jruby/ext/openssl/X509Store.java @@ -27,6 +27,11 @@ ***** END LICENSE BLOCK *****/ package org.jruby.ext.openssl; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.io.StringReader; + import org.jruby.Ruby; import org.jruby.RubyClass; import org.jruby.RubyFixnum; @@ -36,6 +41,7 @@ import org.jruby.RubyObject; import org.jruby.anno.JRubyMethod; import org.jruby.exceptions.RaiseException; import org.jruby.ext.openssl.x509store.Function2; +import org.jruby.ext.openssl.x509store.PEMInputOutput; import org.jruby.ext.openssl.x509store.X509AuxCertificate; import org.jruby.ext.openssl.x509store.Store; import org.jruby.ext.openssl.x509store.StoreContext; @@ -139,8 +145,30 @@ public class X509Store extends RubyObject { @JRubyMethod public IRubyObject add_file(IRubyObject arg) { - System.err.println("WARNING: unimplemented method called: Store#add_file"); - return getRuntime().getNil(); + String path = arg.toString(); + FileReader in = null; + try { + in = new FileReader(path); + Object o = PEMInputOutput.readPEM(in, null); + System.out.println("o: "+o.getClass() + " iof: "+(o instanceof X509AuxCertificate)); + if(o instanceof X509AuxCertificate && store.addCertificate((X509AuxCertificate)o) != 1) { + raise("can't store certificate"); + } else if (o instanceof X509CRL && store.addCRL((java.security.cert.CRL)o) != 1) { + raise("can't store crl"); + } + } + catch (FileNotFoundException e) { + raise("file not found: "+ e.getMessage()); + } + catch (IOException e) { + raise("error while reading file: "+ e.getMessage()); + } + finally { + if (in != null) { + try { in.close(); } catch(Exception e) {} + } + } + return this; } @JRubyMethod diff --git a/test/openssl/test_x509store.rb b/test/openssl/test_x509store.rb index 914588b..9955b9e 100644 --- a/test/openssl/test_x509store.rb +++ b/test/openssl/test_x509store.rb @@ -4,6 +4,7 @@ begin rescue LoadError end require "test/unit" +require "tempfile" if defined?(OpenSSL) @@ -212,6 +213,33 @@ class OpenSSL::TestX509Store < Test::Unit::TestCase store.add_crl(crl2) # add CRL issued by same CA twice. } end + + def test_add_file + ca1_cert = <