modes: Restrict changing modes correctly

This commit is contained in:
Daniel Oaks
2016-11-03 16:59:57 +10:00
parent d32ccdc572
commit 9fea9cf658
2 changed files with 18 additions and 1 deletions
+1
View File
@@ -26,6 +26,7 @@ New release of Oragono!
* Fixed bug where `HELP` wouldn't correctly display for operators, and added more help topics.
* Fixed display of large `MONITOR` lists.
* Fixed bug where you would always have certain capabilities enabled.
* Fixed being able to change modes when not an operator.
## [0.3.0] - 2016-10-23
+17 -1
View File
@@ -409,7 +409,20 @@ func cmodeHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
// so we only output one warning for each list type when full
listFullWarned := make(map[ChannelMode]bool)
clientIsOp := channel.ClientIsAtLeast(client, ChannelOperator)
var alreadySentPrivError bool
for _, change := range changes {
// chan priv modes are checked specially so ignore them
// means regular users can't view ban/except lists... but I'm not worried about that
if ChannelModePrefixes[change.mode] == "" && !clientIsOp {
if !alreadySentPrivError {
alreadySentPrivError = true
client.Send(nil, client.server.name, ERR_CHANOPRIVSNEEDED, channel.name, "You're not a channel operator")
}
continue
}
switch change.mode {
case BanMask, ExceptMask, InviteMask:
mask := change.arg
@@ -519,7 +532,10 @@ func cmodeHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
if change.op == Remove && casefoldedName == client.nickCasefolded {
// success!
} else {
client.Send(nil, client.server.name, ERR_CHANOPRIVSNEEDED, channel.name, "You're not a channel operator")
if !alreadySentPrivError {
alreadySentPrivError = true
client.Send(nil, client.server.name, ERR_CHANOPRIVSNEEDED, channel.name, "You're not a channel operator")
}
continue
}
}