massive refactoring for configuration

This commit is contained in:
V2Ray committed 2015-09-12 11:51:42 +02:00
1 parent 791ac780f0
commit 0ca7dab49b
15 files changed
+212 -147

No files matched your search

+2 -4
View File
@@ -10,13 +10,11 @@ import (
)
type VFreeConnection struct {
vPoint *core.VPoint
dest v2net.VAddress
dest v2net.VAddress
}
func NewVFreeConnection(vp *core.VPoint, dest v2net.VAddress) *VFreeConnection {
func NewVFreeConnection(dest v2net.VAddress) *VFreeConnection {
conn := new(VFreeConnection)
conn.vPoint = vp
conn.dest = dest
return conn
}
+2 -2
View File
@@ -8,6 +8,6 @@ import (
type FreedomFactory struct {
}
func (factory FreedomFactory) Create(vp *core.VPoint, dest v2net.VAddress) (core.OutboundConnectionHandler, error) {
return NewVFreeConnection(vp, dest), nil
func (factory FreedomFactory) Create(vp *core.VPoint, config []byte, dest v2net.VAddress) (core.OutboundConnectionHandler, error) {
return NewVFreeConnection(dest), nil
}
+22
View File
@@ -0,0 +1,22 @@
package socks
import (
"encoding/json"
)
const (
JsonAuthMethodNoAuth = "noauth"
JsonAuthMethodUserPass = "password"
)
type SocksConfig struct {
AuthMethod string `json:"auth"`
Username string `json:"user"`
Password string `json:"pass"`
}
func loadConfig(rawConfig []byte) (SocksConfig, error) {
config := SocksConfig{}
err := json.Unmarshal(rawConfig, &config)
return config, err
}
+25 -16
View File
@@ -3,12 +3,12 @@ package socks
import (
"errors"
"io"
"log"
"net"
"strconv"
"github.com/v2ray/v2ray-core"
socksio "github.com/v2ray/v2ray-core/io/socks"
"github.com/v2ray/v2ray-core/log"
)
var (
@@ -20,18 +20,24 @@ var (
type SocksServer struct {
accepting bool
vPoint *core.VPoint
config SocksConfig
}
func NewSocksServer(vp *core.VPoint) *SocksServer {
func NewSocksServer(vp *core.VPoint, rawConfig []byte) *SocksServer {
server := new(SocksServer)
server.vPoint = vp
config, err := loadConfig(rawConfig)
if err != nil {
panic(log.Error("Unable to load socks config: %v", err))
}
server.config = config
return server
}
func (server *SocksServer) Listen(port uint16) error {
listener, err := net.Listen("tcp", ":"+strconv.Itoa(int(port)))
if err != nil {
return err
return log.Error("Error on listening port %d: %v", port, err)
}
server.accepting = true
go server.AcceptConnections(listener)
@@ -42,8 +48,7 @@ func (server *SocksServer) AcceptConnections(listener net.Listener) error {
for server.accepting {
connection, err := listener.Accept()
if err != nil {
log.Print(err)
return err
return log.Error("Error on accepting socks connection: %v", err)
}
go server.HandleConnection(connection)
}
@@ -55,14 +60,19 @@ func (server *SocksServer) HandleConnection(connection net.Conn) error {
auth, err := socksio.ReadAuthentication(connection)
if err != nil {
log.Print(err)
return err
return log.Error("Error on reading authentication: %v", err)
}
log.Print(auth)
if !auth.HasAuthMethod(socksio.AuthNotRequired) {
// TODO send response with FF
log.Print(ErrorAuthenticationFailed)
expectedAuthMethod := socksio.AuthNotRequired
if server.config.AuthMethod == JsonAuthMethodUserPass {
expectedAuthMethod = socksio.AuthUserPass
}
if !auth.HasAuthMethod(expectedAuthMethod) {
authResponse := socksio.NewAuthenticationResponse(socksio.AuthNoMatchingMethod)
socksio.WriteAuthentication(connection, authResponse)
log.Info("Client doesn't support allowed any auth methods.")
return ErrorAuthenticationFailed
}
@@ -71,8 +81,7 @@ func (server *SocksServer) HandleConnection(connection net.Conn) error {
request, err := socksio.ReadRequest(connection)
if err != nil {
log.Print(err)
return err
return log.Error("Error on reading socks request: %v", err)
}
response := socksio.NewSocks5Response()
@@ -81,7 +90,7 @@ func (server *SocksServer) HandleConnection(connection net.Conn) error {
response := socksio.NewSocks5Response()
response.Error = socksio.ErrorCommandNotSupported
socksio.WriteResponse(connection, response)
log.Print(ErrorCommandNotSupported)
log.Info("Unsupported socks command %d", request.Command)
return ErrorCommandNotSupported
}
@@ -114,7 +123,7 @@ func (server *SocksServer) dumpInput(conn net.Conn, input chan<- []byte, finish
for {
buffer := make([]byte, 256)
nBytes, err := conn.Read(buffer)
log.Printf("Reading %d bytes, with error %v", nBytes, err)
log.Debug("Reading %d bytes, with error %v", nBytes, err)
if err == io.EOF {
close(input)
finish <- true
@@ -132,7 +141,7 @@ func (server *SocksServer) dumpOutput(conn net.Conn, output <-chan []byte, finis
break
}
nBytes, _ := conn.Write(buffer)
log.Printf("Writing %d bytes", nBytes)
log.Debug("Writing %d bytes", nBytes)
}
}
+2 -2
View File
@@ -7,6 +7,6 @@ import (
type SocksServerFactory struct {
}
func (factory SocksServerFactory) Create(vp *core.VPoint) (core.InboundConnectionHandler, error) {
return NewSocksServer(vp), nil
func (factory SocksServerFactory) Create(vp *core.VPoint, config []byte) (core.InboundConnectionHandler, error) {
return NewSocksServer(vp, config), nil
}
+40
View File
@@ -0,0 +1,40 @@
package vmess
import (
"encoding/json"
"github.com/v2ray/v2ray-core"
v2net "github.com/v2ray/v2ray-core/net"
)
type VMessInboundConfig struct {
AllowedClients []core.VUser `json:"clients"`
}
func loadInboundConfig(rawConfig []byte) (VMessInboundConfig, error) {
config := VMessInboundConfig{}
err := json.Unmarshal(rawConfig, &config)
return config, err
}
type VNextConfig struct {
Address string `json:"address"`
Port uint16 `json:"port"`
Users []core.VUser `json:"users"`
}
func (config VNextConfig) ToVNextServer() VNextServer {
return VNextServer{
v2net.DomainAddress(config.Address, config.Port),
config.Users}
}
type VMessOutboundConfig struct {
VNextList []VNextConfig
}
func loadOutboundConfig(rawConfig []byte) (VMessOutboundConfig, error) {
config := VMessOutboundConfig{}
err := json.Unmarshal(rawConfig, &config)
return config, err
}
+11 -11
View File
@@ -8,6 +8,7 @@ import (
"github.com/v2ray/v2ray-core"
v2io "github.com/v2ray/v2ray-core/io"
vmessio "github.com/v2ray/v2ray-core/io/vmess"
"github.com/v2ray/v2ray-core/log"
)
type VMessInboundHandler struct {
@@ -89,6 +90,7 @@ func (handler *VMessInboundHandler) dumpInput(reader io.Reader, input chan<- []b
buffer := make([]byte, BufferSize)
nBytes, err := reader.Read(buffer)
if err == io.EOF {
close(input)
finish <- true
break
}
@@ -114,18 +116,16 @@ func (handler *VMessInboundHandler) waitForFinish(finish <-chan bool) {
}
type VMessInboundHandlerFactory struct {
allowedClients *core.VUserSet
}
func NewVMessInboundHandlerFactory(clients []core.VUser) *VMessInboundHandlerFactory {
factory := new(VMessInboundHandlerFactory)
factory.allowedClients = core.NewVUserSet()
for _, user := range clients {
factory.allowedClients.AddUser(user)
func (factory *VMessInboundHandlerFactory) Create(vp *core.VPoint, rawConfig []byte) *VMessInboundHandler {
config, err := loadInboundConfig(rawConfig)
if err != nil {
panic(log.Error("Failed to load VMess inbound config: %v", err))
}
return factory
}
func (factory *VMessInboundHandlerFactory) Create(vp *core.VPoint) *VMessInboundHandler {
return NewVMessInboundHandler(vp, factory.allowedClients)
allowedClients := core.NewVUserSet()
for _, user := range config.AllowedClients {
allowedClients.AddUser(user)
}
return NewVMessInboundHandler(vp, allowedClients)
}
+26 -8
View File
@@ -10,28 +10,37 @@ import (
"github.com/v2ray/v2ray-core"
v2io "github.com/v2ray/v2ray-core/io"
vmessio "github.com/v2ray/v2ray-core/io/vmess"
"github.com/v2ray/v2ray-core/log"
v2net "github.com/v2ray/v2ray-core/net"
)
type VMessOutboundHandler struct {
vPoint *core.VPoint
dest v2net.VAddress
// VNext is the next VPoint server in the connection chain.
type VNextServer struct {
Address v2net.VAddress // Address of VNext server
Users []core.VUser // User accounts for accessing VNext.
}
func NewVMessOutboundHandler(vp *core.VPoint, dest v2net.VAddress) *VMessOutboundHandler {
type VMessOutboundHandler struct {
vPoint *core.VPoint
dest v2net.VAddress
vNextList []VNextServer
}
func NewVMessOutboundHandler(vp *core.VPoint, vNextList []VNextServer, dest v2net.VAddress) *VMessOutboundHandler {
handler := new(VMessOutboundHandler)
handler.vPoint = vp
handler.dest = dest
handler.vNextList = vNextList
return handler
}
func (handler *VMessOutboundHandler) pickVNext() (v2net.VAddress, core.VUser) {
vNextLen := len(handler.vPoint.Config.VNextList)
vNextLen := len(handler.vNextList)
if vNextLen == 0 {
panic("Zero vNext is configured.")
}
vNextIndex := mrand.Intn(vNextLen)
vNext := handler.vPoint.Config.VNextList[vNextIndex]
vNext := handler.vNextList[vNextIndex]
vNextUserLen := len(vNext.Users)
if vNextUserLen == 0 {
panic("Zero User account.")
@@ -91,6 +100,7 @@ func (handler *VMessOutboundHandler) dumpOutput(reader io.Reader, output chan<-
buffer := make([]byte, BufferSize)
nBytes, err := reader.Read(buffer)
if err == io.EOF {
close(output)
finish <- true
break
}
@@ -118,6 +128,14 @@ func (handler *VMessOutboundHandler) waitForFinish(finish <-chan bool) {
type VMessOutboundHandlerFactory struct {
}
func (factory *VMessOutboundHandlerFactory) Create(vp *core.VPoint, destination v2net.VAddress) *VMessOutboundHandler {
return NewVMessOutboundHandler(vp, destination)
func (factory *VMessOutboundHandlerFactory) Create(vp *core.VPoint, rawConfig []byte, destination v2net.VAddress) *VMessOutboundHandler {
config, err := loadOutboundConfig(rawConfig)
if err != nil {
panic(log.Error("Failed to load VMess outbound config: %v", err))
}
servers := make([]VNextServer, 0, len(config.VNextList))
for _, server := range config.VNextList {
servers = append(servers, server.ToVNextServer())
}
return NewVMessOutboundHandler(vp, servers, destination)
}