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; }