Skip to content

Commit d3d15cd

Browse files
committed
Fix authentication propagation bug when working in clusters
1 parent 307e3a7 commit d3d15cd

File tree

7 files changed

+21
-13
lines changed

7 files changed

+21
-13
lines changed

src/Bolt/BoltConnectionPool.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
use function explode;
1919
use const FILTER_VALIDATE_IP;
2020
use function filter_var;
21+
use Laudis\Neo4j\Contracts\AuthenticateInterface;
2122
use Laudis\Neo4j\Contracts\ConnectionPoolInterface;
2223
use Laudis\Neo4j\Enum\AccessMode;
2324
use Psr\Http\Message\UriInterface;
@@ -31,7 +32,7 @@ final class BoltConnectionPool implements ConnectionPoolInterface
3132
/**
3233
* @throws Exception
3334
*/
34-
public function acquire(UriInterface $uri, AccessMode $mode): StreamSocket
35+
public function acquire(UriInterface $uri, AccessMode $mode, AuthenticateInterface $authenticate): StreamSocket
3536
{
3637
$host = $uri->getHost();
3738
$socket = new StreamSocket($host, $uri->getPort() ?? 7687);

src/Bolt/Session.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ public function transaction(callable $tsxHandler, ?TransactionConfiguration $con
110110
public function beginTransaction(?iterable $statements = null, ?TransactionConfiguration $config = null): UnmanagedTransactionInterface
111111
{
112112
try {
113-
$bolt = new Bolt($this->pool->acquire($this->uri, $this->config->getAccessMode()));
113+
$bolt = new Bolt($this->pool->acquire($this->uri, $this->config->getAccessMode(), $this->auth));
114114
$this->auth->authenticateBolt($bolt, $this->uri, $this->userAgent);
115115

116116
$begin = $bolt->begin(['db' => $this->config->getDatabase()]);

src/Contracts/ConnectionPoolInterface.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,5 +24,5 @@ interface ConnectionPoolInterface
2424
/**
2525
* @return T
2626
*/
27-
public function acquire(UriInterface $uri, AccessMode $mode);
27+
public function acquire(UriInterface $uri, AccessMode $mode, AuthenticateInterface $authenticate);
2828
}

src/Http/HttpConnectionPool.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
namespace Laudis\Neo4j\Http;
1515

16+
use Laudis\Neo4j\Contracts\AuthenticateInterface;
1617
use Laudis\Neo4j\Contracts\ConnectionPoolInterface;
1718
use Laudis\Neo4j\Enum\AccessMode;
1819
use Psr\Http\Client\ClientInterface;
@@ -30,7 +31,7 @@ public function __construct(ClientInterface $client)
3031
$this->client = $client;
3132
}
3233

33-
public function acquire(UriInterface $uri, AccessMode $mode): ClientInterface
34+
public function acquire(UriInterface $uri, AccessMode $mode, AuthenticateInterface $authenticate): ClientInterface
3435
{
3536
return $this->client;
3637
}

src/Http/HttpDriver.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,8 @@ public function createSession(?SessionConfiguration $config = null): SessionInte
144144
$config,
145145
$this->formatter,
146146
$factory,
147-
$this->transactionUrl
147+
$this->transactionUrl,
148+
$this->auth
148149
);
149150
}
150151

src/Http/HttpSession.php

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
use JsonException;
1717
use Laudis\Neo4j\Common\TransactionHelper;
18+
use Laudis\Neo4j\Contracts\AuthenticateInterface;
1819
use Laudis\Neo4j\Contracts\FormatterInterface;
1920
use Laudis\Neo4j\Contracts\SessionInterface;
2021
use Laudis\Neo4j\Contracts\UnmanagedTransactionInterface;
@@ -44,6 +45,7 @@ final class HttpSession implements SessionInterface
4445
private FormatterInterface $formatter;
4546
private RequestFactory $requestFactory;
4647
private string $uri;
48+
private AuthenticateInterface $auth;
4749

