19
19
import os
20
20
import re
21
21
import socket
22
+ import socketserver
22
23
import ssl
23
24
import sys
24
25
import textwrap
25
26
import traceback
26
27
import uuid
28
+ from threading import Thread
27
29
from typing import Any , Dict , Mapping
28
30
29
31
from pymongo .collection import Collection
@@ -730,6 +732,11 @@ def create_key_vault(vault, *data_keys):
730
732
vault .drop ()
731
733
if data_keys :
732
734
vault .insert_many (data_keys )
735
+ vault .create_index (
736
+ "keyAltNames" ,
737
+ unique = True ,
738
+ partialFilterExpression = {"keyAltNames" : {"$exists" : True }},
739
+ )
733
740
return vault
734
741
735
742
@@ -1786,10 +1793,7 @@ class TestDecryptProse(EncryptionIntegrationTest):
1786
1793
def setUp (self ):
1787
1794
self .client = client_context .client
1788
1795
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 )
1793
1797
kms_providers_map = {"local" : {"key" : LOCAL_MASTER_KEY }}
1794
1798
1795
1799
self .client_encryption = ClientEncryption (
@@ -1912,12 +1916,9 @@ def test_bypassAutoEncryption(self):
1912
1916
1913
1917
@unittest .skipUnless (os .environ .get ("TEST_CRYPT_SHARED" ), "crypt_shared lib is not installed" )
1914
1918
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" )
1919
1921
)
1920
- key_vault .insert_one (json_data ("external" , "external-key.json" ))
1921
1922
schemas = {"db.coll" : json_data ("external" , "external-schema.json" )}
1922
1923
opts = AutoEncryptionOpts (
1923
1924
kms_providers = {"local" : {"key" : LOCAL_MASTER_KEY }},
@@ -1942,6 +1943,43 @@ def test_via_loading_shared_library(self):
1942
1943
with self .assertRaises (ServerSelectionTimeoutError ):
1943
1944
no_mongocryptd_client .db .command ("ping" )
1944
1945
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
+
1945
1983
1946
1984
# https://github.com/mongodb/specifications/tree/master/source/client-side-encryption/tests#kms-tls-tests
1947
1985
class TestKmsTLSProse (EncryptionIntegrationTest ):
@@ -2112,10 +2150,7 @@ def test_04_kmip(self):
2112
2150
class TestUniqueIndexOnKeyAltNamesProse (EncryptionIntegrationTest ):
2113
2151
def setUp (self ):
2114
2152
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 )
2119
2154
kms_providers_map = {"local" : {"key" : LOCAL_MASTER_KEY }}
2120
2155
self .client_encryption = ClientEncryption (
2121
2156
kms_providers_map , "keyvault.datakeys" , self .client , CodecOptions ()
0 commit comments