|
@@ -7,6 +7,7 @@ import (
|
7
|
7
|
"bytes"
|
8
|
8
|
"encoding/json"
|
9
|
9
|
"fmt"
|
|
10
|
+ "sort"
|
10
|
11
|
"strconv"
|
11
|
12
|
"strings"
|
12
|
13
|
"sync"
|
|
@@ -1047,15 +1048,37 @@ func (am *AccountManager) AuthenticateByPassphrase(client *Client, accountName s
|
1047
|
1048
|
return err
|
1048
|
1049
|
}
|
1049
|
1050
|
|
1050
|
|
-func (am *AccountManager) AllNicks() []string {
|
1051
|
|
- am.RLock()
|
1052
|
|
- defer am.RUnlock()
|
|
1051
|
+// AllNicks returns the uncasefolded nicknames for all accounts, including additional (grouped) nicks.
|
|
1052
|
+func (am *AccountManager) AllNicks() (result []string) {
|
|
1053
|
+ // Account names
|
|
1054
|
+ accountNamePrefix := fmt.Sprintf(keyAccountName, "")
|
|
1055
|
+ am.server.store.View(func(tx *buntdb.Tx) error {
|
|
1056
|
+ return tx.AscendGreaterOrEqual("", accountNamePrefix, func(key, value string) bool {
|
|
1057
|
+ if !strings.HasPrefix(key, accountNamePrefix) {
|
|
1058
|
+ return false
|
|
1059
|
+ }
|
|
1060
|
+ result = append(result, value)
|
|
1061
|
+ return true
|
|
1062
|
+ })
|
|
1063
|
+ })
|
1053
|
1064
|
|
1054
|
|
- nicks := make([]string, 0, len(am.nickToAccount))
|
1055
|
|
- for nick := range am.nickToAccount {
|
1056
|
|
- nicks = append(nicks, nick)
|
1057
|
|
- }
|
1058
|
|
- return nicks
|
|
1065
|
+ // Additional nicknames
|
|
1066
|
+ accountAdditionalNicksPrefix := fmt.Sprintf(keyAccountAdditionalNicks, "")
|
|
1067
|
+ am.server.store.View(func(tx *buntdb.Tx) error {
|
|
1068
|
+ return tx.AscendGreaterOrEqual("", accountAdditionalNicksPrefix, func(key, value string) bool {
|
|
1069
|
+ if !strings.HasPrefix(key, accountAdditionalNicksPrefix) {
|
|
1070
|
+ return false
|
|
1071
|
+ }
|
|
1072
|
+ additionalNicks := unmarshalReservedNicks(value)
|
|
1073
|
+ for _, additionalNick := range additionalNicks {
|
|
1074
|
+ result = append(result, additionalNick)
|
|
1075
|
+ }
|
|
1076
|
+ return true
|
|
1077
|
+ })
|
|
1078
|
+ })
|
|
1079
|
+
|
|
1080
|
+ sort.Strings(result)
|
|
1081
|
+ return
|
1059
|
1082
|
}
|
1060
|
1083
|
|
1061
|
1084
|
func (am *AccountManager) LoadAccount(accountName string) (result ClientAccount, err error) {
|