Skip to content

Commit bf3da75

Browse files
committed
CMR-10388: Finalizing code
1 parent 81bb5bc commit bf3da75

File tree

4 files changed

+50
-45
lines changed

4 files changed

+50
-45
lines changed

subscription/src/access_control.py

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class AccessControl:
2121
Example Use of this class
2222
access_control = AccessControl()
2323
response = access_control.get_permissions('user1', 'C1200484253-CMR_ONLY')
24-
The call is the same as 'curl https://cmr.sit.earthdata.nasa.gov/access-control/permissions?user_id=eereiter&concept_id=C1200484253-CMR_ONLY'
24+
The call is the same as 'curl https://cmr.sit.earthdata.nasa.gov/access-control/permissions?user_id=user1&concept_id=C1200484253-CMR_ONLY'
2525
Return is either None (Null or Nil) (if check on response is false) or
2626
{"C1200484253-CMR_ONLY":["read","update","delete","order"]}
2727
"""
@@ -53,13 +53,11 @@ def get_url_from_parameter_store(self):
5353

5454
# construct the access control parameter names from the environment variable
5555
env_name = environment_name.lower()
56-
logger.info(f"Environment Name converted is: {env_name}")
5756
pre_fix = f"/{env_name}/ingest/"
5857
protocol_param_name = f"{pre_fix}CMR_ACCESS_CONTROL_PROTOCOL"
5958
port_param_name = f"{pre_fix}CMR_ACCESS_CONTROL_PORT"
6059
host_param_name = f"{pre_fix}CMR_ACCESS_CONTROL_HOST"
6160
context_param_name = f"{pre_fix}CMR_ACCESS_CONTROL_RELATIVE_ROOT_URL"
62-
logger.info(f"protocol_param_name: {protocol_param_name}")
6361

6462
env_vars = Env_Vars()
6563
protocol = env_vars.get_var(name=protocol_param_name)
@@ -113,17 +111,17 @@ def has_read_permission(self, subscriber_id, collection_concept_id):
113111
try:
114112
# Call the get_permissions function
115113
permissions_str = self.get_permissions(subscriber_id, collection_concept_id)
116-
logger.info(f"The type of object the permissions is: {type(permissions_str)}")
117-
logger.info(f"If its json then turn it into a Dictionary: {json.loads(permissions_str)}")
118114

119-
permissions = json.loads(permissions_str)
120-
121-
# Check if the permissions is a dictionary
122-
if isinstance(permissions, dict):
123-
# Check if the collection_concept_id is in the permissions dictionary
124-
if collection_concept_id in permissions:
125-
# Check if "read" is in the list of permissions for the collection
126-
return "read" in permissions[collection_concept_id]
115+
if permissions_str:
116+
permissions = json.loads(permissions_str)
117+
118+
# Check if the permissions is a dictionary
119+
if isinstance(permissions, dict):
120+
# Check if the collection_concept_id is in the permissions dictionary
121+
if collection_concept_id in permissions:
122+
# Check if "read" is in the list of permissions for the collection
123+
return "read" in permissions[collection_concept_id]
124+
else: return False
127125
else: return False
128126
else: return False
129127

subscription/src/env_vars.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,11 @@ def __init__(self):
1212
self.ssm_client = boto3.client('ssm', region_name=os.getenv("AWS_REGION"))
1313

1414
def get_var(self, name, decryption=False):
15-
logger.debug(f"Getting the environment variable called {name}")
15+
"""The name parameter looks like /sit/ingest/ENVIRONMENT_VAR. To check if the environment
16+
variable exists strip off everything except for the actual variable name. Otherwise
17+
go to the AWS ParameterStore and get the values."""
18+
19+
logger.debug(f"Subscription worker: Getting the environment variable called {name}")
1620
parts = name.split('/')
1721
os_name = next(part for part in reversed(parts) if part)
1822

subscription/src/subscription_worker.py

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ def receive_message(sqs_client, queue_url):
2323
WaitTimeSeconds=(int (LONG_POLL_TIME)))
2424

2525
if len(response.get('Messages', [])) > 0:
26-
logger.info(f"Number of messages received: {len(response.get('Messages', []))}")
26+
logger.debug(f"Number of messages received: {len(response.get('Messages', []))}")
2727
return response
2828

2929
def delete_message(sqs_client, queue_url, receipt_handle):
@@ -38,19 +38,22 @@ def process_messages(sns_client, topic, messages, access_control):
3838
"""Proess the message by first checking if the subscriber has permission to
3939
see the notification. If so send it on, otherwise send a log message."""
4040
for message in messages.get("Messages", []):
41-
logger.info(f"In Subscription worker process messages message: {message}")
42-
message_body_str = message["Body"]
43-
message_body = json.loads(message_body_str)
44-
message_attributes = message_body["MessageAttributes"]
41+
try:
42+
message_body = json.loads(message["Body"])
43+
message_attributes = message_body["MessageAttributes"]
44+
logger.debug(f"Subscription worker: Received message including attributes: {message_body}")
45+
46+
subscriber = message_attributes['subscriber']['Value']
47+
collection_concept_id = message_attributes['collection-concept-id']['Value']
48+
49+
if(access_control.has_read_permission(subscriber, collection_concept_id)):
50+
logger.debug(f"Subscription worker: {subscriber} has permission to receive granule notifications for {collection_concept_id}")
51+
sns_client.publish_message(topic, message)
52+
else:
53+
logger.info(f"Subscription worker: {subscriber} does not have read permission to receive notifications for {collection_concept_id}.")
54+
except Exception as e:
55+
logger.error(f"Subscription worker: There is a problem process messages {message}. {e}")
4556

46-
subscriber = message_attributes['subscriber']['Value']
47-
collection_concept_id = message_attributes['collection-concept-id']['Value']
48-
logger.info(f"Subscriber: {subscriber}")
49-
logger.info(f"collection_concept_id: {collection_concept_id}")
50-
if(access_control.has_read_permission(subscriber, collection_concept_id)):
51-
sns_client.publish_message(topic, message)
52-
else:
53-
logger.info(f"Subscription worker: {subscriber} does not have read permission to receive notifications for {collection_concept_id}.")
5457

5558
def poll_queue(running):
5659
""" Poll the SQS queue and process messages. """
@@ -77,7 +80,7 @@ def poll_queue(running):
7780
delete_messages(sqs_client=sqs_client, queue_url=DEAD_LETTER_QUEUE_URL, messages=dl_messages)
7881

7982
except Exception as e:
80-
logger.warning(f"An error occurred receiving or deleting messages: {e}")
83+
logger.error(f"An error occurred receiving or deleting messages: {e}")
8184

8285
app = Flask(__name__)
8386
@app.route('/shutdown', methods=['POST'])

subscription/test/access_control_test.py

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -61,32 +61,32 @@ def test_get_permissions_failure(self, mock_get):
6161
result = self.access_control.get_permissions("user1", "C1200484253-CMR_ONLY")
6262
self.assertIsNone(result)
6363

64-
# @patch.object(AccessControl, 'get_permissions')
65-
# def test_has_read_permission(self, mock_get_permissions):
64+
@patch.object(AccessControl, 'get_permissions')
65+
def test_has_read_permission(self, mock_get_permissions):
6666
# Test when user has read permission
67-
# mock_get_permissions.return_value = {"C1200484253-CMR_ONLY": ["read", "update"]}
68-
# result = self.access_control.has_read_permission("user1", "C1200484253-CMR_ONLY")
69-
# self.assertTrue(result)
67+
mock_get_permissions.return_value = "{\"C1200484253-CMR_ONLY\": [\"read\", \"update\"]}"
68+
result = self.access_control.has_read_permission("user1", "C1200484253-CMR_ONLY")
69+
self.assertTrue(result)
7070

7171
# Test when user doesn't have read permission
72-
# mock_get_permissions.return_value = {"C1200484253-CMR_ONLY": ["update"]}
73-
# result = self.access_control.has_read_permission("user1", "C1200484253-CMR_ONLY")
74-
# self.assertFalse(result)
72+
mock_get_permissions.return_value = "{\"C1200484253-CMR_ONLY\": [\"update\"]}"
73+
result = self.access_control.has_read_permission("user1", "C1200484253-CMR_ONLY")
74+
self.assertFalse(result)
7575

7676
# Test when concept_id is not in permissions
77-
# mock_get_permissions.return_value = {"C1200484253-OTHER": ["read"]}
78-
# result = self.access_control.has_read_permission("user1", "C1200484253-CMR_ONLY")
79-
# self.assertFalse(result)
77+
mock_get_permissions.return_value = "{\"C1200484253-OTHER\": [\"read\"]}"
78+
result = self.access_control.has_read_permission("user1", "C1200484253-CMR_ONLY")
79+
self.assertFalse(result)
8080

8181
# Test when permissions is not a dictionary
82-
# mock_get_permissions.return_value = None
83-
# result = self.access_control.has_read_permission("user1", "C1200484253-CMR_ONLY")
84-
# self.assertFalse(result)
82+
mock_get_permissions.return_value = None
83+
result = self.access_control.has_read_permission("user1", "C1200484253-CMR_ONLY")
84+
self.assertFalse(result)
8585

8686
# Test when get_permissions raises an exception
87-
# mock_get_permissions.side_effect = Exception("API Error")
88-
# result = self.access_control.has_read_permission("user1", "C1200484253-CMR_ONLY")
89-
# self.assertFalse(result)
87+
mock_get_permissions.side_effect = Exception("API Error")
88+
result = self.access_control.has_read_permission("user1", "C1200484253-CMR_ONLY")
89+
self.assertFalse(result)
9090

9191
@patch('access_control.logger')
9292
@patch.object(AccessControl, 'get_permissions')

0 commit comments

Comments
 (0)