Skip to content

Test tx func run #262

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 5 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ services:
- .env
neo4j:
<<: *common
image: neo4j:5.23-community
image: neo4j:5-enterprise
hostname: neo4j
networks:
- neo4j
Expand All @@ -62,6 +62,7 @@ services:
- "11474:7474"
environment:
<<: *common-env
NEO4J_ACCEPT_LICENSE_AGREEMENT: 'yes'
NEO4J_server_bolt_advertised__address: neo4j:7687
NEO4J_server_http_advertised__address: neo4j:7474

Expand Down
36 changes: 11 additions & 25 deletions src/Authentication/BasicAuth.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,10 @@

namespace Laudis\Neo4j\Authentication;

use Bolt\protocol\V4_4;
use Bolt\protocol\V5;
use Bolt\protocol\V5_1;
use Bolt\protocol\V5_2;
use Bolt\protocol\V5_3;
use Bolt\protocol\V5_4;
use Exception;
use Laudis\Neo4j\Bolt\BoltConnection;
use Laudis\Neo4j\Bolt\BoltMessageFactory;
use Laudis\Neo4j\Common\Neo4jLogger;
use Laudis\Neo4j\Common\ResponseHelper;
use Laudis\Neo4j\Contracts\AuthenticateInterface;
use Psr\Http\Message\UriInterface;

