From 73391f11a65c2810e55c3c73fc498caa624480c7 Mon Sep 17 00:00:00 2001 From: Shivaram Lingamneni Date: Mon, 12 Feb 2018 01:09:30 -0500 Subject: [PATCH] replace ACC UNREGISTER with nickserv unregister --- irc/accounts.go | 3 +++ irc/commands.go | 2 +- irc/handlers.go | 29 ----------------------------- irc/nickserv.go | 40 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 44 insertions(+), 30 deletions(-) diff --git a/irc/accounts.go b/irc/accounts.go index 8533cc3f..9529c45f 100644 --- a/irc/accounts.go +++ b/irc/accounts.go @@ -368,6 +368,9 @@ func (am *AccountManager) Unregister(account string) error { client.LogoutOfAccount() } + if err != nil { + return errAccountDoesNotExist + } return nil } diff --git a/irc/commands.go b/irc/commands.go index c8da610c..360504e8 100644 --- a/irc/commands.go +++ b/irc/commands.go @@ -70,7 +70,7 @@ func init() { Commands = map[string]Command{ "ACC": { handler: accHandler, - minParams: 2, + minParams: 3, }, "AMBIANCE": { handler: sceneHandler, diff --git a/irc/handlers.go b/irc/handlers.go index 51081daa..50538325 100644 --- a/irc/handlers.go +++ b/irc/handlers.go @@ -41,8 +41,6 @@ func accHandler(server *Server, client *Client, msg ircmsg.IrcMessage, rb *Respo return accRegisterHandler(server, client, msg, rb) } else if subcommand == "verify" { rb.Notice(client.t("VERIFY is not yet implemented")) - } else if subcommand == "unregister" { - return accUnregisterHandler(server, client, msg, rb) } else { rb.Add(nil, server.name, ERR_UNKNOWNERROR, client.nick, "ACC", msg.Params[0], client.t("Unknown subcommand")) } @@ -50,33 +48,6 @@ func accHandler(server *Server, client *Client, msg ircmsg.IrcMessage, rb *Respo return false } -// ACC UNREGISTER -func accUnregisterHandler(server *Server, client *Client, msg ircmsg.IrcMessage, rb *ResponseBuffer) bool { - // get and sanitise account name - account := strings.TrimSpace(msg.Params[1]) - casefoldedAccount, err := CasefoldName(account) - // probably don't need explicit check for "*" here... but let's do it anyway just to make sure - if err != nil || msg.Params[1] == "*" { - rb.Add(nil, server.name, ERR_REG_UNSPECIFIED_ERROR, client.nick, account, client.t("Account name is not valid")) - return false - } - - if !(account == client.Account() || client.HasRoleCapabs("unregister")) { - rb.Add(nil, server.name, ERR_NOPRIVS, client.Nick(), account, client.t("Insufficient oper privs")) - return false - } - - err = server.accounts.Unregister(account) - // TODO better responses all around here - if err != nil { - errorMsg := fmt.Sprintf("Unknown error while unregistering account %s", casefoldedAccount) - rb.Add(nil, server.name, ERR_UNKNOWNERROR, client.Nick(), msg.Command, errorMsg) - return false - } - rb.Notice(fmt.Sprintf("Successfully unregistered account %s", casefoldedAccount)) - return false -} - // ACC REGISTER [callback_namespace:] [cred_type] : func accRegisterHandler(server *Server, client *Client, msg ircmsg.IrcMessage, rb *ResponseBuffer) bool { // make sure reg is enabled diff --git a/irc/nickserv.go b/irc/nickserv.go index f9699ab8..ddba5432 100644 --- a/irc/nickserv.go +++ b/irc/nickserv.go @@ -17,6 +17,10 @@ To register an account: /NS REGISTER username [password] Leave out [password] if you're registering using your client certificate fingerprint. +To unregister an account: + /NS UNREGISTER [username] +Leave out [username] if you're unregistering the user you're currently logged in as. + To login to an account: /NS IDENTIFY [username password] Leave out [username password] to use your client certificate fingerprint. Otherwise, @@ -63,11 +67,47 @@ func (server *Server) nickservPrivmsgHandler(client *Client, message string, rb username, passphrase := extractParam(params) server.nickservIdentifyHandler(client, username, passphrase, rb) + } else if command == "unregister" { + username, _ := extractParam(params) + server.nickservUnregisterHandler(client, username, rb) } else { rb.Notice(client.t("Command not recognised. To see the available commands, run /NS HELP")) } } +func (server *Server) nickservUnregisterHandler(client *Client, username string, rb *ResponseBuffer) { + if !server.AccountConfig().Registration.Enabled { + rb.Notice(client.t("Account registration has been disabled")) + return + } + + if username == "" { + username = client.Account() + } + if username == "" { + rb.Notice(client.t("You're not logged into an account")) + return + } + cfname, err := CasefoldName(username) + if err != nil { + rb.Notice(client.t("Invalid username")) + return + } + if !(cfname == client.Account() || client.HasRoleCapabs("unregister")) { + rb.Notice(client.t("Insufficient oper privs")) + return + } + + err = server.accounts.Unregister(cfname) + if err == errAccountDoesNotExist { + rb.Notice(client.t(err.Error())) + } else if err != nil { + rb.Notice(client.t("Error while unregistering account")) + } else { + rb.Notice(fmt.Sprintf(client.t("Successfully unregistered account %s"), cfname)) + } +} + func (server *Server) nickservRegisterHandler(client *Client, username, passphrase string, rb *ResponseBuffer) { certfp := client.certfp if passphrase == "" && certfp == "" {