Skip to main content

coven_protocol/
recovery.rs

1//! Durable recovery authority: the exact continuation or Owner-recovery state
2//! a restore proves before it may rebuild a device.
3
4use serde::{Deserialize, Serialize};
5
6/// The closed authority a restore operation may exercise.
7#[derive(Clone, Serialize, Deserialize)]
8#[serde(rename_all = "snake_case", deny_unknown_fields)]
9pub enum RestoreAuthority {
10    /// Continue one exact, already-activated Store device.
11    ActivatedContinuation(ActivatedContinuation),
12    /// Recover an Owner identity at its exact root-anchored recovery cursor.
13    OwnerRecovery(OwnerRecoveryAuthority),
14}
15
16/// Exact durable state required to continue an activated Store device.
17#[derive(Clone, Serialize, Deserialize)]
18#[serde(deny_unknown_fields)]
19pub struct ActivatedContinuation {
20    pub identity_signing_secret: String,
21    pub device_signing_secret: String,
22    pub registration: crate::store_commit::StoreDeviceRegistrationRef,
23    pub registration_bytes: Vec<u8>,
24    pub registration_prepared: crate::objects::PreparedExactObject,
25    pub initial_ack: crate::store_commit::StoreAckRef,
26    pub initial_ack_bytes: Vec<u8>,
27    pub initial_ack_prepared: crate::objects::PreparedExactObject,
28    pub activation: crate::store_commit::StoreDeviceRegistrationActivation,
29    pub latest_ack: crate::store_commit::StoreAckRef,
30    pub latest_snapshot: Option<crate::store_commit::StoreSnapshotRef>,
31    pub latest_position: Option<crate::store_commit::StoreBatchCommitRef>,
32}
33
34/// Exact Owner grant and recovery-stream authority used to create a replacement
35/// device when no activated device continuation survives.
36#[derive(Clone, Serialize, Deserialize)]
37#[serde(deny_unknown_fields)]
38pub struct OwnerRecoveryAuthority {
39    pub owner_identity_secret: String,
40    pub owner_grant: crate::membership::MembershipGrantId,
41    pub recovery: crate::store_commit::OwnerRecoveryCursor,
42    pub published_at: String,
43}
44
45impl std::fmt::Debug for RestoreAuthority {
46    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
47        match self {
48            Self::ActivatedContinuation(value) => f
49                .debug_struct("ActivatedContinuation")
50                .field("identity_signing_secret", &"<redacted>")
51                .field("device_signing_secret", &"<redacted>")
52                .field("registration", &value.registration)
53                .field("initial_ack", &value.initial_ack)
54                .field("activation", &value.activation)
55                .field("latest_ack", &value.latest_ack)
56                .field("latest_snapshot", &value.latest_snapshot)
57                .field("latest_position", &value.latest_position)
58                .finish(),
59            Self::OwnerRecovery(value) => f
60                .debug_struct("OwnerRecovery")
61                .field("owner_identity_secret", &"<redacted>")
62                .field("owner_grant", &value.owner_grant)
63                .field("recovery", &value.recovery)
64                .finish(),
65        }
66    }
67}