mirror of https://github.com/ehang-io/nps
new feature multi user auth with socks5
parent
5e55b761cf
commit
a05995fba5
|
@ -488,6 +488,7 @@ loop:
|
||||||
tl.Password = t.Password
|
tl.Password = t.Password
|
||||||
tl.LocalPath = t.LocalPath
|
tl.LocalPath = t.LocalPath
|
||||||
tl.StripPre = t.StripPre
|
tl.StripPre = t.StripPre
|
||||||
|
tl.MultiUser = t.MultiUser
|
||||||
if !client.HasTunnel(tl) {
|
if !client.HasTunnel(tl) {
|
||||||
if err := file.GetDb().NewTask(tl); err != nil {
|
if err := file.GetDb().NewTask(tl); err != nil {
|
||||||
logs.Notice("Add task error ", err.Error())
|
logs.Notice("Add task error ", err.Error())
|
||||||
|
|
|
@ -240,15 +240,14 @@ func dealTunnel(s string) *file.Tunnel {
|
||||||
case "strip_pre":
|
case "strip_pre":
|
||||||
t.StripPre = item[1]
|
t.StripPre = item[1]
|
||||||
case "multi_user":
|
case "multi_user":
|
||||||
// TODO add test with multi user config file
|
t.MultiUser = new(file.MultiUser)
|
||||||
t.Client.Cnf.MultiUser = true
|
|
||||||
if b, err := common.ReadAllFromFile(item[1]); err != nil {
|
if b, err := common.ReadAllFromFile(item[1]); err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
} else {
|
} else {
|
||||||
if content, err := common.ParseStr(string(b)); err != nil {
|
if content, err := common.ParseStr(string(b)); err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
} else {
|
} else {
|
||||||
t.Client.Cnf.MultiUserMap = dealMultiUser(content)
|
t.MultiUser.UserMap = dealMultiUser(content)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,8 +29,6 @@ type Config struct {
|
||||||
P string
|
P string
|
||||||
Compress bool
|
Compress bool
|
||||||
Crypt bool
|
Crypt bool
|
||||||
MultiUser bool // enable multi user authentication.
|
|
||||||
MultiUserMap map[string]string // multi user and pwd
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type Client struct {
|
type Client struct {
|
||||||
|
@ -142,6 +140,7 @@ type Tunnel struct {
|
||||||
LocalPath string
|
LocalPath string
|
||||||
StripPre string
|
StripPre string
|
||||||
Target *Target
|
Target *Target
|
||||||
|
MultiUser *MultiUser
|
||||||
Health
|
Health
|
||||||
sync.RWMutex
|
sync.RWMutex
|
||||||
}
|
}
|
||||||
|
@ -186,6 +185,10 @@ type Target struct {
|
||||||
sync.RWMutex
|
sync.RWMutex
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type MultiUser struct {
|
||||||
|
UserMap map[string]string // multi user and pwd
|
||||||
|
}
|
||||||
|
|
||||||
func (s *Target) GetRandomTarget() (string, error) {
|
func (s *Target) GetRandomTarget() (string, error) {
|
||||||
if s.TargetArr == nil {
|
if s.TargetArr == nil {
|
||||||
s.TargetArr = strings.Split(s.TargetStr, "\n")
|
s.TargetArr = strings.Split(s.TargetStr, "\n")
|
||||||
|
|
|
@ -199,7 +199,7 @@ func (s *Sock5ModeServer) handleConn(c net.Conn) {
|
||||||
c.Close()
|
c.Close()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if (s.task.Client.Cnf.U != "" && s.task.Client.Cnf.P != "") || (s.task.Client.Cnf.MultiUser && len(s.task.Client.Cnf.MultiUserMap) > 0) {
|
if (s.task.Client.Cnf.U != "" && s.task.Client.Cnf.P != "") || (s.task.MultiUser != nil && len(s.task.MultiUser.UserMap) > 0) {
|
||||||
buf[1] = UserPassAuth
|
buf[1] = UserPassAuth
|
||||||
c.Write(buf)
|
c.Write(buf)
|
||||||
if err := s.Auth(c); err != nil {
|
if err := s.Auth(c); err != nil {
|
||||||
|
@ -238,11 +238,11 @@ func (s *Sock5ModeServer) Auth(c net.Conn) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
var U, P string
|
var U, P string
|
||||||
if s.task.Client.Cnf.MultiUser {
|
if s.task.MultiUser != nil {
|
||||||
// enable multi user auth
|
// enable multi user auth
|
||||||
U = string(user)
|
U = string(user)
|
||||||
var ok bool
|
var ok bool
|
||||||
P, ok = s.task.Client.Cnf.MultiUserMap[U]
|
P, ok = s.task.MultiUser.UserMap[U]
|
||||||
if !ok {
|
if !ok {
|
||||||
return errors.New("验证不通过")
|
return errors.New("验证不通过")
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue