. * */ namespace OCA\Documents; class File { protected $fileId; protected $owner; protected $path; protected $sharing = array(); protected $token =''; protected $passwordProtected = false; public function __construct($fileId, $shareOps = null){ if (!$fileId){ throw new \Exception('No valid file has been passed'); } $this->fileId = $fileId; //if you know how to get sharing info by fileId via API, //please send me a link to video tutorial :/ if (!is_null($shareOps)){ $this->sharing = $shareOps; } } public static function getByShareToken($token){ $linkItem = \OCP\Share::getShareByToken($token, false); if (is_array($linkItem) && isset($linkItem['uid_owner'])) { // seems to be a valid share $rootLinkItem = \OCP\Share::resolveReShare($linkItem); } else { throw new \Exception('This file was probably unshared'); } $file = new File($rootLinkItem['file_source'], array($rootLinkItem)); $file->setToken($token); if (isset($linkItem['share_with']) && !empty($linkItem['share_with'])){ $file->setPasswordProtected(true); } return $file; } public function getToken(){ return $this->token; } public function getFileId(){ return $this->fileId; } public function setOwner($owner){ $this->owner = $owner; } public function setPath($path){ $this->path = $path; } public function setToken($token){ $this->token = $token; } public function isPublicShare(){ return !empty($this->token); } public function isPasswordProtected(){ return $this->passwordProtected; } public function checkPassword($password){ $shareId = $this->sharing[0]['id']; if (!$this->isPasswordProtected() || (\OC::$server->getSession()->exists('public_link_authenticated') && \OC::$server->getSession()->get('public_link_authenticated') === $shareId ) ){ return true; } // Check Password $forcePortable = (CRYPT_BLOWFISH != 1); $hasher = new \PasswordHash(8, $forcePortable); if ( $hasher->CheckPassword( $password.\OC_Config::getValue('passwordsalt', ''), $this->getPassword() ) ) { // Save item id in session for future request \OC::$server->getSession()->set('public_link_authenticated', $shareId); return true; } return false; } public function setPasswordProtected($value){ $this->passwordProtected = $value; } public function getPermissions(){ if (count($this->sharing)){ if ($this->isPublicShare()){ $permissions = \OCP\PERMISSION_READ | \OCP\PERMISSION_UPDATE; } else { $permissions = $this->sharing[0]['permissions']; } } else { list($owner, $path) = $this->getOwnerViewAndPath(); $permissions = 0; if (\OC\Files\Filesystem::isReadable($path)){ $permissions |= \OCP\PERMISSION_READ; } if (\OC\Files\Filesystem::isUpdatable($path)){ $permissions |= \OCP\PERMISSION_UPDATE; } } return $permissions; } /** * * @return string owner of the current file item * @throws \Exception */ public function getOwnerViewAndPath($useDefaultRoot = false){ if ($this->isPublicShare()){ $rootLinkItem = \OCP\Share::resolveReShare($this->sharing[0]); if (isset($rootLinkItem['uid_owner'])){ $owner = $rootLinkItem['uid_owner']; \OCP\JSON::checkUserExists($rootLinkItem['uid_owner']); \OC_Util::tearDownFS(); \OC_Util::setupFS($rootLinkItem['uid_owner']); } else { throw new \Exception($this->fileId . ' is a broken share'); } $view = new View('/' . $owner . '/files'); } else { $owner = \OCP\User::getUser(); $root = '/' . $owner; if ($useDefaultRoot){ $root .= '/' . 'files'; } $view = new View($root); } $path = $view->getPath($this->fileId); if (!$path){ throw new \Exception($this->fileId . ' can not be resolved'); } $this->path = $path; $this->owner = $owner; if (!$view->file_exists($this->path)){ throw new \Exception($this->path . ' doesn\'t exist'); } return array($view, $this->path); } public function getOwner(){ if (!$this->owner){ $this->getOwnerViewAndPath(); } return $this->owner; } protected function getPassword(){ return $this->sharing[0]['share_with']; } }