1414from fhir .resources .R4B .immunization import Immunization
1515from boto3 import client as boto3_client
1616
17- from authorization import Authorization , EndpointOperation , UnknownPermission
17+ from authorization import Authorization , UnknownPermission
1818from cache import Cache
1919from fhir_repository import ImmunizationRepository , create_table
2020from fhir_service import FhirService , UpdateOutcome , get_service_url
3535)
3636from models .utils .generic_utils import check_keys_in_sources
3737from models .utils .permissions import get_supplier_permissions
38+ from models .utils .permission_checker import VaccinePermissionChecker
3839from pds_service import PdsService
3940from parameter_parser import process_params , process_search_params , create_query_string
4041import urllib .parse
@@ -79,7 +80,7 @@ def __init__(
7980 def get_immunization_by_identifier (self , aws_event ) -> dict :
8081 try :
8182 if aws_event .get ("headers" ):
82- if response := self .authorize_request (EndpointOperation . SEARCH , aws_event ):
83+ if response := self .authorize_request (aws_event ):
8384 return response
8485 query_params = aws_event .get ("queryStringParameters" , {})
8586 else :
@@ -120,7 +121,7 @@ def get_immunization_by_identifier(self, aws_event) -> dict:
120121 return self .create_response (403 , unauthorized .to_operation_outcome ())
121122
122123 def get_immunization_by_id (self , aws_event ) -> dict :
123- if response := self .authorize_request (EndpointOperation . READ , aws_event ):
124+ if response := self .authorize_request (aws_event ):
124125 return response
125126
126127 imms_id = aws_event ["pathParameters" ]["id" ]
@@ -165,7 +166,7 @@ def get_immunization_by_id(self, aws_event) -> dict:
165166 def create_immunization (self , aws_event ):
166167 try :
167168 if aws_event .get ("headers" ):
168- if response := self .authorize_request (EndpointOperation . CREATE , aws_event ):
169+ if response := self .authorize_request (aws_event ):
169170 return response
170171 else :
171172 raise UnauthorizedError ()
@@ -209,7 +210,7 @@ def create_immunization(self, aws_event):
209210 def update_immunization (self , aws_event ):
210211 try :
211212 if aws_event .get ("headers" ):
212- if response := self .authorize_request (EndpointOperation . UPDATE , aws_event ):
213+ if response := self .authorize_request (aws_event ):
213214 return response
214215 imms_id = aws_event ["pathParameters" ]["id" ]
215216 else :
@@ -271,9 +272,8 @@ def update_immunization(self, aws_event):
271272
272273 # Check vaccine type permissions on the existing record - start
273274 try :
274- vax_type_perms = self ._parse_vaccine_permissions_controller (imms_vax_type_perms )
275- vax_type_perm = self ._vaccine_permission (existing_record ["VaccineType" ], "update" )
276- self ._check_permission (vax_type_perm , vax_type_perms )
275+ checker = VaccinePermissionChecker (imms_vax_type_perms )
276+ checker .validate (existing_record ["VaccineType" ], "update" )
277277 except UnauthorizedVaxOnRecordError as unauthorized :
278278 return self .create_response (403 , unauthorized .to_operation_outcome ())
279279 # Check vaccine type permissions on the existing record - end
@@ -372,7 +372,7 @@ def update_immunization(self, aws_event):
372372 def delete_immunization (self , aws_event ):
373373 try :
374374 if aws_event .get ("headers" ):
375- if response := self .authorize_request (EndpointOperation . DELETE , aws_event ):
375+ if response := self .authorize_request (aws_event ):
376376 return response
377377 imms_id = aws_event ["pathParameters" ]["id" ]
378378 else :
@@ -403,7 +403,7 @@ def delete_immunization(self, aws_event):
403403 return self .create_response (403 , unauthorized .to_operation_outcome ())
404404
405405 def search_immunizations (self , aws_event : APIGatewayProxyEventV1 ) -> dict :
406- if response := self .authorize_request (EndpointOperation . SEARCH , aws_event ):
406+ if response := self .authorize_request (aws_event ):
407407 return response
408408
409409 try :
@@ -428,8 +428,11 @@ def search_immunizations(self, aws_event: APIGatewayProxyEventV1) -> dict:
428428 return self .create_response (403 , unauthorized .to_operation_outcome ())
429429 # Check vaxx type permissions on the existing record - start
430430 try :
431- vax_type_perms = self ._parse_vaccine_permissions_controller (imms_vax_type_perms )
432- vax_type_perm = self ._new_vaccine_request (search_params .immunization_targets , "search" , vax_type_perms )
431+ checker = VaccinePermissionChecker (imms_vax_type_perms )
432+ vax_type_perms = checker .expanded_permissions
433+ operation_code = VaccinePermissionChecker .mapped_operations .get ("search" )
434+ vax_type_perm = [ vaccine_type for vaccine_type in search_params .immunization_targets
435+ if f"{ vaccine_type .lower ()} .{ operation_code } " in vax_type_perms ]
433436 if not vax_type_perm :
434437 raise UnauthorizedVaxError
435438 except UnauthorizedVaxError as unauthorized :
@@ -540,19 +543,19 @@ def _create_bad_request(self, message):
540543 )
541544 return self .create_response (400 , error )
542545
543- def authorize_request (self , operation : EndpointOperation , aws_event : dict ) -> Optional [dict ]:
546+
547+ def authorize_request (self , aws_event : dict ) -> Optional [dict ]:
544548 try :
545- self .authorizer .authorize (operation , aws_event )
549+ self .authorizer .authorize (aws_event )
546550 except UnauthorizedError as e :
547551 return self .create_response (403 , e .to_operation_outcome ())
548552 except UnknownPermission :
549- # TODO: I think when AuthenticationType is not present, then we don't get below message. Double check again
550553 id_error = create_operation_outcome (
551- resource_id = str (uuid .uuid4 ()),
552- severity = Severity .error ,
553- code = Code .server_error ,
554- diagnostics = "application includes invalid authorization values" ,
555- )
554+ resource_id = str (uuid .uuid4 ()),
555+ severity = Severity .error ,
556+ code = Code .server_error ,
557+ diagnostics = "Application includes invalid authorization values" ,
558+ )
556559 return self .create_response (500 , id_error )
557560
558561 def fetch_identifier_system_and_element (self , event : dict ):
@@ -633,6 +636,7 @@ def check_vaccine_type_permissions(self, aws_event):
633636 if len (supplier_system ) == 0 :
634637 raise UnauthorizedSystemError ()
635638 imms_vax_type_perms = get_supplier_permissions (supplier_system )
639+ print (f" update imms = { imms_vax_type_perms } " )
636640 if len (imms_vax_type_perms ) == 0 :
637641 raise UnauthorizedVaxError ()
638642 # Return the values needed for later use
@@ -661,50 +665,6 @@ def create_response(status_code, body=None, headers=None):
661665 ** ({"body" : body } if body else {}),
662666 }
663667
664- @staticmethod
665- def _sendack (payload , file_name , message_id , created_at_formatted_string , local_id , operation_requested ):
666- payload ["file_key" ] = file_name
667- payload ["row_id" ] = message_id
668- payload ["created_at_formatted_string" ] = created_at_formatted_string
669- payload ["local_id" ] = local_id
670- payload ["operation_requested" ] = operation_requested
671- sqs_client .send_message (QueueUrl = queue_url , MessageBody = json .dumps (payload ), MessageGroupId = file_name )
672-
673- @staticmethod
674- def _vaccine_permission (vaccine_type , operation ) -> set :
675- vaccine_permission = set ()
676- if isinstance (vaccine_type , list ):
677- for x in vaccine_type :
678- vaccine_permission .add (str .lower (f"{ x } :{ operation } " ))
679- return vaccine_permission
680- else :
681- vaccine_permission .add (str .lower (f"{ vaccine_type } :{ operation } " ))
682- return vaccine_permission
683-
684- @staticmethod
685- def _parse_vaccine_permissions_controller (imms_vax_type_perms ) -> set :
686- return {str (s ).strip ().lower () for s in imms_vax_type_perms }
687-
688- @staticmethod
689- def _check_permission (requested : set , allowed : set ) -> set :
690- if not requested .issubset (allowed ):
691- raise UnauthorizedVaxOnRecordError ()
692- else :
693- return None
694-
695- @staticmethod
696- def _new_vaccine_request (vaccine_type , operation , vaccine_type_permissions : None ) -> Optional [list ]:
697- vaccine_permission = list ()
698- if isinstance (vaccine_type , list ):
699- for x in vaccine_type :
700- vaccs_prms = set ()
701- vaccs_prms .add (str .lower (f"{ x } :{ operation } " ))
702- if vaccs_prms .issubset (vaccine_type_permissions ):
703- vaccine_permission .append (x )
704- return vaccine_permission
705- else :
706- return vaccine_permission
707-
708668 @staticmethod
709669 def _identify_supplier_system (aws_event ):
710670 supplier_system = aws_event ["headers" ]["SupplierSystem" ]
0 commit comments