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") { if let Some(Schema::Object(obj)) = schema.definitions.get_mut("PermissionEntry") {
let permission_entry_any_of_schemas = obj.subschemas().any_of.as_mut().unwrap(); let permission_entry_any_of_schemas = obj.subschemas().any_of.as_mut().unwrap();
if let Schema::Object(mut scope_extended_schema_obj) = if let Schema::Object(scope_extended_schema_obj) =
permission_entry_any_of_schemas.remove(permission_entry_any_of_schemas.len() - 1) permission_entry_any_of_schemas.last_mut().unwrap()
{ {
let mut global_scope_one_of = Vec::new(); 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), one_of: Some(global_scope_one_of),
..Default::default() ..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) => { CapabilityFile::Capability(c) => {
capabilities.insert(c.identifier.clone(), c); capabilities.insert(c.identifier.clone(), c);
} }
CapabilityFile::List { CapabilityFile::List(capabilities_list)
| CapabilityFile::NamedList {
capabilities: capabilities_list, capabilities: capabilities_list,
} => { } => {
capabilities.extend( capabilities.extend(

View File

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

View File

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

View File

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