mirror of
https://github.com/myronblair/jarvis
synced 2026-06-30 17:50:23 -05:00
81 lines
5.3 KiB
PHP
81 lines
5.3 KiB
PHP
<?php
|
|
ini_set('session.cache_limiter', '');
|
|
header('Cache-Control: no-store, no-cache, must-revalidate, no-transform');
|
|
session_name('jarvis_main');
|
|
session_start();
|
|
if (!empty($_SESSION['jarvis_token'])) { header('Location: /'); exit; }
|
|
$error = '';
|
|
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|
$u = trim($_POST['username'] ?? '');
|
|
$p = $_POST['password'] ?? '';
|
|
if ($u && $p) {
|
|
$pdo = new PDO('mysql:host=localhost;dbname=jarvis_db;charset=utf8mb4',
|
|
'jarvis_user', 'J4rv1s_Pr0t0c0l_2026!',
|
|
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
|
|
$row = $pdo->prepare('SELECT * FROM users WHERE username=? LIMIT 1');
|
|
$row->execute([$u]);
|
|
$user = $row->fetch(PDO::FETCH_ASSOC);
|
|
if ($user && password_verify($p, $user['password_hash'])) {
|
|
$token = bin2hex(random_bytes(32));
|
|
$_SESSION['jarvis_token'] = $token;
|
|
$_SESSION['jarvis_user_id'] = $user['id'];
|
|
$_SESSION['jarvis_name'] = $user['display_name'];
|
|
$pdo->prepare('UPDATE users SET last_seen=NOW() WHERE id=?')->execute([$user['id']]);
|
|
header('Location: /bridge.php');
|
|
exit;
|
|
}
|
|
$error = 'ACCESS DENIED';
|
|
} else { $error = 'ENTER CREDENTIALS'; }
|
|
}
|
|
?><!DOCTYPE html>
|
|
<html lang="en"><head>
|
|
<meta charset="UTF-8"/><meta name="viewport" content="width=device-width,initial-scale=1"/>
|
|
<title>JARVIS</title>
|
|
<link href="https://fonts.googleapis.com/css2?family=Orbitron:wght@900&family=Share+Tech+Mono&display=swap" rel="stylesheet"/>
|
|
<style>
|
|
*{box-sizing:border-box;margin:0;padding:0}
|
|
:root{--bg:#000810;--cyan:#00d4ff;--cyan2:#00a8cc;--orange:#ff6600;--red:#ff2244;--dim:rgba(0,212,255,0.4);--text-dim:rgba(200,230,255,0.5);--pb:rgba(0,212,255,0.2);--r:8px}
|
|
html,body{width:100%;height:100%;overflow:hidden;background:var(--bg);font-family:'Share Tech Mono',monospace}
|
|
body::before{content:'';position:fixed;inset:0;background-image:linear-gradient(rgba(0,180,255,0.07) 1px,transparent 1px),linear-gradient(90deg,rgba(0,180,255,0.07) 1px,transparent 1px);background-size:40px 40px;pointer-events:none}
|
|
.scanlines{position:fixed;inset:0;pointer-events:none;background:repeating-linear-gradient(0deg,transparent,transparent 2px,rgba(0,0,0,0.03) 2px,rgba(0,0,0,0.03) 4px);animation:scan 8s linear infinite}
|
|
@keyframes scan{0%{background-position:0 0}100%{background-position:0 100%}}
|
|
#wrap{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;flex-direction:column}
|
|
.reactor{width:160px;height:160px;position:relative;margin-bottom:40px}
|
|
.ring{position:absolute;border-radius:50%;border:2px solid var(--cyan);top:50%;left:50%;transform:translate(-50%,-50%);box-shadow:0 0 8px var(--cyan);animation:spin var(--s,4s) linear infinite}
|
|
.r1{width:160px;height:160px;--s:8s;border-color:rgba(0,212,255,0.3)}
|
|
.r2{width:130px;height:130px;--s:6s;animation-direction:reverse}
|
|
.r3{width:100px;height:100px;--s:4s;border-color:var(--orange);box-shadow:0 0 12px var(--orange)}
|
|
.r4{width:70px;height:70px;--s:3s;animation-direction:reverse}
|
|
.core{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:40px;height:40px;border-radius:50%;background:radial-gradient(circle,#fff 0%,var(--cyan) 40%,var(--cyan2) 70%,transparent 100%);box-shadow:0 0 20px var(--cyan),0 0 40px var(--cyan);animation:pulse 2s ease-in-out infinite}
|
|
@keyframes spin{from{transform:translate(-50%,-50%) rotate(0deg)}to{transform:translate(-50%,-50%) rotate(360deg)}}
|
|
@keyframes pulse{0%,100%{opacity:.8;transform:translate(-50%,-50%) scale(1)}50%{opacity:1;transform:translate(-50%,-50%) scale(1.1)}}
|
|
h1{font-family:'Orbitron',monospace;font-size:2.5rem;font-weight:900;letter-spacing:8px;color:var(--cyan);text-shadow:0 0 20px var(--cyan);margin-bottom:8px}
|
|
p{color:var(--text-dim);font-size:.85rem;letter-spacing:4px;text-transform:uppercase;margin-bottom:40px}
|
|
form{display:flex;flex-direction:column;gap:14px;width:320px}
|
|
input{background:rgba(0,212,255,.05);border:1px solid var(--pb);border-radius:var(--r);padding:12px 16px;color:var(--cyan);font-family:'Share Tech Mono',monospace;font-size:.95rem;outline:none;width:100%;letter-spacing:1px}
|
|
input:focus{border-color:var(--cyan);box-shadow:0 0 12px rgba(0,212,255,.2)}
|
|
input::placeholder{color:var(--dim)}
|
|
button{background:linear-gradient(135deg,rgba(0,212,255,.15),rgba(0,212,255,.05));border:1px solid var(--cyan);border-radius:var(--r);padding:14px;color:var(--cyan);font-family:'Orbitron',monospace;font-size:.8rem;font-weight:700;letter-spacing:3px;text-transform:uppercase;cursor:pointer}
|
|
button:hover{background:rgba(0,212,255,.2)}
|
|
.err{color:var(--red);font-size:.85rem;text-align:center;letter-spacing:1px;min-height:20px}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div class="scanlines"></div>
|
|
<div id="wrap">
|
|
<div class="reactor">
|
|
<div class="ring r1"></div><div class="ring r2"></div>
|
|
<div class="ring r3"></div><div class="ring r4"></div>
|
|
<div class="core"></div>
|
|
</div>
|
|
<h1>JARVIS</h1>
|
|
<p>Just A Rather Very Intelligent System</p>
|
|
<form method="POST" action="/login.php">
|
|
<input type="text" name="username" value="myron" placeholder="IDENTIFICATION" autocomplete="username"/>
|
|
<input type="password" name="password" placeholder="ACCESS CODE" autocomplete="current-password"/>
|
|
<button type="submit">INITIALIZE SYSTEM</button>
|
|
<div class="err"><?= htmlspecialchars($error) ?></div>
|
|
</form>
|
|
</div>
|
|
</body></html>
|