Skip to content

Commit e2025e4

Browse files
committed
handle SSLErrorWaitReadable/Writable as SSLErrors on Ruby 1.8 and 1.9 mode
- since (and if) `IO::WaitReadable` / `IO::WaitWritable` are not available
1 parent 8c39829 commit e2025e4

File tree

1 file changed

+49
-34
lines changed
  • src/main/java/org/jruby/ext/openssl

1 file changed

+49
-34
lines changed

src/main/java/org/jruby/ext/openssl/SSL.java

Lines changed: 49 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -59,38 +59,45 @@ public class SSL {
5959
public static final long OP_NETSCAPE_CA_DN_BUG = 0x20000000L;
6060
public static final long OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG = 0x40000000L;
6161

62-
public static void createSSL(Ruby runtime, RubyModule ossl) {
63-
RubyModule mSSL = ossl.defineModuleUnder("SSL");
64-
RubyClass openSSLError = ossl.getClass("OpenSSLError");
65-
RubyClass sslError = mSSL.defineClassUnder("SSLError",openSSLError,openSSLError.getAllocator());
66-
RubyClass sslErrorWaitReadable = mSSL.defineClassUnder("SSLErrorWaitReadable",sslError,openSSLError.getAllocator());
67-
sslErrorWaitReadable.include(new IRubyObject[]{runtime.getIO().getConstant("WaitReadable")});
68-
RubyClass sslErrorWaitWritable = mSSL.defineClassUnder("SSLErrorWaitWritable",sslError,openSSLError.getAllocator());
69-
sslErrorWaitWritable.include(new IRubyObject[]{runtime.getIO().getConstant("WaitWritable")});
70-
71-
SSLContext.createSSLContext(runtime,mSSL);
72-
SSLSocket.createSSLSocket(runtime,mSSL);
73-
74-
mSSL.setConstant("VERIFY_NONE", runtime.newFixnum(VERIFY_NONE));
75-
mSSL.setConstant("VERIFY_PEER", runtime.newFixnum(VERIFY_PEER));
76-
mSSL.setConstant("VERIFY_FAIL_IF_NO_PEER_CERT", runtime.newFixnum(VERIFY_FAIL_IF_NO_PEER_CERT));
77-
mSSL.setConstant("VERIFY_CLIENT_ONCE", runtime.newFixnum(VERIFY_CLIENT_ONCE));
78-
79-
mSSL.setConstant("OP_ALL", runtime.newFixnum(OP_ALL));
80-
mSSL.setConstant("OP_NO_TICKET", runtime.newFixnum(OP_NO_TICKET));
81-
mSSL.setConstant("OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION", runtime.newFixnum(OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION));
82-
mSSL.setConstant("OP_SINGLE_ECDH_USE", runtime.newFixnum(OP_SINGLE_ECDH_USE));
83-
mSSL.setConstant("OP_SINGLE_DH_USE", runtime.newFixnum(OP_SINGLE_DH_USE));
84-
mSSL.setConstant("OP_EPHEMERAL_RSA", runtime.newFixnum(OP_EPHEMERAL_RSA));
85-
mSSL.setConstant("OP_CIPHER_SERVER_PREFERENCE", runtime.newFixnum(OP_CIPHER_SERVER_PREFERENCE));
86-
mSSL.setConstant("OP_TLS_ROLLBACK_BUG", runtime.newFixnum(OP_TLS_ROLLBACK_BUG));
87-
mSSL.setConstant("OP_NO_SSLv2", runtime.newFixnum(OP_NO_SSLv2));
88-
mSSL.setConstant("OP_NO_SSLv3", runtime.newFixnum(OP_NO_SSLv3));
89-
mSSL.setConstant("OP_NO_TLSv1", runtime.newFixnum(OP_NO_TLSv1));
90-
mSSL.setConstant("OP_PKCS1_CHECK_1", runtime.newFixnum(OP_PKCS1_CHECK_1));
91-
mSSL.setConstant("OP_PKCS1_CHECK_2", runtime.newFixnum(OP_PKCS1_CHECK_2));
92-
mSSL.setConstant("OP_NETSCAPE_CA_DN_BUG", runtime.newFixnum(OP_NETSCAPE_CA_DN_BUG));
93-
mSSL.setConstant("OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG", runtime.newFixnum(OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG));
62+
public static void createSSL(final Ruby runtime, final RubyModule ossl) {
63+
final RubyModule _SSL = ossl.defineModuleUnder("SSL");
64+
final RubyClass _OpenSSLError = ossl.getClass("OpenSSLError");
65+
RubyClass _SSLError = _SSL.defineClassUnder("SSLError", _OpenSSLError, _OpenSSLError.getAllocator());
66+
67+
final IRubyObject _WaitReadable = runtime.getIO().getConstant("WaitReadable");
68+
if ( _WaitReadable != null ) { // since 2.0 (do not exist in 1.8 / 1.9)
69+
_SSL.defineClassUnder("SSLErrorWaitReadable", _SSLError, _OpenSSLError.getAllocator()).
70+
include(new IRubyObject[]{ _WaitReadable });
71+
}
72+
final IRubyObject _WaitWritable = runtime.getIO().getConstant("WaitWritable");
73+
if ( _WaitWritable != null ) { // since 2.0 (do not exist in 1.8 / 1.9)
74+
_SSL.defineClassUnder("SSLErrorWaitWritable", _SSLError, _OpenSSLError.getAllocator()).
75+
include(new IRubyObject[]{ _WaitWritable });
76+
}
77+
78+
SSLContext.createSSLContext(runtime, _SSL);
79+
SSLSocket.createSSLSocket(runtime, _SSL);
80+
81+
_SSL.setConstant("VERIFY_NONE", runtime.newFixnum(VERIFY_NONE));
82+
_SSL.setConstant("VERIFY_PEER", runtime.newFixnum(VERIFY_PEER));
83+
_SSL.setConstant("VERIFY_FAIL_IF_NO_PEER_CERT", runtime.newFixnum(VERIFY_FAIL_IF_NO_PEER_CERT));
84+
_SSL.setConstant("VERIFY_CLIENT_ONCE", runtime.newFixnum(VERIFY_CLIENT_ONCE));
85+
86+
_SSL.setConstant("OP_ALL", runtime.newFixnum(OP_ALL));
87+
_SSL.setConstant("OP_NO_TICKET", runtime.newFixnum(OP_NO_TICKET));
88+
_SSL.setConstant("OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION", runtime.newFixnum(OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION));
89+
_SSL.setConstant("OP_SINGLE_ECDH_USE", runtime.newFixnum(OP_SINGLE_ECDH_USE));
90+
_SSL.setConstant("OP_SINGLE_DH_USE", runtime.newFixnum(OP_SINGLE_DH_USE));
91+
_SSL.setConstant("OP_EPHEMERAL_RSA", runtime.newFixnum(OP_EPHEMERAL_RSA));
92+
_SSL.setConstant("OP_CIPHER_SERVER_PREFERENCE", runtime.newFixnum(OP_CIPHER_SERVER_PREFERENCE));
93+
_SSL.setConstant("OP_TLS_ROLLBACK_BUG", runtime.newFixnum(OP_TLS_ROLLBACK_BUG));
94+
_SSL.setConstant("OP_NO_SSLv2", runtime.newFixnum(OP_NO_SSLv2));
95+
_SSL.setConstant("OP_NO_SSLv3", runtime.newFixnum(OP_NO_SSLv3));
96+
_SSL.setConstant("OP_NO_TLSv1", runtime.newFixnum(OP_NO_TLSv1));
97+
_SSL.setConstant("OP_PKCS1_CHECK_1", runtime.newFixnum(OP_PKCS1_CHECK_1));
98+
_SSL.setConstant("OP_PKCS1_CHECK_2", runtime.newFixnum(OP_PKCS1_CHECK_2));
99+
_SSL.setConstant("OP_NETSCAPE_CA_DN_BUG", runtime.newFixnum(OP_NETSCAPE_CA_DN_BUG));
100+
_SSL.setConstant("OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG", runtime.newFixnum(OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG));
94101
}
95102

96103
@Deprecated // confusing since it throws instead of returning
@@ -107,11 +114,19 @@ public static RaiseException newSSLError(Ruby runtime, String message) {
107114
}
108115

109116
public static RaiseException newSSLErrorWaitReadable(Ruby runtime, String message) {
110-
return Utils.newError(runtime, _SSL(runtime).getClass("SSLErrorWaitReadable"), message, false);
117+
return newCustomSSLError(runtime, "SSLErrorWaitReadable", message);
111118
}
112119

113120
public static RaiseException newSSLErrorWaitWritable(Ruby runtime, String message) {
114-
return Utils.newError(runtime, _SSL(runtime).getClass("SSLErrorWaitWritable"), message, false);
121+
return newCustomSSLError(runtime, "SSLErrorWaitWritable", message);
122+
}
123+
124+
private static RaiseException newCustomSSLError(final Ruby runtime, final String name, final String message) {
125+
RubyClass errorClass = _SSL(runtime).getClass(name);
126+
if ( errorClass == null ) { // < Ruby 2.0
127+
errorClass = _SSL(runtime).getClass("SSLError"); // fallback
128+
}
129+
return Utils.newError(runtime, errorClass, message, false);
115130
}
116131

117132
static RubyModule _SSL(final Ruby runtime) {

0 commit comments

Comments
 (0)