Skip to content

Commit 558817e

Browse files
committed
Fixed SSL handling issues
This update includes: - fix for SSL being turned off in backend - fix for SSL issue with domain name check
1 parent b98b697 commit 558817e

File tree

8 files changed

+122
-69
lines changed

8 files changed

+122
-69
lines changed

driver/src/main/java/org/neo4j/driver/internal/BoltServerAddress.java

Lines changed: 50 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,17 @@
2222
import java.net.InetSocketAddress;
2323
import java.net.SocketAddress;
2424
import java.net.URI;
25+
import java.util.Arrays;
2526
import java.util.Collections;
2627
import java.util.LinkedHashSet;
2728
import java.util.Objects;
2829
import java.util.Set;
30+
import java.util.stream.Stream;
2931

3032
import org.neo4j.driver.net.ServerAddress;
3133

3234
import static java.util.Objects.requireNonNull;
35+
import static java.util.stream.Collectors.joining;
3336

3437
/**
3538
* Holds a host and port pair that denotes a Bolt server address.
@@ -39,11 +42,18 @@ public class BoltServerAddress implements ServerAddress
3942
public static final int DEFAULT_PORT = 7687;
4043
public static final BoltServerAddress LOCAL_DEFAULT = new BoltServerAddress( "localhost", DEFAULT_PORT );
4144

45+
private static final String HOST_ADDRESSES_FORMAT = "%s%s:%d";
46+
private static final int MAX_HOST_ADDRESSES_IN_STRING_VALUE = 5;
47+
private static final String BLANK_HOST_ADDRESSES = "";
48+
private static final String HOST_ADDRESS_DELIMITER = ",";
49+
private static final String HOST_ADDRESSES_PREFIX = "(";
50+
private static final String HOST_ADDRESSES_SUFFIX = ")";
51+
private static final String TRIMMED_HOST_ADDRESSES_SUFFIX = ",..." + HOST_ADDRESSES_SUFFIX;
52+
4253
private final String host; // This could either be the same as originalHost or it is an IP address resolved from the original host.
4354
private final int port;
55+
private final Set<InetAddress> resolvedAddresses;
4456
private final String stringValue;
45-
46-
private final Set<BoltServerAddress> resolved;
4757

4858
public BoltServerAddress( String address )
4959
{
@@ -57,15 +67,16 @@ public BoltServerAddress( URI uri )
5767

5868
public BoltServerAddress( String host, int port )
5969
{
60-
this( host, port, Collections.emptySet() );
70+
this( host, port, (InetAddress[]) null );
6171
}
6272

63-
public BoltServerAddress( String host, int port, Set<BoltServerAddress> resolved )
73+
public BoltServerAddress( String host, int port, InetAddress... resolvedAddressesArr )
6474
{
6575
this.host = requireNonNull( host, "host" );
6676
this.port = requireValidPort( port );
67-
this.stringValue = String.format( "%s:%d", host, port );
68-
this.resolved = Collections.unmodifiableSet( new LinkedHashSet<>( resolved ) );
77+
resolvedAddresses = Collections.unmodifiableSet(
78+
resolvedAddressesArr != null ? new LinkedHashSet<>( Arrays.asList( resolvedAddressesArr ) ) : Collections.emptySet() );
79+
stringValue = createStringValue();
6980
}
7081

7182
public static BoltServerAddress from( ServerAddress address )
@@ -86,14 +97,14 @@ public boolean equals( Object o )
8697
{
8798
return false;
8899
}
89-
BoltServerAddress that = (BoltServerAddress) o;
90-
return port == that.port && host.equals( that.host );
100+
BoltServerAddress address = (BoltServerAddress) o;
101+
return port == address.port && host.equals( address.host ) && resolvedAddresses.equals( address.resolvedAddresses );
91102
}
92103

93104
@Override
94105
public int hashCode()
95106
{
96-
return Objects.hash( host, port );
107+
return Objects.hash( host, port, resolvedAddresses );
97108
}
98109

99110
@Override
@@ -103,15 +114,18 @@ public String toString()
103114
}
104115

105116
/**
106-
* Create a {@link SocketAddress} from this bolt address. This method always attempts to resolve the hostname into
107-
* an {@link InetAddress}.
117+
* Create a {@link SocketAddress} from this bolt address. If the resolvedAddresses set is not empty, the first element is used as the address. If the set is
118+
* empty, the host value is used instead.
108119
*
109120
* @return new socket address.
110121
* @see InetSocketAddress
111122
*/
112123
public SocketAddress toSocketAddress()
113124
{
114-
return new InetSocketAddress( host, port );
125+
return resolvedAddresses.stream()
126+
.findFirst()
127+
.map( address -> new InetSocketAddress( address, port ) )
128+
.orElse( new InetSocketAddress( host, port ) );
115129
}
116130

117131
@Override
@@ -126,9 +140,31 @@ public int port()
126140
return port;
127141
}
128142

