<?php
session_start();
$db_file = '/tmp/mnt/sda1/www/.auth/users.db';
$upload_dir = '/tmp/mnt/sda1/www/uploads/';
$log_file = '/tmp/mnt/sda1/www/.auth/activity.log';
define('MAX_FILE_SIZE', 15 * 1024 * 1024); // 15MB

function write_log($action, $username, $details) {
    global $log_file;
    $timestamp = date("Y-m-d H:i:s");
    $ip = $_SERVER['REMOTE_ADDR'];
    $log_entry = "[$timestamp] [IP: $ip] [User: $username] [$action] - $details\n";
    file_put_contents($log_file, $log_entry, FILE_APPEND | LOCK_EX);
}

try {
    $db = new PDO("sqlite:$db_file");
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $db->exec("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT UNIQUE, email TEXT, password TEXT, status TEXT DEFAULT 'pending')");
} catch (Exception $e) { die("Database setup failed: " . $e->getMessage()); }

if (isset($_GET['action']) && $_GET['action'] == 'logout') {
    $old_user = $_SESSION['user'] ?? 'Unknown';
    write_log("LOGOUT", $old_user, "User logged out successfully");
    session_destroy(); header("Location: files.php"); exit;
}

$msg = "";
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    if (isset($_POST['action_login'])) {
        $user = trim($_POST['username']); $pass = trim($_POST['password']);
        $stmt = $db->prepare("SELECT * FROM users WHERE username = :user"); $stmt->execute([':user' => $user]); $row = $stmt->fetch(PDO::FETCH_ASSOC);
        if ($row && password_verify($pass, $row['password'])) {
            if ($row['status'] === 'approved') {
                $_SESSION['user'] = $row['username']; $_SESSION['role'] = ($row['username'] === 'admin') ? 'admin' : 'user';
                write_log("LOGIN_SUCCESS", $user, "Logged in as " . $_SESSION['role']);
                header("Location: files.php"); exit;
            } else {
                $msg = "<p class='alert-warn'>Your registration is pending admin approval.</p>";
                write_log("LOGIN_PENDING", $user, "Attempted login while status is pending");
            }
        } else {
            $msg = "<p class='alert-danger'>Invalid username or password.</p>";
            write_log("LOGIN_FAILED", $user, "Failed login attempt (invalid credentials)");
        }
    }
    if (isset($_POST['action_register'])) {
        $user = trim($_POST['username']); $email = trim($_POST['email']); $pass = trim($_POST['password']);
        if (!empty($user) && !empty($email) && !empty($pass)) {
            $hash = password_hash($pass, PASSWORD_DEFAULT);
            try {
                $stmt = $db->prepare("INSERT INTO users (username, email, password, status) VALUES (:user, :email, :hash, 'pending')"); $stmt->execute([':user' => $user, ':email' => $email, ':hash' => $hash]);
                $msg = "<p class='alert-success'>Registration submitted! Awaiting approval.</p>";
                write_log("REGISTRATION", $user, "New account registration requested (Email: $email)");
            } catch (Exception $e) {
                $msg = "<p class='alert-danger'>Username already exists.</p>";
                write_log("REGISTRATION_REJECTED", $user, "Username collision or DB block");
            }
        } else { $msg = "<p class='alert-danger'>All fields are required.</p>"; }
    }
    if (isset($_SESSION['role']) && $_SESSION['role'] === 'admin') {
        if (isset($_POST['approve_user'])) {
            $stmt = $db->prepare("SELECT username FROM users WHERE id = :id"); $stmt->execute([':id' => $_POST['user_id']]); $u_target = $stmt->fetchColumn();
            $stmt = $db->prepare("UPDATE users SET status = 'approved' WHERE id = :id AND username != 'admin'"); $stmt->execute([':id' => $_POST['user_id']]);
            write_log("ADMIN_ACTION", $_SESSION['user'], "Approved user account: $u_target");
        }
        if (isset($_POST['delete_user'])) {
            $stmt = $db->prepare("SELECT username FROM users WHERE id = :id"); $stmt->execute([':id' => $_POST['user_id']]); $u_target = $stmt->fetchColumn();
            $stmt = $db->prepare("DELETE FROM users WHERE id = :id AND username != 'admin'"); $stmt->execute([':id' => $_POST['user_id']]);
            write_log("ADMIN_ACTION", $_SESSION['user'], "Permanently deleted user account: $u_target");
        }
        if (isset($_POST['delete_file'])) {
            $file_to_del = basename($_POST['file_name']); $target_del_path = $upload_dir . $file_to_del;
            if (file_exists($target_del_path) && unlink($target_del_path)) {
                $msg = "<p class='alert-success'>File safely deleted.</p>";
                write_log("FILE_DELETE", $_SESSION['user'], "Admin deleted file: $file_to_del");
            } else { $msg = "<p class='alert-danger'>Failed to delete file.</p>"; }
        }
    }
    if (isset($_SESSION['user']) && isset($_FILES['uploaded_file'])) {
        $f_err = $_FILES['uploaded_file']['error']; $f_sz = $_FILES['uploaded_file']['size']; $f_name = basename($_FILES['uploaded_file']['name']); $tgt = $upload_dir . $f_name; $ext = strtolower(pathinfo($tgt, PATHINFO_EXTENSION));
        if ($f_err === UPLOAD_ERR_INI_SIZE || $f_err === UPLOAD_ERR_FORM_SIZE || $f_sz > MAX_FILE_SIZE) {
            $msg = "<p class='alert-danger'>File exceeds 15MB limit.</p>";
            write_log("UPLOAD_FAILED", $_SESSION['user'], "Attempted file over 15MB limit: $f_name");
        } else if (!in_array($ext, ['jpg', 'jpeg', 'png', 'webp', 'gif', 'pdf', 'txt', 'mp3', 'mp4', 'doc', 'docx', 'xls', 'xlsx'])) {
            $msg = "<p class='alert-danger'>Scripts are forbidden.</p>";
            write_log("SECURITY_ALERT", $_SESSION['user'], "Attempted to upload malicious script file extension: $f_name");
        } else if (move_uploaded_file($_FILES['uploaded_file']['tmp_name'], $tgt)) {
            $msg = "<p class='alert-success'>Uploaded successfully.</p>";
            write_log("FILE_UPLOAD", $_SESSION['user'], "Successfully uploaded file: $f_name (" . round($f_sz/1024, 2) . " KB)");
        } else { $msg = "<p class='alert-danger'>Failed to save file.</p>"; }
    }
}
if (isset($_GET['download']) && isset($_SESSION['user'])) {
    $file = basename($_GET['download']); $filepath = $upload_dir . $file;
    if (file_exists($filepath)) {
        write_log("FILE_DOWNLOAD", $_SESSION['user'], "Downloaded file: $file");
        header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="' . $file . '"'); header('Content-Length: ' . filesize($filepath)); readfile($filepath); exit;
    }
}
?>
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>Secure File Server</title><meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
* { box-sizing: border-box; }
body { font-family: sans-serif; background-color: #0b0b0c; color: #e4e4e7; margin: 0; padding: 20px; display: flex; justify-content: center; align-items: center; min-height: 100vh; }
.container { width: 100%; max-width: 650px; background-color: #121214; padding: 30px; border-radius: 12px; border: 1px solid #27272a; box-shadow: 0 10px 30px rgba(0,0,0,0.5); }
h2, h3 { color: #ffffff; margin-top: 0; }
h2 { font-size: 26px; border-bottom: 1px solid #27272a; padding-bottom: 15px; margin-bottom: 20px; display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 10px; }
h3 { font-size: 18px; margin-bottom: 15px; margin-top: 20px; }
.back-btn { background-color: #1f1f23; color: #a1a1aa; padding: 6px 14px; text-decoration: none; border-radius: 6px; font-size: 13px; font-weight: 600; border: 1px solid #27272a; transition: all 0.2s; }
.back-btn:hover { background-color: #27272a; color: #ffffff; border-color: #3f3f46; }
input[type="text"], input[type="email"], input[type="password"] { width: 100%; padding: 12px; margin-bottom: 15px; border: 1px solid #27272a; background: #161619; color: #ffffff; border-radius: 8px; font-size: 14px; }
input:focus { outline: none; border-color: #2563eb; background-color: #1c1c21; }
input[type="file"] { background: #161619; padding: 10px; border: 1px dashed #27272a; width: 100%; border-radius: 8px; color: #a1a1aa; margin-bottom: 15px; }
button { width: 100%; background-color: #2563eb; color: #ffffff; border: 1px solid #3b82f6; padding: 12px; font-size: 15px; font-weight: 600; cursor: pointer; border-radius: 8px; }
button:hover { background-color: #1d4ed8; }
.nav { text-align: right; font-size: 0.9em; color: #a1a1aa; margin-bottom: 20px; border-bottom: 1px solid #27272a; padding-bottom: 10px; }
.nav a { color: #ef4444; text-decoration: none; font-weight: 600; margin-left: 10px; }
table { width: 100%; border-collapse: collapse; margin-top: 15px; font-size: 14px; }
table, th, td { border: 1px solid #27272a; padding: 10px; text-align: left; }
th { background: #161619; color: #ffffff; }
.action-btn { width: auto; padding: 6px 12px; font-size: 13px; margin-right: 5px; display: inline-block; }
ul { list-style: none; padding: 0; margin: 0; }
li { background: #161619; border: 1px solid #27272a; padding: 12px; border-radius: 8px; margin-bottom: 10px; display: flex; justify-content: space-between; align-items: center; }
li a { color: #3b82f6; text-decoration: none; font-weight: 500; word-break: break-all; }
.file-actions { display: flex; align-items: center; gap: 10px; }
.file-size { color: #71717a; font-size: 0.85em; white-space: nowrap; }
.del-file-btn { background: #b91c1c; border: 1px solid #dc2626; color: white; padding: 4px 8px; font-size: 12px; font-weight: 600; cursor: pointer; border-radius: 4px; width: auto; }
.log-box { width: 100%; height: 180px; background: #000000; border: 1px solid #27272a; border-radius: 8px; padding: 12px; font-family: monospace; font-size: 11px; color: #34d399; overflow-y: scroll; white-space: pre-wrap; line-height: 1.5; }
hr { border: 0; border-top: 1px solid #27272a; margin: 25px 0; }
.alert-success { background: #065f46; color: #34d399; padding: 12px; border-radius: 8px; margin-bottom: 15px; }
.alert-danger { background: #991b1b; color: #f87171; padding: 12px; border-radius: 8px; margin-bottom: 15px; }
.alert-warn { background: #92400e; color: #fbbf24; padding: 12px; border-radius: 8px; margin-bottom: 15px; }
</style></head><body><div class="container">
    <h2><span>Secure File Server</span> <a href="/" class="back-btn">&larr; Portal Home</a></h2>
    <?php echo $msg; ?>
<?php if (!isset($_SESSION['user'])): ?>
<h3>Login</h3><form method="POST"><input type="text" name="username" placeholder="Username" required><input type="password" name="password" placeholder="Password" required><button type="submit" name="action_login">Login</button></form><hr>
<h3>Request Access (Register)</h3><form method="POST"><input type="text" name="username" placeholder="Desired Username" required><input type="email" name="email" placeholder="Email Address" required><input type="password" name="password" placeholder="Password" required><button type="submit" name="action_register">Register</button></form>
<?php else: ?>
<div class="nav">User: <strong><?php echo htmlspecialchars($_SESSION['user']); ?></strong> <a href="files.php?action=logout">Logout</a></div>
<?php if ($_SESSION['role'] === 'admin'): ?>
<h3>Admin User Control Panel</h3><div style="overflow-x: auto;"><table><tr><th>Username</th><th>Email</th><th>Actions</th></tr>
<?php $users = $db->query("SELECT * FROM users WHERE username != 'admin'")->fetchAll(PDO::FETCH_ASSOC); foreach ($users as $u): ?>
<tr><td><?php echo htmlspecialchars($u['username']); ?> [<?php echo htmlspecialchars($u['status']); ?>]</td><td><?php echo htmlspecialchars($u['email']); ?></td><td><form method="POST" style="display:inline;"><input type="hidden" name="user_id" value="<?php echo $u['id']; ?>"><?php if ($u['status'] === 'pending'): ?><button type="submit" name="approve_user" class="action-btn" style="background: #047857; border-color: #059669;">Approve</button><?php endif; ?><button type="submit" name="delete_user" class="action-btn" style="background: #b91c1c; border-color: #dc2626;" onclick="return confirm('Delete user?');">Remove</button></form></td></tr>
<?php endforeach; ?></table></div><hr>
<h3>System Activity Log</h3><div class="log-box"><?php if (file_exists($log_file)) { $lines = array_reverse(file($log_file)); echo htmlspecialchars(implode("", array_slice($lines, 0, 50))); } else { echo "No activity logged yet."; } ?></div><hr>
<?php endif; ?>
<h3>Upload a File <span style="font-size:12px; color:#71717a;">(Max 15MB)</span></h3><form method="POST" enctype="multipart/form-data"><input type="hidden" name="MAX_FILE_SIZE" value="15728640"><input type="file" name="uploaded_file" required><button type="submit">Upload File</button></form>
<h3>Available Files</h3><ul>
<?php $files = array_diff(scandir($upload_dir), array('.', '..')); if (count($files) > 0) { foreach ($files as $f) { 
    echo "<li><a href='files.php?download=" . urlencode($f) . "'>" . htmlspecialchars($f) . "</a><div class='file-actions'><span class='file-size'>" . round(filesize($upload_dir . $f) / 1024, 2) . " KB</span>";
    if ($_SESSION['role'] === 'admin') { echo "<form method='POST' style='display:inline;' onsubmit='return confirm(\"Permanently delete this file?\");'><input type='hidden' name='file_name' value='" . htmlspecialchars($f) . "'><button type='submit' name='delete_file' class='del-file-btn'>Delete</button></form>"; }
    echo "</div></li>";
} } else { echo "<li style='color:#71717a; justify-content: center;'>No files uploaded yet.</li>"; } ?>
</ul><?php endif; ?></div></body></html>
