Skip to main content

Readiness

Enum Readiness 

Source
pub enum Readiness {
    Ready,
    AwaitingBootstrap,
    SealedAndEmpty {
        record: Option<Box<BootstrapRecord>>,
    },
}
Expand description

What state the identity table is in at start-up, and therefore whether the unauthenticated enrolment door is open.

Until 2026-08-05 there were two states and one of them was refuse to start: a server whose identity table was empty and which had been given no --admin-key bailed out of Server::start. That is why there was no first boot at all — the box could not be reached to be given its first key, and the only way in was gunnar key add with the server down, which needs a shell on the machine and there is no shell on the appliance.

The refusal is replaced by Readiness::AwaitingBootstrap: the server starts, and Bootstrap.Enroll is servable without a credential for exactly as long as AuthTable::bootstrap_record is None.

Three states, and each predicate below answers false for at least one of them: a may_serve() that had become true for every state would be an identity value, and a test sitting on it could not tell a working gate from a dead one (measured, not asserted).

Variants§

§

Ready

There is at least one registered key, and bootstrap has happened. Ordinary operation.

§

AwaitingBootstrap

Nothing has ever been enrolled. The identity table is empty and there is no BootstrapRecord. Bootstrap.Enroll is open, to anyone who can reach the control port. This must be said out loud at every start and reported in status; see gunnar_grpc::service::bootstrap.

§

SealedAndEmpty

The enrolment window is shut and there is no key to authenticate with. Nobody can reach this server over either listener until a key is put back with gunnar key add, offline — and the window stays shut regardless, which is the attack this design exists to refuse.

Fields

§record: Option<Box<BootstrapRecord>>

Who bootstrapped it, and when, so the operator can tell an attack from an accident.

None for a table that holds principals but no keys and carries no bootstrap record: a half-provisioned data path written before the record existed. That is a real state and must be described as itself rather than with an invented record.

Implementations§

Source§

impl Readiness

Source

pub fn bootstrap_window_open(&self) -> bool

Is the unauthenticated Bootstrap.Enroll window open?

True for exactly one of the three states.

Source

pub fn has_an_identity(&self) -> bool

Can anybody actually authenticate against this server right now?

False for both non-Ready states, for two different reasons, which is why this is not the negation of Readiness::bootstrap_window_open.

Trait Implementations§

Source§

impl Clone for Readiness

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Readiness

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Display for Readiness

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Eq for Readiness

Source§

impl PartialEq for Readiness

Source§

fn eq(&self, other: &Self) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl StructuralPartialEq for Readiness

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Allocation for T
where T: RefUnwindSafe + Send + Sync,

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

Source§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

Source§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

Source§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more