Skip to content

Commit 6a5fbb2

Browse files
authored
Merge pull request #336 from kmcquade/fix/GH-335-arn-format
Invalid ARNs now raise a descriptive exception instead of just a generic IndexError message
2 parents bec0658 + d9b2e24 commit 6a5fbb2

File tree

2 files changed

+29
-20
lines changed

2 files changed

+29
-20
lines changed

policy_sentry/util/arns.py

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,16 @@ def __init__(self, provided_arn):
2525
)
2626

2727
if not follows_arn_format:
28-
raise Exception("The provided value does not follow required ARN formatting.")
29-
elements = self.arn.split(":", 5)
30-
self.partition = elements[1]
31-
self.service_prefix = elements[2]
32-
self.region = elements[3]
33-
self.account = elements[4]
34-
self.resource = elements[5]
35-
28+
raise Exception("The provided value does not follow required ARN format.")
29+
try:
30+
elements = self.arn.split(":", 5)
31+
self.partition = elements[1]
32+
self.service_prefix = elements[2]
33+
self.region = elements[3]
34+
self.account = elements[4]
35+
self.resource = elements[5]
36+
except IndexError as error:
37+
raise Exception("The provided ARN is invalid. IndexError: %s. Please provide a valid ARN." % error) from error
3638
if "/" in self.resource:
3739
self.resource, self.resource_path = self.resource.split("/", 1)
3840
elif ":" in self.resource:
@@ -156,16 +158,19 @@ def parse_arn(arn):
156158
"""
157159
Given an ARN, split up the ARN into the ARN namespacing schema dictated by the AWS docs.
158160
"""
159-
elements = arn.split(":", 5)
160-
result = {
161-
"arn": elements[0],
162-
"partition": elements[1],
163-
"service": elements[2],
164-
"region": elements[3],
165-
"account": elements[4],
166-
"resource": elements[5],
167-
"resource_path": None,
168-
}
161+
try:
162+
elements = arn.split(":", 5)
163+
result = {
164+
"arn": elements[0],
165+
"partition": elements[1],
166+
"service": elements[2],
167+
"region": elements[3],
168+
"account": elements[4],
169+
"resource": elements[5],
170+
"resource_path": None,
171+
}
172+
except IndexError as error:
173+
raise Exception("The provided ARN is invalid. IndexError: %s. Please provide a valid ARN." % error) from error
169174
if "/" in result["resource"]:
170175
result["resource"], result["resource_path"] = result["resource"].split("/", 1)
171176
elif ":" in result["resource"]:

test/util/test_arns.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import unittest
2-
from policy_sentry.util.arns import does_arn_match, ARN
2+
from policy_sentry.util.arns import does_arn_match, ARN, parse_arn
33

44
# "Does Arn Match" tests
55
# See docs for this list: # https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html#genref-arns
@@ -146,6 +146,11 @@ def test_dynamodb_arn_matching_gh_215(self):
146146
self.assertFalse(does_arn_match(this_arn, backup))
147147
self.assertFalse(does_arn_match(this_arn, global_table))
148148

149+
def test_parse_arn(self):
150+
"""util.arns.parse_arn: Ensure that invalid ARNs raise a proper exception message"""
151+
with self.assertRaises(Exception):
152+
parse_arn("aaa")
153+
149154

150155
class ArnPathTestCase(unittest.TestCase):
151156
# When paths are used
@@ -155,7 +160,6 @@ def test_ssm_paths(self):
155160
print(parameter_1.same_resource_type(parameter_2))
156161
self.assertTrue(parameter_1.same_resource_type(parameter_2))
157162

158-
159163
# When confusing ARNs that look like paths but are not actually paths are used
160164
def test_dynamo_db_non_paths(self):
161165
backup_arn = "arn:aws:dynamodb:us-east-1:123456789123:table/mytable/backup/mybackup"

0 commit comments

Comments
 (0)