Browse Source

fix #821

Or try to, anyway
tags/v2.0.0-rc1
Shivaram Lingamneni 4 years ago
parent
commit
521617559f
4 changed files with 34 additions and 10 deletions
  1. 11
    0
      irc/accounts.go
  2. 1
    0
      irc/errors.go
  3. 20
    10
      irc/nickserv.go
  4. 2
    0
      irc/server.go

+ 11
- 0
irc/accounts.go View File

@@ -935,6 +935,12 @@ func (am *AccountManager) checkPassphrase(accountName, passphrase string) (accou
935 935
 }
936 936
 
937 937
 func (am *AccountManager) AuthenticateByPassphrase(client *Client, accountName string, passphrase string) (err error) {
938
+	if client.registered {
939
+		if clientAlready := am.server.clients.Get(accountName); clientAlready != nil && clientAlready.AlwaysOn() {
940
+			return errNickAccountMismatch
941
+		}
942
+	}
943
+
938 944
 	var account ClientAccount
939 945
 
940 946
 	defer func() {
@@ -1210,6 +1216,11 @@ func (am *AccountManager) AuthenticateByCertFP(client *Client, certfp, authzid s
1210 1216
 	} else if !clientAccount.Verified {
1211 1217
 		return errAccountUnverified
1212 1218
 	}
1219
+	if client.registered {
1220
+		if clientAlready := am.server.clients.Get(clientAccount.Name); clientAlready != nil && clientAlready.AlwaysOn() {
1221
+			return errNickAccountMismatch
1222
+		}
1223
+	}
1213 1224
 	am.Login(client, clientAccount)
1214 1225
 	return nil
1215 1226
 }

+ 1
- 0
irc/errors.go View File

@@ -42,6 +42,7 @@ var (
42 42
 	errNicknameInUse                  = errors.New("nickname in use")
43 43
 	errNicknameReserved               = errors.New("nickname is reserved")
44 44
 	errCantChangeNick                 = errors.New(`Always-on clients can't change nicknames`)
45
+	errNickAccountMismatch            = errors.New(`Your nickname doesn't match your account name`)
45 46
 	errNoExistingBan                  = errors.New("Ban does not exist")
46 47
 	errNoSuchChannel                  = errors.New(`No such channel`)
47 48
 	errChannelPurged                  = errors.New(`This channel was purged by the server operators and cannot be used`)

+ 20
- 10
irc/nickserv.go View File

@@ -471,14 +471,19 @@ func nsSetHandler(server *Server, client *Client, command string, params []strin
471 471
 			}
472 472
 		}
473 473
 	case "always-on":
474
-		var newValue PersistentStatus
475
-		newValue, err = persistentStatusFromString(params[1])
476
-		// "opt-in" and "opt-out" don't make sense as user preferences
477
-		if err == nil && newValue != PersistentOptIn && newValue != PersistentOptOut {
478
-			munger = func(in AccountSettings) (out AccountSettings, err error) {
479
-				out = in
480
-				out.AlwaysOn = newValue
481
-				return
474
+		details := client.Details()
475
+		if details.nick != details.accountName {
476
+			err = errNickAccountMismatch
477
+		} else {
478
+			var newValue PersistentStatus
479
+			newValue, err = persistentStatusFromString(params[1])
480
+			// "opt-in" and "opt-out" don't make sense as user preferences
481
+			if err == nil && newValue != PersistentOptIn && newValue != PersistentOptOut {
482
+				munger = func(in AccountSettings) (out AccountSettings, err error) {
483
+					out = in
484
+					out.AlwaysOn = newValue
485
+					return
486
+				}
482 487
 			}
483 488
 		}
484 489
 	case "autoreplay-missed":
@@ -515,6 +520,8 @@ func nsSetHandler(server *Server, client *Client, command string, params []strin
515 520
 		displaySetting(params[0], finalSettings, client, rb)
516 521
 	case errInvalidParams, errAccountDoesNotExist, errFeatureDisabled, errAccountUnverified, errAccountUpdateFailed:
517 522
 		nsNotice(rb, client.t(err.Error()))
523
+	case errNickAccountMismatch:
524
+		nsNotice(rb, fmt.Sprintf(client.t("Your nickname must match your account name %s exactly to modify this setting. Try changing it with /NICK, or logging out and back in with the correct nickname."), client.AccountName()))
518 525
 	default:
519 526
 		// unknown error
520 527
 		nsNotice(rb, client.t("An error occurred"))
@@ -601,6 +608,7 @@ func nsIdentifyHandler(server *Server, client *Client, command string, params []
601 608
 		return
602 609
 	}
603 610
 
611
+	var err error
604 612
 	loginSuccessful := false
605 613
 
606 614
 	var username, passphrase string
@@ -623,18 +631,20 @@ func nsIdentifyHandler(server *Server, client *Client, command string, params []
623 631
 		if !nsLoginThrottleCheck(client, rb) {
624 632
 			return
625 633
 		}
626
-		err := server.accounts.AuthenticateByPassphrase(client, username, passphrase)
634
+		err = server.accounts.AuthenticateByPassphrase(client, username, passphrase)
627 635
 		loginSuccessful = (err == nil)
628 636
 	}
629 637
 
630 638
 	// try certfp
631 639
 	if !loginSuccessful && rb.session.certfp != "" {
632
-		err := server.accounts.AuthenticateByCertFP(client, rb.session.certfp, "")
640
+		err = server.accounts.AuthenticateByCertFP(client, rb.session.certfp, "")
633 641
 		loginSuccessful = (err == nil)
634 642
 	}
635 643
 
636 644
 	if loginSuccessful {
637 645
 		sendSuccessfulAccountAuth(client, rb, true, true)
646
+	} else if err == errNickAccountMismatch {
647
+		nsNotice(rb, client.t("That account is set to always-on; try logging out and logging back in with SASL"))
638 648
 	} else {
639 649
 		nsNotice(rb, client.t("Could not login with your TLS certificate or supplied username/password"))
640 650
 	}

+ 2
- 0
irc/server.go View File

@@ -584,6 +584,8 @@ func (server *Server) applyConfig(config *Config) (err error) {
584 584
 			return fmt.Errorf("Datastore path cannot be changed after launching the server, rehash aborted")
585 585
 		} else if globalCasemappingSetting != config.Server.Casemapping {
586 586
 			return fmt.Errorf("Casemapping cannot be changed after launching the server, rehash aborted")
587
+		} else if oldConfig.Accounts.Multiclient.AlwaysOn != config.Accounts.Multiclient.AlwaysOn {
588
+			return fmt.Errorf("Default always-on setting cannot be changed after launching the server, rehash aborted")
587 589
 		}
588 590
 	}
589 591
 

Loading…
Cancel
Save