diff --git a/.editorconfig b/.editorconfig
index 9d08a1a..b200914 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -7,3 +7,6 @@ indent_size = 2
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
+
+[Makefile]
+indent_style = tab
diff --git a/.gitignore b/.gitignore
index 20282f4..29d6314 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,3 +2,4 @@
/target
.pnpm-store
.env
+vendor
diff --git a/Cargo.lock b/Cargo.lock
index f85ac8b..c5c2616 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -903,19 +903,6 @@ dependencies = [
"syn 1.0.109",
]
-[[package]]
-name = "downloader"
-version = "0.2.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d05213e96f184578b5f70105d4d0a644a168e99e12d7bea0b200c15d67b5c182"
-dependencies = [
- "futures",
- "rand 0.8.5",
- "reqwest",
- "thiserror",
- "tokio",
-]
-
[[package]]
name = "dtoa"
version = "1.0.9"
@@ -1514,7 +1501,6 @@ dependencies = [
"anyhow",
"clap",
"compile-time",
- "downloader",
"env_logger",
"futures-util",
"gpapi",
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..c84b7c2
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,36 @@
+build: build-fe build-rs gpgui-helper
+
+build-fe:
+ cd apps/gpgui-helper && pnpm install && pnpm build
+
+build-rs:
+ cargo build --release --frozen -p gpclient -p gpauth -p gpservice
+
+gpgui-helper:
+ cargo build --release --frozen -p gpgui-helper --features "tauri/custom-protocol"
+
+install:
+ install -Dm755 target/release/gpclient $(DESTDIR)/usr/bin/gpclient
+ install -Dm755 target/release/gpauth $(DESTDIR)/usr/bin/gpauth
+ install -Dm755 target/release/gpservice $(DESTDIR)/usr/bin/gpservice
+ install -Dm755 target/release/gpgui-helper $(DESTDIR)/usr/bin/gpgui-helper
+
+ install -Dm644 packaging/files/usr/share/applications/gpgui.desktop $(DESTDIR)/usr/share/applications/gpgui.desktop
+ install -Dm644 packaging/files/usr/share/icons/hicolor/scalable/apps/gpgui.svg $(DESTDIR)/usr/share/icons/hicolor/scalable/apps/gpgui.svg
+ install -Dm644 packaging/files/usr/share/icons/hicolor/32x32/apps/gpgui.png $(DESTDIR)/usr/share/icons/hicolor/32x32/apps/gpgui.png
+ install -Dm644 packaging/files/usr/share/icons/hicolor/128x128/apps/gpgui.png $(DESTDIR)/usr/share/icons/hicolor/128x128/apps/gpgui.png
+ install -Dm644 packaging/files/usr/share/icons/hicolor/256x256@2/apps/gpgui.png $(DESTDIR)/usr/share/icons/hicolor/256x256@2/apps/gpgui.png
+ install -Dm644 packaging/files/usr/share/polkit-1/actions/com.yuezk.gpgui.policy $(DESTDIR)/usr/share/polkit-1/actions/com.yuezk.gpgui.policy
+
+uninstall:
+ rm -f $(DESTDIR)/usr/bin/gpclient
+ rm -f $(DESTDIR)/usr/bin/gpauth
+ rm -f $(DESTDIR)/usr/bin/gpservice
+ rm -f $(DESTDIR)/usr/bin/gpgui-helper
+
+ rm -f $(DESTDIR)/usr/share/applications/gpgui.desktop
+ rm -f $(DESTDIR)/usr/share/icons/hicolor/scalable/apps/gpgui.svg
+ rm -f $(DESTDIR)/usr/share/icons/hicolor/32x32/apps/gpgui.png
+ rm -f $(DESTDIR)/usr/share/icons/hicolor/128x128/apps/gpgui.png
+ rm -f $(DESTDIR)/usr/share/icons/hicolor/256x256@2/apps/gpgui.png
+ rm -f $(DESTDIR)/usr/share/polkit-1/actions/com.yuezk.gpgui.policy
diff --git a/apps/gpgui-helper/.gitignore b/apps/gpgui-helper/.gitignore
index a547bf3..f52de67 100644
--- a/apps/gpgui-helper/.gitignore
+++ b/apps/gpgui-helper/.gitignore
@@ -22,3 +22,4 @@ dist-ssr
*.njsproj
*.sln
*.sw?
+.vite
diff --git a/apps/gpgui-helper/src-tauri/Cargo.toml b/apps/gpgui-helper/src-tauri/Cargo.toml
index 839e1f6..51d972c 100644
--- a/apps/gpgui-helper/src-tauri/Cargo.toml
+++ b/apps/gpgui-helper/src-tauri/Cargo.toml
@@ -18,7 +18,6 @@ clap.workspace = true
compile-time.workspace = true
env_logger.workspace = true
futures-util.workspace = true
-downloader = "0.2"
tempfile.workspace = true
reqwest = { workspace = true, features = ["stream"] }
diff --git a/packaging/files/usr/share/applications/gpgui.desktop b/packaging/files/usr/share/applications/gpgui.desktop
new file mode 100644
index 0000000..8ad6418
--- /dev/null
+++ b/packaging/files/usr/share/applications/gpgui.desktop
@@ -0,0 +1,11 @@
+[Desktop Entry]
+
+Type=Application
+Name=GlobalProtect Openconnect VPN Client
+Comment=A GUI for GlobalProtect VPN
+GenericName=GlobalProtect VPN Client
+Categories=Network;Dialup;
+Exec=/usr/bin/gpclient launch-gui %u
+MimeType=x-scheme-handler/globalprotectcallback;
+Icon=gpgui
+Keywords=GlobalProtect;Openconnect;SAML;connection;VPN;
diff --git a/packaging/files/usr/share/icons/hicolor/128x128/apps/gpgui.png b/packaging/files/usr/share/icons/hicolor/128x128/apps/gpgui.png
new file mode 100644
index 0000000..d7e9730
Binary files /dev/null and b/packaging/files/usr/share/icons/hicolor/128x128/apps/gpgui.png differ
diff --git a/packaging/files/usr/share/icons/hicolor/256x256@2/apps/gpgui.png b/packaging/files/usr/share/icons/hicolor/256x256@2/apps/gpgui.png
new file mode 100644
index 0000000..301c18a
Binary files /dev/null and b/packaging/files/usr/share/icons/hicolor/256x256@2/apps/gpgui.png differ
diff --git a/packaging/files/usr/share/icons/hicolor/32x32/apps/gpgui.png b/packaging/files/usr/share/icons/hicolor/32x32/apps/gpgui.png
new file mode 100644
index 0000000..a29d98a
Binary files /dev/null and b/packaging/files/usr/share/icons/hicolor/32x32/apps/gpgui.png differ
diff --git a/packaging/files/usr/share/icons/hicolor/scalable/apps/gpgui.svg b/packaging/files/usr/share/icons/hicolor/scalable/apps/gpgui.svg
new file mode 100644
index 0000000..bccc611
--- /dev/null
+++ b/packaging/files/usr/share/icons/hicolor/scalable/apps/gpgui.svg
@@ -0,0 +1,99 @@
+
+
+
+
\ No newline at end of file
diff --git a/packaging/files/usr/share/polkit-1/actions/com.yuezk.gpgui.policy b/packaging/files/usr/share/polkit-1/actions/com.yuezk.gpgui.policy
new file mode 100644
index 0000000..8c8af09
--- /dev/null
+++ b/packaging/files/usr/share/polkit-1/actions/com.yuezk.gpgui.policy
@@ -0,0 +1,18 @@
+
+
+
+ The GlobalProtect-openconnect Project
+ https://github.com/yuezk/GlobalProtect-openconnect
+ gpgui
+
+ Run GPService as root
+ Authentication is required to run the GPService as root
+
+ auth_admin
+ auth_admin
+ yes
+
+ /usr/bin/gpservice
+ true
+
+