mirror of
https://github.com/yuezk/GlobalProtect-openconnect.git
synced 2025-04-02 18:31:50 -04:00
refactor: find the vpnc_script from predefined locations
This commit is contained in:
parent
4191e9a19f
commit
5603157679
1
.vscode/settings.json
vendored
1
.vscode/settings.json
vendored
@ -18,6 +18,7 @@
|
|||||||
"tauri",
|
"tauri",
|
||||||
"unlisten",
|
"unlisten",
|
||||||
"userauthcookie",
|
"userauthcookie",
|
||||||
|
"vpnc",
|
||||||
"vpninfo"
|
"vpninfo"
|
||||||
],
|
],
|
||||||
"files.associations": {
|
"files.associations": {
|
||||||
|
10
Cargo.lock
generated
10
Cargo.lock
generated
@ -1122,6 +1122,7 @@ dependencies = [
|
|||||||
"bytes",
|
"bytes",
|
||||||
"cc",
|
"cc",
|
||||||
"data-encoding",
|
"data-encoding",
|
||||||
|
"is_executable",
|
||||||
"log",
|
"log",
|
||||||
"ring",
|
"ring",
|
||||||
"serde",
|
"serde",
|
||||||
@ -1416,6 +1417,15 @@ dependencies = [
|
|||||||
"windows-sys 0.48.0",
|
"windows-sys 0.48.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "is_executable"
|
||||||
|
version = "1.0.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "fa9acdc6d67b75e626ad644734e8bc6df893d9cd2a834129065d3dd6158ea9c8"
|
||||||
|
dependencies = [
|
||||||
|
"winapi",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "itoa"
|
name = "itoa"
|
||||||
version = "0.4.8"
|
version = "0.4.8"
|
||||||
|
@ -16,6 +16,7 @@ async-trait = "0.1"
|
|||||||
ring = "0.16"
|
ring = "0.16"
|
||||||
data-encoding = "2.3"
|
data-encoding = "2.3"
|
||||||
log = "0.4"
|
log = "0.4"
|
||||||
|
is_executable = "1.0"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
cc = "1.0"
|
cc = "1.0"
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
use crate::vpn::vpnc_script::find_default_vpnc_script;
|
||||||
use log::{debug, info, warn};
|
use log::{debug, info, warn};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use std::ffi::{c_void, CString};
|
use std::ffi::{c_void, CString};
|
||||||
@ -7,6 +8,7 @@ use tokio::sync::watch;
|
|||||||
use tokio::sync::{mpsc, Mutex};
|
use tokio::sync::{mpsc, Mutex};
|
||||||
|
|
||||||
mod ffi;
|
mod ffi;
|
||||||
|
mod vpnc_script;
|
||||||
|
|
||||||
#[derive(Debug, PartialEq, Clone, Copy, Serialize, Deserialize)]
|
#[derive(Debug, PartialEq, Clone, Copy, Serialize, Deserialize)]
|
||||||
#[serde(rename_all = "lowercase")]
|
#[serde(rename_all = "lowercase")]
|
||||||
@ -87,11 +89,21 @@ impl Vpn {
|
|||||||
server: &str,
|
server: &str,
|
||||||
cookie: &str,
|
cookie: &str,
|
||||||
) -> Result<(), Box<dyn std::error::Error>> {
|
) -> Result<(), Box<dyn std::error::Error>> {
|
||||||
|
let script = match find_default_vpnc_script() {
|
||||||
|
Some(script) => {
|
||||||
|
debug!("Using default vpnc-script: {}", script);
|
||||||
|
script
|
||||||
|
}
|
||||||
|
None => {
|
||||||
|
return Err("Failed to find default vpnc-script".into());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// Save the VPN options so we can use them later, e.g. reconnect
|
// Save the VPN options so we can use them later, e.g. reconnect
|
||||||
*self.vpn_options.lock().await = Some(VpnOptions {
|
*self.vpn_options.lock().await = Some(VpnOptions {
|
||||||
server: VpnOptions::to_cstr(server),
|
server: VpnOptions::to_cstr(server),
|
||||||
cookie: VpnOptions::to_cstr(cookie),
|
cookie: VpnOptions::to_cstr(cookie),
|
||||||
script: VpnOptions::to_cstr("/usr/share/vpnc-scripts/vpnc-script"),
|
script: VpnOptions::to_cstr(script),
|
||||||
});
|
});
|
||||||
|
|
||||||
let vpn_options = self.vpn_options.clone();
|
let vpn_options = self.vpn_options.clone();
|
||||||
|
21
gpcommon/src/vpn/vpnc_script.rs
Normal file
21
gpcommon/src/vpn/vpnc_script.rs
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
use std::path::Path;
|
||||||
|
|
||||||
|
use is_executable::IsExecutable;
|
||||||
|
|
||||||
|
const VPNC_SCRIPT_LOCATIONS: [&str; 4] = [
|
||||||
|
"/usr/local/share/vpnc-scripts/vpnc-script",
|
||||||
|
"/usr/local/sbin/vpnc-script",
|
||||||
|
"/usr/share/vpnc-scripts/vpnc-script",
|
||||||
|
"/usr/sbin/vpnc-script /etc/vpnc/vpnc-script",
|
||||||
|
];
|
||||||
|
|
||||||
|
pub(crate) fn find_default_vpnc_script() -> Option<&'static str> {
|
||||||
|
for location in VPNC_SCRIPT_LOCATIONS.iter() {
|
||||||
|
let path = Path::new(location);
|
||||||
|
if path.is_executable() {
|
||||||
|
return Some(location);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
None
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user