]>
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 | } |
7e29b9d9 VP |
16 | $can_ban = current_user_can(PERMISSION_BAN_USERS); |
17 | if (!empty($_POST) && $can_ban) | |
65a14aac | 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"> |
78142aba BM |
88 | <form method="post"> |
89 | ||
5485abb5 | 90 | <!-- The user list --> |
3237ef94 | 91 | <table id="data_list" class="table-striped display responsive nowrap" style="width:100%"> |
c69491f1 | 92 | <thead class="table-primary"> |
b111d43c | 93 | <th scope="col"><input type="checkbox" label='selectall' onClick="toggle_user(this)" /></th> |
d1d9caa9 | 94 | <th scope="col">Nick</th> |
729a16a0 | 95 | <th class="countrycol" scope="col">Country</th> |
d75f6d14 | 96 | <th class="hostname" scope="col">Host / IP</th> |
729a16a0 | 97 | <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> |
d75f6d14 | 98 | <th class="opercol" scope="col">Oper</th> |
d75f6d14 | 99 | <th class="uplinkcol" scope="col">Connected to</th> |
729a16a0 | 100 | <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 | 101 | </thead> |
5485abb5 | 102 | </table> |
e98b5a51 | 103 | |
5485abb5 | 104 | <!-- User Actions --> |
d1d9caa9 VP |
105 | <table class="table table-responsive table-light"> |
106 | <tr> | |
7e29b9d9 VP |
107 | <td colspan="2" class="<?php echo $can_ban ? "" : "disabled"?>"> |
108 | <label for="bantype">Apply action: </label> | |
109 | <select name="bantype" id="bantype"> | |
110 | <option value=""></option> | |
111 | <optgroup label="Bans"> | |
112 | <option value="gline">GLine</option> | |
113 | <option value="gzline">GZLine</option> | |
114 | <option value="kill">Kill</option> | |
115 | </optgroup> | |
116 | </select></td><td colspan="2"> | |
117 | <label for="banlen_w">Duration: </label> | |
118 | <select name="banlen_w" id="banlen_w"> | |
119 | <?php | |
120 | for ($i = 0; $i <= 56; $i++) | |
e98b5a51 | 121 | { |
7e29b9d9 VP |
122 | if (!$i) |
123 | echo "<option value=\"0w\"></option>"; | |
124 | else | |
125 | { | |
126 | $w = ($i == 1) ? "week" : "weeks"; | |
127 | echo "<option value=\"$i" . "w\">$i $w" . "</option>"; | |
128 | } | |
e98b5a51 | 129 | } |
7e29b9d9 VP |
130 | ?> |
131 | </select> | |
132 | <select name="banlen_d" id="banlen_d"> | |
133 | <?php | |
134 | for ($i = 0; $i <= 31; $i++) | |
e98b5a51 | 135 | { |
7e29b9d9 VP |
136 | if (!$i) |
137 | echo "<option value=\"0d\"></option>"; | |
138 | else | |
139 | { | |
140 | $d = ($i == 1) ? "day" : "days"; | |
141 | echo "<option value=\"$i" . "d\">$i $d" . "</option>"; | |
142 | } | |
e98b5a51 | 143 | } |
7e29b9d9 VP |
144 | ?> |
145 | </select> | |
146 | <select name="banlen_h" id="banlen_h"> | |
147 | <?php | |
148 | for ($i = 0; $i <= 24; $i++) | |
e98b5a51 | 149 | { |
7e29b9d9 VP |
150 | if (!$i) |
151 | echo "<option value=\"0d\"></option>"; | |
152 | else | |
153 | { | |
154 | $h = ($i == 1) ? "hour" : "hours"; | |
155 | echo "<option value=\"$i" . "h\">$i $h" . "</option>"; | |
156 | } | |
e98b5a51 | 157 | } |
7e29b9d9 VP |
158 | |
159 | ?> | |
160 | </select> | |
161 | ||
162 | <br> | |
163 | </td> | |
164 | <tr><td colspan="3"> | |
d1d9caa9 VP |
165 | |
166 | <label for="ban_reason">Reason: </label> | |
7e29b9d9 VP |
167 | <input class="form-control <?php echo $can_ban ? "" : "disabled"?>" type="text" name="ban_reason" id="ban_reason" value="No reason"> |
168 | <button type="button" class="btn btn-primary <?php echo $can_ban ? "" : "disabled"?>" data-toggle="modal" data-target="#ban_confirmation"> | |
0b546dde | 169 | Apply |
d1d9caa9 | 170 | </button></td></table> |
8e3bf75e BM |
171 | |
172 | <!-- Ban confirmation modal --> | |
173 | <div class="modal fade" id="ban_confirmation" tabindex="-1" role="dialog" aria-labelledby="confirmModalCenterTitle" aria-hidden="true"> | |
d1d9caa9 VP |
174 | <div class="modal-dialog modal-dialog-centered" role="document"> |
175 | <div class="modal-content"> | |
176 | <div class="modal-header"> | |
8e3bf75e | 177 | <h5 class="modal-title" id="ban_confirmation_label">Apply ban</h5> |
d1d9caa9 VP |
178 | <button type="button" class="close" data-dismiss="modal" aria-label="Close"> |
179 | <span aria-hidden="true">×</span> | |
180 | </button> | |
181 | </div> | |
182 | <div class="modal-body"> | |
183 | Are you sure you want to do this? | |
184 | ||
185 | </div> | |
186 | <div class="modal-footer"> | |
187 | <button id="CloseButton" type="button" class="btn btn-secondary" data-dismiss="modal">Cancel</button> | |
0b546dde | 188 | <button type="submit" action="post" class="btn btn-danger">Apply</button> |
d1d9caa9 VP |
189 | |
190 | </div> | |
191 | </div> | |
192 | </div> | |
193 | </div> | |
194 | ||
e98b5a51 | 195 | </form> |
d91b75a2 | 196 | |
4fa72795 VP |
197 | <style> |
198 | #rclickmenu { | |
199 | position: fixed; | |
200 | z-index: 10000; | |
201 | width: 250px; | |
202 | background: #1b1a1a; | |
203 | border-radius: 5px; | |
cd5d0af0 VP |
204 | transform: scale(0); |
205 | transform-origin: top left; | |
4fa72795 VP |
206 | } |
207 | #rclickmenu.visible { | |
cd5d0af0 VP |
208 | transform: scale(1); |
209 | transition: transform 120ms ease-in-out; | |
4fa72795 VP |
210 | } |
211 | #rclickmenu .item { | |
212 | padding: 8px 10px; | |
213 | font-size: 15px; | |
214 | color: #eee; | |
215 | cursor: pointer; | |
216 | border-radius: inherit; | |
217 | } | |
218 | #rclickmenu .item:hover { | |
219 | background: #343434; | |
220 | text-decoration: none; | |
221 | } | |
222 | </style> | |
223 | ||
cd5d0af0 | 224 | <div id='rclickmenu' class="nav-item list-group"> |
4fa72795 VP |
225 | <div id="rclick_opt1" class="item list-group-item-action">View details</div> |
226 | <div id="rclick_opt2" class="item list-group-item-action">Kill</div> | |
cd5d0af0 | 227 | <div id="rclick_opt3" class="item list-group-item-action">Copy |
4fa72795 | 228 | </div> |
d91b75a2 | 229 | </div> |
d1d9caa9 VP |
230 | |
231 | <script> | |
4fa72795 VP |
232 | var rclickmenu = document.getElementById('rclickmenu'); |
233 | var scopes = document.querySelectorAll('.userselector'); | |
cd5d0af0 | 234 | document.addEventListener("click", (e) => |
4fa72795 | 235 | { |
cd5d0af0 VP |
236 | if (e.target.offsetParent != rclickmenu) |
237 | { | |
238 | rclickmenu.classList.remove("visible"); | |
239 | } | |
4fa72795 VP |
240 | }); |
241 | scopes.forEach((scope) => { | |
242 | scope.addEventListener("contextmenu", (event) => | |
243 | { | |
244 | event.preventDefault(); | |
245 | var { clientX: mouseX, clientY: mouseY } = event; | |
246 | var name = $('#' + scope.id).attr('value') | |
cd5d0af0 | 247 | document.getElementById("rclick_opt1").innerHTML = 'View details for ' + name; |
4fa72795 VP |
248 | rclickmenu.style.top = `${mouseY}px`; |
249 | rclickmenu.style.left = `${mouseX}px`; | |
cd5d0af0 VP |
250 | rclickmenu.classList.remove("visible"); |
251 | setTimeout(() => { rclickmenu.classList.add("visible"); }); | |
4fa72795 | 252 | }); |
4fa72795 | 253 | }); |
cd5d0af0 VP |
254 | document.addEventListener('keydown', (event) => { |
255 | if (event.key === 'Escape') | |
256 | { | |
257 | rclickmenu.classList.remove("visible"); | |
258 | } | |
259 | }); | |
5485abb5 BM |
260 | |
261 | $(document).ready( function () { | |
8ee706e7 | 262 | args = { |
883b1cdf BM |
263 | 'responsive': true, |
264 | 'fixedHeader': { | |
265 | header: true, | |
266 | headerOffset: 53 | |
267 | }, | |
5485abb5 BM |
268 | 'ajax': { |
269 | 'url': '<?php echo get_config("base_url"); ?>api/users.php', | |
270 | dataSrc: '' | |
271 | }, | |
272 | 'pageLength':100, | |
273 | 'order':[[1,'asc']], | |
5485abb5 | 274 | 'columns': [ |
883b1cdf BM |
275 | { 'data': 'Select', 'responsivePriority': 1 }, |
276 | { 'data': 'Nick', 'responsivePriority': 1 }, | |
277 | { 'data': 'Country', 'className':'countrycol', 'responsivePriority': 2 }, | |
278 | { 'data': 'Host/IP', 'className':'hostname', 'responsivePriority': 5 }, | |
279 | { 'data': 'Account', 'className':'accountcol', 'responsivePriority': 3 }, | |
883b1cdf | 280 | { 'data': 'Oper', 'className':'opercol', 'responsivePriority': 8 }, |
883b1cdf BM |
281 | { 'data': 'Connected to', 'className':'uplinkcol', 'responsivePriority': 6 }, |
282 | { 'data': 'Reputation', 'className':'reputationcol', 'responsivePriority': 4 }, | |
5485abb5 | 283 | ], |
8ee706e7 BM |
284 | }; |
285 | /* Hide on mobile */ | |
286 | if (window.innerWidth > 800) | |
287 | { | |
288 | args['dom'] = 'Pfrtip'; | |
289 | args['searchPanes'] = { | |
290 | 'initCollapsed': 'true', | |
53c32621 | 291 | 'columns': [2,6], |
8ee706e7 BM |
292 | 'dtOpts': { |
293 | select: { style: 'multi'}, | |
294 | order: [[ 1, "desc" ]] | |
295 | }, | |
296 | } | |
297 | } | |
298 | ||
299 | $('#data_list').DataTable(args); | |
5485abb5 BM |
300 | } ); |
301 | ||
d1d9caa9 | 302 | </script> |
e98b5a51 | 303 | |
c06c1713 | 304 | <?php require_once UPATH.'/inc/footer.php'; ?> |