1919import os
2020import re
2121import socket
22+ import socketserver
2223import ssl
2324import sys
2425import textwrap
2526import traceback
2627import uuid
28+ from threading import Thread
2729from typing import Any , Dict , Mapping
2830
2931from pymongo .collection import Collection
@@ -730,6 +732,11 @@ def create_key_vault(vault, *data_keys):
730732 vault .drop ()
731733 if data_keys :
732734 vault .insert_many (data_keys )
735+ vault .create_index (
736+ "keyAltNames" ,
737+ unique = True ,
738+ partialFilterExpression = {"keyAltNames" : {"$exists" : True }},
739+ )
733740 return vault
734741
735742
@@ -1786,10 +1793,7 @@ class TestDecryptProse(EncryptionIntegrationTest):
17861793 def setUp (self ):
17871794 self .client = client_context .client
17881795 self .client .db .drop_collection ("decryption_events" )
1789- self .client .keyvault .drop_collection ("datakeys" )
1790- self .client .keyvault .datakeys .create_index (
1791- "keyAltNames" , unique = True , partialFilterExpression = {"keyAltNames" : {"$exists" : True }}
1792- )
1796+ create_key_vault (self .client .keyvault .datakeys )
17931797 kms_providers_map = {"local" : {"key" : LOCAL_MASTER_KEY }}
17941798
17951799 self .client_encryption = ClientEncryption (
@@ -1912,12 +1916,9 @@ def test_bypassAutoEncryption(self):
19121916
19131917 @unittest .skipUnless (os .environ .get ("TEST_CRYPT_SHARED" ), "crypt_shared lib is not installed" )
19141918 def test_via_loading_shared_library (self ):
1915- key_vault = client_context .client .keyvault .datakeys
1916- key_vault .drop ()
1917- key_vault .create_index (
1918- "keyAltNames" , unique = True , partialFilterExpression = {"keyAltNames" : {"$exists" : True }}
1919+ create_key_vault (
1920+ client_context .client .keyvault .datakeys , json_data ("external" , "external-key.json" )
19191921 )
1920- key_vault .insert_one (json_data ("external" , "external-key.json" ))
19211922 schemas = {"db.coll" : json_data ("external" , "external-schema.json" )}
19221923 opts = AutoEncryptionOpts (
19231924 kms_providers = {"local" : {"key" : LOCAL_MASTER_KEY }},
@@ -1942,6 +1943,43 @@ def test_via_loading_shared_library(self):
19421943 with self .assertRaises (ServerSelectionTimeoutError ):
19431944 no_mongocryptd_client .db .command ("ping" )
19441945
1946+ # https://github.com/mongodb/specifications/blob/master/source/client-side-encryption/tests/README.rst#20-bypass-creating-mongocryptd-client-when-shared-library-is-loaded
1947+ @unittest .skipUnless (os .environ .get ("TEST_CRYPT_SHARED" ), "crypt_shared lib is not installed" )
1948+ def test_client_via_loading_shared_library (self ):
1949+ connection_established = False
1950+
1951+ class Handler (socketserver .BaseRequestHandler ):
1952+ def handle (self ):
1953+ nonlocal connection_established
1954+ connection_established = True
1955+
1956+ server = socketserver .TCPServer (("localhost" , 47021 ), Handler )
1957+
1958+ def listener ():
1959+ with server :
1960+ server .serve_forever (poll_interval = 0.05 ) # Short poll timeout to speed up the test
1961+
1962+ listener_t = Thread (target = listener )
1963+ listener_t .start ()
1964+ create_key_vault (
1965+ client_context .client .keyvault .datakeys , json_data ("external" , "external-key.json" )
1966+ )
1967+ schemas = {"db.coll" : json_data ("external" , "external-schema.json" )}
1968+ opts = AutoEncryptionOpts (
1969+ kms_providers = {"local" : {"key" : LOCAL_MASTER_KEY }},
1970+ key_vault_namespace = "keyvault.datakeys" ,
1971+ schema_map = schemas ,
1972+ mongocryptd_uri = "mongodb://localhost:47021" ,
1973+ crypt_shared_lib_required = False ,
1974+ )
1975+ client_encrypted = rs_or_single_client (auto_encryption_opts = opts )
1976+ self .addCleanup (client_encrypted .close )
1977+ client_encrypted .db .coll .drop ()
1978+ client_encrypted .db .coll .insert_one ({"encrypted" : "test" })
1979+ server .shutdown ()
1980+ listener_t .join ()
1981+ self .assertFalse (connection_established , "a connection was established on port 47021" )
1982+
19451983
19461984# https://github.com/mongodb/specifications/tree/master/source/client-side-encryption/tests#kms-tls-tests
19471985class TestKmsTLSProse (EncryptionIntegrationTest ):
@@ -2112,10 +2150,7 @@ def test_04_kmip(self):
21122150class TestUniqueIndexOnKeyAltNamesProse (EncryptionIntegrationTest ):
21132151 def setUp (self ):
21142152 self .client = client_context .client
2115- self .client .keyvault .drop_collection ("datakeys" )
2116- self .client .keyvault .datakeys .create_index (
2117- "keyAltNames" , unique = True , partialFilterExpression = {"keyAltNames" : {"$exists" : True }}
2118- )
2153+ create_key_vault (self .client .keyvault .datakeys )
21192154 kms_providers_map = {"local" : {"key" : LOCAL_MASTER_KEY }}
21202155 self .client_encryption = ClientEncryption (
21212156 kms_providers_map , "keyvault.datakeys" , self .client , CodecOptions ()
0 commit comments