88
99from django_mongodb_backend .indexes import SearchIndex
1010
11- from .fields import EmbeddedModelArrayField , EmbeddedModelField
11+ from .fields import EmbeddedModelField
1212from .gis .schema import GISSchemaEditor
1313from .query import wrap_database_errors
1414from .utils import OperationCollector , model_has_encrypted_fields
@@ -488,36 +488,6 @@ def _create_collection(self, model):
488488 # Unencrypted path
489489 db .create_collection (db_table )
490490
491- def _get_data_key (
492- self ,
493- client_encryption ,
494- key_vault_collection ,
495- create_data_keys ,
496- kms_provider ,
497- master_key ,
498- key_alt_name ,
499- ):
500- """Return an existing or newly-created data key ID for a field."""
501- if create_data_keys :
502- if not client_encryption :
503- raise ImproperlyConfigured ("client_encryption is not configured." )
504- return client_encryption .create_data_key (
505- kms_provider = kms_provider ,
506- master_key = master_key ,
507- key_alt_names = [key_alt_name ],
508- )
509- if key_vault_collection is None :
510- raise ImproperlyConfigured (
511- f"Encrypted field { key_alt_name } detected but no key vault configured"
512- )
513- key = key_vault_collection .find_one ({"keyAltNames" : key_alt_name })
514- if not key :
515- raise ValueError (
516- f"No key found in keyvault for keyAltName={ key_alt_name } . "
517- "Run with '--create-data-keys' to create missing keys."
518- )
519- return key ["_id" ]
520-
521491 def _get_encrypted_fields (
522492 self , model , create_data_keys = False , key_alt_name = None , path_prefix = None
523493 ):
@@ -532,26 +502,22 @@ def _get_encrypted_fields(
532502 path_prefix = path_prefix or ""
533503
534504 options = client ._options
535- auto_encryption_opts = getattr ( options , " auto_encryption_opts" , None )
505+ auto_encryption_opts = options . auto_encryption_opts
536506
537- key_vault_collection = None
538- if auto_encryption_opts :
539- key_vault_db , key_vault_coll = auto_encryption_opts ._key_vault_namespace .split ("." , 1 )
540- key_vault_collection = client [key_vault_db ][key_vault_coll ]
507+ key_vault_db , key_vault_coll = auto_encryption_opts ._key_vault_namespace .split ("." , 1 )
508+ key_vault_collection = client [key_vault_db ][key_vault_coll ]
541509
542510 kms_provider = router .kms_provider (model )
543511 master_key = connection .settings_dict .get ("KMS_CREDENTIALS" , {}).get (kms_provider )
544- client_encryption = getattr ( self .connection , " client_encryption" , None )
512+ client_encryption = self .connection . client_encryption
545513
546514 field_list = []
547515
548516 for field in fields :
549517 new_key_alt_name = f"{ key_alt_name } .{ field .column } "
550518 path = f"{ path_prefix } .{ field .column } " if path_prefix else field .column
551519
552- if isinstance (field , (EmbeddedModelField , EmbeddedModelArrayField )) and not getattr (
553- field , "encrypted" , False
554- ):
520+ if isinstance (field , EmbeddedModelField ) and not getattr (field , "encrypted" , False ):
555521 embedded_result = self ._get_encrypted_fields (
556522 field .embedded_model ,
557523 create_data_keys = create_data_keys ,
@@ -564,14 +530,15 @@ def _get_encrypted_fields(
564530
565531 if getattr (field , "encrypted" , False ):
566532 bson_type = field .db_type (connection )
567- data_key = self ._get_data_key (
568- client_encryption ,
569- key_vault_collection ,
570- create_data_keys ,
571- kms_provider ,
572- master_key ,
573- new_key_alt_name ,
574- )
533+ if create_data_keys :
534+ data_key = client_encryption .create_data_key (
535+ kms_provider = kms_provider ,
536+ master_key = master_key ,
537+ key_alt_names = [new_key_alt_name ],
538+ )
539+ else :
540+ key = key_vault_collection .find_one ({"keyAltNames" : new_key_alt_name })
541+ data_key = key ["_id" ]
575542 field_dict = {
576543 "bsonType" : bson_type ,
577544 "path" : path ,
0 commit comments