Skip to content

Commit 497ef2a

Browse files
authored
DGS-19840 Ensure use of DEK object is thread-safe (#1930)
1 parent 3f40f19 commit 497ef2a

File tree

1 file changed

+13
-6
lines changed

1 file changed

+13
-6
lines changed

src/confluent_kafka/schema_registry/rules/encryption/dek_registry/dek_registry_client.py

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#
1818

1919
import base64
20+
import threading
2021
import urllib.parse
2122
from enum import Enum
2223
from threading import Lock
@@ -230,26 +231,32 @@ class Dek:
230231
key_material_bytes: Optional[bytes] = _attrs_field(init=False, eq=False, order=False, default=None)
231232
ts: Optional[int] = _attrs_field(default=None)
232233
deleted: Optional[bool] = _attrs_field(default=None)
234+
_lock: threading.Lock = _attrs_field(factory=threading.Lock, init=False, eq=False, order=False)
233235

234236
def get_encrypted_key_material_bytes(self) -> Optional[bytes]:
235237
if self.encrypted_key_material is None:
236238
return None
237239
if self.encrypted_key_material_bytes is None:
238-
self.encrypted_key_material_bytes = base64.b64decode(self.encrypted_key_material)
240+
with self._lock:
241+
if self.encrypted_key_material_bytes is None:
242+
self.encrypted_key_material_bytes = base64.b64decode(self.encrypted_key_material)
239243
return self.encrypted_key_material_bytes
240244

241245
def get_key_material_bytes(self) -> Optional[bytes]:
242246
if self.key_material is None:
243247
return None
244248
if self.key_material_bytes is None:
245-
self.key_material_bytes = base64.b64decode(self.key_material)
249+
with self._lock:
250+
if self.key_material_bytes is None:
251+
self.key_material_bytes = base64.b64decode(self.key_material)
246252
return self.key_material_bytes
247253

248254
def set_key_material(self, key_material_bytes: bytes):
249-
if key_material_bytes is None:
250-
self.key_material = None
251-
else:
252-
self.key_material = base64.b64encode(key_material_bytes).decode("utf-8")
255+
with self._lock:
256+
if key_material_bytes is None:
257+
self.key_material = None
258+
else:
259+
self.key_material = base64.b64encode(key_material_bytes).decode("utf-8")
253260

254261
def to_dict(self) -> Dict[str, Any]:
255262
kek_name = self.kek_name

0 commit comments

Comments
 (0)