コード例 #1
0
 /**
  * Arma los roles de prueba en base a los permisos de tablas de una operación
  */
 protected function generar_roles_db_pruebas_operacion($fuente, $esquema, $conexion, $id_operacion)
 {
     $rol = $this->get_rol_prueba_db($fuente, $id_operacion);
     $usuario = $this->get_usuario_prueba_db($fuente);
     $fuente_info = toba_info_editores::get_info_fuente_datos($fuente);
     //-- Determina tablas y schema
     $tablas = $this->get_lista_tablas_con_permisos($fuente, $id_operacion);
     $existe_rol = $conexion->existe_rol($rol);
     //Busco los schemas necesarios por la/s operacion/es
     $schemas = $this->get_schemas_necesarios($fuente, $id_operacion);
     if (empty($schemas)) {
         //Esto pasa si se quitaron los permisos a la operacion, defaulteo en el principal
         $schemas[] = $esquema;
     }
     //--Revocar permisos actuales
     if ($existe_rol) {
         foreach ($schemas as $schema) {
             $conexion->revoke_schema($rol, $schema, 'ALL PRIVILEGES');
         }
     }
     if (!empty($tablas)) {
         //-- Crea el nuevo rol
         if (!$existe_rol) {
             $conexion->crear_rol($rol);
         }
         //-- Asigna el usuario de prueba al rol
         $conexion->grant_rol($usuario, $rol);
         //-- Asignar nuevos permisos a los schemas
         foreach ($schemas as $schema) {
             $conexion->grant_schema($rol, $schema);
         }
         //Asignar permisos a las tablas involucradas
         foreach ($tablas as $tabla) {
             $conexion->grant_tablas($rol, $tabla['esquema'], array($tabla['tabla']), $tabla['permisos']);
         }
         //-- Da permisos a las secuencias de la tabla
         foreach ($schemas as $schema) {
             $secuencias = $conexion->get_lista_secuencias($schema);
             $secuencias_grant = array();
             foreach ($secuencias as $secuencia) {
                 if (in_array($secuencia['tabla'], $tablas)) {
                     $pos_schema = strpos($secuencia['nombre'], '.');
                     //Busco un punto por si tiene acoplado el schema
                     if ($pos_schema !== false) {
                         $secuencia['nombre'] = substr($secuencia['nombre'], $pos_schema + 1);
                         //Le sumo 1 para evitar el punto separador.
                     }
                     $secuencias_grant[] = $secuencia['nombre'];
                 }
             }
             $conexion->grant_tablas($rol, $schema, $secuencias_grant, 'UPDATE');
             $this->generar_roles_db_auditoria($conexion, $fuente_info, $schema, $rol);
             //Le asigno los roles de las operaciones a la parte de auditoria
         }
     } else {
         //-- Borrar el rol, ya no es necesario
         if ($existe_rol) {
             $this->revocar_rol_db_auditoria($conexion, $fuente_info, $schema, $rol);
             $conexion->revoke_rol($usuario, $rol);
             $conexion->borrar_rol($rol);
         }
     }
 }