瀏覽代碼

Merge pull request #1484 from slingamn/utf8only

initial work on #1483
tags/v2.5.0-rc1
Shivaram Lingamneni 3 年之前
父節點
當前提交
7b300a802f
No account linked to committer's email address
共有 4 個文件被更改,包括 18 次插入12 次删除
  1. 6
    3
      irc/client.go
  2. 6
    0
      irc/config.go
  3. 5
    9
      irc/ircconn.go
  4. 1
    0
      irc/listeners.go

+ 6
- 3
irc/client.go 查看文件

@@ -686,9 +686,12 @@ func (client *Client) run(session *Session) {
686 686
 		if err == errInvalidUtf8 {
687 687
 			invalidUtf8 = true // handle as normal, including labeling
688 688
 		} else if err != nil {
689
-			quitMessage := "connection closed"
690
-			if err == errReadQ {
691
-				quitMessage = "readQ exceeded"
689
+			var quitMessage string
690
+			switch err {
691
+			case errReadQ, errWSBinaryMessage:
692
+				quitMessage = err.Error()
693
+			default:
694
+				quitMessage = "connection closed"
692 695
 			}
693 696
 			client.Quit(quitMessage, session)
694 697
 			// since the client did not actually send us a QUIT,

+ 6
- 0
irc/config.go 查看文件

@@ -837,6 +837,9 @@ func (conf *Config) prepareListeners() (err error) {
837 837
 		}
838 838
 		lconf.RequireProxy = block.TLS.Proxy || block.Proxy
839 839
 		lconf.WebSocket = block.WebSocket
840
+		if lconf.WebSocket && !conf.Server.EnforceUtf8 {
841
+			return fmt.Errorf("enabling a websocket listener requires the use of server.enforce-utf8")
842
+		}
840 843
 		lconf.HideSTS = block.HideSTS
841 844
 		conf.Server.trueListeners[addr] = lconf
842 845
 	}
@@ -1446,6 +1449,9 @@ func (config *Config) generateISupport() (err error) {
1446 1449
 	if config.Server.Casemapping == CasemappingPRECIS {
1447 1450
 		isupport.Add("UTF8MAPPING", precisUTF8MappingToken)
1448 1451
 	}
1452
+	if config.Server.EnforceUtf8 {
1453
+		isupport.Add("UTF8ONLY", "")
1454
+	}
1449 1455
 	isupport.Add("WHOX", "")
1450 1456
 
1451 1457
 	err = isupport.RegenerateCachedReply()

+ 5
- 9
irc/ircconn.go 查看文件

@@ -19,8 +19,9 @@ const (
19 19
 )
20 20
 
21 21
 var (
22
-	crlf     = []byte{'\r', '\n'}
23
-	errReadQ = errors.New("ReadQ Exceeded")
22
+	crlf               = []byte{'\r', '\n'}
23
+	errReadQ           = errors.New("ReadQ Exceeded")
24
+	errWSBinaryMessage = errors.New("WebSocket binary messages are unsupported")
24 25
 )
25 26
 
26 27
 // IRCConn abstracts away the distinction between a regular
@@ -148,11 +149,7 @@ func (wc IRCWSConn) UnderlyingConn() *utils.WrappedConn {
148 149
 
149 150
 func (wc IRCWSConn) WriteLine(buf []byte) (err error) {
150 151
 	buf = bytes.TrimSuffix(buf, crlf)
151
-	if !globalUtf8EnforcementSetting && !utf8.Valid(buf) {
152
-		// there's not much we can do about this;
153
-		// silently drop the message
154
-		return nil
155
-	}
152
+	// #1483: if we have websockets at all, then we're enforcing utf8
156 153
 	return wc.conn.WriteMessage(websocket.TextMessage, buf)
157 154
 }
158 155
 
@@ -172,8 +169,7 @@ func (wc IRCWSConn) ReadLine() (line []byte, err error) {
172 169
 		if messageType == websocket.TextMessage {
173 170
 			return line, nil
174 171
 		} else {
175
-			// for purposes of fakelag, treat non-text message as an empty line
176
-			return nil, nil
172
+			return nil, errWSBinaryMessage
177 173
 		}
178 174
 	} else if err == websocket.ErrReadLimit {
179 175
 		return line, errReadQ

+ 1
- 0
irc/listeners.go 查看文件

@@ -166,6 +166,7 @@ func (wl *WSListener) handle(w http.ResponseWriter, r *http.Request) {
166 166
 			}
167 167
 			return false
168 168
 		},
169
+		Subprotocols: []string{"text.ircv3.net"},
169 170
 	}
170 171
 
171 172
 	conn, err := wsUpgrader.Upgrade(w, r, nil)

Loading…
取消
儲存