!C99Shell v. 2.1 [PHP 8 Update] [02.02.2022]!

Software: Apache/2.4.53 (Unix) OpenSSL/1.1.1o PHP/7.4.29 mod_perl/2.0.12 Perl/v5.34.1. PHP/7.4.29 

uname -a: Linux vps-2738122-x 4.15.0-213-generic #224-Ubuntu SMP Mon Jun 19 13:30:12 UTC 2023 x86_64 

uid=1(daemon) gid=1(daemon) grupos=1(daemon) 

Safe-mode: OFF (not secure)

/opt/apex_tdfonline/php/nucleo/lib/   drwxr-xr-x
Free 14.92 GB of 61.93 GB (24.09%)
Home    Back    Forward    UPDIR    Refresh    Search    Buffer    Encoder    Tools    Proc.    FTP brute    Sec.    SQL    PHP-code    Update    Feedback    Self remove    Logout    


Viewing file:     toba_manejador_sesiones.php (34.23 KB)      -rw-r--r--
Select action/file-type:
(+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php
define
("apex_sesion_qs_finalizar","fs");        //SOLICITUD de finalizacion de sesion
define("apex_sesion_qs_cambio_proyecto","cps"); //SOLICITUD de cambio e proyecto: cerrar sesion y abrir nueva
define('apex_sesion_qs_cambio_pf''cpf');    //Solicitud de cambio de perfil funcional activo


/**
 * Maneja los segmentos de memoria y el proceso de creacion de sesiones
 * @package Seguridad
 */
class toba_manejador_sesiones
{
    static private 
$instanciacion;
    private 
$instancia;
    private 
$proyecto;
    private 
$sesion null;
    private 
$usuario null;
    protected 
$perfiles_funcionales_activos = array();
    private 
$autenticacion null;
    private 
$contrasenia_vencida false;
    
    
/**
     * @return toba_manejador_sesiones
     */
    
static function instancia()
    {
        if (!isset(
self::$instanciacion)) {
            
self::$instanciacion = new toba_manejador_sesiones();    
        }
        return 
self::$instanciacion;    
    }

    private function 
__construct()
    {
        
define('TOBA_DIR'toba_nucleo::toba_dir());
        if (
PHP_SAPI != 'cli') {
            if (
session_id() != '') {
                throw new 
toba_error("Ya existe una sesión abierta, probablemente tenga activado session.auto_start = 1 en el php.ini");
            }

            
session_name(toba::instalacion()->get_session_name());
            
session_start();
        }
        
$this->instancia toba_instancia::get_id();
        
$this->proyecto toba_proyecto::get_id();
        if(!isset(
$_SESSION[TOBA_DIR]['nucleo'])) { //Primer acceso al sistema
            
$_SESSION[TOBA_DIR]['nucleo']['inicio'] = time();
        }
    }

    
//------------------------------------------------------------------
    //---  API para el manejo de sesiones ------------------------------
    //------------------------------------------------------------------

    /**
     * Logueo a una instancia.
     *    El parametro 3 es pasado como parametro al metodo conf__incial() de toba_sesion.
     *     Este metodo puede disparar una excepcion de tipo 'toba_error_autentificacion'
     */
    
function login($id_usuario$clave=null$datos_iniciales=null)
    {
        if ( 
$this->existe_sesion_activa() ) {
            
toba::notificacion()->agregar('No es posible loguearse sobre una sesion abierta');
            throw new 
toba_reset_nucleo();
        }
        if ( 
$this->existe_usuario_activo() ) {
            
$this->procesar_acceso_proyecto($datos_iniciales);
        }
        
$this->autenticar($id_usuario$clave$datos_iniciales);
        if (
$this->contrasenia_vencida) {    //Si se vencio la contraseña del usuario redirecciono al item correspondiente
            
$this->contrasenia_vencida false;
            throw new  
toba_error_login_contrasenia_vencida('La contraseña actual del usuario ha caducado');
        }
                
        
$this->procesar_acceso_instancia($id_usuario$datos_iniciales);
        
        
// Se recarga el nucleo, esta vez sobre una sesion activa.
        
if (toba::nucleo()->solicitud_en_proceso()) {
            throw new 
toba_reset_nucleo('INICIAR SESION... recargando el nucleo.');
        }
    }

    
/**
     * Acceso de un usuario aninimo a la instancia.
     */
    
function login_anonimo($datos_iniciales=null)
    {
        if ( 
$this->existe_sesion_activa() ) {
            throw new 
toba_error('No es posible loguearse sobre una sesion abierta.');
        }
        if (!
toba::proyecto()->get_parametro('usuario_anonimo')) {
            throw new 
toba_error('No esta definido el ID del usuario anonimo. No es posible iniciar la sesion.');
        }
        if (!
toba::proyecto()->get_parametro('usuario_anonimo_grupos_acc')) {
            throw new 
toba_error('No esta definido el grupo de acceso del usuario anonimo. No es posible iniciar la sesion.');
        }
        
$this->procesar_acceso_instancia(null$datos_iniciales);
        
// Se recarga el nucleo, esta vez sobre una sesion activa.
        
if (toba::nucleo()->solicitud_en_proceso()) {
            throw new 
toba_reset_nucleo('INICIAR SESION... recargando el nucleo.');
        }
    }

    
/**
     * Salida de la sesion creada desde un proyecto
     */
    
function logout($observaciones=null)
    {
        unset(
$_SESSION['openid']);
        if ( !(
$this->existe_sesion_activa() && $this->existe_usuario_activo()) ) {
            throw new 
toba_error('No existe una sesion de la cual desloguearse.');
        }
        
$this->procesar_salida_proyecto($observaciones);

        
//Mando a hacer el logout para los tipos de autenticacion externos.
        
$this->get_autenticacion()->logout();
        
        
// Se recarga el nucleo, esta vez sobre una sesion INACTIVA.
        
if (toba::nucleo()->solicitud_en_proceso()) {
            throw new 
toba_reset_nucleo('FINALIZAR SESION... recargando el nucleo.');
        }
    }
    
    
/**
    *    Entrada a un proyecto desde la operación de inicializacion de sesion
    */
    
function iniciar_sesion_proyecto($datos_iniciales)
    {
        
//Login anonimo de sesiones extendidas.
        
if ( ! toba::proyecto()->get_parametro('requiere_validacion') ) {
            
$this->login_anonimo($datos_iniciales);
        }        
        
$this->procesar_acceso_proyecto($datos_iniciales);            
        if (
toba::nucleo()->solicitud_en_proceso()) {
            throw new 
toba_reset_nucleo('INICIAR SESION PROYECTO... recargando el nucleo.');
        }
    }
    
    
/**
     * Delega la autenticación del proyecto a un objeto 
     * @param toba_autenticable $autenticacion Objeto responsable de la autenticacion
     */
    
function set_autenticacion(toba_autenticable $autenticacion)
    {
        
$this->autenticacion $autenticacion;
    }
    
    function 
get_autenticacion() {
        if (!isset(
$this->autenticacion)) {
            switch (
toba::instalacion()->get_tipo_autenticacion()) {
                case 
'ldap':
                    
$this->set_autenticacion(new toba_autenticacion_ldap());
                    break;
                case 
'openid':
                    
$this->set_autenticacion(new toba_autenticacion_openid());
                    break;
                case 
'cas':
                    
$this->set_autenticacion(new toba_autenticacion_cas());
                    break;
                case 
'saml':

                    
$this->set_autenticacion(new toba_autenticacion_saml());
                    break;                
                default:                                                
//tipo == 'toba'
                    
$this->set_autenticacion(new toba_autenticacion_basica());
                    break;                    
            }
        }        
        return 
$this->autenticacion;
    }

    
//------------------------------------------------------------------
    //---  Informacion GENENRAL  ---------------------------------------
    //------------------------------------------------------------------

    /**
    * Devuelve true si existe un usuario logueado en la instancia
    */
    
function existe_usuario_activo($instancia=null)
    {
        
$instancia = isset($instancia) ? $instancia $this->instancia;
        return isset(
$_SESSION[TOBA_DIR]['instancias'][$instancia]['id_usuario']);
    }
    
    
/**
    * Devuelve true si existe una sesion para el proyecto actual
    */
    
function existe_sesion_activa($proyecto=null)
    {
        
$proyecto = isset($proyecto) ? $proyecto $this->proyecto;
        return isset(
$_SESSION[TOBA_DIR]['instancias'][$this->instancia]['proyectos'][$proyecto]['info_sesion']['id']);
    }

    
/**
    * Devuelve el ID de la sesion actual. Este es el ID utilizado por toba para registrar la sesion en la base.
    */
    
function get_id_sesion($proyecto=null)
    {
        
$proyecto = isset($proyecto) ? $proyecto $this->proyecto;
        if (
$this->existe_sesion_activa($proyecto)) {
            return 
$_SESSION[TOBA_DIR]['instancias'][$this->instancia]['proyectos'][$proyecto]['info_sesion']['id'];
        }
    }

    
/**
    * Devuelve el ID del usuario logueado a la instancia actual.
    */
    
function get_id_usuario_instancia()
    {
        if (
$this->existe_usuario_activo()) {
            return 
$_SESSION[TOBA_DIR]['instancias'][$this->instancia]['id_usuario'];
        }
    }

    
/**
    * Devuelve la cantidad de instancias cargadas (con o sin usuarios activos)
    */
    
function get_cantidad_instancias_cargadas()
    {
        return 
count($_SESSION[TOBA_DIR]['instancias']);
    }

    
/**
    * Devuelve la cantidad de instancias que poseen un usuario activo
    */
    
function get_cantidad_instancias_activas()
    {
        
$x 0;
        if(isset(
$_SESSION[TOBA_DIR]['instancias']) && is_array($_SESSION[TOBA_DIR]['instancias'])) {
            foreach( 
array_keys($_SESSION[TOBA_DIR]['instancias']) as $instancia ) {
                if (
$this->existe_usuario_activo($instancia)) $x++;
            }
        }
        return 
$x;
    }

    
/**
    * Devuelve la cantidad de proyectos cargadas (con o sin sesiones)
    */
    
function get_cantidad_proyectos_cargados()
    {
        return 
count($_SESSION[TOBA_DIR]['instancias'][$this->instancia]['proyectos']);
    }

    
/**
    * Devuelve la cantidad de proyectos que poseen una sesion abierta
    */
    
function get_cantidad_proyectos_activos()
    {
        
$x 0;
        if(isset(
$_SESSION[TOBA_DIR]['instancias'][$this->instancia]['proyectos']) &&
            
is_array($_SESSION[TOBA_DIR]['instancias'][$this->instancia]['proyectos'])) {
            foreach( 
array_keys($_SESSION[TOBA_DIR]['instancias'][$this->instancia]['proyectos']) as $proyecto ) {
                if (
$this->existe_sesion_activa($proyecto)) $x++;
            }
        }
        return 
$x;
    }

    
/**
    * Devuelve la cantidad de proyectos que poseen una sesion abierta
    */
    
function get_proyectos_activos()
    {
        
$proyectos = array();
        if(isset(
$_SESSION[TOBA_DIR]['instancias'][$this->instancia]['proyectos']) &&
            
is_array($_SESSION[TOBA_DIR]['instancias'][$this->instancia]['proyectos'])) {
            foreach( 
array_keys($_SESSION[TOBA_DIR]['instancias'][$this->instancia]['proyectos']) as $proyecto ) {
                if (
$this->existe_sesion_activa($proyecto)) {
                    
$proyectos[] = $proyecto;
                }
            }
        }
        return 
$proyectos;
    }


    
/**
    *    Responde si un proyecto puntual fue cargado
    */
    
function existe_proyecto_cargado($proyecto)
    {
        return isset(
$_SESSION[TOBA_DIR]['instancias'][$this->instancia]['proyectos'][$proyecto]);
    }
    
    
/**
    *    Determina los perfiles funcionales pertenecientes del usuario actual
    */
    
function get_perfiles_funcionales()
    {
        if( (
toba_editor::modo_prueba() && ( ! toba_editor::acceso_recursivo() ) ) ) {
            return 
toba_editor::get_perfiles_funcionales_previsualizacion();
        } else {
            return 
$this->usuario()->get_perfiles_funcionales();
        }
    }    
    
    
    
/**
    *    Determina los ids de restricciones funcionales pertenecientes al usuario actual segun sus perfiles activos
    */
    
function get_restricciones_funcionales()
    {
        return 
toba::usuario()->get_restricciones_funcionales($this->get_perfiles_funcionales_activos());
    }    
        
    
/**
     * Retorna los perfiles funcionales activos en la sesión actual
     * @return array
     */
    
function get_perfiles_funcionales_activos()
    {
        return 
$this->perfiles_funcionales_activos;
    }
    
    
/**
     * Activa un subconjunto de los perfiles funcionales propios del usuario actual
     * @param array $activos
     */
    
function set_perfiles_funcionales_activos($activos)
    {
        
$perfiles $this->get_perfiles_funcionales();        
        
//Validacion
        
foreach ($activos as $perfil) {
            if (! 
in_array($perfil$perfiles)) {
                throw new 
toba_error_seguridad("Se esta intentando activar el perfil '$perfil' y el mismo no pertenece al usuario actual");
            }
        }
        return 
$this->perfiles_funcionales_activos $activos;
    }    
    

    
/**
    * @deprecated Desde 1.5 usar get_perfiles_funcionales
    */
    
function get_grupos_acceso()
    {
        return 
$this->get_perfiles_funcionales();

    }

    
/**
    *    Determina el perfil de datos del usuario actual
    */
    
function get_perfil_datos()
    {
        if( (
toba_editor::modo_prueba() && ( ! toba_editor::acceso_recursivo() ) ) ) {
            return 
toba_editor::get_perfil_datos_previsualizacion();
        } else {
            return 
$this->usuario()->get_perfil_datos();
        }
    }

    function 
verificar_cambio_perfil_activo() 
    {
        if (isset(
$_POST[apex_sesion_qs_cambio_pf]) && toba::proyecto()->permite_cambio_perfiles()) {
            
$perfil_solicitado trim($_POST[apex_sesion_qs_cambio_pf]);
            if (
$perfil_solicitado != apex_ef_no_seteado) {
                
toba::logger()->debug('Seteando el perfil '$perfil_solicitado ' como activo para el proyecto ' $this->proyecto);
                
$this->set_perfiles_funcionales_activos(array($perfil_solicitado));                                            
            } else {
                
toba::logger()->debug('Seteando como activos para el proyecto los perfiles originales definidos.');
                
$this->set_perfiles_funcionales_activos($this->get_perfiles_funcionales());
            }
            
toba::memoria()->set_dato('usuario_perfil_funcional_seleccionado'$perfil_solicitado);
        }
    }
    
    
//-----------  Acceso a los objetos USUARIO y SESION  ------------------

    /**
     * @return toba_usuario
     */
    
function usuario()
    {
        if( 
$this->existe_usuario_activo() && $this->existe_sesion_activa() ) {
            if (!
is_object($this->usuario)) {
                
toba::logger()->crit("MANEJADOR de SESIONES. Error de consistencia interna, 
                                        la sesion y el usuario estan marcados como activos, 
                                        pero la propiedad 'usuario' no se encuentra seteada"
);
                return new 
toba_usuario_no_autenticado();
            } else {
                return 
$this->usuario;
            }
        } else {
            return new 
toba_usuario_no_autenticado();
        }
    }

    
/**
     * @return toba_sesion
     */
    
function sesion()
    {
        if (
php_sapi_name() === 'cli') {
            
//Mock para la consola??
        
} else {
            if (
$this->existe_sesion_activa()) {
                return 
$this->sesion;
            } else {
                
toba::logger()->notice('ATENCION: No existe una sesion activa en la instancia.');
                return 
null;
            }
        }
    }

    
//------------------------------------------------------------------
    //---  ADMINISTRACION interna de USUARIOS y SESIONES  --------------
    //------------------------------------------------------------------

    /**
    *    El nucleo inicializa el manejador.
    */
    
function iniciar()
    {
        if( 
$this->existe_sesion_activa() ) {            //--> Hay una sesion para el proyecto actual
            
$this->cargar_contexto();
            try {
                
$this->control_finalizacion_sesion();
                
$this->registrar_activacion_sesion();
            } catch ( 
toba_error $e ) {
                
toba::logger()->debug('Pérdida de sesión: '$e->getMessage());
                
$this->logout($e->getMessage());
                
$this->comprobar_acceso_anonimo();
            }
        } elseif( 
$this->existe_usuario_activo() ) {    //--> Hay un usuario en la instancia, pero no logueado al proyecto actual
            //Inicializacion de la sesion del proyecto
            
if ( $this->sesion_esta_extendida() ) {
                
// Tiene metodo de inicializacion?
                
$metodo_inicializacion 'ini__automatica';
                if( 
method_exists($this->get_sesion_proyecto(), $metodo_inicializacion) ) {
                    try {
                        
$datos_iniciales $this->get_sesion_proyecto()->$metodo_inicializacion();
                        
$this->procesar_acceso_proyecto($datos_iniciales);
                        
toba::logger()->debug("MANEJADOR de SESIONES: Incializacion automatica de la sesion del proyecto. DATOS: " var_export($datos_iniciales,true),'toba');
                        return;
                    } catch ( 
toba_error_ini_sesion $e ) {
                        
//La inicializacion automatica fallo, no pasa nada malo. Se prueba con item de inicializacion
                        
toba::logger()->notice("MANEJADOR de SESIONES: Fallo la inicializacion automatica de la sesion del proyecto. " $e->getMessage() ,'toba');
                    }
                } 
                
// Tiene item de inicializacion
                
if ( $this->sesion_posse_item_inicializacion() ) {
                    
//Apunto al nucleo al item de inicializacion de sesion
                    
$item[0] = toba::proyecto()->get_id();
                    
$item[1] = toba::proyecto()->get_parametro('item_set_sesion');
                    
toba::memoria()->set_item_solicitado($item);
                } else {
                    
$this->procesar_acceso_proyecto();
                }
            } else {
                
//La sesion no esta extendida
                
$this->procesar_acceso_proyecto();
            }
        } else {                                        
//--> ** Entrada INICIAL **
            
$this->comprobar_acceso_anonimo();
        }
        if ( 
$this->modo_previsualizacion() ) {
            
$this->activar_editor();
        }        
    }
    
    private function 
comprobar_acceso_anonimo()
    {
        
// Si el proyecto no requiere autentificacion disparo una sesion anonima
        
if ( ! toba::proyecto()->get_parametro('requiere_validacion') ) {
            
//Si la sesion esta extendida, aunque sea anonima necesita inicializacion.
            
if ( $this->sesion_posse_item_inicializacion() ) {
                
//Apunto al nucleo al item de inicializacion de sesion
                
$item[0] = toba::proyecto()->get_id();
                
$item[1] = toba::proyecto()->get_parametro('item_set_sesion');
                
toba::memoria()->set_item_solicitado($item);
            } else {
                
$this->login_anonimo();
            }
        }
    }

    
/**
    * El nucleo finaliza el manejador. Se persiste el usuario y la sesion
    */
    
function finalizar()
    {
        
//ei_arbol($_SESSION, 'sesion', null, true);
        
if( $this->existe_sesion_activa() ) {
            
$this->guardar_contexto();
        }
    }

    
//------------------------------------------------------------------

    /**
    *    Se crea el usuario y la sesion en la instancia
    */
    
private function procesar_acceso_instancia($id_usuario=null$datos_iniciales=null)
    {
        try {
            
//$this->borrar_segmento_proyecto();//Potencialmente utilizado en items publicos
            
$this->cargar_usuario($id_usuario);
            
$this->registar_usuario();
            
$this->abrir_sesion($datos_iniciales);
            
$this->guardar_contexto();
        } catch ( 
toba_error $e ) {
            unset(
$this->usuario);
            unset(
$this->sesion);
            
$this->borrar_segmento_instancia();
            throw 
$e;
        }        
    }

    
/**
    *    Se accede a un proyecto directamente
    */
    
private function procesar_acceso_proyecto($datos_iniciales=null)
    {
        if ( 
$this->existe_sesion_activa() ) {
            
toba::notificacion()->agregar('No es posible cargar un proyecto que ya se encuentra abierto');
        }
        if ( ! 
$this->existe_usuario_activo() ) {
            
//Por si el acceso desde el item de inicializacion de sesion esta mal
            
throw new toba_error('ERROR: El acceso directo a un proyecto solo puede solicitarse si existe un usuario logueado.');
        }
        try {
            
$this->cargar_usuario$this->get_id_usuario_instancia() );
            
$this->abrir_sesion($datos_iniciales);
            
$this->guardar_contexto();
        } catch ( 
toba_error $e ) {
            unset(
$this->usuario);
            unset(
$this->sesion);
            
$this->borrar_segmento_proyecto();
            throw 
$e;
        }
    }

    
/**
    *    Salida de un proyecto. Dispara en cascada la salida de la instancia y la instalacion si es necesario.
    */
    
private function procesar_salida_proyecto($observaciones=null)
    {
        
$this->cerrar_sesion($observaciones);
        
$this->borrar_segmento_proyecto();
        
$this->borrar_segmento_instancia();
        if (
$this->get_cantidad_instancias_cargadas()==0) {
            
$this->borrar_segmento_instalacion();
        }
        
//$this->desregistrar_usuario();
        /*
        if ($this->get_cantidad_proyectos_cargados()==0) {
            // El proyecto era el unico abierto, intento restaurar la memoria completamente
            $this->borrar_segmento_instancia();
            if ($this->get_cantidad_instancias_cargadas()==0) {
                $this->borrar_segmento_instalacion();
            }
        } else {
            // Si no quedan proyectos con sesiones en la instancia, hay que desregistrar el usuario
            if ($this->get_cantidad_proyectos_activos()==0) {
                $this->desregistrar_usuario();
            }
        }
        */
    
}
    
    private function 
cargar_usuario($id_usuario=null)
    {
        
$msg_error "No es posible cargar el usuario '$id_usuario'. El mismo no posee un perfil funcional definido para el proyecto '{$this->proyecto}'.";
        if (isset(
$id_usuario)) {
            
toba::logger()->debug("Cargando USUARIO '$id_usuario' en el proyecto '{$this->proyecto}'",'toba');
            
$this->usuario $this->get_usuario_proyecto($id_usuario);
        } else {
            
toba::logger()->debug("Cargando USUARIO ANONIMO en el proyecto '{$this->proyecto}'",'toba');
            
$this->usuario = new toba_usuario_anonimo('anonimo');
        }
        
// Se piden los perfiles funcionales del usuario.
        
$this->perfiles_funcionales_activos $this->usuario->get_perfiles_funcionales();
    }

    private function 
registar_usuario()
    {
        
$_SESSION[TOBA_DIR]['instancias'][$this->instancia]['inicio'] = time();
        
$_SESSION[TOBA_DIR]['instancias'][$this->instancia]['id_usuario'] = $this->usuario->get_id();
    }
    
    private function 
abrir_sesion($datos_iniciales=null$tipo='normal')
    {
        
$id toba::instancia()->get_id_sesion();
        
toba::logger()->debug("Crear SESION '$id' en el proyecto '{$this->proyecto}'",'toba');
        
toba::instancia()->abrir_sesion$id$this->usuario->get_id(), $this->proyecto );
        
$_SESSION[TOBA_DIR]['instancias'][$this->instancia]['proyectos'][$this->proyecto]['info_sesion']['id'] = $id;
        
$_SESSION[TOBA_DIR]['instancias'][$this->instancia]['proyectos'][$this->proyecto]['info_sesion']['inicio'] = time();
        
$_SESSION[TOBA_DIR]['instancias'][$this->instancia]['proyectos'][$this->proyecto]['info_sesion']['tipo'] = $tipo;
        
toba::logger()->debug('Se creo la SESION [usuario: ' $this->usuario->get_id() . ' ]''toba');
        
$this->sesion $this->get_sesion_proyecto();
        
$this->sesion->conf__inicial($datos_iniciales);
        
$this->registrar_activacion_sesion();
    }

    private function 
