%PDF- %PDF-
Direktori : /var/www/projetos/stb.ind.br/wp-content/plugins/webp-express/lib/classes/ |
Current File : /var/www/projetos/stb.ind.br/wp-content/plugins/webp-express/lib/classes/FileHelper.php |
<?php namespace WebPExpress; class FileHelper { public static function fileExists($filename) { return @file_exists($filename); } /** * Get file permission of a file (integer). Only get the last part, ie 0644 * If failure, it returns false */ public static function filePerm($filename) { if (!self::fileExists($filename)) { return false; } // fileperms can still fail. In that case, it returns false $perm = @fileperms($filename); if ($perm === false) { return false; } return octdec(substr(decoct($perm), -4)); } /** * Get file permission of a file (integer). Only get the last part, ie 0644 * If failure, it returns $fallback */ public static function filePermWithFallback($filename, $fallback) { $perm = self::filePerm($filename); if ($perm === false) { return $fallback; } return $perm; } public static function humanReadableFilePerm($mode) { return substr(decoct($mode), -4); } public static function humanReadableFilePermOfFile($filename) { return self::humanReadableFilePerm(self::filePerm($filename)); } /** * As the return value of the PHP function isn't reliable, * we have our own chmod. */ public static function chmod($filename, $mode) { // In case someone carelessly passed the result of a filePerm call, which was false: if ($mode === false) { return false; } $existingPermission = self::filePerm($filename); if ($mode === $existingPermission) { return true; } if (@chmod($filename, $mode)) { // in some cases chmod returns true, even though it did not succeed! // - so we test if our operation had the desired effect. if (self::filePerm($filename) !== $mode) { return false; } return true; } return false; } public static function chmod_r($dir, $dirPerm = null, $filePerm = null, $uid = null, $gid = null, $regexFileMatchPattern = null, $regexDirMatchPattern = null) { if (!@file_exists($dir) || (!@is_dir($dir))) { return; } $fileIterator = new \FilesystemIterator($dir); while ($fileIterator->valid()) { $filename = $fileIterator->getFilename(); $filepath = $dir . "/" . $filename; // echo $filepath . "\n"; $isDir = @is_dir($filepath); if ((!$isDir && (is_null($regexFileMatchPattern) || preg_match($regexFileMatchPattern, $filename))) || ($isDir && (is_null($regexDirMatchPattern) || preg_match($regexDirMatchPattern, $filename)))) { // chmod if ($isDir) { if (!is_null($dirPerm)) { self::chmod($filepath, $dirPerm); //echo '. chmod dir to:' . self::humanReadableFilePerm($dirPerm) . '. result:' . self::humanReadableFilePermOfFile($filepath) . "\n"; } } else { if (!is_null($filePerm)) { self::chmod($filepath, $filePerm); //echo '. chmod file to:' . self::humanReadableFilePerm($filePerm) . '. result:' . self::humanReadableFilePermOfFile($filepath) . "\n"; } } // chown if (!is_null($uid)) { @chown($filepath, $uid); } // chgrp if (!is_null($gid)) { @chgrp($filepath, $gid); } } // recurse if ($isDir) { self::chmod_r($filepath, $dirPerm, $filePerm, $uid, $gid, $regexFileMatchPattern, $regexDirMatchPattern); } // next! $fileIterator->next(); } } /** * Create a dir using same permissions as parent. * If */ /* public static function mkdirSamePermissionsAsParent($pathname) { }*/ /** * Get directory part of filename. * Ie '/var/www/.htaccess' => '/var/www' * Also works with backslashes */ public static function dirName($filename) { return preg_replace('/[\/\\\\][^\/\\\\]*$/', '', $filename); } /** * Determines if a file can be created. * BEWARE: It requires that the containing folder already exists */ public static function canCreateFile($filename) { $dirName = self::dirName($filename); if (!@file_exists($dirName)) { return false; } if (@is_writable($dirName) && @is_executable($dirName) || self::isWindows() ) { return true; } $existingPermission = self::filePerm($dirName); // we need to make sure we got the existing permission, so we can revert correctly later if ($existingPermission !== false) { if (self::chmod($dirName, 0775)) { // change back self::chmod($filename, $existingPermission); return true; } } return false; } /** * Note: Do not use for directories */ public static function canEditFile($filename) { if (!@file_exists($filename)) { return false; } if (@is_writable($filename) && @is_readable($filename)) { return true; } // As a last desperate try, lets see if we can give ourself write permissions. // If possible, then it will also be possible when actually writing $existingPermission = self::filePerm($filename); // we need to make sure we got the existing permission, so we can revert correctly later if ($existingPermission !== false) { if (self::chmod($filename, 0664)) { // change back self::chmod($filename, $existingPermission); return true; } } return false; // Idea: Perhaps we should also try to actually open the file for writing? } public static function canEditOrCreateFileHere($filename) { if (@file_exists($filename)) { return self::canEditFile($filename); } else { return self::canCreateFile($filename); } } /** * Try to read from a file. Tries hard. * Returns content, or false if read error. */ public static function loadFile($filename) { $changedPermission = false; if (!@is_readable($filename)) { $existingPermission = self::filePerm($filename); // we need to make sure we got the existing permission, so we can revert correctly later if ($existingPermission !== false) { $changedPermission = self::chmod($filename, 0664); } } $return = false; try { $handle = @fopen($filename, "r"); } catch (\ErrorException $exception) { $handle = false; error_log($exception->getMessage()); } if ($handle !== false) { // Return value is either file content or false if (filesize($filename) == 0) { $return = ''; } else { $return = @fread($handle, filesize($filename)); } fclose($handle); } if ($changedPermission) { // change back self::chmod($filename, $existingPermission); } return $return; } /* Remove dir and files in it recursively. No warnings returns $success */ public static function rrmdir($dir) { if (@is_dir($dir)) { $objects = @scandir($dir); foreach ($objects as $object) { if ($object != "." && $object != "..") { if (@is_dir($dir . "/" . $object)) self::rrmdir($dir . "/" . $object); else @unlink($dir . "/" . $object); } } return @rmdir($dir); } else { return false; } } /** * Copy dir and all its files. * Existing files are overwritten. * * @return $success */ public static function cpdir($sourceDir, $destinationDir) { if (!@is_dir($sourceDir)) { return false; } if (!@file_exists($destinationDir)) { if (!@mkdir($destinationDir)) { return false; } } $fileIterator = new \FilesystemIterator($sourceDir); $success = true; while ($fileIterator->valid()) { $filename = $fileIterator->getFilename(); if (($filename != ".") && ($filename != "..")) { //$filePerm = FileHelper::filePermWithFallback($filename, 0777); if (@is_dir($sourceDir . "/" . $filename)) { if (!self::cpdir($sourceDir . "/" . $filename, $destinationDir . "/" . $filename)) { $success = false; } } else { // its a file. if (!copy($sourceDir . "/" . $filename, $destinationDir . "/" . $filename)) { $success = false; } } } $fileIterator->next(); } return $success; } /** * Remove empty subfolders. * * Got it here: https://stackoverflow.com/a/1833681/842756 * * @return boolean If folder is (was) empty */ public static function removeEmptySubFolders($path, $removeEmptySelfToo = false) { if (!file_exists($path)) { return; } $empty = true; foreach (scandir($path) as $file) { if (($file == '.') || ($file == '..')) { continue; } $file = $path . DIRECTORY_SEPARATOR . $file; if (is_dir($file)) { if (!self::removeEmptySubFolders($file, true)) { $empty=false; } } else { $empty=false; } } if ($empty && $removeEmptySelfToo) { rmdir($path); } return $empty; } /** * Verify if OS is Windows * * * @return true if windows; false if not. */ public static function isWindows(){ return (boolean) preg_match('/^win/i', PHP_OS); } /** * Normalize separators of directory paths * * * @return $normalized_path */ public static function normalizeSeparator($path, $newSeparator = DIRECTORY_SEPARATOR){ return preg_replace("#[\\\/]+#", $newSeparator, $path); } /** * @return object|false Returns parsed file the file exists and can be read. Otherwise it returns false */ public static function loadJSONOptions($filename) { $json = self::loadFile($filename); if ($json === false) { return false; } $options = json_decode($json, true); if ($options === null) { return false; } return $options; } public static function saveJSONOptions($filename, $obj) { $result = @file_put_contents( $filename, json_encode($obj, JSON_UNESCAPED_SLASHES | JSON_NUMERIC_CHECK | JSON_PRETTY_PRINT) ); /*if ($result === false) { echo 'COULD NOT' . $filename; }*/ return ($result !== false); } }