Files
umbrix/update-server/admin/save.php
Umbrix Developer 76a374950f feat: mobile-like window size and always-visible stats
- Changed window size to mobile phone format (400x800)
- Removed width condition for ActiveProxyFooter - now always visible
- Added run-umbrix.sh launch script with icon copying
- Stats cards now display on all screen sizes
2026-01-17 13:09:20 +03:00

141 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
/**
* Umbrix Update Manager - Save Script
* Сохранение данных обновления в latest.json
*/
// CORS headers
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type');
header('Content-Type: application/json; charset=utf-8');
// Обработка preflight запроса
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
http_response_code(200);
exit();
}
// Только POST запросы
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
http_response_code(405);
echo json_encode(['success' => false, 'message' => 'Method Not Allowed']);
exit();
}
// === НАСТРОЙКИ ===
// Путь к файлу latest.json (на уровень выше)
$json_file = __DIR__ . '/../latest.json';
// Пароль для доступа (ИЗМЕНИТЕ ЭТО!)
$admin_password = 'umbrix2024';
// Проверка пароля (опционально, раскомментируйте если нужна защита)
// $provided_password = $_SERVER['HTTP_X_ADMIN_PASSWORD'] ?? '';
// if ($provided_password !== $admin_password) {
// http_response_code(403);
// echo json_encode(['success' => false, 'message' => 'Неверный пароль']);
// exit();
// }
// === КОНЕЦ НАСТРОЕК ===
// Получение данных
$input = file_get_contents('php://input');
$data = json_decode($input, true);
if (!$data) {
http_response_code(400);
echo json_encode(['success' => false, 'message' => 'Неверный формат данных']);
exit();
}
// Валидация обязательных полей
$required_fields = ['version', 'build_number', 'download_url', 'published_at'];
foreach ($required_fields as $field) {
if (!isset($data[$field]) || empty($data[$field])) {
http_response_code(400);
echo json_encode([
'success' => false,
'message' => "Отсутствует обязательное поле: $field"
]);
exit();
}
}
// Валидация версии (формат X.Y.Z)
if (!preg_match('/^\d+\.\d+\.\d+(-[a-zA-Z0-9]+)?$/', $data['version'])) {
http_response_code(400);
echo json_encode([
'success' => false,
'message' => 'Неверный формат версии. Используйте X.Y.Z (например: 2.5.8)'
]);
exit();
}
// Валидация URL
if (!filter_var($data['download_url'], FILTER_VALIDATE_URL)) {
http_response_code(400);
echo json_encode([
'success' => false,
'message' => 'Неверный формат URL'
]);
exit();
}
// Подготовка данных для сохранения
$update_data = [
'version' => $data['version'],
'build_number' => $data['build_number'],
'is_prerelease' => $data['is_prerelease'] ?? false,
'download_url' => $data['download_url'],
'release_notes' => $data['release_notes'] ?? '',
'published_at' => $data['published_at'],
'min_required_version' => $data['min_required_version'] ?? '2.0.0',
'file_size_bytes' => 0,
'file_checksum_sha256' => ''
];
// Попытка получить размер файла (если APK доступен)
$apk_path = __DIR__ . '/../downloads/' . basename(parse_url($data['download_url'], PHP_URL_PATH));
if (file_exists($apk_path)) {
$update_data['file_size_bytes'] = filesize($apk_path);
}
// Создание бэкапа старой версии
if (file_exists($json_file)) {
$backup_file = __DIR__ . '/../latest.json.backup.' . date('Y-m-d_H-i-s');
copy($json_file, $backup_file);
}
// Сохранение в JSON
$json_content = json_encode($update_data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
if (file_put_contents($json_file, $json_content) === false) {
http_response_code(500);
echo json_encode([
'success' => false,
'message' => 'Не удалось сохранить файл. Проверьте права доступа.'
]);
exit();
}
// Логирование
$log_entry = sprintf(
"[%s] Обновление сохранено: v%s (build %s) | IP: %s\n",
date('Y-m-d H:i:s'),
$data['version'],
$data['build_number'],
$_SERVER['REMOTE_ADDR'] ?? 'unknown'
);
file_put_contents(__DIR__ . '/../logs/admin.log', $log_entry, FILE_APPEND);
// Успешный ответ
echo json_encode([
'success' => true,
'message' => 'Обновление успешно сохранено',
'data' => $update_data
]);
?>