From 3b0f1ff1cc4599f2c450982daef63872508a5295 Mon Sep 17 00:00:00 2001 From: Shivaram Lingamneni Date: Thu, 28 Sep 2017 02:53:08 -0400 Subject: [PATCH] delete websocket support as per discussion on #139 --- irc/config.go | 1 - irc/server.go | 75 ++---------------------------------------------- irc/websocket.go | 56 ------------------------------------ oragono.yaml | 3 -- 4 files changed, 2 insertions(+), 133 deletions(-) delete mode 100644 irc/websocket.go diff --git a/irc/config.go b/irc/config.go index 906df406..24f2d324 100644 --- a/irc/config.go +++ b/irc/config.go @@ -196,7 +196,6 @@ type Config struct { Password string Name string Listen []string - Wslisten string `yaml:"ws-listen"` TLSListeners map[string]*TLSListenConfig `yaml:"tls-listeners"` STS STSConfig RestAPI RestAPIConfig `yaml:"rest-api"` diff --git a/irc/server.go b/irc/server.go index 7294a3df..adb4e02d 100644 --- a/irc/server.go +++ b/irc/server.go @@ -38,8 +38,8 @@ var ( ) const ( - // when shutting down the REST and websocket servers, wait this long - // before killing active non-WS connections. TODO: this might not be + // when shutting down the REST server, wait this long + // before killing active connections. TODO: this might not be // necessary at all? but it seems prudent to avoid potential resource // leaks httpShutdownTimeout = time.Second @@ -124,7 +124,6 @@ type Server struct { store *buntdb.DB stsEnabled bool whoWas *WhoWasList - wsServer *http.Server } var ( @@ -382,75 +381,6 @@ func (server *Server) createListener(addr string, tlsConfig *tls.Config) *Listen return &wrapper } -// -// websocket listen goroutine -// - -func (server *Server) setupWSListener(config *Config) { - // unconditionally shut down the old listener because we can't tell - // whether we need to reload the TLS certificate - if server.wsServer != nil { - ctx, _ := context.WithTimeout(context.Background(), httpShutdownTimeout) - server.wsServer.Shutdown(ctx) - server.wsServer.Close() - } - - if config.Server.Wslisten == "" { - server.wsServer = nil - return - } - - addr := config.Server.Wslisten - tlsConfig := config.Server.TLSListeners[addr] - handler := http.NewServeMux() - wsServer := http.Server{ - Addr: addr, - Handler: handler, - } - - handler.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { - if r.Method != "GET" { - server.logger.Error("ws", addr, fmt.Sprintf("%s method not allowed", r.Method)) - return - } - - // We don't have any subprotocols, so if someone attempts to `new - // WebSocket(server, "subprotocol")` they'll break here, instead of - // getting the default, ambiguous, response from gorilla. - if v, ok := r.Header["Sec-Websocket-Protocol"]; ok { - http.Error(w, fmt.Sprintf("WebSocket subprocotols (e.g. %s) not supported", v), 400) - } - - ws, err := upgrader.Upgrade(w, r, nil) - if err != nil { - server.logger.Error("ws", addr, fmt.Sprintf("%s websocket upgrade error: %s", server.name, err)) - return - } - - newConn := clientConn{ - Conn: WSContainer{ws}, - IsTLS: tlsConfig != nil, - } - server.newConns <- newConn - }) - - go func() { - var err error - server.logger.Info("listeners", fmt.Sprintf("websocket listening on %s, tls=%t.", addr, tlsConfig != nil)) - - if tlsConfig != nil { - err = wsServer.ListenAndServeTLS(tlsConfig.Cert, tlsConfig.Key) - } else { - err = wsServer.ListenAndServe() - } - if err != nil { - server.logger.Error("listeners", fmt.Sprintf("websocket ListenAndServe error: %s", err)) - } - }() - - server.wsServer = &wsServer -} - // generateMessageID returns a network-unique message ID. func (server *Server) generateMessageID() string { return fmt.Sprintf("%s-%s", strconv.FormatInt(time.Now().UTC().UnixNano(), 10), strconv.FormatInt(rand.Int63(), 10)) @@ -1497,7 +1427,6 @@ func (server *Server) applyConfig(config *Config, initial bool) error { // we are now open for business server.setupListeners(config) - server.setupWSListener(config) server.setupRestAPI(config) return nil diff --git a/irc/websocket.go b/irc/websocket.go deleted file mode 100644 index fad90cc3..00000000 --- a/irc/websocket.go +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright (c) 2015 Niels Freier -// Copyright (c) 2015 Edmund Huber -// released under the MIT license - -package irc - -import ( - "net/http" - "time" - - "github.com/gorilla/websocket" -) - -var upgrader = websocket.Upgrader{ - ReadBufferSize: 2048, - WriteBufferSize: 2048, - // If a WS session contains sensitive information, and you choose to use - // cookies for authentication (during the HTTP(S) upgrade request), then - // you should check that Origin is a domain under your control. If it - // isn't, then it is possible for users of your site, visiting a naughty - // Origin, to have a WS opened using their credentials. See - // http://www.christian-schneider.net/CrossSiteWebSocketHijacking.html#main. - // We don't care about Origin because the (IRC) authentication is contained - // in the WS stream -- the WS session is not privileged when it is opened. - CheckOrigin: func(r *http.Request) bool { return true }, -} - -// WSContainer holds the websocket. -type WSContainer struct { - *websocket.Conn -} - -// Read reads new incoming messages. -func (ws WSContainer) Read(msg []byte) (int, error) { - ty, bytes, err := ws.ReadMessage() - if ty == websocket.TextMessage { - n := copy(msg, []byte(string(bytes)+"\r\n\r\n")) - return n, err - } - // Binary, and other kinds of messages, are thrown away. - return 0, nil -} - -// Write writes lines out to the websocket. -func (ws WSContainer) Write(msg []byte) (int, error) { - err := ws.WriteMessage(websocket.TextMessage, msg) - return len(msg), err -} - -// SetDeadline sets the read and write deadline on this websocket. -func (ws WSContainer) SetDeadline(t time.Time) error { - if err := ws.SetWriteDeadline(t); err != nil { - return err - } - return ws.SetReadDeadline(t) -} diff --git a/oragono.yaml b/oragono.yaml index edd1af7a..e601954c 100644 --- a/oragono.yaml +++ b/oragono.yaml @@ -17,9 +17,6 @@ server: - "[::1]:6668" - ":6697" # ssl port - # websocket listening port - ws-listen: ":8080" - # tls listeners tls-listeners: # listener on ":6697"