<?php
/* CORE - FDC 4.5 - yan.uniko.102@gmail.com, 2009 */
/* Verifica que el archivo no se visualize de forma directa */
if($_SERVER['SCRIPT_FILENAME'] == __file__) exit;
$sistema = new sistema();
class sistema{
var $navegador = null;
var $modulosSeleccionables = null;
var $contenidoHtml = '';
function __construct(){
/* Carga las configuraciones iniciales */
include(dirname(__file__).'/configuraciones.php'); $this->conf = new configuraciones();
/* Verifica coherencias en las configuraciones */
if(
isset($this->conf->perfilamiento['habilitado']) and
$this->conf->perfilamiento['habilitado']
){
/* La clase de usuario no funciona sin una base de datos activa */
if(
(!isset($this->conf->mysql['autoCargar'])) or
(!$this->conf->mysql['autoCargar'])
)
Imposible iniciar el sistema de perfilamiento sin iniciar
una conección por defecto a la base de datos.
');
}
/* Previene el robo de la cookie de sesión vía XSS */
session_set_cookie_params($cookieSesion['lifetime'], $cookieSesion['path'], $cookieSesion['domain'], $cookieSesion['secure'], true);
$this->cargarLibreria('error');
$this->cargarLibreria('str');
$this->cargarLibreria('cabeceras');
$this->cargarLibreria('logs');
$this->cargarLibreria('ids');
$this->cargarLibreria('driver_obj');
$this->cabeceras->establecerTipo('text/html');
/* Carga la conexión MySQL por defecto */
if(
isset($this->conf->mysql['autoCargar']) and
($this->conf->mysql['autoCargar'])
){
$this->cargarLibreria('mysql');
if(!$this->mysql->conectar(
$this->conf->mysql['host'],
$this->conf->mysql['usuario']['nombre'],
$this->conf->mysql['usuario']['clave'],
$this->conf->mysql['baseDeDatos'],
$this->conf->mysql['codificacion'],
$this->conf->desfaceGMT['mysql']
))
return die($this->mysql->error->ultimo('msg')); }
/* Realiza la autocarga de la sesión de usuario */
if($this->conf->perfilamiento['habilitado']){
/* Carga la librería necesaria */
$this->cargarLibreria('usuario');
/* Carga la sesión de usuario por defecto via sesión de cookie */
$this->usuario->perfilarViaCookie();
/* Reinicia cualquier error de carga fallida */
$this->usuario->error->reiniciar();
/* Guarda sesiones temporales solo para usuarios logueados para prevenir una
sobrecarga durante un ataque de DDOS o ataque distribuido */
if($this->usuario->perfilado)
}
$this->detectaAgenteDeUsuario();
/* Carga las autocargas antes de cargar cualquier otra cosa (librerias
adicionales, módulos, etc) */
$this->establecerAutocargas('pre');
/* Verifica la integridad del contexto actual en tema de
* seguridad e intrusión no concentida */
$this->ids->iniciar();
$this->contenidoHtml = array( 'cabecera' => '',
);
/* Obtiene las configuraciones del archivo de configuraciones del template
antes de llamar a los módulos */
if($this->conf->template['habilitado']){
/* Existe el template? */
if(!file_exists($this->conf->rutas['template']['local'].'index.php')) return die('El Template seleccionado no existe.');
/* El archivo de configuraciones existe? */
if(!file_exists($this->conf->rutas['template']['local'].'config.php')) return die('La configuración del Template no existe.');
/* Obtiene las configuraciones del template */
include($this->conf->rutas['template']['local'].'config.php');
}
$this->cargaModulos();
$this->establecerAutocargas('pos');
/* Muestra el contenido final entre el módulo y el template */
/* Muestra la carga de todos los módulos en orden coorelativo */
$this->contenidoHtml['modulo'] = implode('', $this->contenidoHtml['modulo']);
if($this->conf->template['habilitado'])
include($this->conf->rutas['template']['local'].'index.php');
else
echo $this->contenidoHtml['modulo'];
/* Cierra la conexión MySQL */
$this->mysql->cerrar();
/* Final de la ejecución */
}
function detectaAgenteDeUsuario(){
/* Valores por defecto */
$this->navegador = array( 'nombre' => '',
'version' => '',
'ie<=8' => false,
'soportaHTML5' => false /* ie >= 9 && * */
);
/* Detecta el motor del agente de usuario */
'#(?<navegador>'.join('|', array('msie', 'firefox', 'safari', 'webkit', 'opera', 'netscape', 'konqueror', 'gecko')).')[/ ]+(?<version>[0-9]+(?:\.[0-9]+)?)#', $navegador
);
if($navegador['navegador'][0]){
$ieTrident = false;
$mVersion = explode('.', $navegador['version'][0]); if((int)$mVersion[0] < 9){ /* ie<=8 */
$ieTrident = true;
}
}
}
$this->navegador = array( 'version' => trim($navegador['version'][0]), 'ie<=8' => $ieTrident, /* ie<=8 */
'soportaHTML5' => ($ieTrident ? false : true) /* ie>=9&&* */
);
unset($navegador, $ieTrident); }
}
function cargarLibreria($namespace, $nuevo = false, $parametros = null){
/* Incluye el archivo de la librería una sola ves para hacer uso de el las veces
que sea necesario */
include_once($this->conf->rutas['librerias']['local'].$namespace.'.php');
if($nuevo){
$libreria = new $namespace($parametros);
if(!$libreria->sys)
$libreria->sys = $this; /* Librería recursiva */
/* Libreria por defecto sin recursividad */
if(
($namespace != 'error') and
(!$libreria->error)
)
$libreria->error = $this->cargarLibreria('error', true);
/* Retorna la librería cargada */
return $libreria;
}else{
/* El objeto ya existe? */
return $this->$namespace;
$this->$namespace = new $namespace($parametros);
if(!$this->$namespace->sys)
$this->$namespace->sys = $this; /* Librería recursiva */
/* Libreria por defecto sin recursividad */
if(
($namespace != 'error') and
(!$this->$namespace->error)
)
$this->$namespace->error = $this->cargarLibreria('error', true);
/* Retorna la librería cargada */
return $this->$namespace;
}
}
function establecerAutocargas($prefijo){
/* Procesa archivos */
if($archivos = glob($this->conf->rutas['autocargas']['local'].$prefijo.'*.php')) foreach($archivos as $archivo)
include_once($archivo);
/* Procesa directorios */
if($archivos = glob($this->conf->rutas['autocargas']['local'].$prefijo.'*/index.php')) foreach($archivos as $archivo)
include_once($archivo);
}
function obtieneModulosSeleccionables($base = false){
/* Crea la base de la búsqueda */
if(!$base)
$base = $this->conf->rutas['modulos']['local'];
/* Va en busca de los módulos */
foreach(glob($base.'*/index.php') as $file){ if($mod = $mod[count($mod) - 2]) $mods[] = $mod;
}
/* Hay módulos? */
if(!$mods)
/* Arreglo contenedor de la totalidad de las secciones a devolver */
/* Va en busca de los submódulos de forma recursiva */
foreach($mods as $mod){
$totalMods[] = $mod;
/* Tiene submódulos? */
if(is_dir($base.$mod.'/submodulos')){
/* Va en busca de los submódulos */
if($submods = array_filter($this->obtieneModulosSeleccionables($base.$mod.'/submodulos/'))){
/* Procesa cada submódulo */
foreach($submods as $submod){
$totalMods[] = $mod.'/'.$submod;
}
}
}
}
/* Devuelve todas las secicones seleciconables del directorio en contexto */
}
function cargaModulos(){
/* Estructura de directorios :
Modules [dir]
module-1
index.php <- main
assets
style.css <- automatico
print.css <- automatico
script.js <- automatico
images
a.jpg
b.jpg
submodulos
submodulo-1.1
index.php <- main
assets
images
submodulos
submodulo-1.1.1
submodulo-1.1.2
submodulos
submodulos
submodulos
...
submodulo-1.2
...
module-2
...
*/
$rutaInfo = '';
/* Determina el módo en que se obtendrán los módulos */
if(isset($_SERVER['PATH_INFO'])) $rutaInfo = trim((string
)$_SERVER['PATH_INFO'], '/');
elseif(isset($_SERVER['ORIG_PATH_INFO'])) $rutaInfo = trim((string
)$_SERVER['ORIG_PATH_INFO'], '/');
else
$rutaInfo = trim((string
)$this->conf->moduloPrincipal, '/');
/* Extirpa los nombres de archivos terminados en .html para dar información a la URL
canonizada, por ejemplo: http://localhost/usuarios/resumen/juan-lobos.html?id=18 la ruta
de información será: usuarios/resumen */
/* Crea un mapa con las posibles secciones para prevenir el LFI o el Path Traversal */
if(!$this->modulosSeleccionables = $this->obtieneModulosSeleccionables())
die('No hay secciones establecidas en el sistema para cargar');
/* Existe la ruta seleccionada? (Control derivado desde la solicitud del navegador) */
if(!in_array($rutaInfo, $this->modulosSeleccionables)) return $this->cargarModulo('estado', array('get' => array('id' => 404, 'msg' => 'La sección solicitada no existe')));
/* Transforma la ruta de información a objeto array ordenado */
if(strpos($rutaInfo, '/') !== false) /* Ruta compuesta por submódulos */
else
/* Sin submódulos */
$rutaInfo = array($rutaInfo);
/* Establece el contexto, por ejemplo principal/submodulo/submodulo/submodulo */
$this->conf->modulo['contextoCompleto'] = implode('/', $rutaInfo);
/* Token verificador para prevenir que siga cargando los submódulos si un módulo retornó con la inclusión de un nuevo módulo. */
$idModulo = 0;
/* Procesa cada sección necesitada */
foreach($rutaInfo as $modulo){
if(count($this->conf->modulo['contextoHistorial']) > (int
)$idModulo) break;
/* Contexto actual */
$relativo[] = $modulo;
$this->cargarModulo(implode('/', $relativo));
$idModulo++;
}
}
function cargarModulo($rutaInfo, $variablesHTTP = null){
/* Existe la ruta seleccionada? (Control derivado desde un módulo o librería) */
if(!in_array($rutaInfo, $this->modulosSeleccionables)) return $this->cargarModulo('estado', array('get' => array('id' => 404, 'msg' => 'La sección solicitada no existe')));
/* Compone las variables via HTTP GET y POST */
if($variablesHTTP){
if(isset($variablesHTTP['get']))
if(isset($variablesHTTP['post']))
}
/* Limpia la ruta de información */
/* Compone la ruta real */
'local' => $this->conf->rutas['modulos']['local'].str_replace('/', '/submodulos/', $rutaInfo).'/', 'remoto' => $this->conf->rutas['modulos']['enlace'].str_replace('/', '/submodulos/', $rutaInfo).'/', 'enlace' => $this->enlace($rutaInfo)
);
/* Obtiene el identificador del módulo final */
if(strpos($rutaInfo, '/') !== false){ $idModulo = explode('/', $rutaInfo); $idModulo = $idModulo[count($idModulo) - 1]; }else
$idModulo = $rutaInfo;
/* Obtiene los datos del último módulo */
$this->conf->modulo['actual'] = array( 'id' => $idModulo,
'rutaInfo' => $rutaInfo,
'titulo' => '', /* Se establecerá dentro del módulo de manera opcional */
'rutas' => $rutaReal
);
/* Establece el historial de secciones llamadas (útil para crear menus de navegación) */
$this->conf->modulo['historial'][] = $this->conf->modulo['actual'];
$this->conf->modulo['contextoHistorial'][] = $this->conf->modulo['actual']['rutaInfo'];
/* Elimina todo contenido anterior al módulo */
/* Inicia el capturado del contenido del módulo */
/* Incluye la sección */
include_once($rutaReal['local'].'index.php');
/* Obtiene el contenodo del módulo */
/* Incluye dependencias de forma automática (evita tener que declararlas en cada sección) */
if(file_exists($rutaReal['local'].'/assets/script.js')) $this->contenidoHtml['cabecera'] .=
'<script type="text/javascript">'."\n".
"/*\nIncluido automáticamente desde \n".$rutaReal['remoto']."assets/script.js\n*/\n\n".
'</script>'."\n";
if(file_exists($rutaReal['local'].'/assets/style.css')) $this->contenidoHtml['cabecera'] .=
'<style type="text/css" media="all">'."\n".
"/*\nIncluido automáticamente desde \n".$rutaReal['remoto']."assets/style.css\n*/\n\n".
'</style>'."\n";
if(file_exists($rutaReal['local'].'/assets/print.css')) $this->contenidoHtml['cabecera'] .=
'<style type="text/css" media="print">'."\n".
"/*\nIncluido automáticamente desde \n".$rutaReal['remoto']."assets/print.css\n*/\n\n".
'</style>'."\n";
/* Actualiza los datos establecidos por el módulo */
$this->conf->modulo['historial'][count($this->conf->modulo['historial']) - 1] = $this->conf->modulo['actual']; }
function enlace($rutaInfo = null, $parametros = null, $informacion = null){
$ruta = $this->conf->rutas['base']['enlace'];
/* Si no hay ruta lo enlaza al directorio raiz */
if($rutaInfo)
$ruta .= trim($rutaInfo, '/').'/';
/* Archivo .html que se mostrará al final de la ruta del enlace */
if($informacion)
$ruta .= urlencode($this->str->toFriendlyUrl($informacion)).'.html';
/* Parámetros vía HTTP GET */
if($parametros)
$ruta .= '?'.$parametros;
return $ruta;
}
function redireccionaEnlace($rutaInfo = null, $parametros = null, $informacion = null){
return $this->cabeceras->redireccionaUrl($this->enlace($rutaInfo, $parametros, $informacion));
}
}