Browse Source

fix a potential conflict with delayed verification of confusable names

0. Enable email verification
1. Register `dog`
2. Register `d0g`
3. Verify `dog`
4. Verify `d0g`: verification succeeds but the nick cannot be used
tags/v2.4.0-rc1
Shivaram Lingamneni 3 years ago
parent
commit
347cc30ed4
1 changed files with 28 additions and 1 deletions
  1. 28
    1
      irc/accounts.go

+ 28
- 1
irc/accounts.go View File

@@ -830,6 +830,34 @@ func (am *AccountManager) Verify(client *Client, account string, code string) er
830 830
 		am.serialCacheUpdateMutex.Lock()
831 831
 		defer am.serialCacheUpdateMutex.Unlock()
832 832
 
833
+		// do a final check for confusability (in case someone already verified
834
+		// a confusable identifier):
835
+		var unfoldedName string
836
+		err = am.server.store.View(func(tx *buntdb.Tx) error {
837
+			unfoldedName, err = tx.Get(accountNameKey)
838
+			return err
839
+		})
840
+		if err != nil {
841
+			err = errAccountDoesNotExist
842
+			return
843
+		}
844
+		skeleton, err = Skeleton(unfoldedName)
845
+		if err != nil {
846
+			err = errAccountDoesNotExist
847
+			return
848
+		}
849
+		err = func() error {
850
+			am.RLock()
851
+			defer am.RUnlock()
852
+			if _, ok := am.skeletonToAccount[skeleton]; ok {
853
+				return errConfusableIdentifier
854
+			}
855
+			return nil
856
+		}()
857
+		if err != nil {
858
+			return
859
+		}
860
+
833 861
 		err = am.server.store.Update(func(tx *buntdb.Tx) error {
834 862
 			raw, err = am.loadRawAccount(tx, casefoldedAccount)
835 863
 			if err == errAccountDoesNotExist {
@@ -878,7 +906,6 @@ func (am *AccountManager) Verify(client *Client, account string, code string) er
878 906
 		})
879 907
 
880 908
 		if err == nil {
881
-			skeleton, _ = Skeleton(raw.Name)
882 909
 			am.Lock()
883 910
 			am.nickToAccount[casefoldedAccount] = casefoldedAccount
884 911
 			am.skeletonToAccount[skeleton] = casefoldedAccount

Loading…
Cancel
Save