adds warnings for extra manifest keys (#1278)

* adds warnings for extra manifest keys

* default to warn log level if env not specified
This commit is contained in:
Keagan McClelland
2022-02-25 17:18:55 -07:00
committed by GitHub
parent 6ef7da9732
commit 798e17f636
5 changed files with 83 additions and 12 deletions

24
backend/Cargo.lock generated
View File

@@ -404,14 +404,31 @@ dependencies = [
[[package]]
name = "ciborium"
version = "0.1.0"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "de6836a1b6197d8acdaac74a01af077a26aa6953d2e9251eef061c646b0d432c"
checksum = "b0c137568cc60b904a7724001b35ce2630fd00d5d84805fbb608ab89509d788f"
dependencies = [
"half",
"ciborium-io",
"ciborium-ll",
"serde",
]
[[package]]
name = "ciborium-io"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "346de753af073cc87b52b2083a506b38ac176a44cfb05497b622e27be899b369"
[[package]]
name = "ciborium-ll"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "213030a2b5a4e0c0892b6652260cf6ccac84827b83a85a534e178e3906c4cf1b"
dependencies = [
"ciborium-io",
"half",
]
[[package]]
name = "cipher"
version = "0.3.0"
@@ -867,6 +884,7 @@ dependencies = [
"http",
"hyper",
"hyper-ws-listener",
"imbl",
"indexmap",
"isocountry",
"itertools 0.10.1",

View File

@@ -69,6 +69,7 @@ hmac = "0.11.0"
http = "0.2.5"
hyper = "0.14.13"
hyper-ws-listener = { git = "https://github.com/Start9Labs/hyper-ws-listener.git", branch = "main" }
imbl = "1.0.1"
indexmap = { version = "1.7.0", features = ["serde"] }
isocountry = "0.3.2"
itertools = "0.10.1"
@@ -100,7 +101,7 @@ rpc-toolkit = { version = "*", path = "../rpc-toolkit/rpc-toolkit" }
rust-argon2 = "0.8.3"
scopeguard = "1.1" # because avahi-sys fucks your shit up
serde = { version = "1.0.130", features = ["derive", "rc"] }
serde_cbor = { package = "ciborium", version = "0.1.0" }
serde_cbor = { package = "ciborium", version = "0.2.0" }
serde_json = "1.0.68"
serde_toml = { package = "toml", version = "0.5.8" }
serde_yaml = "0.8.21"

View File

@@ -19,6 +19,9 @@ fn inner_main() -> Result<(), Error> {
.takes_value(true),
),
context: matches => {
if let Err(_) = std::env::var("RUST_LOG") {
std::env::set_var("RUST_LOG", "embassy=warn");
}
EmbassyLogger::init();
SdkContext::init(matches)?
},

View File

@@ -1,7 +1,9 @@
use std::path::PathBuf;
use color_eyre::eyre::eyre;
use imbl::OrdMap;
use rpc_toolkit::command;
use serde_json::Value;
use tracing::instrument;
use crate::context::SdkContext;
@@ -9,6 +11,7 @@ use crate::s9pk::builder::S9pkPacker;
use crate::s9pk::manifest::Manifest;
use crate::s9pk::reader::S9pkReader;
use crate::util::display_none;
use crate::util::serde::IoFormat;
use crate::volume::Volume;
use crate::{Error, ResultExt};
@@ -30,22 +33,25 @@ pub fn pack(#[context] ctx: SdkContext, #[arg] path: Option<PathBuf>) -> Result<
} else {
std::env::current_dir()?
};
let manifest: Manifest = if path.join("manifest.toml").exists() {
let mut s = String::new();
File::open(path.join("manifest.toml"))?.read_to_string(&mut s)?;
serde_toml::from_str(&s).with_kind(crate::ErrorKind::Deserialization)?
let manifest_value: Value = if path.join("manifest.toml").exists() {
IoFormat::Toml.from_reader(File::open(path.join("manifest.toml"))?)?
} else if path.join("manifest.yaml").exists() {
serde_yaml::from_reader(File::open(path.join("manifest.yaml"))?)
.with_kind(crate::ErrorKind::Deserialization)?
IoFormat::Yaml.from_reader(File::open(path.join("manifest.yaml"))?)?
} else if path.join("manifest.json").exists() {
serde_json::from_reader(File::open(path.join("manifest.json"))?)
.with_kind(crate::ErrorKind::Deserialization)?
IoFormat::Json.from_reader(File::open(path.join("manifest.json"))?)?
} else {
return Err(Error::new(
eyre!("manifest not found"),
crate::ErrorKind::Pack,
));
};
let manifest: Manifest = serde_json::from_value(manifest_value.clone())
.with_kind(crate::ErrorKind::Deserialization)?;
let extra_keys =
enumerate_extra_keys(&serde_json::to_value(&manifest).unwrap(), &manifest_value);
for k in extra_keys {
tracing::warn!("Unrecognized Manifest Key: {}", k);
}
let outfile_path = path.join(format!("{}.s9pk", manifest.id));
let mut outfile = File::create(outfile_path)?;
@@ -114,3 +120,45 @@ pub async fn verify(#[arg] path: PathBuf) -> Result<(), Error> {
Ok(())
}
fn enumerate_extra_keys(reference: &Value, candidate: &Value) -> Vec<String> {
match (reference, candidate) {
(Value::Object(m_r), Value::Object(m_c)) => {
let om_r: OrdMap<String, Value> = m_r.clone().into_iter().collect();
let om_c: OrdMap<String, Value> = m_c.clone().into_iter().collect();
let common = om_r.clone().intersection(om_c.clone());
let top_extra = common.clone().symmetric_difference(om_c.clone());
let mut all_extra = top_extra
.keys()
.map(|s| format!(".{}", s))
.collect::<Vec<String>>();
for (k, v) in common {
all_extra.extend(
enumerate_extra_keys(&v, om_c.get(&k).unwrap())
.into_iter()
.map(|s| format!(".{}{}", k, s)),
)
}
all_extra
}
(_, Value::Object(m1)) => m1.clone().keys().map(|s| format!(".{}", s)).collect(),
_ => Vec::new(),
}
}
#[test]
fn test_enumerate_extra_keys() {
use serde_json::json;
let extras = enumerate_extra_keys(
&json!({
"test": 1,
"test2": null,
}),
&json!({
"test": 1,
"test2": { "test3": null },
"test4": null
}),
);
println!("{:?}", extras)
}

View File

@@ -1,3 +1,4 @@
use tracing::metadata::LevelFilter;
use tracing::Subscriber;
use tracing_subscriber::util::SubscriberInitExt;