blackcoffee2 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (170) hide show
  1. package/CHANGELOG.md +664 -0
  2. package/LICENSE +201 -0
  3. package/NOTICE +25 -0
  4. package/README.md +246 -0
  5. package/apps.zip +0 -0
  6. package/bin/adminclient +105 -0
  7. package/bin/blackcoffee +133 -0
  8. package/cli/admin-users.js +282 -0
  9. package/cli/commands/app.js +561 -0
  10. package/cli/commands/config.js +182 -0
  11. package/cli/commands/db.js +257 -0
  12. package/cli/commands/server.js +200 -0
  13. package/config/applications.json +5 -0
  14. package/config/database.json +28 -0
  15. package/config/database.json.example +23 -0
  16. package/config/server.json +32 -0
  17. package/controllers/admin/AdminController.js +529 -0
  18. package/controllers/admin/AdminViewController.js +90 -0
  19. package/controllers/admin/AuthController.js +293 -0
  20. package/controllers/admin/DatabaseAdminController.js +218 -0
  21. package/core/SQLiteAdapter.js +333 -0
  22. package/core/appLoader.js +385 -0
  23. package/core/databasePoolManager.js +431 -0
  24. package/core/hotReload.js +363 -0
  25. package/data/ADMIN-README.md +145 -0
  26. package/data/CHANGELOG.md +48 -0
  27. package/data/GTK3-NODE-PROPOSALS.md +410 -0
  28. package/data/admin-db.js +150 -0
  29. package/data/admin-gui.js +452 -0
  30. package/data/blackcoffee_admin.db-shm +0 -0
  31. package/data/blackcoffee_admin.db-wal +0 -0
  32. package/data/migrations/001_create_admin_users.sql +33 -0
  33. package/docs/APP_HOOKS_HANDLER.md +432 -0
  34. package/docs/APP_HOOKS_REQUIREMENTS.md +588 -0
  35. package/docs/ARCHITECTURE.md +435 -0
  36. package/docs/CREAR_APP_Y_USAR_POOLS.md +1595 -0
  37. package/docs/EVENTS_APP_MANUAL.md +289 -0
  38. package/docs/INSITU_BINARY_UPLOAD_PROPOSAL.md +186 -0
  39. package/docs/INSITU_FIREWALL_EXCEPTION.md +187 -0
  40. package/docs/ROADMAP.md +242 -0
  41. package/docs/ROADMAP.md.backup +243 -0
  42. package/includes/404-hooks.js +423 -0
  43. package/includes/adminAuth.js +214 -0
  44. package/includes/adminExtension.js +53 -0
  45. package/includes/appHooks.js +302 -0
  46. package/includes/initAdminDb.js +115 -0
  47. package/includes/routeLoader.js +67 -0
  48. package/includes/sessions.js +223 -0
  49. package/issues/001-duplicate-module-loading.md +92 -0
  50. package/manuales/ADMIN_EXTENSION_COMMANDS_MANUAL.md +261 -0
  51. package/manuales/ADMIN_EXTENSION_HOOK_EXAMPLE.md +28 -0
  52. package/manuales/ADMIN_EXTENSION_INTEGRATION_MANUAL.md +232 -0
  53. package/manuales/CACHE_REGEX_COMMANDS.md +136 -0
  54. package/manuales/CACHE_SYSTEM_MAP.md +206 -0
  55. package/manuales/CREACION_DE_CONTROLADORES_INSITU.md +383 -0
  56. package/manuales/QUEUE_CLI_MODULE_MANUAL.md +289 -0
  57. package/manuales/QUEUE_SYSTEM_MANUAL.md +320 -0
  58. package/manuales/ROUTE_CACHE_MODULE_MANUAL.md +205 -0
  59. package/manuales/SESSION_MANAGER_GUIDE.md +529 -0
  60. package/manuales/SESSION_SECURITY_FLAGS.md +174 -0
  61. package/manuales/WAF_MODULE_MANUAL.md +229 -0
  62. package/manuales/after_route_handler_filter_example.md +116 -0
  63. package/manuales/after_route_handler_usage.md +130 -0
  64. package/manuales/an/303/241lisis-completo-insitu-framework.md +213 -0
  65. package/manuales/async_hooks_promises_guide.md +325 -0
  66. package/manuales/before_route_handler_filter_example.md +97 -0
  67. package/manuales/before_route_handler_usage.md +122 -0
  68. package/manuales/hooks_chaining_conditions_guide.md +261 -0
  69. package/manuales/hooks_filters_documentation.md +493 -0
  70. package/manuales/hooks_filters_documentation_en.md +493 -0
  71. package/manuales/hooks_vs_middlewares_comparison.md +87 -0
  72. package/manuales/manual-mvc-completo.md +934 -0
  73. package/manuales/modulos_administracion.md +89 -0
  74. package/manuales/router_execution_points.md +74 -0
  75. package/manuales/static_file_hooks_usage.md +222 -0
  76. package/models/AdminUserModel.js +132 -0
  77. package/package.json +45 -0
  78. package/programatically/PRoutes.js +89 -0
  79. package/programatically/initFlow.js +211 -0
  80. package/public/admin/css/db-pools.css +336 -0
  81. package/public/admin/css/styles.css +310 -0
  82. package/public/admin/database.html +312 -0
  83. package/public/admin/index.html +116 -0
  84. package/public/admin/js/app.js +470 -0
  85. package/public/admin/js/db-pools.js +253 -0
  86. package/public/admin/login.html +278 -0
  87. package/public/assets/css/styles.css +477 -0
  88. package/public/assets/js/main.js +89 -0
  89. package/public/index.html +136 -0
  90. package/public/templates/404.html +158 -0
  91. package/routes/admin-views.json +20 -0
  92. package/routes/admin.json +38 -0
  93. package/routes/auth.json +32 -0
  94. package/routes/static.json +18 -0
  95. package/server.js +299 -0
  96. package/test-aplicacion.con-logisession/BlackCoffee.js +226 -0
  97. package/test-aplicacion.con-logisession/SSL_SETUP.md +53 -0
  98. package/test-aplicacion.con-logisession/certs/ca-certificate.pem +32 -0
  99. package/test-aplicacion.con-logisession/certs/ca-private-key.pem +52 -0
  100. package/test-aplicacion.con-logisession/certs/certificate-2048.pem +22 -0
  101. package/test-aplicacion.con-logisession/certs/certificate.pem +32 -0
  102. package/test-aplicacion.con-logisession/certs/private-key-2048.pem +28 -0
  103. package/test-aplicacion.con-logisession/certs/private-key.pem +52 -0
  104. package/test-aplicacion.con-logisession/config/iaQueueSetup.js +84 -0
  105. package/test-aplicacion.con-logisession/config/qwen-rules.json +39 -0
  106. package/test-aplicacion.con-logisession/controllers/analyticsController.js +117 -0
  107. package/test-aplicacion.con-logisession/controllers/auth/AdminAuthController.js +142 -0
  108. package/test-aplicacion.con-logisession/controllers/auth/AuthController.js +439 -0
  109. package/test-aplicacion.con-logisession/controllers/auth/AuthViewController.js +223 -0
  110. package/test-aplicacion.con-logisession/controllers/endpointController.js +66 -0
  111. package/test-aplicacion.con-logisession/controllers/example.js +183 -0
  112. package/test-aplicacion.con-logisession/controllers/iaQueueController.js +367 -0
  113. package/test-aplicacion.con-logisession/controllers/queueController.js +206 -0
  114. package/test-aplicacion.con-logisession/controllers/qwenQueueController.js +197 -0
  115. package/test-aplicacion.con-logisession/controllers/test.js +0 -0
  116. package/test-aplicacion.con-logisession/controllers/tracking/EventsNoFinishController.js +78 -0
  117. package/test-aplicacion.con-logisession/controllers/tracking/TrackingController.js +412 -0
  118. package/test-aplicacion.con-logisession/controllers/tracking/TrackingControllerWithLoadModel.js +437 -0
  119. package/test-aplicacion.con-logisession/hooks/admin-hooks.js +20 -0
  120. package/test-aplicacion.con-logisession/hooks/general-hooks.js +97 -0
  121. package/test-aplicacion.con-logisession/hooks/queue-hooks.js +64 -0
  122. package/test-aplicacion.con-logisession/hooks/route-directory-hooks.js +38 -0
  123. package/test-aplicacion.con-logisession/hooks/security-hooks.js +24 -0
  124. package/test-aplicacion.con-logisession/insitu-admin-client/README.md +69 -0
  125. package/test-aplicacion.con-logisession/insitu-admin-client/package.json +23 -0
  126. package/test-aplicacion.con-logisession/insitu-admin-client.js +257 -0
  127. package/test-aplicacion.con-logisession/models/ExampleModel.js +88 -0
  128. package/test-aplicacion.con-logisession/models/QueueJobModel.js +263 -0
  129. package/test-aplicacion.con-logisession/models/TokenModel.js +207 -0
  130. package/test-aplicacion.con-logisession/models/auth/AuthModel.js +66 -0
  131. package/test-aplicacion.con-logisession/models/auth/UserModel.js +189 -0
  132. package/test-aplicacion.con-logisession/models/tracking/CompletedCartModel.js +213 -0
  133. package/test-aplicacion.con-logisession/models/tracking/EventModel.js +366 -0
  134. package/test-aplicacion.con-logisession/models/tracking/EventsNoFinishModel.js +131 -0
  135. package/test-aplicacion.con-logisession/models/tracking/SessionModel.js +360 -0
  136. package/test-aplicacion.con-logisession/models/tracking/SiteFlowModel.js +286 -0
  137. package/test-aplicacion.con-logisession/models/tracking/TokenModel.js +207 -0
  138. package/test-aplicacion.con-logisession/package-lock.json +3313 -0
  139. package/test-aplicacion.con-logisession/package.json +32 -0
  140. package/test-aplicacion.con-logisession/public/blackcoffee-welcome/index.html +1339 -0
  141. package/test-aplicacion.con-logisession/public/css/style.css +64 -0
  142. package/test-aplicacion.con-logisession/public/ejemplo-estatica/index.html +18 -0
  143. package/test-aplicacion.con-logisession/public/ejemplo-estatica/script.js +16 -0
  144. package/test-aplicacion.con-logisession/public/ejemplo-estatica/styles.css +43 -0
  145. package/test-aplicacion.con-logisession/public/images/logo.svg +7 -0
  146. package/test-aplicacion.con-logisession/public/js/main.js +67 -0
  147. package/test-aplicacion.con-logisession/routes/analytics-routes.json +8 -0
  148. package/test-aplicacion.con-logisession/routes/auth-routes.json +98 -0
  149. package/test-aplicacion.con-logisession/routes/blackcoffee-welcome-routes.json +20 -0
  150. package/test-aplicacion.con-logisession/routes/duplicate-test-routes.json.disabled +16 -0
  151. package/test-aplicacion.con-logisession/routes/ejemplo-estatica-routes.json +11 -0
  152. package/test-aplicacion.con-logisession/routes/endpoints-routes.json +8 -0
  153. package/test-aplicacion.con-logisession/routes/ia-queue-routes.json +26 -0
  154. package/test-aplicacion.con-logisession/routes/product-routes.json.disabled +20 -0
  155. package/test-aplicacion.con-logisession/routes/queue-routes.json +32 -0
  156. package/test-aplicacion.con-logisession/routes/qwen-routes.json +14 -0
  157. package/test-aplicacion.con-logisession/routes/static-routes.json +29 -0
  158. package/test-aplicacion.con-logisession/routes/tracking-routes.json +58 -0
  159. package/test-aplicacion.con-logisession/routes/tracking-with-loadmodel-routes.json +51 -0
  160. package/test-aplicacion.con-logisession/utils/dbAdapter.js +88 -0
  161. package/test-aplicacion.con-logisession/utils/qbWrapper.js +4 -0
  162. package/test-aplicacion.con-logisession/utils/queueProcessor.js +305 -0
  163. package/test-aplicacion.con-logisession/utils/qwenRulesService.js +131 -0
  164. package/test-aplicacion.con-logisession/utils/tokenHelper.js +22 -0
  165. package/test-aplicacion.con-logisession/views/auth/dashboard.html +443 -0
  166. package/test-aplicacion.con-logisession/views/auth/forgot-password.html +200 -0
  167. package/test-aplicacion.con-logisession/views/auth/login.html +213 -0
  168. package/test-aplicacion.con-logisession/views/auth/register.html +294 -0
  169. package/test-aplicacion.con-logisession/views/contact/form.html +47 -0
  170. package/test-aplicacion.con-logisession/views/products/index.html +39 -0