registrar_activacion_sesion()
    {
        
//toba::logger()->debug('Registro activacion sesion','toba');
        
$_SESSION[TOBA_DIR]['instancias'][$this->instancia]['proyectos'][$this->proyecto]['info_sesion']['ultimo_acceso'] = time();
        
$this->sesion->conf__activacion();
    }

    
/**
    *    Controla el cierre de la sesion.
    */
    
private function control_finalizacion_sesion()
    {
        
//El usuario solicito cerrar la sesion 
        
if ( isset($_GET[apex_sesion_qs_finalizar])&&($_GET[apex_sesion_qs_finalizar]==1) ) {
            throw new 
toba_error_usuario('Finalizada por el usuario');
        }
        
// Controlo el tiempo de no interaccion
        
$ventana toba::proyecto()->get_parametro('sesion_tiempo_no_interac_min');
        if(
$ventana != 0){ // 0 implica desactivacion
            
$ultimo_acceso $_SESSION[TOBA_DIR]['instancias'][$this->instancia]['proyectos'][$this->proyecto]['info_sesion']['ultimo_acceso'];
            
$tiempo_desconectado = ((time()-$ultimo_acceso)/60);//Tiempo desde el ultimo REQUEST
            
if ( $tiempo_desconectado >= $ventana){
                
toba::notificacion("Usted ha permanecido mas de $ventana minutos sin interactuar 
                            con el servidor. Por razones de seguridad su sesion ha sido eliminada. 
                            Por favor vuelva a registrarse si desea continuar utilizando el sistema.
                            Disculpe las molestias ocasionadas."
);
                throw new 
toba_error_autorizacion("Se exedio la ventana temporal ($ventana m.)");
            }
        }
        
// Controlo el tiempo maximo de sesion
        
$maximo toba::proyecto()->get_parametro('sesion_tiempo_maximo_min');
        if(
$maximo != 0){ // 0 implica desactivacion
            
$inicio_sesion $_SESSION[TOBA_DIR]['instancias'][$this->instancia]['proyectos'][$this->proyecto]['info_sesion']['inicio'];
            
$tiempo_total = ((time()-$inicio_sesion)/60);//Tiempo desde que se inicio la sesion
            
if ( $tiempo_total >= $maximo){
                
toba::notificacion("Se ha superado el tiempo de sesion permitido ($maximo minutos)
                            Por favor vuelva a registrarse si desea continuar utilizando el sistema.
                            Disculpe las molestias ocasionadas."
);
                throw new 
toba_error_autorizacion("Se exedio el tiempo maximo de sesion ($maximo m.)");
            }
        }
        
        
//--Controla que la autenticacion siga presente (caso CAS y SAML)
        
$this->get_autenticacion()->verificar_logout();
    }    

    private function 
