pub struct NumericDate {
timestamp: u64,
}Expand description
Represents the value of the iat, exp, nbf claims.
According to RFC7519, it should be:
“A JSON numeric value representing the number of seconds from 1970-01-01T00:00:00Z UTC until the specified UTC date/time, ignoring leap seconds. This is equivalent to the IEEE Std 1003.1, 2013 Edition [POSIX.1] definition “Seconds Since the Epoch”, in which each day is accounted for by exactly 86400 seconds, other than that non-integer values can be represented.“
But contrary to this, we reject negative timestamps — and timestamps beyond the invariant upper bound below (the last second of year 9999) — with an error, and silently round down non-negative decimals to the nearest u64.
§Invariant
timestamp <= MAX_TIMESTAMP_SECS, the last second of year 9999 and the largest instant
representable in RFC3339. Construction and arithmetic go through new_clamp,
add_clamp and sub_clamp, which saturate into range; the
Deserialize and TryFrom<SystemTime> impls instead reject an out-of-range value with an
error.
The bound is a safety property, not just tidiness. The exp/nbf/iat claims are
attacker-controlled, and a value near u64::MAX overflows std::time::SystemTime — whose
addition panics above i64::MAX seconds — the moment the date is formatted into a log or error
message (e.g. the “not yet valid” message built from a bogus far-future nbf). Staying in
range also keeps humantime rendering the year correctly. Because the invariant holds, the
From<&NumericDate> for SystemTime conversion is total and lossless, so serializing and then
deserializing a NumericDate round-trips faithfully.
The range operations are named (*_clamp) rather than +/-/new so the saturating behaviour
is explicit at the call site and never silently surprises the reader.
Fields§
§timestamp: u64Implementations§
Source§impl NumericDate
impl NumericDate
Sourcepub fn new_clamp(timestamp: u64) -> Self
pub fn new_clamp(timestamp: u64) -> Self
Creates a numeric date from timestamp, the number of seconds since the unix epoch
(ignoring leap seconds), saturating at MAX_TIMESTAMP_SECS to uphold the invariant.
Trait Implementations§
Source§impl Clone for NumericDate
impl Clone for NumericDate
Source§fn clone(&self) -> NumericDate
fn clone(&self) -> NumericDate
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for NumericDate
impl Debug for NumericDate
Source§impl Default for NumericDate
impl Default for NumericDate
Source§fn default() -> NumericDate
fn default() -> NumericDate
Source§impl<'de> Deserialize<'de> for NumericDate
impl<'de> Deserialize<'de> for NumericDate
Source§fn deserialize<D: Deserializer<'de>>(d: D) -> Result<Self, D::Error>
fn deserialize<D: Deserializer<'de>>(d: D) -> Result<Self, D::Error>
Source§impl Display for NumericDate
impl Display for NumericDate
Source§impl From<&NumericDate> for SystemTime
impl From<&NumericDate> for SystemTime
Source§fn from(nd: &NumericDate) -> Self
fn from(nd: &NumericDate) -> Self
Source§impl From<NumericDate> for Epoch
impl From<NumericDate> for Epoch
Source§fn from(nd: NumericDate) -> Self
fn from(nd: NumericDate) -> Self
Source§impl Ord for NumericDate
impl Ord for NumericDate
Source§fn cmp(&self, other: &NumericDate) -> Ordering
fn cmp(&self, other: &NumericDate) -> Ordering
1.21.0 · Source§fn max(self, other: Self) -> Selfwhere
Self: Sized,
fn max(self, other: Self) -> Selfwhere
Self: Sized,
Source§impl PartialEq for NumericDate
impl PartialEq for NumericDate
Source§impl PartialOrd for NumericDate
impl PartialOrd for NumericDate
Source§impl Serialize for NumericDate
impl Serialize for NumericDate
Source§impl TryFrom<SystemTime> for NumericDate
impl TryFrom<SystemTime> for NumericDate
Source§fn try_from(st: SystemTime) -> Result<Self, Self::Error>
fn try_from(st: SystemTime) -> Result<Self, Self::Error>
Fallible (not From with a clamp) so a far-future SystemTime can never be silently
rewritten — even if a future caller feeds in a time that isn’t the (sane) system clock.
Source§type Error = OutOfRange
type Error = OutOfRange
impl Copy for NumericDate
impl Eq for NumericDate
impl StructuralPartialEq for NumericDate
Auto Trait Implementations§
impl Freeze for NumericDate
impl RefUnwindSafe for NumericDate
impl Send for NumericDate
impl Sync for NumericDate
impl Unpin for NumericDate
impl UnsafeUnpin for NumericDate
impl UnwindSafe for NumericDate
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<Q, K> Comparable<K> for Q
impl<Q, K> Comparable<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more