1
0
mirror of https://github.com/danog/postgres.git synced 2024-12-02 09:27:54 +01:00

Add sslmode to config

This commit is contained in:
Aaron Piotrowski 2020-05-02 00:33:35 -05:00
parent 54186c9d26
commit 737f98243f
No known key found for this signature in database
GPG Key ID: ADD1EF783EDE9EEB
2 changed files with 65 additions and 2 deletions

View File

@ -6,7 +6,19 @@ use Amp\Sql\ConnectionConfig as SqlConnectionConfig;
final class ConnectionConfig extends SqlConnectionConfig final class ConnectionConfig extends SqlConnectionConfig
{ {
const DEFAULT_PORT = 5432; public const DEFAULT_PORT = 5432;
public const SSL_MODES = [
'disable',
'allow',
'prefer',
'require',
'verify-ca',
'verify-full',
];
/** @var string|null */
private $sslMode = null;
/** @var string|null */ /** @var string|null */
private $string; private $string;
@ -19,13 +31,19 @@ final class ConnectionConfig extends SqlConnectionConfig
throw new \Error("Host must be provided in connection string"); throw new \Error("Host must be provided in connection string");
} }
return new self( $config = new self(
$parts["host"], $parts["host"],
(int) ($parts["port"] ?? self::DEFAULT_PORT), (int) ($parts["port"] ?? self::DEFAULT_PORT),
$parts["user"] ?? null, $parts["user"] ?? null,
$parts["password"] ?? null, $parts["password"] ?? null,
$parts["db"] ?? null $parts["db"] ?? null
); );
if (isset($parts["sslmode"])) {
$config = $config->withSslMode($parts["sslmode"]);
}
return $config;
} }
public function __construct( public function __construct(
@ -43,6 +61,29 @@ final class ConnectionConfig extends SqlConnectionConfig
$this->string = null; $this->string = null;
} }
public function getSslMode(): ?string
{
return $this->sslMode;
}
public function withSslMode(string $mode): self
{
if (!\in_array($mode, self::SSL_MODES, true)) {
throw new \Error('Invalid SSL mode, must be one of: ' . \implode(', ', self::SSL_MODES));
}
$new = clone $this;
$new->sslMode = $mode;
return $new;
}
public function withoutSslMode(): self
{
$new = clone $this;
$new->sslMode = null;
return $new;
}
/** /**
* @return string Connection string used with ext-pgsql and pecl-pq. * @return string Connection string used with ext-pgsql and pecl-pq.
*/ */
@ -72,6 +113,10 @@ final class ConnectionConfig extends SqlConnectionConfig
$chunks[] = "dbname=" . $database; $chunks[] = "dbname=" . $database;
} }
if ($this->sslMode !== null) {
$chunks[] = "sslmode=" . $this->sslMode;
}
return $this->string = \implode(" ", $chunks); return $this->string = \implode(" ", $chunks);
} }
} }

View File

@ -42,4 +42,22 @@ class ConnectionConfigTest extends TestCase
$this->expectExceptionMessage("Host must be provided in connection string"); $this->expectExceptionMessage("Host must be provided in connection string");
$config = ConnectionConfig::fromString("invalid connection string"); $config = ConnectionConfig::fromString("invalid connection string");
} }
public function testSslMode(): void
{
$config = ConnectionConfig::fromString("host=localhost sslmode=verify-ca");
$this->assertSame('verify-ca', $config->getSslMode());
$altered = $config->withoutSslMode();
$this->assertNull($altered->getSslMode());
$this->assertSame('verify-ca', $config->getSslMode());
$altered = $altered->withSslMode('allow');
$this->assertSame('allow', $altered->getSslMode());
$this->expectException(\Error::class);
$this->expectExceptionMessage('Invalid SSL mode');
$config->withSslMode('invalid');
}
} }