ソースを参照

fix #1647

Send a full NUH with RELAYMSG.

Also fix client-only tags with RELAYMSG.
tags/v2.7.0-rc1
Shivaram Lingamneni 3年前
コミット
77313e20ad
2個のファイルの変更42行の追加11行の削除
  1. 8
    0
      irc/cloaks/cloak_test.go
  2. 34
    11
      irc/handlers.go

+ 8
- 0
irc/cloaks/cloak_test.go ファイルの表示

126
 		t.Errorf("cloak collision between 97.97.97.97 and aaaa: %s", v4cloak)
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 ファイルの表示

2658
 		return false
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
 	channel.AddHistoryItem(history.Item{
2670
 	channel.AddHistoryItem(history.Item{
2662
 		Type:    history.Privmsg,
2671
 		Type:    history.Privmsg,
2663
 		Message: message,
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
 	for _, member := range channel.Members() {
2696
 	for _, member := range channel.Members() {
2676
 		for _, session := range member.Sessions() {
2697
 		for _, session := range member.Sessions() {
2677
 			var tagsToUse map[string]string
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
 			if session == rb.session {
2705
 			if session == rb.session {
2683
-				rb.AddSplitMessageFromClient(nick, "*", false, tagsToUse, "PRIVMSG", channelName, message)
2706
+				rb.AddSplitMessageFromClient(nuh, "*", false, tagsToUse, "PRIVMSG", channelName, message)
2684
 			} else {
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
 	}

読み込み中…
キャンセル
保存