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

add SAVERIFY command

Fixes #1924
tags/v2.10.0-rc1
Shivaram Lingamneni 2 роки тому
джерело
коміт
78548aa9df
3 змінених файлів з 40 додано та 18 видалено
  1. 15
    13
      irc/accounts.go
  2. 2
    2
      irc/handlers.go
  3. 23
    3
      irc/nickserv.go

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

@@ -821,7 +821,7 @@ func (am *AccountManager) dispatchMailtoCallback(client *Client, account string,
821 821
 	return
822 822
 }
823 823
 
824
-func (am *AccountManager) Verify(client *Client, account string, code string) error {
824
+func (am *AccountManager) Verify(client *Client, account string, code string, admin bool) error {
825 825
 	casefoldedAccount, err := CasefoldName(account)
826 826
 	var skeleton string
827 827
 	if err != nil || account == "" || account == "*" {
@@ -884,18 +884,20 @@ func (am *AccountManager) Verify(client *Client, account string, code string) er
884 884
 				return errAccountAlreadyVerified
885 885
 			}
886 886
 
887
-			// actually verify the code
888
-			// a stored code of "" means a none callback / no code required
889
-			success := false
890
-			storedCode, err := tx.Get(verificationCodeKey)
891
-			if err == nil {
892
-				// this is probably unnecessary
893
-				if storedCode == "" || utils.SecretTokensMatch(storedCode, code) {
894
-					success = true
887
+			if !admin {
888
+				// actually verify the code
889
+				// a stored code of "" means a none callback / no code required
890
+				success := false
891
+				storedCode, err := tx.Get(verificationCodeKey)
892
+				if err == nil {
893
+					// this is probably unnecessary
894
+					if storedCode == "" || utils.SecretTokensMatch(storedCode, code) {
895
+						success = true
896
+					}
897
+				}
898
+				if !success {
899
+					return errAccountVerificationInvalidCode
895 900
 				}
896
-			}
897
-			if !success {
898
-				return errAccountVerificationInvalidCode
899 901
 			}
900 902
 
901 903
 			// verify the account
@@ -964,7 +966,7 @@ func (am *AccountManager) Verify(client *Client, account string, code string) er
964 966
 func (am *AccountManager) SARegister(account, passphrase string) (err error) {
965 967
 	err = am.Register(nil, account, "admin", "", passphrase, "")
966 968
 	if err == nil {
967
-		err = am.Verify(nil, account, "")
969
+		err = am.Verify(nil, account, "", true)
968 970
 	}
969 971
 	return
970 972
 }

+ 2
- 2
irc/handlers.go Переглянути файл

@@ -2632,7 +2632,7 @@ func registerHandler(server *Server, client *Client, msg ircmsg.Message, rb *Res
2632 2632
 	switch err {
2633 2633
 	case nil:
2634 2634
 		if callbackNamespace == "*" {
2635
-			err := server.accounts.Verify(client, accountName, "")
2635
+			err := server.accounts.Verify(client, accountName, "", true)
2636 2636
 			if err == nil {
2637 2637
 				if client.registered {
2638 2638
 					if !fixupNickEqualsAccount(client, rb, config, "") {
@@ -2684,7 +2684,7 @@ func verifyHandler(server *Server, client *Client, msg ircmsg.Message, rb *Respo
2684 2684
 	}
2685 2685
 
2686 2686
 	accountName, verificationCode := msg.Params[0], msg.Params[1]
2687
-	err := server.accounts.Verify(client, accountName, verificationCode)
2687
+	err := server.accounts.Verify(client, accountName, verificationCode, false)
2688 2688
 	if err == nil && client.registered {
2689 2689
 		if !fixupNickEqualsAccount(client, rb, config, "") {
2690 2690
 			err = errNickAccountMismatch

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

@@ -164,7 +164,17 @@ SAREGISTER registers an account on someone else's behalf.
164 164
 This is for use in configurations that require SASL for all connections;
165 165
 an administrator can set use this command to set up user accounts.`,
166 166
 			helpShort: `$bSAREGISTER$b registers an account on someone else's behalf.`,
167
-			enabled:   servCmdRequiresAuthEnabled,
167
+			enabled:   servCmdRequiresAuthEnabled, // deliberate
168
+			capabs:    []string{"accreg"},
169
+			minParams: 1,
170
+		},
171
+		"saverify": {
172
+			handler: nsSaverifyHandler,
173
+			help: `Syntax: $bSAVERIFY <username>$b
174
+
175
+SAVERIFY manually verifies an account that is pending verification.`,
176
+			helpShort: `$bSAREGISTER$b registers an account on someone else's behalf.`,
177
+			enabled:   servCmdRequiresAuthEnabled, // deliberate
168 178
 			capabs:    []string{"accreg"},
169 179
 			minParams: 1,
170 180
 		},
@@ -996,7 +1006,7 @@ func nsRegisterHandler(service *ircService, server *Server, client *Client, comm
996 1006
 	err := server.accounts.Register(client, account, callbackNamespace, callbackValue, passphrase, rb.session.certfp)
997 1007
 	if err == nil {
998 1008
 		if callbackNamespace == "*" {
999
-			err = server.accounts.Verify(client, account, "")
1009
+			err = server.accounts.Verify(client, account, "", true)
1000 1010
 			if err == nil && fixupNickEqualsAccount(client, rb, config, service.prefix) {
1001 1011
 				sendSuccessfulRegResponse(service, client, rb)
1002 1012
 			}
@@ -1038,6 +1048,16 @@ func nsSaregisterHandler(service *ircService, server *Server, client *Client, co
1038 1048
 	}
1039 1049
 }
1040 1050
 
1051
+func nsSaverifyHandler(service *ircService, server *Server, client *Client, command string, params []string, rb *ResponseBuffer) {
1052
+	account := params[0]
1053
+	err := server.accounts.Verify(nil, account, "", true)
1054
+	if err == nil {
1055
+		service.Notice(rb, fmt.Sprintf(client.t("Successfully verified account %s"), account))
1056
+	} else {
1057
+		service.Notice(rb, fmt.Sprintf(client.t("Failed to verify account %s: %v"), account, err.Error()))
1058
+	}
1059
+}
1060
+
1041 1061
 func nsUnregisterHandler(service *ircService, server *Server, client *Client, command string, params []string, rb *ResponseBuffer) {
1042 1062
 	erase := command == "erase"
1043 1063
 
@@ -1106,7 +1126,7 @@ func nsUnregisterHandler(service *ircService, server *Server, client *Client, co
1106 1126
 
1107 1127
 func nsVerifyHandler(service *ircService, server *Server, client *Client, command string, params []string, rb *ResponseBuffer) {
1108 1128
 	username, code := params[0], params[1]
1109
-	err := server.accounts.Verify(client, username, code)
1129
+	err := server.accounts.Verify(client, username, code, false)
1110 1130
 
1111 1131
 	var errorMessage string
1112 1132
 	if err != nil {

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