nixpkgs mirror (for testing) github.com/NixOS/nixpkgs
nix
at python-updates 42 lines 1.3 kB view raw
1diff --git a/server.go b/server.go 2index e2f2ab3..f81812f 100644 3--- a/server.go 4+++ b/server.go 5@@ -16,6 +16,7 @@ import ( 6 "github.com/sagernet/sing-box/experimental/clashapi" 7 E "github.com/sagernet/sing/common/exceptions" 8+ "golang.org/x/sys/unix" 9 "github.com/sagernet/sing/service" 10 "github.com/throneproj/clash2singbox/convert" 11 "github.com/throneproj/clash2singbox/model" 12 "github.com/throneproj/clash2singbox/model/clash" 13@@ -349,12 +350,25 @@ func (s *server) CompileGeoSiteToSrs(in *gen.CompileGeoSiteToSrsRequest, out *ge 14 } 15 16 func (s *server) IsPrivileged(in *gen.EmptyReq, out *gen.IsPrivilegedResponse) error { 17- if runtime.GOOS == "windows" { 18- out.HasPrivilege = To(false) 19- return nil 20+ ret := false 21+ if runtime.GOOS == "windows" || os.Geteuid() == 0 { 22+ ret = true 23+ } else if runtime.GOOS == "linux" { 24+ caps := unix.CapUserHeader{ 25+ Version: unix.LINUX_CAPABILITY_VERSION_3, 26+ Pid: 0, // current 27+ } 28+ var data [2]unix.CapUserData 29+ err := unix.Capget(&caps, &data[0]) 30+ if err != nil { 31+ ret = false 32+ } else { 33+ // CAP_NET_ADMIN = 12 34+ ret = (data[0].Effective & (1 << unix.CAP_NET_ADMIN)) != 0 35+ } 36 } 37 38- out.HasPrivilege = To(os.Geteuid() == 0) 39+ out.HasPrivilege = To(ret) 40 return nil 41 } 42