Skip to content

Commit

Permalink
modes: Restrict changing modes correctly
Browse files Browse the repository at this point in the history
  • Loading branch information
DanielOaks committed Nov 3, 2016
1 parent d32ccdc commit 9fea9cf
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 1 deletion.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
18 changes: 17 additions & 1 deletion irc/modes.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
}
}
Expand Down

0 comments on commit 9fea9cf

Please sign in to comment.