]>
Commit | Line | Data |
---|---|---|
e98b5a51 | 1 | <?php |
c06c1713 | 2 | require_once "../inc/common.php"; |
c06c1713 | 3 | require_once "../inc/header.php"; |
e98b5a51 | 4 | |
10102cdc VP |
5 | if (!empty($_GET)) |
6 | { | |
7 | if (isset($_GET['account']) && !isset($_POST['uf_account'])) | |
8 | $_POST['uf_account'] = $_GET['account']; | |
9 | ||
10 | if (isset($_GET['operonly']) && !isset($_POST['operonly'])) | |
11 | $_POST['operonly'] = $_GET['operonly']; | |
65a14aac VP |
12 | |
13 | if (isset($_GET['servicesonly']) && !isset($_POST['servicesonly'])) | |
14 | $_POST['servicesonly'] = $_GET['servicesonly']; | |
10102cdc | 15 | } |
6b218bea | 16 | |
65a14aac VP |
17 | if (!empty($_POST)) |
18 | { | |
8e3bf75e | 19 | require_once "../inc/connection.php"; |
e98b5a51 | 20 | do_log($_POST); |
c68cfb17 | 21 | $bantype = (isset($_POST['bantype'])) ? $_POST['bantype'] : NULL; |
65a14aac | 22 | |
d843c1de | 23 | if (isset($_POST['userch'])) { |
65a14aac VP |
24 | foreach ($_POST["userch"] as $user) |
25 | { | |
d843c1de | 26 | $user = $name = base64_decode($user); |
65a14aac VP |
27 | |
28 | if (!$bantype) /* shouldn't happen? */ | |
29 | { | |
e98b5a51 | 30 | Message::Fail("An error occured"); |
65a14aac VP |
31 | } |
32 | ||
33 | else | |
34 | { | |
d843c1de VP |
35 | $banlen_w = (isset($_POST['banlen_w'])) ? $_POST['banlen_w'] : NULL; |
36 | $banlen_d = (isset($_POST['banlen_d'])) ? $_POST['banlen_d'] : NULL; | |
37 | $banlen_h = (isset($_POST['banlen_h'])) ? $_POST['banlen_h'] : NULL; | |
38 | ||
39 | $duration = ""; | |
40 | if (!$banlen_d && !$banlen_h && !$banlen_w) | |
41 | $duration .= "0"; | |
42 | else { | |
43 | if ($banlen_w) | |
44 | $duration .= $banlen_w; | |
45 | if ($banlen_d) | |
46 | $duration .= $banlen_d; | |
47 | if ($banlen_h) | |
48 | $duration .= $banlen_h; | |
49 | } | |
50 | $user = $rpc->user()->get($user); | |
65a14aac | 51 | |
0d846731 | 52 | if (!$user && $bantype !== "qline") { |
d843c1de | 53 | Message::Fail("Could not find that user: User not online"); |
65a14aac VP |
54 | } |
55 | ||
56 | else | |
57 | { | |
d843c1de VP |
58 | $msg_msg = ($duration == "0" || $duration == "0w0d0h") ? "permanently" : "for " . rpc_convert_duration_string($duration); |
59 | $reason = (isset($_POST['ban_reason'])) ? $_POST['ban_reason'] : "No reason"; | |
65a14aac | 60 | |
0d846731 VP |
61 | if ($bantype == "qline") |
62 | $rpc->nameban()->add($name, $reason, $duration); | |
65a14aac | 63 | |
0b546dde VP |
64 | else if ($bantype == "kill") |
65 | { | |
66 | if ($rpc->user()->kill($user->id, $reason)) | |
67 | Message::Success($user->name . "(*@" . $user->hostname . ") has been killed: $reason"); | |
68 | else | |
69 | Message::Fail("Could not kill $user->name: $rpc->error"); | |
70 | } | |
0d846731 | 71 | else if ($rpc->serverban()->add($user->id, $bantype, $duration, $reason)) |
d843c1de | 72 | Message::Success($user->name . " (*@" . $user->hostname . ") has been $bantype" . "d $msg_msg: $reason"); |
65a14aac | 73 | |
d843c1de VP |
74 | else |
75 | Message::Fail("Could not add $bantype against $name: $rpc->error"); | |
76 | } | |
e98b5a51 | 77 | } |
e98b5a51 BM |
78 | } |
79 | } | |
80 | } | |
81 | ||
e98b5a51 | 82 | ?> |
b111d43c | 83 | <h4>Users Overview</h4> |
d1d9caa9 | 84 | |
62d4ea03 | 85 | Click on a username to view more information. |
e98b5a51 | 86 | |
4fa72795 | 87 | <div class="usertable"> |
d1d9caa9 | 88 | |
e98b5a51 | 89 | <?php |
10102cdc | 90 | |
e98b5a51 BM |
91 | if (isset($_POST['uf_nick']) && strlen($_POST['uf_nick'])) |
92 | Message::Info("Listing users which match nick: \"" . $_POST['uf_nick'] . "\""); | |
93 | ||
94 | if (isset($_POST['uf_ip']) && strlen($_POST['uf_ip'])) | |
95 | Message::Info("Listing users which match IP: \"" . $_POST['uf_ip'] . "\""); | |
96 | ||
97 | if (isset($_POST['uf_host']) && strlen($_POST['uf_host'])) | |
98 | Message::Info("Listing users which match hostmask: \"" . $_POST['uf_host'] . "\""); | |
99 | ||
100 | if (isset($_POST['uf_account']) && strlen($_POST['uf_account'])) | |
101 | Message::Info("Listing users which match account: \"" . $_POST['uf_account'] . "\""); | |
102 | ||
a5400f9a VP |
103 | if (isset($_POST['uf_server']) && strlen($_POST['uf_server'])) |
104 | Message::Info("Listing users connected to servers matching: \"" . $_POST['uf_server'] . "\""); | |
105 | ||
10102cdc | 106 | |
e98b5a51 | 107 | ?> |
b111d43c | 108 | |
5485abb5 BM |
109 | <!-- The user list --> |
110 | <table id="data_list" class="container-xxl table table-sm table-responsive caption-top table-striped"> | |
b111d43c BM |
111 | <thead class="table-primary"> |
112 | <th scope="col"><input type="checkbox" label='selectall' onClick="toggle_user(this)" /></th> | |
d1d9caa9 | 113 | <th scope="col">Nick</th> |
729a16a0 | 114 | <th class="countrycol" scope="col">Country</th> |
d75f6d14 | 115 | <th class="hostname" scope="col">Host / IP</th> |
729a16a0 BM |
116 | <th class="accountcol" scope="col"><span data-toggle="tooltip" data-placement="bottom" title="The services account name, if the user identified to services." style="border-bottom: 1px dotted #000000">Account</span></th> |
117 | <th class="umodescol" scope="col">Usermodes <a href="https://www.unrealircd.org/docs/User_modes" target="_blank">ℹ️</a></th> | |
d75f6d14 VP |
118 | <th class="opercol" scope="col">Oper</th> |
119 | <th class="securecol" scope="col"><span data-toggle="tooltip" data-placement="bottom" title="This shows [Secure] if the user is using SSL/TLS or is on localhost." style="border-bottom: 1px dotted #000000">Secure</span></th> | |
120 | <th class="uplinkcol" scope="col">Connected to</th> | |
729a16a0 | 121 | <th class="reputationcol" scope="col"><span id="reputationheader" data-toggle="tooltip" data-placement="bottom" title="The reputation score gets higher when someone with this IP address has been connected in the past weeks. A low reputation score (like <10) is an indication of a new IP." style="border-bottom: 1px dotted #000000">Rep.</span> <a href="https://www.unrealircd.org/docs/Reputation_score" target="_blank">ℹ️</a></th> |
2bc4c695 | 122 | </thead> |
5485abb5 | 123 | </table> |
e98b5a51 | 124 | |
5485abb5 | 125 | <!-- User Actions --> |
d1d9caa9 VP |
126 | <table class="table table-responsive table-light"> |
127 | <tr> | |
128 | <td colspan="2"> | |
129 | <label for="bantype">Apply action: </label> | |
e98b5a51 BM |
130 | <select name="bantype" id="bantype"> |
131 | <option value=""></option> | |
132 | <optgroup label="Bans"> | |
133 | <option value="gline">GLine</option> | |
134 | <option value="gzline">GZLine</option> | |
0b546dde | 135 | <option value="kill">Kill</option> |
e98b5a51 | 136 | </optgroup> |
d1d9caa9 VP |
137 | </select></td><td colspan="2"> |
138 | <label for="banlen_w">Duration: </label> | |
e98b5a51 BM |
139 | <select name="banlen_w" id="banlen_w"> |
140 | <?php | |
141 | for ($i = 0; $i <= 56; $i++) | |
142 | { | |
143 | if (!$i) | |
144 | echo "<option value=\"0w\"></option>"; | |
145 | else | |
146 | { | |
147 | $w = ($i == 1) ? "week" : "weeks"; | |
148 | echo "<option value=\"$i" . "w\">$i $w" . "</option>"; | |
149 | } | |
150 | } | |
151 | ?> | |
152 | </select> | |
153 | <select name="banlen_d" id="banlen_d"> | |
154 | <?php | |
155 | for ($i = 0; $i <= 31; $i++) | |
156 | { | |
157 | if (!$i) | |
158 | echo "<option value=\"0d\"></option>"; | |
159 | else | |
160 | { | |
161 | $d = ($i == 1) ? "day" : "days"; | |
162 | echo "<option value=\"$i" . "d\">$i $d" . "</option>"; | |
163 | } | |
164 | } | |
165 | ?> | |
166 | </select> | |
167 | <select name="banlen_h" id="banlen_h"> | |
168 | <?php | |
169 | for ($i = 0; $i <= 24; $i++) | |
170 | { | |
171 | if (!$i) | |
172 | echo "<option value=\"0d\"></option>"; | |
173 | else | |
174 | { | |
175 | $h = ($i == 1) ? "hour" : "hours"; | |
176 | echo "<option value=\"$i" . "h\">$i $h" . "</option>"; | |
177 | } | |
178 | } | |
d1d9caa9 | 179 | |
e98b5a51 | 180 | ?> |
0b546dde VP |
181 | </select> |
182 | ||
183 | <br></td><tr><td colspan="3"> | |
d1d9caa9 VP |
184 | |
185 | <label for="ban_reason">Reason: </label> | |
0b546dde | 186 | <input class="form-control" type="text" name="ban_reason" id="ban_reason" value="No reason"> |
8e3bf75e | 187 | <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#ban_confirmation"> |
0b546dde | 188 | Apply |
d1d9caa9 | 189 | </button></td></table> |
8e3bf75e BM |
190 | |
191 | <!-- Ban confirmation modal --> | |
192 | <div class="modal fade" id="ban_confirmation" tabindex="-1" role="dialog" aria-labelledby="confirmModalCenterTitle" aria-hidden="true"> | |
d1d9caa9 VP |
193 | <div class="modal-dialog modal-dialog-centered" role="document"> |
194 | <div class="modal-content"> | |
195 | <div class="modal-header"> | |
8e3bf75e | 196 | <h5 class="modal-title" id="ban_confirmation_label">Apply ban</h5> |
d1d9caa9 VP |
197 | <button type="button" class="close" data-dismiss="modal" aria-label="Close"> |
198 | <span aria-hidden="true">×</span> | |
199 | </button> | |
200 | </div> | |
201 | <div class="modal-body"> | |
202 | Are you sure you want to do this? | |
203 | ||
204 | </div> | |
205 | <div class="modal-footer"> | |
206 | <button id="CloseButton" type="button" class="btn btn-secondary" data-dismiss="modal">Cancel</button> | |
0b546dde | 207 | <button type="submit" action="post" class="btn btn-danger">Apply</button> |
d1d9caa9 VP |
208 | |
209 | </div> | |
210 | </div> | |
211 | </div> | |
212 | </div> | |
213 | ||
e98b5a51 | 214 | </form> |
d91b75a2 | 215 | |
4fa72795 VP |
216 | <style> |
217 | #rclickmenu { | |
218 | position: fixed; | |
219 | z-index: 10000; | |
220 | width: 250px; | |
221 | background: #1b1a1a; | |
222 | border-radius: 5px; | |
cd5d0af0 VP |
223 | transform: scale(0); |
224 | transform-origin: top left; | |
4fa72795 VP |
225 | } |
226 | #rclickmenu.visible { | |
cd5d0af0 VP |
227 | transform: scale(1); |
228 | transition: transform 120ms ease-in-out; | |
4fa72795 VP |
229 | } |
230 | #rclickmenu .item { | |
231 | padding: 8px 10px; | |
232 | font-size: 15px; | |
233 | color: #eee; | |
234 | cursor: pointer; | |
235 | border-radius: inherit; | |
236 | } | |
237 | #rclickmenu .item:hover { | |
238 | background: #343434; | |
239 | text-decoration: none; | |
240 | } | |
241 | </style> | |
242 | ||
cd5d0af0 | 243 | <div id='rclickmenu' class="nav-item list-group"> |
4fa72795 VP |
244 | <div id="rclick_opt1" class="item list-group-item-action">View details</div> |
245 | <div id="rclick_opt2" class="item list-group-item-action">Kill</div> | |
cd5d0af0 | 246 | <div id="rclick_opt3" class="item list-group-item-action">Copy |
4fa72795 | 247 | </div> |
d91b75a2 | 248 | </div> |
d1d9caa9 VP |
249 | |
250 | <script> | |
d75f6d14 VP |
251 | function resize_check() |
252 | { | |
253 | var width = window.innerWidth; | |
729a16a0 BM |
254 | var show_elements = ''; |
255 | var hide_elements = ''; | |
729a16a0 BM |
256 | if (width < 500) |
257 | { | |
258 | show_elements = ''; | |
259 | hide_elements = '.hostname, .opercol, .uplinkcol, .securecol, .umodescol, .countrycol'; | |
260 | } else | |
0046e598 | 261 | if (width < 600) |
729a16a0 | 262 | { |
0046e598 BM |
263 | show_elements = '.countrycol'; |
264 | hide_elements = '.hostname, .opercol, .uplinkcol, .securecol, .umodescol'; | |
265 | } else | |
266 | if (width < 700) | |
267 | { | |
268 | show_elements = '.umodescol, .countrycol'; | |
269 | hide_elements = '.hostname, .opercol, .uplinkcol, .securecol'; | |
270 | } else | |
271 | if (width < 768) | |
272 | { | |
273 | show_elements = '.securecol, .umodescol, .countrycol'; | |
274 | hide_elements = '.hostname, .opercol, .uplinkcol'; | |
275 | } else | |
276 | if (width < 875) | |
277 | { | |
278 | // left nav kicks in at 768+ so need to drop one column between 768..875 | |
279 | show_elements = '.umodescol, .countrycol'; | |
280 | hide_elements = '.hostname, .opercol, .uplinkcol, .securecol'; | |
281 | } else if (width < 1000) | |
282 | { | |
283 | show_elements = '.securecol, .umodescol, .countrycol'; | |
284 | hide_elements = '.hostname, .uplinkcol, .opercol'; | |
285 | } else if (width < 1200) | |
286 | { | |
287 | show_elements = '.opercol, .securecol, .umodescol, .countrycol'; | |
288 | hide_elements = '.hostname, .uplinkcol'; | |
289 | } else if (width < 1550) | |
290 | { | |
291 | show_elements = '.opercol, .uplinkcol, .securecol, .umodescol, .countrycol'; | |
292 | hide_elements = '.hostname'; | |
293 | } else if (width < 1750) | |
294 | { | |
295 | show_elements = '.hostname, .opercol, .securecol, .umodescol, .countrycol'; | |
296 | hide_elements = '.uplinkcol'; | |
297 | } else { | |
298 | show_elements = '.hostname, .opercol, .uplinkcol, .securecol, .umodescol, .countrycol'; | |
299 | hide_elements = ''; | |
729a16a0 | 300 | } |
d75f6d14 | 301 | |
729a16a0 BM |
302 | if (show_elements != '') |
303 | { | |
304 | show_elements=document.querySelectorAll(show_elements); | |
305 | for (let i = 0; i < show_elements.length; i++) | |
306 | show_elements[i].style.display = ''; | |
307 | } | |
d75f6d14 | 308 | |
729a16a0 BM |
309 | if (hide_elements != '') |
310 | { | |
311 | hide_elements=document.querySelectorAll(hide_elements); | |
312 | for (let i = 0; i < hide_elements.length; i++) | |
313 | hide_elements[i].style.display = 'none'; | |
314 | } | |
d75f6d14 VP |
315 | } |
316 | resize_check(); | |
317 | window.addEventListener('resize', function() { | |
318 | resize_check(); | |
319 | }); | |
8e3bf75e | 320 | |
4fa72795 VP |
321 | var rclickmenu = document.getElementById('rclickmenu'); |
322 | var scopes = document.querySelectorAll('.userselector'); | |
cd5d0af0 | 323 | document.addEventListener("click", (e) => |
4fa72795 | 324 | { |
cd5d0af0 VP |
325 | if (e.target.offsetParent != rclickmenu) |
326 | { | |
327 | rclickmenu.classList.remove("visible"); | |
328 | } | |
4fa72795 VP |
329 | }); |
330 | scopes.forEach((scope) => { | |
331 | scope.addEventListener("contextmenu", (event) => | |
332 | { | |
333 | event.preventDefault(); | |
334 | var { clientX: mouseX, clientY: mouseY } = event; | |
335 | var name = $('#' + scope.id).attr('value') | |
cd5d0af0 | 336 | document.getElementById("rclick_opt1").innerHTML = 'View details for ' + name; |
4fa72795 VP |
337 | rclickmenu.style.top = `${mouseY}px`; |
338 | rclickmenu.style.left = `${mouseX}px`; | |
cd5d0af0 VP |
339 | rclickmenu.classList.remove("visible"); |
340 | setTimeout(() => { rclickmenu.classList.add("visible"); }); | |
4fa72795 | 341 | }); |
4fa72795 | 342 | }); |
cd5d0af0 VP |
343 | document.addEventListener('keydown', (event) => { |
344 | if (event.key === 'Escape') | |
345 | { | |
346 | rclickmenu.classList.remove("visible"); | |
347 | } | |
348 | }); | |
5485abb5 BM |
349 | |
350 | $(document).ready( function () { | |
8ee706e7 | 351 | args = { |
5485abb5 BM |
352 | 'ajax': { |
353 | 'url': '<?php echo get_config("base_url"); ?>api/users.php', | |
354 | dataSrc: '' | |
355 | }, | |
356 | 'pageLength':100, | |
357 | 'order':[[1,'asc']], | |
5485abb5 BM |
358 | 'columns': [ |
359 | { 'data': 'Select' }, | |
360 | { 'data': 'Nick' }, | |
8e3bf75e BM |
361 | { 'data': 'Country', 'className':'countrycol' }, |
362 | { 'data': 'Host/IP', 'className':'hostname' }, | |
363 | { 'data': 'Account', 'className':'accountcol' }, | |
364 | { 'data': 'Usermodes', 'className':'umodescol' }, | |
365 | { 'data': 'Oper', 'className':'opercol' }, | |
366 | { 'data': 'Secure', 'className':'securecol' }, | |
367 | { 'data': 'Connected to', 'className':'uplinkcol' }, | |
368 | { 'data': 'Reputation', 'className':'reputationcol' }, | |
5485abb5 | 369 | ], |
8e3bf75e | 370 | 'initComplete': function(settings, json) { resize_check(); }, |
8ee706e7 BM |
371 | }; |
372 | /* Hide on mobile */ | |
373 | if (window.innerWidth > 800) | |
374 | { | |
375 | args['dom'] = 'Pfrtip'; | |
376 | args['searchPanes'] = { | |
377 | 'initCollapsed': 'true', | |
378 | 'columns': [2,8], | |
379 | 'dtOpts': { | |
380 | select: { style: 'multi'}, | |
381 | order: [[ 1, "desc" ]] | |
382 | }, | |
383 | } | |
384 | } | |
385 | ||
386 | $('#data_list').DataTable(args); | |
5485abb5 BM |
387 | } ); |
388 | ||
d1d9caa9 | 389 | </script> |
e98b5a51 | 390 | |
c06c1713 | 391 | <?php require_once UPATH.'/inc/footer.php'; ?> |