/**
  * @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;
 }