@@ -52,7 +52,7 @@ def validate_required_keys(input_dict, required_keys, dict_name, filename):
5252def validate_manifest_key_types (manifest , filename ):
5353 """Validation of manifest key types."""
5454
55- # manifest keys and their known types. Omitted keys are left unvalidated .
55+ # manifest keys and their known types. Omitted keys are left un-validated .
5656 # Last updated 2021-12-03.
5757 key_types = {
5858 "pfm_conditionals" : list ,
@@ -164,6 +164,23 @@ def validate_list_item_types(manifest, filename):
164164 return passed
165165
166166
167+ def validate_required_subkeys (subkey , req_keys , filename ):
168+ """Ensure specific keys are defined in subkeys."""
169+ passed = True
170+
171+ for subsubkey in subkey .get ("pfm_subkeys" , []):
172+ if subsubkey .get ("pfm_name" ):
173+ display_name = subsubkey ["pfm_name" ]
174+ elif subkey .get ("pfm_name" ):
175+ display_name = subkey ["pfm_name" ] + " subkey"
176+ else :
177+ display_name = "<unnamed key> subkey"
178+ if not validate_required_keys (subsubkey , req_keys , display_name , filename ):
179+ passed = False
180+
181+ return passed
182+
183+
167184def validate_pfm_type_strings (subkey , filename ):
168185 """Ensure subkey pfm_type strings are as expected."""
169186 passed = True
@@ -326,11 +343,19 @@ def validate_subkeys(subkeys, filename):
326343
327344 for subkey in subkeys :
328345
329- # Check for presence of required keys.
330- required_keys = ("pfm_type" ,)
331- if not validate_required_keys (
332- subkey , required_keys , subkey .get ("pfm_name" , "<unnamed key>" ), filename
333- ):
346+ # Check for presence of required subkeys
347+ # (Not calling validate_required_keys() directly because the output would not be
348+ # specific enough to indicate *where* in the manifest the problem exists.)
349+ # Example of validate_required_keys() output:
350+ # menu.nomad.NoMADPro.plist: <unnamed key> missing required key pfm_type
351+ # Example of validate_required_subkeys() output:
352+ # menu.nomad.NoMADPro.plist: ChangePasswordItem subkey missing required key pfm_type
353+ if subkey ["pfm_type" ] != "array" :
354+ # pfm_name is required only if the pfm_type is not array
355+ required_keys = ("pfm_type" , "pfm_name" )
356+ else :
357+ required_keys = ("pfm_type" ,)
358+ if not validate_required_subkeys (subkey , required_keys , filename ):
334359 passed = False
335360 break # No need to continue checking this list of subkeys
336361
0 commit comments