Skip to content

Commit e630593

Browse files
committedMar 27, 2024·
Specify a locale for upper/lower case conversions
None of these conversions should use the arbitrary system locale. Error Prone will help prevent these getting introduced in the future. Fixes #10372
1 parent 37263b7 commit e630593

File tree

12 files changed

+48
-26
lines changed

12 files changed

+48
-26
lines changed
 

‎authz/src/main/java/io/grpc/authz/AuthorizationPolicyTranslator.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import java.util.ArrayList;
3434
import java.util.LinkedHashMap;
3535
import java.util.List;
36+
import java.util.Locale;
3637
import java.util.Map;
3738

3839
/**
@@ -77,7 +78,7 @@ private static Permission parseHeader(Map<String, ?> header) throws IllegalArgum
7778
}
7879
if (key.charAt(0) == ':'
7980
|| key.startsWith("grpc-")
80-
|| UNSUPPORTED_HEADERS.contains(key.toLowerCase())) {
81+
|| UNSUPPORTED_HEADERS.contains(key.toLowerCase(Locale.ROOT))) {
8182
throw new IllegalArgumentException(String.format("Unsupported \"key\" %s", key));
8283
}
8384
List<String> valuesList = JsonUtil.getListOfStrings(header, "values");

‎benchmarks/src/main/java/io/grpc/benchmarks/Transport.java

+8-1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
package io.grpc.benchmarks;
1818

19+
import java.util.Locale;
20+
1921
/**
2022
* All of the supported transports.
2123
*/
@@ -64,11 +66,16 @@ public static String getDescriptionString() {
6466
if (!first) {
6567
builder.append("\n");
6668
}
67-
builder.append(transport.name().toLowerCase());
69+
builder.append(transport);
6870
builder.append(": ");
6971
builder.append(transport.description);
7072
first = false;
7173
}
7274
return builder.toString();
7375
}
76+
77+
@Override
78+
public String toString() {
79+
return name().toLowerCase(Locale.ROOT);
80+
}
7481
}

‎benchmarks/src/main/java/io/grpc/benchmarks/qps/ClientConfiguration.java

+5-4
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import java.util.Collection;
3232
import java.util.Collections;
3333
import java.util.LinkedHashSet;
34+
import java.util.Locale;
3435
import java.util.Set;
3536

