Browse Source

Merge pull request #929 from slingamn/verify_rename.1

enforce nick protection immediately after verification
tags/v2.1.0-rc1
Shivaram Lingamneni 4 years ago
parent
commit
ae2a92ca9a
No account linked to committer's email address
2 changed files with 18 additions and 1 deletions
  1. 14
    1
      irc/accounts.go
  2. 4
    0
      irc/nickname.go

+ 14
- 1
irc/accounts.go View File

@@ -744,6 +744,7 @@ func (am *AccountManager) dispatchMailtoCallback(client *Client, account string,
744 744
 
745 745
 func (am *AccountManager) Verify(client *Client, account string, code string) error {
746 746
 	casefoldedAccount, err := CasefoldName(account)
747
+	var skeleton string
747 748
 	if err != nil || account == "" || account == "*" {
748 749
 		return errAccountVerificationFailed
749 750
 	}
@@ -814,7 +815,7 @@ func (am *AccountManager) Verify(client *Client, account string, code string) er
814 815
 		})
815 816
 
816 817
 		if err == nil {
817
-			skeleton, _ := Skeleton(raw.Name)
818
+			skeleton, _ = Skeleton(raw.Name)
818 819
 			am.Lock()
819 820
 			am.nickToAccount[casefoldedAccount] = casefoldedAccount
820 821
 			am.skeletonToAccount[skeleton] = casefoldedAccount
@@ -839,6 +840,18 @@ func (am *AccountManager) Verify(client *Client, account string, code string) er
839 840
 	if client != nil {
840 841
 		am.Login(client, clientAccount)
841 842
 	}
843
+	_, method := am.EnforcementStatus(casefoldedAccount, skeleton)
844
+	if method != NickEnforcementNone {
845
+		currentClient := am.server.clients.Get(casefoldedAccount)
846
+		if currentClient == nil || currentClient == client || currentClient.Account() == casefoldedAccount {
847
+			return nil
848
+		}
849
+		if method == NickEnforcementStrict {
850
+			am.server.RandomlyRename(currentClient)
851
+		} else if method == NickEnforcementWithTimeout {
852
+			currentClient.nickTimer.Touch(nil)
853
+		}
854
+	}
842 855
 	return nil
843 856
 }
844 857
 

+ 4
- 0
irc/nickname.go View File

@@ -98,6 +98,10 @@ func (server *Server) RandomlyRename(client *Client) {
98 98
 	nick := strings.Replace(format, "*", utils.B32Encoder.EncodeToString(buf), -1)
99 99
 	sessions := client.Sessions()
100 100
 	if len(sessions) == 0 {
101
+		// this can happen if they are anonymous and BRB (in general, an always-on
102
+		// client has title to its nickname and will never be the victim of
103
+		// a call to RandomlyRename)
104
+		client.destroy(nil)
101 105
 		return
102 106
 	}
103 107
 	// XXX arbitrarily pick the first session to receive error messages;

Loading…
Cancel
Save