pub enum AuditEventKind {
ApprovalGranted,
ApprovalConsumed,
ApprovalRevoked,
StatusQueued,
StatusRunning,
StatusSucceeded,
StatusFailed,
StatusCanceled,
StatusRolledBack,
StatusNeedsReboot,
}Expand description
A lifecycle event on an approval receipt.
The transactions chain commits to the authorisation decision at preview
time. It says nothing about whether a human ever approved, whether that
approval was spent, or whether it was retracted — those live in
transaction_approvals, a plain mutable table. Deleting a row from it used
to leave sysknife audit verify reporting Intact, so the record that an
approval happened was the one part of the trail an attacker could erase
without leaving a mark. These events are chained so that erasure breaks a
signature.
Variants§
ApprovalGranted
A receipt was minted for a queued transaction.
ApprovalConsumed
A receipt was spent to move a transaction into Running.
ApprovalRevoked
An undelivered receipt was retracted before it could be spent.
StatusQueued
A transaction reached the state named by this variant.
The outcome lives in the kind, so it is covered by the event
signature. transactions.status is an ordinary mutable column: anyone
who can UPDATE that table could rewrite a job that ran to completion
as canceled, and the chain had nothing to disagree with. One variant per
state rather than a free-text field keeps as_str returning a stable
&'static str, which is what every already-written signature commits to.
StatusRunning
StatusSucceeded
StatusFailed
StatusCanceled
StatusRolledBack
StatusNeedsReboot
Implementations§
Source§impl AuditEventKind
impl AuditEventKind
Sourcepub const ALL: &'static [AuditEventKind]
pub const ALL: &'static [AuditEventKind]
Every variant, in the order they were introduced.
parse_event_kind reads this list, so a variant missing from it is not
a compile error: it verifies as a broken chain at runtime, on a row the
daemon itself wrote. The previous version of that function carried the
comment “exhaustive by construction: the match below fails to compile if
a variant is added without a spelling here” over an array literal, where
adding a variant compiles perfectly well. Adding the status kinds is
what showed the claim was false, and every_variant_is_in_all below is
the exhaustive match that makes it true.
Trait Implementations§
Source§impl Clone for AuditEventKind
impl Clone for AuditEventKind
impl Copy for AuditEventKind
Source§impl Debug for AuditEventKind
impl Debug for AuditEventKind
impl Eq for AuditEventKind
Source§impl From<JobState> for AuditEventKind
impl From<JobState> for AuditEventKind
Source§impl PartialEq for AuditEventKind
impl PartialEq for AuditEventKind
impl StructuralPartialEq for AuditEventKind
Auto Trait Implementations§
impl Freeze for AuditEventKind
impl RefUnwindSafe for AuditEventKind
impl Send for AuditEventKind
impl Sync for AuditEventKind
impl Unpin for AuditEventKind
impl UnsafeUnpin for AuditEventKind
impl UnwindSafe for AuditEventKind
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> 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<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
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