diff --git a/.changes/fix-permission-add-duplicates.md b/.changes/fix-permission-add-duplicates.md new file mode 100644 index 000000000..71829845c --- /dev/null +++ b/.changes/fix-permission-add-duplicates.md @@ -0,0 +1,6 @@ +--- +"tauri-cli": "patch:bug" +"@tauri-apps/cli": "patch:bug" +--- + +Fix `tauri permission add` could add duplicated permissions to the capability files diff --git a/crates/tauri-cli/src/acl/permission/add.rs b/crates/tauri-cli/src/acl/permission/add.rs index abec2c7d4..7a6bdf42e 100644 --- a/crates/tauri-cli/src/acl/permission/add.rs +++ b/crates/tauri-cli/src/acl/permission/add.rs @@ -77,6 +77,26 @@ impl TomlOrJson { }; } + fn has_permission(&self, identifier: &str) -> bool { + (|| { + Some(match self { + TomlOrJson::Toml(t) => t + .get("permissions")? + .as_array()? + .iter() + .any(|value| value.as_str() == Some(identifier)), + + TomlOrJson::Json(j) => j + .as_object()? + .get("permissions")? + .as_array()? + .iter() + .any(|value| value.as_str() == Some(identifier)), + }) + })() + .unwrap_or_default() + } + fn to_string(&self) -> Result { Ok(match self { TomlOrJson::Toml(t) => t.to_string(), @@ -236,9 +256,18 @@ pub fn command(options: Options) -> Result<()> { } for (capability, path) in &mut capabilities { - capability.insert_permission(options.identifier.clone()); - std::fs::write(&*path, capability.to_string()?)?; - log::info!(action = "Added"; "permission `{}` to `{}` at {}", options.identifier, capability.identifier(), dunce::simplified(path).display()); + if capability.has_permission(&options.identifier) { + log::info!( + "Permission `{}` already found in `{}` at {}", + options.identifier, + capability.identifier(), + dunce::simplified(path).display() + ); + } else { + capability.insert_permission(options.identifier.clone()); + std::fs::write(&*path, capability.to_string()?)?; + log::info!(action = "Added"; "permission `{}` to `{}` at {}", options.identifier, capability.identifier(), dunce::simplified(path).display()); + } } Ok(())