]> jfr.im git - irc/unrealircd/unrealircd-webpanel.git/blame - index.php
Security: check passwords against Have I Been Pwned
[irc/unrealircd/unrealircd-webpanel.git] / index.php
CommitLineData
709b97f3 1<?php
c06c1713 2require_once "inc/common.php";
9a005fe5 3require_once "Classes/class-checkup.php";
41aad10c 4if (!isset($config['unrealircd']))
d8ad4cea 5{
1a6051db 6 $redirect = get_config("base_url")."settings/rpc-servers.php";
d8ad4cea
BM
7 header('Location: ' . $redirect);
8 die;
9}
10
c06c1713 11require_once "inc/header.php";
26971737 12
709b97f3 13?>
3737447f 14<div class="row ml-0">
c0abb0e6 15 <h2>Network Overview</h2>
9a005fe5
VP
16 <span class="badge bg-danger text-light ml-4 pl-2 pr-2 rounded-pill" style="height:fit-content">LIVE</span>
17 <?php checkup_widget(); ?>
c0abb0e6 18 </div>
bdf7619a 19<?php
9a4a88b5 20$array_of_stats = [];
bdf7619a
VP
21/* What if someone wants to add their own stats... */
22Hook::run(HOOKTYPE_PRE_OVERVIEW_CARD, $array_of_stats);
23
24/* This makes sure that a plugin which called the parameter
25 * by reference can add/update the stats for display here.
26*/
27$stats = (object) $array_of_stats;
4fc503d8
VP
28$userlist = [];
29Hook::run(HOOKTYPE_GET_USER_LIST, $userlist);
30$num_of_panel_admins = count($userlist);
579020f8
VP
31$current_user = unreal_get_current_user();
32if (isset($current_user->user_meta['hibp']))
33{
34 $num = $current_user->user_meta['hibp'];
35 Message::Fail("<h6><strong>Urgent</strong></h6>","Your password was found in a data breach $num time(s).",
36 "Please <strong><a href=\"".get_config("base_url")."settings/user-edit.php\">update your password</a></strong> immediately");
37}
bdf7619a 38?>
e76c47e1 39<style>
579020f8
VP
40 .alert {
41 margin-left: 20px;
42 width:94%;
43 max-width: 500px;
44 }
9a005fe5
VP
45 #health_banner {
46 margin-left:20px;
e6537405 47 border-radius: 16px;
9a005fe5
VP
48 width:fit-content;
49 }
e6537405
VP
50 .card-container a.card:hover { opacity: 0.8; transition: opacity 0.2s ease-in-out; }
51 .card-container .card {
b692ffa7
VP
52 min-height: 80%;
53 border-radius: 16px;
e76c47e1 54 }
9a005fe5
VP
55 body {
56 background-image: url('https://cdn.wallpapersafari.com/34/98/yznZmQ.jpg');
57 background-size: cover;
58 }
e6537405 59 .card-container .card-body i {
b692ffa7
VP
60 position: fixed;
61 top: 10px;
62 right: 10px;
63 }
e6537405 64 .card-container .card:hover {
b692ffa7
VP
65 text-decoration: none;
66 }
67
9a005fe5
VP
68 @keyframes rotateEffect {
69 0% { transform: rotateX(0deg); }
70 50% { transform: rotateX(180deg); }
71 100% { transform: rotateX(0deg); }
72 }
73
74 .numberDisplay {
75 animation: rotateEffect 0.5s ease;
76 }
b692ffa7
VP
77
78 .frosted-glass-success {
79 /* From https://css.glass */
80 background: rgba(63, 162, 36, 0.73);
81 box-shadow: 0 4px 30px rgba(0, 0, 0, 0.1);
82 backdrop-filter: blur(9.8px);
83 -webkit-backdrop-filter: blur(9.8px);
84 }
85 .frosted-glass-info {
86 /* From https://css.glass */
87 background: rgba(57, 127, 207, 0.73);
88 box-shadow: 0 4px 30px rgba(0, 0, 0, 0.1);
89 backdrop-filter: blur(9.8px);
90 -webkit-backdrop-filter: blur(9.8px);
91 }
92 .frosted-glass-danger {
93 /* From https://css.glass */
94 background: rgba(207, 57, 57, 0.73);
95 box-shadow: 0 4px 30px rgba(0, 0, 0, 0.1);
96 backdrop-filter: blur(9.8px);
97 -webkit-backdrop-filter: blur(9.8px);
98 }
99 .frosted-glass-warning {
100 /* From https://css.glass */
101 background: rgba(207, 194, 57, 0.73);
102 box-shadow: 0 4px 30px rgba(0, 0, 0, 0.1);
103 backdrop-filter: blur(9.8px);
104 -webkit-backdrop-filter: blur(9.8px);
105 }
106 .frosted-glass-secondary {
107 /* From https://css.glass */
108 background: rgba(75, 75, 75, 0.73);
109 box-shadow: 0 4px 30px rgba(0, 0, 0, 0.1);
110 backdrop-filter: blur(9.8px);
111 -webkit-backdrop-filter: blur(9.8px);
112 }
113
e76c47e1 114 </style>
e6537405 115 <div class="container card-container ml-1">
440ff671 116
e6537405
VP
117 <div class="row mt-3">
118 <div class="col-sm mb-3">
119 <a class="card frosted-glass-success text-center" href="<?php echo get_config("base_url"); ?>users/">
120 <div class="card-body text-white">
121 <div class="row text-center">
122 <span id="userRecord" class="position-absolute badge rounded-pill badge-warning" hidden>
123 <?php echo "Record: "; ?>
124 </span>
125 <div class="col">
126 <div class="col">
127 <i aria-hidden="true" class="fa fa-users fa-2x"></i>
128 </div>
129 <div class="col">
130 <h5 id="stats_user_total" class="display-4 numberDisplay"></h5>
131 <h5 class="display-5">Users Online</h5>
132 </div>
133 </div>
b692ffa7 134 </div>
75c101fd 135 </div>
e6537405 136 </a>
75c101fd 137 </div>
e6537405
VP
138 <div class="col-sm mb-3">
139 <a class="card frosted-glass-info text-center" href="<?php echo get_config("base_url"); ?>channels/">
140 <div class="card-body text-white">
141 <div class="row text-center">
142 <div class="col">
143 <div class="col">
144 <i aria-hidden="true" class="fa fa-hashtag fa-2x"></i>
145 </div>
146 <div class="col">
147 <h5 id="stats_channel_total" class="display-4 numberDisplay"></h5>
148 <h5 class="display-5">Channels</h5>
149 </div>
150 </div>
b692ffa7 151 </div>
ce8122f0 152 </div>
e6537405 153 </a>
ce8122f0 154 </div>
e6537405
VP
155 <div class="col-sm mb-3">
156 <a class="card frosted-glass-warning text-center" href="<?php echo get_config("base_url"); ?>users/">
157 <div class="card-body text-dark">
158 <div class="row text-center">
159 <div class="col">
160 <div class="col">
161 <i aria-hidden="true" class="fa fa-shield-halved fa-2x"></i>
162 </div>
163 <div class="col">
164 <h5 id="stats_oper_total" class="display-4 numberDisplay"></h5>
165 <h5 class="display-5" style="margin-top: -3px">Operators</h5>
166 <h5 style="font-size: 10px; margin-top:-12px">View in Users ></h5>
167 </div>
168 </div>
b692ffa7 169 </div>
ce8122f0 170 </div>
e6537405 171 </a>
ce8122f0 172 </div>
e6537405
VP
173 <div class="col-sm mb-3">
174 <a class="card frosted-glass-secondary text-center" href="<?php echo get_config("base_url"); ?>servers/">
175 <div class="card-body text-white">
176 <div class="row text-center">
177 <div class="col">
178 <div class="col">
179 <i aria-hidden="true" class="fa fa-network-wired fa-2x"></i>
180 </div>
181 <div class="col">
182 <h5 id="stats_server_total" class="display-4 numberDisplay"></h5>
183 <h5 class="display-5">Servers</h5>
184 </div>
185 </div>
b692ffa7 186 </div>
ce8122f0 187 </div>
e6537405 188 </a>
ce8122f0 189 </div>
e6537405 190 </div>
ce8122f0 191 </div>
e6537405 192 <div class="container card-container ml-1">
ce8122f0 193
e6537405
VP
194 <div class="row">
195 <div class="col-sm mb-3">
196 <a class="card frosted-glass-danger text-center" href="<?php echo get_config("base_url"); ?>server-bans/">
197 <div class="card-body text-white">
198 <div class="row text-center">
199 <div class="col">
200 <div class="col">
201 <i aria-hidden="true" class="fa fa-ban fa-2x"></i>
202 </div>
203 <div class="col">
204 <h5 id="num_server_bans" class="display-4 numberDisplay"></h5>
205 <h5 class="display-5">Server Bans</h5>
206 </div>
207 </div>
b692ffa7 208 </div>
ce8122f0 209 </div>
e6537405 210 </a>
ce8122f0 211 </div>
e6537405
VP
212 <div class="col-sm mb-3">
213 <a class="card frosted-glass-secondary text-center" href="<?php echo get_config("base_url"); ?>spamfilter.php/">
214 <div class="card-body text-white">
215 <div class="row text-center">
216 <div class="col">
217 <div class="col">
218 <i aria-hidden="true" class="fa fa-filter fa-2x"></i>
219 </div>
220 <div class="col">
221 <h5 id="num_spamfilter_entries" class="display-4 numberDisplay"></h5>
222 <h5 class="display-5">Spamfilter</h5>
223 </div>
224 </div>
b692ffa7 225 </div>
75c101fd 226 </div>
e6537405 227 </a>
75c101fd 228 </div>
e6537405
VP
229 <div class="col-sm mb-3">
230 <a class="card frosted-glass-info text-center" href="<?php echo get_config("base_url"); ?>server-bans/ban-exceptions.php">
231 <div class="card-body text-white">
232 <div class="row text-center">
233 <div class="col">
234 <div class="col">
235 <i aria-hidden="true" class="fa fa-door-open fa-2x"></i>
236 </div>
237 <div class="col">
238 <h5 id="num_ban_exceptions" class="display-4 numberDisplay"></h5>
239 <h5 class="display-5">Server Ban Exceptions</h5>
240 </div>
241 </div>
b692ffa7 242 </div>
75c101fd 243 </div>
e6537405 244 </a>
75c101fd 245 </div>
e6537405
VP
246 <div class="col-sm mb-3">
247 <a class="card frosted-glass-success text-center" href="<?php echo get_config("base_url"); ?>servers">
248 <div class="card-body text-white">
249 <div class="row text-center">
250 <div class="col">
251 <div class="col">
252 <i aria-hidden="true" class="fa fa-database fa-2x"></i>
253 </div>
254 <div class="col">
255 <h5 id="stats_uline_total" class="display-4 numberDisplay"></h5>
256 <h5 class="display-5" style="margin-top: -3px">Services Online</h5>
257 <h5 style="font-size: 10px; margin-top:-12px">View in Servers ></h5>
258 </div>
259 </div>
b692ffa7 260 </div>
ce8122f0 261 </div>
e6537405 262 </a>
ce8122f0 263 </div>
e6537405 264 </div>
ce8122f0 265 </div>
56164221
VP
266
267<script>
c0abb0e6
BM
268 /* Last time stats were updated */
269 let stats_tick = 0;
270
fd4848e4
BM
271 function updateStats(e)
272 {
273 var data;
274 try {
275 data = JSON.parse(e.data);
276 } catch(e) {
277 return;
278 }
c0abb0e6 279 stats_tick = Date.now()
78dbc2af
VP
280 console.log(data);
281 document.getElementById("userRecord").innerHTML = "Record: "+data.user.record;
fd4848e4 282 document.getElementById("stats_user_total").innerHTML = data.user.total;
9a005fe5
VP
283 document.getElementById("stats_user_total").classList.remove('numberDisplay');
284 document.getElementById("stats_user_total").classList.add('numberDisplay');
fd4848e4
BM
285 document.getElementById("stats_channel_total").innerHTML = data.channel.total;
286 document.getElementById("stats_oper_total").innerHTML = data.user.oper;
287 document.getElementById("stats_server_total").innerHTML = data.server.total;
288 document.getElementById("num_server_bans").innerHTML = data.server_ban.server_ban;
289 document.getElementById("num_spamfilter_entries").innerHTML = data.server_ban.spamfilter;
290 document.getElementById("num_ban_exceptions").innerHTML = data.server_ban.server_ban_exception;
291 document.getElementById("stats_uline_total").innerHTML = data.user.ulined + "/" + data.server.ulined;
292 }
c0abb0e6
BM
293 function checkStatsOutdated()
294 {
295 setTimeout(checkStatsOutdated, 2000);
296 if (Date.now() - stats_tick > 10000)
297 document.getElementById("live_stats").style.visibility = 'hidden';
298 }
299 setTimeout(checkStatsOutdated, 2000);
300
fd4848e4
BM
301 function initStats()
302 {
303 if (!!window.EventSource) {
304 var source = new EventSource('api/overview.php');
305 source.addEventListener('message', updateStats, false);
306 }
307 }
308 initStats();
309 //setInterval(updateStats, 1000); // Update stats every second
310 // ^ commented out but may want to restart initStats() when connection is lost.
711c63bc
VP
311
312
313 window.addEventListener('resize', function() {
314 var containers = document.querySelectorAll('.card-container');
315 var width = window.innerWidth;
316 if (width < 768)
317 {
318 containers.forEach((container) => {
319 container.removeAttribute('style');
320
321 });
322 } else
323 {
324 containers.forEach((container) => {
325 container.style.marginLeft = "40px";
326 container.style.marginTop = "30px";
327
328 });
329 }
330 });
56164221
VP
331</script>
332
b692ffa7 333<div class="container card-container card-container ml-1">
fdc0088f
VP
334
335 <div class="row">
b692ffa7
VP
336 <div class="col-sm mb-3">
337 <a class="card frosted-glass-success text-center" href="<?php echo get_config("base_url"); ?>settings">
338 <div class="card-body text-white">
339 <div class="row text-center">
fdc0088f 340 <div class="col">
b692ffa7
VP
341 <div class="col">
342 <i aria-hidden="true" class="fa fa-lock-open fa-2x"></i>
343 </div>
344 <div class="col">
9a005fe5 345 <h5 class="display-4 numberDisplay"><?php echo $num_of_panel_admins; ?></h5>
b692ffa7
VP
346 <h5 class="display-5">Panel Accounts</h5>
347 </div>
fdc0088f
VP
348 </div>
349 </div>
350 </div>
b692ffa7 351 </a>
fdc0088f 352 </div>
b692ffa7
VP
353 <div class="col-sm mb-3">
354 <a class="card frosted-glass-info text-center" href="<?php echo get_config("base_url"); ?>settings/plugins.php">
355 <div class="card-body text-light">
356 <div class="row text-center">
c9e895e3 357 <div class="col">
b692ffa7
VP
358 <div class="col">
359 <i aria-hidden="true" class="fa fa-plug fa-2x"></i>
360 </div>
361 <div class="col">
9a005fe5 362 <h5 class="display-4 numberDisplay"><?php echo count(Plugins::$list); ?></h5>
b692ffa7
VP
363 <h5 class="display-5">Plugins</h5>
364 </div>
c9e895e3 365 </div>
c9e895e3
VP
366 </div>
367 </div>
b692ffa7 368 </a>
c9e895e3 369 </div>
fdc0088f
VP
370 </div>
371 </div>
809f7483
VP
372<?php
373
440ff671
VP
374Hook::run(HOOKTYPE_OVERVIEW_CARD, $stats);
375
c06c1713 376require_once "inc/footer.php";