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; }
$("#confirmDisable").append(submitModifyRight); } </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());
/** * Indique si l'utilisateur donné a les droits voulus sur l'élément donné * @author Alban Truc * @param MongoId|string $idUser * @param MongoId|string $idElement * @param array $refRightCodes * @since 15/05/2014 * @return bool|array */ public function hasRightOnElement($idUser, $idElement, $refRightCodes) { if (is_array($refRightCodes)) { //récupérer l'id du refRight à partir du code $refRightPdoManager = new RefRightPdoManager(); $refRightCriteria = array('state' => (int) 1); //@see http://www.php.net/manual/en/function.count.php if (count($refRightCodes) > 1) { foreach ($refRightCodes as $refRightCode) { $refRightCriteria['$or'][] = array('code' => $refRightCode); } } else { $refRightCriteria['code'] = $refRightCodes[0]; } //var_dump($refRightCriteria); $refRights = $refRightPdoManager->find($refRightCriteria); //var_dump($refRights); //récupérer le droit $rightCriteria = array('state' => (int) 1, 'idUser' => new MongoId($idUser), 'idElement' => new MongoId($idElement)); if (count($refRights) > 1) { foreach ($refRights as $refRight) { $rightCriteria['$or'][] = array('idRefRight' => $refRight->getId()); } } else { $rightCriteria['idRefRight'] = $refRights[0]; } //var_dump($rightCriteria); $rights = self::find($rightCriteria); //var_dump($rights); if (!array_key_exists('error', $rights)) { return TRUE; } elseif ($rights['error'] == 'No match found.') { return FALSE; } else { return $rights; } } else { return array('error' => 'Expected array for third parameter (refRightCodes)'); } }
/** * Partage (lecture ou lecture et écriture) d'un élément avec un autre utilisateur * @author Alban Truc * @param string|MongoId $idElement * @param string|MongoId $idOwner * @param string $recipientEmail * @param string $refRightCode * @param bool $sendMail * @since 12/06/2014 * @return array|bool */ function shareWithUser($idElement, $idOwner, $recipientEmail, $refRightCode, $sendMail = FALSE) { $idElement = new MongoId($idElement); $idOwner = new MongoId($idOwner); $elementPdoManager = new ElementPdoManager(); $elementCriteria = array('state' => (int) 1, '_id' => $idElement); $element = $elementPdoManager->findOne($elementCriteria); if ($element instanceof ELement) { /* * vérification que l'idOwner en param de la fonction est le même que celui de l'element, la gestion des partages * n'étant dans cette version qu'accessible au propriétaire de l'élément */ if ($idOwner == $element->getOwner()) { //vérification que l'email indiquée appartient bien à un utilisateur inscrit $userCriteria = array('state' => (int) 1, 'email' => $recipientEmail); $userPdoManager = new UserPdoManager(); $recipientUser = $userPdoManager->findOne($userCriteria); if ($recipientUser instanceof User) { if ($recipientUser->getId() != $idOwner) { //récupérer l'id du refRight $refRightCriteria = array('state' => (int) 1, 'code' => $refRightCode); $refRightPdoManager = new RefRightPdoManager(); $refRight = $refRightPdoManager->findOne($refRightCriteria, array('_id' => TRUE)); if (is_array($refRight) && !array_key_exists('error', $refRight)) { $rightList = array(); $refRightId = $refRight['_id']; $newRight = array('state' => (int) 1, 'idUser' => $recipientUser->getId(), 'idElement' => $idElement, 'idRefRight' => $refRightId); $rightList[] = $newRight; /* * vérification qu'il ne s'agit pas d'un dossier vide (inutile de chercher à copier le droit * pour d'éventuels contenus sinon) */ $isNonEmptyFolder = isFolder($element->getRefElement(), TRUE); if (is_bool($isNonEmptyFolder)) { if ($isNonEmptyFolder == TRUE) { //récupération des éléments contenus dans le dossier $folderPath = $element->getServerPath() . $element->getName() . '/'; $elementsInFolderCriteria = array('state' => 1, 'idOwner' => $idOwner, 'serverPath' => new MongoRegex("/^{$folderPath}/i")); $elementsInFolder = $elementPdoManager->find($elementsInFolderCriteria); if (is_array($elementsInFolder) && !array_key_exists('error', $elementsInFolder)) { foreach ($elementsInFolder as $elementInFolder) { $rightCopy = $newRight; $rightCopy['idElement'] = $elementInFolder->getId(); $rightList[] = $rightCopy; } } else { return $elementsInFolder; } } } else { return $isNonEmptyFolder; } /* * Insertion ou mise à jour du droit en base. De fait cette fonction est utilisé pour la création * et la mise à jour de droit. */ $rightPdoManager = new RightPdoManager(); $rightCriteria = array('state' => (int) 1, 'idUser' => $recipientUser->getId()); $options = array('upsert' => TRUE); foreach ($rightList as $right) { $rightCriteria['idElement'] = $right['idElement']; $rightPdoManager->update($rightCriteria, array('$set' => $right), $options); } //@todo envoyer un mail } else { return $refRight; } } else { return array('error' => 'You cannot share an element with yourself'); } } else { return $recipientUser; } } else { return array('error' => 'You are not the owner of this element, you cannot share it.'); } } else { return $element; } }
/** * 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; } } }