Basic auth
This commit is contained in:
40
openvpn.go
40
openvpn.go
@@ -11,17 +11,24 @@ import (
|
||||
"github.com/pyke369/golang-support/rcache"
|
||||
)
|
||||
|
||||
type OpenVpnPassword struct {
|
||||
User string
|
||||
Pass string
|
||||
}
|
||||
|
||||
type OpenVpnSrv struct {
|
||||
Remote string `json:"active-vpn"`
|
||||
Status string `json:"status"`
|
||||
Provider string `json:"provider"`
|
||||
Identifier string `json:"identifier"`
|
||||
chanHold chan bool
|
||||
chanPass chan OpenVpnPassword
|
||||
m sync.RWMutex
|
||||
ret chan []string
|
||||
buf *bufio.ReadWriter
|
||||
mgt *OpenVpnMgt
|
||||
hold bool
|
||||
authCache *OpenVpnPassword
|
||||
}
|
||||
|
||||
func (v *OpenVpnSrv) Lock() {
|
||||
@@ -36,6 +43,7 @@ func NewOpenVpnSrv(conn net.Conn, mgt *OpenVpnMgt) *OpenVpnSrv {
|
||||
return &OpenVpnSrv{
|
||||
buf: bufio.NewReadWriter(bufio.NewReader(conn), bufio.NewWriter(conn)),
|
||||
chanHold: make(chan bool),
|
||||
chanPass: make(chan OpenVpnPassword),
|
||||
ret: make(chan []string),
|
||||
mgt: mgt,
|
||||
hold: false,
|
||||
@@ -122,7 +130,6 @@ func (v *OpenVpnSrv) GetEcho() {
|
||||
v.Provider = match[2]
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func (v *OpenVpnSrv) Response(response []string) {
|
||||
@@ -168,6 +175,37 @@ func (v *OpenVpnSrv) SetRemote(server string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (v *OpenVpnSrv) NeedPassword(line string) {
|
||||
v.mgt.Debug(line)
|
||||
v.Status = "Need Password"
|
||||
switch line {
|
||||
case ">PASSWORD:Need 'Auth' username/password":
|
||||
v.Status = "Need Password"
|
||||
case ">PASSWORD:Verification Failed: 'Auth'":
|
||||
v.authCache = nil
|
||||
v.Status = "Auth Failed"
|
||||
return
|
||||
}
|
||||
if v.authCache == nil {
|
||||
ident := <-v.chanPass
|
||||
v.authCache = &ident
|
||||
}
|
||||
switch line {
|
||||
case ">PASSWORD:Need 'Auth' username/password":
|
||||
v.sendCommand([]string{fmt.Sprintf("username \"Auth\" %s", v.authCache.User)})
|
||||
v.sendCommand([]string{fmt.Sprintf("password \"Auth\" %s", v.authCache.Pass)})
|
||||
}
|
||||
}
|
||||
|
||||
func (v *OpenVpnSrv) AuthUserPass(user, pass string) {
|
||||
auth := OpenVpnPassword{user, pass}
|
||||
v.authCache = &auth
|
||||
if v.Status == "Need Password" {
|
||||
v.Status = "Authenticate"
|
||||
v.chanPass <- auth
|
||||
}
|
||||
}
|
||||
|
||||
func (v *OpenVpnSrv) waitForRelase() {
|
||||
v.Status = "Hold"
|
||||
if v.hold {
|
||||
|
||||
Reference in New Issue
Block a user