From 7190d451d4ef70c170d941cd468ee12af5646ffd Mon Sep 17 00:00:00 2001 From: fufesou Date: Thu, 11 May 2023 18:13:23 +0800 Subject: [PATCH] plugin_framework, plugin manager, debug linux Signed-off-by: fufesou --- src/platform/linux.rs | 19 +++++++++++++++++++ src/platform/mod.rs | 21 --------------------- src/plugin/ipc.rs | 2 -- src/plugin/manager.rs | 26 ++++++++++++++++++-------- src/plugin/mod.rs | 3 ++- 5 files changed, 39 insertions(+), 32 deletions(-) diff --git a/src/platform/linux.rs b/src/platform/linux.rs index ca35fc32b..1e39b1f07 100644 --- a/src/platform/linux.rs +++ b/src/platform/linux.rs @@ -660,6 +660,25 @@ pub fn check_super_user_permission() -> ResultType { Ok(status.success() && status.code() == Some(0)) } +pub fn elevate(arg: Vec<&str>) -> ResultType> { + let cmd = std::env::current_exe()?; + match cmd.to_str() { + Some(cmd) => { + let mut args = vec![cmd]; + args.append(&mut arg.clone()); + // -E required for opensuse + if is_opensuse() { + args.insert(0, "-E"); + } + let task = Command::new("pkexec").args(args).spawn()?; + Ok(Some(task)) + } + None => { + hbb_common::bail!("Failed to get current exe as str"); + } + } +} + type GtkSettingsPtr = *mut c_void; type GObjectPtr = *mut c_void; #[link(name = "gtk-3")] diff --git a/src/platform/mod.rs b/src/platform/mod.rs index 454058b5a..e382b0b13 100644 --- a/src/platform/mod.rs +++ b/src/platform/mod.rs @@ -54,27 +54,6 @@ pub fn get_active_username() -> String { #[cfg(target_os = "android")] pub const PA_SAMPLE_RATE: u32 = 48000; -#[cfg(any(target_os = "linux", target_os = "macos"))] -pub fn run_as_root(arg: Vec<&str>) -> ResultType> { - let cmd = std::env::current_exe()?; - match cmd.to_str() { - Some(cmd) => { - let mut args = vec![cmd]; - args.append(&mut arg.clone()); - // -E required for opensuse - #[cfg(target_os = "linux")] - if is_opensuse() { - args.insert(0, "-E"); - } - let task = Command::new("sudo").args(args).spawn()?; - Ok(Some(task)) - } - None => { - bail!("Failed to get current exe as str"); - } - } -} - #[cfg(test)] mod tests { use super::*; diff --git a/src/plugin/ipc.rs b/src/plugin/ipc.rs index 1ca5521b0..8b646a9ae 100644 --- a/src/plugin/ipc.rs +++ b/src/plugin/ipc.rs @@ -2,8 +2,6 @@ use crate::ipc::{connect, Connection, Data}; use hbb_common::{allow_err, log, tokio, ResultType}; use serde_derive::{Deserialize, Serialize}; -#[cfg(not(windows))] -use std::{fs::File, io::prelude::*}; #[derive(Debug, Serialize, Deserialize, Clone)] pub enum InstallStatus { diff --git a/src/plugin/manager.rs b/src/plugin/manager.rs index 2aaddd55f..8ea72169e 100644 --- a/src/plugin/manager.rs +++ b/src/plugin/manager.rs @@ -190,19 +190,30 @@ pub fn install_plugin(id: &str) -> ResultType<()> { if !same_plugin_exists { args.push(&plugin_url); } - allowed_install = match crate::platform::run_as_root(&args) { - Ok(child) => match child.wait() { - Ok(0) => true, - Ok(code) => { - log::error!("Failed to wait install process, process code: {}", code); - true + allowed_install = match crate::platform::elevate(args) { + Ok(Some(mut child)) => match child.wait() { + Ok(status) => { + if status.success() { + true + } else { + log::error!( + "Failed to wait install process, process status: {:?}", + status + ); + false + } } Err(e) => { log::error!("Failed to wait install process, error: {}", e); false } }, - } + Ok(None) => false, + Err(e) => { + log::error!("Failed to run install process, error: {}", e); + false + } + }; } if allowed_install && same_plugin_exists { @@ -256,7 +267,6 @@ pub(super) fn remove_plugins() -> ResultType<()> { pub fn uninstall_plugin(id: &str, called_by_ui: bool) { if called_by_ui { - #[cfg(target_os = "windows")] match crate::platform::check_super_user_permission() { Ok(true) => { if let Err(e) = super::ipc::uninstall_plugin(id) { diff --git a/src/plugin/mod.rs b/src/plugin/mod.rs index 9a72d2aed..19fc11979 100644 --- a/src/plugin/mod.rs +++ b/src/plugin/mod.rs @@ -1,6 +1,7 @@ use hbb_common::{libc, log, ResultType}; +#[cfg(target_os = "windows")] +use std::env; use std::{ - env, ffi::{c_char, c_int, c_void, CStr}, path::PathBuf, ptr::null,