/
inbound.go
121 lines (110 loc) · 2.97 KB
/
inbound.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
package api
import (
"encoding/json"
"fmt"
"github.com/bionicosmos/submgr/models"
"github.com/xtls/xray-core/app/proxyman/command"
"github.com/xtls/xray-core/common/protocol"
"github.com/xtls/xray-core/common/serial"
"github.com/xtls/xray-core/infra/conf"
"github.com/xtls/xray-core/proxy/trojan"
"github.com/xtls/xray-core/proxy/vless"
"google.golang.org/protobuf/proto"
)
func AddInbound(inbound *conf.InboundDetourConfig, apiAddress string) error {
conn, ctx, cancelFunc, err := dialAPIServer(apiAddress)
defer cancelFunc()
if err != nil {
return err
}
client := command.NewHandlerServiceClient(conn)
inboundHandlerConfig, err := inbound.Build()
if err != nil {
return err
}
req := command.AddInboundRequest{
Inbound: inboundHandlerConfig,
}
if _, err := client.AddInbound(ctx, &req); err != nil {
return err
}
return conn.Close()
}
func RemoveInbound(tag string, apiAddress string) error {
conn, ctx, cancelFunc, err := dialAPIServer(apiAddress)
defer cancelFunc()
if err != nil {
return err
}
client := command.NewHandlerServiceClient(conn)
req := command.RemoveInboundRequest{
Tag: tag,
}
if _, err := client.RemoveInbound(ctx, &req); err != nil {
return err
}
return conn.Close()
}
func AddUser(inbound *conf.InboundDetourConfig, user *models.User, apiAddress string) error {
conn, ctx, cancelFunc, err := dialAPIServer(apiAddress)
defer cancelFunc()
if err != nil {
return err
}
client := command.NewHandlerServiceClient(conn)
var accountToTypedMessage proto.Message
switch inbound.Protocol {
case "vless":
var account vless.Account
if err := json.Unmarshal(user.Account["vless"], &account); err != nil {
return err
}
accountToTypedMessage = &account
case "vmess":
var account conf.VMessAccount
if err := json.Unmarshal(user.Account["vmess"], &account); err != nil {
return err
}
accountToTypedMessage = account.Build()
case "trojan":
var account trojan.Account
if err := json.Unmarshal(user.Account["trojan"], &account); err != nil {
return err
}
accountToTypedMessage = &account
default:
return fmt.Errorf("nonsupported protocol: %v", inbound.Protocol)
}
req := command.AlterInboundRequest{
Tag: inbound.Tag,
Operation: serial.ToTypedMessage(&command.AddUserOperation{
User: &protocol.User{
Level: user.Level,
Email: user.Email,
Account: serial.ToTypedMessage(accountToTypedMessage),
},
}),
}
if _, err := client.AlterInbound(ctx, &req); err != nil {
return err
}
return conn.Close()
}
func RemoveUser(inbound *conf.InboundDetourConfig, user *models.User, apiAddress string) error {
conn, ctx, cancelFunc, err := dialAPIServer(apiAddress)
defer cancelFunc()
if err != nil {
return err
}
client := command.NewHandlerServiceClient(conn)
req := command.AlterInboundRequest{
Tag: inbound.Tag,
Operation: serial.ToTypedMessage(&command.RemoveUserOperation{
Email: user.Email,
}),
}
if _, err := client.AlterInbound(ctx, &req); err != nil {
return err
}
return conn.Close()
}