Skip to content

Commit

Permalink
Support for Serving on Generic net.Listener
Browse files Browse the repository at this point in the history
  • Loading branch information
adrianosela committed Mar 15, 2024
1 parent ea8f9b5 commit 66c2cfd
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 19 deletions.
77 changes: 61 additions & 16 deletions proxy/proxy.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"net"
"path"
"strconv"
"sync"
"time"

"github.com/amitbet/vncproxy/client"
Expand All @@ -16,12 +17,13 @@ import (
)

type VncProxy struct {
TCPListeningURL string // empty = not listening on tcp
WsListeningURL string // empty = not listening on ws
RecordingDir string // empty = no recording
ProxyVncPassword string //empty = no auth
SingleSession *VncSession // to be used when not using sessions
UsingSessions bool //false = single session - defined in the var above
NetListener net.Listener // nil = not listening on a generic net.Listener
TCPListeningURL string // empty = not listening on tcp
WsListeningURL string // empty = not listening on ws
RecordingDir string // empty = no recording
ProxyVncPassword string //empty = no auth
SingleSession *VncSession // to be used when not using sessions
UsingSessions bool //false = single session - defined in the var above
sessionManager *SessionManager
}

Expand Down Expand Up @@ -172,7 +174,7 @@ func (vp *VncProxy) StartListening() {
secHandlers := []server.SecurityHandler{&server.ServerAuthNone{}}

if vp.ProxyVncPassword != "" {
secHandlers = []server.SecurityHandler{&server.ServerAuthVNC{vp.ProxyVncPassword}}
secHandlers = []server.SecurityHandler{&server.ServerAuthVNC{Pass: vp.ProxyVncPassword}}
}
cfg := &server.ServerConfig{
SecurityHandlers: secHandlers,
Expand All @@ -186,19 +188,62 @@ func (vp *VncProxy) StartListening() {
UseDummySession: !vp.UsingSessions,
}

if vp.TCPListeningURL != "" && vp.WsListeningURL != "" {
logger.Infof("running two listeners: tcp port: %s, ws url: %s", vp.TCPListeningURL, vp.WsListeningURL)

go server.WsServe(vp.WsListeningURL, cfg)
server.TcpServe(vp.TCPListeningURL, cfg)
if vp.countListeners() == 0 {
logger.Error("no listeners configured on VncProxy")
return
}

var wg sync.WaitGroup

if vp.WsListeningURL != "" {
logger.Infof("running ws listener url: %s", vp.WsListeningURL)
server.WsServe(vp.WsListeningURL, cfg)
wg.Add(1)

go func() {
defer wg.Done()
defer logger.Info("ws listener stopped")

logger.Infof("running ws listener url: %s", vp.WsListeningURL)
server.WsServe(vp.WsListeningURL, cfg)
}()
}

if vp.TCPListeningURL != "" {
logger.Infof("running tcp listener on port: %s", vp.TCPListeningURL)
server.TcpServe(vp.TCPListeningURL, cfg)
wg.Add(1)

go func() {
defer wg.Done()
defer logger.Info("tcp listener stopped")

logger.Infof("running tcp listener on port: %s", vp.TCPListeningURL)
server.TcpServe(vp.TCPListeningURL, cfg)
}()
}

if vp.NetListener != nil {
wg.Add(1)

go func() {
defer wg.Done()
defer logger.Info("generic net.Listener stopped")

logger.Info("running generic net.Listener")
server.NetListenerServe(vp.NetListener, cfg)
}()
}

wg.Wait()
}

func (vp *VncProxy) countListeners() int {
count := 0
if vp.TCPListeningURL != "" {
count++
}
if vp.WsListeningURL != "" {
count++
}
if vp.NetListener != nil {
count++
}
return count
}
8 changes: 5 additions & 3 deletions server/server.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package server

import (
"fmt"
"io"
"log"
"net"

"github.com/amitbet/vncproxy/common"
)

Expand Down Expand Up @@ -61,14 +61,17 @@ func TcpServe(url string, cfg *ServerConfig) error {
if err != nil {
log.Fatalf("Error listen. %v", err)
}
return NetListenerServe(ln, cfg)
}

func NetListenerServe(ln net.Listener, cfg *ServerConfig) error {
for {
c, err := ln.Accept()
if err != nil {
return err
}
go attachNewServerConn(c, cfg, "dummySession")
}
return nil
}

func attachNewServerConn(c io.ReadWriter, cfg *ServerConfig, sessionId string) error {
Expand All @@ -79,7 +82,6 @@ func attachNewServerConn(c io.ReadWriter, cfg *ServerConfig, sessionId string) e
}

if err := ServerVersionHandler(cfg, conn); err != nil {
fmt.Errorf("err: %v\n", err)
conn.Close()
return err
}
Expand Down

0 comments on commit 66c2cfd

Please sign in to comment.