|
@@ -165,6 +165,24 @@ func (am *AccountManager) buildNickToAccountIndex(config *Config) {
|
165
|
165
|
return err
|
166
|
166
|
})
|
167
|
167
|
|
|
168
|
+ if config.Accounts.NickReservation.Method == NickEnforcementStrict {
|
|
169
|
+ unregisteredPrefix := fmt.Sprintf(keyAccountUnregistered, "")
|
|
170
|
+ am.server.store.View(func(tx *buntdb.Tx) error {
|
|
171
|
+ tx.AscendGreaterOrEqual("", unregisteredPrefix, func(key, value string) bool {
|
|
172
|
+ if !strings.HasPrefix(key, unregisteredPrefix) {
|
|
173
|
+ return false
|
|
174
|
+ }
|
|
175
|
+ account := strings.TrimPrefix(key, unregisteredPrefix)
|
|
176
|
+ accountName := value
|
|
177
|
+ nickToAccount[account] = account
|
|
178
|
+ skeleton, _ := Skeleton(accountName)
|
|
179
|
+ skeletonToAccount[skeleton] = account
|
|
180
|
+ return true
|
|
181
|
+ })
|
|
182
|
+ return nil
|
|
183
|
+ })
|
|
184
|
+ }
|
|
185
|
+
|
168
|
186
|
if err != nil {
|
169
|
187
|
am.server.logger.Error("internal", "couldn't read reserved nicks", err.Error())
|
170
|
188
|
} else {
|
|
@@ -1113,16 +1131,18 @@ func (am *AccountManager) Unregister(account string, erase bool) error {
|
1113
|
1131
|
|
1114
|
1132
|
var accountName string
|
1115
|
1133
|
var channelsStr string
|
|
1134
|
+ keepProtections := false
|
1116
|
1135
|
am.server.store.Update(func(tx *buntdb.Tx) error {
|
|
1136
|
+ accountName, _ = tx.Get(accountNameKey)
|
1117
|
1137
|
if erase {
|
1118
|
1138
|
tx.Delete(unregisteredKey)
|
1119
|
1139
|
} else {
|
1120
|
1140
|
if _, err := tx.Get(verifiedKey); err == nil {
|
1121
|
|
- tx.Set(unregisteredKey, "1", nil)
|
|
1141
|
+ tx.Set(unregisteredKey, accountName, nil)
|
|
1142
|
+ keepProtections = true
|
1122
|
1143
|
}
|
1123
|
1144
|
}
|
1124
|
1145
|
tx.Delete(accountKey)
|
1125
|
|
- accountName, _ = tx.Get(accountNameKey)
|
1126
|
1146
|
tx.Delete(accountNameKey)
|
1127
|
1147
|
tx.Delete(verifiedKey)
|
1128
|
1148
|
tx.Delete(registeredTimeKey)
|
|
@@ -1168,8 +1188,11 @@ func (am *AccountManager) Unregister(account string, erase bool) error {
|
1168
|
1188
|
|
1169
|
1189
|
clients = am.accountToClients[casefoldedAccount]
|
1170
|
1190
|
delete(am.accountToClients, casefoldedAccount)
|
1171
|
|
- delete(am.nickToAccount, casefoldedAccount)
|
1172
|
|
- delete(am.skeletonToAccount, skeleton)
|
|
1191
|
+ // protect the account name itself where applicable, but not any grouped nicks
|
|
1192
|
+ if !(keepProtections && config.Accounts.NickReservation.Method == NickEnforcementStrict) {
|
|
1193
|
+ delete(am.nickToAccount, casefoldedAccount)
|
|
1194
|
+ delete(am.skeletonToAccount, skeleton)
|
|
1195
|
+ }
|
1173
|
1196
|
for _, nick := range additionalNicks {
|
1174
|
1197
|
delete(am.nickToAccount, nick)
|
1175
|
1198
|
additionalSkel, _ := Skeleton(nick)
|