diff options
-rw-r--r-- | nova/api/ec2/ec2utils.py | 18 | ||||
-rw-r--r-- | nova/tests/api/ec2/test_ec2_validate.py | 19 |
2 files changed, 33 insertions, 4 deletions
diff --git a/nova/api/ec2/ec2utils.py b/nova/api/ec2/ec2utils.py index bb0f7245a..46f45f3f0 100644 --- a/nova/api/ec2/ec2utils.py +++ b/nova/api/ec2/ec2utils.py @@ -178,6 +178,9 @@ def ec2_vol_id_to_uuid(ec2_id): return get_volume_uuid_from_int_id(ctxt, int_id) +_ms_time_regex = re.compile('^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3,6}Z$') + + def is_ec2_timestamp_expired(request, expires=None): """Checks the timestamp or expiry time included in an EC2 request and returns true if the request is expired @@ -185,6 +188,15 @@ def is_ec2_timestamp_expired(request, expires=None): query_time = None timestamp = request.get('Timestamp') expiry_time = request.get('Expires') + + def parse_strtime(strtime): + if _ms_time_regex.match(strtime): + # NOTE(MotoKen): time format for aws-sdk-java contains millisecond + time_format = "%Y-%m-%dT%H:%M:%S.%fZ" + else: + time_format = "%Y-%m-%dT%H:%M:%SZ" + return timeutils.parse_strtime(strtime, time_format) + try: if timestamp and expiry_time: msg = _("Request must include either Timestamp or Expires," @@ -192,12 +204,10 @@ def is_ec2_timestamp_expired(request, expires=None): LOG.error(msg) raise exception.InvalidRequest(msg) elif expiry_time: - query_time = timeutils.parse_strtime(expiry_time, - "%Y-%m-%dT%H:%M:%SZ") + query_time = parse_strtime(expiry_time) return timeutils.is_older_than(query_time, -1) elif timestamp: - query_time = timeutils.parse_strtime(timestamp, - "%Y-%m-%dT%H:%M:%SZ") + query_time = parse_strtime(timestamp) # Check if the difference between the timestamp in the request # and the time on our servers is larger than 5 minutes, the diff --git a/nova/tests/api/ec2/test_ec2_validate.py b/nova/tests/api/ec2/test_ec2_validate.py index 24d226335..9b67d67a1 100644 --- a/nova/tests/api/ec2/test_ec2_validate.py +++ b/nova/tests/api/ec2/test_ec2_validate.py @@ -194,6 +194,25 @@ class EC2TimestampValidationTestCase(test.TestCase): expired = ec2utils.is_ec2_timestamp_expired(params) self.assertFalse(expired) + def test_validate_ec2_timestamp_ms_time_regex(self): + result = ec2utils._ms_time_regex.match('2011-04-22T11:29:49.123Z') + self.assertIsNotNone(result) + result = ec2utils._ms_time_regex.match('2011-04-22T11:29:49.123456Z') + self.assertIsNotNone(result) + result = ec2utils._ms_time_regex.match('2011-04-22T11:29:49.1234567Z') + self.assertIsNone(result) + result = ec2utils._ms_time_regex.match('2011-04-22T11:29:49.123') + self.assertIsNone(result) + result = ec2utils._ms_time_regex.match('2011-04-22T11:29:49Z') + self.assertIsNone(result) + + def test_validate_ec2_timestamp_aws_sdk_format(self): + params = {'Timestamp': '2011-04-22T11:29:49.123Z'} + expired = ec2utils.is_ec2_timestamp_expired(params) + self.assertFalse(expired) + expired = ec2utils.is_ec2_timestamp_expired(params, expires=300) + self.assertTrue(expired) + def test_validate_ec2_timestamp_invalid_format(self): params = {'Timestamp': '2011-04-22T11:29:49.000P'} expired = ec2utils.is_ec2_timestamp_expired(params) |