public function findSharedElements($idUser = NULL, $path = 'all', $options = array()) { $criteria = array('state' => (int) 1); if ($idUser != NULL) { $criteria['idUser'] = new MongoId($idUser); } //récupération des droits sur les éléments $rightPdoManager = new RightPdoManager(); $rights = $rightPdoManager->find($criteria); $sharedElements = array(); //pour chaque droit if (is_array($rights) && !array_key_exists('error', $rights)) { foreach ($rights as $key => $right) { $owner = NULL; $refRight = NULL; //Récupération de l'élément $elementCriteria = array('_id' => new MongoId($right->getElement()), 'state' => (int) 1); if ($path != 'all') { if (isset($options['recursivePath']) && $options['recursivePath'] == TRUE) { $elementCriteria['serverPath'] = new MongoRegex("/^{$path}/i"); } else { $elementCriteria['serverPath'] = $path; } } $element = self::findOne($elementCriteria); if ($element instanceof Element) { /* * Nécessaire si on veut lier un right à un element. On le fait même dans le cas où le retour * du right n'est pas demandé; afin de limiter les traitements du retour de cette fonction (ne pas * avoir à distinguer un cas retour de listes d'objets et retour de liste de tableaux). */ $element = self::dismount($element); if (!in_array($element, $sharedElements)) { if (!empty($options)) { if (isset($options['returnUserInfo']) && $options['returnUserInfo'] == TRUE) { $userPdoManager = new UserPdoManager(); $userFieldsToReturn = array('state' => TRUE, 'lastName' => TRUE, 'firstName' => TRUE, 'email' => TRUE); $owner = $userPdoManager->findById($element['idOwner'], $userFieldsToReturn); if (!array_key_exists('error', $owner)) { $element['idOwner'] = $owner; } } if (isset($options['returnRefElementInfo']) && $options['returnRefElementInfo'] == TRUE) { $refElementPdoManager = new RefElementPdoManager(); $refElement = $refElementPdoManager->findById($element['idRefElement']); if (!array_key_exists('error', $refElement)) { $refElement = self::dismount($refElement); $element['idRefElement'] = $refElement; } } if (isset($options['returnRefRightInfo']) && $options['returnRefRightInfo'] == TRUE) { $options['returnRightInfo'] = TRUE; } if (isset($options['returnRightInfo']) && $options['returnRightInfo'] == TRUE) { $element['right'] = self::dismount($right); } if (isset($options['returnRefRightInfo']) && $options['returnRefRightInfo'] == TRUE && isset($element['right'])) { $refRightPdoManager = new RefRightPdoManager(); $refRight = $refRightPdoManager->findById($element['right']['idRefRight']); if (!array_key_exists('error', $refRight)) { $refRight = self::dismount($refRight); $element['right']['idRefRight'] = $refRight; } } } $sharedElements[] = $element; } } } if (empty($sharedElements)) { return array('error' => 'No match found.'); } } return $sharedElements; }
<?php /** * Created by PhpStorm. * User: Crocell * Date: 04/06/14 * Time: 23:53 */ /** @var string $projectRoot chemin du projet dans le système de fichier */ $projectRoot = $_SERVER['DOCUMENT_ROOT'] . '/Nestbox'; require_once $projectRoot . '/required.php'; $elementPdoManager = new ElementPdoManager(); $rightPdoManager = new RightPdoManager(); //Chemin des fichiers de test $path = 'D:\\Cours SUPINFO\\M1\\Projet Fin d\'annee\\Nestbox\\Fichiers de test/'; /** * /Nestbox/ * IMG/ * Croquis Nesbtox.jpg * code/ * js/ * front/ * js.txt * css/ * test.txt * * suivi de projet.gdoc * liens upload.gdoc * Explorateur de fichier.gdoc * /Nestbox - test/ * carte.gif
/** * Crée un nouveau dossier vierge à l'emplacement voulu. * @author Alban Truc * @param string|MongoId $idUser * @param string $path * @param string $folderName * @param bool $inheritRightsFromParent * @since 09/06/2014 * @return array|TRUE */ function createNewFolder($idUser, $path, $folderName, $inheritRightsFromParent) { $idUser = new MongoId($idUser); $operationSuccess = FALSE; $elementPdoManager = new ElementPdoManager(); if ($path != '/') { //récupération du dossier parent $explode = explode('/', $path); $parentDirectoryName = $explode[sizeof($explode) - 2]; $parentDirectoryPath = implode('/', array_slice($explode, 0, sizeof($explode) - 2)) . '/'; $parentElementCriteria = array('state' => (int) 1, 'name' => $parentDirectoryName, 'serverPath' => $parentDirectoryPath, 'idOwner' => $idUser); $parentElement = $elementPdoManager->findOne($parentElementCriteria); if ($parentElement instanceof Element) { /* * 11 correspond au droit de lecture et écriture. * Si on souhaite accepter la copie avec des droits de plus bas niveau, il suffit d'ajouter les codes correspondant * au tableau en 3e paramètre ci-dessous. */ $hasRight = actionAllowed($parentElement->getId(), $idUser, array('11')); if (is_bool($hasRight) && $hasRight == FALSE) { return array('error' => 'Creation not allowed.'); } elseif (is_array($hasRight)) { return $hasRight; } } else { return $parentElement; } } //vérification qu'il n'existe pas déjà un dossier avec le même nom $elementCriteria = array('state' => (int) 1, 'name' => $folderName, 'serverPath' => $path, 'idOwner' => $idUser); $elementsWithSameName = $elementPdoManager->find($elementCriteria); if (is_array($elementsWithSameName) && array_key_exists('error', $elementsWithSameName)) { if ($elementsWithSameName['error'] != 'No match found.') { return $elementsWithSameName; } } else { foreach ($elementsWithSameName as $key => $elementWithSameName) { $isFolder = isFolder($elementWithSameName->getRefElement()); if (is_bool($isFolder)) { if ($isFolder == FALSE) { unset($elementsWithSameName[$key]); } } else { return $isFolder; } } if (!empty($elementsWithSameName)) { return array('error' => 'Folder name not available.'); } } //File Server - 13/06/2014 $mkdirResult = createFSDirectory($idUser, $path, $folderName); if (!is_bool($mkdirResult) || !($mkdirResult == TRUE)) { return $mkdirResult; } //Fin File Server //Récupération de l'id de RefElement dossier vide $refElementPdoManager = new RefElementPdoManager(); $emptyFolder = $refElementPdoManager->findOne(array('state' => 1, 'code' => '4002'), array('_id' => TRUE)); $newFolder = array('state' => 1, 'name' => $folderName, 'idOwner' => $idUser, 'idRefElement' => $emptyFolder['_id'], 'serverPath' => $path); $insertResult = $elementPdoManager->create($newFolder); if (is_bool($insertResult)) { if ($insertResult == TRUE) { //Le dossier parent était vide if (isset($parentElement)) { if ($parentElement->getRefElement() == $emptyFolder['_id']) { $parentElementCriteria = array('_id' => $parentElement->getId()); //on change l'id du dossier parent pour dossier non vide $notEmptyFolder = $refElementPdoManager->findOne(array('state' => 1, 'code' => '4003'), array('_id' => TRUE)); $update = array('$set' => array('idRefElement' => $notEmptyFolder['_id'])); //dans le cas où on voudrait récupérer le dossier parent mis à jour, on peut utiliser $updatedFolder $updatedFolder = $elementPdoManager->findAndModify($parentElementCriteria, $update, array('new' => TRUE)); if ($updatedFolder instanceof Element) { $operationSuccess = TRUE; } } if ($inheritRightsFromParent == TRUE) { //récupération des droits appliqués sur le dossier parent $rightPdoManager = new RightPdoManager(); $rightCriteria = array('state' => 1, 'idElement' => $parentElement->getId()); $rights = $rightPdoManager->find($rightCriteria); if (!array_key_exists('error', $rights)) { //récupération du dossier précédemment inséré $newElement = $elementPdoManager->findOne($newFolder); if ($newElement instanceof Element) { $insertRightCopy = array(); foreach ($rights as $right) { $rightCopy = clone $right; $rightCopy->setId(new MongoId()); $rightCopy->setElement($newElement->getId()); $insertRightCopy[] = $elementPdoManager->create($rightCopy); //on pourrait se servir de $insertRightCopy pour identifier les erreurs éventuelles } //@todo vérifier que tous les insertRightCopy sont OK et si c'est le cas operationSuccess = TRUE $operationSuccess = TRUE; } else { return $newElement; } } } } $operationSuccess = TRUE; return $operationSuccess; } else { return array('error' => 'Could not create folder in database.'); } } else { return $insertResult; } }
} </script> <div id="utils_fancybox"> <div id="imageClose"> <img src="./content/img/icon_close_box.png" onclick="closeBoxAndReload();"/> </div> </div> <?php if (isset($_POST['var']) && !empty($_POST['var'])) { $elementManager = new ElementPdoManager(); $refElementManager = new RefElementPdoManager(); $userManager = new UserPdoManager(); $refRightManager = new RefRightPdoManager(); $rightManager = new RightPdoManager(); $element = $elementManager->findById($_GET['id']); $refElement = $refElementManager->findById($element->getRefElement()); $user = $userManager->findById($element->getOwner()); $refRightList = $refRightManager->findAll(); $rightCriteria = array('idElement' => $element->getId(), 'state' => 1); $usersSharedElementList = $rightManager->find($rightCriteria); if (is_array($usersSharedElementList) && !array_key_exists('error', $usersSharedElementList)) { ?> <form id="modifyShare" method="POST"> <?php echo '<p><label name="nameRename">List of users who you shared this element:</label></p>'; echo '<input type="hidden" name="idElement" id="idElement" value="' . $_GET['id'] . '" read-only>'; foreach ($usersSharedElementList as $userSharedElement) { $user = $userManager->findById($userSharedElement->getUser()); $refRight = $refRightManager->findById($userSharedElement->getRefRight());
/** * Permet de désactiver les droits d'un élément pour un user, gestion récursive pour les dossiers. * @author Harry Bellod * @param $idElement | id de l'élément qu'on veut désactiver * @param $idUser | id de l'utilisateur concerné * @param $idOwner | id du propriétaire de l'élément * @since 14/06/2014 * @return bool | array contenant un message d'erreur */ function disableShareRights($idElement, $idUser, $idOwner) { $elementManager = new ElementPdoManager(); $refElementManager = new RefElementPdoManager(); $rightPdoManager = new RightPdoManager(); $element = $elementManager->findById($idElement); $refElement = $refElementManager->findById($element->getRefElement()); $idRefElement = $refElement->getId(); /** @var $isFolder => bool, true si l'élément est bien un dossier, sinon false */ $isFolder = isFolder($idRefElement); if (is_bool($isFolder) && $isFolder == TRUE) { $serverPath = $element->getServerPath() . $element->getName() . '/'; //récupération des éléments contenus dans le dossier $seekElementsInFolder = array('state' => (int) 1, 'serverPath' => new MongoRegex("/^{$serverPath}/i"), 'idOwner' => new MongoId($idOwner)); //liste des éléments contenus dans le dossier $elementsInFolder = $elementManager->find($seekElementsInFolder); foreach ($elementsInFolder as $subElement) { $rightCriteria = array('state' => (int) 1, 'idElement' => new MongoId($subElement->getId()), 'idUser' => new MongoId($idUser)); $rightUpdate = array('$set' => array('state' => (int) 0)); //pour chaque élément on désactive le droit qui lui était affecté $disableElementsInFolder = $rightPdoManager->update($rightCriteria, $rightUpdate); if (is_bool($disableElementsInFolder) && $disableElementsInFolder != TRUE) { return array('error' => 'No match found.'); } } } $rightCriteria = array('state' => (int) 1, 'idElement' => new MongoId($idElement), 'idUser' => new MongoId($idUser)); $rightUpdate = array('$set' => array('state' => (int) 0)); //désactivation de l'élément parent $disableParent = $rightPdoManager->update($rightCriteria, $rightUpdate); if (is_bool($disableParent) && $disableParent != TRUE) { return array('error' => 'No match found.'); } }
/** * Retourne le droit, le refRight, l'élément et le refElement * @author Alban Truc * @param string|MongoId $idUser * @since 01/05/2014 * @return Right[] */ public function returnSharedElementsDetails($idUser) { $criteria = array('state' => (int) 1, 'idUser' => new MongoId($idUser)); //récupération des droits sur les éléments $rightPdoManager = new RightPdoManager(); $rights = $rightPdoManager->find($criteria); $refRightPdoManager = new RefRightPdoManager(); //pour chaque droit if (is_array($rights) && !array_key_exists('error', $rights)) { foreach ($rights as $key => $right) { $owner = NULL; $refRight = NULL; //Récupération de l'élément. On enlève le droit de la liste si l'élément n'est pas disponible $elementCriteria = array('_id' => new MongoId($right->getElement()), 'state' => (int) 1); $element = self::findOne($elementCriteria); if ($element instanceof Element) { //récupération du refElement. On enlève le droit de la liste si le refElement n'est pas trouvé $refElement = $this->refElementPdoManager->findById($element->getRefElement()); if ($refElement instanceof RefElement) { $element->setRefElement($refElement); $right->setElement($element); } else { unset($rights[$key]); continue; } } else { unset($rights[$key]); continue; } //Récupération du refRight. S'il n'existe pas on enlève ce droit de la liste. $refRight = $refRightPdoManager->findById($right->getRefRight()); if ($refRight instanceof RefRight) { $right->setRefRight($refRight); } else { unset($rights[$key]); continue; } $rights[$key] = $right; } if (empty($rights)) { return array('error' => 'No match found.'); } } return $rights; }
/** Permet de vérifier si l'utilisateur possède les droits maximums dans le dossier courant * @author Harry Bellod * @param $serverPath | path actuel * @param $idUser | id de l'user connecté * @return bool | true si l'user à les droits maximums (écriture/lecture) */ function checkRightOnCurrentDirectory($serverPath, $idUser) { $elementManager = new ElementPdoManager(); $rightManager = new RightPdoManager(); $refRightManager = new RefRightPdoManager(); if ($serverPath != "/") { // on récupère le nom du dossier ou l'on se trouve $explode = explode("/", $serverPath); $currentDirectory = $explode[sizeof($explode) - 2]; // on récupère son serverPath $pattern = "#" . $currentDirectory . "/#"; $path = preg_replace($pattern, "", $serverPath, 1); $criteria = array('name' => $currentDirectory, 'serverPath' => $path, 'state' => 1); $element = $elementManager->findOne($criteria); $rightCriteria = array('idElement' => $element->getId(), 'idUser' => $idUser); $right = $rightManager->findOne($rightCriteria); $refRight = $refRightManager->findById($right->getRefRight()); //si l'utilisateur n'a que les droits de lecture alors return false, sinon true if ($refRight->getCode() == '01') { return false; } else { return true; } } }