Browse Source

fix #1647

Send a full NUH with RELAYMSG.

Also fix client-only tags with RELAYMSG.
tags/v2.7.0-rc1
Shivaram Lingamneni 2 years ago
parent
commit
77313e20ad
2 changed files with 42 additions and 11 deletions
  1. 8
    0
      irc/cloaks/cloak_test.go
  2. 34
    11
      irc/handlers.go

+ 8
- 0
irc/cloaks/cloak_test.go View File

@@ -126,3 +126,11 @@ func TestAccountCloakCollisions(t *testing.T) {
126 126
 		t.Errorf("cloak collision between 97.97.97.97 and aaaa: %s", v4cloak)
127 127
 	}
128 128
 }
129
+
130
+func BenchmarkAccountCloaks(b *testing.B) {
131
+	config := cloakConfForTesting()
132
+	b.ResetTimer()
133
+	for i := 0; i < b.N; i++ {
134
+		config.ComputeAccountCloak("shivaram")
135
+	}
136
+}

+ 34
- 11
irc/handlers.go View File

@@ -2658,31 +2658,54 @@ func relaymsgHandler(server *Server, client *Client, msg ircmsg.Message, rb *Res
2658 2658
 		return false
2659 2659
 	}
2660 2660
 
2661
+	// #1647: we need to publish a full NUH. send ~u (or the configured alternative)
2662
+	// as the user/ident, and send the relayer's hostname as the hostname:
2663
+	ident := config.Server.CoerceIdent
2664
+	if ident == "" {
2665
+		ident = "~u"
2666
+	}
2667
+	hostname := client.Hostname()
2668
+	nuh := fmt.Sprintf("%s!%s@%s", nick, ident, hostname)
2669
+
2661 2670
 	channel.AddHistoryItem(history.Item{
2662 2671
 		Type:    history.Privmsg,
2663 2672
 		Message: message,
2664
-		Nick:    nick,
2673
+		Nick:    nuh,
2665 2674
 	}, "")
2666 2675
 
2667
-	// send msg
2668
-	channelName := channel.Name()
2669
-	relayTags := map[string]string{
2670
-		caps.RelaymsgTagName: client.Nick(),
2676
+	// 3 possibilities for tags:
2677
+	// no tags, the relaymsg tag only, or the relaymsg tag together with all client-only tags
2678
+	cnick := client.Nick()
2679
+	relayTag := map[string]string{
2680
+		caps.RelaymsgTagName: cnick,
2671 2681
 	}
2672
-	for t, v := range msg.ClientOnlyTags() {
2673
-		relayTags[t] = v
2682
+	clientOnlyTags := msg.ClientOnlyTags()
2683
+	var fullTags map[string]string
2684
+	if len(clientOnlyTags) == 0 {
2685
+		fullTags = relayTag
2686
+	} else {
2687
+		fullTags = make(map[string]string, 1+len(clientOnlyTags))
2688
+		fullTags[caps.RelaymsgTagName] = cnick
2689
+		for t, v := range clientOnlyTags {
2690
+			fullTags[t] = v
2691
+		}
2674 2692
 	}
2693
+
2694
+	// actually send the message
2695
+	channelName := channel.Name()
2675 2696
 	for _, member := range channel.Members() {
2676 2697
 		for _, session := range member.Sessions() {
2677 2698
 			var tagsToUse map[string]string
2678
-			if session.capabilities.Has(caps.Relaymsg) {
2679
-				tagsToUse = relayTags
2699
+			if session.capabilities.Has(caps.MessageTags) {
2700
+				tagsToUse = fullTags
2701
+			} else if session.capabilities.Has(caps.Relaymsg) {
2702
+				tagsToUse = relayTag
2680 2703
 			}
2681 2704
 
2682 2705
 			if session == rb.session {
2683
-				rb.AddSplitMessageFromClient(nick, "*", false, tagsToUse, "PRIVMSG", channelName, message)
2706
+				rb.AddSplitMessageFromClient(nuh, "*", false, tagsToUse, "PRIVMSG", channelName, message)
2684 2707
 			} else {
2685
-				session.sendSplitMsgFromClientInternal(false, nick, "*", false, tagsToUse, "PRIVMSG", channelName, message)
2708
+				session.sendSplitMsgFromClientInternal(false, nuh, "*", false, tagsToUse, "PRIVMSG", channelName, message)
2686 2709
 			}
2687 2710
 		}
2688 2711
 	}

Loading…
Cancel
Save