Skip to content

Commit b02caac

Browse files
authored
Merge pull request #8 from Mastercard/feature/decrypt_primitive_on_same_path
Added fix to decrypt primitive on same path
2 parents 033a854 + 9b5bdee commit b02caac

File tree

3 files changed

+50
-4
lines changed

3 files changed

+50
-4
lines changed

client_encryption/json_path_utils.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ def update_node(tree, path, node_str):
3737
else:
3838
current_node = tree
3939

40-
if to_set in current_node and type(current_node[to_set]) is dict:
40+
if to_set in current_node and type(current_node[to_set]) is dict and type(json.loads(node_str)) is dict:
4141
current_node[to_set].update(json.loads(node_str))
4242
else:
4343
current_node[to_set] = json.loads(node_str)

tests/test_field_level_encryption.py

+19
Original file line numberDiff line numberDiff line change
@@ -696,6 +696,25 @@ def test_decrypt_payload_when_root_as_in_and_out_path(self):
696696

697697
self.assertDictEqual({"field1": "value1", "field2": "value2"}, payload)
698698

699+
def test_DecryptPayload_ShouldOverwriteInputObject_WhenOutPathSameAsInPath_PrimitiveTypeData(self):
700+
self._config._paths["$"]._to_decrypt = {"data": "data"}
701+
self._config._data_encoding = Encoding.HEX
702+
703+
encrypted_payload = {
704+
"data": {
705+
"encryptedValue": "741a932b1ed546072384eef82f42c781",
706+
"encryptedKey": "0069fd96179b119cda77ec56be29b184d25c639af27c1f59b6b5e4de4e9bcba883d7933dda5cb6bb8888ea402cbd0f2cddf572b2baee2dd57c94081e4db318a0ded28ae96a80eff1ed421ca7bae6418fae3a1ce9744c02d4aa4dc53efa69b483a2e030919df30a87f95bb18595b4beb15b65eff3c1332c2d54100bd39ccb3ab7eeea648e0ccc473586002063a380dddd940aaa075b998047bd75a5cdb79142c150fa87e9ec2706569a5f7f06bc36c959f144cd22fbf5e690388902eca06d3cc4492d50b72ed5e96f66e6f03087931d3147401720fb512c0c3d5b89fa029fba157fbb1571a4712377b68bac4344dbf75535a1b40197a293eadc563ea035b62591",
707+
"iv": "f84e565520f5b75cbb6a13c97fdaea2b",
708+
"oaepHashingAlgo": "SHA256",
709+
"certFingerprint": "80810fc13a8319fcf0e2ec322c82a4c304b782cc3ce671176343cfe8160c2279",
710+
"keyFingerprint": "761b003c1eade3a5490e5000d37887baa5e6ec0e226c07706e599451fc032a79"
711+
}
712+
}
713+
714+
payload = to_test.decrypt_payload(encrypted_payload, self._config)
715+
716+
self.assertEqual("string", payload['data'])
717+
699718
def test_decrypt_payload_when_decryption_error_occurs(self):
700719
encrypted_payload = {
701720
"encryptedData": {

tests/test_json_path_utils.py

+30-3
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ def test_get_node_not_existing(self):
6969
# too many new nodes
7070
self.assertRaises(KeyError, to_test.get_node, sample_json, "node1.node2.newnode.newnode2", True)
7171

72-
def test_set_node(self):
72+
def test_update_node(self):
7373
sample_json = self.__get_sample_json()
7474
node = to_test.update_node(sample_json, "$", '{"node3": {"brightness": 6}}')
7575

@@ -138,18 +138,45 @@ def test_set_node(self):
138138
}
139139
}, node)
140140

141-
def test_set_node_empty_path(self):
141+
def test_update_node_empty_path(self):
142142
sample_json = self.__get_sample_json()
143143
self.assertRaises(ValueError, to_test.update_node, sample_json, None, '{"node3": {"brightness": 6}}')
144144

145145
sample_json = self.__get_sample_json()
146146
self.assertRaises(ValueError, to_test.update_node, sample_json, "", '{"node3": {"brightness": 6}}')
147147

148-
def test_set_node_not_json(self):
148+
def test_update_node_not_json(self):
149149
sample_json = self.__get_sample_json()
150150

151151
self.assertRaises(json.JSONDecodeError, to_test.update_node, sample_json, "node1.node2", "not a json string")
152152

153+
def test_update_node_primitive_type(self):
154+
sample_json = self.__get_sample_json()
155+
156+
node = to_test.update_node(sample_json, "node1.node2", '"I am a primitive data type"')
157+
158+
self.assertIsInstance(node["node1"]["node2"], str, "Not a string")
159+
self.assertDictEqual({"node1": {
160+
"node2": "I am a primitive data type"
161+
}
162+
}, node)
163+
164+
node = to_test.update_node(sample_json, "node1.node2", '4378462')
165+
166+
self.assertIsInstance(node["node1"]["node2"], int, "Not an int")
167+
self.assertDictEqual({"node1": {
168+
"node2": 4378462
169+
}
170+
}, node)
171+
172+
node = to_test.update_node(sample_json, "node1.node2", 'true')
173+
174+
self.assertIsInstance(node["node1"]["node2"], bool, "Not a bool")
175+
self.assertDictEqual({"node1": {
176+
"node2": True
177+
}
178+
}, node)
179+
153180
def test_pop_node(self):
154181
original_json = self.__get_sample_json()
155182

0 commit comments

Comments
 (0)