-
Notifications
You must be signed in to change notification settings - Fork 3
/
names.go
78 lines (65 loc) · 1.9 KB
/
names.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
// Copyright (c) 2016-2017 Daniel Oaks <daniel@danieloaks.net>
// released under the MIT license
package ircbnc
import (
"errors"
"fmt"
"strings"
"unicode"
"golang.org/x/text/secure/precis"
)
var (
errNameBadChar = errors.New("Name contained a disallowed character")
errNameDigit = errors.New("The first character of a name cannot be a digit")
errNameSpace = errors.New("Names cannot contain whitespace")
errNameNil = errors.New("Names need to be at least one character long")
)
// IrcName returns a name appropriate for IRC use (nick/user/channel), or an error if the name is bad.
func IrcName(name string, isChannel bool) (string, error) {
name = strings.TrimSpace(name)
if len(name) < 1 {
return "", errNameNil
}
for _, char := range name {
// exclude space characters
if unicode.IsSpace(char) {
return "", errNameSpace
}
// exclude other characters that mess with the protocol
if isChannel {
if strings.Contains(",?*", string(char)) {
return "", errNameBadChar
}
} else {
if strings.Contains(",.!@#?*", string(char)) {
return "", errNameBadChar
}
}
}
return name, nil
}
// BncName takes the given name and returns a casefolded name appropriate for use with ircbnc.
// This includes usernames, network names, etc.
func BncName(name string) (string, error) {
foldedName, err := precis.UsernameCaseMapped.CompareKey(name)
if err != nil {
return "", fmt.Errorf("Could not casefold bncname [%s]: %s", name, err.Error())
}
if len(foldedName) < 1 {
return "", errNameNil
}
for _, char := range foldedName {
// exclude space characters
if unicode.IsSpace(char) {
return "", errNameSpace
}
// exclude other characters that seem like they could be bad
if strings.Contains(",.=!@#*%&$/\\", string(char)) {
return "", errNameBadChar
}
}
if strings.Contains("0123456789", string(foldedName[0])) {
return "", errNameDigit
}
return foldedName, err
}