refuse config keys knot-static doesn't know instead of ignoring them
Signed-off-by: dawn <90008@klbr.net>
35 unmodified lines36373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108194 unmodified linesExpand all35 unmodified lines );}
#[test]fn a_misplaced_or_misspelled_key_is_refused_by_name() { let error = load_result("[activate.site_hook]\ncommand = \"/bin/true\"") .err() .expect("site_hook is a top-level table"); assert!( format!("{error:#}").contains("unknown field `site_hook`"), "{error:#}" ); for (extra, key) in [ ("[index]\nlink = \"https://example.test\"", "link"), ("[serve.limits]\npack_rates = \"2m\"", "pack_rates"), ("[site_hook]\ncommand = \"/bin/true\"\nargv = []", "argv"), ("[knots]\nhostname = \"knot.test\"", "knots"), ] { let error = load_result(extra).err().expect(extra); assert!( format!("{error:#}").contains(&format!("unknown field `{key}`")), "{error:#}" ); } assert!(load_result("[site_hook]\ncommand = \"/bin/true\"").is_ok());}
/// what nix/module.nix writes before any `settings` of its own#[test]fn the_nixos_modules_default_settings_load() { ValidatedConfig::from_toml( r#"[activate]listen = "127.0.0.1:8080"nginx_binary = "/nix/store/nginx/bin/nginx"real_ip_from = ["127.0.0.1"]reload_command = "p=$(cat /var/lib/knot-static/out/runtime/nginx.pid 2>/dev/null); [ -z \"$p\" ] || kill -HUP $p"
[crawl]urls = ["https://index.tangled.network"]
[firehose]socket = "/run/knot-static-firehose.sock"
[knot]hostname = "git.example.com"owner = "did:plc:owner"
[output]root = "/var/lib/knot-static/out"
[repo]default_branch = "main"object_format = "sha1"scan_path = "/var/lib/knot-static/src"
[secrets]sealed_key_file = "/var/lib/knot-static/keys.sealed"
[writes]cgi_binary = "/run/current-system/sw/bin/knot-static"enabled = truefastcgi_socket = "unix:/run/knot-static/fcgiwrap.sock""#, ) .expect("the module's settings validate");}
#[test]fn trusted_clients_are_addresses_or_prefixes_with_a_rate() { let served = load_with( "[serve]\ntrusted = [\"203.0.113.5\", \"2a01:4f8::/32\"]\ntrusted_rate = \"20m\"", );194 unmodified linesExpand all13 unmodified lines141516171819202122249 unmodified linesExpand all27227327427527627727827928019 unmodified lines3003013023033043053063073082 unmodified lines3113123133143153163173183192 unmodified lines32232332432532632732832933016 unmodified lines34734834935035135235335435535635735835936036136236336436536636736836985 unmodified lines45545645745845946046146246316 unmodified lines4804814824834844854864874884894904914924934944951 unmodified line4974984995005015025035045053 unmodified lines50951051151251351451551651713 unmodified lines53153253353453553653753813 unmodified lines pub site_hook: Option<SiteHook>,}
#[derive(Debug, Clone, Deserialize)]#[serde(deny_unknown_fields)]pub struct SiteHook { pub command: PathBuf, #[serde(default)] pub args: Vec<String>,249 unmodified linesExpand all }}
#[derive(Deserialize, Default)]#[serde(deny_unknown_fields)]pub(crate) struct RawIndex { #[serde(default)] pub(crate) title: Option<String>, #[serde(default)]19 unmodified lines pub cgi_binary: PathBuf,}
#[derive(Deserialize, Default)]#[serde(deny_unknown_fields)]pub(crate) struct RawWrites { #[serde(default)] pub(crate) enabled: bool, #[serde(default)]2 unmodified lines pub(crate) cgi_binary: Option<PathBuf>,}
#[derive(Deserialize, Default)]#[serde(deny_unknown_fields)]pub(crate) struct RawServe { #[serde(default)] pub(crate) trusted: Vec<String>, #[serde(default)]2 unmodified lines pub(crate) limits: RawLimits,}
#[derive(Deserialize, Default)]#[serde(deny_unknown_fields)]pub(crate) struct RawLimits { #[serde(default)] pub(crate) pack_rate: Option<toml::Value>, #[serde(default)]16 unmodified lines pub(crate) inflate_rate_all: Option<toml::Value>,}
#[derive(Deserialize, Default)]#[serde(deny_unknown_fields)]pub(crate) struct RawCrawl { #[serde(default)] pub(crate) urls: Vec<String>,}
#[derive(Deserialize, Default)]#[serde(deny_unknown_fields)]pub(crate) struct RawFirehose { #[serde(default)] pub(crate) socket: Option<PathBuf>,}
#[derive(Deserialize, Default)]#[serde(deny_unknown_fields)]pub(crate) struct RawActivate { #[serde(default)] pub(crate) nginx_binary: Option<String>, #[serde(default)]85 unmodified lines .with_context(|| format!("{field} {value} is not a count or \"off\""))}
#[derive(Deserialize)]#[serde(deny_unknown_fields)]pub(crate) struct RawConfig { pub(crate) knot: RawKnot, pub(crate) repo: RawRepo, pub(crate) secrets: RawSecrets,16 unmodified lines pub(crate) site_hook: Option<SiteHook>,}
#[derive(Deserialize)]#[serde(deny_unknown_fields)]pub(crate) struct RawKnot { pub(crate) hostname: String, pub(crate) owner: String,}
#[derive(Deserialize)]#[serde(deny_unknown_fields)]pub(crate) struct RawRepo { pub(crate) scan_path: PathBuf, #[serde(default)] pub(crate) default_branch: Option<String>,1 unmodified line pub(crate) object_format: Option<String>,}
#[derive(Deserialize)]#[serde(deny_unknown_fields)]pub(crate) struct RawSecrets { pub(crate) sealed_key_file: PathBuf, #[serde(default = "default_master_key_env")] pub(crate) master_key_env: String,3 unmodified lines "KNOT_MASTER_KEY".to_string()}
#[derive(Deserialize)]#[serde(deny_unknown_fields)]pub(crate) struct RawAtproto { #[serde(default = "default_plc_directory")] pub(crate) plc_directory: String, #[serde(default)]13 unmodified lines "https://plc.directory".to_string()}
#[derive(Deserialize)]#[serde(deny_unknown_fields)]pub(crate) struct RawOutput { pub(crate) root: PathBuf,}