public static function getNodeData($nodePath) { $basename = basename(parse_url($nodePath, PHP_URL_PATH)); if (empty($basename)) { return ['stat' => stat(AJXP_Utils::getAjxpTmpDir())]; } $allNodes = self::getNodes(false); $nodeData = $allNodes[$basename]; if (!isset($nodeData["stat"])) { if (in_array(pathinfo($basename, PATHINFO_EXTENSION), array("error", "invitation"))) { $stat = stat(AJXP_Utils::getAjxpTmpDir()); } else { $url = $nodeData["url"]; $node = new AJXP_Node($nodeData["url"]); $node->getRepository()->driverInstance = null; try { ConfService::loadDriverForRepository($node->getRepository()); $node->getRepository()->detectStreamWrapper(true); if ($node->getRepository()->hasContentFilter()) { $node->setLeaf(true); } AJXP_Controller::applyHook("node.read", array(&$node)); $stat = stat($url); } catch (Exception $e) { $stat = stat(AJXP_Utils::getAjxpTmpDir()); } if (is_array($stat) && AuthService::getLoggedUser() != null) { $acl = AuthService::getLoggedUser()->mergedRole->getAcl($nodeData["meta"]["shared_repository_id"]); if ($acl == "r") { self::disableWriteInStat($stat); } } self::$output[$basename]["stat"] = $stat; } $nodeData["stat"] = $stat; } return $nodeData; }
public function mkDir($crtDir, $newDirName, $ignoreExists = false) { $currentNodeDir = new AJXP_Node($this->urlBase . $crtDir); AJXP_Controller::applyHook("node.before_change", array(&$currentNodeDir)); $mess = ConfService::getMessages(); if ($newDirName == "") { return "{$mess['37']}"; } if (file_exists($this->urlBase . "{$crtDir}/{$newDirName}")) { if ($ignoreExists) { return null; } return "{$mess['40']}"; } if (!$this->isWriteable($this->urlBase . "{$crtDir}")) { return $mess[38] . " {$crtDir} " . $mess[99]; } $dirMode = 0775; $chmodValue = $this->repository->getOption("CHMOD_VALUE"); if (isset($chmodValue) && $chmodValue != "") { $dirMode = octdec(ltrim($chmodValue, "0")); if ($dirMode & 0400) { $dirMode |= 0100; } // User is allowed to read, allow to list the directory if ($dirMode & 040) { $dirMode |= 010; } // Group is allowed to read, allow to list the directory if ($dirMode & 04) { $dirMode |= 01; } // Other are allowed to read, allow to list the directory } $old = umask(0); mkdir($this->urlBase . "{$crtDir}/{$newDirName}", $dirMode); umask($old); $newNode = new AJXP_Node($this->urlBase . $crtDir . "/" . $newDirName); $newNode->setLeaf(false); AJXP_Controller::applyHook("node.change", array(null, $newNode, false)); return null; }
/** * @param Repository $repositoryObject */ public function clearWorkspaceNodeInfos($repositoryObject) { $cDriver = ConfService::getCacheDriverImpl(); if (empty($cDriver) || !$cDriver->supportsPatternDelete(AJXP_CACHE_SERVICE_NS_NODES)) { return; } $node = new AJXP_Node("pydio://" . $repositoryObject->getId() . "/"); $node->setLeaf(false); $this->clearCacheForNode($node); }
/** * @param String $destDir url of destination dir * @param String $srcFile url of source file * @param Array $error accumulator for error messages * @param Array $success accumulator for success messages * @param bool $move Whether to copy or move * @param array $srcRepoData Set of data concerning source repository: base_url, wrapper_name and recycle option * @param array $destRepoData Set of data concerning destination repository: base_url, wrapper_name and chmod option */ protected function copyOrMoveFile($destDir, $srcFile, &$error, &$success, $move = false, $srcRepoData = array(), $destRepoData = array()) { $srcUrlBase = $srcRepoData['base_url']; $srcWrapperName = $srcRepoData['wrapper_name']; $srcRecycle = $srcRepoData['recycle']; $destUrlBase = $destRepoData['base_url']; $destWrapperName = $destRepoData['wrapper_name']; $mess = ConfService::getMessages(); $bName = basename($srcFile); $localName = ''; AJXP_Controller::applyHook("dl.localname", array($srcFile, &$localName, $srcWrapperName)); if (!empty($localName)) { $bName = $localName; } $destFile = $destUrlBase . $destDir . "/" . $bName; $realSrcFile = $srcUrlBase . $srcFile; if (is_dir(dirname($realSrcFile)) && strpos($destFile, rtrim($realSrcFile, "/") . "/") === 0) { $error[] = $mess[101]; return; } if (!file_exists($realSrcFile)) { $error[] = $mess[100] . $srcFile; return; } if (!$move) { if (method_exists($this, "filesystemFileSize")) { $size = $this->filesystemFileSize($realSrcFile); } else { $size = filesize($realSrcFile); } AJXP_Controller::applyHook("node.before_create", array(new AJXP_Node($destFile), $size)); } if (dirname($realSrcFile) == dirname($destFile)) { if ($move) { $error[] = $mess[101]; return; } else { $base = basename($srcFile); $i = 1; if (is_file($realSrcFile)) { $dotPos = strrpos($base, "."); if ($dotPos > -1) { $radic = substr($base, 0, $dotPos); $ext = substr($base, $dotPos); } } // auto rename file $i = 1; $newName = $base; while (file_exists($destUrlBase . $destDir . "/" . $newName)) { $suffix = "-{$i}"; if (isset($radic)) { $newName = $radic . $suffix . $ext; } else { $newName = $base . $suffix; } $i++; } $destFile = $destUrlBase . $destDir . "/" . $newName; } } $srcNode = new AJXP_Node($realSrcFile); $destNode = new AJXP_Node($destFile); if (!is_file($realSrcFile)) { $errors = array(); $succFiles = array(); $srcNode->setLeaf(false); if ($move) { AJXP_Controller::applyHook("node.before_path_change", array($srcNode)); if (file_exists($destFile)) { $this->deldir($destFile, $destRepoData); } $res = rename($realSrcFile, $destFile); } else { $dirRes = $this->dircopy($realSrcFile, $destFile, $errors, $succFiles, false, true, $srcRepoData, $destRepoData); } if (count($errors) || isset($res) && $res !== true) { $error[] = $mess[114]; return; } else { $destNode->setLeaf(false); AJXP_Controller::applyHook("node.change", array($srcNode, $destNode, !$move)); } } else { if ($move) { AJXP_Controller::applyHook("node.before_path_change", array($srcNode)); if (file_exists($destFile)) { unlink($destFile); } if (strcmp($srcWrapperName, $destWrapperName) === 0) { $res = rename($realSrcFile, $destFile); } else { $res = copy($realSrcFile, $destFile); } AJXP_Controller::applyHook("node.change", array($srcNode, $destNode, false)); } else { try { $this->filecopy($realSrcFile, $destFile, $srcWrapperName, $destWrapperName); $this->changeMode($destFile, $destRepoData); AJXP_Controller::applyHook("node.change", array($srcNode, $destNode, true)); } catch (Exception $e) { $error[] = $e->getMessage(); return; } } } if ($move) { // Now delete original // $this->deldir($realSrcFile); // both file and dir $messagePart = $mess[74] . " " . SystemTextEncoding::toUTF8($destDir); if (RecycleBinManager::recycleEnabled() && $destDir == RecycleBinManager::getRelativeRecycle()) { RecycleBinManager::fileToRecycle($srcFile); $messagePart = $mess[123] . " " . $mess[122]; } if (isset($dirRes)) { $success[] = $mess[117] . " " . SystemTextEncoding::toUTF8(basename($srcFile)) . " " . $messagePart . " (" . SystemTextEncoding::toUTF8($dirRes) . " " . $mess[116] . ") "; } else { $success[] = $mess[34] . " " . SystemTextEncoding::toUTF8(basename($srcFile)) . " " . $messagePart; } } else { if (RecycleBinManager::recycleEnabled() && $destDir == "/" . $srcRecycle) { RecycleBinManager::fileToRecycle($srcFile); } if (isset($dirRes)) { $success[] = $mess[117] . " " . SystemTextEncoding::toUTF8(basename($srcFile)) . " " . $mess[73] . " " . SystemTextEncoding::toUTF8($destDir) . " (" . SystemTextEncoding::toUTF8($dirRes) . " " . $mess[116] . ")"; } else { $success[] = $mess[34] . " " . SystemTextEncoding::toUTF8(basename($srcFile)) . " " . $mess[73] . " " . SystemTextEncoding::toUTF8($destDir); } } }
public function processReadHook(AJXP_Node $node) { $ids = $this->getWatchesOnNode($node, self::$META_WATCH_READ); $notif = new AJXP_Notification(); $notif->setAction(AJXP_NOTIF_NODE_VIEW); $notif->setNode($node); if (count($ids)) { foreach ($ids as $id) { $this->notificationCenter->postNotification($notif, $id); } } if (!$node->isRoot()) { $parentNode = new AJXP_Node(dirname($node->getUrl())); $parentNode->setLeaf(false); $ids = $this->getWatchesOnNode($parentNode, self::$META_WATCH_READ); if (count($ids)) { // POST NOW : PARENT FOLDER IS AFFECTED $parentNotif = new AJXP_Notification(); $parentNotif->setNode($parentNode); $parentNotif->setAction(AJXP_NOTIF_NODE_VIEW); $this->notificationCenter->prepareNotification($notif); $parentNotif->addRelatedNotification($notif); foreach ($ids as $id) { $this->notificationCenter->postNotification($parentNotif, $id); } } } }
public function delete($selectedFiles, &$logMessages) { $repoData = array('base_url' => $this->urlBase, 'chmod' => $this->repository->getOption('CHMOD_VALUE'), 'recycle' => $this->repository->getOption('RECYCLE_BIN')); $mess = ConfService::getMessages(); foreach ($selectedFiles as $selectedFile) { if ($selectedFile == "" || $selectedFile == DIRECTORY_SEPARATOR) { return $mess[120]; } $fileToDelete = $this->urlBase . $selectedFile; if (!file_exists($fileToDelete)) { $logMessages[] = $mess[100] . " " . SystemTextEncoding::toUTF8($selectedFile); continue; } $node = new AJXP_Node($fileToDelete); $node->setLeaf(!is_dir($fileToDelete)); $this->deldir($fileToDelete, $repoData); if ($node->isLeaf()) { $logMessages[] = "{$mess['38']} " . SystemTextEncoding::toUTF8($selectedFile) . " {$mess['44']}."; } else { $logMessages[] = "{$mess['34']} " . SystemTextEncoding::toUTF8($selectedFile) . " {$mess['44']}."; } AJXP_Controller::applyHook("node.change", [$node]); } return null; }