Skip to content

Commit 9097aea

Browse files
committed
PHPLIB-1708 Cast empty KMS provider into an object
1 parent 0e80d17 commit 9097aea

File tree

3 files changed

+41
-13
lines changed

3 files changed

+41
-13
lines changed

psalm-baseline.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,8 +231,12 @@
231231
<code><![CDATA[$driverOptions['driver'] ?? []]]></code>
232232
<code><![CDATA[$pipeline]]></code>
233233
</MixedArgument>
234+
<MixedArrayAssignment>
235+
<code><![CDATA[$options['kmsProviders'][$name]]]></code>
236+
</MixedArrayAssignment>
234237
<MixedAssignment>
235238
<code><![CDATA[$mergedDriver['platform']]]></code>
239+
<code><![CDATA[$provider]]></code>
236240
</MixedAssignment>
237241
<MixedPropertyTypeCoercion>
238242
<code><![CDATA[$driverOptions['builderEncoder'] ?? new BuilderEncoder()]]></code>

src/Client.php

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -119,12 +119,8 @@ public function __construct(?string $uri = null, array $uriOptions = [], array $
119119
throw InvalidArgumentException::invalidType('"typeMap" driver option', $driverOptions['typeMap'], 'array');
120120
}
121121

122-
if (isset($driverOptions['autoEncryption']['keyVaultClient'])) {
123-
if ($driverOptions['autoEncryption']['keyVaultClient'] instanceof self) {
124-
$driverOptions['autoEncryption']['keyVaultClient'] = $driverOptions['autoEncryption']['keyVaultClient']->manager;
125-
} elseif (! $driverOptions['autoEncryption']['keyVaultClient'] instanceof Manager) {
126-
throw InvalidArgumentException::invalidType('"keyVaultClient" autoEncryption option', $driverOptions['autoEncryption']['keyVaultClient'], [self::class, Manager::class]);
127-
}
122+
if (isset($driverOptions['autoEncryption']) && is_array($driverOptions['autoEncryption'])) {
123+
$driverOptions['autoEncryption'] = $this->prepareEncryptionOptions($driverOptions['autoEncryption']);
128124
}
129125

130126
if (isset($driverOptions['builderEncoder']) && ! $driverOptions['builderEncoder'] instanceof Encoder) {
@@ -213,13 +209,7 @@ final public function addSubscriber(Subscriber $subscriber): void
213209
*/
214210
public function createClientEncryption(array $options)
215211
{
216-
if (isset($options['keyVaultClient'])) {
217-
if ($options['keyVaultClient'] instanceof self) {
218-
$options['keyVaultClient'] = $options['keyVaultClient']->manager;
219-
} elseif (! $options['keyVaultClient'] instanceof Manager) {
220-
throw InvalidArgumentException::invalidType('"keyVaultClient" option', $options['keyVaultClient'], [self::class, Manager::class]);
221-
}
222-
}
212+
$options = $this->prepareEncryptionOptions($options);
223213

224214
return $this->manager->createClientEncryption($options);
225215
}
@@ -499,4 +489,26 @@ private function mergeDriverInfo(array $driver): array
499489

500490
return $mergedDriver;
501491
}
492+
493+
private function prepareEncryptionOptions(array $options): array
494+
{
495+
if (isset($options['keyVaultClient'])) {
496+
if ($options['keyVaultClient'] instanceof self) {
497+
$options['keyVaultClient'] = $options['keyVaultClient']->manager;
498+
} elseif (! $options['keyVaultClient'] instanceof Manager) {
499+
throw InvalidArgumentException::invalidType('"keyVaultClient" option', $options['keyVaultClient'], [self::class, Manager::class]);
500+
}
501+
}
502+
503+
// The server requires an empty document for automatic credentials.
504+
if (isset($options['kmsProviders']) && is_array($options['kmsProviders'])) {
505+
foreach ($options['kmsProviders'] as $name => $provider) {
506+
if ($provider === []) {
507+
$options['kmsProviders'][$name] = new stdClass();
508+
}
509+
}
510+
}
511+
512+
return $options;
513+
}
502514
}

tests/ClientTest.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,18 @@ public function testConstructorAutoEncryptionOpts(): void
3737
new Client(static::getUri(), [], ['autoEncryption' => $autoEncryptionOpts]);
3838
}
3939

40+
#[DoesNotPerformAssertions]
41+
public function testConstructorEmptyKmsProvider(): void
42+
{
43+
$autoEncryptionOpts = [
44+
'keyVaultClient' => new Client(static::getUri()),
45+
'keyVaultNamespace' => 'default.keys',
46+
'kmsProviders' => ['gcp' => []],
47+
];
48+
49+
new Client(static::getUri(), [], ['autoEncryption' => $autoEncryptionOpts]);
50+
}
51+
4052
#[DataProvider('provideInvalidConstructorDriverOptions')]
4153
public function testConstructorDriverOptionTypeChecks(array $driverOptions, string $exception = InvalidArgumentException::class): void
4254
{

0 commit comments

Comments
 (0)