nixpkgs mirror (for testing)
github.com/NixOS/nixpkgs
nix
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