|
@@ -1,4 +1,4 @@
|
1
|
|
-// Copyright (c) 2017 Daniel Oaks <daniel@danieloaks.net>
|
|
1
|
+// Copyright (c) 2018 Shivaram Lingamneni <slingamn@cs.stanford.edu>
|
2
|
2
|
// released under the MIT license
|
3
|
3
|
|
4
|
4
|
package irc
|
|
@@ -26,16 +26,16 @@ var (
|
26
|
26
|
errVHostBadCharacters = errors.New("Vhost contains prohibited characters")
|
27
|
27
|
errVHostTooLong = errors.New("Vhost is too long")
|
28
|
28
|
// ascii only for now
|
29
|
|
- validVhostRegex = regexp.MustCompile(`^[0-9A-Za-z.\-_/]+$`)
|
|
29
|
+ defaultValidVhostRegex = regexp.MustCompile(`^[0-9A-Za-z.\-_/]+$`)
|
30
|
30
|
)
|
31
|
31
|
|
32
|
32
|
func hostservEnabled(server *Server) bool {
|
33
|
|
- return server.AccountConfig().HostServ.Enabled
|
|
33
|
+ return server.AccountConfig().VHosts.Enabled
|
34
|
34
|
}
|
35
|
35
|
|
36
|
36
|
func hostservRequestsEnabled(server *Server) bool {
|
37
|
37
|
ac := server.AccountConfig()
|
38
|
|
- return ac.HostServ.Enabled && ac.HostServ.UserRequestsEnabled
|
|
38
|
+ return ac.VHosts.Enabled && ac.VHosts.UserRequests.Enabled
|
39
|
39
|
}
|
40
|
40
|
|
41
|
41
|
var (
|
|
@@ -84,7 +84,7 @@ request for a new one.`,
|
84
|
84
|
|
85
|
85
|
SET sets a user's vhost, bypassing the request system.`,
|
86
|
86
|
helpShort: `$bSET$b sets a user's vhost.`,
|
87
|
|
- capabs: []string{"hostserv"},
|
|
87
|
+ capabs: []string{"vhosts"},
|
88
|
88
|
enabled: hostservEnabled,
|
89
|
89
|
},
|
90
|
90
|
"del": {
|
|
@@ -93,7 +93,7 @@ SET sets a user's vhost, bypassing the request system.`,
|
93
|
93
|
|
94
|
94
|
DEL sets a user's vhost, bypassing the request system.`,
|
95
|
95
|
helpShort: `$bDEL$b deletes a user's vhost.`,
|
96
|
|
- capabs: []string{"hostserv"},
|
|
96
|
+ capabs: []string{"vhosts"},
|
97
|
97
|
enabled: hostservEnabled,
|
98
|
98
|
},
|
99
|
99
|
"waiting": {
|
|
@@ -103,7 +103,7 @@ DEL sets a user's vhost, bypassing the request system.`,
|
103
|
103
|
WAITING shows a list of pending vhost requests, which can then be approved
|
104
|
104
|
or rejected.`,
|
105
|
105
|
helpShort: `$bWAITING$b shows a list of pending vhost requests.`,
|
106
|
|
- capabs: []string{"hostserv"},
|
|
106
|
+ capabs: []string{"vhosts"},
|
107
|
107
|
enabled: hostservEnabled,
|
108
|
108
|
},
|
109
|
109
|
"approve": {
|
|
@@ -112,7 +112,7 @@ or rejected.`,
|
112
|
112
|
|
113
|
113
|
APPROVE approves a user's vhost request.`,
|
114
|
114
|
helpShort: `$bAPPROVE$b approves a user's vhost request.`,
|
115
|
|
- capabs: []string{"hostserv"},
|
|
115
|
+ capabs: []string{"vhosts"},
|
116
|
116
|
enabled: hostservEnabled,
|
117
|
117
|
},
|
118
|
118
|
"reject": {
|
|
@@ -122,7 +122,7 @@ APPROVE approves a user's vhost request.`,
|
122
|
122
|
REJECT rejects a user's vhost request, optionally giving them a reason
|
123
|
123
|
for the rejection.`,
|
124
|
124
|
helpShort: `$bREJECT$b rejects a user's vhost request.`,
|
125
|
|
- capabs: []string{"hostserv"},
|
|
125
|
+ capabs: []string{"vhosts"},
|
126
|
126
|
enabled: hostservEnabled,
|
127
|
127
|
},
|
128
|
128
|
}
|
|
@@ -133,13 +133,26 @@ func hsNotice(rb *ResponseBuffer, text string) {
|
133
|
133
|
rb.Add(nil, "HostServ", "NOTICE", rb.target.Nick(), text)
|
134
|
134
|
}
|
135
|
135
|
|
|
136
|
+// hsNotifyChannel notifies the designated channel of new vhost activity
|
|
137
|
+func hsNotifyChannel(server *Server, message string) {
|
|
138
|
+ chname := server.AccountConfig().VHosts.UserRequests.Channel
|
|
139
|
+ channel := server.channels.Get(chname)
|
|
140
|
+ if channel == nil {
|
|
141
|
+ return
|
|
142
|
+ }
|
|
143
|
+ chname = channel.Name()
|
|
144
|
+ for _, client := range channel.Members() {
|
|
145
|
+ client.Send(nil, "HostServ", "PRIVMSG", chname, message)
|
|
146
|
+ }
|
|
147
|
+}
|
|
148
|
+
|
136
|
149
|
func hsOnOffHandler(server *Server, client *Client, command, params string, rb *ResponseBuffer) {
|
137
|
150
|
enable := false
|
138
|
151
|
if command == "on" {
|
139
|
152
|
enable = true
|
140
|
153
|
}
|
141
|
154
|
|
142
|
|
- err := server.accounts.VHostSetEnabled(client, enable)
|
|
155
|
+ _, err := server.accounts.VHostSetEnabled(client, enable)
|
143
|
156
|
if err != nil {
|
144
|
157
|
hsNotice(rb, client.t("An error occurred"))
|
145
|
158
|
} else if enable {
|
|
@@ -163,7 +176,7 @@ func hsRequestHandler(server *Server, client *Client, command, params string, rb
|
163
|
176
|
return
|
164
|
177
|
}
|
165
|
178
|
elapsed := time.Now().Sub(account.VHost.LastRequestTime)
|
166
|
|
- remainingTime := server.AccountConfig().HostServ.Cooldown - elapsed
|
|
179
|
+ remainingTime := server.AccountConfig().VHosts.UserRequests.Cooldown - elapsed
|
167
|
180
|
// you can update your existing request, but if you were rejected,
|
168
|
181
|
// you can't spam a replacement request
|
169
|
182
|
if account.VHost.RequestedVHost == "" && remainingTime > 0 {
|
|
@@ -171,11 +184,13 @@ func hsRequestHandler(server *Server, client *Client, command, params string, rb
|
171
|
184
|
return
|
172
|
185
|
}
|
173
|
186
|
|
174
|
|
- err = server.accounts.VHostRequest(accountName, vhost)
|
|
187
|
+ _, err = server.accounts.VHostRequest(accountName, vhost)
|
175
|
188
|
if err != nil {
|
176
|
189
|
hsNotice(rb, client.t("An error occurred"))
|
177
|
190
|
} else {
|
178
|
191
|
hsNotice(rb, fmt.Sprintf(client.t("Your vhost request will be reviewed by an administrator")))
|
|
192
|
+ chanMsg := fmt.Sprintf("Account %s requests vhost %s", accountName, vhost)
|
|
193
|
+ hsNotifyChannel(server, chanMsg)
|
179
|
194
|
// TODO send admins a snomask of some kind
|
180
|
195
|
}
|
181
|
196
|
}
|
|
@@ -208,10 +223,10 @@ func hsStatusHandler(server *Server, client *Client, command, params string, rb
|
208
|
223
|
|
209
|
224
|
func validateVhost(server *Server, vhost string, oper bool) error {
|
210
|
225
|
ac := server.AccountConfig()
|
211
|
|
- if len(vhost) > ac.HostServ.MaxVHostLen {
|
|
226
|
+ if len(vhost) > ac.VHosts.MaxLength {
|
212
|
227
|
return errVHostTooLong
|
213
|
228
|
}
|
214
|
|
- if !ac.HostServ.ValidRegexp.MatchString(vhost) {
|
|
229
|
+ if !ac.VHosts.ValidRegexp.MatchString(vhost) {
|
215
|
230
|
return errVHostBadCharacters
|
216
|
231
|
}
|
217
|
232
|
return nil
|
|
@@ -235,7 +250,7 @@ func hsSetHandler(server *Server, client *Client, command, params string, rb *Re
|
235
|
250
|
return
|
236
|
251
|
}
|
237
|
252
|
|
238
|
|
- err := server.accounts.VHostSet(user, vhost)
|
|
253
|
+ _, err := server.accounts.VHostSet(user, vhost)
|
239
|
254
|
if err != nil {
|
240
|
255
|
hsNotice(rb, client.t("An error occurred"))
|
241
|
256
|
} else if vhost != "" {
|
|
@@ -260,11 +275,13 @@ func hsApproveHandler(server *Server, client *Client, command, params string, rb
|
260
|
275
|
return
|
261
|
276
|
}
|
262
|
277
|
|
263
|
|
- err := server.accounts.VHostApprove(user)
|
|
278
|
+ vhostInfo, err := server.accounts.VHostApprove(user)
|
264
|
279
|
if err != nil {
|
265
|
280
|
hsNotice(rb, client.t("An error occurred"))
|
266
|
281
|
} else {
|
267
|
282
|
hsNotice(rb, fmt.Sprintf(client.t("Successfully approved vhost request for %s"), user))
|
|
283
|
+ chanMsg := fmt.Sprintf("Oper %s approved vhost %s for account %s", client.Nick(), vhostInfo.ApprovedVHost, user)
|
|
284
|
+ hsNotifyChannel(server, chanMsg)
|
268
|
285
|
for _, client := range server.accounts.AccountToClients(user) {
|
269
|
286
|
client.Notice(client.t("Your vhost request was approved by an administrator"))
|
270
|
287
|
}
|
|
@@ -279,11 +296,13 @@ func hsRejectHandler(server *Server, client *Client, command, params string, rb
|
279
|
296
|
}
|
280
|
297
|
reason := strings.TrimSpace(params)
|
281
|
298
|
|
282
|
|
- err := server.accounts.VHostReject(user, reason)
|
|
299
|
+ vhostInfo, err := server.accounts.VHostReject(user, reason)
|
283
|
300
|
if err != nil {
|
284
|
301
|
hsNotice(rb, client.t("An error occurred"))
|
285
|
302
|
} else {
|
286
|
303
|
hsNotice(rb, fmt.Sprintf(client.t("Successfully rejected vhost request for %s"), user))
|
|
304
|
+ chanMsg := fmt.Sprintf("Oper %s rejected vhost %s for account %s, with the reason: %v", client.Nick(), vhostInfo.RejectedVHost, user, reason)
|
|
305
|
+ hsNotifyChannel(server, chanMsg)
|
287
|
306
|
for _, client := range server.accounts.AccountToClients(user) {
|
288
|
307
|
if reason == "" {
|
289
|
308
|
client.Notice("Your vhost request was rejected by an administrator")
|