From 3d597a4fb34430794af09dacbbcae18b53983abc Mon Sep 17 00:00:00 2001 From: Daniel Oaks Date: Wed, 8 Mar 2017 21:50:12 +1000 Subject: [PATCH] accounts: Login to accounts properly Avoids letting clients login to two accounts at once --- CHANGELOG.md | 1 + irc/accounts.go | 26 ++++++++++++++++++++++---- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b151426a..a7200c6c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ New release of Oragono! ### Removed ### Fixed +* Fixed an account issue where clients could login to multiple accounts at once. ## [0.6.0] - 2017-01-19 diff --git a/irc/accounts.go b/irc/accounts.go index bb1cc55d..218ca8e4 100644 --- a/irc/accounts.go +++ b/irc/accounts.go @@ -222,8 +222,7 @@ func authPlainHandler(server *Server, client *Client, mechanism string, value [] account = loadAccount(server, tx, accountKey) } - account.Clients = append(account.Clients, client) - client.account = account + client.LoginToAccount(account) return err }) @@ -237,6 +236,26 @@ func authPlainHandler(server *Server, client *Client, mechanism string, value [] return false } +// LoginToAccount logs the client into the given account. +func (client *Client) LoginToAccount(account *ClientAccount) { + if client.account == account { + // already logged into this acct, no changing necessary + return + } else if client.account != nil { + // logout of existing acct + var newClientAccounts []*Client + for _, c := range account.Clients { + if c != client { + newClientAccounts = append(newClientAccounts, c) + } + } + account.Clients = newClientAccounts + } + + account.Clients = append(account.Clients, client) + client.account = account +} + // authExternalHandler parses the SASL EXTERNAL mechanism. func authExternalHandler(server *Server, client *Client, mechanism string, value []byte) bool { if client.certfp == "" { @@ -275,8 +294,7 @@ func authExternalHandler(server *Server, client *Client, mechanism string, value account = loadAccount(server, tx, accountKey) } - account.Clients = append(account.Clients, client) - client.account = account + client.LoginToAccount(account) return nil })