* Add umedbazarov/ruh-vpn: VPN/proxy manager for sing-box New community plugin: bar widget, panel, service and control-center shortcut for managing SSH, VLESS, VMess, Shadowsocks and SOCKS5 connections through sing-box, with routing presets, custom rules, system-proxy/TUN modes and a kill switch. The bundled Python backend serves a loopback control API protected by a per-launch bearer token. * Address review: sanitize kill-switch ruleset, scope TUN capability, fix mux error path, disclose DNS - kill switch: only pre-resolved, canonicalized literal IPs enter the nft ruleset; domains are resolved first and anything unparseable is dropped, so subscription-supplied addresses can no longer inject nft syntax - TUN: CAP_NET_ADMIN is granted to a plugin-private copy of sing-box in a 0700 directory instead of the shared system binary; the copy is refreshed (clearing the cap) when the system binary changes, and the legacy grant on the shared binary is removed in the same polkit prompt - fix NameError in the mux startup failure path (undefined mux_name) that hid the log tail and skipped teardown - README: disclose plain-UDP DNS endpoints (8.8.8.8 via tunnel, 223.5.5.5 direct in rules mode) alongside the TUN DoH endpoint --------- Co-authored-by: Umedjon Bazarov <170195993+UmedjonBA@users.noreply.github.com>
79 lines
2.0 KiB
TOML
79 lines
2.0 KiB
TOML
id = "umedbazarov/ruh-vpn"
|
|
name = "Ruh VPN"
|
|
version = "0.1.0"
|
|
plugin_api = 3
|
|
author = "Умеджон Базаров"
|
|
license = "MIT"
|
|
icon = "shield-lock"
|
|
description = "VPN/proxy manager (sing-box): SSH, VLESS, VMess, Shadowsocks, SOCKS5, routing rules, kill switch."
|
|
tags = ["bar", "panel", "service", "shortcut", "network", "privacy"]
|
|
dependencies = ["sing-box", "python3", "ssh", "sshpass", "gsettings", "pkexec", "setcap", "getcap", "nft", "pkill"]
|
|
|
|
# Plugin settings
|
|
[[setting]]
|
|
key = "backend_python"
|
|
type = "file"
|
|
label_key = "settings.backend_python.label"
|
|
description_key = "settings.backend_python.description"
|
|
default = "python3"
|
|
|
|
[[setting]]
|
|
key = "auto_start"
|
|
type = "bool"
|
|
label_key = "settings.auto_start.label"
|
|
description_key = "settings.auto_start.description"
|
|
default = false
|
|
|
|
[[setting]]
|
|
key = "geoip_country"
|
|
type = "bool"
|
|
label_key = "settings.geoip_country.label"
|
|
description_key = "settings.geoip_country.description"
|
|
default = true
|
|
|
|
[[setting]]
|
|
key = "control_port"
|
|
type = "int"
|
|
label_key = "settings.control_port.label"
|
|
description_key = "settings.control_port.description"
|
|
default = 11090
|
|
min = 1024
|
|
max = 65535
|
|
advanced = true
|
|
|
|
# Headless service: supervises the Python backend
|
|
[[service]]
|
|
id = "vpn_service"
|
|
entry = "service.luau"
|
|
|
|
# Bar widget
|
|
[[widget]]
|
|
id = "vpn_widget"
|
|
entry = "widget.luau"
|
|
|
|
[[widget.setting]]
|
|
key = "show_ping"
|
|
type = "bool"
|
|
label_key = "settings.show_ping.label"
|
|
default = true
|
|
|
|
[[widget.setting]]
|
|
key = "show_traffic"
|
|
type = "bool"
|
|
label_key = "settings.show_traffic.label"
|
|
default = false
|
|
|
|
# Main panel
|
|
[[panel]]
|
|
id = "vpn_panel"
|
|
entry = "panel.luau"
|
|
width = 460
|
|
height = 560
|
|
placement = "attached"
|
|
position = "auto"
|
|
|
|
# Control-center tile
|
|
[[shortcut]]
|
|
id = "vpn_toggle"
|
|
entry = "shortcut.luau"
|