check super permission: win && linux

Signed-off-by: 21pages <pages21@163.com>
This commit is contained in:
21pages
2022-08-19 15:44:19 +08:00
parent 123a7aa17b
commit 4faf0a3d35
7 changed files with 208 additions and 78 deletions

View File

@@ -22,12 +22,12 @@ use crate::ui_interface;
#[cfg(not(any(target_os = "android", target_os = "ios")))]
use crate::ui_interface::{change_id, check_connect_status, is_ok_change_id};
use crate::ui_interface::{
discover, forget_password, get_api_server, get_app_name, get_async_job_status,
get_connect_status, get_fav, get_id, get_lan_peers, get_langs, get_license, get_local_option,
get_option, get_options, get_peer, get_peer_option, get_socks, get_sound_inputs, get_uuid,
get_version, has_hwcodec, has_rendezvous_service, post_request, set_local_option, set_option,
set_options, set_peer_option, set_permanent_password, set_socks, store_fav,
test_if_valid_server, update_temporary_password, using_public_server,
check_super_user_permission, discover, forget_password, get_api_server, get_app_name,
get_async_job_status, get_connect_status, get_fav, get_id, get_lan_peers, get_langs,
get_license, get_local_option, get_option, get_options, get_peer, get_peer_option, get_socks,
get_sound_inputs, get_uuid, get_version, has_hwcodec, has_rendezvous_service, post_request,
set_local_option, set_option, set_options, set_peer_option, set_permanent_password, set_socks,
store_fav, test_if_valid_server, update_temporary_password, using_public_server,
};
fn initialize(app_dir: &str) {
@@ -735,6 +735,10 @@ pub fn main_set_permanent_password(password: String) {
set_permanent_password(password);
}
pub fn main_check_super_user_permission() -> bool {
check_super_user_permission()
}
pub fn cm_send_chat(conn_id: i32, msg: String) {
connection_manager::send_chat(conn_id, msg);
}

View File

@@ -629,3 +629,9 @@ extern "C" {
pub fn quit_gui() {
unsafe { gtk_main_quit() };
}
pub fn check_super_user_permission() -> ResultType<bool> {
// TODO: replace echo with a rustdesk's program, which is location-fixed and non-gui.
let status = std::process::Command::new("pkexec").arg("echo").status()?;
Ok(status.success() && status.code() == Some(0))
}

View File

@@ -8,7 +8,7 @@ use hbb_common::{
};
use std::io::prelude::*;
use std::{
ffi::OsString,
ffi::{CString, OsString},
fs, io, mem,
sync::{Arc, Mutex},
time::{Duration, Instant},
@@ -17,7 +17,8 @@ use winapi::{
shared::{minwindef::*, ntdef::NULL, windef::*},
um::{
errhandlingapi::GetLastError, handleapi::CloseHandle, minwinbase::STILL_ACTIVE,
processthreadsapi::GetExitCodeProcess, winbase::*, wingdi::*, winnt::HANDLE, winuser::*,
processthreadsapi::GetExitCodeProcess, shellapi::ShellExecuteA, winbase::*, wingdi::*,
winnt::HANDLE, winuser::*,
},
};
use windows_service::{
@@ -1418,3 +1419,17 @@ pub fn get_user_token(session_id: u32, as_user: bool) -> HANDLE {
}
}
}
pub fn check_super_user_permission() -> ResultType<bool> {
unsafe {
let ret = ShellExecuteA(
NULL as _,
CString::new("runas")?.as_ptr() as _,
CString::new("cmd")?.as_ptr() as _,
CString::new("/c /q")?.as_ptr() as _,
NULL as _,
SW_SHOWNORMAL,
);
return Ok(ret as i32 > 32);
}
}

View File

@@ -676,6 +676,13 @@ pub fn has_hwcodec() -> bool {
return true;
}
pub fn check_super_user_permission() -> bool {
#[cfg(any(windows, target_os = "linux"))]
return crate::platform::check_super_user_permission().unwrap_or(false);
#[cfg(not(any(windows, target_os = "linux")))]
true
}
pub fn check_zombie(childs: Childs) {
let mut deads = Vec::new();
loop {