Esempio n. 1
0
/**
 * Rend un élément inaccessible (en BDD, ne comporte pas d'action sur le serveur de fichier).
 * @author Alban Truc
 * @param MongoId|string $idElement
 * @param MongoId|string $idUser
 * @param string $returnImpactedElements si 'TRUE', retourne les éléments impactés par l'action
 * @since 31/05/2014
 * @return array|Element
 * @todo appel de la fonction qui fait diverses tâches (cf. documentation) sur le serveur de fichier
 */
function disableHandler($idElement, $idUser, $returnImpactedElements = 'false')
{
    $idElement = new MongoId($idElement);
    $idUser = new MongoId($idUser);
    // 11 correspond au droit de lecture et écriture
    $hasRight = actionAllowed($idElement, $idUser, array('11'));
    if (!is_array($hasRight)) {
        if ($hasRight === TRUE) {
            //récupère l'élément
            $elementManager = new ElementManager();
            $element = $elementManager->findById($idElement);
            if (!array_key_exists('error', $element)) {
                if ($element['state'] == 1) {
                    //récupère le code du refElement de notre élément
                    $refElementManager = new RefElementManager();
                    $refElement = $refElementManager->findById($element['idRefElement'], array('code' => TRUE));
                    if (!array_key_exists('error', $refElement)) {
                        //File Server -- 13/06/2014
                        if (preg_match('/^4/', $refElement['code']) || preg_match('/^9/', $refElement['code'])) {
                            // dossier ou non reconnu, pas d'extension à rajouter
                            $elementName = $element['name'];
                        } else {
                            $elementName = $element['name'] . $refElement['extension'];
                        }
                        $FSdisableResult = moveToTrash($idUser, $element['serverPath'], $elementName);
                        if (!is_bool($FSdisableResult) || $FSdisableResult != TRUE) {
                            return $FSdisableResult;
                        }
                        //-- Fin File Server
                        //si le code commence par un 4 (les codes de dossier commencent par un 4) et n'est pas 4002 (dossier vide)
                        if (preg_match('/^4/', $refElement['code']) && $refElement['code'] != '4002') {
                            $serverPath = $element['serverPath'] . $element['name'] . '/';
                            //notre criteria inclut tous les éléments se trouvant dans le dossier et ses dossiers enfants
                            $elementCriteria = array('state' => (int) 1, 'idOwner' => $idUser, '$or' => array(array('_id' => $idElement), array('serverPath' => new MongoRegex("/^{$serverPath}/i"))));
                        } else {
                            $elementCriteria = array('_id' => $idElement, 'state' => (int) 1);
                        }
                        //pour mettre à jour tous les documents et pas uniquement le premier répondant au critère
                        $options = array('multiple' => TRUE);
                        //désactivation de l'élément et suppression du lien de téléchargement
                        $elementUpdate = array('$set' => array('state' => (int) 0, 'downloadLink' => ''));
                        /*
                         * obligatoirement à récupérer avant la mise à jour, sinon aucun document ne devrait être trouvé
                         * en cas de réussite de cette mise à jour. On ne peut pas non plus faire le même critère avec à la
                         * place un état de 0 parce qu'il se peut qu'il y ait déjà des éléments désactivés en base.
                         * L'id est récupérer pour le critère de mise à jour des droits et le size pour la déduction du
                         * stockage occupé par les éléments (mise à jour du storage du compte utilisateur).
                         */
                        $impactedElements = $elementManager->find($elementCriteria, array('_id' => TRUE, 'size' => TRUE));
                        $elementUpdateResult = $elementManager->update($elementCriteria, $elementUpdate, $options);
                        if (!is_array($elementUpdateResult)) {
                            if ($elementUpdateResult === TRUE) {
                                $updateFolderStatus = updateFolderStatus($element['serverPath'], $idUser);
                                if (is_bool($updateFolderStatus) && $updateFolderStatus === TRUE) {
                                    //séparation en deux tableaux
                                    $idImpactedElements = array();
                                    $sizeImpactedElements = array();
                                    foreach ($impactedElements as $impactedElement) {
                                        //création d'un tableau contenant uniquement les id des éléments impactés
                                        if (isset($impactedElement['_id'])) {
                                            $idImpactedElements[]['idElementImpacted'] = $impactedElement['_id'];
                                        }
                                        //création d'un tableau contenant uniquement la taille de chaque élément impacté
                                        if (isset($impactedElement['size'])) {
                                            $sizeImpactedElements[] = $impactedElement['size'];
                                        }
                                    }
                                    //var_dump($idImpactedElements);
                                    //désactivation des droits sur ces éléments
                                    $rightUpdate = array('$set' => array('state' => (int) 0));
                                    $rightManager = new RightManager();
                                    foreach ($idImpactedElements as $id) {
                                        $rightCriteria = array('state' => (int) 1, 'idElement' => $id['idElementImpacted']);
                                        //l'opération n'étant pas bloquante, on ne se soucie pour l'instant pas d'un potentiel échec
                                        $rightManager->update($rightCriteria, $rightUpdate, $options);
                                    }
                                    //déduction du stockage occupé par ces éléments dans la collection account
                                    $totalSize = array_sum($sizeImpactedElements);
                                    //http://www.php.net/manual/function.array-sum.php
                                    //var_dump($totalSize); exit();
                                    $accountManager = new AccountManager();
                                    $accountCriteria = array('state' => (int) 1, 'idUser' => $idUser);
                                    $accountUpdate = array('$inc' => array('storage' => -$totalSize));
                                    $accountUpdateResult = $accountManager->update($accountCriteria, $accountUpdate);
                                    if (!is_array($accountUpdateResult)) {
                                        if ($accountUpdateResult === TRUE) {
                                            if ($returnImpactedElements == 'true') {
                                                return $idImpactedElements;
                                            } else {
                                                return TRUE;
                                            }
                                        } else {
                                            return array('error' => 'Did not manage to update the storage value.');
                                        }
                                    } else {
                                        return $accountUpdateResult;
                                    }
                                } else {
                                    return $updateFolderStatus;
                                }
                            } else {
                                return array('error' => 'Did not manage to update all elements.
                                The elements that we couldn\'t updates are in this array at the index \'notUpdated\'', 'notUpdated' => $elementManager->find($elementCriteria, array('_id' => TRUE)));
                            }
                        } else {
                            return $elementUpdateResult;
                        }
                        //message d'erreur
                    } else {
                        return $refElement;
                    }
                    //message d'erreur
                } else {
                    return array('error' => 'Element already inactivated');
                }
            } else {
                return $element;
            }
            //message d'erreur
        } else {
            return array('error' => 'Access denied');
        }
    } else {
        return $hasRight;
    }
}
Esempio n. 2
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;
    }
}