129-
public Set<BoltServerAddress> resolved()
143+
/**
144+
* Create a stream of unicast addresses. If the resolvedAddresses set is not empty, each returned address contains precisely one resolved IP address. If the
145+
* set is empty, a single address is returned using the host and port values, which is a unicast address within the context of this address.
146+
*
147+
* @return stream of unicast addresses.
148+
*/
149+
public Stream<BoltServerAddress> toUnicast()
150+
{
151+
return resolvedAddresses.isEmpty()
152+
? Stream.of( new BoltServerAddress( host, port ) )
153+
: resolvedAddresses.stream().map( address -> new BoltServerAddress( host, port, address ) );
154+
}
155+
156+
private String createStringValue()
130157
{
131-
return this.resolved;
158+
String hostAddresses = resolvedAddresses.isEmpty()
159+
? BLANK_HOST_ADDRESSES
160+
: resolvedAddresses.stream()
161+
.limit( MAX_HOST_ADDRESSES_IN_STRING_VALUE )
162+
.map( InetAddress::getHostAddress )
163+
.collect( joining( HOST_ADDRESS_DELIMITER, HOST_ADDRESSES_PREFIX,
164+
resolvedAddresses.size() > MAX_HOST_ADDRESSES_IN_STRING_VALUE
165+
? TRIMMED_HOST_ADDRESSES_SUFFIX
166+
: HOST_ADDRESSES_SUFFIX ) );
167+
return String.format( HOST_ADDRESSES_FORMAT, host, hostAddresses, port );
132168
}
133169

134170
private static String hostFrom( URI uri )

driver/src/main/java/org/neo4j/driver/internal/cluster/RediscoveryImpl.java

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,18 +21,15 @@
2121
import io.netty.util.concurrent.EventExecutorGroup;
2222

2323
import java.net.UnknownHostException;
24-
import java.util.Arrays;
2524
import java.util.Collection;
2625
import java.util.HashSet;
27-
import java.util.LinkedHashSet;
2826
import java.util.LinkedList;
2927
import java.util.List;
3028
import java.util.Set;
3129
import java.util.concurrent.CompletableFuture;
3230
import java.util.concurrent.CompletionException;
3331
import java.util.concurrent.CompletionStage;
3432
import java.util.concurrent.TimeUnit;
35-
import java.util.stream.Collectors;
3633

3734
import org.neo4j.driver.Bookmark;
3835
import org.neo4j.driver.Logger;
@@ -308,7 +305,7 @@ public List<BoltServerAddress> resolve() throws UnknownHostException
308305
{
309306
try
310307
{
311-
resolvedAddresses.addAll( resolveAllByDomainName( BoltServerAddress.from( serverAddress ) ) );
308+
resolveAllByDomainName( serverAddress ).toUnicast().forEach( resolvedAddresses::add );
312309
}
313310
catch ( UnknownHostException e )
314311
{
@@ -345,9 +342,9 @@ private BoltServerAddress resolveByDomainNameOrThrowCompletionException( BoltSer
345342
{
346343
try
347344
{
348-
Set<BoltServerAddress> resolvedAddresses = resolveAllByDomainName( address );
349-
routingTable.replaceRouterIfPresent( address, new BoltServerAddress( address.host(), address.port(), resolvedAddresses ) );
350-
return resolvedAddresses.stream().findFirst().orElseThrow(
345+
BoltServerAddress resolvedAddress = resolveAllByDomainName( address );
346+
routingTable.replaceRouterIfPresent( address, resolvedAddress );
347+
return resolvedAddress.toUnicast().findFirst().orElseThrow(
351348
() -> new IllegalStateException( "Domain name resolution returned empty result set and has not thrown an exception" ) );
352349
}
353350
catch ( Throwable e )
@@ -356,10 +353,8 @@ private BoltServerAddress resolveByDomainNameOrThrowCompletionException( BoltSer
356353
}
357354
}
358355

359-
private Set<BoltServerAddress> resolveAllByDomainName( BoltServerAddress address ) throws UnknownHostException
356+
private BoltServerAddress resolveAllByDomainName( ServerAddress address ) throws UnknownHostException
360357
{
361-
return Arrays.stream( domainNameResolver.resolve( address.host() ) )
362-
.map( inetAddress -> new BoltServerAddress( inetAddress.getHostAddress(), address.port() ) )
363-
.collect( Collectors.toCollection( LinkedHashSet::new ) );
358+
return new BoltServerAddress( address.host(), address.port(), domainNameResolver.resolve( address.host() ) );
364359
}
365360
}

driver/src/main/java/org/neo4j/driver/internal/cluster/RoutingTableHandlerImpl.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -116,11 +116,9 @@ private synchronized void freshClusterCompositionFetched( ClusterCompositionLook
116116
routingTableRegistry.removeAged();
117117

118118
Set<BoltServerAddress> addressesToRetain = new LinkedHashSet<>();
119-
for ( BoltServerAddress address : routingTableRegistry.allServers() )
120-
{
121-
addressesToRetain.add( address );
122-
addressesToRetain.addAll( address.resolved() );
123-
}
119+
routingTableRegistry.allServers().stream()
120+
.flatMap( BoltServerAddress::toUnicast )
121+
.forEach( addressesToRetain::add );
124122
composition.getResolvedInitialRouters().ifPresent(
125123
addresses ->
126124
{

0 commit comments

Comments
 (0)