| OLD | NEW |
| (Empty) |
| 1 # Copyright 2013 The Chromium Authors. All rights reserved. | |
| 2 # Use of this source code is governed by a BSD-style license that can be | |
| 3 # found in the LICENSE file. | |
| 4 | |
| 5 import _winreg | |
| 6 | |
| 7 import verifier | |
| 8 | |
| 9 | |
| 10 class RegistryVerifier(verifier.Verifier): | |
| 11 """Verifies that the current registry matches the specified criteria.""" | |
| 12 | |
| 13 def _RootKeyConstant(self, root_key): | |
| 14 """Converts a root registry key string into a _winreg.HKEY_* constant.""" | |
| 15 root_key_mapping = { | |
| 16 'HKEY_CLASSES_ROOT': _winreg.HKEY_CLASSES_ROOT, | |
| 17 'HKEY_CURRENT_USER': _winreg.HKEY_CURRENT_USER, | |
| 18 'HKEY_LOCAL_MACHINE': _winreg.HKEY_LOCAL_MACHINE, | |
| 19 'HKEY_USERS': _winreg.HKEY_USERS, | |
| 20 } | |
| 21 if root_key not in root_key_mapping: | |
| 22 raise KeyError("Unknown root registry key '%s'" % root_key) | |
| 23 return root_key_mapping[root_key] | |
| 24 | |
| 25 def _ValueTypeConstant(self, value_type): | |
| 26 """Converts a registry value type string into a _winreg.REG_* constant.""" | |
| 27 value_type_mapping = { | |
| 28 'BINARY': _winreg.REG_BINARY, | |
| 29 'DWORD': _winreg.REG_DWORD, | |
| 30 'DWORD_LITTLE_ENDIAN': _winreg.REG_DWORD_LITTLE_ENDIAN, | |
| 31 'DWORD_BIG_ENDIAN': _winreg.REG_DWORD_BIG_ENDIAN, | |
| 32 'EXPAND_SZ': _winreg.REG_EXPAND_SZ, | |
| 33 'LINK': _winreg.REG_LINK, | |
| 34 'MULTI_SZ': _winreg.REG_MULTI_SZ, | |
| 35 'NONE': _winreg.REG_NONE, | |
| 36 'SZ': _winreg.REG_SZ, | |
| 37 } | |
| 38 if value_type not in value_type_mapping: | |
| 39 raise KeyError("Unknown registry value type '%s'" % value_type) | |
| 40 return value_type_mapping[value_type] | |
| 41 | |
| 42 def _VerifyExpectation(self, expectation_name, expectation, | |
| 43 variable_expander): | |
| 44 """Overridden from verifier.Verifier. | |
| 45 | |
| 46 Verifies a registry key according to the |expectation|. | |
| 47 | |
| 48 Args: | |
| 49 expectation_name: The registry key being verified. It is expanded using | |
| 50 Expand. | |
| 51 expectation: A dictionary with the following keys and values: | |
| 52 'exists' a string indicating whether the registry key's existence is | |
| 53 'required', 'optional', or 'forbidden'. Values are not checked if | |
| 54 an 'optional' key is not present in the registry. | |
| 55 'values' (optional) a dictionary where each key is a registry value | |
| 56 and its associated value is a dictionary with the following key | |
| 57 and values: | |
| 58 'type' (optional) a string indicating the type of the registry | |
| 59 value. If not present, the corresponding value is expected | |
| 60 to be absent in the registry. | |
| 61 'data' the associated data of the registry value if 'type' is | |
| 62 specified. If it is a string, it is expanded using Expand. | |
| 63 variable_expander: A VariableExpander object. | |
| 64 """ | |
| 65 key = variable_expander.Expand(expectation_name) | |
| 66 root_key, sub_key = key.split('\\', 1) | |
| 67 try: | |
| 68 # Query the Windows registry for the registry key. It will throw a | |
| 69 # WindowsError if the key doesn't exist. | |
| 70 key_handle = _winreg.OpenKey(self._RootKeyConstant(root_key), sub_key, 0, | |
| 71 _winreg.KEY_QUERY_VALUE) | |
| 72 except WindowsError: | |
| 73 # Key doesn't exist. See that it matches the expectation. | |
| 74 assert expectation['exists'] != 'required', ('Registry key %s is ' | |
| 75 'missing' % key) | |
| 76 # Values are not checked if the missing key's existence is optional. | |
| 77 return | |
| 78 # The key exists, see that it matches the expectation. | |
| 79 assert expectation['exists'] != 'forbidden', ('Registry key %s exists' % | |
| 80 key) | |
| 81 | |
| 82 # Verify the expected values. | |
| 83 if 'values' not in expectation: | |
| 84 return | |
| 85 for value, value_expectation in expectation['values'].iteritems(): | |
| 86 # Query the value. It will throw a WindowsError if the value doesn't | |
| 87 # exist. | |
| 88 try: | |
| 89 data, value_type = _winreg.QueryValueEx(key_handle, value) | |
| 90 except WindowsError: | |
| 91 # The value does not exist. See that this matches the expectation. | |
| 92 assert 'type' not in value_expectation, ('Value %s of registry key %s ' | |
| 93 'is missing' % (value, key)) | |
| 94 continue | |
| 95 | |
| 96 assert 'type' in value_expectation, ('Value %s of registry key %s exists ' | |
| 97 'with value %s' % (value, key, data)) | |
| 98 | |
| 99 # Verify the type of the value. | |
| 100 expected_value_type = value_expectation['type'] | |
| 101 assert self._ValueTypeConstant(expected_value_type) == value_type, \ | |
| 102 "Value '%s' of registry key %s has unexpected type '%s'" % ( | |
| 103 value, key, expected_value_type) | |
| 104 | |
| 105 # Verify the associated data of the value. | |
| 106 expected_data = value_expectation['data'] | |
| 107 if isinstance(expected_data, basestring): | |
| 108 expected_data = variable_expander.Expand(expected_data) | |
| 109 assert expected_data == data, \ | |
| 110 ("Value '%s' of registry key %s has unexpected data.\n" | |
| 111 " Expected: %s\n" | |
| 112 " Actual: %s" % (value, key, expected_data, data)) | |
| OLD | NEW |