Files
THOS-Server/thp.php
2025-06-05 09:03:28 +02:00

115 lines
4.5 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
function e($string) {
return htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
}
require_once "vfs.php";
$appPath = resolve_path($_GET['q'] ?? '');
$verified = ($_GET['v'] ?? '0') === '1';
if (strpos($appPath, '..') !== false || !preg_match('/\.thp$/i', $appPath)) {
http_response_code(400);
exit("Invalid app package.");
}
if (!file_exists($appPath)) {
http_response_code(404);
exit("App package not found.");
}
function render_layout($content) {
echo <<<HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Install App</title>
<script src="tailwind.es"></script>
<style>
body {
@apply bg-gray-950 text-white font-sans;
}
.glow {
text-shadow: 0 0 8px rgba(255,255,255,0.4);
}
</style>
</head>
<body class="min-h-screen flex items-center justify-center px-4">
<div class="bg-gray-900 border border-pink-400 rounded-2xl p-6 shadow-2xl max-w-lg w-full space-y-5">
{$content}
</div>
</body>
</html>
HTML;
}
if (!$verified) {
$pathEncoded = urlencode(virtualize_path($appPath));
$content = <<<HTML
<div class="flex items-center space-x-3">
<svg class="w-8 h-8 text-yellow-400 animate-pulse" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01M12 4.5c.88 0 1.74.25 2.5.72.76.47 1.37 1.14 1.8 1.92A5.96 5.96 0 0118 12a5.96 5.96 0 01-1.2 3.86 5.96 5.96 0 01-1.8 1.92A5.96 5.96 0 0112 18a5.96 5.96 0 01-3.86-1.2 5.96 5.96 0 01-1.92-1.8A5.96 5.96 0 016 12c0-.88.25-1.74.72-2.5.47-.76 1.14-1.37 1.92-1.8A5.96 5.96 0 0112 4.5z" />
</svg>
<h2 class="text-xl font-bold text-yellow-400 glow">Unverified App Installation</h2>
</div>
<p class="text-sm text-gray-300">
This app hasnt been verified by THOS. Installing untrusted packages may put your system at risk.
</p>
<p class="text-sm text-gray-300">Only continue if you trust this app and its source.</p>
<a href="?v=1&q={$pathEncoded}" class="inline-block mt-4 px-4 py-2 text-sm font-semibold bg-yellow-500 text-black rounded hover:bg-yellow-400 transition">
Install Anyway
</a>
HTML;
render_layout($content);
exit;
}
if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['confirm'] ?? '') === '1') {
require_once 'pkg.php';
$result = installPackage($appPath, __DIR__ . "/apps/");
$content = $result
? <<<HTML
<div class="flex items-center space-x-3">
<svg class="w-8 h-8 text-green-400" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7" />
</svg>
<h2 class="text-xl font-bold text-green-400 glow">Success!</h2>
</div>
<p class="text-sm text-gray-300">The app has been installed successfully.</p>
<script>window.parent.reloadApps?.();</script>
HTML
: <<<HTML
<div class="flex items-center space-x-3">
<svg class="w-8 h-8 text-red-400" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" />
</svg>
<h2 class="text-xl font-bold text-red-400 glow">Installation Failed</h2>
</div>
<p class="text-sm text-gray-300">Something went wrong. Check your server logs for more details.</p>
HTML;
render_layout($content);
exit;
}
// Confirm UI
$appName = basename($appPath);
$content = <<<HTML
<div class="flex items-center space-x-3">
<svg class="w-8 h-8 text-blue-400" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 4v1m0 14v1m8-8h1M4 12H3m15.364-6.364l.707.707M6.343 17.657l-.707.707m12.728 0l-.707-.707M6.343 6.343l.707-.707" />
</svg>
<h2 class="text-xl font-bold text-blue-300 glow">Install {$appName}?</h2>
</div>
<p class="text-sm text-gray-300">This app is ready to be installed into your system. Continue?</p>
<form method="POST" class="mt-4 flex justify-end space-x-2">
<input type="hidden" name="confirm" value="1">
<a href="/" class="px-4 py-2 text-sm bg-gray-700 rounded hover:bg-gray-600 transition">Cancel</a>
<button type="submit" class="px-4 py-2 text-sm font-semibold bg-blue-500 text-white rounded hover:bg-blue-400 transition">
Install Now
</button>
</form>
HTML;
render_layout($content);