Exemple #1
0
function _admin_issafefile($filename)
{
    if (!_loginright_adminfmanplus) {
        return _isSafeFile($filename);
    }
    return true;
}
/**
 * Nacteni obrazku ze souboru
 *
 * Mozne klice v $limit:
 *
 * filesize     maximalni velikost souboru v bajtech
 * dimensions   max. rozmery ve formatu array(x => max_sirka, y => max_vyska)
 * memory       maximalni procento zbyvajici dostupne pameti, ktere muze byt vyuzito (vychozi je 0.75) a je treba pocitat s +- odchylkou
 *
 * @param string $filepath realna cesta k souboru
 * @param array $limit volby omezeni
 * @param string|null $filename pouzity nazev souboru (pokud se lisi od $filepath)
 * @return array v pripade uspechu array(true, kod, resource, pripona), jinak array(false, kod, zprava, pripona)
 */
function _pictureLoad($filepath, $limit = array(), $filename = null)
{
    // vychozi nastaveni
    static $limit_default = array('filesize' => null, 'dimensions' => null, 'memory' => 0.75);
    // vlozeni vychoziho nastaveni
    $limit += $limit_default;
    // proces
    $code = 0;
    do {
        /* --------  kontroly a nacteni  -------- */
        // zjisteni nazvu souboru
        if (null === $filename) {
            $filename = basename($filepath);
        }
        // zjisteni pripony
        $ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
        // kontrola pripony
        if (!in_array($ext, SL::$imageExt) || !_isSafeFile($filepath) || !_isSafeFile($filename)) {
            // nepovolena pripona
            $code = 1;
            break;
        }
        // kontrola velikosti souboru
        $size = @filesize($filepath);
        if ($size === false) {
            // soubor nenalezen
            $code = 2;
            break;
        }
        if (isset($limit['filesize']) && $size > $limit['filesize']) {
            // prekrocena datova velikost
            $code = 3;
            break;
        }
        // kontrola podpory formatu
        if (!_checkGD($ext)) {
            // nepodporovany format
            $code = 4;
            break;
        }
        // zjisteni informaci o obrazku
        $imageInfo = getimagesize($filepath);
        if (isset($imageInfo['channels'])) {
            $channels = $imageInfo['channels'];
        } else {
            switch ($ext) {
                case 'png':
                    $channels = 4;
                    break;
                default:
                    $channels = 3;
                    break;
            }
        }
        if (false === $imageInfo || 0 == $imageInfo[0] || 0 == $imageInfo[1]) {
            $code = 5;
            break;
        }
        // kontrola dostupne pameti
        if ($memlimit = _phpIniLimit('memory_limit')) {
            $availMem = floor($limit['memory'] * ($memlimit - memory_get_usage()));
            $requiredMem = ceil(($imageInfo[0] * $imageInfo[1] * $imageInfo['bits'] * $channels / 8 + 65536) * 1.65);
            if ($requiredMem > $availMem) {
                // nedostatek pameti
                $code = 5;
                break;
            }
        }
        // nacteni rozmeru
        $x = $imageInfo[0];
        $y = $imageInfo[1];
        // kontrola rozmeru
        if (isset($limit['dimensions']) && ($x > $limit['dimensions']['x'] || $y > $limit['dimensions']['y'])) {
            $code = 6;
            break;
        }
        // pokus o nacteni obrazku
        switch ($ext) {
            case 'jpg':
            case 'jpeg':
                $res = @imagecreatefromjpeg($filepath);
                break;
            case 'png':
                $res = @imagecreatefrompng($filepath);
                break;
            case 'gif':
                $res = @imagecreatefromgif($filepath);
                break;
        }
        // kontrola nacteni
        if (!is_resource($res)) {
            $code = 5;
            break;
        }
        // vsechno je ok, vratit vysledek
        return array(true, $code, $res, $ext);
    } while (false);
    // chyba
    global $_lang;
    $output = array(false, $code, $_lang['pic.load.' . $code], $ext);
    // uprava vystupu
    switch ($code) {
        case 3:
            $output[2] = str_replace('*maxkb*', round($limit['filesize'] / 1024), $output[2]);
            break;
        case 5:
            $lastError = error_get_last();
            if (null !== $lastError && !empty($lastError['message'])) {
                $output[2] .= " {$_lang['global.error']}: " . _htmlStr($lastError['message']);
            }
            break;
        case 6:
            $output[2] = str_replace(array('*maxw*', '*maxh*'), array($limit['dimensions']['x'], $limit['dimensions']['y']), $output[2]);
            break;
    }
    // navrat
    return $output;
}