소스 검색

enforce nick protection immediately after verification

tags/v2.1.0-rc1
Shivaram Lingamneni 4 년 전
부모
커밋
d6e3f188cf
2개의 변경된 파일18개의 추가작업 그리고 1개의 파일을 삭제
  1. 14
    1
      irc/accounts.go
  2. 4
    0
      irc/nickname.go

+ 14
- 1
irc/accounts.go 파일 보기

@@ -750,6 +750,7 @@ func (am *AccountManager) dispatchMailtoCallback(client *Client, casefoldedAccou
750 750
 
751 751
 func (am *AccountManager) Verify(client *Client, account string, code string) error {
752 752
 	casefoldedAccount, err := CasefoldName(account)
753
+	var skeleton string
753 754
 	if err != nil || account == "" || account == "*" {
754 755
 		return errAccountVerificationFailed
755 756
 	}
@@ -820,7 +821,7 @@ func (am *AccountManager) Verify(client *Client, account string, code string) er
820 821
 		})
821 822
 
822 823
 		if err == nil {
823
-			skeleton, _ := Skeleton(raw.Name)
824
+			skeleton, _ = Skeleton(raw.Name)
824 825
 			am.Lock()
825 826
 			am.nickToAccount[casefoldedAccount] = casefoldedAccount
826 827
 			am.skeletonToAccount[skeleton] = casefoldedAccount
@@ -845,6 +846,18 @@ func (am *AccountManager) Verify(client *Client, account string, code string) er
845 846
 	if client != nil {
846 847
 		am.Login(client, clientAccount)
847 848
 	}
849
+	_, method := am.EnforcementStatus(casefoldedAccount, skeleton)
850
+	if method != NickEnforcementNone {
851
+		currentClient := am.server.clients.Get(casefoldedAccount)
852
+		if currentClient == nil || currentClient == client || currentClient.Account() == casefoldedAccount {
853
+			return nil
854
+		}
855
+		if method == NickEnforcementStrict {
856
+			am.server.RandomlyRename(currentClient)
857
+		} else if method == NickEnforcementWithTimeout {
858
+			currentClient.nickTimer.Touch(nil)
859
+		}
860
+	}
848 861
 	return nil
849 862
 }
850 863
 

+ 4
- 0
irc/nickname.go 파일 보기

@@ -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…
취소
저장