1
0
mirror of https://github.com/v2fly/v2ray-core.git synced 2024-12-30 05:56:54 -05:00

Socks supports multiple accounts

This commit is contained in:
V2Ray 2015-10-10 15:51:35 +02:00
parent 7cce04cc3a
commit 213aa2ecf0
5 changed files with 44 additions and 14 deletions

View File

@ -10,21 +10,41 @@ const (
AuthMethodUserPass = "password"
)
type SocksConfig struct {
AuthMethod string `json:"auth"`
Username string `json:"user"`
Password string `json:"pass"`
UDPEnabled bool `json:"udp"`
type SocksAccount struct {
Username string `json:"user"`
Password string `json:"pass"`
}
func (config SocksConfig) IsNoAuth() bool {
type SocksConfig struct {
AuthMethod string `json:"auth"`
Accounts []SocksAccount `json:"accounts"`
UDPEnabled bool `json:"udp"`
accountMap map[string]string
}
func (config *SocksConfig) Initialize() {
config.accountMap = make(map[string]string)
for _, account := range config.Accounts {
config.accountMap[account.Username] = account.Password
}
}
func (config *SocksConfig) IsNoAuth() bool {
return config.AuthMethod == AuthMethodNoAuth
}
func (config SocksConfig) IsPassword() bool {
func (config *SocksConfig) IsPassword() bool {
return config.AuthMethod == AuthMethodUserPass
}
func (config *SocksConfig) HasAccount(user, pass string) bool {
if actualPass, found := config.accountMap[user]; found {
return actualPass == pass
}
return false
}
func init() {
json.RegisterConfigType("socks", config.TypeInbound, func() interface{} {
return new(SocksConfig)

View File

@ -107,8 +107,12 @@ type Socks5UserPassRequest struct {
password string
}
func (request Socks5UserPassRequest) IsValid(username string, password string) bool {
return request.username == username && request.password == password
func (request Socks5UserPassRequest) Username() string {
return request.username
}
func (request Socks5UserPassRequest) Password() string {
return request.password
}
func (request Socks5UserPassRequest) AuthDetail() string {

View File

@ -103,7 +103,7 @@ func (server *SocksServer) handleSocks5(reader *v2net.TimeOutReader, writer io.W
return err
}
status := byte(0)
if !upRequest.IsValid(server.config.Username, server.config.Password) {
if server.config.HasAccount(upRequest.Username(), upRequest.Password()) {
status = byte(0xFF)
}
upResponse := protocol.NewSocks5UserPassResponse(status)

View File

@ -84,8 +84,12 @@ func TestSocksTcpConnectWithUserPass(t *testing.T) {
ProtocolValue: "socks",
SettingsValue: &json.SocksConfig{
AuthMethod: "noauth",
Username: "userx",
Password: "passy",
Accounts: []json.SocksAccount{
json.SocksAccount{
Username: "userx",
Password: "passy",
},
},
},
},
OutboundConfigValue: &mocks.ConnectionConfig{

View File

@ -8,8 +8,10 @@ import (
type SocksServerFactory struct {
}
func (factory SocksServerFactory) Create(vp *core.Point, config interface{}) (core.InboundConnectionHandler, error) {
return NewSocksServer(vp, config.(*json.SocksConfig)), nil
func (factory SocksServerFactory) Create(vp *core.Point, rawConfig interface{}) (core.InboundConnectionHandler, error) {
config := rawConfig.(*json.SocksConfig)
config.Initialize()
return NewSocksServer(vp, config), nil
}
func init() {