| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 | 
							- // +build json
 
- package shadowsocks
 
- import (
 
- 	"encoding/json"
 
- 	"errors"
 
- 	"strings"
 
- 	"v2ray.com/core/common"
 
- 	"v2ray.com/core/common/log"
 
- 	"v2ray.com/core/common/protocol"
 
- 	"v2ray.com/core/proxy/registry"
 
- 	"github.com/golang/protobuf/ptypes"
 
- )
 
- func (this *ServerConfig) UnmarshalJSON(data []byte) error {
 
- 	type JsonConfig struct {
 
- 		Cipher   string `json:"method"`
 
- 		Password string `json:"password"`
 
- 		UDP      bool   `json:"udp"`
 
- 		Level    byte   `json:"level"`
 
- 		Email    string `json:"email"`
 
- 	}
 
- 	jsonConfig := new(JsonConfig)
 
- 	if err := json.Unmarshal(data, jsonConfig); err != nil {
 
- 		return errors.New("Shadowsocks: Failed to parse config: " + err.Error())
 
- 	}
 
- 	this.UdpEnabled = jsonConfig.UDP
 
- 	if len(jsonConfig.Password) == 0 {
 
- 		log.Error("Shadowsocks: Password is not specified.")
 
- 		return common.ErrBadConfiguration
 
- 	}
 
- 	account := &Account{
 
- 		Password: jsonConfig.Password,
 
- 	}
 
- 	jsonConfig.Cipher = strings.ToLower(jsonConfig.Cipher)
 
- 	switch jsonConfig.Cipher {
 
- 	case "aes-256-cfb":
 
- 		account.CipherType = CipherType_AES_256_CFB
 
- 	case "aes-128-cfb":
 
- 		account.CipherType = CipherType_AES_128_CFB
 
- 	case "chacha20":
 
- 		account.CipherType = CipherType_CHACHA20
 
- 	case "chacha20-ietf":
 
- 		account.CipherType = CipherType_CHACHA20_IEFT
 
- 	default:
 
- 		log.Error("Shadowsocks: Unknown cipher method: ", jsonConfig.Cipher)
 
- 		return common.ErrBadConfiguration
 
- 	}
 
- 	anyAccount, err := ptypes.MarshalAny(account)
 
- 	if err != nil {
 
- 		log.Error("Shadowsocks: Failed to create account: ", err)
 
- 		return common.ErrBadConfiguration
 
- 	}
 
- 	this.User = &protocol.User{
 
- 		Email:   jsonConfig.Email,
 
- 		Level:   uint32(jsonConfig.Level),
 
- 		Account: anyAccount,
 
- 	}
 
- 	return nil
 
- }
 
- func init() {
 
- 	registry.RegisterInboundConfig("shadowsocks", func() interface{} { return new(ServerConfig) })
 
- }
 
 
  |