init
This commit is contained in:
151
mysyde/common/traits/directoryFileWriterTrait.php
Normal file
151
mysyde/common/traits/directoryFileWriterTrait.php
Normal file
@@ -0,0 +1,151 @@
|
||||
<?php
|
||||
namespace DynCom\mysyde\common\traits;
|
||||
/**
|
||||
* Created by PhpStorm.
|
||||
* User: Bauer
|
||||
* Date: 6/14/2015
|
||||
* Time: 2:51 PM
|
||||
*/
|
||||
trait directoryFileWriterTrait {
|
||||
|
||||
protected $lowestWritableDir = '/htdocs';
|
||||
protected $enforceLowestWriteLevelLimit = true;
|
||||
protected $classOrSelfReferencePath = 'self';
|
||||
protected $canSidestep = true;
|
||||
|
||||
/**
|
||||
* @return array|bool|mixed|string
|
||||
*/
|
||||
protected function _getCurrentScriptPath() {
|
||||
$scriptPath = $this->truepath(dirname((new \ReflectionClass(get_class($this)))->getFileName()));
|
||||
return $scriptPath;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array|bool|mixed|string
|
||||
*/
|
||||
protected function _getCurrentSelfPath() {
|
||||
$scriptPath = $this->truepath(dirname($_SERVER['PHP_SELF']));
|
||||
return $scriptPath;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $directoryString
|
||||
* @return bool
|
||||
*/
|
||||
protected function canWriteToDirectory($directoryString) {
|
||||
if($this->classOrSelfReferencePath === 'self') {
|
||||
$curDir = $this->_getCurrentSelfPath();
|
||||
} elseif($this->classOrSelfReferencePath == 'class') {
|
||||
$curDir = $this->_getCurrentScriptPath();
|
||||
} else {
|
||||
$curDir = $this->_getCurrentSelfPath();
|
||||
}
|
||||
$curDirArr = $this->_createPathsArrFromDirStr($curDir);
|
||||
$dirArr = $this->truepath($directoryString,true,true,true);
|
||||
$dir = max($dirArr);
|
||||
if($this->enforceLowestWriteLevelLimit) {
|
||||
$realLowestWritableDir = $this->truepath($this->lowestWritableDir);
|
||||
$lowestPermittedLevel = count(explode(DIRECTORY_SEPARATOR,$realLowestWritableDir));
|
||||
$requestedLevel = count(explode(DIRECTORY_SEPARATOR,$dir));
|
||||
if($this->canSidestep) {
|
||||
return (($requestedLevel <= $lowestPermittedLevel) && is_writable($dir));
|
||||
} else {
|
||||
return (($requestedLevel <= $lowestPermittedLevel) && in_array($dir,$curDirArr) && is_writable($dir));
|
||||
}
|
||||
} elseif ($this->canSidestep) {
|
||||
return(is_writable($dir));
|
||||
} else {
|
||||
return(in_array($dir,$curDirArr) && is_writable($dir));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $path
|
||||
* @param bool|false $asArray
|
||||
* @param bool|false $mustExist
|
||||
* @param bool|false $mustBeWritable
|
||||
* @return array|bool|mixed|string
|
||||
*/
|
||||
protected function truepath($path,$asArray = false, $mustExist = false, $mustBeWritable = false){
|
||||
|
||||
// whether $path is unix or not
|
||||
$unipath=strlen($path)==0 || $path{0}!='/';
|
||||
// attempts to detect if path is relative in which case, add cwd
|
||||
if ($unipath && strpos($path,':') === false) {
|
||||
$path = getcwd() . DIRECTORY_SEPARATOR . $path;
|
||||
}
|
||||
// resolve path parts (single dot, double dot and double delimiters)
|
||||
$path = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $path);
|
||||
$parts = array_filter(explode(DIRECTORY_SEPARATOR, $path), 'strlen');
|
||||
$absolutes = array();
|
||||
foreach ($parts as $part) {
|
||||
if ('.' === $part) { continue; }
|
||||
if ('..' === $part) {
|
||||
array_pop($absolutes);
|
||||
} else {
|
||||
$absolutes[] = $part;
|
||||
}
|
||||
}
|
||||
$path=implode(DIRECTORY_SEPARATOR, $absolutes);
|
||||
// resolve any symlinks
|
||||
$pathExists = false;
|
||||
$pathIsWritable = false;
|
||||
|
||||
if(file_exists($path)) {
|
||||
$pathExists = true;
|
||||
if(is_writable($path)) {
|
||||
$pathIsWritable = true;
|
||||
}
|
||||
}
|
||||
|
||||
if ($pathExists && linkinfo($path) > 0) { $path = readlink($path); }
|
||||
// put initial separator that could have been lost
|
||||
$path = !$unipath ? '/'.$path : $path;
|
||||
if((!$mustExist || $pathExists) && (!$mustBeWritable || $pathIsWritable)) {
|
||||
if($asArray) {
|
||||
$paths = $this->_createPathsArrFromDirStr($path);
|
||||
return $paths;
|
||||
}
|
||||
return $path;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $dirStr
|
||||
* @param string $separator
|
||||
* @return array
|
||||
*/
|
||||
protected function _createPathsArrFromDirStr($dirStr, $separator = DIRECTORY_SEPARATOR) {
|
||||
$arr = explode($separator,$dirStr);
|
||||
$segCount = count($arr);
|
||||
$paths = array();
|
||||
for($i = 1;$i <= $segCount;++$i) {
|
||||
$tmpArr = array_slice($arr,0,$i-1);
|
||||
$str = implode($separator,$tmpArr);
|
||||
$paths[$i-1] .= $str;
|
||||
}
|
||||
return $paths;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $dir
|
||||
* @param $referenceDir
|
||||
* @return int
|
||||
*/
|
||||
protected function getDirLevelComparison($dir, $referenceDir){
|
||||
|
||||
$realDir = $this->truepath($dir);
|
||||
$realReferenceDir = $this->truepath($referenceDir);
|
||||
|
||||
$dirLevel = count(explode(DIRECTORY_SEPARATOR, $realDir));
|
||||
$referenceDirLevel = count(explode('/', $realReferenceDir));
|
||||
|
||||
return ($dirLevel - $referenceDirLevel);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user