%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/Plugin.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 Plugin extends \Sabre\DAV\ServerPlugin {
/**
* Server class
*
* @var \Sabre\DAV\Server
*/
protected $server;
/**
* @var \CAccount
*/
protected $oAccount = null;
/**
* @var \CApiFilestorageManager
*/
protected $oApiFilestorage = null;
/**
* @var \CApiTenantsManager
*/
protected $oApiTenants = null;
/**
* @var \CApiMinManager
*/
protected $oApiMin = null;
/**
* @var \CApiUsersManager
*/
protected $oApiUsers= null;
protected $sOldPath = null;
protected $sOldID = null;
protected $sNewPath = null;
protected $sNewID = null;
public function getFilestorageMan()
{
if ($this->oApiFilestorage == null)
{
$this->oApiFilestorage = \CApi::Manager('filestorage', 'sabredav');
}
return $this->oApiFilestorage;
}
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 getMinMan()
{
if ($this->oApiMin == null)
{
$this->oApiMin = \CApi::Manager('min');
}
return $this->oApiMin;
}
public function getAccount() {
if (!isset($this->oAccount) && isset($this->server))
{
$this->oAccount = $this->server->getAccount();
}
return $this->oAccount;
}
/**
* Initializes the plugin
*
* @param \Sabre\DAV\Server $server
* @return void
*/
public function initialize(\Sabre\DAV\Server $server) {
$this->server = $server;
$this->server->subscribeEvent('beforeMethod', array($this, 'beforeMethod'));
$this->server->subscribeEvent('beforeBind', array($this, 'beforeBind'), 30);
$this->server->subscribeEvent('afterUnbind', array($this, 'afterUnbind'), 30);
}
/**
* Returns a list of supported features.
*
* This is used in the DAV: header in the OPTIONS and PROPFIND requests.
*
* @return array
*/
public function getFeatures() {
return array('files');
}
public static function getPersonalPath()
{
return ltrim(\afterlogic\DAV\Constants::FILESTORAGE_PATH_ROOT . \afterlogic\DAV\Constants::FILESTORAGE_PATH_PERSONAL, '/');
}
public static function getCorporatePath()
{
return ltrim(\afterlogic\DAV\Constants::FILESTORAGE_PATH_ROOT . \afterlogic\DAV\Constants::FILESTORAGE_PATH_CORPORATE, '/');
}
public static function getSharedPath()
{
return ltrim(\afterlogic\DAV\Constants::FILESTORAGE_PATH_ROOT . \afterlogic\DAV\Constants::FILESTORAGE_PATH_SHARED, '/');
}
public static function isFilestoragePrivate($path)
{
if (strpos($path, self::getPersonalPath()) !== false)
{
return true;
}
return false;
}
public static function isFilestorageCorporate($path)
{
if (strpos($path, self::getCorporatePath()) !== false)
{
return true;
}
return false;
}
public static function isFilestorageShared($path)
{
if (strpos($path, self::getSharedPath()) !== false)
{
return true;
}
return false;
}
public static function getTypeFromPath($path)
{
$iResult = \EFileStorageType::Personal;
if (self::isFilestoragePrivate($path))
{
$iResult = \EFileStorageType::Personal;
}
if (self::isFilestorageCorporate($path))
{
$iResult = \EFileStorageType::Corporate;
}
if (self::isFilestorageShared($path))
{
$iResult = \EFileStorageType::Shared;
}
return $iResult;
}
public static function getFilePathFromPath($path)
{
$sPath = '';
if (self::isFilestoragePrivate($path))
{
$sPath = self::getPersonalPath();
}
if (self::isFilestorageCorporate($path))
{
$sPath = self::getCorporatePath();
}
if (self::isFilestorageShared($path))
{
$sPath = self::getSharedPath();
}
return str_replace($sPath, '', $path);
}
function beforeMethod($methodName, $uri) {
\CApi::Log('METHOD: ' . $methodName, \ELogLevel::Full, 'fs-');
\CApi::Log('URI: ' . $uri, \ELogLevel::Full, 'fs-');
if ($methodName === 'MOVE')
{
$GLOBALS['__FILESTORAGE_MOVE_ACTION__'] = true;
}
return true;
}
/**
* @param string $path
* @throws \Sabre\DAV\Exception\NotAuthenticated
* @return bool
*/
public function beforeBind($path)
{
if (self::isFilestoragePrivate($path) || self::isFilestorageCorporate($path))
{
$oAccount = $this->getAccount();
if ($oAccount)
{
$iType = self::getTypeFromPath($path);
$sFilePath = self::getFilePathFromPath(dirname($path));
$sFileName = basename($path);
$this->sNewPath = $path;
$this->sNewID = implode('|', array($oAccount->IdAccount, $iType, $sFilePath, $sFileName));
}
}
return true;
}
/**
* @param string $path
* @throws \Sabre\DAV\Exception\NotAuthenticated
* @return bool
*/
public function afterUnbind($path)
{
if (self::isFilestoragePrivate($path) || self::isFilestorageCorporate($path))
{
$oAccount = $this->getAccount();
if ($oAccount)
{
$iType = self::getTypeFromPath($path);
$sFilePath = self::getFilePathFromPath(dirname($path));
$sFileName = basename($path);
$oMin = $this->getMinMan();
$this->sOldPath = $path;
$this->sOldID = implode('|', array($oAccount->IdAccount, $iType, $sFilePath, $sFileName));
$aData = $oMin->GetMinByID($this->sOldID);
\CApi::Log('OldID: ' . $this->sOldID, \ELogLevel::Full, 'fs-');
\CApi::Log('NewID: ' . $this->sNewID, \ELogLevel::Full, 'fs-');
if (isset($this->sNewPath))
{
// $node = $this->server->tree->getNodeForPath($this->sNewPath);
// \CApi::LogObject($node, \ELogLevel::Full, 'fs-');
}
if (isset($this->sNewID) && !empty($aData['__hash__']))
{
$aNewData = explode('|', $this->sNewID);
$aParams = array(
'Type' => $aNewData[1],
'Path' => $aNewData[2],
'Name' => $aNewData[3],
'Size' => $aData['Size']
);
$oMin->UpdateMinByID($this->sOldID, $aParams, $this->sNewID);
}
else
{
$oMin->DeleteMinByID($this->sOldID);
}
}
}
$GLOBALS['__FILESTORAGE_MOVE_ACTION__'] = false;
return true;
}
}