|
@@ -16,15 +16,24 @@ import (
|
16
|
16
|
"github.com/oragono/oragono/irc/utils"
|
17
|
17
|
)
|
18
|
18
|
|
19
|
|
-func consumeDuration(params []string, rb *ResponseBuffer) (duration time.Duration, remainingParams []string, err error) {
|
|
19
|
+func consumeDuration(params []string, rb *ResponseBuffer) (duration time.Duration, requireSASL bool, remainingParams []string, err error) {
|
20
|
20
|
remainingParams = params
|
21
|
|
- if 2 <= len(remainingParams) && strings.ToLower(remainingParams[0]) == "duration" {
|
22
|
|
- duration, err = custime.ParseDuration(remainingParams[1])
|
23
|
|
- if err != nil {
|
24
|
|
- rb.Notice(rb.session.client.t("Invalid time duration for NS SUSPEND"))
|
25
|
|
- return
|
|
21
|
+ for {
|
|
22
|
+ if duration == 0 && 2 <= len(remainingParams) && strings.ToLower(remainingParams[0]) == "duration" {
|
|
23
|
+ duration, err = custime.ParseDuration(remainingParams[1])
|
|
24
|
+ if err != nil {
|
|
25
|
+ rb.Notice(rb.session.client.t("Invalid time duration for NS SUSPEND"))
|
|
26
|
+ return
|
|
27
|
+ }
|
|
28
|
+ remainingParams = remainingParams[2:]
|
|
29
|
+ continue
|
|
30
|
+ }
|
|
31
|
+ if !requireSASL && 1 <= len(remainingParams) && strings.ToLower(remainingParams[0]) == "require-sasl" {
|
|
32
|
+ requireSASL = true
|
|
33
|
+ remainingParams = remainingParams[1:]
|
|
34
|
+ continue
|
26
|
35
|
}
|
27
|
|
- remainingParams = remainingParams[2:]
|
|
36
|
+ break
|
28
|
37
|
}
|
29
|
38
|
return
|
30
|
39
|
}
|
|
@@ -139,7 +148,7 @@ func sessionsForCIDR(server *Server, cidr flatip.IPNet, exclude *Session) (sessi
|
139
|
148
|
}
|
140
|
149
|
|
141
|
150
|
func ubanAddHandler(client *Client, target ubanTarget, params []string, rb *ResponseBuffer) bool {
|
142
|
|
- duration, params, err := consumeDuration(params, rb)
|
|
151
|
+ duration, requireSASL, params, err := consumeDuration(params, rb)
|
143
|
152
|
if err != nil {
|
144
|
153
|
return false
|
145
|
154
|
}
|
|
@@ -148,7 +157,7 @@ func ubanAddHandler(client *Client, target ubanTarget, params []string, rb *Resp
|
148
|
157
|
|
149
|
158
|
switch target.banType {
|
150
|
159
|
case ubanCIDR:
|
151
|
|
- ubanAddCIDR(client, target, duration, operReason, rb)
|
|
160
|
+ ubanAddCIDR(client, target, duration, requireSASL, operReason, rb)
|
152
|
161
|
case ubanNickmask:
|
153
|
162
|
ubanAddNickmask(client, target, duration, operReason, rb)
|
154
|
163
|
case ubanNick:
|
|
@@ -158,8 +167,8 @@ func ubanAddHandler(client *Client, target ubanTarget, params []string, rb *Resp
|
158
|
167
|
return false
|
159
|
168
|
}
|
160
|
169
|
|
161
|
|
-func ubanAddCIDR(client *Client, target ubanTarget, duration time.Duration, operReason string, rb *ResponseBuffer) {
|
162
|
|
- err := client.server.dlines.AddNetwork(target.cidr, duration, "", operReason, client.Oper().Name)
|
|
170
|
+func ubanAddCIDR(client *Client, target ubanTarget, duration time.Duration, requireSASL bool, operReason string, rb *ResponseBuffer) {
|
|
171
|
+ err := client.server.dlines.AddNetwork(target.cidr, duration, requireSASL, "", operReason, client.Oper().Name)
|
163
|
172
|
if err == nil {
|
164
|
173
|
rb.Notice(fmt.Sprintf(client.t("Successfully added UBAN for %s"), target.cidr.HumanReadableString()))
|
165
|
174
|
} else {
|