gatehouse_runtime_protocol/lifecycle/
installation.rs1use super::{
4 canonical,
5 wire::{EngineBinding, Request, PROTOCOL},
6};
7use crate::{digest, Invalid, Result};
8use serde::{Deserialize, Serialize};
9
10#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
11#[serde(deny_unknown_fields)]
12struct Host {
13 schema: String,
14 installation_path: String,
15 installation_sha256: String,
16 config_path: String,
17 config_sha256: String,
18}
19#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
20#[serde(deny_unknown_fields)]
21struct Installation {
22 schema: String,
23 product: String,
24 version: String,
25 protocol: String,
26 executable_path: String,
27 executable_sha256: String,
28 config_schema: String,
29}
30#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
31#[serde(deny_unknown_fields)]
32struct Config {
33 schema: String,
34 engine_binding: EngineBinding,
35}
36
37fn parse<T: serde::de::DeserializeOwned + Serialize>(bytes: &[u8]) -> Result<T> {
38 let value = canonical::parse_canonical(bytes)?;
39 let typed: T = serde_json::from_value(value)
40 .map_err(|_| Invalid("invalid lifecycle installation schema"))?;
41 if canonical::encode(
42 &serde_json::to_value(&typed).map_err(|_| Invalid("invalid installation encoding"))?,
43 )? != bytes
44 {
45 return Err(Invalid("installation fields changed during parsing"));
46 }
47 Ok(typed)
48}
49#[cfg(unix)]
50mod files;
51#[cfg(unix)]
52pub use files::{InstallationSnapshot, VerifiedInstallation};
53
54#[cfg(target_os = "linux")]
55mod sealed;
56#[cfg(target_os = "linux")]
57pub use sealed::parse_protected_inputs;