updated routing rules a bit
This commit is contained in:
@ -9,6 +9,7 @@ import "os"
|
|||||||
import "os/exec"
|
import "os/exec"
|
||||||
import "os/user"
|
import "os/user"
|
||||||
import "strconv"
|
import "strconv"
|
||||||
|
import "strings"
|
||||||
import "sync"
|
import "sync"
|
||||||
import "syscall"
|
import "syscall"
|
||||||
import "text/template"
|
import "text/template"
|
||||||
@ -306,6 +307,7 @@ func (pts *client_pts_xterm_file) ServeHTTP(w http.ResponseWriter, req *http.Req
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
case "_forbidden":
|
case "_forbidden":
|
||||||
status_code = WriteEmptyRespHeader(w, http.StatusForbidden)
|
status_code = WriteEmptyRespHeader(w, http.StatusForbidden)
|
||||||
|
|
||||||
@ -313,7 +315,13 @@ func (pts *client_pts_xterm_file) ServeHTTP(w http.ResponseWriter, req *http.Req
|
|||||||
status_code = WriteEmptyRespHeader(w, http.StatusNotFound)
|
status_code = WriteEmptyRespHeader(w, http.StatusNotFound)
|
||||||
|
|
||||||
default:
|
default:
|
||||||
status_code = WriteEmptyRespHeader(w, http.StatusNotFound)
|
if strings.HasPrefix(pts.file, "_redir:") {
|
||||||
|
status_code = http.StatusMovedPermanently
|
||||||
|
w.Header().Set("Location", pts.file[7:])
|
||||||
|
w.WriteHeader(status_code)
|
||||||
|
} else {
|
||||||
|
status_code = WriteEmptyRespHeader(w, http.StatusNotFound)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//done:
|
//done:
|
||||||
|
10
client.go
10
client.go
@ -1652,14 +1652,22 @@ func NewClient(ctx context.Context, name string, logger Logger, cfg *ClientConfi
|
|||||||
|
|
||||||
c.ctl_mux.Handle("/_pts/xterm.js",
|
c.ctl_mux.Handle("/_pts/xterm.js",
|
||||||
c.WrapHttpHandler(&client_pts_xterm_file{client_ctl: client_ctl{c: &c, id: HS_ID_CTL}, file: "xterm.js"}))
|
c.WrapHttpHandler(&client_pts_xterm_file{client_ctl: client_ctl{c: &c, id: HS_ID_CTL}, file: "xterm.js"}))
|
||||||
|
c.ctl_mux.Handle("/_pts/xterm.js/",
|
||||||
|
c.WrapHttpHandler(&client_pts_xterm_file{client_ctl: client_ctl{c: &c, id: HS_ID_CTL}, file: "_forbidden"}))
|
||||||
c.ctl_mux.Handle("/_pts/xterm-addon-fit.js",
|
c.ctl_mux.Handle("/_pts/xterm-addon-fit.js",
|
||||||
c.WrapHttpHandler(&client_pts_xterm_file{client_ctl: client_ctl{c: &c, id: HS_ID_CTL}, file: "xterm-addon-fit.js"}))
|
c.WrapHttpHandler(&client_pts_xterm_file{client_ctl: client_ctl{c: &c, id: HS_ID_CTL}, file: "xterm-addon-fit.js"}))
|
||||||
|
c.ctl_mux.Handle("/_pts/xterm-addon-fit.js/",
|
||||||
|
c.WrapHttpHandler(&client_pts_xterm_file{client_ctl: client_ctl{c: &c, id: HS_ID_CTL}, file: "_forbidden"}))
|
||||||
c.ctl_mux.Handle("/_pts/xterm.css",
|
c.ctl_mux.Handle("/_pts/xterm.css",
|
||||||
c.WrapHttpHandler(&client_pts_xterm_file{client_ctl: client_ctl{c: &c, id: HS_ID_CTL}, file: "xterm.css"}))
|
c.WrapHttpHandler(&client_pts_xterm_file{client_ctl: client_ctl{c: &c, id: HS_ID_CTL}, file: "xterm.css"}))
|
||||||
|
c.ctl_mux.Handle("/_pts/xterm.css/",
|
||||||
|
c.WrapHttpHandler(&client_pts_xterm_file{client_ctl: client_ctl{c: &c, id: HS_ID_CTL}, file: "_forbidden"}))
|
||||||
c.ctl_mux.Handle("/_pts/xterm.html",
|
c.ctl_mux.Handle("/_pts/xterm.html",
|
||||||
c.WrapHttpHandler(&client_pts_xterm_file{client_ctl: client_ctl{c: &c, id: HS_ID_CTL}, file: "xterm.html"}))
|
c.WrapHttpHandler(&client_pts_xterm_file{client_ctl: client_ctl{c: &c, id: HS_ID_CTL}, file: "xterm.html"}))
|
||||||
|
c.ctl_mux.Handle("/_pts/xterm.html/", // without this forbidden, /_pts/xterm.js/ access resulted in xterm.html.
|
||||||
|
c.WrapHttpHandler(&client_pts_xterm_file{client_ctl: client_ctl{c: &c, id: HS_ID_CTL}, file: "_forbidden"}))
|
||||||
c.ctl_mux.Handle("/_pts/",
|
c.ctl_mux.Handle("/_pts/",
|
||||||
c.WrapHttpHandler(&client_pts_xterm_file{client_ctl: client_ctl{c: &c, id: HS_ID_CTL}, file: "xterm.html"}))
|
c.WrapHttpHandler(&client_pts_xterm_file{client_ctl: client_ctl{c: &c, id: HS_ID_CTL}, file: "_redir:xterm.html"}))
|
||||||
|
|
||||||
c.ctl_addr = make([]string, len(cfg.CtlAddrs))
|
c.ctl_addr = make([]string, len(cfg.CtlAddrs))
|
||||||
c.ctl = make([]*http.Server, len(cfg.CtlAddrs))
|
c.ctl = make([]*http.Server, len(cfg.CtlAddrs))
|
||||||
|
@ -9,6 +9,7 @@ import "os"
|
|||||||
import "os/exec"
|
import "os/exec"
|
||||||
import "os/user"
|
import "os/user"
|
||||||
import "strconv"
|
import "strconv"
|
||||||
|
import "strings"
|
||||||
import "sync"
|
import "sync"
|
||||||
import "syscall"
|
import "syscall"
|
||||||
import "text/template"
|
import "text/template"
|
||||||
@ -313,7 +314,13 @@ func (pts *server_pts_xterm_file) ServeHTTP(w http.ResponseWriter, req *http.Req
|
|||||||
status_code = WriteEmptyRespHeader(w, http.StatusNotFound)
|
status_code = WriteEmptyRespHeader(w, http.StatusNotFound)
|
||||||
|
|
||||||
default:
|
default:
|
||||||
status_code = WriteEmptyRespHeader(w, http.StatusNotFound)
|
if strings.HasPrefix(pts.file, "_redir:") {
|
||||||
|
status_code = http.StatusMovedPermanently
|
||||||
|
w.Header().Set("Location", pts.file[7:])
|
||||||
|
w.WriteHeader(status_code)
|
||||||
|
} else {
|
||||||
|
status_code = WriteEmptyRespHeader(w, http.StatusNotFound)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//done:
|
//done:
|
||||||
|
@ -525,7 +525,6 @@ func (pxy *server_pxy_xterm_file) ServeHTTP(w http.ResponseWriter, req *http.Req
|
|||||||
w.Header().Set("Location", req.URL.Path + "_/")
|
w.Header().Set("Location", req.URL.Path + "_/")
|
||||||
w.WriteHeader(status_code)
|
w.WriteHeader(status_code)
|
||||||
|
|
||||||
|
|
||||||
case "_forbidden":
|
case "_forbidden":
|
||||||
status_code = WriteEmptyRespHeader(w, http.StatusForbidden)
|
status_code = WriteEmptyRespHeader(w, http.StatusForbidden)
|
||||||
|
|
||||||
@ -533,7 +532,13 @@ func (pxy *server_pxy_xterm_file) ServeHTTP(w http.ResponseWriter, req *http.Req
|
|||||||
status_code = WriteEmptyRespHeader(w, http.StatusNotFound)
|
status_code = WriteEmptyRespHeader(w, http.StatusNotFound)
|
||||||
|
|
||||||
default:
|
default:
|
||||||
status_code = WriteEmptyRespHeader(w, http.StatusNotFound)
|
if strings.HasPrefix(pxy.file, "_redir:") {
|
||||||
|
status_code = http.StatusMovedPermanently
|
||||||
|
w.Header().Set("Location", pxy.file[7:])
|
||||||
|
w.WriteHeader(status_code)
|
||||||
|
} else {
|
||||||
|
status_code = WriteEmptyRespHeader(w, http.StatusNotFound)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//done:
|
//done:
|
||||||
|
23
server.go
23
server.go
@ -1382,7 +1382,6 @@ func NewServer(ctx context.Context, name string, logger Logger, cfg *ServerConfi
|
|||||||
|
|
||||||
s.ctl_mux.Handle("/_pts/ws",
|
s.ctl_mux.Handle("/_pts/ws",
|
||||||
s.SafeWrapWebsocketHandler(s.WrapWebsocketHandler(&server_pts_ws{S: &s, Id: HS_ID_CTL})))
|
s.SafeWrapWebsocketHandler(s.WrapWebsocketHandler(&server_pts_ws{S: &s, Id: HS_ID_CTL})))
|
||||||
|
|
||||||
s.ctl_mux.Handle("/_pts/xterm.js",
|
s.ctl_mux.Handle("/_pts/xterm.js",
|
||||||
s.WrapHttpHandler(&server_pts_xterm_file{ServerCtl: ServerCtl{S: &s, Id: HS_ID_CTL}, file: "xterm.js"}))
|
s.WrapHttpHandler(&server_pts_xterm_file{ServerCtl: ServerCtl{S: &s, Id: HS_ID_CTL}, file: "xterm.js"}))
|
||||||
s.ctl_mux.Handle("/_pts/xterm-addon-fit.js",
|
s.ctl_mux.Handle("/_pts/xterm-addon-fit.js",
|
||||||
@ -1392,7 +1391,7 @@ func NewServer(ctx context.Context, name string, logger Logger, cfg *ServerConfi
|
|||||||
s.ctl_mux.Handle("/_pts/xterm.html",
|
s.ctl_mux.Handle("/_pts/xterm.html",
|
||||||
s.WrapHttpHandler(&server_pts_xterm_file{ServerCtl: ServerCtl{S: &s, Id: HS_ID_CTL}, file: "xterm.html"}))
|
s.WrapHttpHandler(&server_pts_xterm_file{ServerCtl: ServerCtl{S: &s, Id: HS_ID_CTL}, file: "xterm.html"}))
|
||||||
s.ctl_mux.Handle("/_pts/",
|
s.ctl_mux.Handle("/_pts/",
|
||||||
s.WrapHttpHandler(&server_pts_xterm_file{ServerCtl: ServerCtl{S: &s, Id: HS_ID_CTL}, file: "xterm.html"}))
|
s.WrapHttpHandler(&server_pts_xterm_file{ServerCtl: ServerCtl{S: &s, Id: HS_ID_CTL}, file: "_redir:xterm.html"}))
|
||||||
|
|
||||||
s.ctl = make([]*http.Server, len(cfg.CtlAddrs))
|
s.ctl = make([]*http.Server, len(cfg.CtlAddrs))
|
||||||
for i = 0; i < len(cfg.CtlAddrs); i++ {
|
for i = 0; i < len(cfg.CtlAddrs); i++ {
|
||||||
@ -1413,15 +1412,23 @@ func NewServer(ctx context.Context, name string, logger Logger, cfg *ServerConfi
|
|||||||
s.WrapHttpHandler(&server_pxy_xterm_file{server_pxy: server_pxy{S: &s, Id: HS_ID_PXY}, file: "_redirect"}))
|
s.WrapHttpHandler(&server_pxy_xterm_file{server_pxy: server_pxy{S: &s, Id: HS_ID_PXY}, file: "_redirect"}))
|
||||||
|
|
||||||
s.pxy_mux.Handle("/_ssh/{conn_id}/{route_id}/",
|
s.pxy_mux.Handle("/_ssh/{conn_id}/{route_id}/",
|
||||||
s.WrapHttpHandler(&server_pxy_xterm_file{server_pxy: server_pxy{S: &s, Id: HS_ID_PXY}, file: "xterm.html"}))
|
s.WrapHttpHandler(&server_pxy_xterm_file{server_pxy: server_pxy{S: &s, Id: HS_ID_PXY}, file: "_redir:xterm.html"}))
|
||||||
s.pxy_mux.Handle("/_ssh/{conn_id}/{route_id}/xterm.html",
|
s.pxy_mux.Handle("/_ssh/{conn_id}/{route_id}/xterm.html",
|
||||||
s.WrapHttpHandler(&server_pxy_xterm_file{server_pxy: server_pxy{S: &s, Id: HS_ID_PXY}, file: "xterm.html"}))
|
s.WrapHttpHandler(&server_pxy_xterm_file{server_pxy: server_pxy{S: &s, Id: HS_ID_PXY}, file: "xterm.html"}))
|
||||||
|
s.pxy_mux.Handle("/_ssh/{conn_id}/{route_id}/xterm.html/",
|
||||||
|
s.WrapHttpHandler(&server_pxy_xterm_file{server_pxy: server_pxy{S: &s, Id: HS_ID_PXY}, file: "_forbidden"}))
|
||||||
s.pxy_mux.Handle("/_ssh/{conn_id}/{route_id}/xterm.css",
|
s.pxy_mux.Handle("/_ssh/{conn_id}/{route_id}/xterm.css",
|
||||||
s.WrapHttpHandler(&server_pxy_xterm_file{server_pxy: server_pxy{S: &s, Id: HS_ID_PXY}, file: "xterm.css"}))
|
s.WrapHttpHandler(&server_pxy_xterm_file{server_pxy: server_pxy{S: &s, Id: HS_ID_PXY}, file: "xterm.css"}))
|
||||||
|
s.pxy_mux.Handle("/_ssh/{conn_id}/{route_id}/xterm.css/",
|
||||||
|
s.WrapHttpHandler(&server_pxy_xterm_file{server_pxy: server_pxy{S: &s, Id: HS_ID_PXY}, file: "_forbidden"}))
|
||||||
s.pxy_mux.Handle("/_ssh/{conn_id}/{route_id}/xterm.js",
|
s.pxy_mux.Handle("/_ssh/{conn_id}/{route_id}/xterm.js",
|
||||||
s.WrapHttpHandler(&server_pxy_xterm_file{server_pxy: server_pxy{S: &s, Id: HS_ID_PXY}, file: "xterm.js"}))
|
s.WrapHttpHandler(&server_pxy_xterm_file{server_pxy: server_pxy{S: &s, Id: HS_ID_PXY}, file: "xterm.js"}))
|
||||||
|
s.pxy_mux.Handle("/_ssh/{conn_id}/{route_id}/xterm.js/",
|
||||||
|
s.WrapHttpHandler(&server_pxy_xterm_file{server_pxy: server_pxy{S: &s, Id: HS_ID_PXY}, file: "_forbidden"}))
|
||||||
s.pxy_mux.Handle("/_ssh/{conn_id}/{route_id}/xterm-addon-fit.js",
|
s.pxy_mux.Handle("/_ssh/{conn_id}/{route_id}/xterm-addon-fit.js",
|
||||||
s.WrapHttpHandler(&server_pxy_xterm_file{server_pxy: server_pxy{S: &s, Id: HS_ID_PXY}, file: "xterm-addon-fit.js"}))
|
s.WrapHttpHandler(&server_pxy_xterm_file{server_pxy: server_pxy{S: &s, Id: HS_ID_PXY}, file: "xterm-addon-fit.js"}))
|
||||||
|
s.pxy_mux.Handle("/_ssh/{conn_id}/{route_id}/xterm-addon-fit.js/",
|
||||||
|
s.WrapHttpHandler(&server_pxy_xterm_file{server_pxy: server_pxy{S: &s, Id: HS_ID_PXY}, file: "_forbidden"}))
|
||||||
|
|
||||||
s.pxy_mux.Handle("/_ssh/{conn_id}/{route_id}/ws",
|
s.pxy_mux.Handle("/_ssh/{conn_id}/{route_id}/ws",
|
||||||
s.SafeWrapWebsocketHandler(s.WrapWebsocketHandler(&server_pxy_ssh_ws{S: &s, Id: HS_ID_PXY})))
|
s.SafeWrapWebsocketHandler(s.WrapWebsocketHandler(&server_pxy_ssh_ws{S: &s, Id: HS_ID_PXY})))
|
||||||
@ -1455,15 +1462,23 @@ func NewServer(ctx context.Context, name string, logger Logger, cfg *ServerConfi
|
|||||||
s.wpx_mux = http.NewServeMux() // TODO: make /_init,_ssh,_ssh/ws,_http configurable...
|
s.wpx_mux = http.NewServeMux() // TODO: make /_init,_ssh,_ssh/ws,_http configurable...
|
||||||
|
|
||||||
s.wpx_mux.Handle("/_ssh/{port_id}/",
|
s.wpx_mux.Handle("/_ssh/{port_id}/",
|
||||||
s.WrapHttpHandler(&server_pxy_xterm_file{server_pxy: server_pxy{S: &s, Id: HS_ID_WPX}, file: "xterm.html"}))
|
s.WrapHttpHandler(&server_pxy_xterm_file{server_pxy: server_pxy{S: &s, Id: HS_ID_WPX}, file: "_redir:xterm.html"}))
|
||||||
s.wpx_mux.Handle("/_ssh/{port_id}/xterm.html",
|
s.wpx_mux.Handle("/_ssh/{port_id}/xterm.html",
|
||||||
s.WrapHttpHandler(&server_pxy_xterm_file{server_pxy: server_pxy{S: &s, Id: HS_ID_WPX}, file: "xterm.html"}))
|
s.WrapHttpHandler(&server_pxy_xterm_file{server_pxy: server_pxy{S: &s, Id: HS_ID_WPX}, file: "xterm.html"}))
|
||||||
|
s.wpx_mux.Handle("/_ssh/{port_id}/xterm.html/",
|
||||||
|
s.WrapHttpHandler(&server_pxy_xterm_file{server_pxy: server_pxy{S: &s, Id: HS_ID_WPX}, file: "_forbidden"}))
|
||||||
s.wpx_mux.Handle("/_ssh/{port_id}/xterm.css",
|
s.wpx_mux.Handle("/_ssh/{port_id}/xterm.css",
|
||||||
s.WrapHttpHandler(&server_pxy_xterm_file{server_pxy: server_pxy{S: &s, Id: HS_ID_WPX}, file: "xterm.css"}))
|
s.WrapHttpHandler(&server_pxy_xterm_file{server_pxy: server_pxy{S: &s, Id: HS_ID_WPX}, file: "xterm.css"}))
|
||||||
|
s.wpx_mux.Handle("/_ssh/{port_id}/xterm.css/",
|
||||||
|
s.WrapHttpHandler(&server_pxy_xterm_file{server_pxy: server_pxy{S: &s, Id: HS_ID_WPX}, file: "_forbidden"}))
|
||||||
s.wpx_mux.Handle("/_ssh/{port_id}/xterm.js",
|
s.wpx_mux.Handle("/_ssh/{port_id}/xterm.js",
|
||||||
s.WrapHttpHandler(&server_pxy_xterm_file{server_pxy: server_pxy{S: &s, Id: HS_ID_WPX}, file: "xterm.js"}))
|
s.WrapHttpHandler(&server_pxy_xterm_file{server_pxy: server_pxy{S: &s, Id: HS_ID_WPX}, file: "xterm.js"}))
|
||||||
|
s.wpx_mux.Handle("/_ssh/{port_id}/xterm.js/",
|
||||||
|
s.WrapHttpHandler(&server_pxy_xterm_file{server_pxy: server_pxy{S: &s, Id: HS_ID_WPX}, file: "_forbidden"}))
|
||||||
s.wpx_mux.Handle("/_ssh/{port_id}/xterm-addon-fit.js",
|
s.wpx_mux.Handle("/_ssh/{port_id}/xterm-addon-fit.js",
|
||||||
s.WrapHttpHandler(&server_pxy_xterm_file{server_pxy: server_pxy{S: &s, Id: HS_ID_WPX}, file: "xterm-addon-fit.js"}))
|
s.WrapHttpHandler(&server_pxy_xterm_file{server_pxy: server_pxy{S: &s, Id: HS_ID_WPX}, file: "xterm-addon-fit.js"}))
|
||||||
|
s.wpx_mux.Handle("/_ssh/{port_id}/xterm-addon-fit.js/",
|
||||||
|
s.WrapHttpHandler(&server_pxy_xterm_file{server_pxy: server_pxy{S: &s, Id: HS_ID_WPX}, file: "_forbidden"}))
|
||||||
|
|
||||||
s.wpx_mux.Handle("/_ssh/{port_id}/ws",
|
s.wpx_mux.Handle("/_ssh/{port_id}/ws",
|
||||||
s.SafeWrapWebsocketHandler(s.WrapWebsocketHandler(&server_pxy_ssh_ws{S: &s, Id: HS_ID_WPX})))
|
s.SafeWrapWebsocketHandler(s.WrapWebsocketHandler(&server_pxy_ssh_ws{S: &s, Id: HS_ID_WPX})))
|
||||||
|
Reference in New Issue
Block a user