cerrar_sesion($observaciones=null)
    {
        
$this->sesion->conf__final();
        
toba::instancia()->cerrar_sesion($this->get_id_sesion(), $observaciones);
        if (
PHP_SAPI != 'cli') {
            
session_regenerate_id(true);
        }
    }

    private function 
desregistrar_usuario()
    {
        
$usuario $_SESSION[TOBA_DIR]['instancias'][$this->instancia]['id_usuario'];
        
toba::logger()->debug("Desregistrando el usuario '$usuario' de la instancia '{$this->instancia}'",'toba');
        unset(
$_SESSION[TOBA_DIR]['instancias'][$this->instancia]['inicio']);
        unset(
$_SESSION[TOBA_DIR]['instancias'][$this->instancia]['id_usuario']);
    }
    
    
/**
    *    Permite controlar desde un proyecto la vida de la sesion del otro a bajo nivel.
    *    Para salir del normalmente del proyecto actual, usar 'logout()' 
    *    Este metodo fuerza la eliminacion directa y esta pensado para que lo consuma el proyecto toba_editor.
    */
    
function abortar_sesion_proyecto($proyecto$obs=null)
    {
        
$id $this->get_id_sesion($proyecto);
        
toba::logger()->debug("Abortando la sesion '$id' del proyecto '$proyecto'.",'toba');
        
toba::instancia()->cerrar_sesion($id$obs);
        
$this->borrar_segmento_proyecto($proyecto);
    }

    
    function 
