Skip to content

Commit f0f7645

Browse files
committed
fixed header driven encryption
fixed tests
1 parent 0fcfba4 commit f0f7645

File tree

4 files changed

+49
-49
lines changed

4 files changed

+49
-49
lines changed

client_encryption/api_encryption.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ def call_api_function(*args, **kwargs):
2525
"""Wrap call_api and add field encryption layer to it."""
2626

2727
in_body = kwargs.get("body", None)
28-
kwargs["body"] = self._encrypt_payload(kwargs.get("headers", None), in_body) if in_body else in_body
28+
kwargs["body"] = self._encrypt_payload(kwargs.get("header_params", None), in_body) if in_body else in_body
2929
kwargs["_preload_content"] = False
3030

3131
response = func(*args, **kwargs)
@@ -95,9 +95,7 @@ def add_encryption_layer(api_client, encryption_conf_file):
9595

9696
def __check_oauth(api_client):
9797
try:
98-
oauth_layer = getattr(api_client.request, "__wrapped__").__oauth__
99-
if not oauth_layer or type(oauth_layer) is not bool:
100-
__oauth_warn()
98+
api_client.request.__wrapped__
10199
except AttributeError:
102100
__oauth_warn()
103101

client_encryption/field_level_encryption.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,10 @@ def decrypt_payload(payload, config, _params=None):
5353
if type(payload) is dict:
5454
json_payload = payload
5555
else:
56-
json_payload = json.loads(payload)
56+
try:
57+
json_payload = json.loads(payload)
58+
except json.JSONDecodeError: # not a json response - return it as is
59+
return payload
5760

5861
for elem, target in config.paths["$"].to_decrypt.items():
5962
try:
@@ -90,7 +93,7 @@ def decrypt_payload(payload, config, _params=None):
9093
return json_payload
9194

9295
except (IOError, ValueError, TypeError) as e:
93-
raise EncryptionError("Payload encryption failed!", e)
96+
raise EncryptionError("Payload decryption failed!", e)
9497

9598

9699
def _encrypt_value(_key, iv, node_str):

tests/test_api_encryption.py

Lines changed: 23 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -170,10 +170,9 @@ def test_add_encryption_layer_post(self):
170170
}
171171
}, headers={"Content-Type": "application/json"})
172172

173-
self.assertIn("data", response.data)
174-
self.assertIn("secret", response.data["data"])
175-
self.assertEqual(secret2-secret1, response.data["data"]["secret"])
176-
self.assertDictEqual({"Content-Type": "application/json"}, response.getheaders())
173+
self.assertIn("data", response)
174+
self.assertIn("secret", response["data"])
175+
self.assertEqual(secret2-secret1, response["data"]["secret"])
177176

178177
def test_add_encryption_layer_delete(self):
179178
secret1 = 394
@@ -187,18 +186,16 @@ def test_add_encryption_layer_delete(self):
187186
}
188187
}, headers={"Content-Type": "application/json"})
189188

190-
self.assertEqual("OK", response.data)
191-
self.assertDictEqual({"Content-Type": "application/json"}, response.getheaders())
189+
self.assertEqual("OK", response)
192190

193191
def test_add_encryption_layer_get(self):
194192
test_client = MockApiClient()
195193
to_test.add_encryption_layer(test_client, self._json_config)
196194
response = MockService(test_client).do_something_get(headers={"Content-Type": "application/json"})
197195

198-
self.assertIn("data", response.data)
199-
self.assertIn("secret", response.data["data"])
200-
self.assertEqual([53, 84, 75], response.data["data"]["secret"])
201-
self.assertDictEqual({"Content-Type": "application/json"}, response.getheaders())
196+
self.assertIn("data", response)
197+
self.assertIn("secret", response["data"])
198+
self.assertEqual([53, 84, 75], response["data"]["secret"])
202199

203200
def test_add_header_encryption_layer_post_no_oaep_algo(self):
204201
self._set_header_params_config()
@@ -216,10 +213,9 @@ def test_add_header_encryption_layer_post_no_oaep_algo(self):
216213
"encryptedData": {}
217214
}, headers={"Content-Type": "application/json"})
218215

