diff --git a/driver-core/src/main/com/mongodb/internal/capi/MongoCryptHelper.java b/driver-core/src/main/com/mongodb/internal/capi/MongoCryptHelper.java index ed08572f3d2..17b78cbe685 100644 --- a/driver-core/src/main/com/mongodb/internal/capi/MongoCryptHelper.java +++ b/driver-core/src/main/com/mongodb/internal/capi/MongoCryptHelper.java @@ -138,6 +138,13 @@ private static BsonDocument toBsonDocument(final Map optionsMap) return new BsonDocumentWrapper<>(new Document(optionsMap), new DocumentCodec()); } + public static boolean isMongocryptdSpawningDisabled(@Nullable final String cryptSharedLibVersion, + final AutoEncryptionSettings settings) { + boolean cryptSharedLibIsAvailable = cryptSharedLibVersion != null && !cryptSharedLibVersion.isEmpty(); + boolean cryptSharedLibRequired = (boolean) settings.getExtraOptions().getOrDefault("cryptSharedLibRequired", false); + return settings.isBypassAutoEncryption() || settings.isBypassQueryAnalysis() || cryptSharedLibRequired || cryptSharedLibIsAvailable; + } + @SuppressWarnings("unchecked") public static List createMongocryptdSpawnArgs(final Map options) { List spawnArgs = new ArrayList<>(); diff --git a/driver-core/src/test/functional/com/mongodb/internal/capi/MongoCryptHelperTest.java b/driver-core/src/test/functional/com/mongodb/internal/capi/MongoCryptHelperTest.java index 77b6c0bce9d..9feac3e57a8 100644 --- a/driver-core/src/test/functional/com/mongodb/internal/capi/MongoCryptHelperTest.java +++ b/driver-core/src/test/functional/com/mongodb/internal/capi/MongoCryptHelperTest.java @@ -27,13 +27,17 @@ import java.util.HashMap; import java.util.Map; +import static com.mongodb.internal.capi.MongoCryptHelper.isMongocryptdSpawningDisabled; import static com.mongodb.internal.capi.MongoCryptHelper.validateRewrapManyDataKeyOptions; import static java.util.Collections.emptyList; import static java.util.Collections.emptyMap; import static java.util.Collections.singletonList; +import static java.util.Collections.singletonMap; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; public class MongoCryptHelperTest { @@ -104,6 +108,29 @@ public void validateRewrapManyDataKeyOptionsTest() { assertThrows(MongoClientException.class, () -> validateRewrapManyDataKeyOptions(new RewrapManyDataKeyOptions().masterKey(new BsonDocument()))); } + @Test + public void isMongocryptdSpawningDisabledTest() { + assertTrue(isMongocryptdSpawningDisabled(null, + initializeAutoEncryptionSettingsBuilder().bypassAutoEncryption(true).build())); + assertTrue(isMongocryptdSpawningDisabled(null, + initializeAutoEncryptionSettingsBuilder().bypassQueryAnalysis(true).build())); + assertTrue(isMongocryptdSpawningDisabled(null, + initializeAutoEncryptionSettingsBuilder().extraOptions(singletonMap("cryptSharedLibRequired", true)).build())); + assertTrue(isMongocryptdSpawningDisabled("/path/to/shared/lib.so", + initializeAutoEncryptionSettingsBuilder().build())); + assertFalse(isMongocryptdSpawningDisabled(null, + initializeAutoEncryptionSettingsBuilder().build())); + assertFalse(isMongocryptdSpawningDisabled("", + initializeAutoEncryptionSettingsBuilder().build())); + } + + private static AutoEncryptionSettings.Builder initializeAutoEncryptionSettingsBuilder() { + AutoEncryptionSettings.Builder builder = AutoEncryptionSettings.builder() + .keyVaultNamespace("test.vault") + .kmsProviders(singletonMap("local", singletonMap("key", new byte[96]))); + return builder; + } + void assertMongoCryptOptions(final MongoCryptOptions expected, final MongoCryptOptions actual) { assertEquals(expected.getAwsKmsProviderOptions(), actual.getAwsKmsProviderOptions(), "AwsKmsProviderOptions not equal"); assertEquals(expected.getEncryptedFieldsMap(), actual.getEncryptedFieldsMap(), "EncryptedFieldsMap not equal"); diff --git a/driver-reactive-streams/src/main/com/mongodb/reactivestreams/client/internal/crypt/CommandMarker.java b/driver-reactive-streams/src/main/com/mongodb/reactivestreams/client/internal/crypt/CommandMarker.java index e5b97c58dc8..69524dfa772 100644 --- a/driver-reactive-streams/src/main/com/mongodb/reactivestreams/client/internal/crypt/CommandMarker.java +++ b/driver-reactive-streams/src/main/com/mongodb/reactivestreams/client/internal/crypt/CommandMarker.java @@ -34,6 +34,7 @@ import static com.mongodb.assertions.Assertions.assertNotNull; import static com.mongodb.internal.capi.MongoCryptHelper.createMongocryptdClientSettings; import static com.mongodb.internal.capi.MongoCryptHelper.createProcessBuilder; +import static com.mongodb.internal.capi.MongoCryptHelper.isMongocryptdSpawningDisabled; import static com.mongodb.internal.capi.MongoCryptHelper.startProcess; @SuppressWarnings("UseOfProcessBuilder") @@ -62,18 +63,12 @@ class CommandMarker implements Closeable { CommandMarker( final MongoCrypt mongoCrypt, final AutoEncryptionSettings settings) { - Map extraOptions = settings.getExtraOptions(); - String cryptSharedLibVersionString = mongoCrypt.getCryptSharedLibVersionString(); - boolean bypassAutoEncryption = settings.isBypassAutoEncryption(); - boolean isBypassQueryAnalysis = settings.isBypassQueryAnalysis(); - boolean cryptSharedIsAvailable = cryptSharedLibVersionString != null && cryptSharedLibVersionString.isEmpty(); - boolean cryptSharedLibRequired = (boolean) extraOptions.getOrDefault("cryptSharedLibRequired", false); - - if (bypassAutoEncryption || isBypassQueryAnalysis || cryptSharedLibRequired || cryptSharedIsAvailable) { + if (isMongocryptdSpawningDisabled(mongoCrypt.getCryptSharedLibVersionString(), settings)) { processBuilder = null; client = null; } else { + Map extraOptions = settings.getExtraOptions(); boolean mongocryptdBypassSpawn = (boolean) extraOptions.getOrDefault("mongocryptdBypassSpawn", false); if (!mongocryptdBypassSpawn) { processBuilder = createProcessBuilder(extraOptions); diff --git a/driver-sync/src/main/com/mongodb/client/internal/CommandMarker.java b/driver-sync/src/main/com/mongodb/client/internal/CommandMarker.java index 6afcfb5864a..e85bc44eb8f 100644 --- a/driver-sync/src/main/com/mongodb/client/internal/CommandMarker.java +++ b/driver-sync/src/main/com/mongodb/client/internal/CommandMarker.java @@ -34,6 +34,7 @@ import static com.mongodb.assertions.Assertions.assertNotNull; import static com.mongodb.internal.capi.MongoCryptHelper.createMongocryptdClientSettings; import static com.mongodb.internal.capi.MongoCryptHelper.createProcessBuilder; +import static com.mongodb.internal.capi.MongoCryptHelper.isMongocryptdSpawningDisabled; import static com.mongodb.internal.capi.MongoCryptHelper.startProcess; @SuppressWarnings("UseOfProcessBuilder") @@ -62,18 +63,12 @@ class CommandMarker implements Closeable { CommandMarker( final MongoCrypt mongoCrypt, final AutoEncryptionSettings settings) { - Map extraOptions = settings.getExtraOptions(); - String cryptSharedLibVersionString = mongoCrypt.getCryptSharedLibVersionString(); - boolean bypassAutoEncryption = settings.isBypassAutoEncryption(); - boolean isBypassQueryAnalysis = settings.isBypassQueryAnalysis(); - boolean cryptSharedIsAvailable = cryptSharedLibVersionString != null && cryptSharedLibVersionString.isEmpty(); - boolean cryptSharedLibRequired = (boolean) extraOptions.getOrDefault("cryptSharedLibRequired", false); - - if (bypassAutoEncryption || isBypassQueryAnalysis || cryptSharedLibRequired || cryptSharedIsAvailable) { + if (isMongocryptdSpawningDisabled(mongoCrypt.getCryptSharedLibVersionString(), settings)) { processBuilder = null; client = null; } else { + Map extraOptions = settings.getExtraOptions(); boolean mongocryptdBypassSpawn = (boolean) extraOptions.getOrDefault("mongocryptdBypassSpawn", false); if (!mongocryptdBypassSpawn) { processBuilder = createProcessBuilder(extraOptions);