From ab3e9dfa877983999fb4aaf5fd5c6bc7943f0866 Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Wed, 29 May 2024 16:17:52 -0400 Subject: [PATCH] prepareroot: Also accept composefs enabled=signed This was an oversight, unfortunately having two different programming languages here led to less code sharing. Closes: https://github.com/ostreedev/ostree-rs-ext/issues/633 --- lib/src/ostree_prepareroot.rs | 59 +++++++++++++++++++++++++++++++++-- 1 file changed, 57 insertions(+), 2 deletions(-) diff --git a/lib/src/ostree_prepareroot.rs b/lib/src/ostree_prepareroot.rs index 1227b944..de7b84fb 100644 --- a/lib/src/ostree_prepareroot.rs +++ b/lib/src/ostree_prepareroot.rs @@ -84,6 +84,39 @@ impl Tristate { } } +#[derive(Debug, PartialEq, Eq)] +enum ComposefsState { + Signed, + Tristate(Tristate), +} + +impl Default for ComposefsState { + fn default() -> Self { + Self::Tristate(Tristate::default()) + } +} + +impl FromStr for ComposefsState { + type Err = anyhow::Error; + + fn from_str(s: &str) -> Result { + let r = match s { + "signed" => Self::Signed, + o => Self::Tristate(Tristate::from_str(o)?), + }; + Ok(r) + } +} + +impl ComposefsState { + pub(crate) fn maybe_enabled(&self) -> bool { + match self { + ComposefsState::Signed => true, + ComposefsState::Tristate(t) => t.maybe_enabled(), + } + } +} + /// Query whether the config uses an overlayfs model (composefs or plain overlayfs). pub fn overlayfs_enabled_in_config(config: &glib::KeyFile) -> Result { let root_transient = config @@ -91,7 +124,7 @@ pub fn overlayfs_enabled_in_config(config: &glib::KeyFile) -> Result { .unwrap_or_default(); let composefs = config .optional_string("composefs", "enabled")? - .map(|s| Tristate::from_str(s.as_str())) + .map(|s| ComposefsState::from_str(s.as_str())) .transpose() .log_err_default() .unwrap_or_default(); @@ -112,6 +145,27 @@ fn test_tristate() { } } +#[test] +fn test_composefs_state() { + assert_eq!( + ComposefsState::from_str("signed").unwrap(), + ComposefsState::Signed + ); + for v in ["yes", "true", "1"] { + assert_eq!( + ComposefsState::from_str(v).unwrap(), + ComposefsState::Tristate(Tristate::Enabled) + ); + } + assert_eq!(Tristate::from_str("maybe").unwrap(), Tristate::Maybe); + for v in ["no", "false", "0"] { + assert_eq!( + ComposefsState::from_str(v).unwrap(), + ComposefsState::Tristate(Tristate::Disabled) + ); + } +} + #[test] fn test_overlayfs_enabled() { let d0 = indoc::indoc! { r#" @@ -136,7 +190,8 @@ enabled = false let e0 = format!("{d0}\n[root]\ntransient = true"); let e1 = format!("{d1}\n[composefs]\nenabled = true\n[other]\nsomekey = someval"); let e2 = format!("{d1}\n[composefs]\nenabled = yes"); - for v in [e0, e1, e2] { + let e3 = format!("{d1}\n[composefs]\nenabled = signed"); + for v in [e0, e1, e2, e3] { let kf = glib::KeyFile::new(); kf.load_from_data(&v, glib::KeyFileFlags::empty()).unwrap(); assert_eq!(overlayfs_enabled_in_config(&kf).unwrap(), true);