33
44mod oidc;
55mod state;
6+ use std:: os:: unix:: fs:: PermissionsExt ;
7+
68use openconnect_core:: storage:: { StoredConfigs , StoredConfigsJson } ;
79use state:: AppState ;
810use tauri:: Manager ;
@@ -63,11 +65,23 @@ async fn get_stored_configs() -> anyhow::Result<StoredConfigsJson, String> {
6365}
6466
6567fn main ( ) {
66- #[ cfg( not ( target_os = "windows" ) ) ]
68+ #[ cfg( target_os = "linux" ) ]
6769 {
6870 sudo:: escalate_if_needed ( ) . unwrap ( ) ;
6971 }
7072
73+ #[ cfg( target_os = "macos" ) ]
74+ {
75+ #[ cfg( debug_assertions) ]
76+ sudo:: escalate_if_needed ( ) . unwrap ( ) ;
77+
78+ unsafe {
79+ if libc:: geteuid ( ) != 0 && openconnect_core:: helper_reluanch_as_root ( ) == 1 {
80+ std:: process:: exit ( 0 ) ;
81+ }
82+ }
83+ }
84+
7185 tauri:: Builder :: default ( )
7286 . register_uri_scheme_protocol ( "oidcvpn" , |app, _req| {
7387 let _app_state: tauri:: State < ' _ , AppState > = app. state ( ) ;
@@ -78,6 +92,30 @@ fn main() {
7892 . body ( b"Authenticated, close this window and return to the application." . to_vec ( ) )
7993 } )
8094 . setup ( |app| {
95+ #[ cfg( not( target_os = "windows" ) ) ]
96+ {
97+ let resource_path = app
98+ . path_resolver ( )
99+ . resolve_resource ( "vpnc-scripts/vpnc-script" )
100+ . expect ( "failed to resolve resource" ) ;
101+
102+ let file = std:: fs:: OpenOptions :: new ( )
103+ . write ( false )
104+ . create ( false )
105+ . append ( false )
106+ . read ( true )
107+ . open ( resource_path)
108+ . expect ( "failed to open file" ) ;
109+
110+ let permissions = file. metadata ( ) . unwrap ( ) . permissions ( ) ;
111+ let is_executable = permissions. mode ( ) & 0o111 != 0 ;
112+ if !is_executable {
113+ let mut permissions = permissions;
114+ permissions. set_mode ( 0o755 ) ;
115+ file. set_permissions ( permissions) . unwrap ( ) ;
116+ }
117+ }
118+
81119 AppState :: handle ( app) ;
82120 Ok ( ( ) )
83121 } )
0 commit comments