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