3637
/**
@@ -102,7 +103,7 @@ protected ClientConfiguration build0(ClientConfiguration config) {
102103
if (config.tls) {
103104
if (!config.transport.tlsSupported) {
104105
throw new IllegalArgumentException(
105-
"Transport " + config.transport.name().toLowerCase() + " does not support TLS.");
106+
"Transport " + config.transport + " does not support TLS.");
106107
}
107108
}
108109

@@ -166,10 +167,10 @@ protected void setClientValue(ClientConfiguration config, String value) {
166167
config.testca = parseBoolean(value);
167168
}
168169
},
169-
TRANSPORT("STR", Transport.getDescriptionString(), DEFAULT.transport.name().toLowerCase()) {
170+
TRANSPORT("STR", Transport.getDescriptionString(), DEFAULT.transport.toString()) {
170171
@Override
171172
protected void setClientValue(ClientConfiguration config, String value) {
172-
config.transport = Transport.valueOf(value.toUpperCase());
173+
config.transport = Transport.valueOf(value.toUpperCase(Locale.ROOT));
173174
}
174175
},
175176
DURATION("SECONDS", "Duration of the benchmark.", "" + DEFAULT.duration) {
@@ -236,7 +237,7 @@ protected void setClientValue(ClientConfiguration config, String value) {
236237

237238
@Override
238239
public String getName() {
239-
return name().toLowerCase();
240+
return name().toLowerCase(Locale.ROOT);
240241
}
241242

242243
@Override

‎benchmarks/src/main/java/io/grpc/benchmarks/qps/ServerConfiguration.java

+11-5
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import java.util.Collection;
3030
import java.util.Collections;
3131
import java.util.List;
32+
import java.util.Locale;
3233

3334
/**
3435
* Configuration options for benchmark servers.
@@ -69,7 +70,7 @@ protected Collection<Param> getParams() {
6970
protected ServerConfiguration build0(ServerConfiguration config) {
7071
if (config.tls && !config.transport.tlsSupported) {
7172
throw new IllegalArgumentException(
72-
"TLS unsupported with the " + config.transport.name().toLowerCase() + " transport");
73+
"TLS unsupported with the " + config.transport + " transport");
7374
}
7475

7576
// Verify that the address type is correct for the transport type.
@@ -109,6 +110,11 @@ public enum Transport {
109110
this.socketAddressValidator = socketAddressValidator;
110111
}
111112

113+
@Override
114+
public String toString() {
115+
return name().toLowerCase(Locale.ROOT);
116+
}
117+
112118
/**
113119
* Validates the given address for this transport.
114120
*
@@ -128,7 +134,7 @@ static String getDescriptionString() {
128134
if (!first) {
129135
builder.append("\n");
130136
}
131-
builder.append(transport.name().toLowerCase());
137+
builder.append(transport);
132138
builder.append(": ");
133139
builder.append(transport.description);
134140
first = false;
@@ -158,10 +164,10 @@ protected void setServerValue(ServerConfiguration config, String value) {
158164
config.tls = parseBoolean(value);
159165
}
160166
},
161-
TRANSPORT("STR", Transport.getDescriptionString(), DEFAULT.transport.name().toLowerCase()) {
167+
TRANSPORT("STR", Transport.getDescriptionString(), DEFAULT.transport.toString()) {
162168
@Override
163169
protected void setServerValue(ServerConfiguration config, String value) {
164-
config.transport = Transport.valueOf(value.toUpperCase());
170+
config.transport = Transport.valueOf(value.toUpperCase(Locale.ROOT));
165171
}
166172
},
167173
DIRECTEXECUTOR("", "Don't use a threadpool for RPC calls, instead execute calls directly "
@@ -197,7 +203,7 @@ protected void setServerValue(ServerConfiguration config, String value) {
197203

198204
@Override
199205
public String getName() {
200-
return name().toLowerCase();
206+
return name().toLowerCase(Locale.ROOT);
201207
}
202208

203209
@Override

‎build.gradle

-5
Original file line numberDiff line numberDiff line change
@@ -253,11 +253,6 @@ subprojects {
253253
options.errorprone.check("JavaUtilDate", CheckSeverity.OFF)
254254
// The warning fails to provide a source location
255255
options.errorprone.check("MissingSummary", CheckSeverity.OFF)
256-
257-
// TODO(https://github.com/grpc/grpc-java/issues/10372): remove when fixed.
258-
if (JavaVersion.current().isJava11Compatible()) {
259-
options.errorprone.check("StringCaseLocaleUsage", CheckSeverity.OFF)
260-
}
261256
}
262257
tasks.named("compileTestJava").configure {
263258
// LinkedList doesn't hurt much in tests and has lots of usages

‎interop-testing/src/main/java/io/grpc/testing/integration/Http2TestCases.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package io.grpc.testing.integration;
1818

1919
import com.google.common.base.Preconditions;
20+
import java.util.Locale;
2021

2122
/**
2223
* Enum of HTTP/2 interop test cases.
@@ -49,7 +50,7 @@ public String description() {
4950
public static Http2TestCases fromString(String s) {
5051
Preconditions.checkNotNull(s, "s");
5152
try {
52-
return Http2TestCases.valueOf(s.toUpperCase());
53+
return Http2TestCases.valueOf(s.toUpperCase(Locale.ROOT));
5354
} catch (IllegalArgumentException ex) {
5455
throw new IllegalArgumentException("Invalid test case: " + s);
5556
}

‎interop-testing/src/main/java/io/grpc/testing/integration/StressTestClient.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -434,7 +434,7 @@ private static String serverAddressesToString(List<InetSocketAddress> addresses)
434434
private static String validTestCasesHelpText() {
435435
StringBuilder builder = new StringBuilder();
436436
for (TestCases testCase : TestCases.values()) {
437-
String strTestcase = testCase.name().toLowerCase();
437+
String strTestcase = testCase.toString();
438438
builder.append("\n ")
439439
.append(strTestcase)
440440
.append(": ")

‎interop-testing/src/main/java/io/grpc/testing/integration/TestCases.java

+7-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package io.grpc.testing.integration;
1818

1919
import com.google.common.base.Preconditions;
20+
import java.util.Locale;
2021

2122
/**
2223
* Enum of interop test cases.
@@ -79,6 +80,11 @@ public String description() {
7980
*/
8081
public static TestCases fromString(String s) {
8182
Preconditions.checkNotNull(s, "s");
82-
return TestCases.valueOf(s.toUpperCase());
83+
return TestCases.valueOf(s.toUpperCase(Locale.ROOT));
84+
}
85+
86+
@Override
87+
public String toString() {
88+
return name().toLowerCase(Locale.ROOT);
8389
}
8490
}

