diff --git a/api.go b/api.go index 18dce97..2f1ae84 100644 --- a/api.go +++ b/api.go @@ -282,6 +282,16 @@ func (a *Api) CreateTunnel(tokenData TokenData, params url.Values) (*Tunnel, err clientAddr = "127.0.0.1" } + tunnelPort := 0 + tunnelPortParam := params.Get("tunnel-port") + if tunnelPortParam != "" && tunnelPortParam != "Random" { + var err error + tunnelPort, err = strconv.Atoi(tunnelPortParam) + if err != nil { + return nil, errors.New("Invalid tunnel-port parameter") + } + } + allowExternalTcp := params.Get("allow-external-tcp") == "on" passwordProtect := params.Get("password-protect") == "on" @@ -312,6 +322,7 @@ func (a *Api) CreateTunnel(tokenData TokenData, params url.Values) (*Tunnel, err ClientName: clientName, ClientPort: clientPort, ClientAddress: clientAddr, + TunnelPort: tunnelPort, AllowExternalTcp: allowExternalTcp, AuthUsername: username, AuthPassword: password, diff --git a/tunnel_manager.go b/tunnel_manager.go index 376676f..133b289 100644 --- a/tunnel_manager.go +++ b/tunnel_manager.go @@ -70,12 +70,21 @@ func (m *TunnelManager) RequestCreateTunnel(tunReq Tunnel) (Tunnel, error) { m.mutex.Lock() defer m.mutex.Unlock() - port, err := randomOpenPort() - if err != nil { - return Tunnel{}, err + if tunReq.TunnelPort == 0 { + var err error + tunReq.TunnelPort, err = randomOpenPort() + if err != nil { + return Tunnel{}, err + } + } else { + for _, tun := range m.db.GetTunnels() { + if tunReq.TunnelPort == tun.TunnelPort { + return Tunnel{}, errors.New("Tunnel port already in use") + } + } } - privKey, err := m.addToAuthorizedKeys(tunReq.Domain, port, tunReq.AllowExternalTcp, tunReq.SshKey) + privKey, err := m.addToAuthorizedKeys(tunReq.Domain, tunReq.TunnelPort, tunReq.AllowExternalTcp, tunReq.SshKey) if err != nil { return Tunnel{}, err } @@ -84,7 +93,6 @@ func (m *TunnelManager) RequestCreateTunnel(tunReq Tunnel) (Tunnel, error) { tunReq.ServerPort = m.config.SshServerPort tunReq.ServerPublicKey = "" tunReq.Username = m.user.Username - tunReq.TunnelPort = port tunReq.TunnelPrivateKey = privKey m.db.SetTunnel(tunReq.Domain, tunReq) diff --git a/webui/index.tmpl b/webui/index.tmpl index 3299a04..edcd104 100644 --- a/webui/index.tmpl +++ b/webui/index.tmpl @@ -89,6 +89,10 @@ +