recargar_info_proyecto($proyecto)
    {
        if (
$proyecto == toba_proyecto::get_id()) {
            
toba_proyecto::eliminar_instancia();
        }
        
$info =& toba::manejador_sesiones()->segmento_info_proyecto($proyecto);
        
$info null;
    }
    
    static function 
recargar_info_instalacion()
    {
        
toba_instalacion::instancia(true);
    }
    
    static function 
recargar_info_instancia()
    {
        
toba_instancia::instancia(true);
    }
    
    
    
//------------------------------------------------------------------
    
    
private function guardar_contexto()
    {
        if( !isset(
$this->usuario) || !isset($this->sesion) ) {
            throw new 
toba_error('MANEJADOR de SESIONES: No es posible guardar el contexto.');
        }
        
$_SESSION[TOBA_DIR]['instancias'][$this->instancia]['proyectos'][$this->proyecto]['usuario'] = serialize($this->usuario);
        
$_SESSION[TOBA_DIR]['instancias'][$this->instancia]['proyectos'][$this->proyecto]['perfiles_funcionales_activos'] = serialize($this->perfiles_funcionales_activos);
        
$_SESSION[TOBA_DIR]['instancias'][$this->instancia]['proyectos'][$this->proyecto]['sesion'] = serialize($this->sesion);
    }
    
    private function 
