Skip to content

Commit 3e7e3fc

Browse files
committed
Move hostname verification compatibility code for Android API < 24 to 1 place
1 parent a975a62 commit 3e7e3fc

3 files changed

Lines changed: 17 additions & 20 deletions

File tree

src/main/java/com/hivemq/client/internal/mqtt/MqttClientSslConfigImpl.java

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@
2121
import org.jetbrains.annotations.NotNull;
2222
import org.jetbrains.annotations.Nullable;
2323

24-
import javax.net.ssl.*;
24+
import javax.net.ssl.HostnameVerifier;
25+
import javax.net.ssl.KeyManagerFactory;
26+
import javax.net.ssl.TrustManagerFactory;
2527
import java.util.List;
2628
import java.util.Objects;
2729
import java.util.Optional;
@@ -32,21 +34,8 @@
3234
*/
3335
public class MqttClientSslConfigImpl implements MqttClientSslConfig {
3436

35-
static final @Nullable HostnameVerifier DEFAULT_HOSTNAME_VERIFIER;
36-
37-
static {
38-
HostnameVerifier hostnameVerifier = null;
39-
try {
40-
new SSLParameters().setEndpointIdentificationAlgorithm("HTTPS");
41-
} catch (final NoSuchMethodError e) { // Android API < 24 compatibility
42-
hostnameVerifier = HttpsURLConnection.getDefaultHostnameVerifier();
43-
}
44-
DEFAULT_HOSTNAME_VERIFIER = hostnameVerifier;
45-
}
46-
4737
static final @NotNull MqttClientSslConfigImpl DEFAULT =
48-
new MqttClientSslConfigImpl(null, null, null, null, (int) DEFAULT_HANDSHAKE_TIMEOUT_MS,
49-
DEFAULT_HOSTNAME_VERIFIER);
38+
new MqttClientSslConfigImpl(null, null, null, null, (int) DEFAULT_HANDSHAKE_TIMEOUT_MS, null);
5039

5140
private final @Nullable KeyManagerFactory keyManagerFactory;
5241
private final @Nullable TrustManagerFactory trustManagerFactory;

src/main/java/com/hivemq/client/internal/mqtt/MqttClientSslConfigImplBuilder.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public abstract class MqttClientSslConfigImplBuilder<B extends MqttClientSslConf
3939
private @Nullable ImmutableList<String> cipherSuites;
4040
private @Nullable ImmutableList<String> protocols;
4141
private int handshakeTimeoutMs = (int) MqttClientSslConfigImpl.DEFAULT_HANDSHAKE_TIMEOUT_MS;
42-
private @Nullable HostnameVerifier hostnameVerifier = MqttClientSslConfigImpl.DEFAULT_HOSTNAME_VERIFIER;
42+
private @Nullable HostnameVerifier hostnameVerifier;
4343

4444
MqttClientSslConfigImplBuilder() {}
4545

@@ -84,8 +84,7 @@ public abstract class MqttClientSslConfigImplBuilder<B extends MqttClientSslConf
8484
}
8585

8686
public @NotNull B hostnameVerifier(final @Nullable HostnameVerifier hostnameVerifier) {
87-
this.hostnameVerifier =
88-
(hostnameVerifier == null) ? MqttClientSslConfigImpl.DEFAULT_HOSTNAME_VERIFIER : hostnameVerifier;
87+
this.hostnameVerifier = hostnameVerifier;
8988
return self();
9089
}
9190

src/main/java/com/hivemq/client/internal/mqtt/handler/ssl/MqttSslInitializer.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.jetbrains.annotations.NotNull;
2828

2929
import javax.net.ssl.HostnameVerifier;
30+
import javax.net.ssl.HttpsURLConnection;
3031
import javax.net.ssl.SSLException;
3132
import javax.net.ssl.SSLParameters;
3233
import java.net.InetSocketAddress;
@@ -71,10 +72,18 @@ public static void initChannel(
7172
Netty treats Android (all versions) as Java 6, so SSLParameters.setEndpointIdentificationAlgorithm is not called on Android with netty 4.1.
7273
So SSLParameters.setEndpointIdentificationAlgorithm still needs to be called here.
7374
*/
74-
final HostnameVerifier hostnameVerifier = sslConfig.getRawHostnameVerifier();
75+
HostnameVerifier hostnameVerifier = sslConfig.getRawHostnameVerifier();
7576
if (hostnameVerifier == null) {
7677
final SSLParameters sslParameters = sslHandler.engine().getSSLParameters();
77-
sslParameters.setEndpointIdentificationAlgorithm("HTTPS");
78+
try {
79+
sslParameters.setEndpointIdentificationAlgorithm("HTTPS");
80+
} catch (final NoSuchMethodError e) {
81+
/*
82+
On Android API < 24 SSLParameters.setEndpointIdentificationAlgorithm is not available
83+
The HttpsURLConnection.getDefaultHostnameVerifier performs HTTPS hostname verification on Android
84+
*/
85+
hostnameVerifier = HttpsURLConnection.getDefaultHostnameVerifier();
86+
}
7887
sslHandler.engine().setSSLParameters(sslParameters);
7988
}
8089

0 commit comments

Comments
 (0)