@@ -0,0 +1,229 @@
1
+ # Manual del Módulo WAF (Web Application Firewall) para Insitu Framework
2
+
3
+ ## Tabla de Contenidos
4
+ 1. [Introducción](#introducción)
5
+ 2. [Características del WAF](#características-del-waf)
6
+ 3. [Comandos Disponibles](#comandos-disponibles)
7
+ 4. [Estadísticas del Servidor](#estadísticas-del-servidor)
8
+ 5. [Gestión de Reglas X-Headers](#gestión-de-reglas-x-headers)
9
+ 6. [Listas de IPs](#listas-de-ips)
10
+ 7. [Persistencia de Reglas](#persistencia-de-reglas)
11
+ 8. [Ejemplos de Uso](#ejemplos-de-uso)
12
+
13
+ ## Introducción
14
+
15
+ El módulo WAF (Web Application Firewall) es una extensión de la extensión de administración de Insitu Framework que permite monitorear, gestionar y proteger tu aplicación web. Proporciona estadísticas en tiempo real, gestión de reglas de seguridad y control de acceso basado en headers X-.
16
+
17
+ ## Características del WAF
18
+
19
+ - **Estadísticas en tiempo real**: Conteo de solicitudes procesadas y respuestas enviadas con medición en kilobytes
20
+ - **Monitoreo de tráfico**: Registro de accesos a rutas y endpoints
21
+ - **Sistema de reglas X-Headers**: Bloqueo basado en headers como X-Forwarded-For, X-Real-IP, etc.
22
+ - **Listas de IPs**: Sistema de whitelist (nunca bloqueadas) y blacklist (siempre bloqueadas)
23
+ - **Persistencia**: Guardado y carga de reglas de seguridad
24
+ - **Interfaz interactiva**: Sistema de comandos para gestión en tiempo real
25
+
26
+ ## Comandos Disponibles
27
+
28
+ ### Comandos Generales de Estadísticas
29
+ - `waf-status` o `waf-stats`: Muestra estadísticas generales del servidor
30
+ - `waf-blocked` o `waf-security`: Muestra estadísticas de seguridad
31
+ - `waf-x-headers`: Muestra reglas de headers X- configuradas
32
+
33
+ ### Comandos de Gestión de Reglas
34
+ - `create-x-rule`: Crea una nueva regla de seguridad basada en headers X-
35
+ - `remove-x-rule`: Remueve una regla de seguridad existente
36
+ - `save-rules`: Guarda todas las reglas a un archivo
37
+ - `load-rules`: Carga reglas desde un archivo
38
+
39
+ ### Comandos de Gestión de IPs
40
+ - `waf-block-ip`: Bloquea temporalmente una IP
41
+ - `waf-unblock-ip`: Desbloquea una IP temporalmente bloqueada
42
+ - `waf-whitelist`: Agrega una IP a la lista blanca
43
+ - `waf-blacklist`: Agrega una IP a la lista negra
44
+
45
+ ## Estadísticas del Servidor
46
+
47
+ ### waf-status / waf-stats
48
+ Muestra las estadísticas generales del servidor:
49
+
50
+ ```
51
+ === Estadísticas del WAF ===
52
+ Solicitudes procesadas: 15
53
+ Solicitudes procesadas (KB): 2.45 KB
54
+ Respuestas enviadas: 15
55
+ Respuestas enviadas (KB): 15.67 KB
56
+ IPs en lista blanca: 2
57
+ IPs en lista negra: 1
58
+ Reglas de seguridad activas: 3
59
+ ```
60
+
61
+ ### Campos de Estadísticas
62
+ - **Solicitudes procesadas**: Número total de solicitudes HTTP procesadas
63
+ - **Solicitudes procesadas (KB)**: Cantidad total de datos recibidos en kilobytes
64
+ - **Respuestas enviadas**: Número total de respuestas HTTP enviadas
65
+ - **Respuestas enviadas (KB)**: Cantidad total de datos enviados en kilobytes
66
+ - **IPs en lista blanca**: Número de IPs que nunca serán bloqueadas
67
+ - **IPs en lista negra**: Número de IPs que siempre serán bloqueadas
68
+ - **Reglas de seguridad activas**: Número de reglas de seguridad activas
69
+
70
+ ## Gestión de Reglas X-Headers
71
+
72
+ ### Crear Regla (`create-x-rule`)
73
+ Proceso interactivo para crear reglas de seguridad basadas en headers X-:
74
+
75
+ 1. **Nombre del header**: Introduce el nombre del header X- (ej: X-Forwarded-For, X-Real-IP)
76
+ 2. **Patrón**: Introduce el patrón para coincidir (cadena o expresión regular)
77
+ 3. **Acción**: Selecciona la acción a tomar:
78
+ - `1` o `block`: Bloquear solicitudes que coincidan
79
+ - `2` o `log`: Registrar solicitudes que coincidan
80
+ - `3` o `monitor`: Monitorear solicitudes que coincidan
81
+ 4. **Razón**: Introduce la razón para la regla (opcional)
82
+
83
+ ### Remover Regla (`remove-x-rule`)
84
+ Proceso interactivo para remover reglas existentes:
85
+ 1. Se muestra una lista numerada de reglas disponibles
86
+ 2. Introduce el número de la regla que deseas remover
87
+ 3. La regla se elimina inmediatamente del sistema
88
+
89
+ ## Listas de IPs
90
+
91
+ ### Whitelist (`waf-whitelist`)
92
+ Agrega una IP a la lista blanca (nunca será bloqueada):
93
+
94
+ ```
95
+ > waf-whitelist
96
+ Introduce la IP a agregar a la lista blanca (ej: 192.168.1.100):
97
+ > 192.168.1.100
98
+ IP 192.168.1.100 agregada a la lista blanca.
99
+ ```
100
+
101
+ ### Blacklist (`waf-blacklist`)
102
+ Agrega una IP a la lista negra (siempre será bloqueada):
103
+
104
+ ```
105
+ > waf-blacklist
106
+ Introduce la IP a agregar a la lista negra (ej: 10.0.0.100):
107
+ > 10.0.0.100
108
+ IP 10.0.0.100 agregada a la lista negra.
109
+ ```
110
+
111
+ ### Bloqueo Temporal (`waf-block-ip`)
112
+ Bloquea temporalmente una IP:
113
+
114
+ ```
115
+ > waf-block-ip
116
+ Introduce la IP a bloquear temporalmente (ej: 192.168.1.100):
117
+ > 192.168.1.200
118
+ IP 192.168.1.200 bloqueada temporalmente.
119
+ ```
120
+
121
+ ## Persistencia de Reglas
122
+
123
+ ### Guardar Reglas (`save-rules`)
124
+ Guarda todas las reglas de seguridad actuales a un archivo JSON:
125
+
126
+ ```
127
+ > save-rules
128
+ ✅ Reglas guardadas exitosamente en: /path/to/waf-rules/waf-rules-timestamp.json
129
+ Total de reglas guardadas: 3
130
+ ```
131
+
132
+ ### Cargar Reglas (`load-rules`)
133
+ Carga reglas de seguridad desde un archivo JSON:
134
+
135
+ ```
136
+ > load-rules
137
+ === Archivos de Reglas Disponibles ===
138
+ 1. waf-rules-1770795262452.json
139
+
140
+ Introduce el número del archivo a cargar (o "cancel" para cancelar):
141
+ > 1
142
+
143
+ ¿Deseas reemplazar las reglas actuales? (sí/no):
144
+ > sí
145
+
146
+ ✅ Reglas cargadas exitosamente desde: /path/to/waf-rules/waf-rules-1770795262452.json
147
+ Total de reglas cargadas: 3
148
+ ```
149
+
150
+ ## Ejemplos de Uso
151
+
152
+ ### Ejemplo 1: Crear Regla para Bloquear IPs Internas
153
+ ```
154
+ > create-x-rule
155
+ === Crear Regla de Header X- ===
156
+ Introduce el nombre del header X- (ej: X-Forwarded-For, X-Real-IP):
157
+ > X-Forwarded-For
158
+ Header seleccionado: X-Forwarded-For
159
+ Introduce el patrón para coincidir (cadena o expresión regular):
160
+ > 192.168.
161
+ Selecciona la acción a tomar:
162
+ 1. block - Bloquear solicitudes que coincidan
163
+ 2. log - Registrar solicitudes que coincidan
164
+ 3. monitor - Monitorear solicitudes que coincidan
165
+ Escribe el número o el nombre de la acción:
166
+ > 1
167
+ Acción seleccionada: block
168
+ Introduce la razón para la regla (opcional):
169
+ > Bloquear IPs internas
170
+ ✅ Regla de header X- creada exitosamente:
171
+ ID: xheader_x_forwarded_for_1770792842636
172
+ Header: x-forwarded-for
173
+ Patrón: 192.168.
174
+ Acción: block
175
+ Razón: Bloquear IPs internas
176
+ ```
177
+
178
+ ### Ejemplo 2: Ver Estadísticas de Seguridad
179
+ ```
180
+ > waf-security
181
+ === Estadísticas de Seguridad del WAF ===
182
+ IPs bloqueadas temporalmente: 2
183
+ Intentos de ataque detectados: 5
184
+ Tipos de ataques detectados: 3
185
+ Registros de seguridad: 10
186
+
187
+ Accesos a rutas (Input/Output):
188
+ GET /: 8 accesos
189
+ POST /api/users: 3 accesos
190
+ GET /api/users: 4 accesos
191
+
192
+ Endpoints más accedidos:
193
+ GET /: 8 hits
194
+ GET /api/users: 4 hits
195
+ POST /api/users: 3 hits
196
+ ```
197
+
198
+ ### Ejemplo 3: Agregar IP a Lista Negra
199
+ ```
200
+ > waf-blacklist
201
+ Introduce la IP a agregar a la lista negra (ej: 10.0.0.100):
202
+ > 10.0.0.100
203
+ IP 10.0.0.100 agregada a la lista negra.
204
+ ```
205
+
206
+ ## Consideraciones de Seguridad
207
+
208
+ - El servidor de administración solo escucha en localhost (127.0.0.1) por defecto
209
+ - Todas las operaciones de bloqueo son inmediatas y afectan al sistema en tiempo real
210
+ - Las reglas de seguridad se aplican antes de que la solicitud llegue a los controladores
211
+ - El sistema de persistencia permite mantener reglas entre reinicios del servidor
212
+
213
+ ## Solución de Problemas
214
+
215
+ ### Las estadísticas no se actualizan
216
+ - Verifica que el middleware de firewall esté activo en tu servidor
217
+ - Asegúrate de que las solicitudes estén pasando por el sistema de firewall
218
+
219
+ ### Las reglas no se aplican
220
+ - Verifica que el firewall esté correctamente integrado en tu pipeline de middlewares
221
+ - Confirma que las reglas se hayan creado correctamente usando `waf-x-headers`
222
+
223
+ ## Autor
224
+
225
+ Insitu Framework Team
226
+
227
+ ## Versión
228
+
229
+ v1.0.0
@@ -0,0 +1,116 @@
1
+ # Cómo usar `addFilter` para `after_route_handler`
2
+
3
+ El hook `after_route_handler` está implementado como filtro y acción, lo que significa que puedes usar `addFilter` para modificar los objetos `req`, `res` o `matchedRoute` después de que se ejecuta el handler de la ruta.
4
+
5
+ ## Ejemplo básico de uso:
6
+
7
+ ```javascript
8
+ // Suponiendo que tienes acceso al objeto hooks del framework
9
+ hooks.addFilter('after_route_handler', (data, req, res, matchedRoute) => {
10
+ // Puedes modificar req, res o matchedRoute aquí después de que se ejecutó el handler
11
+ // El objeto data contiene { req, res, matchedRoute }
12
+
13
+ // Por ejemplo, registrar información sobre la respuesta
14
+ console.log(`Handler completado para: ${req.method} ${req.url}`);
15
+
16
+ // O agregar encabezados personalizados después de la ejecución
17
+ if (!res.headersSent) {
18
+ res.setHeader('X-Response-Time', Date.now() - req.startTime);
19
+ }
20
+
21
+ // Devolver el objeto modificado
22
+ return {
23
+ ...data,
24
+ req: req,
25
+ res: res
26
+ };
27
+ }, 10, 3);
28
+ ```
29
+
30
+ ## Ejemplo más complejo:
31
+
32
+ ```javascript
33
+ // Registro de métricas de rendimiento después de la ejecución del handler
34
+ hooks.addFilter('after_route_handler', (data, req, res, matchedRoute) => {
35
+ // Calcular el tiempo de ejecución del handler
36
+ const executionTime = Date.now() - (req.handlerStartTime || Date.now());
37
+
38
+ // Registrar métricas
39
+ console.log(`Handler completado en ${executionTime}ms para: ${req.method} ${req.url}`);
40
+
41
+ // Agregar información de auditoría
42
+ req.responseAudit = {
43
+ timestamp: new Date().toISOString(),
44
+ executionTime: executionTime,
45
+ statusCode: res.statusCode || 200
46
+ };
47
+
48
+ // Devolver el objeto actualizado
49
+ return {
50
+ ...data,
51
+ req: req
52
+ };
53
+ }, 10, 3);
54
+ ```
55
+
56
+ ## Parámetros de `addFilter`:
57
+
58
+ - **Primer parámetro**: `'after_route_handler'` - El nombre del hook
59
+ - **Segundo parámetro**: La función callback que se ejecutará
60
+ - **Tercer parámetro**: `10` - La prioridad (números más bajos se ejecutan primero)
61
+ - **Cuarto parámetro**: `3` - Número de argumentos aceptados por el callback
62
+ - **Quinto parámetro** (opcional): Un identificador para el callback
63
+
64
+ ## Estructura del callback:
65
+
66
+ El callback para `after_route_handler` recibe 4 parámetros:
67
+ 1. `data` - El objeto que contiene `{ req, res, matchedRoute }`
68
+ 2. `req` - El objeto de solicitud (ya modificado por el handler)
69
+ 3. `res` - El objeto de respuesta (posiblemente ya enviado por el handler)
70
+ 4. `matchedRoute` - Información sobre la ruta coincidente
71
+
72
+ El callback debe devolver el objeto modificado que será usado por el sistema.
73
+
74
+ ## Ejemplo de uso en un módulo de auditoría:
75
+
76
+ ```javascript
77
+ // En algún módulo de tu aplicación
78
+ const afterRouteHandlerFilter = (data, req, res, matchedRoute) => {
79
+ // Registrar información de auditoría después de la ejecución del handler
80
+ const auditLog = {
81
+ timestamp: new Date().toISOString(),
82
+ method: req.method,
83
+ url: req.url,
84
+ userId: req.userId || 'anonymous',
85
+ statusCode: res.statusCode,
86
+ executionTime: Date.now() - (req.handlerStartTime || Date.now()),
87
+ route: matchedRoute.path
88
+ };
89
+
90
+ // Guardar registro de auditoría (podría ser en base de datos, archivo, etc.)
91
+ console.log('AUDIT:', JSON.stringify(auditLog));
92
+
93
+ // Agregar información de respuesta personalizada si es necesario
94
+ if (!res.headersSent && req.needsCustomResponse) {
95
+ res.setHeader('X-Audited', 'true');
96
+ }
97
+
98
+ return {
99
+ ...data,
100
+ req: req
101
+ };
102
+ };
103
+
104
+ // Registrar el filtro
105
+ hooks.addFilter('after_route_handler', afterRouteHandlerFilter, 10, 3, 'auditing-filter');
106
+ ```
107
+
108
+ ## Consideraciones importantes:
109
+
110
+ 1. **Estado de la respuesta**: En el hook `after_route_handler`, la respuesta puede ya haber sido enviada al cliente (`res.headersSent` puede ser `true`), por lo que debes verificar este estado antes de intentar modificar encabezados o enviar contenido adicional.
111
+
112
+ 2. **Tiempo de ejecución**: Este hook se ejecuta después del handler original, por lo que cualquier modificación a la respuesta debe tener en cuenta que el cuerpo de la respuesta ya puede haber sido enviado.
113
+
114
+ 3. **Uso común**: Este hook es ideal para tareas de auditoría, métricas de rendimiento, registro de actividad y limpieza post-ejecución.
115
+
116
+ Esta implementación permite interceptar y modificar la solicitud y respuesta después de que se ejecuta el handler de la ruta, proporcionando una potente capacidad de procesamiento post-ejecución.
@@ -0,0 +1,130 @@
1
+ # Cómo usar el hook `after_route_handler`
2
+
3
+ El hook `after_route_handler` se ejecuta justo después de que se ejecuta el handler de la ruta, y está disponible tanto como acción (`addAction`) como como filtro (`addFilter`).
4
+
5
+ ## Ejemplo 1: Uso como acción para registrar actividad post-ejecución
6
+
7
+ ```javascript
8
+ // Registrar cada vez que se completa la ejecución de un handler
9
+ hooks.addAction('after_route_handler', (req, res, matchedRoute) => {
10
+ const executionTime = Date.now() - req.startTime;
11
+ console.log(`Handler completado para: ${req.method} ${req.url} en ${executionTime}ms`);
12
+ console.log(`Código de estado: ${res.statusCode}`);
13
+ }, 10, 3);
14
+ ```
15
+
16
+ ## Ejemplo 2: Uso como filtro para añadir headers después de la ejecución
17
+
18
+ ```javascript
19
+ // Añadir headers personalizados después de ejecutar el handler
20
+ hooks.addFilter('after_route_handler', (data, req, res, matchedRoute) => {
21
+ // Calcular tiempo de ejecución
22
+ const executionTime = Date.now() - (req.startTime || Date.now());
23
+
24
+ // Añadir header de tiempo de ejecución si la respuesta no se ha enviado
25
+ if (!res.headersSent) {
26
+ res.setHeader('X-Response-Time', `${executionTime}ms`);
27
+ }
28
+
29
+ // Registrar métricas de rendimiento
30
+ console.log(`Ruta ${req.url} procesada en ${executionTime}ms`);
31
+
32
+ // Devolver el objeto modificado
33
+ return {
34
+ ...data,
35
+ req: req
36
+ };
37
+ }, 10, 3);
38
+ ```
39
+
40
+ ## Ejemplo 3: Uso como filtro para auditoría post-ejecución
41
+
42
+ ```javascript
43
+ // Registrar información de auditoría después de la ejecución del handler
44
+ hooks.addFilter('after_route_handler', (data, req, res, matchedRoute) => {
45
+ const auditLog = {
46
+ timestamp: new Date().toISOString(),
47
+ method: req.method,
48
+ url: req.url,
49
+ userId: req.userId || 'anonymous',
50
+ statusCode: res.statusCode,
51
+ executionTime: Date.now() - (req.handlerStartTime || Date.now()),
52
+ route: matchedRoute.path
53
+ };
54
+
55
+ // Guardar registro de auditoría
56
+ console.log('AUDIT:', JSON.stringify(auditLog));
57
+
58
+ return data;
59
+ }, 5, 3);
60
+ ```
61
+
62
+ ## Ejemplo 4: Uso como filtro para limpieza de recursos
63
+
64
+ ```javascript
65
+ // Realizar tareas de limpieza después de la ejecución del handler
66
+ hooks.addFilter('after_route_handler', (data, req, res, matchedRoute) => {
67
+ // Limpiar recursos temporales si es necesario
68
+ if (req.tempFiles) {
69
+ req.tempFiles.forEach(file => {
70
+ // Eliminar archivo temporal
71
+ fs.unlink(file.path, (err) => {
72
+ if (err) console.error('Error eliminando archivo temporal:', err);
73
+ });
74
+ });
75
+ }
76
+
77
+ // Registrar fin de ejecución
78
+ console.log(`Finalizada ejecución para: ${req.method} ${req.url}`);
79
+
80
+ return data;
81
+ }, 15, 3);
82
+ ```
83
+
84
+ ## Ejemplo 5: Uso combinado de acción y filtro
85
+
86
+ ```javascript
87
+ // Filtro para calcular métricas
88
+ hooks.addFilter('after_route_handler', (data, req, res, matchedRoute) => {
89
+ const responseTime = Date.now() - (req.startTime || Date.now());
90
+
91
+ // Añadir información de rendimiento al objeto de solicitud
92
+ req.performanceMetrics = {
93
+ responseTime: responseTime,
94
+ timestamp: new Date()
95
+ };
96
+
97
+ return {
98
+ ...data,
99
+ req: req
100
+ };
101
+ }, 5, 3);
102
+
103
+ // Acción para registrar evento
104
+ hooks.addAction('after_route_handler', (req, res, matchedRoute) => {
105
+ console.log(`[AFTER_ROUTE] Handler completado para ${req.method} ${req.url}`);
106
+
107
+ // Enviar métricas a un servicio de monitoreo
108
+ if (req.performanceMetrics) {
109
+ sendMetricsToMonitoringService(req.performanceMetrics);
110
+ }
111
+ }, 10, 3);
112
+ ```
113
+
114
+ ## Parámetros importantes:
115
+
116
+ - El hook solo se ejecuta para solicitudes que **no sean** del tipo OPTIONS
117
+ - El filtro recibe `(data, req, res, matchedRoute)` y debe devolver el objeto `data` modificado
118
+ - La acción recibe `(req, res, matchedRoute)` y no necesita devolver nada
119
+ - El parámetro `acceptedArgs` define cuántos argumentos acepta tu callback (normalmente 3 para este hook)
120
+ - El parámetro `priority` define el orden de ejecución (valores más bajos se ejecutan primero)
121
+
122
+ ## Consideraciones importantes:
123
+
124
+ 1. **Estado de la respuesta**: En `after_route_handler`, la respuesta puede ya haber sido enviada al cliente (`res.headersSent` puede ser `true`), por lo que debes verificar este estado antes de intentar modificar encabezados o enviar contenido adicional.
125
+
126
+ 2. **Tiempo de ejecución**: Este hook se ejecuta después del handler original, por lo que cualquier modificación a la respuesta debe tener en cuenta que el cuerpo de la respuesta ya puede haber sido enviado.
127
+
128
+ 3. **Uso común**: Este hook es ideal para tareas de auditoría, métricas de rendimiento, registro de actividad post-ejecución y limpieza de recursos.
129
+
130
+ Este hook es especialmente útil para implementar lógica que debe ejecutarse después de cualquier handler de ruta, permitiendo registrar métricas, auditar la actividad o realizar tareas de limpieza.
@@ -0,0 +1,213 @@
1
+ # Análisis Completo del Framework Insitu
2
+
3
+ ## Descripción General
4
+
5
+ Insitu es un framework de desarrollo web completo para Node.js que implementa una arquitectura MVC (Modelo-Vista-Controlador) con soporte para APIs REST, seguridad avanzada, y sistemas de plantillas. La versión actual es 2.5.4.
6
+
7
+ ## Arquitectura General
8
+
9
+ El framework está estructurado en componentes modulares que se comunican entre sí a través de un sistema de hooks y filtros, permitiendo una alta extensibilidad y personalización.
10
+
11
+ ## Componentes Principales
12
+
13
+ ### 1. Servidor Principal (APIServer)
14
+
15
+ - Implementa un servidor HTTP/HTTPS básico con soporte para rutas parametrizadas
16
+ - Incluye manejo de archivos estáticos con soporte para índices y control de caché
17
+ - Tiene integración con sistema de hooks para extensibilidad
18
+ - Soporta middlewares y manejo de cuerpos de solicitud con límites de tamaño
19
+
20
+ ### 2. Sistema de Enrutamiento
21
+
22
+ - **Router**: Sistema de enrutamiento avanzado con soporte para rutas anidadas
23
+ - **RouteMatcher**: Componente especializado para coincidencia de rutas parametrizadas con cacheo de expresiones regulares
24
+ - Soporta rutas estáticas y dinámicas con prioridad adecuada
25
+
26
+ ### 3. Middleware
27
+
28
+ - **CORS**: Middleware para configuración de políticas de recursos cruzados
29
+ - **Authenticator**: Sistema de autenticación con múltiples estrategias (JWT, API Keys, Basic Auth, OAuth2, OpenID Connect)
30
+ - **Session**: Sistema de sesiones con almacenamiento en memoria y cookies seguras
31
+ - **Validator**: Validador de esquemas para solicitudes HTTP
32
+ - **RateLimiter**: Limitador de tasa con almacenamiento en memoria o Redis
33
+ - **Compressor**: Middleware de compresión (gzip/deflate) con sistema de hooks
34
+ - **Firewall**: Web Application Firewall (WAF) con detección de patrones de ataque
35
+ - **AuditLogger**: Sistema de auditoría para eventos de seguridad
36
+
37
+ ### 4. Componentes MVC
38
+
39
+ - **ControllerBase**: Controlador base con soporte para vistas, layouts y variables
40
+ - **ModelBase**: Clase base para modelos con operaciones CRUD
41
+ - **ViewEngine**: Motor de plantillas profesional con soporte para filtros, helpers, condiciones, bucles e inclusiones
42
+ - **ModelManager**: Gestor de modelos con soporte para múltiples adaptadores
43
+ - **Adaptadores**: Soporte para diferentes motores de base de datos (Memory, MariaDB/MySQL, SQLite)
44
+
45
+ ### 5. Sistema de Seguridad
46
+
47
+ - **SecurityEnhancedServer**: Servidor con funcionalidades de seguridad avanzada (WAF)
48
+ - **Firewall**: Sistema de firewall con listas blancas/negras y reglas personalizadas
49
+ - **TokenManager**: Gestión de tokens JWT con diferentes tipos de almacenamiento
50
+ - **AttackDetector**: Detector de patrones de ataque (SQL Injection, XSS, etc.)
51
+
52
+ ### 6. Sistema de Hooks
53
+
54
+ - Implementación completa del sistema de hooks y filtros similar al de WordPress
55
+ - Permite extensibilidad en todos los componentes del framework
56
+ - Soporta namespaces y prioridades para los hooks
57
+
58
+ ### 7. Sistemas de Carga
59
+
60
+ - **RouteLoader**: Carga de rutas desde archivos JSON
61
+ - **RouteDirectoryLoader**: Carga de rutas desde múltiples archivos JSON en un directorio
62
+ - **ControllerLoader**: Carga dinámica de controladores desde archivos
63
+
64
+ ### 8. Utilidades
65
+
66
+ - **Logger**: Sistema de logging estructurado con diferentes niveles y formatos
67
+ - **ErrorHandler**: Manejo centralizado de errores con soporte para diferentes tipos de excepciones
68
+ - **ConfigParser**: Parser de configuración desde archivos JSON y variables de entorno
69
+ - **MimeType**: Sistema de detección de tipos MIME
70
+
71
+ ## Características Destacadas
72
+
73
+ 1. **Arquitectura Modular**: Componentes independientes para mayor flexibilidad
74
+ 2. **Seguridad Avanzada**: Múltiples capas de seguridad incluyendo WAF
75
+ 3. **Sistema de Hooks**: Extensibilidad similar al sistema de WordPress
76
+ 4. **Autenticación Flexible**: Soporte para múltiples métodos de autenticación
77
+ 5. **Almacenamiento de Tokens**: Soporte para memoria, JSON, SQLite y MariaDB
78
+ 6. **Enrutamiento Avanzado**: Soporte para rutas parametrizadas, anidadas y estáticas
79
+ 7. **Soporte para Frontend**: Capacidad de servir contenido HTML y otros tipos de contenido
80
+ 8. **Sistema de Sesiones**: Gestión completa de sesiones con soporte para autenticación
81
+ 9. **Motor de Plantillas MVC**: Sistema profesional de vistas con soporte para filtros, helpers y hooks
82
+ 10. **Arquitectura de Modelos Completa (MVC)**: Capa de modelos para la lógica de negocio y acceso a datos
83
+ 11. **Sistema de Adaptadores de Base de Datos**: Soporte para múltiples motores de base de datos
84
+ 12. **Compatible con qbuilderjs**: Integración con QueryBuilder externo para construir consultas SQL
85
+
86
+ ## Estructura de Directorios
87
+
88
+ - `lib/`: Código fuente principal del framework
89
+ - `core/`: Componentes fundamentales (servidor, router, hooks)
90
+ - `loader/`: Componentes de carga (rutas, controladores)
91
+ - `middleware/`: Middlewares de seguridad y funcionalidad
92
+ - `mvc/`: Componentes MVC (controladores, modelos, vistas)
93
+ - `router/`: Componentes de enrutamiento
94
+ - `utils/`: Utilidades (logging, manejo de errores, etc.)
95
+
96
+ ## Dependencias
97
+
98
+ - `bcrypt`: Para hashing de contraseñas
99
+ - `jsonwebtoken`: Para tokens JWT
100
+ - `mariadb`: Para conexión con bases de datos MariaDB/MySQL
101
+ - `sqlite3`: Para conexión con bases de datos SQLite
102
+ - `qbuilderjs`: Para construcción de consultas SQL seguras
103
+
104
+ ## Patrones de Diseño
105
+
106
+ - **Singleton**: Para componentes centrales como el sistema de hooks
107
+ - **Factory**: Para creación de instancias de modelos y adaptadores
108
+ - **Strategy**: Para diferentes estrategias de autenticación
109
+ - **Observer**: A través del sistema de hooks para extensibilidad
110
+ - **MVC**: Arquitectura modelo-vista-controlador para la separación de responsabilidades
111
+
112
+ ## Funcionalidades Avanzadas
113
+
114
+ ### Sistema de Hooks y Filtros
115
+
116
+ El framework incluye un sistema completo de hooks y filtros similar al de WordPress, que permite extender la funcionalidad en diferentes puntos del ciclo de vida de la aplicación:
117
+
118
+ ```javascript
119
+ const { hooks } = require('insitu');
120
+
121
+ // Registrar una acción
122
+ hooks.addAction('firewall_request_blocked', (rule, clientIP, req, res) => {
123
+ console.log(`Solicitud bloqueada: ${rule.name} para IP: ${clientIP}`);
124
+ });
125
+
126
+ // Registrar un filtro
127
+ hooks.addFilter('session_create_data', (userData, req) => {
128
+ return {
129
+ ...userData,
130
+ ipAddress: req.headers['x-forwarded-for'] || req.connection.remoteAddress,
131
+ createdAt: new Date().toISOString()
132
+ };
133
+ });
134
+ ```
135
+
136
+ ### Motor de Plantillas
137
+
138
+ El motor de plantillas profesional incluye soporte para:
139
+
140
+ - Variables: `{{variable}}`
141
+ - Condiciones: `{{if variable}}contenido{{endif}}`
142
+ - Bucles: `{{foreach:array}}contenido{{endforeach}}`
143
+ - Inclusiones: `{{include:header}}`
144
+ - Filtros: `{{variable|upper}}`
145
+ - Helpers personalizados
146
+
147
+ ### Sistema de Modelos
148
+
149
+ La arquitectura de modelos completa permite:
150
+
151
+ - Encapsular la lógica de negocio y el acceso a datos
152
+ - Utilizar diferentes adaptadores de base de datos
153
+ - Implementar operaciones CRUD estándar
154
+ - Extender con métodos personalizados
155
+
156
+ ## Conclusión
157
+
158
+ Este framework está diseñado para proporcionar una solución completa para el desarrollo de aplicaciones web seguras y escalables, con una arquitectura modular que permite extender su funcionalidad a través del sistema de hooks y una sólida capa de seguridad que incluye WAF, autenticación multifactor y protección contra ataques comunes.
159
+
160
+ La arquitectura modular y el sistema de hooks hacen que Insitu sea altamente personalizable y adaptable a diferentes necesidades de desarrollo, mientras que su enfoque en la seguridad y el patrón MVC proporcionan una base sólida para construir aplicaciones robustas y mantenibles.
161
+
162
+ ## Consideraciones de Seguridad Adicionales
163
+
164
+ ### Seguridad de Cookies en el Sistema de Sesiones
165
+
166
+ Tras un análisis detallado del código de Insitu Framework, se ha identificado que el sistema de sesiones implementado en `lib/middleware/session.js` presenta algunas deficiencias en cuanto a la seguridad de las cookies:
167
+
168
+ #### Flags de Seguridad Implementadas:
169
+
170
+ 1. **HttpOnly**:
171
+ - Esta flag está presente en ambas configuraciones de cookie (creación y destrucción)
172
+ - **Propósito**: Previene ataques de secuestro de sesión mediante XSS (Cross-Site Scripting)
173
+ - **Funcionamiento**: Impide que el código JavaScript del lado del cliente acceda al valor de la cookie a través de document.cookie
174
+ - **Implementación en Insitu**: Se aplica sistemáticamente en todas las operaciones de cookie de sesión
175
+
176
+ #### Flags de Seguridad Ausentes:
177
+
178
+ 2. **Secure**:
179
+ - **NO ESTÁ IMPLEMENTADA** en la configuración actual de cookies en Insitu
180
+ - **Propósito**: Asegura que la cookie solo se transmita a través de conexiones HTTPS cifradas
181
+ - **Importancia**: Crítica para prevenir el robo de cookies en redes inseguras
182
+ - **Falta en Insitu**: El framework no incluye esta flag, lo que representa un riesgo de seguridad en entornos HTTPS
183
+
184
+ 3. **SameSite**:
185
+ - **NO ESTÁ IMPLEMENTADA** en la configuración actual de cookies en Insitu
186
+ - **Propósito**: Previene ataques de falsificación de solicitudes entre sitios (CSRF)
187
+ - **Valores posibles**:
188
+ - `Strict`: La cookie solo se envía en contextos de primer nivel (mismo sitio)
189
+ - `Lax`: La cookie se envía en solicitudes de navegación de alto nivel (links, etc.)
190
+ - `None`: La cookie se envía en todos los contextos (requiere Secure)
191
+ - **Importancia**: Fundamental para la protección contra CSRF
192
+ - **Falta en Insitu**: El framework no incluye esta protección
193
+
194
+ #### Recomendaciones de Mejora:
195
+
196
+ Para mejorar la seguridad del sistema de sesiones, se deberían considerar las siguientes modificaciones:
197
+
198
+ 1. **Agregar detección automática de HTTPS**:
199
+ ```javascript
200
+ let cookieFlags = 'HttpOnly; Path=/';
201
+ if (req.connection.encrypted || req.headers['x-forwarded-proto'] === 'https') {
202
+ cookieFlags += '; Secure';
203
+ }
204
+ cookieFlags += '; SameSite=Lax';
205
+ res.setHeader('Set-Cookie', `${this.cookieName}=${newSessionId}; ${cookieFlags}; Max-Age=${this.timeout / 1000}`);
206
+ ```
207
+
208
+ 2. **Permitir configuración personalizada**:
209
+ - Opciones para SameSite (Lax, Strict, None)
210
+ - Configuración de Path personalizable
211
+ - Soporte para dominios cruzados si es necesario
212
+
213
+ La implementación actual en Insitu Framework proporciona la protección básica con HttpOnly, pero carece de las flags Secure y SameSite que son esenciales para una seguridad completa en aplicaciones web modernas. Estas deficiencias deben abordarse para cumplir con los estándares de seguridad actuales.