cargar_contexto()
    {
        if( !isset(
$_SESSION[TOBA_DIR]['instancias'][$this->instancia]['proyectos'][$this->proyecto]['usuario']) ||
            !isset(
$_SESSION[TOBA_DIR]['instancias'][$this->instancia]['proyectos'][$this->proyecto]['sesion']) ) {
            throw new 
toba_error('MANEJADOR de SESIONES: Error interno. No es posible cargar la sesion solicitada.');
        }
        
//Cargo las clases de los archivos serializados
        //SESION
        
$subclase toba::proyecto()->get_parametro('sesion_subclase');
        
$archivo toba::proyecto()->get_parametro('sesion_subclase_archivo');
        if( 
$subclase && $archivo ) {
            require_once(
$archivo);
        }
        
//USUARIO
        
$subclase toba::proyecto()->get_parametro('usuario_subclase');
        
$archivo toba::proyecto()->get_parametro('usuario_subclase_archivo');
        if( 
$subclase && $archivo ) {
            require_once(
$archivo);
        }
        
$this->usuario unserialize($_SESSION[TOBA_DIR]['instancias'][$this->instancia]['proyectos'][$this->proyecto]['usuario']);
        
$this->sesion unserialize($_SESSION[TOBA_DIR]['instancias'][$this->instancia]['proyectos'][$this->proyecto]['sesion']);
        
$this->perfiles_funcionales_activos unserialize($_SESSION[TOBA_DIR]['instancias'][$this->instancia]['proyectos'][$this->proyecto]['perfiles_funcionales_activos']);
    }

    
