Browse Source

fix #1240

tags/v2.4.0-rc1
Shivaram Lingamneni 3 years ago
parent
commit
498d76b131
2 changed files with 25 additions and 26 deletions
  1. 3
    19
      irc/handlers.go
  2. 22
    7
      irc/roleplay.go

+ 3
- 19
irc/handlers.go View File

@@ -2194,15 +2194,7 @@ func npcHandler(server *Server, client *Client, msg ircmsg.IrcMessage, rb *Respo
2194 2194
 	fakeSource := msg.Params[1]
2195 2195
 	message := msg.Params[2:]
2196 2196
 
2197
-	_, err := CasefoldName(fakeSource)
2198
-	if err != nil {
2199
-		client.Send(nil, client.server.name, ERR_CANNOTSENDRP, target, client.t("Fake source must be a valid nickname"))
2200
-		return false
2201
-	}
2202
-
2203
-	sourceString := fmt.Sprintf(npcNickMask, fakeSource, client.nick)
2204
-
2205
-	sendRoleplayMessage(server, client, sourceString, target, false, message, rb)
2197
+	sendRoleplayMessage(server, client, fakeSource, target, false, false, message, rb)
2206 2198
 
2207 2199
 	return false
2208 2200
 }
@@ -2212,15 +2204,8 @@ func npcaHandler(server *Server, client *Client, msg ircmsg.IrcMessage, rb *Resp
2212 2204
 	target := msg.Params[0]
2213 2205
 	fakeSource := msg.Params[1]
2214 2206
 	message := msg.Params[2:]
2215
-	sourceString := fmt.Sprintf(npcNickMask, fakeSource, client.nick)
2216
-
2217
-	_, err := CasefoldName(fakeSource)
2218
-	if err != nil {
2219
-		client.Send(nil, client.server.name, ERR_CANNOTSENDRP, target, client.t("Fake source must be a valid nickname"))
2220
-		return false
2221
-	}
2222 2207
 
2223
-	sendRoleplayMessage(server, client, sourceString, target, true, message, rb)
2208
+	sendRoleplayMessage(server, client, fakeSource, target, false, true, message, rb)
2224 2209
 
2225 2210
 	return false
2226 2211
 }
@@ -2623,9 +2608,8 @@ func sanickHandler(server *Server, client *Client, msg ircmsg.IrcMessage, rb *Re
2623 2608
 func sceneHandler(server *Server, client *Client, msg ircmsg.IrcMessage, rb *ResponseBuffer) bool {
2624 2609
 	target := msg.Params[0]
2625 2610
 	message := msg.Params[1:]
2626
-	sourceString := fmt.Sprintf(sceneNickMask, client.nick)
2627 2611
 
2628
-	sendRoleplayMessage(server, client, sourceString, target, false, message, rb)
2612
+	sendRoleplayMessage(server, client, "", target, true, false, message, rb)
2629 2613
 
2630 2614
 	return false
2631 2615
 }

+ 22
- 7
irc/roleplay.go View File

@@ -4,7 +4,8 @@
4 4
 package irc
5 5
 
6 6
 import (
7
-	"bytes"
7
+	"fmt"
8
+	"strings"
8 9
 
9 10
 	"github.com/oragono/oragono/irc/history"
10 11
 	"github.com/oragono/oragono/irc/modes"
@@ -16,7 +17,7 @@ const (
16 17
 	sceneNickMask = "=Scene=!%s@npc.fakeuser.invalid"
17 18
 )
18 19
 
19
-func sendRoleplayMessage(server *Server, client *Client, source string, targetString string, isAction bool, messageParts []string, rb *ResponseBuffer) {
20
+func sendRoleplayMessage(server *Server, client *Client, source string, targetString string, isScene, isAction bool, messageParts []string, rb *ResponseBuffer) {
20 21
 	config := server.Config()
21 22
 	if !config.Roleplay.Enabled {
22 23
 		rb.Add(nil, client.server.name, ERR_CANNOTSENDRP, targetString, client.t("Roleplaying has been disabled by the server administrators"))
@@ -27,12 +28,26 @@ func sendRoleplayMessage(server *Server, client *Client, source string, targetSt
27 28
 		return
28 29
 	}
29 30
 
31
+	var sourceMask string
32
+	if isScene {
33
+		sourceMask = fmt.Sprintf(sceneNickMask, client.Nick())
34
+	} else {
35
+		cfSource, cfSourceErr := CasefoldName(source)
36
+		skelSource, skelErr := Skeleton(source)
37
+		if cfSourceErr != nil || skelErr != nil ||
38
+			restrictedCasefoldedNicks.Has(cfSource) || restrictedSkeletons.Has(skelSource) {
39
+			rb.Add(nil, client.server.name, ERR_CANNOTSENDRP, targetString, client.t("Invalid roleplay name"))
40
+			return
41
+		}
42
+		sourceMask = fmt.Sprintf(npcNickMask, source, client.Nick())
43
+	}
44
+
30 45
 	// block attempts to send CTCP messages to Tor clients
31 46
 	if len(messageParts) > 0 && len(messageParts[0]) > 0 && messageParts[0][0] == '\x01' {
32 47
 		return
33 48
 	}
34 49
 
35
-	var buf bytes.Buffer
50
+	var buf strings.Builder
36 51
 	if isAction {
37 52
 		buf.WriteString("\x01ACTION ")
38 53
 	}
@@ -80,9 +95,9 @@ func sendRoleplayMessage(server *Server, client *Client, source string, targetSt
80 95
 				// of roleplay commands, so send them a copy whether they have echo-message
81 96
 				// or not
82 97
 				if rb.session == session {
83
-					rb.AddSplitMessageFromClient(source, "", nil, "PRIVMSG", targetString, splitMessage)
98
+					rb.AddSplitMessageFromClient(sourceMask, "", nil, "PRIVMSG", targetString, splitMessage)
84 99
 				} else {
85
-					session.sendSplitMsgFromClientInternal(false, source, "*", nil, "PRIVMSG", targetString, splitMessage)
100
+					session.sendSplitMsgFromClientInternal(false, sourceMask, "*", nil, "PRIVMSG", targetString, splitMessage)
86 101
 				}
87 102
 			}
88 103
 		}
@@ -90,7 +105,7 @@ func sendRoleplayMessage(server *Server, client *Client, source string, targetSt
90 105
 		channel.AddHistoryItem(history.Item{
91 106
 			Type:    history.Privmsg,
92 107
 			Message: splitMessage,
93
-			Nick:    source,
108
+			Nick:    sourceMask,
94 109
 		}, client.Account())
95 110
 	} else {
96 111
 		target, err := CasefoldName(targetString)
@@ -108,7 +123,7 @@ func sendRoleplayMessage(server *Server, client *Client, source string, targetSt
108 123
 		cnick := client.Nick()
109 124
 		tnick := user.Nick()
110 125
 		for _, session := range user.Sessions() {
111
-			session.sendSplitMsgFromClientInternal(false, source, "*", nil, "PRIVMSG", tnick, splitMessage)
126
+			session.sendSplitMsgFromClientInternal(false, sourceMask, "*", nil, "PRIVMSG", tnick, splitMessage)
112 127
 		}
113 128
 		if away, awayMessage := user.Away(); away {
114 129
 			//TODO(dan): possibly implement cooldown of away notifications to users

Loading…
Cancel
Save