diff --git a/docs/MANUAL.md b/docs/MANUAL.md index d8c246e2..db3330a8 100644 --- a/docs/MANUAL.md +++ b/docs/MANUAL.md @@ -34,7 +34,6 @@ _Copyright © 2018 Daniel Oaks _ - Commands - Working with other software - HOPM - - ZNC - Tor - Acknowledgements @@ -594,11 +593,6 @@ connregex = ".+-.+CONNECT.+-.+ Client Connected \\[([^ ]+)\\] \\[u:([^ ]+)\\] \\ kline = "DLINE ANDKILL 2h %i :Open proxy found on your host."; ```` -## ZNC - -Versions of ZNC prior to 1.7 have a [bug](https://github.com/znc/znc/issues/1212) in their SASL implementation that renders them incompatible with Oragono. However, you should be able to authenticate from ZNC using its [NickServ](https://wiki.znc.in/Nickserv) module. - - ## Tor Oragono has code support for adding an .onion address to an IRC server, or operating an IRC server as a Tor hidden service. This is subtle, so you should be familiar with the [Tor Project](https://www.torproject.org/) and the concept of a [hidden service](https://www.torproject.org/docs/tor-onion-service.html.en). diff --git a/irc/channel.go b/irc/channel.go index 6a93e901..550973af 100644 --- a/irc/channel.go +++ b/irc/channel.go @@ -534,6 +534,11 @@ func (channel *Channel) Join(client *Client, key string, isSajoin bool, rb *Resp return } + if !hasPrivs && channel.flags.HasMode(modes.RegisteredOnly) && details.account == "" && !isInvited { + rb.Add(nil, client.server.name, ERR_BANNEDFROMCHAN, details.nick, chname, client.t("You must be registered to join that channel")) + return + } + client.server.logger.Debug("join", fmt.Sprintf("%s joined channel %s", details.nick, chname)) var message utils.SplitMessage diff --git a/irc/client.go b/irc/client.go index 2ed9bcc8..b26a4672 100644 --- a/irc/client.go +++ b/irc/client.go @@ -1034,7 +1034,7 @@ func (client *Client) destroy(beingResumed bool, session *Session) { // send quit messages to friends if !beingResumed { - if client.Registered() { + if registered { client.server.stats.ChangeTotal(-1) } if client.HasMode(modes.Invisible) { @@ -1054,7 +1054,7 @@ func (client *Client) destroy(beingResumed bool, session *Session) { if !client.exitedSnomaskSent { if beingResumed { client.server.snomasks.Send(sno.LocalQuits, fmt.Sprintf(ircfmt.Unescape("%s$r is resuming their connection, old client has been destroyed"), client.nick)) - } else { + } else if registered { client.server.snomasks.Send(sno.LocalQuits, fmt.Sprintf(ircfmt.Unescape("%s$r exited the network"), details.nick)) } } diff --git a/irc/handlers.go b/irc/handlers.go index 77bb2ea0..feda4447 100644 --- a/irc/handlers.go +++ b/irc/handlers.go @@ -1075,6 +1075,11 @@ Get an explanation of , or "index" for a list of help topics.`), rb) // HISTORY me 15 func historyHandler(server *Server, client *Client, msg ircmsg.IrcMessage, rb *ResponseBuffer) bool { config := server.Config() + if !config.History.Enabled { + rb.Notice(client.t("This command has been disabled by the server administrators")) + return false + } + target := msg.Params[0] var hist *history.Buffer channel := server.channels.Get(target) diff --git a/irc/nickname.go b/irc/nickname.go index c9098679..34917fb4 100644 --- a/irc/nickname.go +++ b/irc/nickname.go @@ -70,7 +70,11 @@ func performNickChange(server *Server, client *Client, target *Client, session * client.server.logger.Debug("nick", fmt.Sprintf("%s changed nickname to %s [%s]", origNickMask, nickname, cfnick)) if hadNick { - target.server.snomasks.Send(sno.LocalNicks, fmt.Sprintf(ircfmt.Unescape("$%s$r changed nickname to %s"), details.nick, nickname)) + if client == target { + target.server.snomasks.Send(sno.LocalNicks, fmt.Sprintf(ircfmt.Unescape("$%s$r changed nickname to %s"), details.nick, nickname)) + } else { + target.server.snomasks.Send(sno.LocalNicks, fmt.Sprintf(ircfmt.Unescape("Operator %s changed nickname of $%s$r to %s"), client.Nick(), details.nick, nickname)) + } target.server.whoWas.Append(details.WhoWas) rb.AddFromClient(message.Time, message.Msgid, origNickMask, details.accountName, nil, "NICK", nickname) for session := range target.Friends() {