Expand All @@ -43,27 +37,26 @@ public function __construct(
*
* @return array{server: string, connection_id: string, hints: list}
*/
public function authenticateBolt(V4_4|V5|V5_1|V5_2|V5_3|V5_4 $protocol, string $userAgent): array
public function authenticateBolt(BoltConnection $connection, string $userAgent): array
{
$factory = $this->createMessageFactory($protocol);
$factory = $this->createMessageFactory($connection);

$protocol = $connection->protocol();
if (method_exists($protocol, 'logon')) {
$helloMetadata = ['user_agent' => $userAgent];

$factory->createHelloMessage($helloMetadata)->send();
$response = ResponseHelper::getResponse($protocol);
$responseHello = $factory->createHelloMessage($helloMetadata)->send()->getResponse();

$credentials = [
'scheme' => 'basic',
'principal' => $this->username,
'credentials' => $this->password,
];

$factory->createLogonMessage($credentials)->send();
ResponseHelper::getResponse($protocol);
$response = $factory->createLogonMessage($credentials)->send()->getResponse();

/** @var array{server: string, connection_id: string, hints: list} */
return $response->content;
return array_merge($responseHello->content, $response->content);
}

$helloMetadata = [
Expand All @@ -73,22 +66,15 @@ public function authenticateBolt(V4_4|V5|V5_1|V5_2|V5_3|V5_4 $protocol, string $
'credentials' => $this->password,
];

$factory->createHelloMessage($helloMetadata)->send();
$response = $factory->createHelloMessage($helloMetadata)->send()->getResponse();

/** @var array{server: string, connection_id: string, hints: list} */
return ResponseHelper::getResponse($protocol)->content;
return $response->content;
}

/**
* @throws Exception
*/
public function logoff(V4_4|V5|V5_1|V5_2|V5_3|V5_4 $protocol): void
{
$factory = $this->createMessageFactory($protocol);
$factory->createLogoffMessage()->send();
ResponseHelper::getResponse($protocol);
}

public function toString(UriInterface $uri): string
{
return sprintf('Basic %s:%s@%s:%s', $this->username, '######', $uri->getHost(), $uri->getPort() ?? '');
Expand All @@ -97,8 +83,8 @@ public function toString(UriInterface $uri): string
/**
* Helper to create message factory.
*/
private function createMessageFactory(V4_4|V5|V5_1|V5_2|V5_3|V5_4 $protocol): BoltMessageFactory
private function createMessageFactory(BoltConnection $connection): BoltMessageFactory
{
return new BoltMessageFactory($protocol, $this->logger);
return new BoltMessageFactory($connection, $this->logger);
}
}
35 changes: 8 additions & 27 deletions src/Authentication/KerberosAuth.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,18 +13,11 @@

namespace Laudis\Neo4j\Authentication;

use Bolt\protocol\V4_4;
use Bolt\protocol\V5;
use Bolt\protocol\V5_1;
use Bolt\protocol\V5_2;
use Bolt\protocol\V5_3;
use Bolt\protocol\V5_4;
use Exception;
use Laudis\Neo4j\Bolt\BoltConnection;
use Laudis\Neo4j\Bolt\BoltMessageFactory;
use Laudis\Neo4j\Common\Neo4jLogger;
use Laudis\Neo4j\Common\ResponseHelper;
use Laudis\Neo4j\Contracts\AuthenticateInterface;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\UriInterface;
use Psr\Log\LogLevel;

Expand All @@ -41,38 +34,26 @@ public function __construct(
) {
}

public function authenticateHttp(RequestInterface $request, UriInterface $uri, string $userAgent): RequestInterface
{
$this->logger?->log(LogLevel::DEBUG, 'Authenticating using KerberosAuth');

return $request->withHeader('Authorization', 'Kerberos '.$this->token)
->withHeader('User-Agent', $userAgent);
}

/**
* @throws Exception
*
* @return array{server: string, connection_id: string, hints: list}
*/
public function authenticateBolt(V4_4|V5|V5_1|V5_2|V5_3|V5_4 $protocol, string $userAgent): array
public function authenticateBolt(BoltConnection $connection, string $userAgent): array
{
$factory = $this->createMessageFactory($protocol);
$factory = $this->createMessageFactory($connection);

$this->logger?->log(LogLevel::DEBUG, 'HELLO', ['user_agent' => $userAgent]);

$factory->createHelloMessage(['user_agent' => $userAgent])->send();

$response = ResponseHelper::getResponse($protocol);
$factory->createHelloMessage(['user_agent' => $userAgent])->send()->getResponse();

$this->logger?->log(LogLevel::DEBUG, 'LOGON', ['scheme' => 'kerberos', 'principal' => '']);

$factory->createLogonMessage([
$response = $factory->createLogonMessage([
'scheme' => 'kerberos',
'principal' => '',
'credentials' => $this->token,
])->send();

ResponseHelper::getResponse($protocol);
])->send()->getResponse();

/**
* @var array{server: string, connection_id: string, hints: list}
Expand All @@ -88,8 +69,8 @@ public function toString(UriInterface $uri): string
/**
* Helper to create the message factory.
*/
private function createMessageFactory(V4_4|V5|V5_1|V5_2|V5_3|V5_4 $protocol): BoltMessageFactory
private function createMessageFactory(BoltConnection $connection): BoltMessageFactory
{
return new BoltMessageFactory($protocol, $this->logger);
return new BoltMessageFactory($connection, $this->logger);
}
}
45 changes: 11 additions & 34 deletions src/Authentication/NoAuth.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,20 +13,13 @@

namespace Laudis\Neo4j\Authentication;

use Bolt\protocol\V4_4;
use Bolt\protocol\V5;
use Bolt\protocol\V5_1;
use Bolt\protocol\V5_2;
use Bolt\protocol\V5_3;
use Bolt\protocol\V5_4;
use Exception;
use Laudis\Neo4j\Bolt\BoltConnection;
use Laudis\Neo4j\Bolt\BoltMessageFactory;
use Laudis\Neo4j\Common\Neo4jLogger;
use Laudis\Neo4j\Common\ResponseHelper;
use Laudis\Neo4j\Contracts\AuthenticateInterface;
use Psr\Http\Message\RequestInterface;
use Laudis\Neo4j\Enum\ConnectionProtocol;
use Psr\Http\Message\UriInterface;
use Psr\Log\LogLevel;

use function sprintf;

Expand All @@ -37,30 +30,21 @@ public function __construct(
) {
}

public function authenticateHttp(RequestInterface $request, UriInterface $uri, string $userAgent): RequestInterface
{
$this->logger?->log(LogLevel::DEBUG, 'Authentication disabled');

return $request->withHeader('User-Agent', $userAgent);
}

/**
* @throws Exception
*
* @return array{server: string, connection_id: string, hints: list}
*/
public function authenticateBolt(V4_4|V5|V5_1|V5_2|V5_3|V5_4 $protocol, string $userAgent): array
public function authenticateBolt(BoltConnection $connection, string $userAgent): array
{
$factory = $this->createMessageFactory($protocol);
$factory = $this->createMessageFactory($connection);

if (method_exists($protocol, 'logon')) {
if ($connection->getProtocol()->compare(ConnectionProtocol::BOLT_V5_1()) >= 0) {
$helloMetadata = ['user_agent' => $userAgent];

$factory->createHelloMessage($helloMetadata)->send();
$response = ResponseHelper::getResponse($protocol);
$factory->createHelloMessage($helloMetadata)->send()->getResponse();

$factory->createLogonMessage(['scheme' => 'none'])->send();
ResponseHelper::getResponse($protocol);
$response = $factory->createLogonMessage(['scheme' => 'none'])->send()->getResponse();

/** @var array{server: string, connection_id: string, hints: list} */
return $response->content;
Expand All @@ -71,26 +55,19 @@ public function authenticateBolt(V4_4|V5|V5_1|V5_2|V5_3|V5_4 $protocol, string $
'scheme' => 'none',
];

$factory->createHelloMessage($helloMetadata)->send();
$response = $factory->createHelloMessage($helloMetadata)->send()->getResponse();

/** @var array{server: string, connection_id: string, hints: list} */
return ResponseHelper::getResponse($protocol)->content;
}

public function logoff(V4_4|V5|V5_1|V5_2|V5_3|V5_4 $protocol): void
{
$factory = $this->createMessageFactory($protocol);
$factory->createLogoffMessage()->send();
ResponseHelper::getResponse($protocol);
return $response->content;
}

public function toString(UriInterface $uri): string
{
return sprintf('No Auth %s:%s', $uri->getHost(), $uri->getPort() ?? '');
}

private function createMessageFactory(V4_4|V5|V5_1|V5_2|V5_3|V5_4 $protocol): BoltMessageFactory
private function createMessageFactory(BoltConnection $connection): BoltMessageFactory
{
return new BoltMessageFactory($protocol, $this->logger);
return new BoltMessageFactory($connection, $this->logger);
}
}
26 changes: 8 additions & 18 deletions src/Authentication/OpenIDConnectAuth.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,10 @@

namespace Laudis\Neo4j\Authentication;

use Bolt\protocol\V4_4;
use Bolt\protocol\V5;
use Bolt\protocol\V5_1;
use Bolt\protocol\V5_2;
use Bolt\protocol\V5_3;
use Bolt\protocol\V5_4;
use Exception;
use Laudis\Neo4j\Bolt\BoltConnection;
use Laudis\Neo4j\Bolt\BoltMessageFactory;
use Laudis\Neo4j\Common\Neo4jLogger;
use Laudis\Neo4j\Common\ResponseHelper;
use Laudis\Neo4j\Contracts\AuthenticateInterface;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\UriInterface;
Expand Down Expand Up @@ -51,24 +45,20 @@ public function authenticateHttp(RequestInterface $request, UriInterface $uri, s
*
* @return array{server: string, connection_id: string, hints: list}
*/
public function authenticateBolt(V4_4|V5|V5_1|V5_2|V5_3|V5_4 $protocol, string $userAgent): array
public function authenticateBolt(BoltConnection $connection, string $userAgent): array
{
$factory = $this->createMessageFactory($protocol);
$factory = $this->createMessageFactory($connection);

$this->logger?->log(LogLevel::DEBUG, 'HELLO', ['user_agent' => $userAgent]);

$factory->createHelloMessage(['user_agent' => $userAgent])->send();

$response = ResponseHelper::getResponse($protocol);
$factory->createHelloMessage(['user_agent' => $userAgent])->send()->getResponse();

$this->logger?->log(LogLevel::DEBUG, 'LOGON', ['scheme' => 'bearer']);

$factory->createLogonMessage([
$response = $factory->createLogonMessage([
'scheme' => 'bearer',
'credentials' => $this->token,
])->send();

ResponseHelper::getResponse($protocol);
])->send()->getResponse();

/**
* @var array{server: string, connection_id: string, hints: list}
Expand All @@ -84,8 +74,8 @@ public function toString(UriInterface $uri): string
/**
* Helper to create the message factory.
*/
public function createMessageFactory(V4_4|V5|V5_1|V5_2|V5_3|V5_4 $protocol): BoltMessageFactory
public function createMessageFactory(BoltConnection $connection): BoltMessageFactory
{
return new BoltMessageFactory($protocol, $this->logger);
return new BoltMessageFactory($connection, $this->logger);
}
}
19 changes: 3 additions & 16 deletions src/Bolt/BoltConnection.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@
use Laudis\Neo4j\Contracts\ConnectionInterface;
use Laudis\Neo4j\Databags\BookmarkHolder;
use Laudis\Neo4j\Databags\DatabaseInfo;
use Laudis\Neo4j\Databags\Neo4jError;
use Laudis\Neo4j\Enum\AccessMode;
use Laudis\Neo4j\Enum\ConnectionProtocol;
use Laudis\Neo4j\Exception\Neo4jException;
Expand Down Expand Up @@ -85,7 +84,7 @@ public function __construct(
private readonly ConnectionConfiguration $config,
private readonly ?Neo4jLogger $logger,
) {
$this->messageFactory = new BoltMessageFactory($this->protocol(), $this->logger);
$this->messageFactory = new BoltMessageFactory($this, $this->logger);
}

public function getEncryptionLevel(): string
Expand All @@ -109,14 +108,6 @@ public function getServerAddress(): UriInterface
return $this->config->getServerAddress();
}

/**
* @psalm-mutation-free
*/
public function getServerVersion(): string
{
return $this->config->getServerVersion();
}

/**
* @psalm-mutation-free
*/
Expand Down Expand Up @@ -392,16 +383,12 @@ public function getUserAgent(): string
return $this->userAgent;
}

private function assertNoFailure(Response $response): void
public function assertNoFailure(Response $response): void
{
if ($response->signature === Signature::FAILURE) {
$this->logger?->log(LogLevel::ERROR, 'FAILURE');
$message = $this->messageFactory->createResetMessage();
$resetResponse = $message->send()->getResponse();
$this->subscribedResults = [];
if ($resetResponse->signature === Signature::FAILURE) {
throw new Neo4jException([Neo4jError::fromBoltResponse($resetResponse), Neo4jError::fromBoltResponse($response)]);
}

throw Neo4jException::fromBoltResponse($response);
}
}
Expand Down
Loading
Loading