Example #1
0
/**
 * 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);
    $elementManager = new ElementManager();
    $elementCriteria = array('state' => (int) 1, '_id' => $idElement);
    $element = $elementManager->findOne($elementCriteria);
    if (is_array($element) && !array_key_exists('error', $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['idOwner']) {
            //vérification que l'email indiquée appartient bien à un utilisateur inscrit
            $userCriteria = array('state' => (int) 1, 'email' => $recipientEmail);
            $userManager = new UserManager();
            $recipientUser = $userManager->findOne($userCriteria);
            if (is_array($recipientUser) && !array_key_exists('error', $recipientUser)) {
                if ($recipientUser['_id'] != $idOwner) {
                    //récupérer l'id du refRight
                    $refRightCriteria = array('state' => (int) 1, 'code' => $refRightCode);
                    $refRightManager = new RefRightManager();
                    $refRight = $refRightManager->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['_id'], '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['idRefElement'], TRUE);
                        if (is_bool($isNonEmptyFolder)) {
                            if ($isNonEmptyFolder == TRUE) {
                                //récupération des éléments contenus dans le dossier
                                $folderPath = $element['serverPath'] . $element['name'] . '/';
                                $elementsInFolderCriteria = array('state' => 1, 'idOwner' => $idOwner, 'serverPath' => new MongoRegex("/^{$folderPath}/i"));
                                $elementsInFolder = $elementManager->find($elementsInFolderCriteria);
                                if (is_array($elementsInFolder) && !array_key_exists('error', $elementsInFolder)) {
                                    foreach ($elementsInFolder as $elementInFolder) {
                                        $rightCopy = $newRight;
                                        $rightCopy['idElement'] = $elementInFolder['_id'];
                                        $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.
                         */
                        $rightManager = new RightManager();
                        $rightCriteria = array('state' => (int) 1, 'idUser' => $recipientUser['_id']);
                        $options = array('upsert' => TRUE);
                        foreach ($rightList as $right) {
                            $rightCriteria['idElement'] = $right['idElement'];
                            $rightManager->update($rightCriteria, array('$set' => $right), $options);
                        }
                        return TRUE;
                        //@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;
    }
}
Example #2
0
/**
 * 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|bool|Element|Element[]|TRUE  -- à vérifier
 */
function createNewFolder($idUser, $path, $folderName, $inheritRightsFromParent)
{
    $idUser = new MongoId($idUser);
    $operationSuccess = FALSE;
    $elementManager = new ElementManager();
    if ($path != '/') {
        //récupération du dossier parent
        $explode = explode('/', $path);
        $parentDirectoryName = $explode[sizeof($explode) - 2];
        $parentDirectoryPath = array_slice($explode, 0, sizeof($explode) - 2);
        $parentElementCriteria = array('state' => (int) 1, 'name' => $parentDirectoryName, 'serverPath' => $parentDirectoryPath, 'idOwner' => $idUser);
        $parentElement = $elementManager->findOne($parentElementCriteria);
        if (!array_key_exists('error', $parentElement)) {
            /*
             * 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['_id'], $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 = $elementManager->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['idRefElement']);
            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
    $refElementManager = new RefElementManager();
    $emptyFolder = $refElementManager->findOne(array('state' => 1, 'code' => '4002'), array('_id' => TRUE));
    $newFolder = array('state' => 1, 'name' => $folderName, 'idOwner' => $idUser, 'idRefElement' => $emptyFolder['_id'], 'serverPath' => $path);
    $insertResult = $elementManager->create($newFolder);
    if (is_bool($insertResult)) {
        if ($insertResult == TRUE) {
            //Le dossier parent était vide
            if (isset($parentElement)) {
                if ($parentElement['idRefElement'] == $emptyFolder['_id']) {
                    $parentElementCriteria = array('_id' => $parentElement->getId());
                    //on change l'id du dossier parent pour dossier non vide
                    $notEmptyFolder = $refElementManager->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 = $elementManager->findAndModify($parentElementCriteria, $update, array('new' => TRUE));
                    if (!array_key_exists('error', $updatedFolder)) {
                        $operationSuccess = TRUE;
                    }
                }
                if ($inheritRightsFromParent == 'TRUE') {
                    //récupération des droits appliqués sur le dossier parent
                    $rightManager = new RightManager();
                    $rightCriteria = array('state' => 1, 'idElement' => $parentElement['_id']);
                    $rights = $rightManager->find($rightCriteria);
                    if (!array_key_exists('error', $rights)) {
                        //récupération du dossier précédemment inséré
                        $newElement = $elementManager->findOne($newFolder);
                        if (!array_key_exists('error', $newElement)) {
                            $insertRightCopy = array();
                            foreach ($rights as $right) {
                                $rightCopy = $right;
                                $rightCopy['_id'] = new MongoId();
                                $rightCopy['idElement'] = $newElement['_id'];
                                $insertRightCopy[] = $elementManager->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;
    }
}
Example #3
0
 protected function elements()
 {
     if ($this->method == 'GET') {
         //cas de demande de récupération des éléments d'un utilisateur
         if (isset($this->request['idUser']) && isset($this->request['isOwner'])) {
             $idUser = $this->request['idUser'];
             $isOwner = $this->request['isOwner'];
             $token = $this->request['apiKey'];
             $criteria = array('_id' => new MongoId($idUser), 'apiKey' => $token);
             $userManager = new UserManager();
             $user = $userManager->findOne($criteria);
             if (!array_key_exists('error', $user)) {
                 $elementManager = new ElementManager();
                 if (isset($this->request['name'])) {
                     $elementName = $this->request['name'];
                 } else {
                     $elementName = NULL;
                 }
                 if (isset($this->request['path'])) {
                     $path = $this->request['path'];
                 } else {
                     $path = 'all';
                 }
                 $elements = $elementManager->returnElementsDetails($idUser, $isOwner, $path, $elementName);
                 if (array_key_exists('error', $elements)) {
                     /*
                      * array de array pour faciliter l'exploitation du retour
                      * (ne pas avoir dans un cas un array et dans l'autre un array d'array)
                      * -- 13/06/2014
                      */
                     return array($elements);
                 } else {
                     return $elements;
                 }
             } else {
                 return array('error' => 'You cannot process another user\'s data');
             }
         }
     } elseif ($this->method == 'POST') {
         $options = array();
         if (isset($this->request['returnImpactedElements'])) {
             $options['returnImpactedElements'] = $this->request['returnImpactedElements'];
         }
         if (isset($this->request['returnPastedElements'])) {
             $options['returnPastedElements'] = $this->request['returnPastedElements'];
         }
         if (isset($this->request['returnMovedElements'])) {
             $options['returnMovedElements'] = $this->request['returnMovedElements'];
         }
         if (isset($this->request['returnUpdatedElements'])) {
             $options['returnUpdatedElements'] = $this->request['returnUpdatedElements'];
         }
         if (isset($this->request['keepRights'])) {
             $options['keepRights'] = $this->request['keepRights'];
         }
         if (isset($this->request['keepDownloadLinks'])) {
             $options['keepDownloadLinks'] = $this->request['keepDownloadLinks'];
         }
         $this->request['options'] = $options;
         return handleActions($this->request);
     }
     return 0;
 }