feat: enhance multiple capabilities file format & fix mixed permissions schema (#9079)

* feat: enhance multiple capabilities file format & fix mixed permissions schema

* change files
This commit is contained in:
Amr Bashir 2024-03-05 18:09:32 +02:00 committed by GitHub
parent 4bf1c55b0d
commit bb23511ea8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 24 additions and 13 deletions

View File

@ -0,0 +1,5 @@
---
"tauri-build": patch:bug
---
Fixed generation of capability schema for permissions field which previously disallowed mixed (strings and objects) permission definition.

View File

@ -0,0 +1,5 @@
---
"tauri-utils": major:breaking
---
Changed `CapabiltyFile::List` enum variant to be a tuple-struct and added `CapabiltyFile::NamedList`. This allows more flexibility when parsing capabilties from JSON files.

View File

@ -168,8 +168,8 @@ fn capabilities_schema(acl_manifests: &BTreeMap<String, Manifest>) -> RootSchema
if let Some(Schema::Object(obj)) = schema.definitions.get_mut("PermissionEntry") {
let permission_entry_any_of_schemas = obj.subschemas().any_of.as_mut().unwrap();
if let Schema::Object(mut scope_extended_schema_obj) =
permission_entry_any_of_schemas.remove(permission_entry_any_of_schemas.len() - 1)
if let Schema::Object(scope_extended_schema_obj) =
permission_entry_any_of_schemas.last_mut().unwrap()
{
let mut global_scope_one_of = Vec::new();
@ -246,8 +246,6 @@ fn capabilities_schema(acl_manifests: &BTreeMap<String, Manifest>) -> RootSchema
one_of: Some(global_scope_one_of),
..Default::default()
}));
permission_entry_any_of_schemas.push(scope_extended_schema_obj.into());
};
}
}

View File

@ -425,7 +425,8 @@ pub fn context_codegen(data: ContextData) -> Result<TokenStream, EmbeddedAssetsE
CapabilityFile::Capability(c) => {
capabilities.insert(c.identifier.clone(), c);
}
CapabilityFile::List {
CapabilityFile::List(capabilities_list)
| CapabilityFile::NamedList {
capabilities: capabilities_list,
} => {
capabilities.extend(

View File

@ -136,7 +136,7 @@ pub fn parse_capabilities(
CapabilityFile::Capability(capability) => {
capabilities_map.insert(capability.identifier.clone(), capability);
}
CapabilityFile::List { capabilities } => {
CapabilityFile::List(capabilities) | CapabilityFile::NamedList { capabilities } => {
for capability in capabilities {
capabilities_map.insert(capability.identifier.clone(), capability);
}

View File

@ -110,7 +110,9 @@ pub enum CapabilityFile {
/// A single capability.
Capability(Capability),
/// A list of capabilities.
List {
List(Vec<Capability>),
/// A list of capabilities.
NamedList {
/// The list of capabilities.
capabilities: Vec<Capability>,
},
@ -135,11 +137,9 @@ impl FromStr for CapabilityFile {
type Err = super::Error;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s.chars().next() {
Some('[') => toml::from_str(s).map_err(Into::into),
Some('{') => serde_json::from_str(s).map_err(Into::into),
_ => Err(super::Error::UnknownCapabilityFormat(s.into())),
}
serde_json::from_str(s)
.or_else(|_| toml::from_str(s))
.map_err(Into::into)
}
}

View File

@ -243,7 +243,9 @@ impl RuntimeAuthority {
CapabilityFile::Capability(c) => {
capabilities.insert(c.identifier.clone(), c);
}
CapabilityFile::List {
CapabilityFile::List(capabilities_list)
| CapabilityFile::NamedList {
capabilities: capabilities_list,
} => {
capabilities.extend(