Skip to content

Commit 57f757b

Browse files
authored
PYTHON-3446 Do not connect to mongocryptd if shared library is loaded (#1136)
1 parent 24170dd commit 57f757b

File tree

1 file changed

+48
-13
lines changed

1 file changed

+48
-13
lines changed

test/test_encryption.py

Lines changed: 48 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,13 @@
1919
import os
2020
import re
2121
import socket
22+
import socketserver
2223
import ssl
2324
import sys
2425
import textwrap
2526
import traceback
2627
import uuid
28+
from threading import Thread
2729
from typing import Any, Dict, Mapping
2830

2931
from 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
19471985
class TestKmsTLSProse(EncryptionIntegrationTest):
@@ -2112,10 +2150,7 @@ def test_04_kmip(self):
21122150
class 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

Comments
 (0)