219-
self.assertIn("data", response.data)
220-
self.assertIn("secret", response.data["data"])
221-
self.assertEqual(secret2-secret1, response.data["data"]["secret"])
222-
self.assertDictEqual({"Content-Type": "application/json", "x-oaep-digest": "SHA256"}, response.getheaders())
216+
self.assertIn("data", response)
217+
self.assertIn("secret", response["data"])
218+
self.assertEqual(secret2-secret1, response["data"]["secret"])
223219

224220
def test_add_header_encryption_layer_post_no_cert_fingerprint(self):
225221
self._set_header_params_config()
@@ -237,10 +233,9 @@ def test_add_header_encryption_layer_post_no_cert_fingerprint(self):
237233
"encryptedData": {}
238234
}, headers={"Content-Type": "application/json"})
239235

240-
self.assertIn("data", response.data)
241-
self.assertIn("secret", response.data["data"])
242-
self.assertEqual(secret2-secret1, response.data["data"]["secret"])
243-
self.assertDictEqual({"Content-Type": "application/json"}, response.getheaders())
236+
self.assertIn("data", response)
237+
self.assertIn("secret", response["data"])
238+
self.assertEqual(secret2-secret1, response["data"]["secret"])
244239

245240
def test_add_header_encryption_layer_post_no_pubkey_fingerprint(self):
246241
self._set_header_params_config()
@@ -258,10 +253,9 @@ def test_add_header_encryption_layer_post_no_pubkey_fingerprint(self):
258253
"encryptedData": {}
259254
}, headers={"Content-Type": "application/json"})
260255

261-
self.assertIn("data", response.data)
262-
self.assertIn("secret", response.data["data"])
263-
self.assertEqual(secret2-secret1, response.data["data"]["secret"])
264-
self.assertDictEqual({"Content-Type": "application/json"}, response.getheaders())
256+
self.assertIn("data", response)
257+
self.assertIn("secret", response["data"])
258+
self.assertEqual(secret2-secret1, response["data"]["secret"])
265259

266260
def test_add_header_encryption_layer_no_iv(self):
267261
self._set_header_params_config()
@@ -294,10 +288,9 @@ def test_add_header_encryption_layer_post(self):
294288
"encryptedData": {}
295289
}, headers={"Content-Type": "application/json"})
296290

297-
self.assertIn("data", response.data)
298-
self.assertIn("secret", response.data["data"])
299-
self.assertEqual(secret2-secret1, response.data["data"]["secret"])
300-
self.assertDictEqual({"Content-Type": "application/json"}, response.getheaders())
291+
self.assertIn("data", response)
292+
self.assertIn("secret", response["data"])
293+
self.assertEqual(secret2-secret1, response["data"]["secret"])
301294

302295
def test_add_header_encryption_layer_delete(self):
303296
self._set_header_params_config()
@@ -314,8 +307,7 @@ def test_add_header_encryption_layer_delete(self):
314307
"encryptedData": {}
315308
}, headers={"Content-Type": "application/json"})
316309

317-
self.assertEqual("OK", response.data)
318-
self.assertDictEqual({"Content-Type": "application/json"}, response.getheaders())
310+
self.assertEqual("OK", response)
319311

320312
def test_add_header_encryption_layer_get(self):
321313
self._set_header_params_config()
@@ -324,10 +316,9 @@ def test_add_header_encryption_layer_get(self):
324316
to_test.add_encryption_layer(test_client, self._json_config)
325317
response = MockService(test_client).do_something_get_use_headers(headers={"Content-Type": "application/json"})
326318

327-
self.assertIn("data", response.data)
328-
self.assertIn("secret", response.data["data"])
329-
self.assertEqual([53, 84, 75], response.data["data"]["secret"])
330-
self.assertDictEqual({"Content-Type": "application/json"}, response.getheaders())
319+
self.assertIn("data", response)
320+
self.assertIn("secret", response["data"])
321+
self.assertEqual([53, 84, 75], response["data"]["secret"])
331322

