|
|
@@ -32,10 +32,12 @@ func cipherFromString(c string) shadowsocks.CipherType {
|
|
|
}
|
|
|
|
|
|
type ShadowsocksUserConfig struct {
|
|
|
- Cipher string `json:"method"`
|
|
|
- Password string `json:"password"`
|
|
|
- Level byte `json:"level"`
|
|
|
- Email string `json:"email"`
|
|
|
+ Cipher string `json:"method"`
|
|
|
+ Password string `json:"password"`
|
|
|
+ Level byte `json:"level"`
|
|
|
+ Email string `json:"email"`
|
|
|
+ Address *Address `json:"address"`
|
|
|
+ Port uint16 `json:"port"`
|
|
|
}
|
|
|
|
|
|
type ShadowsocksServerConfig struct {
|
|
|
@@ -50,38 +52,7 @@ type ShadowsocksServerConfig struct {
|
|
|
|
|
|
func (v *ShadowsocksServerConfig) Build() (proto.Message, error) {
|
|
|
if C.Contains(shadowaead_2022.List, v.Cipher) {
|
|
|
- if len(v.Users) > 0 {
|
|
|
- if v.Cipher == "" {
|
|
|
- return nil, newError("shadowsocks 2022 (multi-user): missing server method")
|
|
|
- }
|
|
|
- if !strings.Contains(v.Cipher, "aes") {
|
|
|
- return nil, newError("shadowsocks 2022 (multi-user): only blake3-aes-*-gcm methods are supported")
|
|
|
- }
|
|
|
-
|
|
|
- config := new(shadowsocks_2022.MultiUserServerConfig)
|
|
|
- config.Method = v.Cipher
|
|
|
-
|
|
|
- config.Key = v.Password
|
|
|
- config.Network = v.NetworkList.Build()
|
|
|
-
|
|
|
- for _, user := range v.Users {
|
|
|
- if user.Cipher != "" {
|
|
|
- return nil, newError("shadowsocks 2022 (multi-user): users must have empty method")
|
|
|
- }
|
|
|
- config.Users = append(config.Users, &shadowsocks_2022.User{
|
|
|
- Key: user.Password,
|
|
|
- Email: user.Email,
|
|
|
- })
|
|
|
- }
|
|
|
- return config, nil
|
|
|
- }
|
|
|
-
|
|
|
- config := new(shadowsocks_2022.ServerConfig)
|
|
|
- config.Method = v.Cipher
|
|
|
- config.Key = v.Password
|
|
|
- config.Network = v.NetworkList.Build()
|
|
|
- config.Email = v.Email
|
|
|
- return config, nil
|
|
|
+ return buildShadowsocks2022(v)
|
|
|
}
|
|
|
|
|
|
config := new(shadowsocks.ServerConfig)
|
|
|
@@ -129,6 +100,62 @@ func (v *ShadowsocksServerConfig) Build() (proto.Message, error) {
|
|
|
return config, nil
|
|
|
}
|
|
|
|
|
|
+func buildShadowsocks2022(v *ShadowsocksServerConfig) (proto.Message, error) {
|
|
|
+ if len(v.Users) == 0 {
|
|
|
+ config := new(shadowsocks_2022.ServerConfig)
|
|
|
+ config.Method = v.Cipher
|
|
|
+ config.Key = v.Password
|
|
|
+ config.Network = v.NetworkList.Build()
|
|
|
+ config.Email = v.Email
|
|
|
+ return config, nil
|
|
|
+ }
|
|
|
+
|
|
|
+ if v.Cipher == "" {
|
|
|
+ return nil, newError("shadowsocks 2022 (multi-user): missing server method")
|
|
|
+ }
|
|
|
+ if !strings.Contains(v.Cipher, "aes") {
|
|
|
+ return nil, newError("shadowsocks 2022 (multi-user): only blake3-aes-*-gcm methods are supported")
|
|
|
+ }
|
|
|
+
|
|
|
+ if v.Users[0].Address == nil {
|
|
|
+ config := new(shadowsocks_2022.MultiUserServerConfig)
|
|
|
+ config.Method = v.Cipher
|
|
|
+ config.Key = v.Password
|
|
|
+ config.Network = v.NetworkList.Build()
|
|
|
+
|
|
|
+ for _, user := range v.Users {
|
|
|
+ if user.Cipher != "" {
|
|
|
+ return nil, newError("shadowsocks 2022 (multi-user): users must have empty method")
|
|
|
+ }
|
|
|
+ config.Users = append(config.Users, &shadowsocks_2022.User{
|
|
|
+ Key: user.Password,
|
|
|
+ Email: user.Email,
|
|
|
+ })
|
|
|
+ }
|
|
|
+ return config, nil
|
|
|
+ }
|
|
|
+
|
|
|
+ config := new(shadowsocks_2022.RelayServerConfig)
|
|
|
+ config.Method = v.Cipher
|
|
|
+ config.Key = v.Password
|
|
|
+ config.Network = v.NetworkList.Build()
|
|
|
+ for _, user := range v.Users {
|
|
|
+ if user.Cipher != "" {
|
|
|
+ return nil, newError("shadowsocks 2022 (relay): users must have empty method")
|
|
|
+ }
|
|
|
+ if user.Address == nil {
|
|
|
+ return nil, newError("shadowsocks 2022 (relay): all users must have relay address")
|
|
|
+ }
|
|
|
+ config.Destinations = append(config.Destinations, &shadowsocks_2022.RelayDestination{
|
|
|
+ Key: user.Password,
|
|
|
+ Email: user.Email,
|
|
|
+ Address: user.Address.Build(),
|
|
|
+ Port: uint32(user.Port),
|
|
|
+ })
|
|
|
+ }
|
|
|
+ return config, nil
|
|
|
+}
|
|
|
+
|
|
|
type ShadowsocksServerTarget struct {
|
|
|
Address *Address `json:"address"`
|
|
|
Port uint16 `json:"port"`
|