diff options
Diffstat (limited to 'deprecated-webircgateway/pkg/webircgateway/transport_sockjs.go')
| -rw-r--r-- | deprecated-webircgateway/pkg/webircgateway/transport_sockjs.go | 107 |
1 files changed, 0 insertions, 107 deletions
diff --git a/deprecated-webircgateway/pkg/webircgateway/transport_sockjs.go b/deprecated-webircgateway/pkg/webircgateway/transport_sockjs.go deleted file mode 100644 index da4891f..0000000 --- a/deprecated-webircgateway/pkg/webircgateway/transport_sockjs.go +++ /dev/null @@ -1,107 +0,0 @@ -package webircgateway - -import ( - "net" - "net/http" - "strings" - - "github.com/gorilla/websocket" - "github.com/igm/sockjs-go/v3/sockjs" -) - -type TransportSockjs struct { - gateway *Gateway -} - -func (t *TransportSockjs) Init(g *Gateway) { - t.gateway = g - sockjsOptions := sockjs.DefaultOptions - sockjsOptions.WebsocketUpgrader = &websocket.Upgrader{ - // Origin is checked within the session handler - CheckOrigin: func(_ *http.Request) bool { return true }, - } - sockjsHandler := sockjs.NewHandler("/webirc/sockjs", sockjsOptions, t.sessionHandler) - t.gateway.HttpRouter.Handle("/webirc/sockjs/", sockjsHandler) -} - -func (t *TransportSockjs) sessionHandler(session sockjs.Session) { - client := t.gateway.NewClient() - - originHeader := strings.ToLower(session.Request().Header.Get("Origin")) - if !t.gateway.IsClientOriginAllowed(originHeader) { - client.Log(2, "Origin %s not allowed. Closing connection", originHeader) - session.Close(0, "Origin not allowed") - return - } - - client.RemoteAddr = t.gateway.GetRemoteAddressFromRequest(session.Request()).String() - - clientHostnames, err := net.LookupAddr(client.RemoteAddr) - if err != nil { - client.RemoteHostname = client.RemoteAddr - } else { - // FQDNs include a . at the end. Strip it out - potentialHostname := strings.Trim(clientHostnames[0], ".") - - // Must check that the resolved hostname also resolves back to the users IP - addr, err := net.LookupIP(potentialHostname) - if err == nil && len(addr) == 1 && addr[0].String() == client.RemoteAddr { - client.RemoteHostname = potentialHostname - } else { - client.RemoteHostname = client.RemoteAddr - } - } - - if t.gateway.isRequestSecure(session.Request()) { - client.Tags["secure"] = "" - } - - // This doesn't make sense to have since the remote port may change between requests. Only - // here for testing purposes for now. - _, remoteAddrPort, _ := net.SplitHostPort(session.Request().RemoteAddr) - client.Tags["remote-port"] = remoteAddrPort - - client.Log(2, "New sockjs client on %s from %s %s", session.Request().Host, client.RemoteAddr, client.RemoteHostname) - client.Ready() - - // Read from sockjs - go func() { - for { - msg, err := session.Recv() - if err == nil && len(msg) > 0 { - client.Log(1, "client->: %s", msg) - select { - case client.Recv <- msg: - default: - client.Log(3, "Recv queue full. Dropping data") - // TODO: Should this really just drop the data or close the connection? - } - } else if err != nil { - client.Log(1, "sockjs connection closed (%s)", err.Error()) - break - } else if len(msg) == 0 { - client.Log(1, "Got 0 bytes from websocket") - } - } - - close(client.Recv) - }() - - // Process signals for the client - for { - signal, ok := <-client.Signals - if !ok { - break - } - - if signal[0] == "data" { - line := strings.Trim(signal[1], "\r\n") - client.Log(1, "->ws: %s", line) - session.Send(line) - } - - if signal[0] == "state" && signal[1] == "closed" { - session.Close(0, "Closed") - } - } -} |
