Skip to content

Commit

Permalink
Support RFC3339 timestamps
Browse files Browse the repository at this point in the history
This extracts @lukesteensen's RFC 3339 timestamp parser from theupdateframework#377. This
allows rust-tuf to interoperate better with other TUF implementations,
which might include things like microseconds, or not be in the UTC
timezone.
  • Loading branch information
erickt committed Sep 27, 2022
1 parent 8c6a86f commit 6fa13d1
Showing 1 changed file with 26 additions and 1 deletion.
27 changes: 26 additions & 1 deletion tuf/src/interchange/cjson/shims.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@ fn valid_spec_version(other: &str) -> bool {
}

fn parse_datetime(ts: &str) -> Result<DateTime<Utc>> {
Utc.datetime_from_str(ts, "%FT%TZ")
DateTime::parse_from_rfc3339(ts)
.map(|ts| ts.with_timezone(&Utc))
.map_err(|e| Error::Encoding(format!("Can't parse DateTime: {:?}", e)))
}

Expand Down Expand Up @@ -601,4 +602,28 @@ mod test {
);
}
}

#[test]
fn datetime_formats() {
// The TUF spec says datetimes should be in ISO8601 format, specifically
// "YYYY-MM-DDTHH:MM:SSZ". Since not all TUF clients adhere strictly to that, we choose to
// be more lenient here. The following represent the intersection of valid ISO8601 and
// RFC3339 datetime formats (source: https://ijmacd.github.io/rfc3339-iso8601/).
let valid_formats = [
"2022-08-30T19:53:55Z",
"2022-08-30T19:53:55.7Z",
"2022-08-30T19:53:55.77Z",
"2022-08-30T19:53:55.775Z",
"2022-08-30T19:53:55+00:00",
"2022-08-30T19:53:55.7+00:00",
"2022-08-30T14:53:55-05:00",
"2022-08-30T14:53:55.7-05:00",
"2022-08-30T14:53:55.77-05:00",
"2022-08-30T14:53:55.775-05:00",
];

for format in valid_formats {
assert!(parse_datetime(format).is_ok(), "should parse {:?}", format);
}
}
}

0 comments on commit 6fa13d1

Please sign in to comment.