/** este metodo devuelve true si el usuario tiene permiso para la accion dada en un objeto * $object = un objeto * $action = la accion para el permiso (seguridad_action) * $user = el usuario del que se busca el permiso (oob_user) * $tree (opcional)(oob_tree_node) = este hace una busqueda recursiva sobre un arbol (a partir de un nodo), para ver si el objeto padre tiene permiso */ public static function isObjectAllowed($object, $action, $user, $node = false) { if (!is_a($action, 'seguridad_action')) { return false; } if (!is_object($object)) { return false; } if ($user == false || is_a($user, 'oob_user')) { } else { return false; } $currentUserRoles =& seguridad_role::myRoles($user); if (!seguridad::getPermissionForAnyObject($action, $currentUserRoles, $object)) { //saltamos al otro metodo if ($node !== false) { if (!is_a($node, 'OOB_tree_node')) { return false; } $arbol = new OOB_tree($node->treename(), false); $tree =& $arbol->getParents($node, false); if ($roles = seguridad_role::listRoles(USED, 'name', OPERATOR_EQUAL)) { $arrayRoles = array(); foreach ($roles as $r) { //verifico si tiene permiso de ver if (seguridad::getObjectPermission($action, $r, $object)) { $arrayRoles[] = true; } } } //end if reload de seguridad if (count($arrayRoles) > 0) { return false; } else { return seguridad::isObjectAllowedByInheritance($action, $currentUserRoles, $tree); } } // end salto return false; } else { return true; } }
/** delete node */ public function delNode($node, $cascade = false) { global $ari; $ari->internalChrono('delNode_start'); if (!is_a($node, 'OOB_tree_node')) { if ($this->multiple) { return false; } else { if ($node = OOB_tree::getNode(false, $node, $this)) { } else { return false; } } } //var_dump ($node); //exit; // $id = $ari->db->qMagic($node->id()); // $node['id']; $left = $ari->db->qMagic($node->left()); // $node['left']; $right = $ari->db->qMagic($node->right()); // $node['right']; $tree = $ari->db->qMagic($node->treeid()); //$node['treeid']; // $move_cascade = $ari->db->qMagic($node->right() - $node->left() + 1); //$node['right'] - $node['left'] +1 ; $delta = $node->left() - $node->right() - 1; $ari->db->StartTrans(); if ($cascade) { // @todo: verify, no estoy seguro que esto funcione del todo bien! //borro en cascada los hijos $sql_cascade = "DELETE FROM OOB_Tree_Node\n \t\t\t \t \t\tWHERE TreeID = {$tree}\n\t\t\t\t\t\t AND `OOB_Tree_Node.Left` >= {$left} AND `OOB_Tree_Node.Right` <= {$right}"; $ari->db->Execute($sql_cascade); $this->addDelta($node->right() + 1, $delta); //actualizo la cantidad de nodos $sql_update = "UPDATE OOB_Tree_Tree \n\t\t\t\t SET `Nodes` = (SELECT COUNT(True) \n\t\t\t\t \t\t\t\t FROM OOB_Tree_Node\n \t\t \t \t \t\t\t\t WHERE TreeID = {$tree}) \n\t\t\t\t\t "; $ari->db->Execute($sql_update); } else { $sql = "DELETE FROM OOB_Tree_Node\n \t\t\t\t\t WHERE ID = {$id} "; $ari->db->Execute($sql); //actualizo los hijos del borrado $sql_update = "UPDATE OOB_Tree_Node \n\t\t\t\t SET `Left` = `Left` - 1, `Right` = `Right` - 1\n \t\t \t \t WHERE TreeID = {$tree} \n\t\t\t\t\t AND `Left` BETWEEN {$left} AND {$right} "; $ari->db->Execute($sql_update); //actualizo el padre del borrado el cual tiene izquiera menor y derecha mayor $sql_update = "UPDATE OOB_Tree_Node \n\t\t\t\t SET `Right` = `Right` - 2\n \t\t \t \t WHERE TreeID = {$tree}\n\t\t\t\t\t AND `Right` > {$right} \n\t\t\t\t\t AND `Left` < {$left} "; $ari->db->Execute($sql_update); //actualizo los nodos q no estan en la rama del borrado $sql_update = "UPDATE OOB_Tree_Node \n\t\t\t\t SET `Left` = `Left` - 2, `Right` = `Right` - 2\n \t\t \t \t WHERE TreeID = {$tree} \n\t\t\t\t\t AND `Left` > {$right} "; $ari->db->Execute($sql_update); //actualizo la cantidad de nodos $sql_update = "UPDATE OOB_Tree_Tree \n\t\t\t\t SET `Nodes` = `Nodes` - 1\n \t\t \t \t WHERE ID = {$tree}\n\t\t\t\t\t "; $ari->db->Execute($sql_update); } if (!$ari->db->CompleteTrans()) { throw new OOB_exception("Error en DB: {$ari->db->ErrorMsg()}", "010", "Error en la Base de Datos", false); //return false; } else { $this->fill(); return true; } $ari->internalChrono('delNode_end'); }