/**
  * Генерирует полное имя файла кэша и контрольного файла, по имени группы и ключу.
  * @param $Group
  * @param $Key
  * @return array <type>
  */
 public function GetFiles($Group, $Key)
 {
     $cacheGroupPath = $this->Path . $Group;
     if (!is_dir($cacheGroupPath)) {
         MkDirRecursive($cacheGroupPath);
     }
     $cacheGroupPath .= '/';
     $Key = rawurlencode($Key);
     return array($cacheGroupPath . $Key . $this->FileSuffix, $cacheGroupPath . $Key . $this->ExpirySuffix);
 }
/**
 * Генерирует миниатюру и кэширует её. Возвращает имя файла миниатюры.
 * @param      $FileName   Исходный файл изображения.
 * @param int  $MaxWidth   Максимальная ширина миниатюры.
 * @param int  $MaxHeight  Максимальная высота миниатюры.
 * @param bool $Streech    Растягивать ли картинку если заданные размеры больше исходных
 * @param null $SaveFormat Формат сохранения миниатюры (jpeg, png, gif, wbmp).
 * @return mixed
 */
function GetThumb($FileName, $MaxWidth = 0, $MaxHeight = 0, $Streech = false, $SaveFormat = null)
{
    if ($FileName == '') {
        return 'images/no_image.png';
    } elseif (substr($FileName, 0, 7) == 'http://') {
        return $FileName;
    }
    $FileName = RealPath2($FileName);
    if (isset($SaveFormat)) {
        $ext = '.' . $SaveFormat;
    } else {
        $ext = GetFileExt($FileName);
    }
    $tmb_path = System::config('general/tmb_path');
    if (!is_dir($tmb_path)) {
        MkDirRecursive($tmb_path);
    }
    $tmb_file = $tmb_path . md5($FileName) . '_' . $MaxWidth . 'x' . $MaxHeight . ($Streech ? '_streech' : '') . $ext;
    if (!is_file($tmb_file)) {
        CreateThumb($FileName, $tmb_file, $MaxWidth, $MaxHeight, $Streech, $SaveFormat);
    }
    return $tmb_file;
}
function AdminExtensionsUpload()
{
    if (!isset($_FILES['extension'])) {
        System::admin()->AddTextBox('Ошибка', 'Файл не выбран.');
        return;
    }
    $extension = $_FILES['extension'];
    if ($extension['error'] != 0) {
        System::admin()->AddTextBox('Ошибка', 'Ошибка при загрузке файла. Код ошибки: ' . $extension['error'] . '.');
        return;
    }
    $valid_ext = '.ext.zip';
    $path = './';
    $errors_log = '';
    $to_unpack = array();
    // Проверяем расширение
    $archive_filename = $extension['name'];
    if (substr($archive_filename, -strlen($valid_ext)) != $valid_ext) {
        $errors_log .= 'Файл не является пакетом расширения LinkorCMS.';
    } else {
        $archive = $extension['tmp_name'];
        $zip = new ZipArchive();
        if ($zip->open($archive) === true) {
            for ($i = 0; $i < $zip->numFiles; $i++) {
                $filename = $zip->getNameIndex($i);
                $fileinfo = pathinfo($filename);
                if (!is_writable($path . $fileinfo['dirname'])) {
                    $errors_log .= 'Нет прав на запись в папку ' . $path . $fileinfo['dirname'] . "\n";
                    continue;
                }
                if (substr($path . $filename, -1) == '/') {
                    if (!is_dir($path . $filename)) {
                        MkDirRecursive($path . $filename);
                    }
                } else {
                    $to_unpack[] = $filename;
                }
            }
        } else {
            $errors_log .= 'Не удалось прочитать файл. Неверный формат.';
        }
    }
    if ($errors_log != '') {
        System::admin()->AddCenterBox('Ошибка, не удалось распаковать');
        System::admin()->HighlightError(nl2br($errors_log));
        $zip->close();
    } else {
        // Распаковываем файлы
        if (!$zip->extractTo($path, $to_unpack)) {
            System::admin()->AddCenterBox('Ошибка');
            System::admin()->HighlightError('Ошибка при распаковке.');
            $zip->close();
            return;
        }
        Audit('Расширения: Загружен архив расширения "' . $archive_filename . '"');
        $zip->close();
        GO(ADMIN_FILE . '?exe=extensions&a=installlist');
    }
}
function AdminUpdateApply()
{
    global $updates_folder, $autoupdate_to;
    // Распаковываем архив, показываем сообщение, что обновление прошло успешно.
    $update_file = RealPath2($updates_folder . $_GET['file']);
    if (!is_file($update_file)) {
        System::admin()->AddCenterBox('Ошибка');
        System::admin()->HighlightError('Файл обновления не найден.');
        return;
    }
    $zip = new ZipArchive();
    $zip->open($update_file);
    $metadata = JsonDecode($zip->getFromName('metadata'));
    if (!isset($metadata) || !isset($metadata['product']) || $metadata['product'] != CMS_UPDATE_PRODUCT || !isset($metadata['type']) || $metadata['type'] != 'update' || !isset($metadata['from_version']) || $metadata['from_version'] != CMS_VERSION || !isset($metadata['to_version']) || !isset($metadata['changelog'])) {
        System::admin()->AddCenterBox('Ошибка');
        System::admin()->HighlightError('Файл не является файлом обновления или не подходит к вашей версии системы.');
        return;
    }
    $errors = array();
    $numFiles = $zip->numFiles;
    for ($i = 0; $i < $numFiles; $i++) {
        $fn = $zip->getNameIndex($i);
        if ($fn == 'metadata') {
            continue;
        }
        if (substr($fn, -1) != '/') {
            // Файл
            $content = $zip->getFromIndex($i);
            if (is_file($fn)) {
                $r = file_put_contents($fn, $content);
                if ($r === false) {
                    $errors[] = 'Не удалось обновить файл ' . $r;
                }
            } else {
                $r = file_put_contents($fn, $content);
                if ($r !== false) {
                    chmod($fn, 0666);
                } else {
                    $errors[] = 'Не удалось создать файл ' . $r;
                }
            }
        } else {
            // Папка
            if (!is_dir($fn)) {
                $r = MkDirRecursive($fn);
                if ($r === false) {
                    $errors[] = 'Не удалось создать папку ' . $r;
                }
            }
        }
    }
    $zip->close();
    if (count($errors) == 0) {
        // Автообновление
        $autoupdate_to = $metadata['to_version'];
        Audit('Обновление системы: Запуск обновления системы до версии ' . $autoupdate_to);
        include 'config/autoupdate.php';
        // Очистка кэша
        System::cache()->ClearAll();
        System::admin()->AddCenterBox('Обновление системы');
        System::admin()->Highlight('Обновление прошло успешно, система обновлена до версии ' . SafeDB($metadata['to_version'], 20, str) . '.');
        Audit('Обновление системы: Успешное завершение обновления, система была обновлена до версии "' . $autoupdate_to . '"');
    } else {
        System::admin()->AddCenterBox('При обновлении произошли ошибки');
        System::admin()->HighlightError(implode("<br>\n", $errors));
    }
}