Skip to content

Commit b9d40f2

Browse files
committed
Check for invalid hour and leap second
Exposed by: json-schema-org/JSON-Schema-Test-Suite#481 Ruby incorrectly allows `24` as the hour in an RFC3339 timestamp. It also does not handle leap seconds very well: ``` -> Time.parse("23:59:60Z") => 2021-10-18 00:00:00 UTC ``` They should only be allowed at 23:59 UTC.
1 parent d3d13e7 commit b9d40f2

File tree

1 file changed

+6
-2
lines changed

1 file changed

+6
-2
lines changed

lib/json_schemer/format.rb

+6-2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ module Format
99
JSON_POINTER_REGEX = /\A#{JSON_POINTER_REGEX_STRING}\z/.freeze
1010
RELATIVE_JSON_POINTER_REGEX = /\A(0|[1-9]\d*)(#|#{JSON_POINTER_REGEX_STRING})?\z/.freeze
1111
DATE_TIME_OFFSET_REGEX = /(Z|[\+\-]([01][0-9]|2[0-3]):[0-5][0-9])\z/i.freeze
12+
HOUR_24_REGEX = /T24/.freeze
13+
LEAP_SECOND_REGEX = /T\d{2}:\d{2}:6/.freeze
1214
IP_REGEX = /\A[\h:.]+\z/.freeze
1315
INVALID_QUERY_REGEX = /\s/.freeze
1416

@@ -59,9 +61,11 @@ def valid_json?(data)
5961
end
6062

6163
def valid_date_time?(data)
62-
DateTime.rfc3339(data)
64+
return false if HOUR_24_REGEX.match?(data)
65+
datetime = DateTime.rfc3339(data)
66+
return false if LEAP_SECOND_REGEX.match?(data) && datetime.to_time.utc.strftime('%H:%M') != '23:59'
6367
DATE_TIME_OFFSET_REGEX.match?(data)
64-
rescue ArgumentError => e
68+
rescue ArgumentError
6569
false
6670
end
6771

0 commit comments

Comments
 (0)