]> jfr.im git - irc/unrealircd/unrealircd-webpanel.git/blob - login/index.php
Add per-user session timeout setting (under Settings 'Accounts' -> select acc).
[irc/unrealircd/unrealircd-webpanel.git] / login / index.php
1 <?php
2 require_once "../common.php";
3
4 $logout = false;
5
6 $redirect = get_config("base_url");
7 if (!empty($_GET['redirect']))
8 {
9 $str = urldecode($_GET['redirect']);
10 if (str_starts_with($str, get_config("base_url"))) // prevent redirects to like https://othersite/
11 $redirect = $_GET['redirect'];
12 }
13
14 $redirect = (isset($_GET['redirect'])) ? $_GET['redirect'] : get_config("base_url");
15 if (!empty($_GET['logout']))
16 {
17 if (!isset($_SESSION['id']))
18 $failmsg = "Nothing to logout from";
19 else {
20 $_SESSION = NULL;
21 session_destroy();
22 $logout = true;
23 }
24 }
25 if (!empty($_GET['timeout']))
26 {
27 $failmsg = "Your session has timed out. Please login again to continue";
28 $_SESSION = NULL;
29 session_destroy();
30 }
31 if (!empty($_POST))
32 {
33 if ($_POST['username'] && $_POST['password'])
34 {
35 $user = new PanelUser($_POST['username']);
36 /* not being too informative with the login error in case of attackers */
37 if (isset($user->id) && $user->password_verify($_POST['password']))
38 {
39 /* SUCCESSFUL LOGIN */
40 panel_start_session($user);
41 $_SESSION['id'] = $user->id;
42 $user->add_meta("last_login", date("Y-m-d H:i:s"));
43 Hook::run(HOOKTYPE_USER_LOGIN, $user);
44
45 /* Middle of install? Override redirect: */
46 if (!isset($config['unrealircd']) || empty($config['unrealircd']['host']))
47 $redirect = get_config("base_url")."settings/install2.php";
48 header('Location: ' . $redirect);
49 die();
50 }
51 else
52 {
53 /* LOGIN FAILED */
54 $fail = [
55 "login" => htmlspecialchars($_POST['username']),
56 "IP" => $_SERVER['REMOTE_ADDR']
57 ];
58 Hook::run(HOOKTYPE_USER_LOGIN_FAIL, $fail);
59 $failmsg = "Incorrect login";
60 }
61
62 }
63 else
64 $failmsg = "Couldn't log you in: Missing credentials";
65 }
66
67 ?><!DOCTYPE html>
68 <head>
69 <link href="<?php echo get_config("base_url"); ?>css/unrealircd-admin.css" rel="stylesheet">
70 <script src="<?php echo get_config("base_url"); ?>js/unrealircd-admin.js"></script>
71 <!-- Latest compiled and minified CSS -->
72 <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css">
73
74 <!-- jQuery library -->
75 <script src="https://cdn.jsdelivr.net/npm/jquery@3.6.1/dist/jquery.slim.min.js"></script>
76
77 <!-- Popper JS -->
78 <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
79
80 <!-- Latest compiled JavaScript -->
81 <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.bundle.min.js"></script>
82
83 <!-- Font Awesome icons -->
84 <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.1/css/all.min.css">
85
86 <link rel="icon" type="image/x-icon" href="<?php echo get_config("base_url"); ?>img/favicon.ico">
87 <title>UnrealIRCd Panel</title>
88 </head>
89 <section class="vh-100">
90 <div class="container py-5 h-10">
91 <div class="row d-flex justify-content-center align-items-center h-100">
92 <div class="col-12 col-md-8 col-lg-6 col-xl-5">
93 <div class="card shadow-2-strong" style="border-radius: 1rem;">
94 <div class="card-body p-5 text-center">
95 <form id="login" method="post" action="index.php?redirect=<?php echo $redirect; ?>">
96 <h3><img src="<?php echo get_config("base_url"); ?>img/favicon.ico"> Log in to use Admin Panel</h3>
97
98 <?php
99 if (isset($failmsg)) Message::Fail($failmsg);
100 if ($logout)
101 Message::Success("You have been logged out");
102 ?>
103 <div class="input-group">
104 <div id="username" class="input-group mb-3">
105 <div class="input-group-prepend">
106 <span class="input-group-text" id="basic-addon1"><i class="fa-solid fa-user"></i></span>
107 </div><input type="text" id="userinp" class="form-control" name="username" placeholder="Username" aria-label="Username" aria-describedby="basic-addon1">
108 <div id="user_inv" class="invalid-feedback">
109 Username cannot be empty.
110 </div>
111
112 </div>
113 <div id="password" class="input-group mb-3">
114 <div class="input-group-prepend">
115 <span class="input-group-text" id="basic-addon1"><i class="fa-solid fa-key"></i></span>
116 </div><input type="password" id="passinp" class="form-control" name="password" placeholder="Password">
117 <div id="pass_inv" class="invalid-feedback">
118 Password cannot be empty.
119 </div>
120
121 </div>
122
123 </div>
124 <button type="submit" class="btn btn-primary btn-block">Log-In</button>
125 </form>
126 </div>
127 </div>
128 </div>
129 </div>
130 </div></section>
131
132 <script>
133 var form = document.getElementById('login');
134 var pinp = document.getElementById('passinp');
135 var uinp = document.getElementById('userinp');
136
137 form.addEventListener('submit', (event) =>
138 {
139 event.preventDefault();
140 var err = 0;
141 if (uinp.value.length == 0)
142 {
143 $('#user_inv').show();
144 err++;
145 }
146 if (pinp.value.length == 0)
147 {
148 $('#pass_inv').show();
149 err++;
150 }
151 if (err)
152 return;
153 else
154 form.submit();
155 });
156 </script>
157
158 <?php require_once "../footer.php";