diff --git a/doc/changelog.rst b/doc/changelog.rst index a2a8f6c211..b2fc239e08 100644 --- a/doc/changelog.rst +++ b/doc/changelog.rst @@ -17,6 +17,9 @@ PyMongo 4.16 brings a number of changes including: - Fixed return type annotation for ``find_one_and_*`` methods on :class:`~pymongo.asynchronous.collection.AsyncCollection` and :class:`~pymongo.synchronous.collection.Collection` to include ``None``. - Added support for NumPy 1D-arrays in :class:`bson.binary.BinaryVector`. +- Prevented :class:`~pymongo.encryption.ClientEncryption` from loading the crypt + shared library to fix "MongoCryptError: An existing crypt_shared library is + loaded by the application" unless the linked library search path is set. Changes in Version 4.15.5 (2025/XX/XX) -------------------------------------- diff --git a/pymongo/asynchronous/encryption.py b/pymongo/asynchronous/encryption.py index 4dfd36aa49..c43aa38e76 100644 --- a/pymongo/asynchronous/encryption.py +++ b/pymongo/asynchronous/encryption.py @@ -13,6 +13,7 @@ # limitations under the License. """Support for explicit client-side field level encryption.""" + from __future__ import annotations import asyncio @@ -714,10 +715,15 @@ def __init__( self._io_callbacks: Optional[_EncryptionIO] = _EncryptionIO( None, key_vault_coll, None, opts ) + + # Pass bypass_encryption=True to skip loading crypt_shared. self._encryption = AsyncExplicitEncrypter( self._io_callbacks, _create_mongocrypt_options( - kms_providers=kms_providers, schema_map=None, key_expiration_ms=key_expiration_ms + kms_providers=kms_providers, + schema_map=None, + key_expiration_ms=key_expiration_ms, + bypass_encryption=True, # Don't load crypt_shared ), ) # Use the same key vault collection as the callback. diff --git a/pymongo/synchronous/encryption.py b/pymongo/synchronous/encryption.py index 2d666b9763..e09ab9165c 100644 --- a/pymongo/synchronous/encryption.py +++ b/pymongo/synchronous/encryption.py @@ -13,6 +13,7 @@ # limitations under the License. """Support for explicit client-side field level encryption.""" + from __future__ import annotations import contextlib @@ -707,10 +708,15 @@ def __init__( self._io_callbacks: Optional[_EncryptionIO] = _EncryptionIO( None, key_vault_coll, None, opts ) + + # Pass bypass_encryption=True to skip loading crypt_shared. self._encryption = ExplicitEncrypter( self._io_callbacks, _create_mongocrypt_options( - kms_providers=kms_providers, schema_map=None, key_expiration_ms=key_expiration_ms + kms_providers=kms_providers, + schema_map=None, + key_expiration_ms=key_expiration_ms, + bypass_encryption=True, # Don't load crypt_shared ), ) # Use the same key vault collection as the callback.