Skip to content

Commit e6e9a28

Browse files
committed
Respond with encryption error status enums
1 parent 846d65a commit e6e9a28

File tree

4 files changed

+20
-6
lines changed

4 files changed

+20
-6
lines changed

tests/test_client.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ def get_post_refresh_keys_response_with_key_inactive():
185185

186186
with self.assertRaises(EncryptionError) as context:
187187
client.encrypt(example_uid)
188-
self.assertEqual("No Keyset Key Found", str(context.exception))
188+
self.assertEqual(EncryptionStatus.NOT_AUTHORIZED_FOR_MASTER_KEY.value, str(context.exception))
189189

190190
def test_encrypt_key_expired(self, mock_refresh_keys_util):
191191
def get_post_refresh_keys_response_with_key_expired():
@@ -199,4 +199,4 @@ def get_post_refresh_keys_response_with_key_expired():
199199

200200
with self.assertRaises(EncryptionError) as context:
201201
client.encrypt(example_uid)
202-
self.assertEqual("No Keyset Key Found", str(context.exception))
202+
self.assertEqual(EncryptionStatus.KEYS_NOT_SYNCED.value, str(context.exception))

tests/test_sharing_client.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -283,15 +283,15 @@ def test_expiry_in_token_matches_expiry_in_response(self): # ExpiryInTokenMatch
283283

284284
def test_encrypt_key_expired(self): #EncryptKeyExpired
285285
expired_key = EncryptionKey(site_key_id, site_id, created=now, activates=now, expires=YESTERDAY, secret=site_secret)
286-
refresh_response = self._client._refresh_json(keyset_to_json_for_sharing([expired_key]))
286+
refresh_response = self._client._refresh_json(keyset_to_json_for_sharing([master_key, expired_key]))
287287
self.assertTrue(refresh_response.success)
288288

289289
result = self._client.encrypt_raw_uid_into_token(example_uid)
290290
self.assertEqual(result.status, EncryptionStatus.NOT_AUTHORIZED_FOR_KEY)
291291

292292
def test_encrypt_key_inactive(self): #EncryptKeyInactive
293293
inactive_key = EncryptionKey(site_key_id, site_id, now, TOMORROW, IN_2_DAYS, site_secret)
294-
refresh_response = self._client._refresh_json(keyset_to_json_for_sharing([inactive_key]))
294+
refresh_response = self._client._refresh_json(keyset_to_json_for_sharing([master_key, inactive_key]))
295295
self.assertTrue(refresh_response.success)
296296

297297
result = self._client.encrypt_raw_uid_into_token(example_uid)

uid2_client/encryption.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -318,9 +318,15 @@ def encrypt(uid2, identity_scope, keys, keyset_id=None, **kwargs):
318318
now = dt.datetime.now(tz=timezone.utc)
319319

320320
ad_token_version = AdvertisingTokenVersion.ADVERTISING_TOKEN_V4
321+
if keys is None:
322+
return EncryptionDataResponse.make_error(EncryptionStatus.NOT_INITIALIZED)
323+
if not keys.valid(now):
324+
return EncryptionDataResponse.make_error(EncryptionStatus.KEYS_NOT_SYNCED)
321325

322326
key = keys.get_default_keyset_key(now) if keyset_id is None else keys.get_by_keyset_key(keyset_id, now)
323327
master_key = keys.get_by_keyset_key(keys.get_master_keyset_id(), now)
328+
if master_key is None:
329+
return EncryptionDataResponse.make_error(EncryptionStatus.NOT_AUTHORIZED_FOR_MASTER_KEY)
324330

325331
token_expiry = now + dt.timedelta(days=30) if keys.get_token_expiry_seconds() is None \
326332
else now + dt.timedelta(seconds=int(keys.get_token_expiry_seconds()))
@@ -334,7 +340,11 @@ def encrypt(uid2, identity_scope, keys, keyset_id=None, **kwargs):
334340
return EncryptionDataResponse.make_error(EncryptionStatus.NOT_AUTHORIZED_FOR_KEY)
335341
if identity_scope is None:
336342
identity_scope = keys.get_identity_scope()
337-
return _encrypt_token(uid2, identity_scope, master_key, key, site_id, now, token_expiry, ad_token_version)
343+
try:
344+
return _encrypt_token(uid2, identity_scope, master_key, key, site_id, now, token_expiry, ad_token_version)
345+
except Exception:
346+
return EncryptionDataResponse.make_error(EncryptionStatus.ENCRYPTION_FAILURE)
347+
338348

339349

340350
# DEPRECATED, DO NOT CALL

uid2_client/encryption_status.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,9 @@
22

33

44
class EncryptionStatus(Enum):
5-
SUCCESS = "success"
5+
ENCRYPTION_FAILURE = "Failed to encrypt"
6+
KEYS_NOT_SYNCED = "no keys available or all keys have expired; refresh the latest keys from UID2 service"
67
NOT_AUTHORIZED_FOR_KEY = "No Keyset Key Found"
8+
NOT_AUTHORIZED_FOR_MASTER_KEY = "not authorized for master key"
9+
NOT_INITIALIZED = "keys not initialized"
10+
SUCCESS = "success"

0 commit comments

Comments
 (0)