*
  • El más habitual es consultar, dentro de una clase manejadora de un panel (las clases ubicadas en action), el * valor de cierto campo, atributo, tupla seleccionada,... Para ello se puede hacer uso de los métodos de consulta de * esta clase. Notese que en este caso NUNCA se deberá almacenar valores en la SESSION, ya que si se quiere * almacenar valores se deben de almacenar como variables de clase e Igep, internamente, ya se encargará de * almacenarlos en la SESSION.
  • *
  • Otro uso, menos habitual, pero que puede requerirse es el de crear una instancia de una clase manejadora de un panel * desde otra clase manejadora. En este caso los encargados de almacenar los valores en la SESSION serán los programadores. * Por esta razón se proporcionan métodos para almacenar valores.
  • * * * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License v.2 * @version $Id: IgepSession.php,v 1.46 2018-08-10 16:49:56 belenguer_jor Exp $ * @author David Pascual * @author Keka Bermej * @author Vero Navarro * @author Raquel Borjabad * @author Toni Felix * @author Jorge Belenguer * * @package gvHidra */ class IgepSession extends ComunSession { //Ubicacion en la estructura de memoria del SALTO const GVHIDRA_JUMP = 'saltoIgep'; private static function getApplicationName() { return ConfigFramework::getApplicationName(); } /*Funciones con todo el Panel*/ /** * Comprueba si existe en la SESSION un objeto Panel * * @access public * @param string $clasePanel * @return bool */ public static function existePanel($clasePanel) { return isset($_SESSION[self::getApplicationName()][$clasePanel]); } /** * Inicia la sesion de php, inicializando previamente todo lo necesario * * @access public * @param string $app codigo de la aplicación */ public static function session_start($app=null, $start=true) { if (empty($app)) $app = ConfigFramework::getApplicationName(); if (empty($app)) throw new Exception('No está configurado el nombre corto de la aplicación'); // fijar ruta para sesiones? $tmp = ConfigFramework::getTemporalDir(); if (!is_null($tmp) && !empty($tmp)) ini_set('session.save_path', $tmp); // Nombre de la Cookie. Código de APP y CRC de descripción para evitar colisiones //session_name('gvHIDRA_'.md5($app)); $prefijoCookie = strtoupper(str_replace(' ', '', substr($app,0,10)));//Garantizamos cadena válida session_name($prefijoCookie);//.'_'.sprintf("%u", crc32('GVHIDRA_'.$app))); // fijar ruta de la cookie? //ini_set('session.cookie_path', realpath('.')); // no permitir el uso de la cookie fuera del http. Evitamos que se acceda por JavaScript ini_set('session.cookie_httponly', 1); // no permitir sessid en get ini_set('session.use_only_cookies', TRUE); // no probar si el browser acepta cookies ini_set('session.use_trans_sid', FALSE); // expirar la sesion en cliente ini_set('session.cookie_lifetime', 0); // Tiempo máximo de vida de la session, aunque no tiene efecto si no se guardan en /tmp ini_set('session.gc_maxlifetime', 12000); if ($start) { session_start(); //Creamos el fingerprint con la IP del usuario $_SESSION['fingerprint'] = md5((self::getClientIP()).'gvHIDRA'.$_SERVER['HTTP_USER_AGENT']); } } /** * Refresca la sesion de php (si no estaba viva) * * @access public * @param string $app codigo de la aplicación */ public static function keepAliveSession() { if($_SESSION['fingerprint'] == md5((self::getClientIP()).'gvHIDRA'.$_SERVER['HTTP_USER_AGENT'])) { if(isset($_SESSION[self::getApplicationName()])) { //TODO: Leer configuración del Config para ejecutar según corresponda $_SESSION[self::getApplicationName()]['gvhLastRefresh'] = date('Ymd-H:i:s'); $_SESSION[self::getApplicationName()]['gvhNumRefresh']++; return true; } } return false; } /** * Valida el estado de la SESSION * * @access public */ public static function isValid() { if($_SESSION['fingerprint'] != md5((self::getClientIP()).'gvHIDRA'.$_SERVER['HTTP_USER_AGENT'])) { error_log('IgepSession: Sesión no válida (fingerprint)'); return false; } if(self::dameUsuario()=='') { error_log('IgepSession: No hay usuario. No se puede acceder.'); return false; } return true; } /** * Borra de la SESSION la toda la informacion de la aplicación * Se llama en el inicio de la aplicación. * * @access public */ public static function clear() { $appName = self::getApplicationName(); if (!empty($appName)) { if(isset($_SESSION[self::getApplicationName()])) { unset($_SESSION[self::getApplicationName()]); } } else { ;//REVIEW: Registrar en LOG? } } /** * Borra de la SESSION la posición correspondiente a un Panel * * @access public * @param string $clasePanel */ public static function borraPanel($clasePanel) { unset($_SESSION[self::getApplicationName()][$clasePanel]); } /** * Devuelve el contenido de un panel * * @access public * @param string $clasePanel * @return gvHidraForm */ public static function damePanel($clasePanel) { if (isset($_SESSION[self::getApplicationName()][$clasePanel])) { return ($_SESSION[self::getApplicationName()][$clasePanel]); } } /** * Almacena en la SESSION un objeto Panel. Comprueba que el objeto coincida con la clase adecuada. * Si todo va bien devuelve 1 indicando que la operación se ha realizado con exito. De lo contrario retorna -1. * * @access public * @param string $clasePanel * @param gvHidraForm $objeto * @return integer */ public static function guardaPanel($clasePanel,$objeto) { if($clasePanel=='') { return -1; } //Comprueba q el objeto corresponda a una instancia del panel excepto en el caso de ventanaSeleccion if(get_class($objeto) == $clasePanel) { $objeto->limpiarInstancia(); $_SESSION[self::getApplicationName()][$clasePanel] = $objeto; return 0; } else { die("No se puede guardar en la SESSION el panel $clasePanel porque la clase proporcionada no es del tipo correcto"); } } /** * Para cuando Igep hace uso de la SESSION y no quiere tener restricciones. * * @access private * @param string $clasePanel * @param gvHidraForm $objeto * @return int */ public static function _guardaPanelIgep($clasePanel,$objeto) { $_SESSION[self::getApplicationName()][$clasePanel] = $objeto; return 0; } /*Funciones con las variables heredadas de Negocio*/ /** * Devuelve el índice de la tupla actualmente seleccionada en el panel. Este índice hace referencia a la posición dentro del array de resultados. * Si no está activo el indice es porque la posición actual es 0. * * @access public * @param string $clasePanel * @return integer */ public static function dameFilaActual($clasePanel) { if(isset($_SESSION[self::getApplicationName()][$clasePanel]->int_filaActual)) return $_SESSION[self::getApplicationName()][$clasePanel]->int_filaActual; else return 0; } /** * Devuelve el array de resultados correspondiente a la última consulta. Es importante tener en cuenta * que este array procede de la consulta realizada con la Select introducida en la variable $str_select. Esta * consulta se lanza con el proceso buscar de Igep. * * @access public * @param string $clasePanel * @return array */ public static function dameUltimaConsulta( $clasePanel ) { /** @var gvHidraFrom $object */ $object = $_SESSION[self::getApplicationName()][$clasePanel]; if( is_object($object) && (is_a($object, 'gvHidraFrom') || method_exists($object, 'getResultForSearch')) ) { return $object->getResultForSearch(); } return null; } /** * Devuelve el array de resultados correspondiente a la última edición. Es importante tener en cuenta * que este array procede de la consulta realizada con la Select introducida en las variable $str_selectEditar. Esta * consulta se lanza con el proceso editar de Igep. * * @access public * @param string $clasePanel * @return array */ public static function dameUltimaEdicion($clasePanel) { $object = $_SESSION[self::getApplicationName()][$clasePanel]; if(is_object($object)) return $object->getResultForEdit(); return null; } /** * Devuelve un array con la tupla seleccionada de la última consulta. * * @access public * @param string $clasePanel * @return array */ public static function dameTuplaSeleccionada($clasePanel) { $object = $_SESSION[self::getApplicationName()][$clasePanel]; if(!is_object($object)) return null; $m_datos = $object->getResultForSearch(); return $m_datos[IgepSession::dameFilaActual($clasePanel)]; } /** * Devuelve el valor de un campo de la tupla seleccionada de la última consulta. * * @access public * @param string $clasePanel * @param string $campo * @return string */ public static function dameCampoTuplaSeleccionada($clasePanel,$campo) { $object = $_SESSION[self::getApplicationName()][$clasePanel]; if(!is_object($object)) return null; $m_datos = $object->getResultForSearch(); $valor = $m_datos[IgepSession::dameFilaActual($clasePanel)][$campo]; //Si se trata de una lista en este caso devolvemos el valor del campo seleccionado if(is_array($valor)) return $valor["seleccionado"]; else return $valor; } /** * Almacena en la SESSION un mensaje. Este método enmascara la inserción de mensajes en la clase, ya que * se encarga de comprobar que el objeto que recibe es un objeto de la clase IgepMensaje y realiza la asignación * a la variable de gvHidraForm_DB destinada para el mensaje de los paneles, obj_mensaje. Si no cumple las condiciones * requeridas no se realiza la asignación. * * @access public * @param string $clasePanel * @param object $mensaje */ public static function guardaMensaje($clasePanel,$mensaje) { $claseMensaje = get_class($mensaje); if($claseMensaje == "IgepMensaje") $_SESSION[self::getApplicationName()][$clasePanel]->obj_mensaje = $mensaje; } /** * Método que indice si existe el panel en la SESSION * @param string $clasePanel * @return integer */ public static function existeMensaje($clasePanel) { return (!empty($_SESSION[self::getApplicationName()][$clasePanel]->obj_mensaje)); } /** * Método que devuelve el mensaje de un panel almacenado en la SESSION * @param string $clasePanel * @return IgepMensaje */ public static function dameMensaje($clasePanel) { return $_SESSION[self::getApplicationName()][$clasePanel]->obj_mensaje; } /** * Método que borra un panel de la SESSION * @param string $clasePanel * @return void */ public static function borraMensaje($clasePanel) { unset($_SESSION[self::getApplicationName()][$clasePanel]->obj_mensaje); } /*Funciones con variables particulares*/ /** * Comprueba si existe en la SESSION alguna variable particular dentro de la definición de un Panel. * * @access public * @param string $clasePanel * @param string $variable * @return bool */ public static function existeVariable($clasePanel,$variable) { return isset($_SESSION[self::getApplicationName()][$clasePanel]->$variable); } /** * Devuelve el valor de una variable de un Panel contenido en la SESSION. * * @access public * @param string $clasePanel * @param string $variable * @return mixed */ public static function dameVariable($clasePanel,$variable) { if(isset($_SESSION[self::getApplicationName()][$clasePanel]->$variable)) return $_SESSION[self::getApplicationName()][$clasePanel]->$variable; return null; } /** * Borra la referencia a una variable de un Panel en la SESSION. * * @access public * @param string $clasePanel * @param string $variable */ public static function borraVariable($clasePanel,$variable) { unset($_SESSION[self::getApplicationName()][$clasePanel]->$variable); } /** * Almacena en la SESSION el valor de una variable de un Panel * * @access public * @param string $clasePanel * @param string $nombreVar * @param mixed $valor */ public static function guardaVariable($clasePanel, $nombreVar, $valor) { if ((!empty($valor)) && (!empty($clasePanel))) { @$_SESSION[self::getApplicationName()][$clasePanel]->$nombreVar = $valor; } } /** * Devuelve el valor de una variable ubicada en la zona global de la SESSION. * * @access public * @param string $nomVariable * @return mixed */ public static function dameVariableGlobal($nomVariable) { $value = @$_SESSION[self::getApplicationName()]['gvhGlobalZone'][$nomVariable]; if(isset($value)) return $value; return null; } /** * Borra una variable ubicada en la zona global de la SESSION. * * @access public * @param string $nomVariable * @return mixed */ public static function borraVariableGlobal($nomVariable) { unset($_SESSION[self::getApplicationName()]['gvhGlobalZone'][$nomVariable]); } /** * Almacena en la zona de la SESSION global el valor de una variable * * @access public * @param string $clasePanel * @param string $nombreVar * @param mixed $valor */ public static function guardaVariableGlobal($nombreVar, $valor) { $_SESSION[self::getApplicationName()]['gvhGlobalZone'][$nombreVar] = $valor; } /** * Añade el módulo $nomModulo dinámicamente, * el segundo parámetro, $valor es opcional, * si se utiliza, se añadira el $valor, al registro * de valores del modulo * @access public * @param string nomModulo * @param array $valor */ public static function anyadeModuloValor($nomModulo, $valor=null, $descripcion=null) { if ( !(IgepSession::hayModuloDinamico($nomModulo)) ) { $_SESSION[ComunSession::dameAplicacion()]['modulosDIN'][$nomModulo]['valor']= $valor; $_SESSION[ComunSession::dameAplicacion()]['modulosDIN'][$nomModulo]['descrip']= $descripcion; } } /** * Quita el módulo $nomModulo dinámicamente, * el segundo parámetro, $valor es opcional, * si aparece, se elimina el el módulo siempre * que coincida el valor que tenía asignado * con el valor previmanete registrado * @access public * @param string nomModulo * @param array $valor */ public static function quitaModuloValor($nomModulo, $valor=null) { if ($valor==null) { if ( (IgepSession::hayModuloDinamico($nomModulo)) ) unset($_SESSION[ComunSession::dameAplicacion()]['modulosDIN'][$nomModulo]); } else { if ( (IgepSession::hayModuloDinamico($nomModulo)) && ($_SESSION[ComunSession::dameAplicacion()]['modulosDIN'][$nomModulo]['valor'] == $valor) ) unset($_SESSION[ComunSession::dameAplicacion()]['modulosDIN'][$nomModulo]); } } /** * Sobrecarga la funcion de la clase padre, devuelve true siempre que existan módulos, sean o no dinamicos * cierto módulo para la aplicación actual. * @access public * @param string nomModulo * @return bool */ public static function hayModulo($nomModulo) { $app = ComunSession::dameAplicacion(); return ( (isset($_SESSION[$app]['modulosDIN']) and is_array($_SESSION[$app]['modulosDIN']) and array_key_exists($nomModulo,$_SESSION[$app]['modulosDIN'])) || (isset($_SESSION[$app]['modulos']) and is_array($_SESSION[$app]['modulos']) and array_key_exists($nomModulo,$_SESSION[$app]['modulos'])) ); } /** * Comprueba si el usuario al que pertenece la SESSION tiene concedido * cierto módulo para la aplicación actual. * @access public * @param string nomModulo * @return bool */ public static function hayModuloDinamico($nomModulo) { if (isset ($_SESSION[ComunSession::dameAplicacion()]['modulosDIN'])) return (array_key_exists($nomModulo,$_SESSION[ComunSession::dameAplicacion()]['modulosDIN'])); else return false; } /** * Devuelve el array con todos los modulos concedidos para un usuario y para la aplicación actual. * @access public * @return array */ public function dameModulosDinamicos() { return $_SESSION[ComunSession::dameAplicacion()]['modulosDIN']; } /** * Sobrecarga el método de la clase padre, devolviendo un array formado por * los móodulos dinámicos y los modulos concedidos para un usuario y * para la aplicación actual, información que preoviene de comun. * @access public * @return array */ public static function dameModulos() { $modulosDin = is_array(@$_SESSION[ComunSession::dameAplicacion()]['modulosDIN'])?$_SESSION[ComunSession::dameAplicacion()]['modulosDIN']:array(); $modulos = is_array($_SESSION[ComunSession::dameAplicacion()]['modulos'])?$_SESSION[ComunSession::dameAplicacion()]['modulos']:array(); $v_modulos = array_merge ($modulosDin, $modulos); return($v_modulos); } /** * Devuelve el array con los valores de un módulo Dinámico * concreto para la aplicación actual. Si no existe retorna -1 * @access public * @param string nomModulo * @return array */ public static function dameModuloDinamico($nomModulo) { if (IgepSession::hayModuloDinamico($nomModulo)) return $_SESSION[ComunSession::dameAplicacion()]['modulosDIN'][$nomModulo]; else return -1; } /** * Devuelve el objeto salto activo. * * @static * @return IgepSalto */ public static function dameSalto() { if( isset($_SESSION[ComunSession::dameAplicacion()][IgepSession::GVHIDRA_JUMP]) ) { return $_SESSION[ComunSession::dameAplicacion()][IgepSession::GVHIDRA_JUMP]; } return null; } //Fin de dameSalto /** * Almacena el salto como activo. El parametro de entrada debe ser un IgepSalto * * @static * @param IgepSalto $jump */ public static function guardaSalto( $jump ) { if( get_class($jump) == 'IgepSalto' ) { $_SESSION[ComunSession::dameAplicacion()][IgepSession::GVHIDRA_JUMP] = $jump; } } //Fin de guardaSalto /** * Elimina el salto activo de SESSION * * @static */ public static function borraSalto() { unset($_SESSION[ComunSession::dameAplicacion()][IgepSession::GVHIDRA_JUMP] ); } //Fin de borraSalto /** * Agrega un panel a la lista de paneles visitados. * * @static * @param string $nombrePanel Nombre que identifica al panel (claseManejadora). */ public static function _marcarPanelVisitado( $nombrePanel ) { $panelesVisitados = IgepSession::dameVariable( 'global', 'panelesVisitados' ); if( !isset($panelesVisitados) ) { $panelesVisitados = array(); } if( !in_array($nombrePanel,$panelesVisitados) ) { array_push( $panelesVisitados, $nombrePanel ); } IgepSession::guardaVariable( 'global', 'panelesVisitados', $panelesVisitados ); } //Fin de _marcarPanelVisitado /** * Vacía la lista de paneles visitados, borrando dichos paneles antes. * * @static */ public static function _borrarPanelesVisitados() { //Borramos el contenido de los paneles anteriores $paneles = IgepSession::dameVariable( 'global', 'panelesVisitados' ); if( is_array($paneles) ) { foreach( $paneles as $panelVisitado ) { IgepSession::borraPanel( $panelVisitado ); } } IgepSession::guardaVariable( 'global', 'panelesVisitados', array() ); } //Fin de _borrarPanelesVisitados /** * Registramos la clase como accesible para que permita el acceso a la misma desde el inicio. * El framework por seguridad bloquea el acceso a las clases que en el menú el usuario conectado no tiene permiso. * Con este método, se permite que una clase que no está en el menú accesible pueda serlo. * * @param string $clase */ public static function registraClaseAccesible($clase) { if(!empty($clase)) { $acl = @$_SESSION[self::getApplicationName()]["global"]->acl; if(empty($acl)) { $acl = array(); } $acl[] = $clase; IgepSession::guardaVariable("global","acl",$acl); } } /** * Valida si la clase consultada es accesible por el usuario conectado (según su rol). * * @param string $clase */ public static function validarClaseAccesible($clase) { if(!empty($clase)) { $acl = @$_SESSION[self::getApplicationName()]["global"]->acl; if(empty($acl) || in_array($clase, $acl)) { return true; } } return false; } /* ------------------------- MÉTODOS PRIVADOS --------------------------- */ /** * Trata de obtener la IP del cliente aun cuando se pasa a través de proxies y/o balanceadores * * @static * @return string */ private static function getClientIP() { $ipCliente = ''; if( array_key_exists('HTTP_X_FORWARDED_FOR', $_SERVER) ) { $v_IPsCliente = array_values( array_filter(explode(',',$_SERVER['HTTP_X_FORWARDED_FOR'])) ); $ipCliente = end( $v_IPsCliente ); } else if( array_key_exists('REMOTE_ADDR', $_SERVER) ) { $ipCliente = $_SERVER["REMOTE_ADDR"]; } else if( array_key_exists('HTTP_CLIENT_IP', $_SERVER) ) { $ipCliente = $_SERVER["HTTP_CLIENT_IP"]; } if( (strnatcmp(phpversion(),'5.2.7') >= 0) && (!empty($ipCliente)) ) { $ipCliente = filter_var( $ipCliente, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 ); } return $ipCliente; } // Fin de getClientIP } //End IgepSession