‎interop-testing/src/main/java/io/grpc/testing/integration/TestServiceClient.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -697,7 +697,7 @@ protected int operationTimeoutMillis() {
697697
private static String validTestCasesHelpText() {
698698
StringBuilder builder = new StringBuilder();
699699
for (TestCases testCase : TestCases.values()) {
700-
String strTestcase = testCase.name().toLowerCase();
700+
String strTestcase = testCase.toString();
701701
builder.append("\n ")
702702
.append(strTestcase)
703703
.append(": ")

‎xds/src/main/java/io/grpc/xds/XdsClusterResource.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ private static StructOrError<CdsUpdate.Builder> parseNonAggregateCluster(
257257
edsServiceName = edsClusterConfig.getServiceName();
258258
}
259259
// edsServiceName is required if the CDS resource has an xdstp name.
260-
if ((edsServiceName == null) && clusterName.toLowerCase().startsWith("xdstp:")) {
260+
if ((edsServiceName == null) && clusterName.toLowerCase(Locale.ROOT).startsWith("xdstp:")) {
261261
return StructOrError.fromError(
262262
"EDS service_name must be set when Cluster resource has an xdstp name");
263263
}

‎xds/src/main/java/io/grpc/xds/internal/Matchers.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import com.google.re2j.Pattern;
2323
import java.math.BigInteger;
2424
import java.net.InetAddress;
25+
import java.util.Locale;
2526
import javax.annotation.Nullable;
2627

2728
/**
@@ -273,11 +274,11 @@ public boolean matches(String args) {
273274
: exact().equals(args);
274275
} else if (prefix() != null) {
275276
return ignoreCase()
276-
? args.toLowerCase().startsWith(prefix().toLowerCase())
277+
? args.toLowerCase(Locale.ROOT).startsWith(prefix().toLowerCase(Locale.ROOT))
277278
: args.startsWith(prefix());
278279
} else if (suffix() != null) {
279280
return ignoreCase()
280-
? args.toLowerCase().endsWith(suffix().toLowerCase())
281+
? args.toLowerCase(Locale.ROOT).endsWith(suffix().toLowerCase(Locale.ROOT))
281282
: args.endsWith(suffix());
282283
} else if (contains() != null) {
283284
return args.contains(contains());

‎xds/src/main/java/io/grpc/xds/internal/security/trust/XdsX509TrustManager.java

+7-3
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import java.security.cert.X509Certificate;
3131
import java.util.Collection;
3232
import java.util.List;
33+
import java.util.Locale;
3334
import javax.annotation.Nullable;
3435
import javax.net.ssl.SSLEngine;
3536
import javax.net.ssl.SSLParameters;
@@ -97,7 +98,8 @@ private static boolean verifyDnsNamePrefix(
9798
return false;
9899
}
99100
return ignoreCase
100-
? altNameFromCert.toLowerCase().startsWith(sanToVerifyPrefix.toLowerCase())
101+
? altNameFromCert.toLowerCase(Locale.ROOT).startsWith(
102+
sanToVerifyPrefix.toLowerCase(Locale.ROOT))
101103
: altNameFromCert.startsWith(sanToVerifyPrefix);
102104
}
103105

@@ -107,7 +109,8 @@ private static boolean verifyDnsNameSuffix(
107109
return false;
108110
}
109111
return ignoreCase
110-
? altNameFromCert.toLowerCase().endsWith(sanToVerifySuffix.toLowerCase())
112+
? altNameFromCert.toLowerCase(Locale.ROOT).endsWith(
113+
sanToVerifySuffix.toLowerCase(Locale.ROOT))
111114
: altNameFromCert.endsWith(sanToVerifySuffix);
112115
}
113116

@@ -117,7 +120,8 @@ private static boolean verifyDnsNameContains(
117120
return false;
118121
}
119122
return ignoreCase
120-
? altNameFromCert.toLowerCase().contains(sanToVerifySubstring.toLowerCase())
123+
? altNameFromCert.toLowerCase(Locale.ROOT).contains(
124+
sanToVerifySubstring.toLowerCase(Locale.ROOT))
121125
: altNameFromCert.contains(sanToVerifySubstring);
122126
}
123127

0 commit comments

Comments
 (0)
Please sign in to comment.