philippurbschat.de/admin-tools/index.php

136 lines
No EOL
9.4 KiB
PHP

<?php
// Schritt 1: Das Projekt meldet sich beim Türsteher
$current_project = 'admin-tools';
require_once '../auth.php'; // Der Türsteher prüft, ob du Admin bist
// Schritt 2: Prüfen, ob das Formular abgeschickt wurde
$generated_hash = null;
$original_password = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['password_to_hash'])) {
$original_password = $_POST['password_to_hash'];
$generated_hash = password_hash($original_password, PASSWORD_DEFAULT);
}
?>
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Admin: Hash-Generator</title>
<link href="https://fonts.googleapis.com/css2?family=Press+Start+2P&family=Lato:wght@400;700&display=swap" rel="stylesheet">
<style>
/* ... komplettes CSS von vorher ... */
:root {
--primary-color: #00e6e6; /* Aqua Blue */
--secondary-color: #ff66b2; /* Hot Pink */
--background-color: #121212;
--box-bg-color: #1f1f1f;
--text-color: #e0e0e0;
--error-color: #ff4d4d;
--glow-effect: none;
--retro-font: "Press Start 2P", cursive;
--modern-font: "Lato", sans-serif;
--cat-body-color: #8a2be2;
--cat-detail-color: var(--secondary-color);
--cat-eye-color: var(--primary-color);
--pixel-size: 2px;
}
body { font-family: var(--modern-font); background-color: var(--background-color); color: var(--text-color); margin: 0; display: flex; justify-content: center; align-items: center; min-height: 100vh; overflow: hidden; position: relative; }
body::before { content: ""; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: repeating-linear-gradient(transparent, rgba(0, 0, 0, 0.3) 1px, transparent 4px); pointer-events: none; animation: scanlines 4s linear infinite; z-index: 100; }
.container { text-align: center; padding: 2rem; max-width: 90%; width: 400px; }
.header h1 { font-family: var(--retro-font); color: var(--primary-color); font-size: 2.5rem; text-shadow: none; margin-bottom: 0.5rem; }
.header p { font-family: var(--retro-font); color: var(--secondary-color); font-size: 1rem; margin-bottom: 2rem; }
.pixel-cat { position: relative; width: calc(30 * var(--pixel-size)); height: calc(35 * var(--pixel-size)); margin: 0 auto -10px; z-index: 10; }
.cat-body { position: absolute; top: calc(15 * var(--pixel-size)); left: calc(5 * var(--pixel-size)); width: calc(20 * var(--pixel-size)); height: calc(15 * var(--pixel-size)); background-color: var(--cat-body-color); z-index: 1; }
.cat-head { position: absolute; top: calc(5 * var(--pixel-size)); left: calc(8 * var(--pixel-size)); width: calc(14 * var(--pixel-size)); height: calc(10 * var(--pixel-size)); background-color: var(--cat-body-color); z-index: 2; }
.cat-ear { position: absolute; width: calc(4 * var(--pixel-size)); height: calc(5 * var(--pixel-size)); background-color: var(--cat-body-color); z-index: 0; }
.cat-ear.left { top: calc(0 * var(--pixel-size)); left: calc(7 * var(--pixel-size)); }
.cat-ear.right { top: calc(0 * var(--pixel-size)); right: calc(7 * var(--pixel-size)); }
.cat-eye { position: absolute; width: calc(2 * var(--pixel-size)); height: calc(2 * var(--pixel-size)); background-color: var(--cat-eye-color); z-index: 3; animation: eye-blink 10s infinite; }
.cat-eye.left { top: calc(8 * var(--pixel-size)); left: calc(10 * var(--pixel-size)); }
.cat-eye.right { top: calc(8 * var(--pixel-size)); right: calc(10 * var(--pixel-size)); }
.cat-nose { position: absolute; top: calc(11 * var(--pixel-size)); left: calc(14 * var(--pixel-size)); width: calc(2 * var(--pixel-size)); height: calc(1 * var(--pixel-size)); background-color: var(--cat-detail-color); z-index: 3; }
.cat-tail { position: absolute; top: calc(19 * var(--pixel-size)); left: calc(22 * var(--pixel-size)); width: calc(3 * var(--pixel-size)); height: calc(10 * var(--pixel-size)); background-color: var(--cat-body-color); transform-origin: bottom center; animation: tail-wag 15s infinite; z-index: 0; }
.main-content { background-color: var(--box-bg-color); padding: 2rem; border: 2px solid var(--cat-body-color); box-shadow: none; border-radius: 0; position: relative; overflow: hidden; min-height: 350px; display: flex; flex-direction: column; align-items: center; justify-content: center; }
.input-group { margin-bottom: 1.5rem; text-align: left; width: 100%; }
.input-group label { display: block; font-family: var(--retro-font); color: var(--text-color); margin-bottom: 0.5rem; font-size: 0.8rem; }
.input-group input { width: 100%; padding: 10px; border: 2px solid var(--primary-color); background-color: rgba(0, 0, 0, 0.4); color: var(--primary-color); font-family: var(--retro-font); outline: none; box-shadow: none; transition: box-shadow 0.3s ease, border-color 0.3s ease; box-sizing: border-box; }
.input-group input:focus { border-color: var(--secondary-color); }
.login-btn, .retry-btn { width: 100%; padding: 12px; background-color: var(--primary-color); color: var(--background-color); font-family: var(--retro-font); border: none; cursor: pointer; font-size: 1rem; text-transform: uppercase; transition: transform 0.2s ease, box-shadow 0.2s ease, background-color 0.2s ease; text-decoration: none; display: block; box-sizing: border-box; margin-bottom: 1rem; }
.login-btn:hover, .retry-btn:hover { transform: translateY(-2px); background-color: var(--secondary-color); box-shadow: 0 4px 8px rgba(0,0,0,0.3); }
.result { margin-top: 2rem; background-color: rgba(0,0,0,0.4); padding: 1rem; text-align: left; font-family: monospace; color: var(--primary-color); word-wrap: break-word; width: 100%; box-sizing: border-box; }
.result code { font-size: 0.9rem; }
/* --- NEU: Style für klickbaren Hash --- */
.result code {
cursor: pointer;
transition: color 0.2s ease;
}
.result code:hover {
color: var(--secondary-color);
}
@keyframes scanlines { 0% { background-position: 0 0; } 100% { background-position: 0 50px; } }
@keyframes tail-wag { 0%, 90% { transform: rotate(0deg); } 92.5% { transform: rotate(0deg); } 95% { transform: rotate(25deg); } 97.5% { transform: rotate(0deg); } 100% { transform: rotate(0deg); } }
@keyframes eye-blink { 0%, 99% { transform: scaleY(1); } 100% { transform: scaleY(0); } }
</style>
</head>
<body>
<div style="position: fixed; top: 16px; left: 16px; z-index: 200; display: flex; gap: 16px; font-family: var(--retro-font); font-size: 0.65rem;">
<a href="/admin" style="color: var(--primary-color); text-decoration: none; padding: 6px 10px; background: rgba(0,0,0,0.6); border: 1px solid var(--primary-color);">&lt; /ADMIN</a>
<a href="/admin/users" style="color: var(--primary-color); text-decoration: none; padding: 6px 10px; background: rgba(0,0,0,0.6); border: 1px solid var(--primary-color);">BENUTZER</a>
<a href="/" style="color: var(--secondary-color); text-decoration: none; padding: 6px 10px; background: rgba(0,0,0,0.6); border: 1px solid var(--secondary-color);">HOME</a>
</div>
<div class="container">
<header class="header">
<h1>ADMIN TOOLS</h1>
<p>Password Hash Generator</p>
</header>
<div class="pixel-cat"></div>
<main class="main-content">
<form action="index.php" method="POST" style="width: 100%;">
<div class="input-group">
<label for="password_input">NEW PASSWORD</label>
<input type="text" id="password_input" name="password_to_hash" placeholder="> Enter new key" autofocus>
</div>
<button type="submit" class="login-btn">GENERATE HASH</button>
</form>
<?php if ($generated_hash): ?>
<div class="result">
<strong>Original:</strong> <?php echo htmlspecialchars($original_password); ?><br><br>
<strong id="hash-label">Hash (klicken zum Kopieren):</strong><br>
<code id="hash-output"><?php echo $generated_hash; ?></code>
</div>
<?php endif; ?>
<a href="../index.php" class="retry-btn" style="margin-top: 2rem; background-color: #555;">BACK</a>
</main>
</div>
<script>
document.addEventListener('DOMContentLoaded', () => {
const hashOutput = document.getElementById('hash-output');
const hashLabel = document.getElementById('hash-label');
if (hashOutput) {
hashOutput.addEventListener('click', () => {
const hashText = hashOutput.innerText;
navigator.clipboard.writeText(hashText).then(() => {
// Erfolgreich kopiert! Gib dem Nutzer Feedback.
hashLabel.innerText = 'Kopiert! ✔️';
// Ändere es nach 2 Sekunden zurück.
setTimeout(() => {
hashLabel.innerHTML = 'Hash (klicken zum Kopieren):';
}, 2000);
}).catch(err => {
console.error('Fehler beim Kopieren: ', err);
hashLabel.innerText = 'Fehler beim Kopieren!';
});
});
}
});
</script>
</body>
</html>