Skip to content

Commit 8376aaa

Browse files
committed
fix java.version detection (hopefully for good) -> tuning old way
Partially reverts commit f86bc0b. ... reverting since this didn't handle non-digits safely
1 parent 21eb5e3 commit 8376aaa

File tree

3 files changed

+209
-80
lines changed

3 files changed

+209
-80
lines changed

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

Lines changed: 28 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
* The MIT License
33
*
44
* Copyright (c) 2014 Karol Bucek LTD.
5-
* Copyright (c) 2017 Ketan Padegaonkar
65
*
76
* Permission is hereby granted, free of charge, to any person obtaining a copy
87
* of this software and associated documentation files (the "Software"), to deal
@@ -24,6 +23,10 @@
2423
*/
2524
package org.jruby.ext.openssl;
2625

26+
import java.security.NoSuchProviderException;
27+
import java.security.SecureRandom;
28+
import java.util.Map;
29+
2730
import org.jruby.*;
2831
import org.jruby.anno.JRubyMethod;
2932
import org.jruby.anno.JRubyModule;
@@ -33,10 +36,6 @@
3336
import org.jruby.util.ByteList;
3437
import org.jruby.util.SafePropertyAccessor;
3538

36-
import java.security.NoSuchProviderException;
37-
import java.security.SecureRandom;
38-
import java.util.Map;
39-
4039
/**
4140
* OpenSSL (methods as well as an entry point)
4241
*
@@ -244,26 +243,40 @@ static void warn(final ThreadContext context, final IRubyObject msg) {
244243
if ( warn ) context.runtime.getModule("OpenSSL").callMethod(context, "warn", msg);
245244
}
246245

247-
public static String javaVersion(final String def) {
248-
final String javaVersionProperty =
249-
SafePropertyAccessor.getProperty("java.version", def);
250-
if ("0".equals(javaVersionProperty)) return "1.7.0"; // Android
251-
return javaVersionProperty;
246+
private static String javaVersion(final String def, final int len) {
247+
String javaVersion = SafePropertyAccessor.getProperty("java.version", def);
248+
if ( "0".equals(javaVersion) ) javaVersion = "1.7.0"; // Android
249+
return javaVersion.length() > len && len > -1 ? javaVersion.substring(0, len) : javaVersion;
252250
}
253251

254252
static boolean javaVersion7(final boolean atLeast) {
255-
final int gt = new Version("1.7").compareTo(new Version(javaVersion("0.0")));
253+
final int gt = "1.7".compareTo( javaVersion("0.0", 3) );
256254
return atLeast ? gt <= 0 : gt == 0;
257255
}
258256

259257
static boolean javaVersion8(final boolean atLeast) {
260-
final int gt = new Version("1.8").compareTo(new Version(javaVersion("0.0")));
258+
final int gt = "1.8".compareTo( javaVersion("0.0", 3) );
261259
return atLeast ? gt <= 0 : gt == 0;
262260
}
263261

264-
static boolean javaVersion9(final boolean atLeast) {
265-
final int gt = new Version("9").compareTo(new Version(javaVersion("0.0")));
266-
return atLeast ? gt <= 0 : gt == 0;
262+
public static boolean javaVersion9(final boolean atLeast) {
263+
final int major = parseIntDot( javaVersion("0", -1) );
264+
return atLeast ? major >= 9 : major == 9;
265+
}
266+
267+
static boolean javaVersion10(final boolean atLeast) {
268+
final int major = parseIntDot( javaVersion("0", -1) );
269+
return atLeast ? major >= 10 : major == 10;
270+
}
271+
272+
private static int parseIntDot(String version) {
273+
String[] parts = version.split("[-_]")[0].split("\\.");
274+
try {
275+
return Integer.parseInt(parts[0]);
276+
}
277+
catch (NumberFormatException ex) {
278+
return -1;
279+
}
267280
}
268281

269282
private static String javaName(final String def) {
@@ -334,29 +347,4 @@ static String bcExceptionMessage(NoClassDefFoundError ex) {
334347
return "You need to configure JVM/classpath to enable BouncyCastle Security Provider: " + ex;
335348
}
336349

337-
static class Version implements Comparable<Version> {
338-
public final int[] numbers;
339-
340-
public Version(String version) {
341-
final String split[] = version.split("[-_]")[0].split("\\.");
342-
numbers = new int[split.length];
343-
for (int i = 0; i < split.length; i++) {
344-
numbers[i] = Integer.valueOf(split[i]);
345-
}
346-
}
347-
348-
@Override
349-
public int compareTo(Version another) {
350-
final int maxLength = Math.max(numbers.length, another.numbers.length);
351-
for (int i = 0; i < maxLength; i++) {
352-
final int left = i < numbers.length ? numbers[i] : 0;
353-
final int right = i < another.numbers.length ? another.numbers[i] : 0;
354-
if (left != right) {
355-
return left < right ? -1 : 1;
356-
}
357-
}
358-
return 0;
359-
}
360-
}
361-
362350
}

src/main/java/org/jruby/ext/openssl/util/CryptoSecurity.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ public static Boolean setAllPermissionPolicy() {
9898

9999
public static Boolean unrestrictSecurity() {
100100
if ( ! OpenSSL.javaHotSpot() ) return false;
101-
if ( javaVersion9() ) {
101+
if ( OpenSSL.javaVersion9(true) ) {
102102
return unrestrictJceSecurity9();
103103
}
104104
return unrestrictJceSecurity8();
@@ -148,9 +148,4 @@ static Boolean unrestrictJceSecurity8() {
148148
}
149149
}
150150

151-
private static boolean javaVersion9() {
152-
final int gt = "1.8".compareTo( OpenSSL.javaVersion("0.0").substring(0, 3) );
153-
return gt <= 0;
154-
}
155-
156151
}

src/test/java/org/jruby/ext/openssl/VersionTest.java

Lines changed: 180 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -25,51 +25,197 @@
2525
package org.jruby.ext.openssl;
2626

2727
import org.junit.Test;
28+
import org.junit.After;
2829

29-
import static org.hamcrest.CoreMatchers.is;
30-
import static org.junit.Assert.assertThat;
30+
import static org.junit.Assert.assertFalse;
31+
import static org.junit.Assert.assertTrue;
32+
33+
import static org.jruby.ext.openssl.OpenSSL.*;
3134

3235
public class VersionTest {
33-
@Test
34-
public void newInstance_withTwoDotRelease_isParsedCorrectly() {
35-
final OpenSSL.Version version = new OpenSSL.Version("1.8.1");
36-
assertThat(version.numbers, is(new int[] { 1, 8, 1 }));
37-
}
3836

39-
@Test
40-
public void newInstance_withTwoDotReleaseAndPreReleaseName_isParsedCorrectly() {
41-
assertThat(new OpenSSL.Version("1.8.1-EA").numbers, is(new int[] { 1, 8, 1 }));
42-
assertThat(new OpenSSL.Version("1.7.0_79").numbers, is(new int[] { 1, 7, 0 }));
43-
}
37+
private final String javaVersion = System.getProperty("java.version");
4438

45-
@Test
46-
public void compareTo_withEarlierVersion_isGreaterThan() {
47-
assertThat(new OpenSSL.Version("1.8").compareTo(new OpenSSL.Version("1.7")), is(1));
48-
}
39+
@After
40+
public void restoreJavaVersion() {
41+
System.setProperty("java.version", javaVersion);
42+
}
4943

50-
@Test
51-
public void compareTo_withSameVersion_isEqual() {
52-
assertThat(new OpenSSL.Version("1.8").compareTo(new OpenSSL.Version("1.8")), is(0));
53-
}
44+
@Test
45+
public void testAndroid0() {
46+
System.setProperty("java.version", "0");
5447

55-
@Test
56-
public void compareTo_withLaterVersion_isLessThan() {
57-
assertThat(new OpenSSL.Version("1.7").compareTo(new OpenSSL.Version("1.8")), is(-1));
58-
}
48+
assertTrue(javaVersion7(true));
49+
assertTrue(javaVersion7(false));
5950

60-
@Test
61-
public void compareTo_withMorePreciseSameVersion_isFalse() {
62-
assertThat(new OpenSSL.Version("9").compareTo(new OpenSSL.Version("9.0")), is(0));
63-
}
51+
assertFalse(javaVersion8(true));
52+
assertFalse(javaVersion8(false));
6453

65-
@Test
66-
public void compareTo_withMorePreciseEarlierVersion_isFalse() {
67-
assertThat(new OpenSSL.Version("9").compareTo(new OpenSSL.Version("1.7")), is(1));
68-
}
54+
assertFalse(javaVersion9(false));
55+
assertFalse(javaVersion9(true));
56+
}
57+
58+
@Test
59+
public void testInvalid() {
60+
System.setProperty("java.version", "");
61+
62+
//assertTrue(javaVersion7(true));
63+
//assertTrue(javaVersion7(false));
64+
65+
assertFalse(javaVersion8(true));
66+
assertFalse(javaVersion8(false));
67+
68+
assertFalse(javaVersion9(false));
69+
assertFalse(javaVersion9(true));
70+
}
71+
72+
@Test
73+
public void testJava7() {
74+
System.setProperty("java.version", "1.7.0");
75+
76+
assertTrue(javaVersion7(true));
77+
assertTrue(javaVersion7(false));
78+
79+
assertFalse(javaVersion8(true));
80+
assertFalse(javaVersion8(false));
81+
82+
assertFalse(javaVersion9(false));
83+
assertFalse(javaVersion9(true));
84+
}
6985

7086
@Test
71-
public void compareTo_withMorePreciseLaterVersion_isLessThan() {
72-
assertThat(new OpenSSL.Version("1").compareTo(new OpenSSL.Version("1.0.1")), is(-1));
87+
public void testJava8() {
88+
System.setProperty("java.version", "1.8.1");
89+
90+
assertTrue(javaVersion7(true));
91+
assertFalse(javaVersion7(false));
92+
93+
assertTrue(javaVersion8(true));
94+
assertTrue(javaVersion8(false));
95+
96+
assertFalse(javaVersion9(false));
97+
assertFalse(javaVersion9(true));
7398
}
7499

100+
@Test
101+
public void testJava8Crap() {
102+
System.setProperty("java.version", "1.8.PRE");
103+
104+
assertTrue(javaVersion7(true));
105+
assertFalse(javaVersion7(false));
106+
107+
assertTrue(javaVersion8(true));
108+
assertTrue(javaVersion8(false));
109+
110+
assertFalse(javaVersion9(false));
111+
assertFalse(javaVersion9(true));
112+
}
113+
114+
@Test
115+
public void testJava9Pre() {
116+
System.setProperty("java.version", "9");
117+
118+
assertTrue(javaVersion7(true));
119+
assertFalse(javaVersion7(false));
120+
121+
assertTrue(javaVersion8(true));
122+
assertFalse(javaVersion8(false));
123+
124+
assertTrue(javaVersion9(false));
125+
assertTrue(javaVersion9(true));
126+
}
127+
128+
@Test
129+
public void testJava9Noiz() {
130+
System.setProperty("java.version", "9-alfa");
131+
132+
assertTrue(javaVersion7(true));
133+
assertFalse(javaVersion7(false));
134+
135+
assertTrue(javaVersion8(true));
136+
assertFalse(javaVersion8(false));
137+
138+
assertTrue(javaVersion9(false));
139+
assertTrue(javaVersion9(true));
140+
}
141+
142+
@Test
143+
public void testJava9Bleh() {
144+
System.setProperty("java.version", "9.X");
145+
146+
assertTrue(javaVersion7(true));
147+
assertFalse(javaVersion7(false));
148+
149+
assertTrue(javaVersion8(true));
150+
assertFalse(javaVersion8(false));
151+
152+
assertTrue(javaVersion9(false));
153+
assertTrue(javaVersion9(true));
154+
}
155+
156+
@Test
157+
public void testJava9() {
158+
System.setProperty("java.version", "9.0.4");
159+
160+
assertTrue(javaVersion7(true));
161+
assertFalse(javaVersion7(false));
162+
163+
assertTrue(javaVersion8(true));
164+
assertFalse(javaVersion8(false));
165+
166+
assertTrue(javaVersion9(false));
167+
assertTrue(javaVersion9(true));
168+
}
169+
170+
@Test
171+
public void testJava10Pre() {
172+
System.setProperty("java.version", "10");
173+
174+
assertTrue(javaVersion7(true));
175+
assertFalse(javaVersion7(false));
176+
177+
assertTrue(javaVersion8(true));
178+
assertFalse(javaVersion8(false));
179+
180+
assertFalse(javaVersion9(false));
181+
assertTrue(javaVersion9(true));
182+
183+
assertTrue(javaVersion10(false));
184+
assertTrue(javaVersion10(true));
185+
}
186+
187+
@Test
188+
public void testJava10Noiz() {
189+
System.setProperty("java.version", "10-RC");
190+
191+
assertTrue(javaVersion7(true));
192+
assertFalse(javaVersion7(false));
193+
194+
assertTrue(javaVersion8(true));
195+
assertFalse(javaVersion8(false));
196+
197+
assertFalse(javaVersion9(false));
198+
assertTrue(javaVersion9(true));
199+
200+
assertTrue(javaVersion10(false));
201+
assertTrue(javaVersion10(true));
202+
}
203+
204+
@Test
205+
public void testJava10() {
206+
System.setProperty("java.version", "10.0");
207+
208+
assertTrue(javaVersion7(true));
209+
assertFalse(javaVersion7(false));
210+
211+
assertTrue(javaVersion8(true));
212+
assertFalse(javaVersion8(false));
213+
214+
assertFalse(javaVersion9(false));
215+
assertTrue(javaVersion9(true));
216+
217+
assertTrue(javaVersion10(false));
218+
assertTrue(javaVersion10(true));
219+
}
220+
75221
}

0 commit comments

Comments
 (0)