accounts: Login to accounts properly

Avoids letting clients login to two accounts at once
This commit is contained in:
Daniel Oaks 2017-03-08 21:50:12 +10:00
parent 27e36e4c6a
commit 3d597a4fb3
2 changed files with 23 additions and 4 deletions

@ -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

@ -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
})