Skip to content

Commit 8e7baeb

Browse files
committed
add authorization
1 parent 8d87994 commit 8e7baeb

File tree

6 files changed

+44
-11
lines changed

6 files changed

+44
-11
lines changed

lambdas/filenameprocessor/src/constants.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,3 +62,9 @@ class AuditTableKeys(StrEnum):
6262
TIMESTAMP = "timestamp"
6363
EXPIRES_AT = "expires_at"
6464
ERROR_DETAILS = "error_details"
65+
66+
67+
class Operation(str):
68+
CREATE = "C"
69+
UPDATE = "U"
70+
DELETE = "D"

lambdas/filenameprocessor/src/file_name_processor.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
ERROR_TYPE_TO_STATUS_CODE_MAP,
2525
EXPECTED_BUCKET_OWNER_ACCOUNT,
2626
EXTENDED_ATTRIBUTES_FILE_PREFIX,
27-
EXTENDED_ATTRIBUTES_VACC_TYPE,
2827
SOURCE_BUCKET_NAME,
2928
FileNotProcessedReason,
3029
FileStatus,
@@ -37,7 +36,7 @@
3736
VaccineTypePermissionsError,
3837
)
3938
from send_sqs_message import make_and_send_sqs_message
40-
from supplier_permissions import validate_vaccine_type_permissions
39+
from supplier_permissions import validate_permissions_for_extended_attributes_files, validate_vaccine_type_permissions
4140
from utils_for_filenameprocessor import get_creation_and_expiry_times
4241

4342

