/**
  * @param \PublicAccessManager $publicAccessManager
  * @param array $messages
  * @return mixed
  */
 public function getJsonData($publicAccessManager, $messages)
 {
     $jsonData = parent::getJsonData($publicAccessManager, $messages);
     $ocsStore = new SQLStore();
     $invitations = $ocsStore->invitationsForLink($this->getHash());
     if (count($invitations)) {
         $jsonData["invitation"] = array_shift($invitations)->jsonSerialize();
     }
     return $jsonData;
 }
 /**
  * @param array $httpVars
  * @param ShareLink $shareObject
  * @param bool $update
  * @param null $guestUserPass
  * @return array
  * @throws Exception
  */
 public function prepareSharedUserEntry($httpVars, &$shareObject, $update, $guestUserPass = null)
 {
     $userPass = null;
     $forcePassword = $this->options["SHARE_FORCE_PASSWORD"];
     if ($forcePassword && (isset($httpVars["create_guest_user"]) && $httpVars["create_guest_user"] == "true" && empty($guestUserPass) || isset($httpVars["guest_user_id"]) && isset($guestUserPass) && strlen($guestUserPass) == 0)) {
         $mess = ConfService::getMessages();
         throw new Exception($mess["share_center.175"]);
     }
     if ($update) {
         // THIS IS AN EXISTING SHARE
         // FIND SHARE AND EXISTING HIDDEN USER ID
         if ($shareObject->isAttachedToRepository()) {
             $existingRepo = $shareObject->getRepository();
             $this->store->testUserCanEditShare($existingRepo->getOwner(), $existingRepo->options);
         }
         $uniqueUser = $shareObject->getUniqueUser();
         if ($guestUserPass !== null && strlen($guestUserPass)) {
             $userPass = $guestUserPass;
             $shareObject->setUniqueUser($uniqueUser, true);
         } else {
             if (!$shareObject->shouldRequirePassword() || $guestUserPass !== null && $guestUserPass == "") {
                 $shareObject->setUniqueUser($uniqueUser, false);
             }
         }
         if ($update && $forcePassword && !$shareObject instanceof \Pydio\OCS\Model\TargettedLink && !$shareObject->shouldRequirePassword() && empty($guestUserPass)) {
             $mess = ConfService::getMessages();
             throw new Exception($mess["share_center.175"]);
         }
     } else {
         $update = false;
         $shareObject->createHiddenUserId($this->options["SHARED_USERS_TMP_PREFIX"], !empty($guestUserPass));
         if (!empty($guestUserPass)) {
             $userPass = $guestUserPass;
         } else {
             $userPass = $shareObject->createHiddenUserPassword();
         }
         $uniqueUser = $shareObject->getUniqueUser();
     }
     $hiddenUserEntry = $this->createHiddenUserEntry($httpVars, $uniqueUser, $userPass, $update);
     if (empty($hiddenUserEntry["RIGHT"])) {
         $mess = ConfService::getMessages();
         throw new Exception($mess["share_center.58"]);
     }
     $hiddenUserEntry["DISABLE_DOWNLOAD"] = $shareObject->disableDownload();
     if ($shareObject instanceof \Pydio\OCS\Model\TargettedLink) {
         $hiddenUserEntry["REMOTE"] = true;
     }
     return $hiddenUserEntry;
 }
 /**
  * @param ShareCenter $shareCenter
  * @param ShareStore $shareStore
  * @param ShareRightsManager $shareRightManager
  */
 public static function migrateLegacyMeta($shareCenter, $shareStore, $shareRightManager, $dryRun = true)
 {
     $metaStoreDir = AJXP_DATA_PATH . "/plugins/metastore.serial";
     $publicFolder = ConfService::getCoreConf("PUBLIC_DOWNLOAD_FOLDER");
     $metastores = glob($metaStoreDir . "/ajxp_meta_0");
     if ($dryRun) {
         print "RUNNING A DRY RUN FOR META MIGRATION";
     }
     foreach ($metastores as $store) {
         if (strpos($store, ".bak") !== false) {
             continue;
         }
         // Backup store
         if (!$dryRun) {
             copy($store, $store . ".bak");
         }
         $data = unserialize(file_get_contents($store));
         foreach ($data as $filePath => &$metadata) {
             foreach ($metadata as $userName => &$meta) {
                 if (!AuthService::userExists($userName)) {
                     continue;
                 }
                 $userObject = ConfService::getConfStorageImpl()->createUserObject($userName);
                 if (isset($meta["ajxp_shared"]) && isset($meta["ajxp_shared"]["element"])) {
                     print "\n\nItem {$filePath} requires upgrade :";
                     $share = $meta["ajxp_shared"];
                     $element = $meta["ajxp_shared"]["element"];
                     if (is_array($element)) {
                         $element = array_shift(array_keys($element));
                     }
                     // Take the first one only
                     $legacyLinkFile = $publicFolder . "/" . $element . ".php";
                     if (file_exists($legacyLinkFile)) {
                         // Load file, move it to DB and move the meta
                         $publiclet = $shareStore->loadShare($element);
                         rename($legacyLinkFile, $legacyLinkFile . ".migrated");
                         if (isset($share["minisite"])) {
                             print "\n--Migrate legacy minisite to new minisite?";
                             try {
                                 $sharedRepoId = $publiclet["REPOSITORY"];
                                 $sharedRepo = ConfService::getRepositoryById($sharedRepoId);
                                 if ($sharedRepo == null) {
                                     print "\n--ERROR: Cannot find repository with id " . $sharedRepoId;
                                     continue;
                                 }
                                 $shareLink = new ShareLink($shareStore, $publiclet);
                                 $user = $shareLink->getUniqueUser();
                                 if (AuthService::userExists($user)) {
                                     $userObject = ConfService::getConfStorageImpl()->createUserObject($user);
                                     $userObject->setHidden(true);
                                     print "\n--Should set existing user {$user} as hidden";
                                     if (!$dryRun) {
                                         $userObject->save();
                                     }
                                 }
                                 $shareLink->parseHttpVars(["custom_handle" => $element]);
                                 $shareLink->setParentRepositoryId($sharedRepo->getParentId());
                                 print "\n--Creating the following share object";
                                 print_r($shareLink->getJsonData($shareCenter->getPublicAccessManager(), ConfService::getMessages()));
                                 if (!$dryRun) {
                                     $shareLink->save();
                                 }
                                 $meta["ajxp_shared"] = ["shares" => [$element => ["type" => "minisite"], $sharedRepoId => ["type" => "repository"]]];
                             } catch (Exception $e) {
                                 print "\n-- Error " . $e->getMessage();
                             }
                         } else {
                             print "\n--Should migrate legacy link to new minisite with ContentFilter";
                             try {
                                 $link = new ShareLink($shareStore);
                                 $link->setOwnerId($userName);
                                 $parameters = array("custom_handle" => $element, "simple_right_download" => true);
                                 if (isset($publiclet["EXPIRE_TIME"])) {
                                     $parameters["expiration"] = $publiclet["EXPIRE_TIME"];
                                 }
                                 if (isset($publiclet["DOWNLOAD_LIMIT"])) {
                                     $parameters["downloadlimit"] = $publiclet["DOWNLOAD_LIMIT"];
                                 }
                                 $link->parseHttpVars($parameters);
                                 $parentRepositoryObject = $publiclet["REPOSITORY"];
                                 $driverInstance = AJXP_PluginsService::findPlugin("access", $parentRepositoryObject->getAccessType());
                                 if (empty($driverInstance)) {
                                     print "\n-- ERROR: Cannot find driver instance!";
                                     continue;
                                 }
                                 $options = $driverInstance->makeSharedRepositoryOptions(["file" => "/"], $parentRepositoryObject);
                                 $options["SHARE_ACCESS"] = "private";
                                 $newRepo = $parentRepositoryObject->createSharedChild(basename($filePath), $options, $parentRepositoryObject->getId(), $userObject->getId(), null);
                                 $gPath = $userObject->getGroupPath();
                                 if (!empty($gPath) && !ConfService::getCoreConf("CROSSUSERS_ALLGROUPS", "conf")) {
                                     $newRepo->setGroupPath($gPath);
                                 }
                                 $newRepo->setDescription("");
                                 // Smells like dirty hack!
                                 $newRepo->options["PATH"] = SystemTextEncoding::fromStorageEncoding($newRepo->options["PATH"]);
                                 $newRepo->setContentFilter(new ContentFilter([new AJXP_Node("pydio://" . $parentRepositoryObject->getId() . $filePath)]));
                                 if (!$dryRun) {
                                     ConfService::addRepository($newRepo);
                                 }
                                 $hiddenUserEntry = $shareRightManager->prepareSharedUserEntry(["simple_right_read" => true, "simple_right_download" => true], $link, false, null);
                                 $selection = new UserSelection($parentRepositoryObject, []);
                                 $selection->addFile($filePath);
                                 if (!$dryRun) {
                                     $shareRightManager->assignSharedRepositoryPermissions($parentRepositoryObject, $newRepo, false, [$hiddenUserEntry["ID"] => $hiddenUserEntry], [], $selection);
                                 }
                                 $link->setParentRepositoryId($parentRepositoryObject->getId());
                                 $link->attachToRepository($newRepo->getId());
                                 print "\n-- Should save following LINK: ";
                                 print_r($link->getJsonData($shareCenter->getPublicAccessManager(), ConfService::getMessages()));
                                 if (!$dryRun) {
                                     $hash = $link->save();
                                 }
                                 // UPDATE METADATA
                                 $meta["ajxp_shared"] = ["shares" => [$element => array("type" => "minisite")]];
                             } catch (Exception $e) {
                                 print "\n-- ERROR: " . $e->getMessage();
                             }
                         }
                         if ($dryRun) {
                             rename($legacyLinkFile . ".migrated", $legacyLinkFile);
                         }
                         continue;
                     } else {
                         //
                         // File does not exists, remove meta
                         //
                         unset($meta["ajxp_shared"]);
                     }
                     $repo = ConfService::getRepositoryById($element);
                     if ($repo !== null) {
                         print "\n--Shared repository: just metadata";
                         // Shared repo, migrating the meta should be enough
                         $meta["ajxp_shared"] = array("shares" => [$element => array("type" => "repository")]);
                     }
                 }
             }
         }
         print "\n\n SHOULD NOW UPDATE METADATA WITH FOLLOWING :";
         print_r($data);
         if (!$dryRun) {
             file_put_contents($store, serialize($data));
         }
     }
 }
 /**
  * Initialize a ShareLink from persisted data.
  * @param string $hash
  * @return ShareLink
  * @throws Exception
  */
 public function loadShareObject($hash)
 {
     $data = $this->loadShare($hash);
     if ($data === false) {
         $mess = ConfService::getMessages();
         throw new Exception(str_replace('%s', 'Cannot find share with hash ' . $hash, $mess["share_center.219"]));
     }
     if (isset($data["TARGET"]) && $data["TARGET"] == "remote") {
         $shareObject = new Pydio\OCS\Model\TargettedLink($this, $data);
     } else {
         $shareObject = new ShareLink($this, $data);
     }
     $shareObject->setHash($hash);
     return $shareObject;
 }