55use crate :: Result ;
66
77use 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
1118macro_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
78129fn 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
149307fn process_cli ( plugins : & mut Map < String , Value > , cli : Value ) -> Result < ( ) > {
0 commit comments