332323
@patch('client_encryption.api_encryption.__oauth_warn')
333324
def test_add_encryption_layer_oauth_set(self, __oauth_warn):

tests/utils/api_encryption_test_utils.py

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -25,22 +25,22 @@ def __init__(self, api_client=None):
2525
self.api_client = api_client
2626

2727
def do_something_get(self, **kwargs):
28-
return self.api_client.request("GET", "localhost/testservice", headers=kwargs["headers"])
28+
return self.api_client.call_api("testservice", "GET", header_params=kwargs["headers"])
2929

3030
def do_something_post(self, **kwargs):
31-
return self.api_client.request("POST", "localhost/testservice", headers=kwargs["headers"], body=kwargs["body"])
31+
return self.api_client.call_api("testservice", "POST", header_params=kwargs["headers"], body=kwargs["body"])
3232

3333
def do_something_delete(self, **kwargs):
34-
return self.api_client.request("DELETE", "localhost/testservice", headers=kwargs["headers"], body=kwargs["body"])
34+
return self.api_client.call_api("testservice", "DELETE", header_params=kwargs["headers"], body=kwargs["body"])
3535

3636
def do_something_get_use_headers(self, **kwargs):
37-
return self.api_client.request("GET", "localhost/testservice/headers", headers=kwargs["headers"])
37+
return self.api_client.call_api("testservice/headers", "GET", header_params=kwargs["headers"])
3838

3939
def do_something_post_use_headers(self, **kwargs):
40-
return self.api_client.request("POST", "localhost/testservice/headers", headers=kwargs["headers"], body=kwargs["body"])
40+
return self.api_client.call_api("testservice/headers", "POST", header_params=kwargs["headers"], body=kwargs["body"])
4141

4242
def do_something_delete_use_headers(self, **kwargs):
43-
return self.api_client.request("DELETE", "localhost/testservice/headers", headers=kwargs["headers"], body=kwargs["body"])
43+
return self.api_client.call_api("testservice/headers", "DELETE", header_params=kwargs["headers"], body=kwargs["body"])
4444

4545

4646
class MockApiClient(object):
@@ -56,13 +56,21 @@ def __init__(self, configuration=None, header_name=None, header_value=None,
5656
def request(self, method, url, query_params=None, headers=None,
5757
post_params=None, body=None, _preload_content=True,
5858
_request_timeout=None):
59+
pass
60+
61+
def call_api(self, resource_path, method,
62+
path_params=None, query_params=None, header_params=None,
63+
body=None, post_params=None, files=None,
64+
response_type=None, auth_settings=None, async_req=None,
65+
_return_http_data_only=None, collection_formats=None,
66+
_preload_content=True, _request_timeout=None):
5967
check = -1
6068

6169
if body:
62-
if url == "localhost/testservice/headers":
63-
iv = headers["x-iv"]
64-
encrypted_key = headers["x-key"]
65-
oaep_digest_algo = headers["x-oaep-digest"] if "x-oaep-digest" in headers else None
70+
if resource_path == "testservice/headers":
71+
iv = header_params["x-iv"]
72+
encrypted_key = header_params["x-key"]
73+
oaep_digest_algo = header_params["x-oaep-digest"] if "x-oaep-digest" in header_params else None
6674

6775
params = SessionKeyParams(self._config, encrypted_key, iv, oaep_digest_algo)
6876
else:
@@ -74,7 +82,7 @@ def request(self, method, url, query_params=None, headers=None,
7482
else:
7583
res = {"data": {"secret": [53, 84, 75]}}
7684

77-
if url == "localhost/testservice/headers" and method in ["GET", "POST", "PUT"]:
85+
if resource_path == "testservice/headers" and method in ["GET", "POST", "PUT"]:
7886
params = SessionKeyParams.generate(self._config)
7987
json_resp = encryption.encrypt_payload(res, self._config, params)
8088

0 commit comments

Comments
 (0)