Example #1
0
 /** 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;
     }
 }
Example #2
0
 /** 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');
 }