Meow
2026-05-07 19:10:48 +08:00
committed by RPRX
parent 906d49a271
commit c42deab55c
14 changed files with 75 additions and 42 deletions

View File

@@ -23,6 +23,7 @@ func (v *HTTPAccount) Build() *http.Account {
}
type HTTPServerConfig struct {
Users []*HTTPAccount `json:"users"`
Accounts []*HTTPAccount `json:"accounts"`
Transparent bool `json:"allowTransparent"`
UserLevel uint32 `json:"userLevel"`
@@ -34,9 +35,13 @@ func (c *HTTPServerConfig) Build() (proto.Message, error) {
UserLevel: c.UserLevel,
}
if len(c.Accounts) > 0 {
if c.Accounts != nil {
c.Users = c.Accounts
}
// TODO: PB
if len(c.Users) > 0 {
config.Accounts = make(map[string]string)
for _, account := range c.Accounts {
for _, account := range c.Users {
config.Accounts[account.Username] = account.Password
}
}
@@ -51,8 +56,8 @@ type HTTPRemoteConfig struct {
}
type HTTPClientConfig struct {
Address *Address `json:"address"`
Port uint16 `json:"port"`
Address *Address `json:"address"`
Port uint16 `json:"port"`
Level uint32 `json:"level"`
Email string `json:"email"`
Username string `json:"user"`

View File

@@ -39,12 +39,16 @@ type HysteriaUserConfig struct {
type HysteriaServerConfig struct {
Version int32 `json:"version"`
Users []*HysteriaUserConfig `json:"clients"`
Users []*HysteriaUserConfig `json:"users"`
Clients []*HysteriaUserConfig `json:"clients"`
}
func (c *HysteriaServerConfig) Build() (proto.Message, error) {
config := new(hysteria.ServerConfig)
if c.Clients != nil {
c.Users = c.Clients
}
if len(c.Users) > 0 {
config.Users = make([]*protocol.User, len(c.Users))
processUser := func(idx int) error {

View File

@@ -45,13 +45,18 @@ type ShadowsocksServerConfig struct {
Password string `json:"password"`
Level byte `json:"level"`
Email string `json:"email"`
Users []*ShadowsocksUserConfig `json:"clients"`
Users []*ShadowsocksUserConfig `json:"users"`
Clients []*ShadowsocksUserConfig `json:"clients"`
NetworkList *NetworkList `json:"network"`
}
func (v *ShadowsocksServerConfig) Build() (proto.Message, error) {
errors.PrintNonRemovalDeprecatedFeatureWarning("Shadowsocks (with no Forward Secrecy, etc.)", "VLESS Encryption")
if v.Clients != nil {
v.Users = v.Clients
}
if C.Contains(shadowaead_2022.List, v.Cipher) {
return buildShadowsocks2022(v)
}

View File

@@ -29,6 +29,7 @@ const (
type SocksServerConfig struct {
AuthMethod string `json:"auth"`
Users []*SocksAccount `json:"users"`
Accounts []*SocksAccount `json:"accounts"`
UDP bool `json:"udp"`
Host *Address `json:"ip"`
@@ -47,9 +48,13 @@ func (v *SocksServerConfig) Build() (proto.Message, error) {
config.AuthType = socks.AuthType_NO_AUTH
}
if len(v.Accounts) > 0 {
config.Accounts = make(map[string]string, len(v.Accounts))
for _, account := range v.Accounts {
if v.Accounts != nil {
v.Users = v.Accounts
}
// TODO: PB
if len(v.Users) > 0 {
config.Accounts = make(map[string]string, len(v.Users))
for _, account := range v.Users {
config.Accounts[account.Username] = account.Password
}
}

View File

@@ -112,6 +112,7 @@ type TrojanUserConfig struct {
// TrojanServerConfig is Inbound configuration
type TrojanServerConfig struct {
Users []*TrojanUserConfig `json:"users"`
Clients []*TrojanUserConfig `json:"clients"`
Fallbacks []*TrojanInboundFallback `json:"fallbacks"`
}
@@ -120,12 +121,16 @@ type TrojanServerConfig struct {
func (c *TrojanServerConfig) Build() (proto.Message, error) {
errors.PrintNonRemovalDeprecatedFeatureWarning("Trojan (with no Flow, etc.)", "VLESS with Flow & Seed")
if c.Clients != nil {
c.Users = c.Clients
}
config := &trojan.ServerConfig{
Users: make([]*protocol.User, len(c.Clients)),
Users: make([]*protocol.User, len(c.Users)),
}
processClient := func(idx int) error {
rawUser := c.Clients[idx]
rawUser := c.Users[idx]
if rawUser.Flow != "" {
return errors.PrintRemovedFeatureError(`Flow for Trojan`, ``)
}
@@ -139,7 +144,7 @@ func (c *TrojanServerConfig) Build() (proto.Message, error) {
}
return nil
}
if err := task.ParallelForN(len(c.Clients), processClient); err != nil {
if err := task.ParallelForN(len(c.Users), processClient); err != nil {
return nil, err
}

View File

@@ -31,6 +31,7 @@ type VLessInboundFallback struct {
}
type VLessInboundConfig struct {
Users []json.RawMessage `json:"users"`
Clients []json.RawMessage `json:"clients"`
Decryption string `json:"decryption"`
Fallbacks []*VLessInboundFallback `json:"fallbacks"`
@@ -41,21 +42,25 @@ type VLessInboundConfig struct {
// Build implements Buildable
func (c *VLessInboundConfig) Build() (proto.Message, error) {
config := new(inbound.Config)
config.Clients = make([]*protocol.User, len(c.Clients))
if c.Clients != nil {
c.Users = c.Clients
}
config.Users = make([]*protocol.User, len(c.Users))
switch c.Flow {
case vless.XRV, "":
default:
return nil, errors.New(`VLESS "settings.flow" doesn't support "` + c.Flow + `" in this version`)
}
processClient := func(idx int) error {
rawUser := c.Clients[idx]
rawUser := c.Users[idx]
user := new(protocol.User)
if err := json.Unmarshal(rawUser, user); err != nil {
return errors.New(`VLESS clients: invalid user`).Base(err)
return errors.New(`VLESS users: invalid user`).Base(err)
}
account := new(vless.Account)
if err := json.Unmarshal(rawUser, account); err != nil {
return errors.New(`VLESS clients: invalid user`).Base(err)
return errors.New(`VLESS users: invalid user`).Base(err)
}
u, err := uuid.ParseString(account.Id)
@@ -69,7 +74,7 @@ func (c *VLessInboundConfig) Build() (proto.Message, error) {
account.Flow = c.Flow
case vless.XRV:
default:
return errors.New(`VLESS clients: "flow" doesn't support "` + account.Flow + `" in this version`)
return errors.New(`VLESS users: "flow" doesn't support "` + account.Flow + `" in this version`)
}
if len(account.Testseed) < 4 {
@@ -77,24 +82,24 @@ func (c *VLessInboundConfig) Build() (proto.Message, error) {
}
if account.Encryption != "" {
return errors.New(`VLESS clients: "encryption" should not be in inbound settings`)
return errors.New(`VLESS users: "encryption" should not be in inbound settings`)
}
if account.Reverse != nil {
if account.Reverse.Tag == "" {
return errors.New(`VLESS clients: "tag" can't be empty for "reverse"`)
return errors.New(`VLESS users: "tag" can't be empty for "reverse"`)
}
if account.Reverse.Sniffing != nil { // may not be reached: error json unmarshal
return errors.New(`VLESS clients: inbound's "reverse" can't have "sniffing"`)
return errors.New(`VLESS users: inbound's "reverse" can't have "sniffing"`)
}
}
user.Account = serial.ToTypedMessage(account)
config.Clients[idx] = user
config.Users[idx] = user
return nil
}
if err := task.ParallelForN(len(c.Clients), processClient); err != nil {
if err := task.ParallelForN(len(c.Users), processClient); err != nil {
return nil, err
}

View File

@@ -119,7 +119,7 @@ func TestVLessInbound(t *testing.T) {
}`,
Parser: loadJSON(creator),
Output: &inbound.Config{
Clients: []*protocol.User{
Users: []*protocol.User{
{
Account: serial.ToTypedMessage(&vless.Account{
Id: "27848739-7e62-4138-9fd3-098a63964b6b",

View File

@@ -59,7 +59,8 @@ func (c *VMessDefaultConfig) Build() *inbound.DefaultConfig {
}
type VMessInboundConfig struct {
Users []json.RawMessage `json:"clients"`
Users []json.RawMessage `json:"users"`
Clients []json.RawMessage `json:"clients"`
Defaults *VMessDefaultConfig `json:"default"`
}
@@ -73,6 +74,9 @@ func (c *VMessInboundConfig) Build() (proto.Message, error) {
config.Default = c.Defaults.Build()
}
if c.Clients != nil {
c.Users = c.Clients
}
config.User = make([]*protocol.User, len(c.Users))
processUser := func(idx int) error {
rawData := c.Users[idx]