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 23, 2022
1 parent 6229fc6 commit d92249f
Showing 1 changed file with 31 additions and 1 deletion.
32 changes: 31 additions & 1 deletion tuf/src/interchange/cjson/shims.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ use crate::Result;
const SPEC_VERSION: &str = "1.0";

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 @@ -570,3 +571,32 @@ mod deserialize_reject_duplicates {
})
}
}

#[cfg(test)]
mod test {
use super::*;

#[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 d92249f

Please sign in to comment.