| 
					
				 | 
			
			
				@@ -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 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 |