def decrypt_payload(payload, config, _params=None): """Decrypt some fields of a JSON payload using the given configuration.""" try: json_payload = payload if type(payload) is dict else json.loads( payload) for elem, target in config.paths["$"].to_decrypt.items(): try: node = get_node(json_payload, elem) cipher_text = decode_value( node.pop(config.encrypted_value_field_name), config.data_encoding) if not _params: try: encrypted_key = node.pop( config.encrypted_key_field_name) iv = node.pop(config.iv_field_name) except KeyError: raise EncryptionError( "Encryption field(s) missing in payload.") oaep_digest_algo = node.pop( config.oaep_padding_digest_algorithm_field_name, config.oaep_padding_digest_algorithm) _remove_fingerprint_from_node(node, config) params = SessionKeyParams(config, encrypted_key, iv, oaep_digest_algo) else: params = _params cleanup_node(json_payload, elem, target) try: update_node( json_payload, target, _decrypt_bytes(params.key, params.iv_spec, cipher_text)) except KeyError: raise EncryptionError("Field '" + target + "' not found!") except KeyError: pass # encrypted data node not found, nothing to decrypt return json_payload except json.JSONDecodeError: # not a json response - return it as is return payload except (IOError, ValueError, TypeError) as e: raise EncryptionError("Payload decryption failed!", e)
def test_update_node_primitive_type(self): sample_json = self.__get_sample_json() node = to_test.update_node(sample_json, "node1.node2", '"I am a primitive data type"') self.assertIsInstance(node["node1"]["node2"], str, "Not a string") self.assertDictEqual( {"node1": { "node2": "I am a primitive data type" }}, node) node = to_test.update_node(sample_json, "node1.node2", '4378462') self.assertIsInstance(node["node1"]["node2"], int, "Not an int") self.assertDictEqual({"node1": {"node2": 4378462}}, node) node = to_test.update_node(sample_json, "node1.node2", 'true') self.assertIsInstance(node["node1"]["node2"], bool, "Not a bool") self.assertDictEqual({"node1": {"node2": True}}, node)
def test_update_node(self): sample_json = self.__get_sample_json() node = to_test.update_node(sample_json, "$", '{"node3": {"brightness": 6}}') self.assertIsInstance(node, dict, "Not a dict") self.assertDictEqual({"node3": {"brightness": 6}}, node) sample_json = self.__get_sample_json() node = to_test.update_node(sample_json, "node1", '{"node3": {"brightness": 6}}') self.assertIsInstance(node, dict, "Not a dict") self.assertDictEqual( { "node1": { "node2": { "colour": "red", "shape": "circle", "position": { "lat": 1, "long": 3 } }, "node3": { "brightness": 6 } } }, node) sample_json = self.__get_sample_json() node = to_test.update_node(sample_json, "node1.node2", '{"node3": {"brightness": 6}}') self.assertIsInstance(node, dict, "Not a dict") self.assertDictEqual( { "node1": { "node2": { "colour": "red", "shape": "circle", "position": { "lat": 1, "long": 3 }, "node3": { "brightness": 6 } } } }, node) sample_json = self.__get_sample_json() node = to_test.update_node(sample_json, "node1.node2.new", '{"node3": {"brightness": 6}}') self.assertIsInstance(node, dict, "Not a dict") self.assertDictEqual( { "node1": { "node2": { "colour": "red", "shape": "circle", "position": { "lat": 1, "long": 3 }, "new": { "node3": { "brightness": 6 } } } } }, node)
def test_update_node_not_json(self): sample_json = self.__get_sample_json() node = to_test.update_node(sample_json, "node1.node2", "not a json string") self.assertIsInstance(node["node1"]["node2"], str, "not a json string")