|
@@ -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.
|