!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.1%)
Home    Back    Forward    UPDIR    Refresh    Search    Buffer    Encoder    Tools    Proc.    FTP brute    Sec.    SQL    PHP-code    Update    Feedback    Self remove    Logout    


Viewing file:     toba_memoria.php (28.54 KB)      -rw-r--r--
Select action/file-type:
(+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php
//Tamańo de la pila de la memoria sincronizada
if (! defined('apex_hilo_tamano')) {
    
define('apex_hilo_tamano','5');
}
//Tipos de reciclado de la memoria global
define('apex_hilo_reciclado_item',0);
define('apex_hilo_reciclado_acceso',1);

//----------------------------------------------------------------
//-------------------- QUERYSTRING Basico ------------------------
//----------------------------------------------------------------
/*
    ATENCION, estas claves compiten con posibles claves de los proyectos consumidores
*/
//Separador en el caso de que una clave transporte varios valores
define("apex_qs_separador","||");            //Separador utilizado para diferenciar campos de valores compuestos
define("apex_qs_sep_interno","^^");            //Separador utilizado para segundo nivel de campos compuestos
// Claves de querystring utilizadas por la pareja VINCULADOR - HILO
define("apex_hilo_qs_id","ah");                                    //ID de Hilo referenciado
define("apex_hilo_qs_item","ai");                                //ITEM de catalogo a solicitar
define("apex_hilo_qs_parametros","ap");                            //zona en la que se va a cargar al ITEM
//-- Internos
define("apex_hilo_qs_canal_obj","toba-can");                    //Prefijo de los CANALES de OBJETOS (Para comunicarse con ellos por GET)
define("apex_hilo_qs_zona","tz");                        //CANAL de propagacion de ZONAS
define("apex_hilo_qs_cronometro","toba-cron");                    //CANAL gatillo del cronometro
define("apex_hilo_qs_menu","tm");                        //Indica que el vinculo proviene del MENU
define("apex_hilo_qs_celda_memoria","tcm");                //Indicador que indica que el vinculo proviene del MENU
define("apex_hilo_qs_celda_memoria_defecto","central");    //Nombre de la celda de memoria predeterminada
define("apex_hilo_qs_servicio""ts");
define("apex_hilo_qs_servicio_defecto""generar_html");
define("apex_hilo_qs_objetos_destino""tsd");


/**
 * La memoria contiene la información historica de la aplicación, enmascarando a $_GET y $_SESSION:
 *  - Memoria general de la aplicación
 *  - Memoria de las operaciones
 *  - Memoria sincronizada entre URLs (generalmente de interes interno al framework)
 *  - Parametros del link desde donde se vino ($_GET)
 * 
 * @package Centrales
 */
class toba_memoria
{
    static private 
$instancia;
    private 
$id;
    private 
$url_actual;
    private 
$item_solicitado;
    private 
$item_solicitado_original null;
    private 
$hilo_referencia;
    private 
$parametros;
    private 
$reciclar_memoria true;    //Habilita el reciclado de la memoria en la sesion
    
private $acceso_menu;
    private 
$servicio apex_hilo_qs_servicio_defecto;
    private 
$objetos_destino null;
    
//Memoria
    
private $memoria_celdas;            // Bindeo a el espacio de la memoria del proyecto
    
private $celda_memoria_actual_id;    // ID de la celda actual.
    
private $celda_memoria_actual;        // Referencia al espacio de direcciones de la CELDA actual
    
private $memoria_global;            // Espacio de memoria global de la aplicacion.
    
private $memoria_instancia;            // Memoria global de la instancia.
    
    
static function instancia()
    {
        if (!isset(
self::$instancia)) {
            
self::$instancia = new toba_memoria();
        }
        return 
self::$instancia;        
    }
    
    static function 
eliminar_instancia()
    {
        
self::$instancia null;
    }
    
    private function 
__construct()
    {
        
//toba::logger()->debug("TOBA MEMORIA: Inicializacion.", 'toba');
        //dump_session();
        
$this->id uniqid('st');
        
$this->url_actual texto_plano($_SERVER["PHP_SELF"]);
        
//-[1]- Busco el ID de referencia de la instanciacion anterior del HILO
        //        Este ID me permite ubicar la memoria correcta para el request ACTUAL
        
if(isset($_GET[apex_hilo_qs_id])){
            
$this->hilo_referencia=$_GET[apex_hilo_qs_id];
        }else{
            
//Atencion, no hay hilo de referencia. CONTROLAR!!
            //Esto tiene sentido solo para la pagina de logon (?) para el resto 
            //del sistema implica que las cosas funcionen mal!
        
}
        
        
//-[2]- Que ITEM se solicito?
        
$this->item_solicitado self::get_item_solicitado_original();
        
//-[3]- Recupero los parametros
        
$this->parametros = array();
        foreach (
array_keys($_GET) as $clave) {
            
$this->parametros[utf8_decode($clave)] = utf8_decode($_GET[$clave]);
        }
//        $this->parametros = $_GET;
        //FALTA hacer un URL decode!!!        
        
$encriptar_qs toba::proyecto()->get_parametro('encriptar_qs');
        if(
$encriptar_qs){
            if(isset(
$_GET[apex_hilo_qs_parametros])){
                
$encriptador toba::encriptador();
                
parse_str($encriptador->descifrar($_GET[apex_hilo_qs_parametros]), $parametros);
                
$this->parametros array_merge($this->parametros$parametros);
                unset(
$this->parametros[apex_hilo_qs_parametros]);
                unset(
$this->parametros["jmb76"]);    //Clave agregada para complicar la encriptacion
            
}
        }
        unset(
$this->parametros[apex_hilo_qs_id]);
        unset(
$this->parametros[apex_hilo_qs_item]);
        
        
//------- MEMORIA -- Hago el bindeo con $_SESSION  ----------------------------
        // Determino el ID de la celda de memoria actual        
        
if(isset($this->parametros[apex_hilo_qs_celda_memoria])){
            
$this->celda_memoria_actual_id $this->parametros[apex_hilo_qs_celda_memoria];
            unset(
$this->parametros[apex_hilo_qs_celda_memoria]);
        } else {
            
$this->celda_memoria_actual_id apex_hilo_qs_celda_memoria_defecto;
        }
        
        
// Apunto las referencias a session
        
$this->memoria_celdas =& toba::manejador_sesiones()->segmento_memoria_proyecto();
        
// Celda ACTUAL
        
if(!isset($this->memoria_celdas[$this->celda_memoria_actual_id])){
            
$this->memoria_celdas[$this->celda_memoria_actual_id] = array();
        }
        
$this->celda_memoria_actual =& $this->memoria_celdas[$this->celda_memoria_actual_id]; 
        
// Memoria GLOBAL
        
if(!isset($this->memoria_celdas['__toba__global_proyecto'])){
            
$this->memoria_celdas['__toba__global_proyecto'] = array();
        }
        
$this->memoria_global =& $this->memoria_celdas['__toba__global_proyecto'];
        
// Memoria de la INSTANCIA
        
$this->memoria_instancia =& toba::manejador_sesiones()->segmento_datos_instancia();
        
//-----------------------------------------------------------------------------

        
if (isset($this->parametros[apex_hilo_qs_servicio])) {
            
$this->servicio substr($this->parametros[apex_hilo_qs_servicio], 060);
            unset(
$this->parametros[apex_hilo_qs_servicio]);
        }
        if (isset(
$this->parametros[apex_hilo_qs_objetos_destino])) {
            
$objetos $this->parametros[apex_hilo_qs_objetos_destino];
            
$lista_obj explode(","$objetos);
            
$this->objetos_destino = array();
            foreach (
$lista_obj as $obj) {
                if (
trim($obj) != '') {
                    
$this->objetos_destino[] = explode(apex_qs_separador$obj);
                }
            }
            unset(
$this->parametros[apex_hilo_qs_servicio]);
        }        
        
//Guardo el FLAG que indica si se accedio por el menu
        
if (isset($_GET[apex_hilo_qs_menu])) {
            
$this->acceso_menu true;
        } else {
            
$this->acceso_menu false;
        }

        
$this->inicializar_memoria();
        
        if (isset(
$this->celda_memoria_actual['hilo'])) {
            
//Si la página requerida es una que ya se genero, se descartan los siguientes pedidos
            //Esto permite manejar el caso del refresh y el back, aunque se pierde la posibilidad de re-hacer con forward
            //ya que cada back que se ingresa genera un nuevo estado (porque se realiza una nueva ejecución)
            
$claves array_keys($this->celda_memoria_actual['hilo']);
            if (
in_array($this->hilo_referencia$claves)             //Desde donde provengo aun se encuentra en el cache
                    
&& $this->hilo_referencia != end($claves)) {    //No provengo desde la ultima generacion (seria el caso normal)
                
$encontrado false;
                foreach (
$claves as $clave) {
                    if (
$encontrado) {
                        unset(
$this->celda_memoria_actual['hilo'][$clave]);    //Borro aquellos que quedan en 'sandwich'
                    
}
                    if (
$clave == $this->hilo_referencia) {
                        
$encontrado true;
                    }
                }
            }
        }
     }

     
/**
      * Destructor de la memoria, no sirve para borrar la memoria, sino es parte del proceso de apagado del framework
      */
    
function destruir()
    {
        
//Disparo el proceso de reciclaje
        
if($this->reciclar_memoria){
            
$this->reciclar_datos_globales_acceso();    
            
$this->reciclar_datos_sincronizados();
        }
        
//Mantengo guardado cual es el item anterior de la celda
        
$this->celda_memoria_actual['item_anterior'] = $this->celda_memoria_actual['item'];
    }

    function 
get_celda_memoria_actual_id()
    {
        return 
$this->celda_memoria_actual_id;
    }

    function 
set_item_solicitado$item 
    {
        
toba::logger()->debug('Se cambia el ítem solicitado a =>'.var_export($itemtrue), "toba");
        
$this->item_solicitado $item;
        
$this->inicializar_memoria();
        if (
toba_editor::activado()) {        
            
toba_editor::set_item_solicitado($item);
        }
    }
    
    
/**
     * Genera la primera porcion de todas las URLs
     */
    
function prefijo_vinculo()
    {
        return 
$this->url_actual "?" apex_hilo_qs_id  "=" $this->id;
    }

    
/**
     * Retorna el id que identifica univocamente este request
     */
    
function get_id()
    {
        return 
$this->id;
    }

    
//----------------------------------------------------------------
    //-----------------  ACCESO al ESTADO GENERAL  -------------------
    //----------------------------------------------------------------
    
    /**
     * Retorna el servicio solicitado por la URL
     */
    
function get_servicio_solicitado()
    {
        return 
$this->servicio;    
    }
    
    function 
set_servicio_solicitado($servicio)
    {
        
$this->servicio $servicio;
    }
    
    
    
/**
     * Retorna la referencia a aquellos objetos destino del servicio solicitado
     */
    
function get_id_objetos_destino()
    {
        return 
$this->objetos_destino;
    }

    
/**
     * Retorna el valor de un parámetro enviado en la URL por el vinculador
     *
     * @param string $canal Identificador que se utilizó como clave del parámetro
     * @return string Valor pasado como parámetro, o null en el caso que no se encuentre
     */
    
function get_parametro($canal)
    {
        if(isset(
$this->parametros[$canal])){
            return 
$this->parametros[$canal];            
        }else{
            return 
null;
        }
    }

    
/**
     * Retorna todos los parámetros enviados en la URL por el vinculador
     * @return array Arreglo clave => valor de los parámetros
     */
    
function get_parametros()
    {
        
$temp $this->parametros;
        unset(
$temp[apex_hilo_qs_zona]);
        return 
$temp;            
    }

    
/**
     * Retorna el item requerido en este pedido de página
     * @return array [0]=>proyecto, [1]=>id_item
     */
    
function get_item_solicitado()
    {
        if (isset(
$this->item_solicitado)) {
            return 
$this->item_solicitado;
        }
    }

    
/**
     * Retorna la operación requerida originalmente por el usuario en este pedido de página
     * Puede diferir de la operación actual ya que se pudo hacer una redirección
     * @see get_item_solicitado
     * @return array [0]=>proyecto, [1]=>id_item
     */    
    
static function get_item_solicitado_original()
    {
        if (isset(
$_GET[apex_hilo_qs_item])){
            
$item explode(apex_qs_separador,$_GET[apex_hilo_qs_item]);
            if(
count($item)==0){
                return 
null;
            } elseif(
count($item)==2){
                return 
$item;
            }else{
                return 
null;
            }
        }else{
            return 
null;//No hay parametro
        
}        
    }
    


    function 
usuario_solicita_cronometrar()
    {
        if(isset(
$this->parametros[apex_hilo_qs_cronometro])){
            return 
true;
        }else{
            return 
false;
        }
    }
    
    
//----------------------------------------------------------------
    //------------ MEMORIA -------------------------------------------
    //----------------------------------------------------------------    

    /**
        Inicializa la memoria
    */
    
function inicializar_memoria()
    {
        if( 
$this->verificar_acceso_menu() ){
            
/*
                El flag de acceso por el menu desencadena el borrado de toda la memoria pensada para
                utilizarse dentro de una operacion: los elementos de la memoria GLOBAL marcados 
                como 'reciclables' y la memoria sincronizada (la alienada al request anterior).
            */
            
toba::logger()->info('Se detecto acceso desde el menu. Se limpia la memoria de la operacion''toba');
            
$this->limpiar_memoria_sincronizada();
            
$this->limpiar_datos_reciclable();
        }
        
$this->inicializar_reciclaje_global();
        
    }

    function 
limpiar_memoria()
    {
        
$this->limpiar_memoria_sincronizada();
        
$this->limpiar_datos_operacion();
    }

    function 
dump()
    {
        
ei_arbol( array(    'global proyecto' => $this->memoria_global,
                            
'celda_actual' => $this->celda_memoria_actual
                            
'instancia' => $this->memoria_instancia ),
                    
'Estado INTERNO de toba::memoria()');
    }

    
/**
        Indica si se accedio por el menu
    */
    
function verificar_acceso_menu()
    {
        return 
$this->acceso_menu;
    }

    
/**
     * Indica si se lanzo la solicitud por medio de un ef_popup.
     * @return boolean 
     */
    
function verificar_acceso_popup()
    {
        
$valor $this->get_parametro('ef_popup_valor');
        return (! 
is_null($valor));
    }
    
//------------------------------------------------------------------------
    //--------- Manejo de DATOS de la INSTANCIA (no utiliza celdas) ----------
    //------------------------------------------------------------------------

    /**
     * Almacena un dato en la instancia. 
     * Este mecanismo aporta un canal para la comunicacion entre proyectos que se ejecutan simultaneamente.
     */
    
function set_dato_instancia($indice$datos)
    {
        
$this->memoria_instancia[$indice]=$datos;        
    }
    
    
/**
     * Recupera un dato almacenado con set_dato_instancia
     * @return mixed Si el dato existe en la memoria lo retorna sino retorna null
     */
    
function get_dato_instancia($indice$eliminar_dato=false)
    {
        if(
$this->existe_dato_instancia($indice))    {
            
$dato $this->memoria_instancia[$indice];
            if (
$eliminar_dato) {
                
$this->eliminar_dato_instancia($indice);
            }
            return 
$dato;
        }else{
            return 
null;
        }
    }

    
/**
     * Elimina un dato de la memoria de la instancia
     */
    
function eliminar_dato_instancia($indice)
    {
        if(isset(
$this->memoria_instancia[$indice])){
            unset(
$this->memoria_instancia[$indice]);
        }
    }
    
    
/**
     * Determina si un dato esta disponible en la memoria de la instancia
     */    
    
function existe_dato_instancia($indice)
    {
        return isset(
$this->memoria_instancia[$indice]);
    }
    
    
/**
     * Limpia la memoria de la instancia
     */
    
function limpiar_datos_instancia()
    {
        
$this->memoria_instancia = array();
    }

    
//------------------------------------------------------------------------
    //--------- Manejo de DATOS del PROYECTO (no utiliza celdas) -------------
    //------------------------------------------------------------------------
    /**
     * Almacena un dato en la sesion del proyecto y perdura durante toda la sesión
     * Similar al manejo normal del $_SESSION en una aplicacion ad-hoc
     */
    
function set_dato($indice$datos)
    {
        
$this->memoria_global[$indice]=$datos;        
    }
    
    
/**
     * Recupera un dato almacenado con set_dato
     * @return mixed Si el dato existe en la memoria lo retorna sino retorna null
     */
    
function get_dato($indice)
    {
        if(
$this->existe_dato($indice))    {
            return 
$this->memoria_global[$indice];
        }else{
            return 
null;
        }
    }

    
/**
     * Elimina un dato de la memoria
     */
    
function eliminar_dato($indice)
    {
        if(isset(
$this->memoria_global[$indice])){
            unset(
$this->memoria_global[$indice]);
        }
    }
    
    
/**
     * Determina si un dato esta disponible en la memoria
     */    
    
function existe_dato($indice)
    {
        return isset(
$this->memoria_global[$indice]);
    }
    
    
/**
     * Limpia la memoria global del proyecto
     */
    
function limpiar_datos()
    {
        
$this->memoria_global = array();
    }

    
//------------------------------------------------------------------------
    //-------- Manejo de DATOS de una OPERACION en la sesion (x celda) -------
    //------------------------------------------------------------------------
    /*
    *    Esta memoria es utilizada por los componentes toba para guardar la informacion
    *    propia de una operacion. La misma se recicla cuando el usuario cambia de operacion
    */

    /**
     * Almacena un dato de la operacion actual en la sesión.
     * Se elimina cuando se cambia de operación
     */
    
function set_dato_operacion($indice$datos)
    {
        
$this->celda_memoria_actual['global'][$indice]=$datos;
        
$this->agregar_dato_global_reciclable($indiceapex_hilo_reciclado_item);
    }

    
/**
     * Recupera un dato almacenado durante la operacion
     * @return mixed Si el dato existe en la memoria lo retorna sino retorna null
     */
    
function get_dato_operacion($indice)
    {
        if(
$this->existe_dato_operacion($indice))    {
            
//Se avisa que se accedio a un dato global al sistema de reciclado
            
$this->acceso_a_dato_global($indice);
            return 
$this->celda_memoria_actual['global'][$indice];
        }else{
            return 
null;
        }
    }

    
/**
     * Elimina un dato de la memoria de la operacion
     */
    
function eliminar_dato_operacion($indice)
    {
        if(isset(
$this->celda_memoria_actual['global'][$indice])){
            unset(
$this->celda_memoria_actual['global'][$indice]);
        }
        
$this->eliminar_informacion_reciclado($indice);
    }
    
    
/**
     * Determina si un dato esta disponible en la memoria de la operacion
     */    
    
function existe_dato_operacion($indice)
    {
        return isset(
$this->celda_memoria_actual['global'][$indice]);
    }
    
    
/**
     * Limpia la memoria de la operacion
     */
    
function limpiar_datos_operacion()
    {
        
$this->celda_memoria_actual['global'] = array();
    }

    
//------------------------------------------------------------------------
    //------- Primitivas control seguridad en la (x operacion, x celda) ------
    //------------------------------------------------------------------------

    /**
     * Almacena un array de la operacion actual en la sesión.
     * Se elimina cuando se cambia de operación
     */
    
function set_array_operacion($indice$datos)
    {
        
$this->set_dato_operacion($indice$datos);
    }

    
/**
     * Controla que exista un dato en un array almacenado para la operacion actual.
     */    
    
function en_array_operacion($indice$dato$tira_excepcion=true)
    {
        
$ok in_array($dato$this->celda_memoria_actual['global'][$indice]);
        if (
$tira_excepcion && !$ok) {
            throw new 
toba_error_seguridad('El valor seleccionado no se corresponde con las opciones válidas');
        }
        return 
$ok;
    }
    
    
/**
     * Recupera un array almacenado durante la operacion
     * @return mixed Si el dato existe en la memoria lo retorna sino retorna null
     */
    
function get_array_operacion($indice)
    {
        return 
$this->get_dato_operacion($indice);
    }
    
    
/**
     * Elimina un array de la memoria de la operacion
     */
    
function limpiar_array_operacion($indice)
    {
        
$this->eliminar_dato_operacion($indice);
    }

    
//------------------------------------------------------------------------
    //-------------------- Memoria SINCRONIZADA (x celda) --------------------
    //------------------------------------------------------------------------
    /**
     * Guarda un dato en la memoria sincronizada.
     * La memoria sincronizada guarda datos macheados contra el request que los produjo.
     * Por ejemplo en el request 65 el indice 'cantidad de tabs'  tiene el valor 8
     * Al hacer el get_dato_sincronizado se chequea en que request se encuentra actualmente y retorna el valor asociado
     * Esto permite que al hacer BACK con el browser se vuelva a las variables de sesion de las antiguas paginas
     * No es una buena opción para guardar información de la aplicación sino mas bien cosas relacionadas con la seguridad
     * y funcioanmiento interno del framework
     */
    
function set_dato_sincronizado($indice$datos$celda=null)
    {
        if (!isset(
$celda)) {
            
$this->celda_memoria_actual['hilo'][$this->id][$indice]=$datos;
        } else {
            
$this->memoria_celdas[$celda]['hilo'][$this->id][$indice]=$datos;
        }
    }
    
    
/**
     * Recupera un dato de la memoria sincronizada, macheandolo con el id actual del hilo
     * @return mixed El dato solicitado o NULL si no existe
     */
    
function get_dato_sincronizado($indice$celda=null)
    {
        if (isset(
$celda)) {
            
//--- Es una celda particular
            
if (isset($this->memoria_celdas[$celda]['hilo'][$this->hilo_referencia][$indice])) {
                return 
$this->memoria_celdas[$celda]['hilo'][$this->hilo_referencia][$indice];
            }
        } elseif (isset(
$this->celda_memoria_actual['hilo'][$this->hilo_referencia][$indice])) {
            
//--- Celda actual
            
return $this->celda_memoria_actual['hilo'][$this->hilo_referencia][$indice];
        }
        return 
null;
    }

    function 
eliminar_dato_sincronizado($indice)
    {
        if(isset(
$this->celda_memoria_actual['hilo'][$this->id][$indice])){
            unset(
$this->celda_memoria_actual['hilo'][$this->id][$indice]);
        }
    }

    function 
limpiar_memoria_sincronizada()
    {
        unset(
$this->celda_memoria_actual['hilo']);
    }

    private function 
reciclar_datos_sincronizados()
    
//Ejecuto la recoleccion de basura de la MEMORIA SINCRONIZADA
    
{
        if(isset(
$this->celda_memoria_actual['hilo'])){
            if(
count($this->celda_memoria_actual['hilo']) > apex_hilo_tamano ){
                
array_shift($this->celda_memoria_actual['hilo']);
            }
        }
    }

    
/**
     * Borra la memoria de un evento antendido en un request previo
     *     Lo utilizan los componentes para que los eventos no se reejecuten con el refresh del browser
     * @ignore 
     */
    
function eliminar_evento_sincronizado_solicitud_previa($componente$evento)
    {
        if(isset(
$this->celda_memoria_actual['hilo'][$this->hilo_referencia][$componente]['eventos'][$evento])) {
            unset(
$this->celda_memoria_actual['hilo'][$this->hilo_referencia][$componente]['eventos'][$evento]);
        }
    }

    
//----------------------------------------------------------------    
    //-------------  RECICLAJE de CELDAS -----------------------------
    //----------------------------------------------------------------    
    
    /**
        Desactiva el reciclado
    */
    
function desactivar_reciclado()
    {
        
$this->reciclar_memoria false;
    }

    
/**
        Inicializa el esquema de reciclado global
    */
    
private function inicializar_reciclaje_global()
    {
        
//-- Inicializo reciclaje por cambio de item.
        
if(isset($this->item_solicitado)){
            
$this->celda_memoria_actual['item'] = implode('|',$this->item_solicitado);
        }else{
            
$this->celda_memoria_actual['item'] = 'inicio';
        }
        
//toba::logger()->debug('Item de celda de memoria: '.$this->celda_memoria_actual['item']);
        //-- Inicializo reciclaje por acceso.
        //        Vacio los reciclables activos para que se registren ellos.
        
$this->celda_memoria_actual['reciclables_activos'] = array();
        if(!isset(
$this->celda_memoria_actual['reciclables'])){
            
$this->celda_memoria_actual['reciclables'] = array();
        }
        
//Disparo el reciclaje por cambio de item
        
$this->reciclar_datos_globales_item();
    }

    
/**
        Se marca un dato global como reciclable
    */
    
private function agregar_dato_global_reciclable($indice$tipo_reciclado)
    
//Se reporta que un dato global se va a reciclar
    
{
        if(
$tipo_reciclado != apex_hilo_reciclado_item && $tipo_reciclado != apex_hilo_reciclado_acceso ){
            
//El tipo de reciclado es invalido!
            
throw new toba_error('El tipo de reciclado solicitado es invalido');
        }
        if( !
$this->existe_dato_reciclable($indice) ){
            
$this->celda_memoria_actual['reciclables'][$indice] = $tipo_reciclado;
        }
        if(
$tipo_reciclado == apex_hilo_reciclado_acceso){
            
//Si el tipo de reciclado es por conteo de accesos, marco al dato como activo
            
$this->dato_global_activo($indice);
        }
    }
    
    
/**
        Registra el acceso a datos globales para el esquema de reciclado por conteo de accesos
    */
    
private function acceso_a_dato_global($indice)
    {
        
//Si el tipo de reciclado es por acceso, marco que el elemento fue accedido
        
if( isset($this->celda_memoria_actual['reciclables'][$indice]) ){
            if(
$this->celda_memoria_actual['reciclables'][$indice]== apex_hilo_reciclado_acceso){
                
$this->dato_global_activo();    
            }
        }
    }

    
/**
        Setea un dato reciclable como activo en el esquema de reciclado por conteo de accesos
    */
    
private function dato_global_activo($indice)
    
//Indica que el dato reciclable fue activado
    
{
        
//Puede ser llamado por fuera
        
if( $this->existe_dato_reciclable($indice) ){
            if(!
in_array($indice,$this->celda_memoria_actual['reciclables_activos'])){
                
$this->celda_memoria_actual['reciclables_activos'][] = $indice;
            }
        }
    }

    
/**
        Reciclado de datos globales por cambio de item.
        Se debe ejecutar cuando se inicia el request
            (Si el item de la celda actual cambio, eliminar el contenido)
    */
    
private function reciclar_datos_globales_item()
    {
        if(isset(
$this->celda_memoria_actual['item_anterior'])){
            
$es_distinto_item = ($this->celda_memoria_actual['item_anterior'] != $this->celda_memoria_actual['item']);
            if(
$es_distinto_item && !$this->verificar_acceso_menu()) {
                
toba::logger()->info("Se detecto cambio de operación. Se limpia la memoria de la operacion"'toba');
                foreach( 
$this->celda_memoria_actual['reciclables'] as $reciclable => $tipo){    
                    if(
$tipo == apex_hilo_reciclado_item){
                        
$this->eliminar_dato_operacion($reciclable);
                    }
                }
            }
        }
    }

    
/**
        Reciclado por control de acceso a los datos guardados
        Se debe ejecutar cuando termina el request
            (Si un dato no fue accedido, borrarlo)
    */
    
private function reciclar_datos_globales_acceso()
    {
        foreach( 
$this->celda_memoria_actual['reciclables'] as $reciclable => $tipo){    
            if(
$tipo == apex_hilo_reciclado_acceso){
                
//Si hay un elemento reciclable que no se activo, lo destruyo
                
if(!in_array($reciclable,$this->celda_memoria_actual['reciclables_activos'])){
                    
toba::logger()->info("Se limpio de la memoria el elemento '$reciclable' porque no fue accedido"'toba');
                    
$this->eliminar_dato_operacion($reciclable);
                }
            }
        }
    }

    
/**
        Controla si existe un dato reciclabe
    */
    
private function existe_dato_reciclable($indice)
    {
        return (isset(
$this->celda_memoria_actual['reciclables'][$indice]));
    }

    
/**
        Limpia toda la memoria reciclable
    */
    
private function limpiar_datos_reciclable()
    {
        if(isset(
$this->celda_memoria_actual['reciclables'])){
            foreach(
$this->celda_memoria_actual['reciclables'] as $reciclable => $tipo){
                
$this->eliminar_dato_operacion($reciclable);
            }
        }
        
//Esto no deberia ser necesario.
        
unset($this->celda_memoria_actual['reciclables']);
        unset(
$this->celda_memoria_actual['reciclables_activos']);
    }

    
/**
        Elimina la informacion asociada al reciclado de un dato
    */
    
private function eliminar_informacion_reciclado($indice)
    {
        
//Si el dato era reciclable, lo saco de las listas de reciclado
        
if($this->existe_dato_reciclable($indice)){
            
$tipo $this->celda_memoria_actual['reciclables'][$indice];
            
//Si el reciclado es de tipo 'acceso', tengo que sacarlo de la lista de reciclables activos
            
if($tipo == apex_hilo_reciclado_acceso){
                foreach(
array_keys($this->celda_memoria_actual['reciclables_activos']) as $reciclable){
                    if(
$this->celda_memoria_actual['reciclables_activos'][$reciclable]==$indice){
                        unset(
$this->celda_memoria_actual['reciclables_activos'][$reciclable]);
                    }
                }
            }
            unset(
$this->celda_memoria_actual['reciclables'][$indice]);
        }
    }
    
    
//----------------------------------------------------------------
    //-------------------- EVENTOS de SESION TOBA --------------------
    //----------------------------------------------------------------
/*
* Las funciones que siguen generan dos links ESPECIALES que se atrapan antes que cualquier 
* proxima ACTIVIDAD (Antes de que exista la proxima solicitud). 
* Estos links implican EVENTOS de SESION. Estan metidos en el hilo porque
* Hacen referencia al estado actual (especificamente a la eliminacion del estado actual)
* Hasta ahora estas funciones solo se llaman desde el CONTROL.
*/

    
function finalizar()
/*
     @@acceso: nucleo
    @@desc: Crea el vinculo que hay que llamar para eliminar la SESION...
*/
    
{
        return 
$this->prefijo_vinculo() ."&"apex_sesion_qs_finalizar "=1";
    }    

    
//----------------------------------------------------------------
    //---------------- MANEJO de ARCHIVOS de Temporales --------------
    //----------------------------------------------------------------    
/*
    Estas funciones pertinen manejar el ciclo de vida de archivos
    cargados con UPLOADS que son solo validos durante la sesion.
    La eliminacion de estos archivos esta en el evento cerrar de la sesion
*/
    
function registrar_archivo_temporal($archivo){
        if(    !isset(
$this->memoria_celdas['__toba__archivos_temporales']) 
            || !
in_array($archivo$this->memoria_celdas['__toba__archivos_temporales'])){
            
$this->memoria_celdas['__toba__archivos_temporales'][] = $archivo;
        }
    }

    function 
eliminar_archivos_temporales()
    {
        
//Existieron archivos temporales asociados a la sesion, los elimino...
        
if (isset($this->memoria_celdas['__toba__archivos_temporales'])) {
            foreach(
$this->memoria_celdas['__toba__archivos_temporales'] as $archivo) {
                
//SI puedo ubicar los archivos los elimino
                
if(is_file($archivo)){
                    
unlink($archivo);
                }
            }
        }        
    }
}
?>

:: 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.801 ]--