|  | @@ -0,0 +1,46 @@
 | 
	
		
			
				|  |  | +// +build json
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +package shadowsocks
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import (
 | 
	
		
			
				|  |  | +	"encoding/json"
 | 
	
		
			
				|  |  | +  
 | 
	
		
			
				|  |  | +  "github.com/v2ray/v2ray-core/common/log"
 | 
	
		
			
				|  |  | +  "github.com/v2ray/v2ray-core/common/serial"
 | 
	
		
			
				|  |  | +  "github.com/v2ray/v2ray-core/proxy/internal"
 | 
	
		
			
				|  |  | +)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func (this *Config) UnmarshalJSON(data []byte) error {
 | 
	
		
			
				|  |  | +	type JsonConfig struct {
 | 
	
		
			
				|  |  | +		Cipher   *serial.StringLiteral `json:"method"`
 | 
	
		
			
				|  |  | +		Password *serial.StringLiteral `json:"password"`
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	jsonConfig := new(JsonConfig)
 | 
	
		
			
				|  |  | +	if err := json.Unmarshal(data, jsonConfig); err != nil {
 | 
	
		
			
				|  |  | +		return err
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +  if this.Password == nil {
 | 
	
		
			
				|  |  | +    log.Error("Shadowsocks: Password is not specified.")
 | 
	
		
			
				|  |  | +    return internal.ErrorBadConfiguration
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  this.Password = jsonConfig.Password.String()
 | 
	
		
			
				|  |  | +  if this.Cipher == nil {
 | 
	
		
			
				|  |  | +    log.Error("Shadowsocks: Cipher method is not specified.")
 | 
	
		
			
				|  |  | +    return internal.ErrorBadConfiguration
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  jsonConfig.Cipher = jsonConfig.Cipher.ToLower()
 | 
	
		
			
				|  |  | +  switch jsonConfig.Cipher.String() {
 | 
	
		
			
				|  |  | +    case "aes-256-cfb":
 | 
	
		
			
				|  |  | +    this.Cipher = &AesCfb {
 | 
	
		
			
				|  |  | +      KeyBytes: 32
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    case "aes-128-cfb":
 | 
	
		
			
				|  |  | +    this.Cipher = &AesCfb {
 | 
	
		
			
				|  |  | +      KeyBytes: 32
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    default:
 | 
	
		
			
				|  |  | +    log.Error("Shadowsocks: Unknown cipher method: ", jsonConfig.Cipher)
 | 
	
		
			
				|  |  | +    return internal.ErrorBadConfiguration
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  return nil
 | 
	
		
			
				|  |  | +}
 |