/** * @param AJXP_Node $ajxpNode * @param array $httpVars * @param bool $update * @return Repository[]|ShareLink[] * @throws Exception */ public function shareNode($ajxpNode, $httpVars, &$update) { $hiddenUserEntries = array(); $originalHttpVars = $httpVars; $ocsStore = new Pydio\OCS\Model\SQLStore(); $ocsClient = new Pydio\OCS\Client\OCSClient(); $userSelection = new UserSelection($this->repository, $httpVars); $mess = ConfService::getMessages(); /** * @var ShareLink[] $shareObjects */ $shareObjects = array(); // PUBLIC LINK if (isset($httpVars["enable_public_link"])) { if (!$this->getAuthorization($ajxpNode->isLeaf() ? "file" : "folder", "minisite")) { throw new Exception($mess["share_center." . ($ajxpNode->isLeaf() ? "225" : "226")]); } $this->shareObjectFromParameters($httpVars, $hiddenUserEntries, $shareObjects, "public"); } else { if (isset($httpVars["disable_public_link"])) { $this->getShareStore()->deleteShare("minisite", $httpVars["disable_public_link"], true); } } if (isset($httpVars["ocs_data"])) { $ocsData = json_decode($httpVars["ocs_data"], true); $removeLinks = $ocsData["REMOVE"]; foreach ($removeLinks as $linkHash) { // Delete Link, delete invitation(s) $this->getShareStore()->deleteShare("minisite", $linkHash, true); $invitations = $ocsStore->invitationsForLink($linkHash); foreach ($invitations as $invitation) { $ocsStore->deleteInvitation($invitation); $ocsClient->cancelInvitation($invitation); } } $newLinks = $ocsData["LINKS"]; foreach ($newLinks as $linkData) { $this->shareObjectFromParameters($linkData, $hiddenUserEntries, $shareObjects, "targetted", $userSelection->getUniqueNode()->getLabel()); } } $this->filterHttpVarsFromUniqueNode($httpVars, $ajxpNode); $users = array(); $groups = array(); $this->getRightsManager()->createUsersFromParameters($httpVars, $users, $groups); if ((count($users) || count($groups)) && !$this->getAuthorization($ajxpNode->isLeaf() ? "file" : "folder", "workspace")) { $users = $groups = array(); } foreach ($hiddenUserEntries as $entry) { $users[$entry["ID"]] = $entry; } if (!count($users) && !count($groups)) { ob_start(); unset($originalHttpVars["hash"]); $this->switchAction("unshare", $originalHttpVars, array()); ob_end_clean(); return null; } $newRepo = $this->createSharedRepository($httpVars, $repoUpdate, $users, $groups); foreach ($shareObjects as $shareObject) { $shareObject->setParentRepositoryId($this->repository->getId()); $shareObject->attachToRepository($newRepo->getId()); $shareObject->save(); if ($shareObject instanceof \Pydio\OCS\Model\TargettedLink) { $invitation = $shareObject->getPendingInvitation(); if (!empty($invitation)) { $ocsStore->generateInvitationId($invitation); try { $ocsClient->sendInvitation($invitation); } catch (Exception $e) { $this->getShareStore()->deleteShare("minisite", $shareObject->getHash(), true); $shareUserId = $shareObject->getUniqueUser(); unset($users[$shareUserId]); if (!count($users) && !count($groups)) { $this->getShareStore()->deleteShare("repository", $newRepo->getId()); } throw $e; } $ocsStore->storeInvitation($invitation); } } else { $this->getPublicAccessManager()->initFolder(); $url = $this->getPublicAccessManager()->buildPublicLink($shareObject->getHash()); $existingShortForm = $shareObject->getShortFormUrl(); if (empty($existingShortForm)) { $shortForm = ""; AJXP_Controller::applyHook("url.shorten", array($url, &$shortForm)); if (!empty($shortForm)) { $shareObject->setShortFormUrl($shortForm); $shareObject->save(); } } } } $shareObjects[] = $newRepo; return $shareObjects; }
public static function getNodes($checkStats = false, $touch = true) { if (isset(self::$output)) { return self::$output; } $mess = ConfService::getMessages(); $repos = ConfService::getAccessibleRepositories(); $output = array(); $touchReposIds = array(); foreach ($repos as $repo) { if (!$repo->hasOwner() || !$repo->hasContentFilter()) { continue; } $repoId = $repo->getId(); if (strpos("ocs_remote_share_", $repoId) !== 0) { $touchReposIds[] = $repoId; } $url = "pydio://" . $repoId . "/"; $meta = array("shared_repository_id" => $repoId, "ajxp_description" => "File shared by " . $repo->getOwner() . " " . AJXP_Utils::relativeDate($repo->getOption("CREATION_TIME"), $mess), "share_meta_type" => 1); $cFilter = $repo->getContentFilter(); $filter = $cFilter instanceof ContentFilter ? array_keys($cFilter->filters)[0] : $cFilter; if (!is_array($filter)) { $label = basename($filter); } else { $label = $repo->getDisplay(); } if (strpos($repoId, "ocs_remote_share") !== 0) { // FOR REMOTE SHARES, DO NOT APPEND THE DOCUMENTNAME, WE STAT THE ROOT DIRECTLY $url .= $label; } $status = null; $remoteShare = null; $name = pathinfo($label, PATHINFO_FILENAME); $ext = pathinfo($label, PATHINFO_EXTENSION); $node = new AJXP_Node($url); $node->setLabel($label); if ($checkStats) { $node->getRepository()->driverInstance = null; try { ConfService::loadDriverForRepository($node->getRepository()); } catch (Exception $e) { $ext = "error"; $meta["ajxp_mime"] = "error"; } $node->getRepository()->detectStreamWrapper(true); $stat = @stat($url); if ($stat === false) { $ext = "error"; $meta["ajxp_mime"] = "error"; $meta["share_meta_type"] = 2; } else { if (strpos($repoId, "ocs_remote_share_") === 0) { // Check Status $linkId = str_replace("ocs_remote_share_", "", $repoId); $ocsStore = new \Pydio\OCS\Model\SQLStore(); $remoteShare = $ocsStore->remoteShareById($linkId); $status = $remoteShare->getStatus(); if ($status == OCS_INVITATION_STATUS_PENDING) { $stat = stat(AJXP_Utils::getAjxpTmpDir()); $ext = "invitation"; $meta["ajxp_mime"] = "invitation"; $meta["share_meta_type"] = 0; } else { $meta["remote_share_accepted"] = "true"; } $meta["remote_share_id"] = $remoteShare->getId(); } } if ($ext == "invitation") { $label .= " (" . $mess["inbox_driver.4"] . ")"; } else { if ($ext == "error") { $label .= " (" . $mess["inbox_driver.5"] . ")"; } } if (is_array($stat) && AuthService::getLoggedUser() != null) { $acl = AuthService::getLoggedUser()->mergedRole->getAcl($repoId); if ($acl == "r") { self::disableWriteInStat($stat); } } } $index = 0; $suffix = ""; while (isset($output[$name . $suffix . "." . $ext])) { $index++; $suffix = " ({$index})"; } $output[$name . $suffix . "." . $ext] = ["label" => $label, "url" => $url, "remote_share" => $remoteShare, "meta" => $meta]; if (isset($stat)) { $output[$name . $suffix . "." . $ext]['stat'] = $stat; } } ConfService::loadDriverForRepository(ConfService::getRepository()); self::$output = $output; if ($touch) { if (count($touchReposIds) && AuthService::getLoggedUser() != null) { $uPref = AuthService::getLoggedUser()->getPref("repository_last_connected"); if (empty($uPref)) { $uPref = array(); } foreach ($touchReposIds as $rId) { $uPref[$rId] = time(); } AuthService::getLoggedUser()->setPref("repository_last_connected", $uPref); } } return $output; }