//------------------------------------------------------------------

    
    
    
private function get_usuario_proyecto($id_usuario)
    {
        
$subclase toba::proyecto()->get_parametro('usuario_subclase');
        
$archivo toba::proyecto()->get_parametro('usuario_subclase_archivo');
        if( 
$subclase && $archivo ) {
            require_once(
$archivo);
            return new 
$subclase($id_usuario);
        } else {
            return new 
toba_usuario_basico($id_usuario);
        }
    }
    
    public function 
invocar_autenticar($id_usuario$clave$datos_iniciales) {
        return 
$this->invocar_metodo_usuario('autenticar', array($id_usuario$clave$datos_iniciales) );        
    }
    
    private function 
invocar_metodo_usuario($metodo$parametros)
    {
        
$subclase toba::proyecto()->get_parametro('usuario_subclase');
        
$archivo toba::proyecto()->get_parametro('usuario_subclase_archivo');
        if( 
$subclase && $archivo ) {
            require_once(
$archivo);
            
$clase $subclase;
        } else {
            
$clase 'toba_usuario_basico';
        }        
        
$estado call_user_func_array( array($clase,$metodo), $parametros );
        return 
$estado;
    }

    private function 
get_sesion_proyecto()
    {
        
$subclase toba::proyecto()->get_parametro('sesion_subclase');
        
$archivo toba::proyecto()->get_parametro('sesion_subclase_archivo');
        if( 
$subclase && $archivo ) {
            require_once(
$archivo);
            return new 
$subclase();
        } else {
            return new 
toba_sesion();
        }
    }

    private function 
