Преглед изворни кода

retain nickname protections after unregistration

tags/v2.1.0-rc1
Shivaram Lingamneni пре 4 година
родитељ
комит
b61d258d0c
1 измењених фајлова са 27 додато и 4 уклоњено
  1. 27
    4
      irc/accounts.go

+ 27
- 4
irc/accounts.go Прегледај датотеку

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

Loading…
Откажи
Сачувај