4850
/**
4951
* @param FormatterInterface<T> $formatter
@@ -54,14 +56,16 @@ public function __construct(
5456
SessionConfiguration $config,
5557
FormatterInterface $formatter,
5658
RequestFactory $requestFactory,
57-
string $uri
59+
string $uri,
60+
AuthenticateInterface $auth
5861
) {
5962
$this->streamFactory = $factory;
6063
$this->config = $config;
6164
$this->pool = $manager;
6265
$this->formatter = $formatter;
6366
$this->requestFactory = $requestFactory;
6467
$this->uri = $uri;
68+
$this->auth = $auth;
6569
}
6670

6771
/**
@@ -70,7 +74,7 @@ public function __construct(
7074
public function runStatements(iterable $statements, ?TransactionConfiguration $config = null): CypherList
7175
{
7276
$request = $this->requestFactory->createRequest('POST', $this->uri);
73-
$client = $this->pool->acquire($request->getUri(), $this->config->getAccessMode());
77+
$client = $this->pool->acquire($request->getUri(), $this->config->getAccessMode(), $this->auth);
7478
$content = HttpHelper::statementsToString($this->formatter, $statements);
7579
$request = $this->instantCommitRequest($request)->withBody($this->streamFactory->createStream($content));
7680

@@ -135,7 +139,7 @@ public function beginTransaction(?iterable $statements = null, ?TransactionConfi
135139
{
136140
$request = $this->requestFactory->createRequest('POST', $this->uri);
137141
$request->getBody()->write(HttpHelper::statementsToString($this->formatter, $statements ?? []));
138-
$client = $this->pool->acquire($request->getUri(), $this->config->getAccessMode());
142+
$client = $this->pool->acquire($request->getUri(), $this->config->getAccessMode(), $this->auth);
139143
$response = $client->sendRequest($request);
140144

141145
/** @var array{commit: string} $data */

src/Neo4j/Neo4jConnectionPool.php

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
use function filter_var;
2121
use Laudis\Neo4j\Bolt\BoltDriver;
2222
use Laudis\Neo4j\Common\Uri;
23+
use Laudis\Neo4j\Contracts\AuthenticateInterface;
2324
use Laudis\Neo4j\Contracts\ConnectionPoolInterface;
2425
use Laudis\Neo4j\Enum\AccessMode;
2526
use Laudis\Neo4j\Enum\RoutingRoles;
@@ -51,12 +52,12 @@ public function __construct(ConnectionPoolInterface $pool)
5152
/**
5253
* @throws Exception
5354
*/
54-
public function acquire(UriInterface $uri, AccessMode $mode): StreamSocket
55+
public function acquire(UriInterface $uri, AccessMode $mode, AuthenticateInterface $authenticate): StreamSocket
5556
{
56-
$table = $this->routingTable($uri);
57+
$table = $this->routingTable($uri, $authenticate);
5758
$server = $this->getNextServer($table, $mode);
5859

59-
$socket = $this->pool->acquire(Uri::create($server), $mode);
60+
$socket = $this->pool->acquire(Uri::create($server), $mode, $authenticate);
6061

6162
$scheme = $uri->getScheme();
6263
$explosion = explode('+', $scheme, 2);
@@ -107,10 +108,10 @@ private function getNextServer(RoutingTable $table, AccessMode $mode): string
107108
*
108109
* @throws Exception
109110
*/
110-
private function routingTable(UriInterface $uri): RoutingTable
111+
private function routingTable(UriInterface $uri, AuthenticateInterface $authenticate): RoutingTable
111112
{
112113
if ($this->table === null || $this->table->getTtl() < time()) {
113-
$session = BoltDriver::create($uri)->createSession();
114+
$session = BoltDriver::create($uri, null, $authenticate)->createSession();
114115
$row = $session->run(
115116
'CALL dbms.components() yield versions UNWIND versions as version RETURN version'
116117
)->first();

0 commit comments

Comments
 (0)