Skip to content

Commit 0f6805a

Browse files
committed
added warning on missing oauth layer in encryption decorator
warning tests
1 parent 66d8075 commit 0f6805a

File tree

3 files changed

+64
-1
lines changed

3 files changed

+64
-1
lines changed

client_encryption/api_encryption.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import json
22
from functools import wraps
3+
from warnings import warn
34
from client_encryption.field_level_encryption_config import FieldLevelEncryptionConfig
45
from client_encryption.session_key_params import SessionKeyParams
56
from client_encryption.field_level_encryption import encrypt_payload, decrypt_payload
@@ -34,6 +35,7 @@ def request_function(*args, **kwargs):
3435

3536
return response
3637

38+
request_function.__fle__ = True
3739
return request_function
3840

3941
def _encrypt_payload(self, headers, body):
@@ -88,3 +90,20 @@ def add_encryption_layer(api_client, encryption_conf_file):
8890

8991
api_encryption = ApiEncryption(encryption_conf_file)
9092
api_client.request = api_encryption.field_encryption(api_client.request)
93+
94+
__check_oauth(api_client) # warn the user if authentication layer is missing/not set
95+
96+
97+
def __check_oauth(api_client):
98+
try:
99+
oauth_layer = getattr(api_client.request, "__wrapped__").__oauth__
100+
if not oauth_layer or type(oauth_layer) is not bool:
101+
__oauth_warn()
102+
except AttributeError:
103+
__oauth_warn()
104+
105+
106+
def __oauth_warn():
107+
warn("No signing layer detected. Request will be only encrypted without being signed. "
108+
"Please refer to "
109+
"https://github.com/Mastercard/client-encryption-python#integrating-with-mastercard-oauth1-signer-module")

tests/test_api_encryption.py

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import unittest
2-
from unittest.mock import patch
2+
from unittest.mock import patch, Mock
33
import json
44
from tests.utils.api_encryption_test_utils import MockApiClient, MockService
55
from tests import get_config_for_test, TEST_CONFIG
@@ -328,3 +328,35 @@ def test_add_header_encryption_layer_get(self):
328328
self.assertIn("secret", response.data["data"])
329329
self.assertEqual([53, 84, 75], response.data["data"]["secret"])
330330
self.assertDictEqual({"Content-Type": "application/json"}, response.getheaders())
331+
332+
@patch('client_encryption.api_encryption.__oauth_warn')
333+
def test_add_encryption_layer_oauth_set(self, __oauth_warn):
334+
test_client = MockApiClient()
335+
to_test.add_encryption_layer(test_client, self._json_config)
336+
337+
assert not __oauth_warn.called
338+
339+
def test_add_encryption_layer_missing_oauth_layer_warning(self):
340+
test_client = Mock()
341+
342+
# no __oauth__ flag
343+
with self.assertWarns(UserWarning):
344+
to_test.add_encryption_layer(test_client, self._json_config)
345+
346+
def test_add_encryption_layer_wrong_oauth_layer_flag_warning(self):
347+
test_client = Mock()
348+
349+
# __oauth__ is None
350+
test_client.request.__oauth__ = None
351+
with self.assertWarns(UserWarning):
352+
to_test.add_encryption_layer(test_client, self._json_config)
353+
354+
# __oauth__ is False
355+
test_client.request.__oauth__ = False
356+
with self.assertWarns(UserWarning):
357+
to_test.add_encryption_layer(test_client, self._json_config)
358+
359+
# __oauth__ is not a boolean
360+
test_client.request.__oauth__ = 5
361+
with self.assertWarns(UserWarning):
362+
to_test.add_encryption_layer(test_client, self._json_config)

tests/utils/api_encryption_test_utils.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,22 @@
11
from unittest.mock import Mock
2+
from functools import wraps
23
import json
34
from tests import get_config_for_test
45
import client_encryption.field_level_encryption as encryption
56
import client_encryption.field_level_encryption_config as encryption_config
67
from client_encryption.session_key_params import SessionKeyParams
78

89

10+
def mock_signing(func):
11+
"""Decorator to mock signing layer and avoid warnings."""
12+
@wraps(func)
13+
def request_function(*args, **kwargs):
14+
return func(*args, **kwargs)
15+
16+
request_function.__oauth__ = True
17+
return request_function
18+
19+
920
class MockService(object):
1021

1122
def __init__(self, api_client=None):
@@ -41,6 +52,7 @@ def __init__(self, configuration=None, header_name=None, header_value=None,
4152
json_config["paths"]["$"]["toDecrypt"] = {"encryptedData": "data"}
4253
self._config = encryption_config.FieldLevelEncryptionConfig(json_config)
4354

55+
@mock_signing
4456
def request(self, method, url, query_params=None, headers=None,
4557
post_params=None, body=None, _preload_content=True,
4658
_request_timeout=None):

0 commit comments

Comments
 (0)