Skip to content

Commit 1878766

Browse files
authored
feat(cli): migrate allowlist to new ACL (#8667)
1 parent c77b403 commit 1878766

2 files changed

Lines changed: 174 additions & 10 deletions

File tree

.changes/migrate-allowlist.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"tauri-cli": 'patch:feat'
3+
"@tauri-apps/cli": 'patch:feat'
4+
---
5+
6+
Migrate the allowlist config to the new capability file format.

tooling/cli/src/migrate/config.rs

Lines changed: 168 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,15 @@
55
use crate::Result;
66

77
use serde_json::{Map, Value};
8+
use tauri_utils::{
9+
acl::capability::{Capability, CapabilityContext},
10+
platform::Target,
11+
};
812

9-
use std::{fs::write, path::Path};
13+
use std::{
14+
fs::{create_dir_all, write},
15+
path::Path,
16+
};
1017

1118
macro_rules! move_allowlist_object {
1219
($plugins: ident, $value: expr, $plugin: literal, $field: literal) => {{
@@ -16,7 +23,7 @@ macro_rules! move_allowlist_object {
1623
.or_insert_with(|| Value::Object(Default::default()))
1724
.as_object_mut()
1825
.unwrap()
19-
.insert($field.into(), serde_json::to_value($value)?);
26+
.insert($field.into(), serde_json::to_value($value.clone())?);
2027
}
2128
}};
2229
}
@@ -25,14 +32,56 @@ pub fn migrate(tauri_dir: &Path) -> Result<()> {
2532
if let Ok((mut config, config_path)) =
2633
tauri_utils_v1::config::parse::parse_value(tauri_dir.join("tauri.conf.json"))
2734
{
28-
migrate_config(&mut config)?;
29-
write(config_path, serde_json::to_string_pretty(&config)?)?;
35+
let migrated = migrate_config(&mut config)?;
36+
write(&config_path, serde_json::to_string_pretty(&config)?)?;
37+
38+
let mut permissions = vec![
39+
"path:default",
40+
"event:default",
41+
"window:default",
42+
"app:default",
43+
"resources:default",
44+
"menu:default",
45+
"tray:default",
46+
];
47+
permissions.extend(migrated.permissions);
48+
49+
let capabilities_path = config_path.parent().unwrap().join("capabilities");
50+
create_dir_all(&capabilities_path)?;
51+
write(
52+
capabilities_path.join("migrated.json"),
53+
serde_json::to_string_pretty(&Capability {
54+
identifier: "migrated".to_string(),
55+
description: "permissions that were migrated from v1".into(),
56+
context: CapabilityContext::Local,
57+
windows: vec!["main".into()],
58+
permissions: permissions
59+
.into_iter()
60+
.map(|p| p.to_string().try_into().unwrap())
61+
.collect(),
62+
platforms: vec![
63+
Target::Linux,
64+
Target::MacOS,
65+
Target::Windows,
66+
Target::Android,
67+
Target::Ios,
68+
],
69+
})?,
70+
)?;
3071
}
3172

3273
Ok(())
3374
}
3475

35-
fn migrate_config(config: &mut Value) -> Result<()> {
76+
struct MigratedConfig {
77+
permissions: Vec<&'static str>,
78+
}
79+
80+
fn migrate_config(config: &mut Value) -> Result<MigratedConfig> {
81+
let mut migrated = MigratedConfig {
82+
permissions: Vec::new(),
83+
};
84+
3685
if let Some(config) = config.as_object_mut() {
3786
let mut plugins = config
3887
.entry("plugins")
@@ -44,7 +93,9 @@ fn migrate_config(config: &mut Value) -> Result<()> {
4493
if let Some(tauri_config) = config.get_mut("tauri").and_then(|c| c.as_object_mut()) {
4594
// allowlist
4695
if let Some(allowlist) = tauri_config.remove("allowlist") {
47-
process_allowlist(tauri_config, &mut plugins, allowlist)?;
96+
let allowlist = process_allowlist(tauri_config, &mut plugins, allowlist)?;
97+
let permissions = allowlist_to_permissions(&allowlist);
98+
migrated.permissions = permissions;
4899
}
49100

50101
if let Some(security) = tauri_config
@@ -72,7 +123,7 @@ fn migrate_config(config: &mut Value) -> Result<()> {
72123
config.insert("plugins".into(), plugins.into());
73124
}
74125

75-
Ok(())
126+
Ok(migrated)
76127
}
77128

78129
fn process_security(security: &mut Map<String, Value>) -> Result<()> {
@@ -117,7 +168,7 @@ fn process_allowlist(
117168
tauri_config: &mut Map<String, Value>,
118169
plugins: &mut Map<String, Value>,
119170
allowlist: Value,
120-
) -> Result<()> {
171+
) -> Result<tauri_utils_v1::config::AllowlistConfig> {
121172
let allowlist: tauri_utils_v1::config::AllowlistConfig = serde_json::from_value(allowlist)?;
122173

123174
move_allowlist_object!(plugins, allowlist.fs.scope, "fs", "scope");
@@ -135,15 +186,122 @@ fn process_allowlist(
135186
let mut asset_protocol = Map::new();
136187
asset_protocol.insert(
137188
"scope".into(),
138-
serde_json::to_value(allowlist.protocol.asset_scope)?,
189+
serde_json::to_value(allowlist.protocol.asset_scope.clone())?,
139190
);
140191
if allowlist.protocol.asset {
141192
asset_protocol.insert("enable".into(), true.into());
142193
}
143194
security.insert("assetProtocol".into(), asset_protocol.into());
144195
}
145196

146-
Ok(())
197+
Ok(allowlist)
198+
}
199+
200+
fn allowlist_to_permissions(
201+
allowlist: &tauri_utils_v1::config::AllowlistConfig,
202+
) -> Vec<&'static str> {
203+
macro_rules! permissions {
204+
($allowlist: ident, $permissions_list: ident, $object: ident, $field: ident => $associated_permission: expr) => {
205+
if $allowlist.all || $allowlist.$object.all || $allowlist.$object.$field {
206+
$permissions_list.push($associated_permission);
207+
}
208+
};
209+
}
210+
211+
let mut permissions = Vec::new();
212+
213+
// fs
214+
permissions!(allowlist, permissions, fs, read_file => "fs:allow-read-file");
215+
permissions!(allowlist, permissions, fs, write_file => "fs:allow-write-file");
216+
permissions!(allowlist, permissions, fs, read_dir => "fs:allow-read-dir");
217+
permissions!(allowlist, permissions, fs, copy_file => "fs:allow-copy-file");
218+
permissions!(allowlist, permissions, fs, create_dir => "fs:allow-mkdir");
219+
permissions!(allowlist, permissions, fs, remove_dir => "fs:allow-remove");
220+
permissions!(allowlist, permissions, fs, remove_file => "fs:allow-remove");
221+
permissions!(allowlist, permissions, fs, rename_file => "fs:allow-rename");
222+
permissions!(allowlist, permissions, fs, exists => "fs:allow-exists");
223+
// window
224+
permissions!(allowlist, permissions, window, create => "window:allow-create");
225+
permissions!(allowlist, permissions, window, center => "window:allow-center");
226+
permissions!(allowlist, permissions, window, request_user_attention => "window:allow-request-user-attention");
227+
permissions!(allowlist, permissions, window, set_resizable => "window:allow-set-resizable");
228+
permissions!(allowlist, permissions, window, set_maximizable => "window:allow-set-maximizable");
229+
permissions!(allowlist, permissions, window, set_minimizable => "window:allow-set-minimizable");
230+
permissions!(allowlist, permissions, window, set_closable => "window:allow-set-closable");
231+
permissions!(allowlist, permissions, window, set_title => "window:allow-set-title");
232+
permissions!(allowlist, permissions, window, maximize => "window:allow-maximize");
233+
permissions!(allowlist, permissions, window, unmaximize => "window:allow-unmaximize");
234+
permissions!(allowlist, permissions, window, minimize => "window:allow-minimize");
235+
permissions!(allowlist, permissions, window, unminimize => "window:allow-unminimize");
236+
permissions!(allowlist, permissions, window, show => "window:allow-show");
237+
permissions!(allowlist, permissions, window, hide => "window:allow-hide");
238+
permissions!(allowlist, permissions, window, close => "window:allow-close");
239+
permissions!(allowlist, permissions, window, set_decorations => "window:allow-set-decorations");
240+
permissions!(allowlist, permissions, window, set_always_on_top => "window:allow-set-always-on-top");
241+
permissions!(allowlist, permissions, window, set_content_protected => "window:allow-set-content-protected");
242+
permissions!(allowlist, permissions, window, set_size => "window:allow-set-size");
243+
permissions!(allowlist, permissions, window, set_min_size => "window:allow-set-min-size");
244+
permissions!(allowlist, permissions, window, set_max_size => "window:allow-set-max-size");
245+
permissions!(allowlist, permissions, window, set_position => "window:allow-set-position");
246+
permissions!(allowlist, permissions, window, set_fullscreen => "window:allow-set-fullscreen");
247+
permissions!(allowlist, permissions, window, set_focus => "window:allow-set-focus");
248+
permissions!(allowlist, permissions, window, set_icon => "window:allow-set-icon");
249+
permissions!(allowlist, permissions, window, set_skip_taskbar => "window:allow-set-skip-taskbar");
250+
permissions!(allowlist, permissions, window, set_cursor_grab => "window:allow-set-cursor-grab");
251+
permissions!(allowlist, permissions, window, set_cursor_visible => "window:allow-set-cursor-visible");
252+
permissions!(allowlist, permissions, window, set_cursor_icon => "window:allow-set-cursor-icon");
253+
permissions!(allowlist, permissions, window, set_cursor_position => "window:allow-set-cursor-position");
254+
permissions!(allowlist, permissions, window, set_ignore_cursor_events => "window:allow-set-ignore-cursor-events");
255+
permissions!(allowlist, permissions, window, start_dragging => "window:allow-start-dragging");
256+
permissions!(allowlist, permissions, window, print => "webview:allow-print");
257+
// shell
258+
permissions!(allowlist, permissions, shell, execute => "shell:allow-execute");
259+
permissions!(allowlist, permissions, shell, sidecar => "shell:allow-execute");
260+
if allowlist.all
261+
|| allowlist.shell.all
262+
|| !matches!(
263+
allowlist.shell.open,
264+
tauri_utils_v1::config::ShellAllowlistOpen::Flag(false)
265+
)
266+
{
267+
permissions.push("shell:allow-open");
268+
}
269+
// dialog
270+
permissions!(allowlist, permissions, dialog, open => "dialog:allow-open");
271+
permissions!(allowlist, permissions, dialog, save => "dialog:allow-save");
272+
permissions!(allowlist, permissions, dialog, message => "dialog:allow-message");
273+
permissions!(allowlist, permissions, dialog, ask => "dialog:allow-ask");
274+
permissions!(allowlist, permissions, dialog, confirm => "dialog:allow-confirm");
275+
// http
276+
permissions!(allowlist, permissions, http, request => "http:default");
277+
// notification
278+
permissions!(allowlist, permissions, notification, all => "notification:default");
279+
// global-shortcut
280+
permissions!(allowlist, permissions, global_shortcut, all => "global-shortcut:allow-is-registered");
281+
permissions!(allowlist, permissions, global_shortcut, all => "global-shortcut:allow-register");
282+
permissions!(allowlist, permissions, global_shortcut, all => "global-shortcut:allow-register-all");
283+
permissions!(allowlist, permissions, global_shortcut, all => "global-shortcut:allow-unregister");
284+
permissions!(allowlist, permissions, global_shortcut, all => "global-shortcut:allow-unregister-all");
285+
// os
286+
permissions!(allowlist, permissions, os, all => "os:allow-platform");
287+
permissions!(allowlist, permissions, os, all => "os:allow-version");
288+
permissions!(allowlist, permissions, os, all => "os:allow-os-type");
289+
permissions!(allowlist, permissions, os, all => "os:allow-family");
290+
permissions!(allowlist, permissions, os, all => "os:allow-arch");
291+
permissions!(allowlist, permissions, os, all => "os:allow-exe-extension");
292+
permissions!(allowlist, permissions, os, all => "os:allow-locale");
293+
permissions!(allowlist, permissions, os, all => "os:allow-hostname");
294+
// process
295+
permissions!(allowlist, permissions, process, relaunch => "process:allow-restart");
296+
permissions!(allowlist, permissions, process, exit => "process:allow-exit");
297+
// clipboard
298+
permissions!(allowlist, permissions, clipboard, read_text => "clipboard-manager:allow-read");
299+
permissions!(allowlist, permissions, clipboard, write_text => "clipboard-manager:allow-write");
300+
// app
301+
permissions!(allowlist, permissions, app, show => "app:allow-app-show");
302+
permissions!(allowlist, permissions, app, hide => "app:allow-app-hide");
303+
304+
permissions
147305
}
148306

149307
fn process_cli(plugins: &mut Map<String, Value>, cli: Value) -> Result<()> {

0 commit comments

Comments
 (0)