@@ -108,8 +107,8 @@ def handle_unexpected_bucket_name(bucket_name: str, file_key: str) -> dict:
108107
config and overarching design"""
109108
try:
110109
if file_key.startswith(EXTENDED_ATTRIBUTES_FILE_PREFIX):
111-
organization_code = validate_extended_attributes_file_key(file_key)
112-
extended_attribute_identifier = f"{organization_code}_{EXTENDED_ATTRIBUTES_VACC_TYPE}"
110+
vaccine_type, supplier = validate_extended_attributes_file_key(file_key)
111+
extended_attribute_identifier = f"{supplier}_{vaccine_type}"
113112
logger.error(
114113
"Unable to process file %s due to unexpected bucket name %s",
115114
file_key,
@@ -250,8 +249,8 @@ def handle_extended_attributes_file(
250249

251250
extended_attribute_identifier = None
252251
try:
253-
organization_code = validate_extended_attributes_file_key(file_key)
254-
extended_attribute_identifier = f"{organization_code}_{EXTENDED_ATTRIBUTES_VACC_TYPE}"
252+
vaccine_type, supplier = validate_extended_attributes_file_key(file_key)
253+
extended_attribute_identifier = validate_permissions_for_extended_attributes_files(vaccine_type, supplier)
255254

256255
upsert_audit_table(
257256
message_id,

lambdas/filenameprocessor/src/file_validation.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from datetime import datetime
44
from re import match
55

6-
from constants import EXTENDED_ATTRIBUTES_FILE_PREFIX, VALID_EA_VERSIONS, VALID_VERSIONS
6+
from constants import EXTENDED_ATTRIBUTES_FILE_PREFIX, EXTENDED_ATTRIBUTES_VACC_TYPE, VALID_EA_VERSIONS, VALID_VERSIONS
77
from elasticache import (
88
get_supplier_system_from_cache,
99
get_valid_vaccine_types_from_cache,
@@ -52,7 +52,7 @@ def validate_extended_attributes_file_key(file_key: str) -> str:
5252
timestamp = file_key_parts_without_extension[6]
5353
supplier = get_supplier_system_from_cache(organization_code)
5454
valid_vaccine_types = get_valid_vaccine_types_from_cache()
55-
vaccine_type = "COVID"
55+
vaccine_type = EXTENDED_ATTRIBUTES_VACC_TYPE
5656

5757
if not (
5858
vaccine_type in valid_vaccine_types
@@ -66,7 +66,7 @@ def validate_extended_attributes_file_key(file_key: str) -> str:
6666
):
6767
raise InvalidFileKeyError("Initial file validation failed: invalid file key")
6868

69-
return organization_code
69+
return vaccine_type, organization_code
7070

7171

7272
def validate_batch_file_key(file_key: str) -> tuple[str, str]:

lambdas/filenameprocessor/src/supplier_permissions.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"""Functions for fetching supplier permissions"""
22

33
from common.clients import logger
4+
from constants import Operation
45
from elasticache import get_supplier_permissions_from_cache
56
from models.errors import VaccineTypePermissionsError
67

@@ -19,3 +20,25 @@ def validate_vaccine_type_permissions(vaccine_type: str, supplier: str) -> list:
1920
raise VaccineTypePermissionsError(error_message)
2021

2122
return supplier_permissions
23+
24+
25+
def validate_permissions_for_extended_attributes_files(vaccine_type: str, supplier: str) -> list:
26+
"""
27+
Checks that the supplier has COVID vaccine type and its CUD permissions.
28+
Raises an exception if the supplier does not have at least one permission for the vaccine type.
29+
"""
30+
allowed_operations = {
31+
Operation.CREATE,
32+
Operation.UPDATE,
33+
Operation.DELETE,
34+
}
35+
supplier_permissions = get_supplier_permissions_from_cache(supplier)
36+
cached_operations = [
37+
permission.split(".")[1] for permission in supplier_permissions if permission.split(".")[0] == vaccine_type
38+
]
39+
if not (cached_operations and allowed_operations.issubset(set(cached_operations[0]))):
40+
error_message = f"Initial file validation failed: {supplier} does not have permissions for {vaccine_type}"
41+
logger.error(error_message)
42+
raise VaccineTypePermissionsError(error_message)
43+
44+
return f"{supplier}_{vaccine_type}"

lambdas/filenameprocessor/tests/test_file_key_validation.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,8 +135,9 @@ def test_validate_extended_attributes_file_key(self, mock_get_redis_client):
135135
mock_redis.hget.side_effect = create_mock_hget(MOCK_ODS_CODE_TO_SUPPLIER, {})
136136
mock_redis.hkeys.return_value = ["COVID"]
137137
mock_get_redis_client.return_value = mock_redis
138+
vaccine_type, supplier = validate_extended_attributes_file_key(file_key)
138139
self.assertEqual(
139-
validate_extended_attributes_file_key(file_key),
140+
supplier,
140141
expected_result,
141142
)
142143

lambdas/filenameprocessor/tests/test_lambda_handler.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,7 @@ def test_lambda_handler_extended_attributes_success(self, mock_get_redis_client)
272272

273273
# Patch uuid4 (message id), and prevent external copy issues by simulating move
274274
with (
275+
patch("file_name_processor.validate_permissions_for_extended_attributes_files", return_value="X8E5B_COVID"),
275276
patch("file_name_processor.uuid4", return_value=test_cases[0].message_id),
276277
patch(
277278
"file_name_processor.copy_file_to_external_bucket",
@@ -348,6 +349,7 @@ def test_lambda_handler_extended_attributes_failure(self, mock_get_redis_client)
348349

349350
# Patch uuid4 (message id), and raise an exception instead of moving the file.
350351
with (
352+
patch("file_name_processor.validate_permissions_for_extended_attributes_files", return_value="X8E5B_COVID"),
351353
patch("file_name_processor.uuid4", return_value=test_cases[0].message_id),
352354
patch("file_name_processor.copy_file_to_external_bucket", side_effect=Exception("Test ClientError")),
353355
patch(
@@ -472,6 +474,7 @@ def test_lambda_handler_extended_attributes_extension_checks(self, mock_get_redi
472474
csv_key = MockFileDetails.extended_attributes_file.file_key
473475
s3_client.put_object(Bucket=BucketNames.SOURCE, Key=csv_key, Body=MOCK_EXTENDED_ATTRIBUTES_FILE_CONTENT)
474476
with (
477+
patch("file_name_processor.validate_permissions_for_extended_attributes_files", return_value="X8E5B_COVID"),
475478
patch("file_name_processor.uuid4", return_value="EA_csv_id"),
476479
patch(
477480
"file_name_processor.copy_file_to_external_bucket",
@@ -500,9 +503,10 @@ def test_lambda_handler_extended_attributes_extension_checks(self, mock_get_redi
500503
s3_client.get_object(Bucket=BucketNames.DESTINATION, Key=f"dps_destination/{csv_key}")
501504

502505
# .DAT accepted
503-
dat_key = csv_key[:-3] + "dat"
506+
dat_key = MockFileDetails.extended_attributes_file.file_key[:-3] + "dat"
504507
s3_client.put_object(Bucket=BucketNames.SOURCE, Key=dat_key, Body=MOCK_EXTENDED_ATTRIBUTES_FILE_CONTENT)
505508
with (
509+
patch("file_name_processor.validate_permissions_for_extended_attributes_files", return_value="X8E5B_COVID"),
506510
patch("file_name_processor.uuid4", return_value="EA_dat_id"),
507511
patch(
508512
"file_name_processor.copy_file_to_external_bucket",

0 commit comments

Comments
 (0)