# Destino Roca - Sistema Integral de Transporte Urbano (GRUPO 5) ## 1. Identidad y Alcance del Sistema - **Nombre Oficial:** Destino Roca - **Tipo de Proyecto:** Sistema Web Funcional de Transporte Urbano Colectivo - **Localización:** Ciudad de General Roca (Río Negro, Argentina) - **Materia / Curso:** Mantenimiento - 2° 1ra CB - **Profesores:** Armas - Bañares - **Autores Estudiantiles:** Tatiana de la Canal, Iara Gutierrez, Vera Priselac, Nahiara Valladares, Morena Cortes. - **Estado Técnico:** 🟢 **SISTEMA EN PRODUCCIÓN FUNCIONAL (Arquitectura Modular PHP + Flat-File JSON)**. --- ## 2. Reorganización y Estructura Profesional de Carpetas Para transformar la maqueta previa en un sistema de software formal, mantenible y seguro, se reorganizó el proyecto bajo un patrón estructurado de servicios y vistas: ```text GRUPO 5/ ├── index.php # Enrutador Front Controller (Rutas seguras mediante whitelist) ├── .htaccess # Configuración del servidor Apache y cabeceras de seguridad ├── SEGUIMIENTO.md # Memoria técnica, roles, auditoría y bitácora del sistema ├── config/ │ ├── .htaccess # Denegación estricta de acceso HTTP directo a la configuración │ ├── config.php # Ajustes globales, rutas base y sesiones seguras │ └── security.php # Prevención de XSS, CSRF token helper y cabeceras HTTP ├── src/ │ ├── .htaccess # Protección de lógica backend contra descargas directas │ ├── Database.php # Motor JSON Flat-File con concurrencia atómica (flock exclusivo) │ ├── Auth.php # Autenticación con Bcrypt (password_hash) y roles (RBAC) │ ├── BusLineService.php # Gestión de líneas, recorridos y coordenadas GPS reales de Roca │ └── AlertService.php # Lógica de avisos de servicio, desvíos y alertas de pasajeros ├── data/ │ ├── .htaccess # Protección de base de datos contra accesos públicos vía URL │ ├── lines.json # Base de datos de líneas (102, 103, 104, 105), paradas y polilíneas │ ├── alerts.json # Cartelera oficial de cortes, desvíos y demoras │ ├── user_alerts.json # Alertas de proximidad programadas por los pasajeros │ ├── offline_bundles.json # Registro de paquetes offline descargados (con límite de cuota) │ └── users.json # Base de usuarios con contraseñas hasheadas y roles ├── views/ │ ├── layouts/ │ │ ├── header.php # Layout superior, barra académica, navbar y selector de fuente │ │ └── footer.php # Layout inferior y scripts base del sistema │ ├── map.php # Mapa interactivo Leaflet.js / OpenStreetMap con rastreo GPS real │ ├── lines.php # Directorio detallado de líneas, horarios y paradas intermedias │ ├── alerts.php # Cartelera de avisos en vivo y programador de proximidad │ ├── offline.php # Gestor de memoria y exportador de paquetes offline (SRS RNF03) │ ├── admin.php # Consola administrativa protegida con ABM de líneas y comunicados │ ├── login.php # Portal de acceso seguro con botones de prueba rápida │ └── register.php # Registro de nuevos pasajeros frecuentes ├── api/ │ └── index.php # API RESTful centralizada con validación CSRF y control de roles ├── docs/ │ ├── Libro SRS 1.docx # Especificación formal de requisitos de software original │ └── Libro SRS 2.docx # Plan de asignación de responsabilidades por estudiante └── legacy_mockups/ # Resguardo de las maquetas HTML originales de las 5 estudiantes ├── Buscador - Usuario.html ├── Descarga de mapas (1).html ├── Inicio de sesión -Vera.html ├── recorrido y avisos - usuario.html ├── modulo_descargas_tatiana.html ├── modelo_usuario_administrador.html ├── modelo_usuario_registrado.html ├── modelo_usuario_visitante.html └── index.html ``` --- ## 3. Estándares de Seguridad Implementados 1. **Autenticación Criptográfica:** - No se almacenan contraseñas en texto plano. Se implementó `password_hash()` con algoritmo Bcrypt y verificación mediante `password_verify()`. 2. **Protección contra CSRF (Cross-Site Request Forgery):** - Generación de token criptográficamente seguro en sesión (`csrf_token()`). - Validación obligatoria en todas las operaciones POST de la API (`verify_csrf()`) mediante cabecera `X-CSRF-TOKEN` o campo oculto. 3. **Prevención de XSS (Cross-Site Scripting):** - Función de escape universal `e()` con `htmlspecialchars(..., ENT_QUOTES, 'UTF-8')` en todas las salidas del template. 4. **Protección de Archivos y Base de Datos:** - Archivos `.htaccess` en `data/`, `src/` y `config/` con directiva `Require all denied` que impiden la descarga directa de archivos JSON o código PHP por navegador. 5. **Cabeceras HTTP de Protección:** - `X-Frame-Options: SAMEORIGIN` (anti-Clickjacking). - `X-Content-Type-Options: nosniff` (anti-MIME Sniffing). - `X-XSS-Protection: 1; mode=block`. - `Referrer-Policy: strict-origin-when-cross-origin`. 6. **Prevención de Directory Traversal:** - El enrutador de `index.php` utiliza una lista blanca estricta (`$allowedViews`) validando cada parámetro antes de incluir cualquier archivo. 7. **Persistencia Concurrente Segura (ACID-like Flat-File):** - La clase `Database` aplica bloqueo atómico con `flock($fp, LOCK_EX)` en escrituras y `flock($fp, LOCK_SH)` en lecturas para evitar corrupción de datos por concurrencia. --- ## 4. Funcionalidades Reales del Sistema ### A. Mapa Interactivo en Vivo con Leaflet.js y OpenStreetMap (General Roca) - Cartografía real centrada en General Roca (`-39.0268, -67.5758`). - Trazado vectorial de las 4 líneas principales (Línea 102, 103, 104 y 105) sobre calles reales: Canalito, San Martín, Mitre, Stefenelli, J.J. Gómez, Hospital López Lima y Paso Córdova. - Marcadores de colectivos animados que actualizan su posición GPS continua en tiempo real. - Paradas geolocalizadas clickeables que indican el arribo estimado y permiten programar alertas. - Buscador y filtro en vivo por nombre de barrio, calle o número de línea. ### B. Gestión de Usuarios y Roles (RBAC) El sistema cuenta con tres niveles de acceso claramente diferenciados: 1. **Administrador (`admin@destinoroca.com` / clave: `admin123`):** - Acceso exclusivo al panel `/index.php?v=admin`. - Alta de nuevas líneas de colectivo guardadas en `data/lines.json`. - Baja de unidades o recorridos existentes. - Emisión de comunicados oficiales de desvíos u obras hacia la cartelera comunitaria. 2. **Pasajero Registrado (`pasajero@destinoroca.com` / clave: `pasajero123`):** - Programación de alertas de proximidad para paradas específicas con aviso sonoro y visual. - Gestión de paquetes de mapas offline en memoria local. 3. **Visitante (`visitante@destinoroca.com` / clave: `visitante123`):** - Consulta libre de recorridos, horarios, mapa en vivo y cartelera de avisos. ### C. Almacenamiento Offline y Cuota de Memoria (SRS RNF03) - Gestor de memoria local que valida la restricción estipulada en el libro SRS: **máximo 3 líneas simultáneas offline**. - Generación y exportación de paquetes GeoJSON reales para descarga en el dispositivo del usuario. ### D. Accesibilidad Visual (SRS RNF01) - Selector de escala tipográfica (A-, A, A+) con persistencia en `localStorage` mediante variables CSS. --- ## 5. Cuentas de Acceso para Pruebas | Rol | Correo Electrónico | Contraseña | Capacidades | |---|---|---|---| | **Administrador** | `admin@destinoroca.com` | `admin123` | Control total, ABM de líneas y publicación de avisos | | **Pasajero** | `pasajero@destinoroca.com` | `pasajero123` | Programar alertas y descargar mapas offline | | **Visitante** | `visitante@destinoroca.com` | `visitante123` | Consulta y visualización pública | > [!TIP] > En la pantalla de inicio de sesión (`index.php?v=login`) se incorporaron botones de acceso rápido con un solo clic para alternar entre cualquiera de los 3 perfiles sin necesidad de tipear. --- ## 6. Instrucciones de Despliegue en Hosting PHP 1. Subir todo el contenido de la carpeta `GRUPO 5` a la raíz de tu hosting compartido (típicamente `public_html`). 2. Verificar que el servidor soporte PHP 7.4 o superior (probado y verificado en PHP 8.x). 3. Asegurarse de que el directorio `data/` cuente con permisos de escritura (`chmod 775` o `chmod 777`) para que PHP pueda escribir en los archivos JSON. 4. Ingresar al dominio asignado o probar localmente con `php -S localhost:8000`.