Browse Source

disallow /SAMODE nick +o

tags/v2.1.0-rc1
Shivaram Lingamneni 4 years ago
parent
commit
d98e3581b3
2 changed files with 6 additions and 4 deletions
  1. 2
    2
      irc/handlers.go
  2. 4
    2
      irc/modes.go

+ 2
- 2
irc/handlers.go View File

@@ -1602,7 +1602,7 @@ func umodeHandler(server *Server, client *Client, msg ircmsg.IrcMessage, rb *Res
1602 1602
 		}
1603 1603
 
1604 1604
 		// apply mode changes
1605
-		applied = ApplyUserModeChanges(target, changes, msg.Command == "SAMODE")
1605
+		applied = ApplyUserModeChanges(target, changes, msg.Command == "SAMODE", nil)
1606 1606
 	}
1607 1607
 
1608 1608
 	if len(applied) > 0 {
@@ -2117,7 +2117,7 @@ func applyOper(client *Client, oper *Oper, rb *ResponseBuffer) {
2117 2117
 			Op:   modes.Add,
2118 2118
 		}
2119 2119
 		copy(modeChanges[1:], oper.Modes)
2120
-		applied := ApplyUserModeChanges(client, modeChanges, true)
2120
+		applied := ApplyUserModeChanges(client, modeChanges, true, oper)
2121 2121
 
2122 2122
 		client.server.snomasks.Send(sno.LocalOpers, fmt.Sprintf(ircfmt.Unescape("Client opered up $c[grey][$r%s$c[grey], $r%s$c[grey]]"), newDetails.nickMask, oper.Name))
2123 2123
 

+ 4
- 2
irc/modes.go View File

@@ -23,7 +23,9 @@ var (
23 23
 )
24 24
 
25 25
 // ApplyUserModeChanges applies the given changes, and returns the applied changes.
26
-func ApplyUserModeChanges(client *Client, changes modes.ModeChanges, force bool) modes.ModeChanges {
26
+// `oper` is the operclass of the client gaining +o, when applicable (this is just
27
+// to confirm that the client actually has a valid operclass)
28
+func ApplyUserModeChanges(client *Client, changes modes.ModeChanges, force bool, oper *Oper) modes.ModeChanges {
27 29
 	applied := make(modes.ModeChanges, 0)
28 30
 
29 31
 	for _, change := range changes {
@@ -31,7 +33,7 @@ func ApplyUserModeChanges(client *Client, changes modes.ModeChanges, force bool)
31 33
 		case modes.Bot, modes.Invisible, modes.WallOps, modes.UserRoleplaying, modes.Operator, modes.LocalOperator, modes.RegisteredOnly:
32 34
 			switch change.Op {
33 35
 			case modes.Add:
34
-				if !force && (change.Mode == modes.Operator || change.Mode == modes.LocalOperator) {
36
+				if (change.Mode == modes.Operator || change.Mode == modes.LocalOperator) && !(force && oper != nil) {
35 37
 					continue
36 38
 				}
37 39
 

Loading…
Cancel
Save