Browse Source

Merge pull request #332 from slingamn/rtlnickmasks

fix spurious bidi violations when casefolding the nickmask of an RTL nick
tags/v1.0.0-rc1
Shivaram Lingamneni 5 years ago
parent
commit
a11486d699
No account linked to committer's email address
1 changed files with 23 additions and 23 deletions
  1. 23
    23
      irc/client.go

+ 23
- 23
irc/client.go View File

@@ -98,6 +98,7 @@ type Client struct {
98 98
 	socket             *Socket
99 99
 	stateMutex         sync.RWMutex // tier 1
100 100
 	username           string
101
+	usernameCasefolded string
101 102
 	vhost              string
102 103
 	history            *history.Buffer
103 104
 }
@@ -175,10 +176,11 @@ func NewClient(server *Server, conn net.Conn, isTLS bool) {
175 176
 		resp, err := ident.Query(clientHost, serverPort, clientPort, IdentTimeoutSeconds)
176 177
 		if err == nil {
177 178
 			username := resp.Identifier
178
-			_, err := CasefoldName(username) // ensure it's a valid username
179
+			cfusername, err := CasefoldName(username)
179 180
 			if err == nil {
180 181
 				client.Notice(client.t("*** Found your username"))
181 182
 				client.username = username
183
+				client.usernameCasefolded = cfusername
182 184
 				// we don't need to updateNickMask here since nickMask is not used for anything yet
183 185
 			} else {
184 186
 				client.Notice(client.t("*** Got a malformed username, ignoring"))
@@ -619,7 +621,7 @@ func (client *Client) HasUsername() bool {
619 621
 }
620 622
 
621 623
 func (client *Client) SetNames(username, realname string) error {
622
-	_, err := CasefoldName(username)
624
+	usernameCasefolded, err := CasefoldName(username)
623 625
 	if err != nil {
624 626
 		return errInvalidUsername
625 627
 	}
@@ -629,6 +631,7 @@ func (client *Client) SetNames(username, realname string) error {
629 631
 
630 632
 	if client.username == "" {
631 633
 		client.username = "~" + username
634
+		client.usernameCasefolded = "~" + usernameCasefolded
632 635
 	}
633 636
 
634 637
 	if client.realname == "" {
@@ -759,48 +762,45 @@ func (client *Client) updateNickMaskNoMutex() {
759 762
 		client.hostname = client.rawHostname
760 763
 	}
761 764
 
762
-	nickMaskString := fmt.Sprintf("%s!%s@%s", client.nick, client.username, client.hostname)
763
-	nickMaskCasefolded, err := Casefold(nickMaskString)
765
+	cfhostname, err := Casefold(client.hostname)
764 766
 	if err != nil {
765
-		client.server.logger.Error("internal", "nickmask couldn't be casefolded", nickMaskString, err.Error())
766
-		return
767
+		client.server.logger.Error("internal", "hostname couldn't be casefolded", client.hostname, err.Error())
768
+		cfhostname = client.hostname // YOLO
767 769
 	}
768 770
 
769
-	client.nickMaskString = nickMaskString
770
-	client.nickMaskCasefolded = nickMaskCasefolded
771
+	client.nickMaskString = fmt.Sprintf("%s!%s@%s", client.nick, client.username, client.hostname)
772
+	client.nickMaskCasefolded = fmt.Sprintf("%s!%s@%s", client.nickCasefolded, client.usernameCasefolded, cfhostname)
771 773
 }
772 774
 
773 775
 // AllNickmasks returns all the possible nickmasks for the client.
774
-func (client *Client) AllNickmasks() []string {
775
-	var masks []string
776
-	var mask string
777
-	var err error
778
-
776
+func (client *Client) AllNickmasks() (masks []string) {
779 777
 	client.stateMutex.RLock()
780
-	nick := client.nick
781
-	username := client.username
778
+	nick := client.nickCasefolded
779
+	username := client.usernameCasefolded
782 780
 	rawHostname := client.rawHostname
783 781
 	vhost := client.getVHostNoMutex()
784 782
 	client.stateMutex.RUnlock()
785 783
 
786 784
 	if len(vhost) > 0 {
787
-		mask, err = Casefold(fmt.Sprintf("%s!%s@%s", nick, username, vhost))
785
+		cfvhost, err := Casefold(vhost)
788 786
 		if err == nil {
789
-			masks = append(masks, mask)
787
+			masks = append(masks, fmt.Sprintf("%s!%s@%s", nick, username, cfvhost))
790 788
 		}
791 789
 	}
792 790
 
793
-	mask, err = Casefold(fmt.Sprintf("%s!%s@%s", nick, username, rawHostname))
791
+	var rawhostmask string
792
+	cfrawhost, err := Casefold(rawHostname)
794 793
 	if err == nil {
795
-		masks = append(masks, mask)
794
+		rawhostmask = fmt.Sprintf("%s!%s@%s", nick, username, cfrawhost)
795
+		masks = append(masks, rawhostmask)
796 796
 	}
797 797
 
798
-	mask2, err := Casefold(fmt.Sprintf("%s!%s@%s", nick, username, client.IPString()))
799
-	if err == nil && mask2 != mask {
800
-		masks = append(masks, mask2)
798
+	ipmask := fmt.Sprintf("%s!%s@%s", nick, username, client.IPString())
799
+	if ipmask != rawhostmask {
800
+		masks = append(masks, ipmask)
801 801
 	}
802 802
 
803
-	return masks
803
+	return
804 804
 }
805 805
 
806 806
 // LoggedIntoAccount returns true if this client is logged into an account.

Loading…
Cancel
Save