Enum Expiry
pub enum Expiry {
Never,
AtUnix(u64),
EndOfSession,
AfterUse,
}Expand description
When a capability dies — the expiry of (subject, resource, verbs, expiry).
The whole lifetime vocabulary: the portal’s “Just once” / “Until I log
out” / “Always” map to Expiry::AfterUse, EndOfSession and
Never respectively, not a parallel enum.
Variants§
Never
Lives until explicitly revoked, and survives a restart.
AtUnix(u64)
Dies at this wall-clock instant (seconds since epoch); survives a restart if not yet past.
EndOfSession
Dies when the granting session ends. Never written to disk.
AfterUse
Dies as soon as the requesting prompt completes. Never written to disk.
Implementations§
§impl Expiry
impl Expiry
pub fn is_live_at(self, now: Option<u64>) -> bool
pub fn is_live_at(self, now: Option<u64>) -> bool
Is a capability with this expiry still live at now?
now: None skips time evaluation — used by the wire validator, which
shares no clock with an op’s author. EndOfSession/AfterUse are
live here; their deaths are events (not persisting, dropping after
use), not instants.
pub fn persists_across_restart(self) -> bool
pub fn persists_across_restart(self) -> bool
Should a capability with this expiry be written to disk?
The single answer to “does Always survive a restart?” — session- and
use-scoped capabilities are excluded so persisting them can’t silently
turn a one-shot grant into a permanent one.
pub fn outlives(self, other: Expiry) -> bool
pub fn outlives(self, other: Expiry) -> bool
Does a capability with this expiry outlive one with other?
Order: Never > AtUnix(later) > AtUnix(earlier) > EndOfSession >
AfterUse. An explicit deadline outranks the session because it
survives a restart.
pub fn longest(a: Expiry, b: Expiry) -> Expiry
pub fn longest(a: Expiry, b: Expiry) -> Expiry
The longer-lived of two expiries — the single definition of “strongest scope wins”, used both merging a re-grant and reporting an existing grant’s strength. Two answers here would eventually disagree, reading as a permanent grant silently becoming a session one.
Trait Implementations§
§impl<'de> Deserialize<'de> for Expiry
impl<'de> Deserialize<'de> for Expiry
§fn deserialize<__D>(
__deserializer: __D,
) -> Result<Expiry, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(
__deserializer: __D,
) -> Result<Expiry, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
§impl Serialize for Expiry
impl Serialize for Expiry
§fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
impl Copy for Expiry
impl Eq for Expiry
impl StructuralPartialEq for Expiry
Auto Trait Implementations§
impl Freeze for Expiry
impl RefUnwindSafe for Expiry
impl Send for Expiry
impl Sync for Expiry
impl Unpin for Expiry
impl UnsafeUnpin for Expiry
impl UnwindSafe for Expiry
Blanket Implementations§
§impl<T> AnyEq for T
impl<T> AnyEq for T
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,
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.§impl<T> DowncastSync for T
impl<T> DowncastSync for T
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§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