From 4fa094cea2ee89efbb5135b40b8ddd76ddadc2f8 Mon Sep 17 00:00:00 2001 From: Daniel Oaks Date: Thu, 13 Oct 2016 18:18:00 +1000 Subject: [PATCH] accounts: Support account-notify capability --- CHANGELOG.md | 1 + irc/accounts.go | 17 +++++++++++++---- irc/capability.go | 2 ++ 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ba0a3e21..813c7f83 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ Improved compatibility, more features, etc. ### Security ### Added +* Support for IRCv3 capability [`account-notify`](http://ircv3.net/specs/extensions/account-notify-3.1.html) ### Changed * Casemapping changed from custom unicode mapping to preliminary [rfc7700](https://github.com/ircv3/ircv3-specifications/pull/272) mapping. diff --git a/irc/accounts.go b/irc/accounts.go index 4b88b530..fb1316fb 100644 --- a/irc/accounts.go +++ b/irc/accounts.go @@ -220,8 +220,7 @@ func authPlainHandler(server *Server, client *Client, mechanism string, value [] return false } - client.Send(nil, server.name, RPL_LOGGEDIN, client.nick, client.nickMaskString, client.account.Name, fmt.Sprintf("You are now logged in as %s", client.account.Name)) - client.Send(nil, server.name, RPL_SASLSUCCESS, client.nick, "SASL authentication successful") + client.successfulSaslAuth() return false } @@ -268,7 +267,17 @@ func authExternalHandler(server *Server, client *Client, mechanism string, value return false } - client.Send(nil, server.name, RPL_LOGGEDIN, client.nick, client.nickMaskString, client.account.Name, fmt.Sprintf("You are now logged in as %s", client.account.Name)) - client.Send(nil, server.name, RPL_SASLSUCCESS, client.nick, "SASL authentication successful") + client.successfulSaslAuth() return false } + +// successfulSaslAuth means that a SASL auth attempt completed successfully, and is used to dispatch messages. +func (c *Client) successfulSaslAuth() { + c.Send(nil, c.server.name, RPL_LOGGEDIN, c.nick, c.nickMaskString, c.account.Name, fmt.Sprintf("You are now logged in as %s", c.account.Name)) + c.Send(nil, c.server.name, RPL_SASLSUCCESS, c.nick, "SASL authentication successful") + + // dispatch account-notify + for friend := range c.Friends(AccountNotify) { + friend.Send(nil, c.nickMaskString, "ACCOUNT", c.account.Name) + } +} diff --git a/irc/capability.go b/irc/capability.go index 6fe9ff53..6c3a127b 100644 --- a/irc/capability.go +++ b/irc/capability.go @@ -15,6 +15,7 @@ type Capability string const ( AccountTag Capability = "account-tag" + AccountNotify Capability = "account-notify" AwayNotify Capability = "away-notify" ExtendedJoin Capability = "extended-join" MultiPrefix Capability = "multi-prefix" @@ -26,6 +27,7 @@ const ( var ( SupportedCapabilities = CapabilitySet{ AccountTag: true, + AccountNotify: true, AwayNotify: true, ExtendedJoin: true, MultiPrefix: true,