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