diff --git a/psalm-baseline.xml b/psalm-baseline.xml
index a6dd2d5bf..4d99d5c0c 100644
--- a/psalm-baseline.xml
+++ b/psalm-baseline.xml
@@ -222,8 +222,12 @@
+
+
+
+
diff --git a/src/Client.php b/src/Client.php
index 72ffaf6a6..fa739965b 100644
--- a/src/Client.php
+++ b/src/Client.php
@@ -118,12 +118,8 @@ public function __construct(?string $uri = null, array $uriOptions = [], array $
throw InvalidArgumentException::invalidType('"typeMap" driver option', $driverOptions['typeMap'], 'array');
}
- if (isset($driverOptions['autoEncryption']['keyVaultClient'])) {
- if ($driverOptions['autoEncryption']['keyVaultClient'] instanceof self) {
- $driverOptions['autoEncryption']['keyVaultClient'] = $driverOptions['autoEncryption']['keyVaultClient']->manager;
- } elseif (! $driverOptions['autoEncryption']['keyVaultClient'] instanceof Manager) {
- throw InvalidArgumentException::invalidType('"keyVaultClient" autoEncryption option', $driverOptions['autoEncryption']['keyVaultClient'], [self::class, Manager::class]);
- }
+ if (isset($driverOptions['autoEncryption']) && is_array($driverOptions['autoEncryption'])) {
+ $driverOptions['autoEncryption'] = $this->prepareEncryptionOptions($driverOptions['autoEncryption']);
}
if (isset($driverOptions['builderEncoder']) && ! $driverOptions['builderEncoder'] instanceof Encoder) {
@@ -232,13 +228,7 @@ public function bulkWrite(BulkWriteCommand|ClientBulkWrite $bulk, array $options
*/
public function createClientEncryption(array $options): ClientEncryption
{
- if (isset($options['keyVaultClient'])) {
- if ($options['keyVaultClient'] instanceof self) {
- $options['keyVaultClient'] = $options['keyVaultClient']->manager;
- } elseif (! $options['keyVaultClient'] instanceof Manager) {
- throw InvalidArgumentException::invalidType('"keyVaultClient" option', $options['keyVaultClient'], [self::class, Manager::class]);
- }
- }
+ $options = $this->prepareEncryptionOptions($options);
return $this->manager->createClientEncryption($options);
}
@@ -500,4 +490,26 @@ private function mergeDriverInfo(array $driver): array
return $mergedDriver;
}
+
+ private function prepareEncryptionOptions(array $options): array
+ {
+ if (isset($options['keyVaultClient'])) {
+ if ($options['keyVaultClient'] instanceof self) {
+ $options['keyVaultClient'] = $options['keyVaultClient']->manager;
+ } elseif (! $options['keyVaultClient'] instanceof Manager) {
+ throw InvalidArgumentException::invalidType('"keyVaultClient" option', $options['keyVaultClient'], [self::class, Manager::class]);
+ }
+ }
+
+ // The server requires an empty document for automatic credentials.
+ if (isset($options['kmsProviders']) && is_array($options['kmsProviders'])) {
+ foreach ($options['kmsProviders'] as $name => $provider) {
+ if ($provider === []) {
+ $options['kmsProviders'][$name] = new stdClass();
+ }
+ }
+ }
+
+ return $options;
+ }
}
diff --git a/tests/ClientTest.php b/tests/ClientTest.php
index a2fc917ae..45d852dc4 100644
--- a/tests/ClientTest.php
+++ b/tests/ClientTest.php
@@ -37,6 +37,18 @@ public function testConstructorAutoEncryptionOpts(): void
new Client(static::getUri(), [], ['autoEncryption' => $autoEncryptionOpts]);
}
+ #[DoesNotPerformAssertions]
+ public function testConstructorEmptyKmsProvider(): void
+ {
+ $autoEncryptionOpts = [
+ 'keyVaultClient' => new Client(static::getUri()),
+ 'keyVaultNamespace' => 'default.keys',
+ 'kmsProviders' => ['gcp' => []],
+ ];
+
+ new Client(static::getUri(), [], ['autoEncryption' => $autoEncryptionOpts]);
+ }
+
#[DataProvider('provideInvalidConstructorDriverOptions')]
public function testConstructorDriverOptionTypeChecks(array $driverOptions, string $exception = InvalidArgumentException::class): void
{
diff --git a/tests/Collection/CollectionFunctionalTest.php b/tests/Collection/CollectionFunctionalTest.php
index a1799f7f9..95659381c 100644
--- a/tests/Collection/CollectionFunctionalTest.php
+++ b/tests/Collection/CollectionFunctionalTest.php
@@ -413,7 +413,6 @@ public function testWithOptionsInheritsOptions(): void
$rc = new ReflectionClass($clone);
$rp = $rc->getProperty('autoEncryptionEnabled');
- $rp->setAccessible(true);
$this->assertSame(true, $rp->getValue($clone));
}
@@ -441,7 +440,6 @@ public function testWithOptionsPassesOptions(): void
$rc = new ReflectionClass($clone);
$rp = $rc->getProperty('autoEncryptionEnabled');
- $rp->setAccessible(true);
$this->assertSame(true, $rp->getValue($clone));
}
diff --git a/tests/Database/DatabaseFunctionalTest.php b/tests/Database/DatabaseFunctionalTest.php
index f2e1e86f0..7f4e564c2 100644
--- a/tests/Database/DatabaseFunctionalTest.php
+++ b/tests/Database/DatabaseFunctionalTest.php
@@ -393,7 +393,6 @@ public function testWithOptionsInheritsOptions(): void
$rc = new ReflectionClass($clone);
$rp = $rc->getProperty('autoEncryptionEnabled');
- $rp->setAccessible(true);
$this->assertSame(true, $rp->getValue($clone));
}
@@ -420,7 +419,6 @@ public function testWithOptionsPassesOptions(): void
$rc = new ReflectionClass($clone);
$rp = $rc->getProperty('autoEncryptionEnabled');
- $rp->setAccessible(true);
$this->assertSame(true, $rp->getValue($clone));
}