VERO/DisposableMails/LocalBlocklist.php
2026-03-04 10:12:09 +01:00

375 lines
12 KiB
PHP

<?php
session_start();
// Konfiguration
define('DOMAINS_FILE', 'localdomains.conf');
define('USERNAME', 'admin');
define('PASSWORD', 'password123'); // In Produktion sollte dies gehasht werden!
// Hilfsfunktionen
function isLoggedIn() {
return isset($_SESSION['logged_in']) && $_SESSION['logged_in'] === true;
}
function validateDomain($domain) {
// Domain-Validierung
$domain = trim($domain);
if (empty($domain)) {
return false;
}
// Basis-Validierung für Domain-Format
return filter_var($domain, FILTER_VALIDATE_DOMAIN, FILTER_FLAG_HOSTNAME) !== false;
}
function loadDomains() {
if (!file_exists(DOMAINS_FILE)) {
return [];
}
$domains = file(DOMAINS_FILE, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
return array_filter(array_map('trim', $domains));
}
function saveDomains($domains) {
// Alphabetische Sortierung vor dem Speichern
sort($domains, SORT_STRING | SORT_FLAG_CASE);
exec ('touch disposable_email_blocklist.conf -d "-2 hours" disposable_email_blocklist.conf 2>&1',$output, $retval);
return file_put_contents(DOMAINS_FILE, implode("\n", $domains) . "\n");
}
function addDomain($domain) {
if (!validateDomain($domain)) {
return false;
}
$domains = loadDomains();
if (in_array($domain, $domains)) {
return false; // Domain bereits vorhanden
}
$domains[] = $domain;
return saveDomains($domains);
}
function deleteDomain($domain) {
$domains = loadDomains();
$domains = array_filter($domains, function($d) use ($domain) {
return $d !== $domain;
});
return saveDomains($domains);
}
function updateDomain($oldDomain, $newDomain) {
if (!validateDomain($newDomain)) {
return false;
}
$domains = loadDomains();
$key = array_search($oldDomain, $domains);
if ($key !== false) {
$domains[$key] = $newDomain;
return saveDomains($domains);
}
return false;
}
// Request-Verarbeitung
$message = '';
$error = '';
// Login-Verarbeitung
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action'])) {
switch ($_POST['action']) {
case 'login':
if ($_POST['username'] === USERNAME && $_POST['password'] === PASSWORD) {
$_SESSION['logged_in'] = true;
$message = 'Erfolgreich angemeldet!';
} else {
$error = 'Ungültige Anmeldedaten!';
}
break;
case 'logout':
session_destroy();
header('Location: ' . $_SERVER['PHP_SELF']);
exit;
break;
case 'add':
if (isLoggedIn()) {
$domain = trim($_POST['domain']);
if (addDomain($domain)) {
$message = "Domain '$domain' wurde erfolgreich hinzugefügt!";
} else {
$error = "Fehler beim Hinzufügen der Domain '$domain'. Möglicherweise ungültig oder bereits vorhanden.";
}
}
break;
case 'delete':
if (isLoggedIn() && isset($_POST['domain'])) {
$domain = $_POST['domain'];
if (deleteDomain($domain)) {
$message = "Domain '$domain' wurde erfolgreich gelöscht!";
} else {
$error = "Fehler beim Löschen der Domain '$domain'.";
}
}
break;
case 'update':
if (isLoggedIn() && isset($_POST['old_domain']) && isset($_POST['new_domain'])) {
$oldDomain = $_POST['old_domain'];
$newDomain = trim($_POST['new_domain']);
if (updateDomain($oldDomain, $newDomain)) {
$message = "Domain wurde erfolgreich von '$oldDomain' zu '$newDomain' geändert!";
} else {
$error = "Fehler beim Aktualisieren der Domain. Neue Domain möglicherweise ungültig.";
}
}
break;
}
}
$domains = isLoggedIn() ? loadDomains() : [];
?>
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Lokale Blocklist</title>
<style>
body {
font-family: Arial, sans-serif;
max-width: 800px;
margin: 0 auto;
padding: 20px;
background-color: #f5f5f5;
}
.container {
background: white;
padding: 30px;
border-radius: 10px;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}
h1 {
color: #333;
text-align: center;
margin-bottom: 30px;
}
.form-group {
margin-bottom: 15px;
}
label {
display: block;
margin-bottom: 5px;
font-weight: bold;
}
input[type="text"], input[type="password"] {
width: 100%;
padding: 10px;
border: 1px solid #ddd;
border-radius: 5px;
box-sizing: border-box;
}
button {
background: #007cba;
color: white;
padding: 10px 20px;
border: none;
border-radius: 5px;
cursor: pointer;
margin-right: 10px;
}
button:hover {
background: #005a87;
}
button.danger {
background: #dc3545;
}
button.danger:hover {
background: #c82333;
}
.message {
padding: 10px;
margin: 10px 0;
border-radius: 5px;
}
.success {
background: #d4edda;
color: #155724;
border: 1px solid #c3e6cb;
}
.error {
background: #f8d7da;
color: #721c24;
border: 1px solid #f5c6cb;
}
.domain-list {
margin-top: 30px;
}
.domain-item {
background: #f8f9fa;
padding: 15px;
margin: 10px 0;
border-radius: 5px;
border: 1px solid #dee2e6;
display: flex;
justify-content: space-between;
align-items: center;
}
.domain-name {
font-family: monospace;
font-size: 16px;
}
.actions {
display: flex;
gap: 10px;
}
.edit-form {
display: none;
}
.stats {
background: #e9ecef;
padding: 10px;
border-radius: 5px;
margin: 20px 0;
}
.logout-btn {
float: right;
}
</style>
</head>
<body>
<div class="container">
<h1>Lokale Blocklist bearbeiten</h1>
<?php if ($message): ?>
<div class="message success"><?= htmlspecialchars($message) ?></div>
<?php endif; ?>
<?php if ($error): ?>
<div class="message error"><?= htmlspecialchars($error) ?></div>
<?php endif; ?>
<?php if (!isLoggedIn()): ?>
<!-- Login-Formular -->
<form method="POST">
<input type="hidden" name="action" value="login">
<div class="form-group">
<label for="username">Benutzername:</label>
<input type="text" id="username" name="username" required>
</div>
<div class="form-group">
<label for="password">Passwort:</label>
<input type="password" id="password" name="password" required>
</div>
<button type="submit">Anmelden</button>
</form>
<div class="message" style="margin-top: 20px; background: #cce5ff;">
<strong>Demo-Zugangsdaten:</strong><br>
Benutzername: admin<br>
Passwort: password123
</div>
<?php else: ?>
<!-- Logout-Button -->
<form method="POST" style="display: inline;">
<input type="hidden" name="action" value="logout">
<button type="submit" class="logout-btn">Abmelden</button>
</form>
<div style="clear: both;"></div>
<!-- Statistiken -->
<div class="stats">
<strong>Statistiken:</strong> <?= count($domains) ?> Domains verwaltet
</div>
<!-- Domain hinzufügen -->
<h2>Neue Domain hinzufügen</h2>
<form method="POST">
<input type="hidden" name="action" value="add">
<div class="form-group">
<label for="domain">Domain:</label>
<input type="text" id="domain" name="domain" placeholder="z.B. example.com" required>
</div>
<button type="submit">Domain hinzufügen</button>
</form>
<!-- Domain-Liste -->
<div class="domain-list">
<h2>Verwaltete Domains (<?= count($domains) ?>)</h2>
<?php if (empty($domains)): ?>
<p>Keine Domains vorhanden. Fügen Sie eine Domain hinzu, um zu beginnen.</p>
<?php else: ?>
<?php foreach ($domains as $domain): ?>
<div class="domain-item">
<span class="domain-name"><?= htmlspecialchars($domain) ?></span>
<div class="actions">
<button onclick="showEditForm('<?= htmlspecialchars($domain) ?>')">Bearbeiten</button>
<form method="POST" style="display: inline;" onsubmit="return confirm('Domain \'<?= htmlspecialchars($domain) ?>\' wirklich löschen?')">
<input type="hidden" name="action" value="delete">
<input type="hidden" name="domain" value="<?= htmlspecialchars($domain) ?>">
<button type="submit" class="danger">Löschen</button>
</form>
</div>
</div>
<!-- Bearbeitungsformular (versteckt) -->
<div id="edit-<?= htmlspecialchars($domain) ?>" class="edit-form">
<form method="POST" style="margin-top: 10px;">
<input type="hidden" name="action" value="update">
<input type="hidden" name="old_domain" value="<?= htmlspecialchars($domain) ?>">
<div class="form-group">
<label>Domain bearbeiten:</label>
<input type="text" name="new_domain" value="<?= htmlspecialchars($domain) ?>" required>
</div>
<button type="submit">Speichern</button>
<button type="button" onclick="hideEditForm('<?= htmlspecialchars($domain) ?>')">Abbrechen</button>
</form>
</div>
<?php endforeach; ?>
<?php endif; ?>
</div>
<?php endif; ?>
</div>
<script>
function showEditForm(domain) {
document.getElementById('edit-' + domain).style.display = 'block';
}
function hideEditForm(domain) {
document.getElementById('edit-' + domain).style.display = 'none';
}
</script>
</body>
</html>