first commit

This commit is contained in:
2025-08-02 16:30:27 +02:00
commit 23646bfcee
14851 changed files with 1750626 additions and 0 deletions

843
class/class.fileManager.php Normal file
View File

@@ -0,0 +1,843 @@
<?php
class FileManager
{
public $restrictSuffixes = [];
public $forbidSuffixes = [];
public $currentUser;
public $userDefinition = [
'SYSTEM' => [],
'MASTER' => [],
'USER' => [
'read' => [],
'write' => [],
],
'DESIGNER' => [
'read' => [],
'write' => [],
],
];
public function __construct($user = 'SYSTEM')
{
$this->changeUser($user);
$this->forbidSuffixes();
}
public function changeUser($user = 'SYSTEM')
{
$this->currentUser = $user;
// nastavit povolene slozky
$f = $GLOBALS['cfg']['path']['root'];
$this->userDefinition['USER']['read'][] = $f;
$this->userDefinition['DESIGNER']['read'][] = $f;
$f = $GLOBALS['cfg']['path']['storage'].'*';
$this->userDefinition['USER']['read'][] = $f;
$this->userDefinition['USER']['write'][] = $f;
$this->userDefinition['DESIGNER']['read'][] = $f;
$this->userDefinition['DESIGNER']['write'][] = $f;
$f = $GLOBALS['cfg']['path']['smarty']['templates'].'*';
$this->userDefinition['USER']['read'][] = $f;
$this->userDefinition['DESIGNER']['read'][] = $f;
$this->userDefinition['DESIGNER']['write'][] = $f;
}
// omezuje pripony souboru, ktere se smi zobrazit
public function restrictSuffixes($restrictSuffixes = null)
{
if (is_null($restrictSuffixes) || !is_array($restrictSuffixes)) {
$restrictSuffixes = [];
}
$this->restrictSuffixes = $restrictSuffixes;
}
// omezuje pripony souboru, ktere se nesmi zobrazit
public function forbidSuffixes($forbidSuffixes = null)
{
if (is_null($forbidSuffixes) || !is_array($forbidSuffixes)) {
$forbidSuffixes = [];
}
// podle usera zakazat dalsi pripony
switch ($this->currentUser) {
case 'MASTER':
case 'SYSTEM':
break;
default:
$forbidSuffixes2 = ['php', 'phtml', 'inc', 'sql', 'log', 'htaccess', 'htpasswd'];
$forbidSuffixes = array_merge($forbidSuffixes, $forbidSuffixes2);
break;
}
$this->forbidSuffixes = $forbidSuffixes;
}
// vytvari slozku
public function createFolder($folder, $path = '')
{
// rozdeli cestu a zalozi vsechny nadslozky az po posledni slozku
$temp = explode('/', $folder);
$makedirs = [];
$lastdir = '';
for ($x = 0; $x < count($temp); $x++) {
if (!empty($temp[$x])) {
$lastdir .= ($lastdir != '') ? '/'.trim($temp[$x]) : trim($temp[$x]);
if ($temp[$x] != '.' && $temp[$x] != '..') {
$makedirs[] = $lastdir;
}
}
}
unset($temp, $lastdir);
$chmod = 0777;
for ($x = 0; $x < count($makedirs); $x++) {
if (!file_exists($path.$makedirs[$x])) {
// zkontrolovat pravo k adresari
if ($this->verifyUserAccessRight2Folder($path.$makedirs[$x], 'write') == false) {
return false;
}
@mkdir($path.$makedirs[$x], $chmod);
// echo $path . $makedirs[$x] . "<hr>";
}
}
return true;
}
// rekurzivni funkce
// DODELAT
public function copyFolder($fromFolder, $toFolder, $current = '')
{
$dp = @opendir($fromFolder.$current);
if (!$dp) {
exit('Nepodarilo se otevrit slozku '.$fromFolder);
}
while ($fileThis = readdir($dp)) {
if ($fileThis == '.' || $fileThis == '..') {
continue;
}
// odkaz je slozka
if (is_dir($fromFolder.$current.'/'.$fileThis)) {
// echo "zalozit: " . $toFolder . $current."/".$fileThis."<br>";
$this->createFolder($toFolder.$current.'/'.$fileThis);
$this->copyFolder($fromFolder, $toFolder, $current.'/'.$fileThis);
} // odkaz je soubor
else {
// echo "zkopirovat: " . $toFolder . $current."/".$fileThis."<br>";
$this->copyFile($fromFolder.$current.'/'.$fileThis, $toFolder.$current.'/'.$fileThis);
}
}
return true;
}
// kopiruje soubory
public function copyFile($from, $to)
{
$folder = $this->checkPathLastSlash(dirname($to));
$filename = basename($to);
// zkontrolovat pravo k adresari
/*if($this->verifyUserAccessRight2Folder($folder, 'write') == false)
{
return false;
}
// zkontrolovat pravo k souboru
if($this->verifyUserAccessRight2File($folder, $filename, 'write') == false)
{
return false;
}*/
copy($from, $to);
chmod($to, 0777);
return true;
}
// vytvari prazdny soubor soubory
public function createFile($file, $data)
{
$folder = $this->checkPathLastSlash(dirname($file));
$filename = basename($file);
// zkontrolovat pravo k adresari
if ($this->verifyUserAccessRight2Folder($folder, 'write') == false) {
return false;
}
// zkontrolovat pravo k souboru
if ($this->verifyUserAccessRight2File($folder, $filename, 'write') == false) {
return false;
}
$fp = @fopen($file, 'w');
if ($fp) {
fwrite($fp, $data);
fclose($fp);
} else {
return false;
}
return true;
}
// prepise obsah souboru
public function updateFileContent($file, $data)
{
$folder = $this->checkPathLastSlash(dirname($file));
$filename = basename($file);
// zkontrolovat pravo k adresari
if ($this->verifyUserAccessRight2Folder($folder, 'write') == false) {
return false;
}
// zkontrolovat pravo k souboru
if ($this->verifyUserAccessRight2File($folder, $filename, 'write') == false) {
return false;
}
$fp = @fopen($file, 'w+');
if ($fp) {
fwrite($fp, $data);
fclose($fp);
} else {
return false;
}
return true;
}
// zjisti velikost obsahu adresare
public function getFolderSize($folder)
{
$size = 0;
if (!is_dir($folder)) {
return -1;
}
$dp = @opendir($folder);
if (!$dp) {
return -2;
}
while ($fileThis = readdir($dp)) {
if ($fileThis == '.' || $fileThis == '..') {
continue;
}
// odkaz je slozka
if (is_dir($folder.'/'.$fileThis)) {
$cSize = $this->getFolderSize($folder.'/'.$fileThis);
} // odkaz je soubor
else {
$cSize = filesize($folder.'/'.$fileThis);
}
if ($cSize > 0) {
$size += $cSize;
}
}
return $size;
}
// kovertovat udaje o bajtech do jine jednotky
public function reCalculateFileSize($size, $unit = 'MB', $dec = 2)
{
switch ($unit) {
case 'KB':
$size = $size / 1024;
break;
case 'MB':
$size = $size / 1024 / 1024;
break;
}
$size = number_format($size, $dec, '.', '');
return $size;
}
// --------------------------------------------------
// zjistuje, jestli je mozno do slozky zapisovat
public function isFolderWriteable($folder)
{
// 16895 - drwxrwxrwx
return fileperms($folder) == 16895;
}
// --------------------------------------------------
// zjistuje, jestli je mozno zapisovat do souboru
public function isFileWriteable($file)
{
return is_writable($file);
}
// --------------------------------------------------
// nastavi prava na zapis do slozky
public function makeFolderWriteable($folder)
{
return @chmod($folder, 0777);
}
// --------------------------------------------------
// nastavi prava na zapis do souboru
public function makeFileWriteable($file)
{
return @chmod($file, 0777);
}
// rekurzivni funkce
// smaze kompletni obsah slozky a jejich podslozek
public function deleteFolder($folder)
{
$dp = @opendir($folder);
if (!$dp) {
return false;
}
// die("Nepodarilo se otevrit slozku ".$folder);
while ($fileThis = readdir($dp)) {
if ($fileThis == '.' || $fileThis == '..') {
continue;
}
// odkaz je slozka
if (is_dir($folder.'/'.$fileThis)) {
$this->deleteFolder($folder.'/'.$fileThis);
} // odkaz je soubor
else {
$this->deleteFile($folder.'/'.$fileThis);
}
}
@closedir($dp);
// smazat samotnou slozku
if (!@rmdir($folder)) {
@chmod($folder, 0777);
@rmdir($folder);
}
return true;
}
// smaze soubor
public function deleteFile($file)
{
if (!file_exists($file)) {
return false;
}
$folder = $this->checkPathLastSlash(dirname($file));
$filename = basename($file);
// zkontrolovat pravo k adresari
if ($this->verifyUserAccessRight2Folder($folder, 'write') == false) {
// die("Zakazana slozka: ".$folder);
return false;
}
// zkontrolovat pravo k souboru
if ($this->verifyUserAccessRight2File($folder, $filename, 'write') == false) {
// die("Zakazany soubor: ".$file);
return false;
}
// die($file);
// $class['FileManager']->deleteFile('d:\webs-cms\vyvoj\industrial-advisors/templates/Forms-form.tpl');
// smazat
if (!@unlink($file)) {
@chmod($file, 0777);
@unlink($file);
}
return true;
}
// prejmenuje soubor
public function renameFile($file, $newname)
{
if (!file_exists($file)) {
return false;
}
// -------------------------------------------------------------
// nejdrive zkontrolovat slozku, z ktere prejmenovavame
$folder = $this->checkPathLastSlash(dirname($file));
$filename = basename($file);
// zkontrolovat pravo k adresari
if ($this->verifyUserAccessRight2Folder($folder, 'write') == false) {
return false;
}
// zkontrolovat pravo k souboru
if ($this->verifyUserAccessRight2File($folder, $filename, 'write') == false) {
return false;
}
// -------------------------------------------------------------
// zkontrolovat slozku, do ktere prejmenovavame
$folder = $this->checkPathLastSlash(dirname($newname));
$filename = basename($newname);
// zkontrolovat pravo k adresari
if ($this->verifyUserAccessRight2Folder($folder, 'write') == false) {
return false;
}
// zkontrolovat pravo k souboru
if ($this->verifyUserAccessRight2File($folder, $filename, 'write') == false) {
return false;
}
// -------------------------------------------------------------
// prejmenovat
if (!@rename($file, $newname)) {
@chmod($folder, 0777);
@rename($file, $newname);
}
return true;
}
// ----------------------------------------------------------
public function browseFolder($folder, $subfolder = '', $getFolders = true, $getFiles = true, $browseRecursive = false, $fullpath = false)
{
// vraci vsechny podslozky dane slozky v poli
if (!($dp = opendir($folder.$subfolder))) {
return false;
}
$i = 0;
$darr = [];
while ($fileThis = readdir($dp)) {
if ($fileThis == '.' || $fileThis == '..') {
continue;
}
// odkaz je slozka
if (is_dir($folder.$subfolder.$fileThis)) {
if ($getFolders) {
$darr[] = ($fullpath) ? $folder.$subfolder.$fileThis.'/' : $subfolder.$fileThis.'/';
}
if ($browseRecursive) {
$arr = $this->browseFolder($folder, $subfolder.$fileThis.'/', $getFolders, $getFiles, $browseRecursive, $fullpath);
$darr = array_merge($darr, $arr);
}
} // odkaz je soubor
else {
if ($getFiles) {
$darr[] = ($fullpath) ? $folder.$subfolder.$fileThis : $subfolder.$fileThis;
}
}
$i++;
}
closedir($dp);
/*
echo '<pre>';
print_r($darr);
exit;
*/
return $darr;
}
// ----------------------------------------------------------
// fce vraci obsah urcite slozky. Defaultne je volana systemem
// kdyz je ale volana uzivatelem, vraci vzdy jen adresare, na
// ktere ma uzivatel pravo.
public function getSubFolders($folder)
{
// nejdrive zkontrolovat vubec danou slozku
if ($this->verifyUserAccessRight2Folder($folder, 'read') == false) {
return false;
}
// vraci vsechny podslozky dane slozky v poli
if (!($dp = opendir($folder))) {
return false;
}
$i = 0;
while ($dc = readdir($dp)) {
if (!is_dir($folder.$dc) || $dc == '.' || $dc == '..') {
continue;
}
if ($this->verifyUserAccessRight2Folder($folder.$dc.'/', 'read') == false) {
continue;
}
$darr[$i] = $dc;
$i++;
}
closedir($dp);
return $darr;
}
// ----------------------------------------------------------
// fce vraci obsah urcite slozky. Defaultne je volana systemem
// kdyz je ale volana uzivatelem, vraci vzdy jen soubory, na ktere ma uzivatel pravo.
public function getFolderFiles($folder)
{
// nejdrive zkontrolovat vubec danou slozku
if ($this->verifyUserAccessRight2Folder($folder, 'read') == false) {
return false;
}
// vraci vsechny soubory dane slozky v poli
if (!($dp = opendir($folder))) {
return false;
}
$i = 0;
while ($dc = readdir($dp)) {
// pokud neni slozka
if (is_dir($folder.$dc) || $dc == '.' || $dc == '..') {
continue;
}
if ($this->verifyUserAccessRight2File($folder, $dc) == false) {
continue;
}
$darr[$i] = $dc;
$i++;
}
closedir($dp);
return $darr;
}
// ----------------------------------------------------------
public function getIconFile($suffix, $width = 16, $height = 16)
{
$suffixType = null;
$suffix = strtolower($suffix);
switch ($suffix) {
case 'avi':
case 'mpeg':
case 'mpg':
$suffixType = 'video';
break;
case 'mp3':
case 'wav':
case 'ogg':
case 'ogg':
$suffixType = 'audio';
break;
case 'txt':
case 'dat':
case 'php':
case 'php3':
case 'php4':
case 'php5':
case 'dtd':
case 'srt':
case 'sub':
$suffixType = 'txt';
break;
case 'bmp':
case 'gif':
case 'jpg':
case 'jpeg':
case 'png':
$suffixType = 'image';
break;
case 'csv':
case 'xls':
$suffixType = 'excel';
break;
case 'htm':
case 'html':
case 'xml':
case 'xhtml':
case 'dhtml':
$suffixType = 'explorer';
break;
case 'pdf':
$suffixType = $suffix;
break;
case 'zip':
$suffixType = $suffix;
break;
case 'rar':
$suffixType = $suffix;
break;
case 'chm':
$suffixType = $suffix;
break;
case 'doc':
$suffixType = $suffix;
break;
}
$icon = (is_null($suffixType)) ? 'type_'.$width.'x'.$height.'_unknown.gif' : 'type_'.$width.'x'.$height.'_'.$suffixType.'.gif';
// $icon = 'filetypes/'.$icon;
return $icon;
}
// ----------------------------------------------------------
// fce vraci koncovku souboru
public function isFileContentEditable($suffix)
{
$suffix = strtolower($suffix);
return ereg('^(txt|html|htm|tpl|ini|dat|csv|js|css|xml|php|php3|php4|php5|java|xhtml|dtd|srt|sub|htaccess|htpasswd)$', $suffix);
}
// ------------------------------------------------
// fce zkontroluje, zda ma uzivatel pravo videt danou slozku a jeji obsah
public function verifyUserAccessRight2File($folder, $filename, $action = 'read')
{
// system ma pravo nahlizet a zapisovat do vsech slozek
if ($this->currentUser == 'SYSTEM') {
return true;
}
// unixove soubory
if (strpos($filename, '.ht') !== false && strpos($filename, '.ht') == 0) {
return false;
}
// ziskat priponu souboru
$suffix = strtolower(substr(strrchr($filename, '.'), 1));
// vlastni definovane prijatelne pripony
if (count($this->restrictSuffixes) > 0 && array_search($suffix, $this->restrictSuffixes) === false) {
return false;
}
// vlastni definovane zakazane pripony
if (array_search($suffix, $this->forbidSuffixes) !== false) {
return false;
}
return true;
}
// ------------------------------------------------
// fce zkontroluje, zda ma uzivatel pravo videt dany soubor
public function verifyUserAccessRight2Folder($folder, $action = 'read')
{
global $class;
if ($action != 'read' && $action != 'write') {
trigger_error('FileManager->verifyUserAccessRight2Folder: spatny atribut $action='.$action, E_USER_ERROR);
return false;
}
// system ma pravo nahlizet a zapisovat do vsech slozek
if ($this->currentUser == 'SYSTEM') {
return true;
}
// lomitko nakonec
$folder = $this->checkPathLastSlash($folder);
// bezny uzivatel
if (isset($this->userDefinition[$this->currentUser])) {
// pokud slozku nalezneme v povolenych slozkach pro danou operaci
for ($x = 0; $x < count($this->userDefinition[$this->currentUser][$action]); $x++) {
$c_folder = $this->userDefinition[$this->currentUser][$action][$x];
// kdyz je slozka definovana i se vsemi podrizenymi
if (substr($c_folder, -1) == '*') {
$c_folder = substr($c_folder, 0, -1);
$pos = strpos($folder, $c_folder);
if ($pos !== false && $pos == 0) {
return true;
}
} // je presne dana slozka, kterou muze videt
else {
if ($folder == $c_folder) {
return true;
}
}
}
}
return false;
}
// ----------------------------------------------------------
// fce vraci koncovku souboru
public function getFileSuffix($filename)
{
return strtolower(substr(strrchr($filename, '.'), 1));
}
// ----------------------------------------------------------
// fce zjistuje, jestli cesta konci na lomitko, kdyz ne, tak
// prida lomitko na konec
public function checkPathLastSlash($path)
{
$s = substr($path, -1);
return ($s == '/' || $s == '\\') ? $path : $path.'/';
}
// ----------------------------------------------------------
public function checkFileName($filename)
{
return eregi("^[-a-z0-9\_\./]+$", $filename);
}
// ----------------------------------------------------------
public function clearOutFileName($string)
{
$tbl = ["\xc3\xa1" => 'a', "\xc3\xa4" => 'a', "\xc4\x8d" => 'c', "\xc4\x8f" => 'd', "\xc3\xa9" => 'e', "\xc4\x9b" => 'e', "\xc3\xad" => 'i', "\xc4\xbe" => 'l', "\xc4\xba" => 'l', "\xc5\x88" => 'n', "\xc3\xb3" => 'o', "\xc3\xb6" => 'o', "\xc5\x91" => 'o', "\xc3\xb4" => 'o', "\xc5\x99" => 'r', "\xc5\x95" => 'r', "\xc5\xa1" => 's', "\xc5\xa5" => 't', "\xc3\xba" => 'u', "\xc5\xaf" => 'u', "\xc3\xbc" => 'u', "\xc5\xb1" => 'u', "\xc3\xbd" => 'y', "\xc5\xbe" => 'z', "\xc3\x81" => 'A', "\xc3\x84" => 'A', "\xc4\x8c" => 'C', "\xc4\x8e" => 'D', "\xc3\x89" => 'E', "\xc4\x9a" => 'E', "\xc3\x8d" => 'I', "\xc4\xbd" => 'L', "\xc4\xb9" => 'L', "\xc5\x87" => 'N', "\xc3\x93" => 'O', "\xc3\x96" => 'O', "\xc5\x90" => 'O', "\xc3\x94" => 'O', "\xc5\x98" => 'R', "\xc5\x94" => 'R', "\xc5\xa0" => 'S', "\xc5\xa4" => 'T', "\xc3\x9a" => 'U', "\xc5\xae" => 'U', "\xc3\x9c" => 'U', "\xc5\xb0" => 'U', "\xc3\x9d" => 'Y', "\xc5\xbd" => 'Z'];
$string = strtr($string, $tbl);
$string = eregi_replace("[^a-z^A-Z^0-9^\-^\.^\_]", '_', $string);
$string = eregi_replace("\_+", '_', $string);
$string = eregi_replace("^\_+", '', $string);
$string = eregi_replace("\_+$", '', $string);
$string = trim($string);
return $string;
}
// ----------------------------------------------------------
public function sortOutput($inputArr, $column, $direction)
{
$inputArr = (array) $inputArr;
switch ($column) {
case 'filename':
if ($direction == 'ASC') {
usort($inputArr, [$this, '_sort_filename_ASC']);
} else {
usort($inputArr, [$this, '_sort_filename_DESC']);
}
break;
case 'filetype':
if ($direction == 'ASC') {
usort($inputArr, [$this, '_sort_filetype_ASC']);
} else {
usort($inputArr, [$this, '_sort_filetype_DESC']);
}
break;
case 'filesize':
if ($direction == 'ASC') {
usort($inputArr, [$this, '_sort_filesize_ASC']);
} else {
usort($inputArr, [$this, '_sort_filesize_DESC']);
}
break;
case 'filemtime':
if ($direction == 'ASC') {
usort($inputArr, [$this, '_sort_filemtime_ASC']);
} else {
usort($inputArr, [$this, '_sort_filemtime_DESC']);
}
break;
}
return $inputArr;
}
// ----------------------------------------------------------
public function _sort_filename_ASC($a, $b)
{
$propA = $a['filename'];
$propB = $b['filename'];
return strcmp($propA, $propB);
}
public function _sort_filename_DESC($a, $b)
{
$propA = $a['path_abs'];
$propB = $b['path_abs'];
return strcmp($propA, $propB) * (-1);
}
public function _sort_filetype_ASC($a, $b)
{
$propA = strtolower($a['filetype']);
$propB = strtolower($b['filetype']);
return strcmp($propA, $propB);
}
public function _sort_filetype_DESC($a, $b)
{
$propA = strtolower($a['filetype']);
$propB = strtolower($b['filetype']);
return strcmp($propA, $propB) * (-1);
}
public function _sort_filesize_ASC($a, $b)
{
$propA = filesize($a['path_abs']);
$propB = filesize($b['path_abs']);
if ($propA == $propB) {
return 0;
}
return ($propA < $propB) ? -1 : 1;
}
public function _sort_filesize_DESC($a, $b)
{
$propA = filesize($a['path_abs']);
$propB = filesize($b['path_abs']);
if ($propA == $propB) {
return 0;
}
return ($propA > $propB) ? -1 : 1;
}
public function _sort_filemtime_ASC($a, $b)
{
$propA = filemtime($a['path_abs']);
$propB = filemtime($b['path_abs']);
if ($propA == $propB) {
return 0;
}
return ($propA < $propB) ? -1 : 1;
}
public function _sort_filemtime_DESC($a, $b)
{
$propA = filemtime($a['path_abs']);
$propB = filemtime($b['path_abs']);
if ($propA == $propB) {
return 0;
}
return ($propA > $propB) ? -1 : 1;
}
// ----------------------------------------------------------
}