%PDF- %PDF-
| Direktori : /www/varak.net/mail2.varak.net_old/libraries/afterlogic/DAV/FS/ |
| Current File : /www/varak.net/mail2.varak.net_old/libraries/afterlogic/DAV/FS/Directory.php |
<?php
/*
* Copyright 2004-2014, AfterLogic Corp.
* Licensed under AGPLv3 license or AfterLogic license
* if commercial version of the product was purchased.
* See the LICENSE file for a full license statement.
*/
namespace afterlogic\DAV\FS;
class Directory extends \Sabre\DAV\FSExt\Directory {
/**
* @var \CApiTenantsManager
*/
protected $oApiTenants = null;
/**
* @var \CApiUsersManager
*/
protected $oApiUsers = null;
/**
* @var \CAccount
*/
protected $oAccount = null;
/**
* @var \CTenant
*/
protected $oTenant = null;
/**
* Constructor
*
* @param string $path
*/
public function __construct($path) {
$this->path = $path;
}
public function getTenantsMan()
{
if ($this->oApiTenants === null)
{
$this->oApiTenants = \CApi::Manager('tenants');
}
return $this->oApiTenants;
}
public function getUsersMan()
{
if ($this->oApiUsers == null)
{
$this->oApiUsers = \CApi::Manager('users');
}
return $this->oApiUsers;
}
public function getAccount()
{
if ($this->oAccount == null)
{
$sUser = \afterlogic\DAV\Auth\Backend::getInstance()->getCurrentUser();
$this->oAccount = \afterlogic\DAV\Utils::GetAccountByLogin($sUser);
}
return $this->oAccount;
}
public function getTenant()
{
if ($this->oTenant == null)
{
$oAccount = $this->getAccount();
if ($oAccount !== null)
{
$oApiTenants = $this->getTenantsMan();
if ($oApiTenants)
{
$this->oTenant = $oApiTenants->GetTenantById($oAccount->IdTenant);
}
}
}
return $this->oTenant;
}
public function initPath() {
}
public function getPath() {
return $this->path;
}
public function createDirectory($name) {
$this->initPath();
if ($name=='.' || $name=='..') throw new DAV\Exception\Forbidden('Permission denied to . and ..');
$newPath = $this->path . '/' . $name;
if (!is_dir($newPath))
{
mkdir($newPath, 0777, true);
}
}
public function createFile($name, $data = null) {
$this->initPath();
parent::createFile($name, $data);
$oFile = $this->getChild($name);
$aProps = $oFile->getProperties(array('Owner'));
if (!isset($aProps['Owner']))
{
$oAccount = $this->getAccount();
if ($oAccount)
{
$aProps['Owner'] = $oAccount->Email;
}
}
$oFile->updateProperties($aProps);
if (!$this->updateQuota())
{
$oFile->delete();
throw new \Sabre\DAV\Exception\InsufficientStorage();
}
}
public function getChild($name) {
$this->initPath();
$path = $this->path . '/' . trim($name, '/');
if (!file_exists($path)) throw new \Sabre\DAV\Exception\NotFound('File with name ' . $path . ' could not be located');
return is_dir($path) ? new Directory($path) : new File($path);
}
public function getChildren() {
$this->initPath();
$nodes = array();
if(!file_exists($this->path))
{
mkdir($this->path);
}
foreach(scandir($this->path) as $node)
{
if($node!='.' && $node!='..' && $node!== '.sabredav' && $node!== API_HELPDESK_PUBLIC_NAME)
{
$nodes[] = $this->getChild($node);
}
}
return $nodes;
}
public function childExists($name) {
$this->initPath();
return parent::childExists($name);
}
public function delete() {
$this->initPath();
parent::delete();
$this->updateQuota();
}
public function Search($pattern, $path = null)
{
$aResult = array();
$this->initPath();
$path = ($path === null) ? $this->path : $path;
$aItems = \api_Utils::SearchFiles($path, $pattern);
if ($aItems)
{
foreach ($aItems as $sItem)
{
$aResult[] = is_dir($sItem) ? new Directory($sItem) : new File($sItem);
}
}
return $aResult;
}
public function getRootPath($iType = \EFileStorageType::Personal)
{
$sRootPath = '';
$oAccount = $this->getAccount();
if ($oAccount)
{
if ($iType === \EFileStorageType::Corporate)
{
$sRootPath = \CApi::DataPath() . \afterlogic\DAV\Constants::FILESTORAGE_PATH_ROOT .
\afterlogic\DAV\Constants::FILESTORAGE_PATH_CORPORATE . '/' . $oAccount->IdTenant;
}
else if ($iType === \EFileStorageType::Shared)
{
$sRootPath = \CApi::DataPath() . \afterlogic\DAV\Constants::FILESTORAGE_PATH_ROOT .
\afterlogic\DAV\Constants::FILESTORAGE_PATH_SHARED . '/' . $oAccount->Email;
}
else
{
$sRootPath = \CApi::DataPath() . \afterlogic\DAV\Constants::FILESTORAGE_PATH_ROOT .
\afterlogic\DAV\Constants::FILESTORAGE_PATH_PERSONAL . '/' . $oAccount->Email;
}
}
return $sRootPath;
}
public function getFullQuotaInfo()
{
$iFreeSize = 0;
$sRootPath = $this->getRootPath(\EFileStorageType::Personal);
$aSize = \api_Utils::GetDirectorySize($sRootPath);
$iUsageSize = (int) $aSize['size'];
$sRootPath = $this->getRootPath(\EFileStorageType::Corporate);
$aSize = \api_Utils::GetDirectorySize($sRootPath);
$iUsageSize += (int) $aSize['size'];
$oAccount = $this->getAccount();
if ($oAccount)
{
$oTenant = $this->getTenant();
if ($oTenant)
{
$iFreeSize = ($oTenant->FilesUsageDynamicQuotaInMB * 1024 * 1024) - $iUsageSize;
}
}
return array($iUsageSize, $iFreeSize);
}
public function updateQuota()
{
if (isset($GLOBALS['__FILESTORAGE_MOVE_ACTION__']) && $GLOBALS['__FILESTORAGE_MOVE_ACTION__']) return true;
$iSizeUsage = 0;
$aQuota = $this->getFullQuotaInfo();
if (isset($aQuota[0]))
{
$iSizeUsage = $aQuota[0];
}
$oTenant = $this->getTenant();
if (!isset($oTenant))
{
return true;
}
else
{
$oTenantsMan = $this->getTenantsMan();
return $oTenantsMan->TryToAllocateFileUsage($oTenant, $iSizeUsage);
}
}
/**
* Returns the path to the resource file
*
* @return string
*/
protected function getResourceInfoPath() {
$this->initPath();
return $this->path . '/.sabredav';
}
/**
* Returns all the stored resource information
*
* @return array
*/
protected function getResourceData() {
$aResult = array();
$path = $this->getResourceInfoPath();
if (!file_exists($path)) return array('properties' => array());
// opening up the file, and creating a shared lock
$handle = fopen($path,'r');
flock($handle,LOCK_SH);
$sData = '';
// Reading data until the eof
while(!feof($handle)) {
$sData.=fread($handle,8192);
}
// We're all good
fclose($handle);
// Unserializing and checking if the resource file contains data for this file
$aData = unserialize($sData);
foreach ($aData as $sName => $aValue)
{
$aResultItem = array('@Name' => $sName);
if (isset($aValue['properties']) && is_array($aValue['properties']))
{
$aResultItem = array_merge($aResultItem, $aValue['properties']);
}
$aResult[] = $aResultItem;
}
return $aResult;
}
public function getChildrenProperties()
{
return $this->getResourceData();
}
}