jerkjs 2.0.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.
- package/LICENSE +200 -0
- package/README.md +171 -0
- package/doc/EXTENSION_MANUAL.md +958 -0
- package/doc/FIREWALL_MANUAL.md +419 -0
- package/doc/HOOKS_REFERENCE_IMPROVED.md +599 -0
- package/doc/MANUAL_API_SDK.md +539 -0
- package/doc/MANUAL_MVC.md +397 -0
- package/doc/MARIADB_TOKENS_IMPLEMENTATION.md +113 -0
- package/doc/MIDDLEWARE_MANUAL.md +521 -0
- package/doc/OAUTH2_GOOGLE_MANUAL.md +408 -0
- package/doc/frontend-and-sessions.md +356 -0
- package/examples/advanced/controllers/productController.js +64 -0
- package/examples/advanced/controllers/userController.js +85 -0
- package/examples/advanced/routes.json +51 -0
- package/examples/advanced_example.js +93 -0
- package/examples/basic/controllers/userController.js +85 -0
- package/examples/basic_example.js +72 -0
- package/examples/frontend/README.md +71 -0
- package/examples/frontend/app.js +71 -0
- package/examples/frontend/controllers/apiController.js +39 -0
- package/examples/frontend/controllers/authController.js +220 -0
- package/examples/frontend/controllers/formController.js +47 -0
- package/examples/frontend/controllers/messageController.js +96 -0
- package/examples/frontend/controllers/pageController.js +178 -0
- package/examples/frontend/controllers/staticController.js +167 -0
- package/examples/frontend/routes.json +90 -0
- package/examples/mvc_example/app.js +138 -0
- package/examples/mvc_example/views/home/index.html +26 -0
- package/examples/mvc_example/views/home/simple.html +3 -0
- package/examples/mvc_example/views/layout.html +23 -0
- package/examples/mvc_example/views/test.html +3 -0
- package/examples/mvc_example/views/user/invalid.html +6 -0
- package/examples/mvc_example/views/user/list.html +36 -0
- package/examples/mvc_example/views/user/notfound.html +6 -0
- package/examples/mvc_example/views/user/profile.html +11 -0
- package/examples/mvc_routes_example/app.js +34 -0
- package/examples/mvc_routes_example/controllers/mainController.js +27 -0
- package/examples/mvc_routes_example/controllers/productController.js +47 -0
- package/examples/mvc_routes_example/controllers/userController.js +76 -0
- package/examples/mvc_routes_example/routes.json +30 -0
- package/examples/mvc_routes_example/views/layout.html +31 -0
- package/examples/mvc_routes_example/views/main/index.html +11 -0
- package/examples/mvc_routes_example/views/product/catalog.html +24 -0
- package/examples/mvc_routes_example/views/user/invalid.html +6 -0
- package/examples/mvc_routes_example/views/user/list.html +40 -0
- package/examples/mvc_routes_example/views/user/notfound.html +6 -0
- package/examples/mvc_routes_example/views/user/profile.html +18 -0
- package/examples/public/README.md +92 -0
- package/examples/public/app.js +72 -0
- package/examples/public/controllers/healthController.js +20 -0
- package/examples/public/controllers/mainController.js +22 -0
- package/examples/public/controllers/userController.js +139 -0
- package/examples/public/routes.json +51 -0
- package/examples/v2/README.md +72 -0
- package/examples/v2/app.js +74 -0
- package/examples/v2/app_fixed.js +74 -0
- package/examples/v2/controllers/authController.js +64 -0
- package/examples/v2/controllers/mainController.js +24 -0
- package/examples/v2/controllers/protectedController.js +12 -0
- package/examples/v2/controllers/userController.js +16 -0
- package/examples/v2/package.json +27 -0
- package/examples/v2/routes.json +30 -0
- package/examples/v2/test_api.sh +47 -0
- package/examples/v2/tokens_example.sqlite +0 -0
- package/examples/v2.1_firewall_demo/README.md +113 -0
- package/examples/v2.1_firewall_demo/app.js +182 -0
- package/examples/v2.1_firewall_demo/package.json +27 -0
- package/examples/v2.1_hooks_demo/README.md +85 -0
- package/examples/v2.1_hooks_demo/app.js +101 -0
- package/examples/v2.1_hooks_demo/controllers/hooksController.js +29 -0
- package/examples/v2.1_hooks_demo/controllers/mainController.js +18 -0
- package/examples/v2.1_hooks_demo/package.json +27 -0
- package/examples/v2.1_hooks_demo/routes.json +16 -0
- package/examples/v2.1_openapi_demo/README.md +82 -0
- package/examples/v2.1_openapi_demo/app.js +296 -0
- package/examples/v2.1_openapi_demo/package.json +26 -0
- package/examples/v2_cors/README.md +82 -0
- package/examples/v2_cors/app.js +108 -0
- package/examples/v2_cors/package.json +23 -0
- package/examples/v2_json_auth/README.md +83 -0
- package/examples/v2_json_auth/app.js +72 -0
- package/examples/v2_json_auth/controllers/authController.js +67 -0
- package/examples/v2_json_auth/controllers/mainController.js +16 -0
- package/examples/v2_json_auth/controllers/protectedController.js +12 -0
- package/examples/v2_json_auth/controllers/tokenController.js +28 -0
- package/examples/v2_json_auth/controllers/userController.js +15 -0
- package/examples/v2_json_auth/package.json +26 -0
- package/examples/v2_json_auth/routes.json +37 -0
- package/examples/v2_json_auth/tokens.json +20 -0
- package/examples/v2_mariadb_auth/README.md +94 -0
- package/examples/v2_mariadb_auth/app.js +81 -0
- package/examples/v2_mariadb_auth/controllers/authController.js +95 -0
- package/examples/v2_mariadb_auth/controllers/mainController.js +31 -0
- package/examples/v2_mariadb_auth/controllers/protectedController.js +12 -0
- package/examples/v2_mariadb_auth/controllers/userController.js +17 -0
- package/examples/v2_mariadb_auth/package.json +27 -0
- package/examples/v2_mariadb_auth/routes.json +37 -0
- package/examples/v2_no_auth/README.md +75 -0
- package/examples/v2_no_auth/app.js +72 -0
- package/examples/v2_no_auth/controllers/healthController.js +14 -0
- package/examples/v2_no_auth/controllers/mainController.js +19 -0
- package/examples/v2_no_auth/controllers/productController.js +31 -0
- package/examples/v2_no_auth/controllers/publicController.js +16 -0
- package/examples/v2_no_auth/package.json +22 -0
- package/examples/v2_no_auth/routes.json +37 -0
- package/examples/v2_oauth/README.md +70 -0
- package/examples/v2_oauth/app.js +90 -0
- package/examples/v2_oauth/controllers/mainController.js +45 -0
- package/examples/v2_oauth/controllers/oauthController.js +247 -0
- package/examples/v2_oauth/controllers/protectedController.js +13 -0
- package/examples/v2_oauth/controllers/userController.js +17 -0
- package/examples/v2_oauth/package.json +26 -0
- package/examples/v2_oauth/routes.json +44 -0
- package/examples/v2_openapi/README.md +77 -0
- package/examples/v2_openapi/app.js +222 -0
- package/examples/v2_openapi/controllers/authController.js +52 -0
- package/examples/v2_openapi/controllers/mainController.js +26 -0
- package/examples/v2_openapi/controllers/productController.js +17 -0
- package/examples/v2_openapi/controllers/userController.js +27 -0
- package/examples/v2_openapi/package.json +26 -0
- package/examples/v2_openapi/routes.json +37 -0
- package/generate_token.js +10 -0
- package/index.js +85 -0
- package/jerk.jpg +0 -0
- package/lib/core/handler.js +86 -0
- package/lib/core/hooks.js +224 -0
- package/lib/core/router.js +204 -0
- package/lib/core/securityEnhancedServer.js +752 -0
- package/lib/core/server.js +369 -0
- package/lib/loader/controllerLoader.js +175 -0
- package/lib/loader/routeLoader.js +341 -0
- package/lib/middleware/auditLogger.js +208 -0
- package/lib/middleware/authenticator.js +565 -0
- package/lib/middleware/compressor.js +218 -0
- package/lib/middleware/cors.js +135 -0
- package/lib/middleware/firewall.js +443 -0
- package/lib/middleware/rateLimiter.js +210 -0
- package/lib/middleware/session.js +301 -0
- package/lib/middleware/validator.js +193 -0
- package/lib/mvc/controllerBase.js +207 -0
- package/lib/mvc/viewEngine.js +752 -0
- package/lib/utils/configParser.js +223 -0
- package/lib/utils/logger.js +145 -0
- package/lib/utils/mariadbTokenAdapter.js +226 -0
- package/lib/utils/openapiGenerator.js +140 -0
- package/lib/utils/sqliteTokenAdapter.js +224 -0
- package/lib/utils/tokenManager.js +254 -0
- package/package.json +47 -0
- package/v2examplle/v2_json_auth/README.md +83 -0
- package/v2examplle/v2_json_auth/app.js +72 -0
- package/v2examplle/v2_json_auth/controllers/authController.js +67 -0
- package/v2examplle/v2_json_auth/controllers/mainController.js +16 -0
- package/v2examplle/v2_json_auth/controllers/protectedController.js +12 -0
- package/v2examplle/v2_json_auth/controllers/tokenController.js +28 -0
- package/v2examplle/v2_json_auth/controllers/userController.js +15 -0
- package/v2examplle/v2_json_auth/package.json +26 -0
- package/v2examplle/v2_json_auth/routes.json +37 -0
- package/v2examplle/v2_json_auth/tokens.json +20 -0
- package/v2examplle/v2_mariadb_auth/README.md +94 -0
- package/v2examplle/v2_mariadb_auth/app.js +81 -0
- package/v2examplle/v2_mariadb_auth/controllers/authController.js +95 -0
- package/v2examplle/v2_mariadb_auth/controllers/mainController.js +31 -0
- package/v2examplle/v2_mariadb_auth/controllers/protectedController.js +12 -0
- package/v2examplle/v2_mariadb_auth/controllers/userController.js +17 -0
- package/v2examplle/v2_mariadb_auth/package.json +27 -0
- package/v2examplle/v2_mariadb_auth/routes.json +37 -0
- package/v2examplle/v2_sqlite_auth/README.md +72 -0
- package/v2examplle/v2_sqlite_auth/app.js +74 -0
- package/v2examplle/v2_sqlite_auth/app_fixed.js +74 -0
- package/v2examplle/v2_sqlite_auth/controllers/authController.js +64 -0
- package/v2examplle/v2_sqlite_auth/controllers/mainController.js +24 -0
- package/v2examplle/v2_sqlite_auth/controllers/protectedController.js +12 -0
- package/v2examplle/v2_sqlite_auth/controllers/userController.js +16 -0
- package/v2examplle/v2_sqlite_auth/package.json +27 -0
- package/v2examplle/v2_sqlite_auth/routes.json +30 -0
- package/v2examplle/v2_sqlite_auth/test_api.sh +47 -0
- package/v2examplle/v2_sqlite_auth/tokens_example.sqlite +0 -0
|
@@ -0,0 +1,599 @@
|
|
|
1
|
+
# Sistema de Hooks, Filters y Actions del Framework API SDK JS
|
|
2
|
+
|
|
3
|
+
Visita nuestra página web: https://jerk.page.gd/
|
|
4
|
+
Repositorio oficial: https://gitlab.com/bytedogssyndicate1/jerk/
|
|
5
|
+
|
|
6
|
+
## Índice
|
|
7
|
+
1. [Introducción](#introducción)
|
|
8
|
+
2. [Glosario de Términos](#glosario-de-términos)
|
|
9
|
+
3. [Referencia Rápida de Hooks](#referencia-rápida-de-hooks)
|
|
10
|
+
4. [Hooks del Firewall](#hooks-del-firewall)
|
|
11
|
+
5. [Hooks del Servidor](#hooks-del-servidor)
|
|
12
|
+
6. [Hooks del Sistema de Carga](#hooks-del-sistema-de-carga)
|
|
13
|
+
7. [Hooks del Sistema de Seguridad](#hooks-del-sistema-de-seguridad)
|
|
14
|
+
8. [Hooks del Sistema de Rutas](#hooks-del-sistema-de-rutas)
|
|
15
|
+
9. [Ejemplos Prácticos](#ejemplos-prácticos)
|
|
16
|
+
10. [Compatibilidad y Versionado](#compatibilidad-y-versionado)
|
|
17
|
+
|
|
18
|
+
## Introducción
|
|
19
|
+
|
|
20
|
+
El framework API SDK JS implementa un sistema de Hooks y Filters similar al sistema de WordPress, permitiendo extender y modificar el comportamiento del framework sin alterar su código base. Este documento enumera todos los hooks disponibles, clasificados por funcionalidad, con información sobre compatibilidad, ejemplos y orden de ejecución.
|
|
21
|
+
|
|
22
|
+
### Tipos de Hooks
|
|
23
|
+
|
|
24
|
+
- **Action**: Permite ejecutar código en puntos específicos del flujo de ejecución
|
|
25
|
+
- **Filter**: Permite modificar datos antes de que sean utilizados por otros componentes
|
|
26
|
+
|
|
27
|
+
## Glosario de Términos
|
|
28
|
+
|
|
29
|
+
- **Fingerprint de cliente**: Conjunto de datos únicos que identifican a un cliente, incluyendo IP, user agent, headers, etc.
|
|
30
|
+
- **Rate limiting**: Sistema para limitar la cantidad de solicitudes que un cliente puede hacer en un periodo determinado
|
|
31
|
+
- **Auditoría de seguridad**: Registro de eventos de seguridad para monitoreo y análisis
|
|
32
|
+
- **Hook**: Punto de extensión en el código donde se puede insertar lógica personalizada
|
|
33
|
+
- **Action**: Tipo de hook que permite ejecutar código sin modificar valores
|
|
34
|
+
- **Filter**: Tipo de hook que permite modificar valores antes de que sean utilizados
|
|
35
|
+
|
|
36
|
+
## Referencia Rápida de Hooks
|
|
37
|
+
|
|
38
|
+
| Nombre | Tipo | Versión | Descripción Corta |
|
|
39
|
+
|--------|------|---------|-------------------|
|
|
40
|
+
| `framework_init` | Action | 2.1.0 | Inicialización del framework |
|
|
41
|
+
| `pre_server_start` | Action | 1.0.0 | Antes de iniciar el servidor |
|
|
42
|
+
| `post_server_start` | Action | 1.0.0 | Después de iniciar el servidor |
|
|
43
|
+
| `pre_route_load` | Action | 1.0.0 | Antes de cargar rutas |
|
|
44
|
+
| `pre_controller_load` | Action | 1.0.0 | Antes de cargar controladores |
|
|
45
|
+
| `firewall_request_received` | Action | 2.2.0 | Recibida solicitud antes de firewall |
|
|
46
|
+
| `firewall_ip_blocked` | Action | 2.2.0 | IP bloqueada por firewall |
|
|
47
|
+
| `firewall_rule_triggered` | Action | 2.2.0 | Activada regla de firewall |
|
|
48
|
+
| `firewall_request_blocked` | Action | 2.2.0 | Solicitud bloqueada por firewall |
|
|
49
|
+
| `firewall_request_monitored` | Action | 2.2.0 | Solicitud monitoreada por firewall |
|
|
50
|
+
| `firewall_request_allowed` | Action | 2.2.0 | Solicitud permitida por firewall |
|
|
51
|
+
| `firewall_whitelist_updated` | Action | 2.2.0 | Actualizada lista blanca |
|
|
52
|
+
| `firewall_blacklist_updated` | Action | 2.2.0 | Actualizada lista negra |
|
|
53
|
+
| `before_request_processing` | Action | 2.1.0 | Antes de procesar solicitud |
|
|
54
|
+
| `request_validation` | Action | 2.1.0 | Validación de solicitud |
|
|
55
|
+
| `apply_rate_limiting` | Action | 2.1.0 | Aplicar limitación de tasa |
|
|
56
|
+
| `security_audit` | Action | 2.1.0 | Auditoría de seguridad |
|
|
57
|
+
| `security_attack_detected` | Action | 2.1.0 | Ataque detectado |
|
|
58
|
+
| `security_ip_blocked` | Action | 2.1.0 | IP bloqueada por seguridad |
|
|
59
|
+
| `security_log_recorded` | Action | 2.1.0 | Registro de seguridad |
|
|
60
|
+
| `rate_limit_exceeded` | Action | 2.1.0 | Límite de tasa excedido |
|
|
61
|
+
| `client_fingerprint` | Filter | 2.1.0 | Huella digital del cliente |
|
|
62
|
+
| `enhanced_client_fingerprint` | Filter | 2.1.0 | Huella digital mejorada |
|
|
63
|
+
| `modify_rate_limit_behavior` | Filter | 2.1.0 | Comportamiento de limitación |
|
|
64
|
+
| `post_request_processing` | Action | 2.1.0 | Después de procesar solicitud |
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## Hooks del Firewall
|
|
69
|
+
|
|
70
|
+
### `firewall_request_received`
|
|
71
|
+
- **Tipo**: Action
|
|
72
|
+
- **Versión**: 2.2.0+
|
|
73
|
+
- **Descripción**: Se ejecuta cuando se recibe una solicitud antes de cualquier procesamiento de firewall
|
|
74
|
+
- **Parámetros**: `(req, res)`
|
|
75
|
+
- `req`: Objeto de solicitud HTTP
|
|
76
|
+
- `res`: Objeto de respuesta HTTP
|
|
77
|
+
- **Respuesta**: Ninguna
|
|
78
|
+
- **Localización**: `lib/middleware/firewall.js` (línea ~280)
|
|
79
|
+
|
|
80
|
+
### `firewall_ip_blocked`
|
|
81
|
+
- **Tipo**: Action
|
|
82
|
+
- **Versión**: 2.2.0+
|
|
83
|
+
- **Descripción**: Se ejecuta cuando una IP es bloqueada por el firewall
|
|
84
|
+
- **Parámetros**: `(ip, reason, req, res)`
|
|
85
|
+
- `ip`: Dirección IP bloqueada
|
|
86
|
+
- `reason`: Razón del bloqueo
|
|
87
|
+
- `req`: Objeto de solicitud HTTP
|
|
88
|
+
- `res`: Objeto de respuesta HTTP
|
|
89
|
+
- **Respuesta**: Ninguna
|
|
90
|
+
- **Localización**: `lib/middleware/firewall.js` (línea ~293)
|
|
91
|
+
|
|
92
|
+
### `firewall_rule_triggered`
|
|
93
|
+
- **Tipo**: Action
|
|
94
|
+
- **Versión**: 2.2.0+
|
|
95
|
+
- **Descripción**: Se ejecuta cuando se activa una regla de firewall
|
|
96
|
+
- **Parámetros**: `(rule, clientIP, req)`
|
|
97
|
+
- `rule`: Objeto con información de la regla activada
|
|
98
|
+
- `clientIP`: IP del cliente que activó la regla
|
|
99
|
+
- `req`: Objeto de solicitud HTTP
|
|
100
|
+
- **Respuesta**: Ninguna
|
|
101
|
+
- **Localización**: `lib/middleware/firewall.js` (línea ~301)
|
|
102
|
+
|
|
103
|
+
### `firewall_request_blocked`
|
|
104
|
+
- **Tipo**: Action
|
|
105
|
+
- **Versión**: 2.2.0+
|
|
106
|
+
- **Descripción**: Se ejecuta cuando una solicitud es bloqueada por una regla de firewall
|
|
107
|
+
- **Parámetros**: `(rule, clientIP, req, res)`
|
|
108
|
+
- `rule`: Objeto con información de la regla que bloqueó la solicitud
|
|
109
|
+
- `clientIP`: IP del cliente cuya solicitud fue bloqueada
|
|
110
|
+
- `req`: Objeto de solicitud HTTP
|
|
111
|
+
- `res`: Objeto de respuesta HTTP
|
|
112
|
+
- **Respuesta**: Ninguna
|
|
113
|
+
- **Localización**: `lib/middleware/firewall.js` (línea ~312)
|
|
114
|
+
|
|
115
|
+
### `firewall_request_monitored`
|
|
116
|
+
- **Tipo**: Action
|
|
117
|
+
- **Versión**: 2.2.0+
|
|
118
|
+
- **Descripción**: Se ejecuta cuando una solicitud es monitoreada por una regla de firewall
|
|
119
|
+
- **Parámetros**: `(rule, clientIP, req)`
|
|
120
|
+
- `rule`: Objeto con información de la regla que monitorea la solicitud
|
|
121
|
+
- `clientIP`: IP del cliente cuya solicitud es monitoreada
|
|
122
|
+
- `req`: Objeto de solicitud HTTP
|
|
123
|
+
- **Respuesta**: Ninguna
|
|
124
|
+
- **Localización**: `lib/middleware/firewall.js` (línea ~323)
|
|
125
|
+
|
|
126
|
+
### `firewall_request_allowed`
|
|
127
|
+
- **Tipo**: Action
|
|
128
|
+
- **Versión**: 2.2.0+
|
|
129
|
+
- **Descripción**: Se ejecuta cuando una solicitud pasa todas las verificaciones de firewall y es permitida
|
|
130
|
+
- **Parámetros**: `(req, res)`
|
|
131
|
+
- `req`: Objeto de solicitud HTTP
|
|
132
|
+
- `res`: Objeto de respuesta HTTP
|
|
133
|
+
- **Respuesta**: Ninguna
|
|
134
|
+
- **Localización**: `lib/middleware/firewall.js` (línea ~329)
|
|
135
|
+
|
|
136
|
+
### `firewall_whitelist_updated`
|
|
137
|
+
- **Tipo**: Action
|
|
138
|
+
- **Versión**: 2.2.0+
|
|
139
|
+
- **Descripción**: Se ejecuta cuando se actualiza la lista blanca (whitelist) de IPs
|
|
140
|
+
- **Parámetros**: `(ip, action, whitelist)`
|
|
141
|
+
- `ip`: IP que se agregó/removió
|
|
142
|
+
- `action`: Acción realizada ('added' o 'removed')
|
|
143
|
+
- `whitelist`: Array actualizado de IPs en la whitelist
|
|
144
|
+
- **Respuesta**: Ninguna
|
|
145
|
+
- **Localización**: `lib/middleware/firewall.js` (línea ~357)
|
|
146
|
+
|
|
147
|
+
### `firewall_blacklist_updated`
|
|
148
|
+
- **Tipo**: Action
|
|
149
|
+
- **Versión**: 2.2.0+
|
|
150
|
+
- **Descripción**: Se ejecuta cuando se actualiza la lista negra (blacklist) de IPs
|
|
151
|
+
- **Parámetros**: `(ip, action, blacklist)`
|
|
152
|
+
- `ip`: IP que se agregó/removió
|
|
153
|
+
- `action`: Acción realizada ('added' o 'removed')
|
|
154
|
+
- `blacklist`: Array actualizado de IPs en la blacklist
|
|
155
|
+
- **Respuesta**: Ninguna
|
|
156
|
+
- **Localización**: `lib/middleware/firewall.js` (línea ~370)
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## Hooks del Servidor
|
|
161
|
+
|
|
162
|
+
### `framework_init`
|
|
163
|
+
- **Tipo**: Action
|
|
164
|
+
- **Versión**: 2.1.0+
|
|
165
|
+
- **Descripción**: Se ejecuta cuando se inicializa el framework
|
|
166
|
+
- **Parámetros**: Ninguno
|
|
167
|
+
- **Respuesta**: Ninguna
|
|
168
|
+
- **Localización**: `index.js` (línea ~69)
|
|
169
|
+
|
|
170
|
+
### `pre_server_start`
|
|
171
|
+
- **Tipo**: Action
|
|
172
|
+
- **Versión**: 1.0.0+
|
|
173
|
+
- **Descripción**: Se ejecuta antes de iniciar el servidor
|
|
174
|
+
- **Parámetros**: `(server)`
|
|
175
|
+
- `server`: Instancia del servidor que va a iniciarse
|
|
176
|
+
- **Respuesta**: Ninguna
|
|
177
|
+
- **Localización**: `lib/core/server.js` (línea ~164) y `lib/core/securityEnhancedServer.js` (línea ~501)
|
|
178
|
+
|
|
179
|
+
### `post_server_start`
|
|
180
|
+
- **Tipo**: Action
|
|
181
|
+
- **Versión**: 1.0.0+
|
|
182
|
+
- **Descripción**: Se ejecuta después de iniciar el servidor
|
|
183
|
+
- **Parámetros**: `(server)`
|
|
184
|
+
- `server`: Instancia del servidor que acaba de iniciarse
|
|
185
|
+
- **Respuesta**: Ninguna
|
|
186
|
+
- **Localización**: `lib/core/server.js` (línea ~176) y `lib/core/securityEnhancedServer.js` (línea ~507)
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
## Hooks del Sistema de Carga
|
|
191
|
+
|
|
192
|
+
### `pre_route_load`
|
|
193
|
+
- **Tipo**: Action
|
|
194
|
+
- **Versión**: 1.0.0+
|
|
195
|
+
- **Descripción**: Se ejecuta antes de cargar rutas desde un archivo
|
|
196
|
+
- **Parámetros**: `(filePath, server)`
|
|
197
|
+
- `filePath`: Ruta al archivo de rutas que se va a cargar
|
|
198
|
+
- `server`: Instancia del servidor al que se van a cargar las rutas
|
|
199
|
+
- **Respuesta**: Ninguna
|
|
200
|
+
- **Localización**: `lib/loader/routeLoader.js` (línea ~26)
|
|
201
|
+
|
|
202
|
+
### `pre_controller_load`
|
|
203
|
+
- **Tipo**: Action
|
|
204
|
+
- **Versión**: 1.0.0+
|
|
205
|
+
- **Descripción**: Se ejecuta antes de cargar un controlador desde un archivo
|
|
206
|
+
- **Parámetros**: `(controllerPath)`
|
|
207
|
+
- `controllerPath`: Ruta al archivo del controlador que se va a cargar
|
|
208
|
+
- **Respuesta**: Ninguna
|
|
209
|
+
- **Localización**: `lib/loader/controllerLoader.js` (línea ~26)
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## Hooks del Sistema de Seguridad
|
|
214
|
+
|
|
215
|
+
### `before_request_processing`
|
|
216
|
+
- **Tipo**: Action
|
|
217
|
+
- **Versión**: 2.1.0+
|
|
218
|
+
- **Descripción**: Se ejecuta antes de procesar una solicitud, para detección de posibles ataques. Este hook también puede usarse como filter para modificar el resultado del procesamiento.
|
|
219
|
+
- **Parámetros**: `(req, res)`
|
|
220
|
+
- `req`: Objeto de solicitud HTTP
|
|
221
|
+
- `res`: Objeto de respuesta HTTP
|
|
222
|
+
- **Respuesta**: Booleano que indica si continuar el procesamiento
|
|
223
|
+
- **Localización**: `lib/core/securityEnhancedServer.js` (línea ~44)
|
|
224
|
+
|
|
225
|
+
### `request_validation`
|
|
226
|
+
- **Tipo**: Action
|
|
227
|
+
- **Versión**: 2.1.0+
|
|
228
|
+
- **Descripción**: Se ejecuta para aplicar validaciones de seguridad a la solicitud
|
|
229
|
+
- **Parámetros**: `(req, res)`
|
|
230
|
+
- `req`: Objeto de solicitud HTTP
|
|
231
|
+
- `res`: Objeto de respuesta HTTP
|
|
232
|
+
- **Respuesta**: Booleano que indica si la solicitud pasó la validación
|
|
233
|
+
- **Localización**: `lib/core/securityEnhancedServer.js` (línea ~86)
|
|
234
|
+
|
|
235
|
+
### `apply_rate_limiting`
|
|
236
|
+
- **Tipo**: Action
|
|
237
|
+
- **Versión**: 2.1.0+
|
|
238
|
+
- **Descripción**: Se ejecuta para aplicar limitación de tasa basada en huella digital
|
|
239
|
+
- **Parámetros**: `(req, res, next)`
|
|
240
|
+
- `req`: Objeto de solicitud HTTP
|
|
241
|
+
- `res`: Objeto de respuesta HTTP
|
|
242
|
+
- `next`: Función next para continuar con el middleware
|
|
243
|
+
- **Respuesta**: Ninguna
|
|
244
|
+
- **Localización**: `lib/core/securityEnhancedServer.js` (línea ~113)
|
|
245
|
+
|
|
246
|
+
### `security_audit`
|
|
247
|
+
- **Tipo**: Action
|
|
248
|
+
- **Versión**: 2.1.0+
|
|
249
|
+
- **Descripción**: Se ejecuta para auditoría de seguridad
|
|
250
|
+
- **Parámetros**: `(req, res, action, details)`
|
|
251
|
+
- `req`: Objeto de solicitud HTTP
|
|
252
|
+
- `res`: Objeto de respuesta HTTP
|
|
253
|
+
- `action`: Acción de seguridad realizada
|
|
254
|
+
- `details`: Detalles adicionales sobre el evento de seguridad
|
|
255
|
+
- **Respuesta**: Ninguna
|
|
256
|
+
- **Localización**: `lib/core/securityEnhancedServer.js` (línea ~128)
|
|
257
|
+
|
|
258
|
+
### `security_attack_detected`
|
|
259
|
+
- **Tipo**: Action
|
|
260
|
+
- **Versión**: 2.1.0+
|
|
261
|
+
- **Descripción**: Se ejecuta cuando se detecta un posible ataque
|
|
262
|
+
- **Parámetros**: `(attackResult, req, res)`
|
|
263
|
+
- `attackResult`: Resultado de la detección del ataque
|
|
264
|
+
- `req`: Objeto de solicitud HTTP
|
|
265
|
+
- `res`: Objeto de respuesta HTTP
|
|
266
|
+
- **Respuesta**: Ninguna
|
|
267
|
+
- **Localización**: `lib/core/securityEnhancedServer.js` (línea ~50)
|
|
268
|
+
|
|
269
|
+
### `security_ip_blocked`
|
|
270
|
+
- **Tipo**: Action
|
|
271
|
+
- **Versión**: 2.1.0+
|
|
272
|
+
- **Descripción**: Se ejecuta cuando una IP es bloqueada por razones de seguridad
|
|
273
|
+
- **Parámetros**: `(clientIP, blockInfo, req, res)`
|
|
274
|
+
- `clientIP`: IP que fue bloqueada
|
|
275
|
+
- `blockInfo`: Información sobre el bloqueo
|
|
276
|
+
- `req`: Objeto de solicitud HTTP
|
|
277
|
+
- `res`: Objeto de respuesta HTTP
|
|
278
|
+
- **Respuesta**: Ninguna
|
|
279
|
+
- **Localización**: `lib/core/securityEnhancedServer.js` (línea ~94)
|
|
280
|
+
|
|
281
|
+
### `security_log_recorded`
|
|
282
|
+
- **Tipo**: Action
|
|
283
|
+
- **Versión**: 2.1.0+
|
|
284
|
+
- **Descripción**: Se ejecuta cuando se registra un evento de seguridad
|
|
285
|
+
- **Parámetros**: `(auditLog)`
|
|
286
|
+
- `auditLog`: Objeto con información del evento de auditoría
|
|
287
|
+
- **Respuesta**: Ninguna
|
|
288
|
+
- **Localización**: `lib/core/securityEnhancedServer.js` (línea ~138)
|
|
289
|
+
|
|
290
|
+
### `rate_limit_exceeded`
|
|
291
|
+
- **Tipo**: Action
|
|
292
|
+
- **Versión**: 2.1.0+
|
|
293
|
+
- **Descripción**: Se ejecuta cuando se excede el límite de tasa
|
|
294
|
+
- **Parámetros**: `(clientId, req, res)`
|
|
295
|
+
- `clientId`: ID del cliente que excedió el límite
|
|
296
|
+
- `req`: Objeto de solicitud HTTP
|
|
297
|
+
- `res`: Objeto de respuesta HTTP
|
|
298
|
+
- **Respuesta**: Ninguna
|
|
299
|
+
- **Localización**: `lib/core/securityEnhancedServer.js` (línea ~176)
|
|
300
|
+
|
|
301
|
+
---
|
|
302
|
+
|
|
303
|
+
## Hooks del Sistema de Rutas
|
|
304
|
+
|
|
305
|
+
### `client_fingerprint`
|
|
306
|
+
- **Tipo**: Filter
|
|
307
|
+
- **Versión**: 2.1.0+
|
|
308
|
+
- **Descripción**: Permite modificar la huella digital del cliente
|
|
309
|
+
- **Parámetros**: `(fingerprint, req)`
|
|
310
|
+
- `fingerprint`: Objeto con la huella digital actual del cliente
|
|
311
|
+
- `req`: Objeto de solicitud HTTP
|
|
312
|
+
- **Respuesta**: Objeto con la huella digital modificada
|
|
313
|
+
- **Localización**: `lib/core/securityEnhancedServer.js` (línea ~59)
|
|
314
|
+
|
|
315
|
+
### `enhanced_client_fingerprint`
|
|
316
|
+
- **Tipo**: Filter
|
|
317
|
+
- **Versión**: 2.1.0+
|
|
318
|
+
- **Descripción**: Permite modificar la huella digital mejorada del cliente
|
|
319
|
+
- **Parámetros**: `(enhancedFingerprint, req)`
|
|
320
|
+
- `enhancedFingerprint`: Objeto con la huella digital mejorada actual
|
|
321
|
+
- `req`: Objeto de solicitud HTTP
|
|
322
|
+
- **Respuesta**: Objeto con la huella digital mejorada modificada
|
|
323
|
+
- **Localización**: `lib/core/securityEnhancedServer.js` (línea ~82)
|
|
324
|
+
|
|
325
|
+
### `modify_rate_limit_behavior`
|
|
326
|
+
- **Tipo**: Filter
|
|
327
|
+
- **Versión**: 2.1.0+
|
|
328
|
+
- **Descripción**: Permite modificar el comportamiento de limitación de tasa
|
|
329
|
+
- **Parámetros**: `(rateLimitConfig, req)`
|
|
330
|
+
- `rateLimitConfig`: Objeto con la configuración actual de limitación de tasa
|
|
331
|
+
- `req`: Objeto de solicitud HTTP
|
|
332
|
+
- **Respuesta**: Objeto con la configuración modificada de limitación de tasa
|
|
333
|
+
- **Localización**: `lib/core/securityEnhancedServer.js` (línea ~162)
|
|
334
|
+
|
|
335
|
+
### `before_request_processing` (como Filter)
|
|
336
|
+
- **Tipo**: Filter
|
|
337
|
+
- **Versión**: 2.1.0+
|
|
338
|
+
- **Descripción**: Permite modificar el resultado del procesamiento previo de solicitud
|
|
339
|
+
- **Parámetros**: `(continueProcessing, req, res)`
|
|
340
|
+
- `continueProcessing`: Booleano que indica si continuar el procesamiento
|
|
341
|
+
- `req`: Objeto de solicitud HTTP
|
|
342
|
+
- `res`: Objeto de respuesta HTTP
|
|
343
|
+
- **Respuesta**: Booleano que indica si continuar el procesamiento
|
|
344
|
+
- **Localización**: `lib/core/securityEnhancedServer.js` (línea ~430)
|
|
345
|
+
|
|
346
|
+
### `post_request_processing`
|
|
347
|
+
- **Tipo**: Action
|
|
348
|
+
- **Versión**: 2.1.0+
|
|
349
|
+
- **Descripción**: Se ejecuta después de procesar una solicitud
|
|
350
|
+
- **Parámetros**: `(req, res)`
|
|
351
|
+
- `req`: Objeto de solicitud HTTP
|
|
352
|
+
- `res`: Objeto de respuesta HTTP
|
|
353
|
+
- **Respuesta**: Ninguna
|
|
354
|
+
- **Localización**: `lib/core/securityEnhancedServer.js` (línea ~444)
|
|
355
|
+
|
|
356
|
+
---
|
|
357
|
+
|
|
358
|
+
## Hooks del Sistema MVC
|
|
359
|
+
|
|
360
|
+
### `template_pre_process`
|
|
361
|
+
- **Tipo**: Filter
|
|
362
|
+
- **Versión**: 2.3.0+
|
|
363
|
+
- **Descripción**: Se ejecuta antes de procesar un template de vista
|
|
364
|
+
- **Parámetros**: `(template, data)`
|
|
365
|
+
- `template`: Cadena con el contenido del template antes de procesar
|
|
366
|
+
- `data`: Objeto con los datos que se pasarán al template
|
|
367
|
+
- **Respuesta**: Cadena con el template modificado antes de procesar
|
|
368
|
+
- **Localización**: `lib/mvc/viewEngine.js` (línea ~178)
|
|
369
|
+
|
|
370
|
+
### `template_post_process`
|
|
371
|
+
- **Tipo**: Filter
|
|
372
|
+
- **Versión**: 2.3.0+
|
|
373
|
+
- **Descripción**: Se ejecuta después de procesar un template de vista
|
|
374
|
+
- **Parámetros**: `(template, data)`
|
|
375
|
+
- `template`: Cadena con el contenido del template después de procesar
|
|
376
|
+
- `data`: Objeto con los datos que se usaron en el template
|
|
377
|
+
- **Respuesta**: Cadena con el template modificado después de procesar
|
|
378
|
+
- **Localización**: `lib/mvc/viewEngine.js` (línea ~184)
|
|
379
|
+
|
|
380
|
+
---
|
|
381
|
+
|
|
382
|
+
## Ejemplos Prácticos
|
|
383
|
+
|
|
384
|
+
### Ejemplo de Uso de Actions
|
|
385
|
+
|
|
386
|
+
```javascript
|
|
387
|
+
const { HookSystem } = require('jerk');
|
|
388
|
+
const hooks = new HookSystem();
|
|
389
|
+
|
|
390
|
+
// Registrar un action para registrar solicitudes bloqueadas
|
|
391
|
+
hooks.addAction('firewall_ip_blocked', (ip, reason, req, res) => {
|
|
392
|
+
console.log(`IP bloqueada: ${ip} - Razón: ${reason}`);
|
|
393
|
+
// Aquí puedes añadir lógica adicional como enviar alertas
|
|
394
|
+
});
|
|
395
|
+
|
|
396
|
+
// Registrar un action para auditar solicitudes permitidas
|
|
397
|
+
hooks.addAction('firewall_request_allowed', (req, res) => {
|
|
398
|
+
console.log(`Solicitud permitida: ${req.method} ${req.url}`);
|
|
399
|
+
});
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
### Ejemplo de Uso de Filters
|
|
403
|
+
|
|
404
|
+
```javascript
|
|
405
|
+
const { HookSystem } = require('jerk');
|
|
406
|
+
const hooks = new HookSystem();
|
|
407
|
+
|
|
408
|
+
// Registrar un filter para modificar la huella digital del cliente
|
|
409
|
+
hooks.addFilter('client_fingerprint', (fingerprint, req) => {
|
|
410
|
+
// Añadir información adicional a la huella digital
|
|
411
|
+
return {
|
|
412
|
+
...fingerprint,
|
|
413
|
+
customField: req.headers['x-custom-header'] || 'unknown',
|
|
414
|
+
processingTime: Date.now()
|
|
415
|
+
};
|
|
416
|
+
});
|
|
417
|
+
|
|
418
|
+
// Registrar un filter para modificar el comportamiento de limitación de tasa
|
|
419
|
+
hooks.addFilter('modify_rate_limit_behavior', (rateLimitConfig, req) => {
|
|
420
|
+
// Ajustar límites para ciertos clientes
|
|
421
|
+
if (req.headers['x-trusted-client']) {
|
|
422
|
+
return {
|
|
423
|
+
...rateLimitConfig,
|
|
424
|
+
maxRequests: rateLimitConfig.maxRequests * 2 // Duplicar límite para clientes confiables
|
|
425
|
+
};
|
|
426
|
+
}
|
|
427
|
+
return rateLimitConfig;
|
|
428
|
+
});
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
### Ejemplo Integrado de Múltiples Hooks
|
|
432
|
+
|
|
433
|
+
```javascript
|
|
434
|
+
const { APIServer, Firewall, HookSystem, Logger } = require('jerk');
|
|
435
|
+
|
|
436
|
+
async function startSecureAPIWithHooks() {
|
|
437
|
+
const server = new APIServer({ port: 3000 });
|
|
438
|
+
const logger = new Logger({ level: 'info' });
|
|
439
|
+
const hooks = new HookSystem();
|
|
440
|
+
const firewall = new Firewall({ logger });
|
|
441
|
+
|
|
442
|
+
// Configurar hooks para monitoreo y alertas
|
|
443
|
+
hooks.addAction('firewall_request_blocked', (rule, clientIP, req, res) => {
|
|
444
|
+
logger.warn(`Solicitud bloqueada: ${rule.name} para IP: ${clientIP}`);
|
|
445
|
+
// Enviar alerta si es un ataque grave
|
|
446
|
+
if (rule.name === 'sql_injection') {
|
|
447
|
+
sendSecurityAlert('Ataque de SQL Injection detectado', { ip: clientIP, url: req.url });
|
|
448
|
+
}
|
|
449
|
+
});
|
|
450
|
+
|
|
451
|
+
hooks.addAction('firewall_rule_triggered', (rule, clientIP, req) => {
|
|
452
|
+
logger.info(`Regla activada: ${rule.name} para IP: ${clientIP}`);
|
|
453
|
+
// Incrementar puntuación de amenaza
|
|
454
|
+
incrementThreatScore(clientIP);
|
|
455
|
+
});
|
|
456
|
+
|
|
457
|
+
hooks.addAction('firewall_ip_blocked', (ip, reason, req, res) => {
|
|
458
|
+
logger.error(`IP bloqueada: ${ip} - ${reason}`);
|
|
459
|
+
// Registrar en sistema de seguridad externo
|
|
460
|
+
logSecurityIncident({
|
|
461
|
+
type: 'IP_BLOCKED',
|
|
462
|
+
ip,
|
|
463
|
+
reason,
|
|
464
|
+
timestamp: new Date()
|
|
465
|
+
});
|
|
466
|
+
});
|
|
467
|
+
|
|
468
|
+
// Aplicar firewall al servidor
|
|
469
|
+
server.use(firewall.middleware());
|
|
470
|
+
|
|
471
|
+
server.start();
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
// Funciones auxiliares
|
|
475
|
+
function sendSecurityAlert(message, details) {
|
|
476
|
+
// Lógica para enviar alerta de seguridad
|
|
477
|
+
console.log(`SECURITY ALERT: ${message}`, details);
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
function incrementThreatScore(ip) {
|
|
481
|
+
// Lógica para incrementar puntuación de amenaza
|
|
482
|
+
console.log(`Incrementando puntuación de amenaza para IP: ${ip}`);
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
function logSecurityIncident(incident) {
|
|
486
|
+
// Lógica para registrar incidente de seguridad
|
|
487
|
+
console.log('Incidente de seguridad registrado:', incident);
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
startSecureAPIWithHooks();
|
|
491
|
+
```
|
|
492
|
+
|
|
493
|
+
### Ejemplo de Uso de Hooks en el Sistema MVC
|
|
494
|
+
|
|
495
|
+
```javascript
|
|
496
|
+
const { APIServer, Router, ControllerBase, ViewEngine, HookSystem } = require('jerk');
|
|
497
|
+
|
|
498
|
+
// Crear instancia del sistema de hooks
|
|
499
|
+
const hooks = new HookSystem();
|
|
500
|
+
|
|
501
|
+
// Crear ViewEngine con hooks
|
|
502
|
+
const viewEngine = new ViewEngine({
|
|
503
|
+
viewsPath: './views',
|
|
504
|
+
cacheEnabled: true,
|
|
505
|
+
hooks: hooks // Pasar la instancia de hooks al ViewEngine
|
|
506
|
+
});
|
|
507
|
+
|
|
508
|
+
// Ejemplo de uso de hooks para manipular templates
|
|
509
|
+
hooks.addFilter('template_pre_process', (template, data) => {
|
|
510
|
+
// Añadir información global a todos los templates
|
|
511
|
+
const globalData = {
|
|
512
|
+
siteName: 'Mi Aplicación',
|
|
513
|
+
version: '2.3.0',
|
|
514
|
+
year: new Date().getFullYear()
|
|
515
|
+
};
|
|
516
|
+
|
|
517
|
+
// Inyectar variables globales en el template
|
|
518
|
+
let processedTemplate = template;
|
|
519
|
+
for (const [key, value] of Object.entries(globalData)) {
|
|
520
|
+
const regex = new RegExp(`\\{\\{\\s*${key}\\s*\\}\\}`, 'g');
|
|
521
|
+
processedTemplate = processedTemplate.replace(regex, String(value));
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
return processedTemplate;
|
|
525
|
+
});
|
|
526
|
+
|
|
527
|
+
hooks.addFilter('template_post_process', (template, data) => {
|
|
528
|
+
// Añadir pie de página estándar a todas las vistas procesadas
|
|
529
|
+
return template + `\n<footer>Versión ${data.version || 'desconocida'} - ${new Date().getFullYear()}</footer>`;
|
|
530
|
+
});
|
|
531
|
+
|
|
532
|
+
// Controlador con ejemplo de uso del sistema MVC
|
|
533
|
+
class HomeController extends ControllerBase {
|
|
534
|
+
constructor(options = {}) {
|
|
535
|
+
super({ ...options, viewEngine }); // Usar el ViewEngine con hooks
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
index(req, res) {
|
|
539
|
+
this.set('title', 'Página de Inicio');
|
|
540
|
+
this.set('message', '¡Bienvenido al sistema MVC!');
|
|
541
|
+
this.set('version', '2.3.0');
|
|
542
|
+
|
|
543
|
+
this.render(res, 'home/index');
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
// Configurar servidor
|
|
548
|
+
const server = new APIServer({ port: 3000 });
|
|
549
|
+
const router = new Router();
|
|
550
|
+
const homeController = new HomeController({ viewsPath: './views' });
|
|
551
|
+
|
|
552
|
+
router.get('/', (req, res) => {
|
|
553
|
+
homeController.setRequestResponse(req, res);
|
|
554
|
+
homeController.index(req, res);
|
|
555
|
+
});
|
|
556
|
+
|
|
557
|
+
server.use(router);
|
|
558
|
+
server.start();
|
|
559
|
+
```
|
|
560
|
+
|
|
561
|
+
---
|
|
562
|
+
|
|
563
|
+
## Compatibilidad y Versionado
|
|
564
|
+
|
|
565
|
+
### Flujo de Ejecución de Hooks
|
|
566
|
+
|
|
567
|
+
1. **Inicialización del Framework**
|
|
568
|
+
- `framework_init` (v2.1.0+)
|
|
569
|
+
|
|
570
|
+
2. **Antes de Iniciar el Servidor**
|
|
571
|
+
- `pre_server_start` (v1.0.0+)
|
|
572
|
+
|
|
573
|
+
3. **Durante el Procesamiento de Solicitudes**
|
|
574
|
+
- `firewall_request_received` (v2.2.0+)
|
|
575
|
+
- `before_request_processing` (v2.1.0+) - Action
|
|
576
|
+
- `before_request_processing` (v2.1.0+) - Filter
|
|
577
|
+
- `request_validation` (v2.1.0+)
|
|
578
|
+
- `apply_rate_limiting` (v2.1.0+)
|
|
579
|
+
- `post_request_processing` (v2.1.0+)
|
|
580
|
+
|
|
581
|
+
4. **Después de Iniciar el Servidor**
|
|
582
|
+
- `post_server_start` (v1.0.0+)
|
|
583
|
+
|
|
584
|
+
### Compatibilidad por Versión
|
|
585
|
+
|
|
586
|
+
- **v1.0.0**: Hooks básicos del servidor (`pre_server_start`, `post_server_start`)
|
|
587
|
+
- **v1.0.1**: Hooks del sistema de carga (`pre_route_load`, `pre_controller_load`)
|
|
588
|
+
- **v2.0.0**: No añade nuevos hooks
|
|
589
|
+
- **v2.1.0**: Sistema completo de hooks de seguridad y rutas
|
|
590
|
+
- **v2.2.0**: Hooks específicos del firewall
|
|
591
|
+
- **v2.3.0**: Hooks del sistema MVC (`template_pre_process`, `template_post_process`)
|
|
592
|
+
|
|
593
|
+
### Notas de Compatibilidad
|
|
594
|
+
|
|
595
|
+
- Los hooks introducidos en versiones posteriores a v2.1.0 dependen del sistema de hooks completo
|
|
596
|
+
- Algunos hooks pueden tener comportamientos diferentes en versiones anteriores
|
|
597
|
+
- Se recomienda verificar la versión del framework antes de usar hooks específicos
|
|
598
|
+
- Los hooks de firewall requieren la versión 2.2.0 o superior del framework
|
|
599
|
+
- Los hooks del sistema MVC requieren la versión 2.3.0 o superior del framework
|