use std::collections::BTreeMap;
use serde::{Deserialize, Serialize};
pub(crate) const RESTART_PATH: &str = "/data/api/v1/restart-tasks/restart";
pub(crate) const SCAN_PROJECTS_PATH: &str = "/data/api/v1/scan/projects";
pub(crate) const SECURITY_PROPERTIES_PATH: &str =
"/data/api/v1/resources/ignition/security-properties";
pub(crate) const WEBDEV_ROOT: &str = "/system/webdev/";
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct SecurityProperties {
#[serde(
rename = "readPermissions",
default,
skip_serializing_if = "Option::is_none"
)]
pub read_permissions: Option<serde_json::Value>,
#[serde(
rename = "writePermissions",
default,
skip_serializing_if = "Option::is_none"
)]
pub write_permissions: Option<serde_json::Value>,
#[serde(flatten)]
pub extra: BTreeMap<String, serde_json::Value>,
}
pub(crate) fn webdev_route_path(route: &str) -> String {
format!("{WEBDEV_ROOT}{route}")
}
#[cfg(test)]
mod tests {
use super::{SecurityProperties, webdev_route_path};
#[test]
fn doctor_probe_paths_pinned() {
assert_eq!(
super::SECURITY_PROPERTIES_PATH,
"/data/api/v1/resources/ignition/security-properties"
);
assert_eq!(super::WEBDEV_ROOT, "/system/webdev/");
assert_eq!(super::SCAN_PROJECTS_PATH, "/data/api/v1/scan/projects");
assert_eq!(super::RESTART_PATH, "/data/api/v1/restart-tasks/restart");
assert_eq!(webdev_route_path("stacked"), "/system/webdev/stacked");
}
#[test]
fn security_properties_parses_and_passes_through() {
let props: SecurityProperties = serde_json::from_value(serde_json::json!({
"readPermissions": {"anyOf": ["Authenticated/Roles/Administrator"]},
"writePermissions": {"anyOf": ["Authenticated/Roles/Administrator"]},
"secureChannelRequired": true
}))
.expect("singleton shape must parse");
assert!(props.read_permissions.is_some());
assert!(props.write_permissions.is_some());
assert!(
props.extra.contains_key("secureChannelRequired"),
"unknown keys round-trip"
);
let round = serde_json::to_value(&props).expect("serialize");
assert!(round.get("readPermissions").is_some());
assert!(round.get("writePermissions").is_some());
}
#[test]
fn security_properties_tolerates_sparse_bodies() {
let props: SecurityProperties =
serde_json::from_value(serde_json::json!({"name": "whk"})).expect("sparse body parses");
assert_eq!(props.read_permissions, None);
assert_eq!(props.write_permissions, None);
}
}