Переглянути джерело

implement NS RENAME

Fixes #1380
tags/v2.5.0-rc1
Shivaram Lingamneni 3 роки тому
джерело
коміт
4f571c2cf3
4 змінених файлів з 69 додано та 0 видалено
  1. 30
    0
      irc/accounts.go
  2. 1
    0
      irc/errors.go
  3. 7
    0
      irc/getters.go
  4. 31
    0
      irc/nickserv.go

+ 30
- 0
irc/accounts.go Переглянути файл

@@ -1406,6 +1406,36 @@ func (am *AccountManager) ListSuspended() (result []AccountSuspension) {
1406 1406
 	return
1407 1407
 }
1408 1408
 
1409
+// renames an account (within very restrictive limits); see #1380
1410
+func (am *AccountManager) Rename(oldName, newName string) (err error) {
1411
+	accountData, err := am.LoadAccount(oldName)
1412
+	if err != nil {
1413
+		return
1414
+	}
1415
+	newCfName, err := CasefoldName(newName)
1416
+	if err != nil {
1417
+		return errNicknameInvalid
1418
+	}
1419
+	if newCfName != accountData.NameCasefolded {
1420
+		return errInvalidAccountRename
1421
+	}
1422
+	key := fmt.Sprintf(keyAccountName, accountData.NameCasefolded)
1423
+	err = am.server.store.Update(func(tx *buntdb.Tx) error {
1424
+		tx.Set(key, newName, nil)
1425
+		return nil
1426
+	})
1427
+	if err != nil {
1428
+		return err
1429
+	}
1430
+
1431
+	am.RLock()
1432
+	defer am.RUnlock()
1433
+	for _, client := range am.accountToClients[accountData.NameCasefolded] {
1434
+		client.setAccountName(newName)
1435
+	}
1436
+	return nil
1437
+}
1438
+
1409 1439
 func (am *AccountManager) Unregister(account string, erase bool) error {
1410 1440
 	config := am.server.Config()
1411 1441
 	casefoldedAccount, err := CasefoldName(account)

+ 1
- 0
irc/errors.go Переглянути файл

@@ -73,6 +73,7 @@ var (
73 73
 	errInviteOnly                     = errors.New("Cannot join invite-only channel without an invite")
74 74
 	errRegisteredOnly                 = errors.New("Cannot join registered-only channel without an account")
75 75
 	errValidEmailRequired             = errors.New("A valid email address is required for account registration")
76
+	errInvalidAccountRename           = errors.New("Account renames can only change the casefolding of the account name")
76 77
 )
77 78
 
78 79
 // String Errors

+ 7
- 0
irc/getters.go Переглянути файл

@@ -300,6 +300,13 @@ func (client *Client) Login(account ClientAccount) {
300 300
 	return
301 301
 }
302 302
 
303
+func (client *Client) setAccountName(name string) {
304
+	// XXX this assumes validation elsewhere
305
+	client.stateMutex.Lock()
306
+	defer client.stateMutex.Unlock()
307
+	client.accountName = name
308
+}
309
+
303 310
 func (client *Client) historyCutoff() (cutoff time.Time) {
304 311
 	client.stateMutex.Lock()
305 312
 	if client.account != "" {

+ 31
- 0
irc/nickserv.go Переглянути файл

@@ -347,6 +347,17 @@ command lists all current suspensions.`,
347 347
 			minParams: 1,
348 348
 			capabs:    []string{"accreg"},
349 349
 		},
350
+		"rename": {
351
+			handler: nsRenameHandler,
352
+			help: `Syntax: $bRENAME <account> <newname>$b
353
+
354
+RENAME allows a server administrator to change the name of an account.
355
+Currently, you can only change the canonical casefolding of an account
356
+(e.g., you can change "Alice" to "alice", but not "Alice" to "Amanda").`,
357
+			helpShort: `$bRENAME$b renames an account`,
358
+			minParams: 2,
359
+			capabs:    []string{"accreg"},
360
+		},
350 361
 	}
351 362
 )
352 363
 
@@ -1377,3 +1388,23 @@ func suspensionToString(client *Client, suspension AccountSuspension) (result st
1377 1388
 	}
1378 1389
 	return fmt.Sprintf(client.t("Account %[1]s suspended at %[2]s. Duration: %[3]s. %[4]s"), suspension.AccountName, ts, duration, reason)
1379 1390
 }
1391
+
1392
+func nsRenameHandler(server *Server, client *Client, command string, params []string, rb *ResponseBuffer) {
1393
+	oldName, newName := params[0], params[1]
1394
+	err := server.accounts.Rename(oldName, newName)
1395
+
1396
+	if err != nil {
1397
+		nsNotice(rb, fmt.Sprintf(client.t("Couldn't rename account: %s"), client.t(err.Error())))
1398
+		return
1399
+	}
1400
+
1401
+	nsNotice(rb, client.t("Successfully renamed account"))
1402
+	if server.Config().Accounts.NickReservation.ForceNickEqualsAccount {
1403
+		if curClient := server.clients.Get(oldName); curClient != nil {
1404
+			renameErr := performNickChange(client.server, client, curClient, nil, newName, rb)
1405
+			if renameErr != nil && renameErr != errNoop {
1406
+				nsNotice(rb, fmt.Sprintf(client.t("Warning: could not rename affected client: %v"), err))
1407
+			}
1408
+		}
1409
+	}
1410
+}

Завантаження…
Відмінити
Зберегти