mirror of
https://github.com/yuezk/GlobalProtect-openconnect.git
synced 2025-05-20 07:26:58 -04:00
Compare commits
2 Commits
4191e9a19f
...
f91f0bcd17
Author | SHA1 | Date | |
---|---|---|---|
|
f91f0bcd17 | ||
|
5603157679 |
1
.vscode/settings.json
vendored
1
.vscode/settings.json
vendored
@ -18,6 +18,7 @@
|
||||
"tauri",
|
||||
"unlisten",
|
||||
"userauthcookie",
|
||||
"vpnc",
|
||||
"vpninfo"
|
||||
],
|
||||
"files.associations": {
|
||||
|
10
Cargo.lock
generated
10
Cargo.lock
generated
@ -1122,6 +1122,7 @@ dependencies = [
|
||||
"bytes",
|
||||
"cc",
|
||||
"data-encoding",
|
||||
"is_executable",
|
||||
"log",
|
||||
"ring",
|
||||
"serde",
|
||||
@ -1416,6 +1417,15 @@ dependencies = [
|
||||
"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]]
|
||||
name = "itoa"
|
||||
version = "0.4.8"
|
||||
|
@ -16,6 +16,7 @@ async-trait = "0.1"
|
||||
ring = "0.16"
|
||||
data-encoding = "2.3"
|
||||
log = "0.4"
|
||||
is_executable = "1.0"
|
||||
|
||||
[build-dependencies]
|
||||
cc = "1.0"
|
||||
|
@ -1,3 +1,4 @@
|
||||
use crate::vpn::vpnc_script::find_default_vpnc_script;
|
||||
use log::{debug, info, warn};
|
||||
use serde::{Deserialize, Serialize};
|
||||
use std::ffi::{c_void, CString};
|
||||
@ -7,6 +8,7 @@ use tokio::sync::watch;
|
||||
use tokio::sync::{mpsc, Mutex};
|
||||
|
||||
mod ffi;
|
||||
mod vpnc_script;
|
||||
|
||||
#[derive(Debug, PartialEq, Clone, Copy, Serialize, Deserialize)]
|
||||
#[serde(rename_all = "lowercase")]
|
||||
@ -87,11 +89,21 @@ impl Vpn {
|
||||
server: &str,
|
||||
cookie: &str,
|
||||
) -> 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
|
||||
*self.vpn_options.lock().await = Some(VpnOptions {
|
||||
server: VpnOptions::to_cstr(server),
|
||||
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();
|
||||
|
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
|
||||
}
|
@ -4,12 +4,13 @@
|
||||
<meta charset="UTF-8" />
|
||||
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=0" />
|
||||
<title>Vite + React + TS</title>
|
||||
<title>GlobalProtect</title>
|
||||
</head>
|
||||
<body data-tauri-drag-region>
|
||||
<script>
|
||||
/* workaround to webview font size auto scaling */
|
||||
var htmlFontSize = getComputedStyle(document.documentElement).fontSize;
|
||||
var ratio = parseInt(htmlFontSize) / 16;
|
||||
var ratio = parseInt(htmlFontSize, 10) / 16;
|
||||
document.documentElement.style.fontSize = (16 / ratio) + 'px';
|
||||
</script>
|
||||
<div id="root"></div>
|
||||
|
@ -35,7 +35,7 @@ export default function PortalForm() {
|
||||
}
|
||||
|
||||
return (
|
||||
<form onSubmit={handleSubmit}>
|
||||
<form onSubmit={handleSubmit} data-tauri-drag-region>
|
||||
<TextField
|
||||
autoFocus
|
||||
label="Portal address"
|
||||
|
@ -93,17 +93,11 @@ function InnerStatusIcon() {
|
||||
return <DisconnectedIcon />;
|
||||
}
|
||||
|
||||
const DragRegion = styled(Box)(({ theme }) => ({
|
||||
position: "absolute",
|
||||
inset: 0,
|
||||
}));
|
||||
|
||||
export default function StatusIcon() {
|
||||
return (
|
||||
<IconContainer>
|
||||
<BackgroundIcon />
|
||||
<InnerStatusIcon />
|
||||
<DragRegion data-tauri-drag-region />
|
||||
</IconContainer>
|
||||
);
|
||||
}
|
||||
|
@ -7,7 +7,6 @@ export default function StatusText() {
|
||||
|
||||
return (
|
||||
<Typography
|
||||
data-tauri-drag-region
|
||||
textAlign="center"
|
||||
mt={1.5}
|
||||
variant="subtitle1"
|
||||
|
@ -4,9 +4,10 @@ import StatusText from "./StatusText";
|
||||
|
||||
export default function ConnectionStatus() {
|
||||
return (
|
||||
<Box data-tauri-drag-region>
|
||||
<Box position="relative">
|
||||
<StatusIcon />
|
||||
<StatusText />
|
||||
<Box data-tauri-drag-region position="absolute" sx={{ inset: 0 }} />
|
||||
</Box>
|
||||
);
|
||||
}
|
||||
|
@ -15,7 +15,12 @@ const LinkChip = (props: ChipProps<"a">) => (
|
||||
|
||||
export default function Feedback() {
|
||||
return (
|
||||
<Stack direction="row" justifyContent="space-evenly" mt={1}>
|
||||
<Stack
|
||||
direction="row"
|
||||
justifyContent="space-evenly"
|
||||
mt={1}
|
||||
data-tauri-drag-region
|
||||
>
|
||||
<LinkChip
|
||||
avatar={<BugReport />}
|
||||
label="Feedback"
|
||||
|
@ -16,6 +16,7 @@ import { isProcessingAtom, statusAtom } from "../../atoms/status";
|
||||
|
||||
const MenuContainer = styled(Box)(({ theme }) => ({
|
||||
position: "absolute",
|
||||
zIndex: 1,
|
||||
left: theme.spacing(1),
|
||||
top: theme.spacing(1),
|
||||
}));
|
||||
@ -100,6 +101,7 @@ export default function MainMenu() {
|
||||
target="_blank"
|
||||
sx={{
|
||||
position: "absolute",
|
||||
zIndex: 1,
|
||||
right: (theme) => theme.spacing(1),
|
||||
top: (theme) => theme.spacing(1),
|
||||
}}
|
||||
|
@ -1,4 +1,11 @@
|
||||
import { Alert, AlertTitle, Box, Slide, SlideProps, Snackbar } from "@mui/material";
|
||||
import {
|
||||
Alert,
|
||||
AlertTitle,
|
||||
Box,
|
||||
Slide,
|
||||
SlideProps,
|
||||
Snackbar,
|
||||
} from "@mui/material";
|
||||
import { useAtom, useAtomValue } from "jotai";
|
||||
import {
|
||||
closeNotificationAtom,
|
||||
|
Loading…
x
Reference in New Issue
Block a user