mirror of
https://github.com/clash-verge-rev/clash-verge-rev
synced 2025-05-05 06:33:45 +08:00
chore: Remove unsafe function
This commit is contained in:
parent
5927e0bb3b
commit
64fafb0795
@ -1,5 +1,3 @@
|
|||||||
use std::borrow::Cow;
|
|
||||||
|
|
||||||
/// 给clash内核的tun模式授权
|
/// 给clash内核的tun模式授权
|
||||||
#[cfg(any(target_os = "macos", target_os = "linux"))]
|
#[cfg(any(target_os = "macos", target_os = "linux"))]
|
||||||
pub fn grant_permission(core: String) -> anyhow::Result<()> {
|
pub fn grant_permission(core: String) -> anyhow::Result<()> {
|
||||||
@ -13,9 +11,6 @@ pub fn grant_permission(core: String) -> anyhow::Result<()> {
|
|||||||
|
|
||||||
#[cfg(target_os = "macos")]
|
#[cfg(target_os = "macos")]
|
||||||
let output = {
|
let output = {
|
||||||
// the path of clash /Applications/Clash Verge.app/Contents/MacOS/clash
|
|
||||||
// https://apple.stackexchange.com/questions/82967/problem-with-empty-spaces-when-executing-shell-commands-in-applescript
|
|
||||||
// let path = escape(&path);
|
|
||||||
let path = path.replace(' ', "\\\\ ");
|
let path = path.replace(' ', "\\\\ ");
|
||||||
let shell = format!("chown root:admin {path}\nchmod +sx {path}");
|
let shell = format!("chown root:admin {path}\nchmod +sx {path}");
|
||||||
let command = format!(r#"do shell script "{shell}" with administrator privileges"#);
|
let command = format!(r#"do shell script "{shell}" with administrator privileges"#);
|
||||||
@ -50,33 +45,3 @@ pub fn grant_permission(core: String) -> anyhow::Result<()> {
|
|||||||
anyhow::bail!("{stderr}");
|
anyhow::bail!("{stderr}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(unused)]
|
|
||||||
pub fn escape<'a>(text: &'a str) -> Cow<'a, str> {
|
|
||||||
let bytes = text.as_bytes();
|
|
||||||
|
|
||||||
let mut owned = None;
|
|
||||||
|
|
||||||
for pos in 0..bytes.len() {
|
|
||||||
let special = match bytes[pos] {
|
|
||||||
b' ' => Some(b' '),
|
|
||||||
_ => None,
|
|
||||||
};
|
|
||||||
if let Some(s) = special {
|
|
||||||
if owned.is_none() {
|
|
||||||
owned = Some(bytes[0..pos].to_owned());
|
|
||||||
}
|
|
||||||
owned.as_mut().unwrap().push(b'\\');
|
|
||||||
owned.as_mut().unwrap().push(b'\\');
|
|
||||||
owned.as_mut().unwrap().push(s);
|
|
||||||
} else if let Some(owned) = owned.as_mut() {
|
|
||||||
owned.push(bytes[pos]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if let Some(owned) = owned {
|
|
||||||
unsafe { Cow::Owned(String::from_utf8_unchecked(owned)) }
|
|
||||||
} else {
|
|
||||||
unsafe { Cow::Borrowed(std::str::from_utf8_unchecked(bytes)) }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -4,4 +4,3 @@ pub mod init;
|
|||||||
pub mod resolve;
|
pub mod resolve;
|
||||||
pub mod server;
|
pub mod server;
|
||||||
pub mod tmpl;
|
pub mod tmpl;
|
||||||
// mod winhelp;
|
|
||||||
|
@ -1,69 +0,0 @@
|
|||||||
#![cfg(target_os = "windows")]
|
|
||||||
#![allow(non_snake_case)]
|
|
||||||
#![allow(non_camel_case_types)]
|
|
||||||
|
|
||||||
//!
|
|
||||||
//! From https://github.com/tauri-apps/window-vibrancy/blob/dev/src/windows.rs
|
|
||||||
//!
|
|
||||||
|
|
||||||
use windows_sys::Win32::{
|
|
||||||
Foundation::*,
|
|
||||||
System::{LibraryLoader::*, SystemInformation::*},
|
|
||||||
};
|
|
||||||
|
|
||||||
fn get_function_impl(library: &str, function: &str) -> Option<FARPROC> {
|
|
||||||
assert_eq!(library.chars().last(), Some('\0'));
|
|
||||||
assert_eq!(function.chars().last(), Some('\0'));
|
|
||||||
|
|
||||||
let module = unsafe { LoadLibraryA(library.as_ptr()) };
|
|
||||||
if module == 0 {
|
|
||||||
return None;
|
|
||||||
}
|
|
||||||
Some(unsafe { GetProcAddress(module, function.as_ptr()) })
|
|
||||||
}
|
|
||||||
|
|
||||||
macro_rules! get_function {
|
|
||||||
($lib:expr, $func:ident) => {
|
|
||||||
get_function_impl(concat!($lib, '\0'), concat!(stringify!($func), '\0')).map(|f| unsafe {
|
|
||||||
std::mem::transmute::<::windows_sys::Win32::Foundation::FARPROC, $func>(f)
|
|
||||||
})
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns a tuple of (major, minor, buildnumber)
|
|
||||||
fn get_windows_ver() -> Option<(u32, u32, u32)> {
|
|
||||||
type RtlGetVersion = unsafe extern "system" fn(*mut OSVERSIONINFOW) -> i32;
|
|
||||||
let handle = get_function!("ntdll.dll", RtlGetVersion);
|
|
||||||
if let Some(rtl_get_version) = handle {
|
|
||||||
unsafe {
|
|
||||||
let mut vi = OSVERSIONINFOW {
|
|
||||||
dwOSVersionInfoSize: 0,
|
|
||||||
dwMajorVersion: 0,
|
|
||||||
dwMinorVersion: 0,
|
|
||||||
dwBuildNumber: 0,
|
|
||||||
dwPlatformId: 0,
|
|
||||||
szCSDVersion: [0; 128],
|
|
||||||
};
|
|
||||||
|
|
||||||
let status = (rtl_get_version)(&mut vi as _);
|
|
||||||
|
|
||||||
if status >= 0 {
|
|
||||||
Some((vi.dwMajorVersion, vi.dwMinorVersion, vi.dwBuildNumber))
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn is_win11() -> bool {
|
|
||||||
let v = get_windows_ver().unwrap_or_default();
|
|
||||||
v.2 >= 22000
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_version() {
|
|
||||||
dbg!(get_windows_ver().unwrap_or_default());
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user