Browse Source

clean up always-on state machine

tags/v2.3.0-rc1
Shivaram Lingamneni 3 years ago
parent
commit
027886046c
3 changed files with 7 additions and 25 deletions
  1. 0
    17
      irc/accounts.go
  2. 3
    1
      irc/client.go
  3. 4
    7
      irc/getters.go

+ 0
- 17
irc/accounts.go View File

@@ -903,23 +903,6 @@ func (am *AccountManager) Verify(client *Client, account string, code string) er
903 903
 			am.server.RandomlyRename(currentClient)
904 904
 		}
905 905
 	}
906
-	// #1216: we may have created an always-on client
907
-	if client == nil {
908
-		config := am.server.Config()
909
-		if persistenceEnabled(config.Accounts.Multiclient.AlwaysOn, PersistentUnspecified) {
910
-			accountData, err := am.LoadAccount(account)
911
-			if err != nil {
912
-				return err
913
-			}
914
-			am.server.AddAlwaysOnClient(
915
-				accountData,
916
-				nil,
917
-				nil,
918
-				config.Accounts.defaultUserModes,
919
-				"",
920
-			)
921
-		}
922
-	}
923 906
 	return nil
924 907
 }
925 908
 

+ 3
- 1
irc/client.go View File

@@ -1242,7 +1242,9 @@ func (client *Client) destroy(session *Session) {
1242 1242
 	wasReattach := session != nil && session.client != client
1243 1243
 	sessionRemoved := false
1244 1244
 	registered := client.registered
1245
-	alwaysOn := client.alwaysOn
1245
+	// XXX a temporary (reattaching) client can be marked alwaysOn when it logs in,
1246
+	// but then the session attaches to another client and we need to clean it up here
1247
+	alwaysOn := registered && client.alwaysOn
1246 1248
 
1247 1249
 	var remainingSessions int
1248 1250
 	if session == nil {

+ 4
- 7
irc/getters.go View File

@@ -203,7 +203,7 @@ func (client *Client) SetAway(away bool, awayMessage string) (changed bool) {
203 203
 
204 204
 func (client *Client) AlwaysOn() (alwaysOn bool) {
205 205
 	client.stateMutex.Lock()
206
-	alwaysOn = client.alwaysOn
206
+	alwaysOn = client.registered && client.alwaysOn
207 207
 	client.stateMutex.Unlock()
208 208
 	return
209 209
 }
@@ -290,11 +290,8 @@ func (client *Client) Login(account ClientAccount) {
290 290
 	client.account = account.NameCasefolded
291 291
 	client.accountName = account.Name
292 292
 	client.accountSettings = account.Settings
293
-	// check `registered` to avoid incorrectly marking a temporary (pre-reattach),
294
-	// SASL'ing client as always-on
295
-	if client.registered {
296
-		client.alwaysOn = alwaysOn
297
-	}
293
+	// mark always-on here: it will not be respected until the client is registered
294
+	client.alwaysOn = alwaysOn
298 295
 	client.accountRegDate = account.RegisteredAt
299 296
 	return
300 297
 }
@@ -375,7 +372,7 @@ func (client *Client) SetMode(mode modes.Mode, on bool) bool {
375 372
 func (client *Client) SetRealname(realname string) {
376 373
 	client.stateMutex.Lock()
377 374
 	client.realname = realname
378
-	alwaysOn := client.alwaysOn
375
+	alwaysOn := client.registered && client.alwaysOn
379 376
 	client.stateMutex.Unlock()
380 377
 	if alwaysOn {
381 378
 		client.markDirty(IncludeRealname)

Loading…
Cancel
Save