From 027886046cf23475a4243a180011fefbf50d108f Mon Sep 17 00:00:00 2001 From: Shivaram Lingamneni Date: Sun, 26 Jul 2020 15:51:33 -0400 Subject: [PATCH] clean up always-on state machine --- irc/accounts.go | 17 ----------------- irc/client.go | 4 +++- irc/getters.go | 11 ++++------- 3 files changed, 7 insertions(+), 25 deletions(-) diff --git a/irc/accounts.go b/irc/accounts.go index 1dc4dced..e573ed04 100644 --- a/irc/accounts.go +++ b/irc/accounts.go @@ -903,23 +903,6 @@ func (am *AccountManager) Verify(client *Client, account string, code string) er am.server.RandomlyRename(currentClient) } } - // #1216: we may have created an always-on client - if client == nil { - config := am.server.Config() - if persistenceEnabled(config.Accounts.Multiclient.AlwaysOn, PersistentUnspecified) { - accountData, err := am.LoadAccount(account) - if err != nil { - return err - } - am.server.AddAlwaysOnClient( - accountData, - nil, - nil, - config.Accounts.defaultUserModes, - "", - ) - } - } return nil } diff --git a/irc/client.go b/irc/client.go index 8a40aaf9..ed7f3e33 100644 --- a/irc/client.go +++ b/irc/client.go @@ -1242,7 +1242,9 @@ func (client *Client) destroy(session *Session) { wasReattach := session != nil && session.client != client sessionRemoved := false registered := client.registered - alwaysOn := client.alwaysOn + // XXX a temporary (reattaching) client can be marked alwaysOn when it logs in, + // but then the session attaches to another client and we need to clean it up here + alwaysOn := registered && client.alwaysOn var remainingSessions int if session == nil { diff --git a/irc/getters.go b/irc/getters.go index b7aaae7a..af83790a 100644 --- a/irc/getters.go +++ b/irc/getters.go @@ -203,7 +203,7 @@ func (client *Client) SetAway(away bool, awayMessage string) (changed bool) { func (client *Client) AlwaysOn() (alwaysOn bool) { client.stateMutex.Lock() - alwaysOn = client.alwaysOn + alwaysOn = client.registered && client.alwaysOn client.stateMutex.Unlock() return } @@ -290,11 +290,8 @@ func (client *Client) Login(account ClientAccount) { client.account = account.NameCasefolded client.accountName = account.Name client.accountSettings = account.Settings - // check `registered` to avoid incorrectly marking a temporary (pre-reattach), - // SASL'ing client as always-on - if client.registered { - client.alwaysOn = alwaysOn - } + // mark always-on here: it will not be respected until the client is registered + client.alwaysOn = alwaysOn client.accountRegDate = account.RegisteredAt return } @@ -375,7 +372,7 @@ func (client *Client) SetMode(mode modes.Mode, on bool) bool { func (client *Client) SetRealname(realname string) { client.stateMutex.Lock() client.realname = realname - alwaysOn := client.alwaysOn + alwaysOn := client.registered && client.alwaysOn client.stateMutex.Unlock() if alwaysOn { client.markDirty(IncludeRealname)