Release
This commit is contained in:
93
web/login.php
Normal file
93
web/login.php
Normal file
@@ -0,0 +1,93 @@
|
||||
<?php
|
||||
require __DIR__ . '/lib/app.php';
|
||||
|
||||
if (app_is_installed() && !empty($_SESSION['uid'])) {
|
||||
header('Location: /'); exit;
|
||||
}
|
||||
|
||||
$err = '';
|
||||
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
$u = trim($_POST['u'] ?? '');
|
||||
$p = $_POST['p'] ?? '';
|
||||
if ($u !== '' && auth_login($u, $p)) {
|
||||
header('Location: /'); exit;
|
||||
}
|
||||
$err = 'Invalid credentials';
|
||||
}
|
||||
?>
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>Login · SnowPanel</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
|
||||
<link href="/assets/panel.css" rel="stylesheet">
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
|
||||
<link rel="alternate icon" href="/favicon.svg">
|
||||
</head>
|
||||
<body>
|
||||
<nav class="navbar navbar-dark" style="background:linear-gradient(90deg,#0d6efd,#4dabf7);">
|
||||
<div class="container-fluid">
|
||||
<span class="navbar-brand fw-bold">
|
||||
<img src="/favicon.svg" alt="" style="width:20px;height:20px;margin-right:.5rem;vertical-align:-3px;">
|
||||
SnowPanel
|
||||
</span>
|
||||
<div class="ms-auto">
|
||||
<button id="btnTheme" type="button" class="btn btn-sm btn-outline-light">Theme</button>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<div class="page-wrap">
|
||||
<div class="container maxw-960">
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-md-8 col-lg-6">
|
||||
<div class="card p-4 shadow-lg">
|
||||
<h1 class="h4 mb-3">Sign in</h1>
|
||||
|
||||
<?php if (isset($_GET['ok'])): ?>
|
||||
<div class="alert alert-success py-2 mb-3" role="alert">Admin created. Sign in below.</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($err): ?>
|
||||
<div class="alert alert-danger py-2 mb-3" role="alert"><?= htmlspecialchars($err) ?></div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if (!app_is_installed()): ?>
|
||||
<div class="alert alert-info py-2 mb-3" role="alert">
|
||||
First time here? <a href="/setup.php">Run setup</a>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<form method="post" autocomplete="on">
|
||||
<div class="mb-3">
|
||||
<label class="form-label" for="u">Username</label>
|
||||
<input class="form-control" id="u" name="u" required autofocus>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label class="form-label" for="p">Password</label>
|
||||
<input class="form-control" id="p" name="p" type="password" required autocomplete="current-password">
|
||||
</div>
|
||||
<button class="btn btn-primary w-100" type="submit">Login</button>
|
||||
</form>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
const THEME_KEY='snowpanel:theme';
|
||||
const mql=window.matchMedia('(prefers-color-scheme: dark)');
|
||||
const btn=document.getElementById('btnTheme');
|
||||
function preferredTheme(){const s=localStorage.getItem(THEME_KEY);return (s==='dark'||s==='light')?s:(mql.matches?'dark':'light');}
|
||||
function setBtnLabel(t){ if(btn) btn.textContent = (t==='dark') ? '🌞 Light' : '🌙 Dark'; }
|
||||
function applyTheme(t){ document.documentElement.setAttribute('data-theme', t); localStorage.setItem(THEME_KEY, t); setBtnLabel(t); }
|
||||
mql.addEventListener('change', e=>{ if(!localStorage.getItem(THEME_KEY)) applyTheme(e.matches?'dark':'light'); });
|
||||
btn?.addEventListener('click', ()=>{ const next=(document.documentElement.getAttribute('data-theme')==='dark')?'light':'dark'; applyTheme(next); });
|
||||
applyTheme(preferredTheme());
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user