sesion_esta_extendida()
    {
        return (     
toba::proyecto()->get_parametro('sesion_subclase') &&
                    
toba::proyecto()->get_parametro('sesion_subclase_archivo') );
    }    

    private function 
sesion_posse_item_inicializacion()
    {
        return (     
toba::proyecto()->get_parametro('item_set_sesion') );
    }    

    private function 
sesion_posse_metodo_inicializacion()
    {
        return (     
toba::proyecto()->get_parametro('item_set_sesion') );
    }    

    
//------------------------------------------------------------------
    //---  Relacion con el EDITOR --------------------------------------
    //------------------------------------------------------------------

    /**
    *    Indica si el proyecto esta ejecutandose en modo previsualizacion
    */
    
private function modo_previsualizacion()
    {
        
$segmento =& $this->segmento_editor();
        return ( isset(
$segmento) && isset($segmento['proyecto']) && ($segmento['proyecto'] == $this->proyecto) );
    }

    
/**
    *    Se encarga de inicializar a toba_editor en los proyectos ejecutados en modo previsualizacion
    *    (la inicializacion esta en la activacion de la sesion del editor y no se invocaba 
    *        cuando el proyecto estaba previsualizaciondose)
    */
    
private function activar_editor()
    {
        if( 
$this->proyecto != toba_editor::get_id() ) {
            
toba_editor::referenciar_memoria();
        }
    }

    
//------------------------------------------------------------------
    //---  Manejo de la autentificacion --------------------------------
    //------------------------------------------------------------------

    /**
    *    Lleva a cabo la autentificacion. 
    *    Los fallos se registran con excepciones, en funcionamiento normal no devulve ningun valor
    */
    
private function autenticar($id_usuario$clave=null$datos_iniciales=null)
    {
        if (
toba::proyecto()->get_parametro('validacion_debug')) {
            
//Es autologin, no se autentica
            
return;
        }
        if (!isset(
$clave)) {
            throw new 
toba_error_autenticacion('Es necesario ingresar la clave.');
        }
        
$ip = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '';
        if (
$this->invocar_metodo_usuario('es_ip_rechazada',array($ip))) {
            throw new 
toba_error('La IP esta bloqueada. Contactese con el administrador');
        }
        if (
$this->invocar_metodo_usuario('es_usuario_bloqueado', array($id_usuario))) {
            throw new 
toba_error('El usuario se encuentra bloqueado. Contáctese con el administrador');
        }
        
// Disparo la autenticacion
        
if ($this->get_autenticacion() != null) {
            
$estado $this->autenticacion->autenticar($id_usuario$clave$datos_iniciales);
        } else {
            throw new 
toba_error_seguridad('No existe la autenticación propuesta');
        }
        if (!
$estado) {
            
$error 'La combinación usuario/clave es incorrecta';
            
$this->invocar_metodo_usuario('registrar_error_login', array($id_usuario$ip$error));
            
$cant_max_intentos toba::proyecto()->get_parametro('validacion_intentos');
            if (isset(
$cant_max_intentos)) {                
                
$bloquear_usuario = (toba::proyecto()->get_parametro('validacion_bloquear_usuario') == '1');
                
$lanzar_excepcion = (toba::proyecto()->get_parametro('validacion_bloquear_usuario') == '2');
                
//Bloqueo el Usuario o IP si la cantidad de intentos supera los esperados dentro de la ventana temporal establecida
                
$ventana_temporal toba::proyecto()->get_parametro('validacion_intentos_min');
                if ( 
$bloquear_usuario || $lanzar_excepcion) {
                    
$intentos $this->invocar_metodo_usuario('get_cantidad_intentos_usuario_en_ventana_temporal',array($id_usuario$ventana_temporal));
                }else{
                    
$intentos $this->invocar_metodo_usuario('get_cantidad_intentos_en_ventana_temporal',array($ip$ventana_temporal));
                }
                
$supero_tope_intentos_en_ventana $intentos $cant_max_intentos;
                if ( 
$supero_tope_intentos_en_ventana ) {
                    if (
$bloquear_usuario) {
                        
$this->invocar_metodo_usuario('bloquear_usuario',array($id_usuario));
                        throw new 
toba_error_autenticacion("$error. Ha superado el límite de inicios de sesion. El usuario ha sido bloqueado.");
                    }elseif (
$lanzar_excepcion) {
                        throw new 
toba_error_autenticacion_intentos("$error. Ha superado el límite de inicios de sesion.|$intentos");
                    } else {
                        
$this->invocar_metodo_usuario('bloquear_ip',array($ip));
                        throw new 
toba_error_autenticacion("$error. La IP ha sido bloqueada.");
                    }
                }
            }
            throw new 
toba_error_autenticacion($error);
        }
        if (
$this->get_autenticacion() != null) {
            
$this->contrasenia_vencida $this->autenticacion->verificar_clave_vencida($id_usuario);
        } else {
            throw new 
toba_error_seguridad('No existe la autenticación propuesta');
        }
    }

    
