All checks were successful
Docker Build and Push / build-and-push (push) Successful in 3m35s
54 lines
1.1 KiB
Go
54 lines
1.1 KiB
Go
package session
|
|
|
|
import (
|
|
"golang.org/x/crypto/ssh"
|
|
"net"
|
|
)
|
|
|
|
type TunnelType string
|
|
|
|
const (
|
|
HTTP TunnelType = "http"
|
|
TCP TunnelType = "tcp"
|
|
UDP TunnelType = "udp"
|
|
UNKNOWN TunnelType = "unknown"
|
|
)
|
|
|
|
type Session struct {
|
|
Connection *ssh.ServerConn
|
|
ConnChannel ssh.Channel
|
|
Listener net.Listener
|
|
TunnelType TunnelType
|
|
ForwardedPort uint16
|
|
Status SessionStatus
|
|
Slug string
|
|
ChannelChan chan ssh.NewChannel
|
|
Done chan bool
|
|
}
|
|
|
|
func New(conn *ssh.ServerConn, forwardingReq <-chan *ssh.Request) *Session {
|
|
session := &Session{
|
|
Status: SETUP,
|
|
Slug: "",
|
|
ConnChannel: nil,
|
|
Connection: conn,
|
|
TunnelType: UNKNOWN,
|
|
ChannelChan: make(chan ssh.NewChannel),
|
|
Done: make(chan bool),
|
|
}
|
|
|
|
go func() {
|
|
for channel := range session.ChannelChan {
|
|
ch, reqs, _ := channel.Accept()
|
|
if session.ConnChannel == nil {
|
|
session.ConnChannel = ch
|
|
session.Status = RUNNING
|
|
go session.HandleGlobalRequest(forwardingReq)
|
|
}
|
|
go session.HandleGlobalRequest(reqs)
|
|
}
|
|
}()
|
|
|
|
return session
|
|
}
|