Files
community-plugins/ruh-vpn/plugin.toml
T
0733efd186 Add umedbazarov/ruh-vpn: VPN/proxy manager for sing-box (#304)
* 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>
2026-08-09 21:03:02 -04:00

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"