//------------------------------------------------------------------
    //---  ESPACIOS de MEMORIA  ----------------------------------------
    //------------------------------------------------------------------

    
static function & segmento_info_instalacion()
    {
        if (!isset(
$_SESSION[TOBA_DIR]['instalacion'])) {
            
$_SESSION[TOBA_DIR]['instalacion'] = array();
        }
        return 
$_SESSION[TOBA_DIR]['instalacion'];
    }

    function & 
segmento_info_instancia()
    {
        if (!isset(
$_SESSION[TOBA_DIR]['instancias'][$this->instancia]['info'])) {
            
$_SESSION[TOBA_DIR]['instancias'][$this->instancia]['info'] = array();
        }
        return 
$_SESSION[TOBA_DIR]['instancias'][$this->instancia]['info'];
    }

    function & 
segmento_datos_instancia()
    {
        if (!isset(
$_SESSION[TOBA_DIR]['instancias'][$this->instancia]['datos_globales'])) {
            
$_SESSION[TOBA_DIR]['instancias'][$this->instancia]['datos_globales'] = array();
        }
        return 
$_SESSION[TOBA_DIR]['instancias'][$this->instancia]['datos_globales'];
    }
    
    function & 
segmento_editor()
    {
        if (!isset(
$_SESSION[TOBA_DIR]['instancias'][$this->instancia]['editor'])) {
            
$_SESSION[TOBA_DIR]['instancias'][$this->instancia]['editor'] = array();
        }
        return 
$_SESSION[TOBA_DIR]['instancias'][$this->instancia]['editor'];
    }

    function & 
segmento_info_proyecto($proyecto null)
    {
        if (! isset(
$proyecto)) {
            
$proyecto $this->proyecto;    
        }
        if(!isset(
$_SESSION[TOBA_DIR]['instancias'][$this->instancia]['proyectos'][$proyecto]['info'])) {
            
$_SESSION[TOBA_DIR]['instancias'][$this->instancia]['proyectos'][$proyecto]['info'] = array();
        }
        return 
$_SESSION[TOBA_DIR]['instancias'][$this->instancia]['proyectos'][$proyecto]['info'];
    }

    function & 
segmento_memoria_proyecto()
    {
        if(!isset(
$_SESSION[TOBA_DIR]['instancias'][$this->instancia]['proyectos'][$this->proyecto]['memoria'])) {
            
$_SESSION[TOBA_DIR]['instancias'][$this->instancia]['proyectos'][$this->proyecto]['memoria'] = array();
        }
        return 
$_SESSION[TOBA_DIR]['instancias'][$this->instancia]['proyectos'][$this->proyecto]['memoria'];
    }

    function & 
segmento_memoria_puntos_control()
    {
        if(!isset(
$_SESSION[TOBA_DIR]['instancias'][$this->instancia]['proyectos'][$this->proyecto]['puntos_control'])) {
            
$_SESSION[TOBA_DIR]['instancias'][$this->instancia]['proyectos'][$this->proyecto]['puntos_control'] = array();
        }
        return 
$_SESSION[TOBA_DIR]['instancias'][$this->instancia]['proyectos'][$this->proyecto]['puntos_control'];
    }

    
//----  Borrado de los espacios de memoria  ---------------------------------------------

    
function borrar_segmento_instalacion()
    {
        unset(
$_SESSION[TOBA_DIR]['instalacion']);    
        
toba_instalacion::eliminar_instancia();
        
toba::logger()->debug('BORRAR segmento memoria INSTALACION','toba');
    }

    function 
borrar_segmento_instancia()
    {
        unset(
$_SESSION[TOBA_DIR]['instancias'][$this->instancia]);
        
toba_instancia::eliminar_instancia();
        
toba::logger()->debug('BORRAR segmento memoria INSTANCIA: ' $this->instancia,'toba');
    }

    function 
borrar_segmento_editor()
    {
        unset(
$_SESSION[TOBA_DIR]['instancias'][$this->instancia]['editor']);
        
toba::logger()->debug('BORRAR segmento memoria EDITOR','toba');
    }

    function 
borrar_segmento_proyecto($proyecto=null)
    {
        if(!isset(
$proyecto)) $proyecto $this->proyecto;
        unset(
$_SESSION[TOBA_DIR]['instancias'][$this->instancia]['proyectos'][$proyecto]);
        
toba_proyecto::eliminar_instancia();
        
toba_memoria::eliminar_instancia();
        
toba::logger()->debug('BORRAR segmento memoria PROYECTO: ' $proyecto ,'toba');
    }
}
?>

:: Command execute ::

Enter:
 
Select:
 

:: Search ::
  - regexp 

:: Upload ::
 
[ Read-Only ]

:: Make Dir ::
 
[ Read-Only ]
:: Make File ::
 
[ Read-Only ]

:: Go Dir ::
 
:: Go File ::
 

--[ c99shell v. 2.1 [PHP 8 Update] [02.02.2022] maintained byC99Shell Github | Generation time: 0.766 ]--