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.
- package/CHANGELOG.md +664 -0
- package/LICENSE +201 -0
- package/NOTICE +25 -0
- package/README.md +246 -0
- package/apps.zip +0 -0
- package/bin/adminclient +105 -0
- package/bin/blackcoffee +133 -0
- package/cli/admin-users.js +282 -0
- package/cli/commands/app.js +561 -0
- package/cli/commands/config.js +182 -0
- package/cli/commands/db.js +257 -0
- package/cli/commands/server.js +200 -0
- package/config/applications.json +5 -0
- package/config/database.json +28 -0
- package/config/database.json.example +23 -0
- package/config/server.json +32 -0
- package/controllers/admin/AdminController.js +529 -0
- package/controllers/admin/AdminViewController.js +90 -0
- package/controllers/admin/AuthController.js +293 -0
- package/controllers/admin/DatabaseAdminController.js +218 -0
- package/core/SQLiteAdapter.js +333 -0
- package/core/appLoader.js +385 -0
- package/core/databasePoolManager.js +431 -0
- package/core/hotReload.js +363 -0
- package/data/ADMIN-README.md +145 -0
- package/data/CHANGELOG.md +48 -0
- package/data/GTK3-NODE-PROPOSALS.md +410 -0
- package/data/admin-db.js +150 -0
- package/data/admin-gui.js +452 -0
- package/data/blackcoffee_admin.db-shm +0 -0
- package/data/blackcoffee_admin.db-wal +0 -0
- package/data/migrations/001_create_admin_users.sql +33 -0
- package/docs/APP_HOOKS_HANDLER.md +432 -0
- package/docs/APP_HOOKS_REQUIREMENTS.md +588 -0
- package/docs/ARCHITECTURE.md +435 -0
- package/docs/CREAR_APP_Y_USAR_POOLS.md +1595 -0
- package/docs/EVENTS_APP_MANUAL.md +289 -0
- package/docs/INSITU_BINARY_UPLOAD_PROPOSAL.md +186 -0
- package/docs/INSITU_FIREWALL_EXCEPTION.md +187 -0
- package/docs/ROADMAP.md +242 -0
- package/docs/ROADMAP.md.backup +243 -0
- package/includes/404-hooks.js +423 -0
- package/includes/adminAuth.js +214 -0
- package/includes/adminExtension.js +53 -0
- package/includes/appHooks.js +302 -0
- package/includes/initAdminDb.js +115 -0
- package/includes/routeLoader.js +67 -0
- package/includes/sessions.js +223 -0
- package/issues/001-duplicate-module-loading.md +92 -0
- package/manuales/ADMIN_EXTENSION_COMMANDS_MANUAL.md +261 -0
- package/manuales/ADMIN_EXTENSION_HOOK_EXAMPLE.md +28 -0
- package/manuales/ADMIN_EXTENSION_INTEGRATION_MANUAL.md +232 -0
- package/manuales/CACHE_REGEX_COMMANDS.md +136 -0
- package/manuales/CACHE_SYSTEM_MAP.md +206 -0
- package/manuales/CREACION_DE_CONTROLADORES_INSITU.md +383 -0
- package/manuales/QUEUE_CLI_MODULE_MANUAL.md +289 -0
- package/manuales/QUEUE_SYSTEM_MANUAL.md +320 -0
- package/manuales/ROUTE_CACHE_MODULE_MANUAL.md +205 -0
- package/manuales/SESSION_MANAGER_GUIDE.md +529 -0
- package/manuales/SESSION_SECURITY_FLAGS.md +174 -0
- package/manuales/WAF_MODULE_MANUAL.md +229 -0
- package/manuales/after_route_handler_filter_example.md +116 -0
- package/manuales/after_route_handler_usage.md +130 -0
- package/manuales/an/303/241lisis-completo-insitu-framework.md +213 -0
- package/manuales/async_hooks_promises_guide.md +325 -0
- package/manuales/before_route_handler_filter_example.md +97 -0
- package/manuales/before_route_handler_usage.md +122 -0
- package/manuales/hooks_chaining_conditions_guide.md +261 -0
- package/manuales/hooks_filters_documentation.md +493 -0
- package/manuales/hooks_filters_documentation_en.md +493 -0
- package/manuales/hooks_vs_middlewares_comparison.md +87 -0
- package/manuales/manual-mvc-completo.md +934 -0
- package/manuales/modulos_administracion.md +89 -0
- package/manuales/router_execution_points.md +74 -0
- package/manuales/static_file_hooks_usage.md +222 -0
- package/models/AdminUserModel.js +132 -0
- package/package.json +45 -0
- package/programatically/PRoutes.js +89 -0
- package/programatically/initFlow.js +211 -0
- package/public/admin/css/db-pools.css +336 -0
- package/public/admin/css/styles.css +310 -0
- package/public/admin/database.html +312 -0
- package/public/admin/index.html +116 -0
- package/public/admin/js/app.js +470 -0
- package/public/admin/js/db-pools.js +253 -0
- package/public/admin/login.html +278 -0
- package/public/assets/css/styles.css +477 -0
- package/public/assets/js/main.js +89 -0
- package/public/index.html +136 -0
- package/public/templates/404.html +158 -0
- package/routes/admin-views.json +20 -0
- package/routes/admin.json +38 -0
- package/routes/auth.json +32 -0
- package/routes/static.json +18 -0
- package/server.js +299 -0
- package/test-aplicacion.con-logisession/BlackCoffee.js +226 -0
- package/test-aplicacion.con-logisession/SSL_SETUP.md +53 -0
- package/test-aplicacion.con-logisession/certs/ca-certificate.pem +32 -0
- package/test-aplicacion.con-logisession/certs/ca-private-key.pem +52 -0
- package/test-aplicacion.con-logisession/certs/certificate-2048.pem +22 -0
- package/test-aplicacion.con-logisession/certs/certificate.pem +32 -0
- package/test-aplicacion.con-logisession/certs/private-key-2048.pem +28 -0
- package/test-aplicacion.con-logisession/certs/private-key.pem +52 -0
- package/test-aplicacion.con-logisession/config/iaQueueSetup.js +84 -0
- package/test-aplicacion.con-logisession/config/qwen-rules.json +39 -0
- package/test-aplicacion.con-logisession/controllers/analyticsController.js +117 -0
- package/test-aplicacion.con-logisession/controllers/auth/AdminAuthController.js +142 -0
- package/test-aplicacion.con-logisession/controllers/auth/AuthController.js +439 -0
- package/test-aplicacion.con-logisession/controllers/auth/AuthViewController.js +223 -0
- package/test-aplicacion.con-logisession/controllers/endpointController.js +66 -0
- package/test-aplicacion.con-logisession/controllers/example.js +183 -0
- package/test-aplicacion.con-logisession/controllers/iaQueueController.js +367 -0
- package/test-aplicacion.con-logisession/controllers/queueController.js +206 -0
- package/test-aplicacion.con-logisession/controllers/qwenQueueController.js +197 -0
- package/test-aplicacion.con-logisession/controllers/test.js +0 -0
- package/test-aplicacion.con-logisession/controllers/tracking/EventsNoFinishController.js +78 -0
- package/test-aplicacion.con-logisession/controllers/tracking/TrackingController.js +412 -0
- package/test-aplicacion.con-logisession/controllers/tracking/TrackingControllerWithLoadModel.js +437 -0
- package/test-aplicacion.con-logisession/hooks/admin-hooks.js +20 -0
- package/test-aplicacion.con-logisession/hooks/general-hooks.js +97 -0
- package/test-aplicacion.con-logisession/hooks/queue-hooks.js +64 -0
- package/test-aplicacion.con-logisession/hooks/route-directory-hooks.js +38 -0
- package/test-aplicacion.con-logisession/hooks/security-hooks.js +24 -0
- package/test-aplicacion.con-logisession/insitu-admin-client/README.md +69 -0
- package/test-aplicacion.con-logisession/insitu-admin-client/package.json +23 -0
- package/test-aplicacion.con-logisession/insitu-admin-client.js +257 -0
- package/test-aplicacion.con-logisession/models/ExampleModel.js +88 -0
- package/test-aplicacion.con-logisession/models/QueueJobModel.js +263 -0
- package/test-aplicacion.con-logisession/models/TokenModel.js +207 -0
- package/test-aplicacion.con-logisession/models/auth/AuthModel.js +66 -0
- package/test-aplicacion.con-logisession/models/auth/UserModel.js +189 -0
- package/test-aplicacion.con-logisession/models/tracking/CompletedCartModel.js +213 -0
- package/test-aplicacion.con-logisession/models/tracking/EventModel.js +366 -0
- package/test-aplicacion.con-logisession/models/tracking/EventsNoFinishModel.js +131 -0
- package/test-aplicacion.con-logisession/models/tracking/SessionModel.js +360 -0
- package/test-aplicacion.con-logisession/models/tracking/SiteFlowModel.js +286 -0
- package/test-aplicacion.con-logisession/models/tracking/TokenModel.js +207 -0
- package/test-aplicacion.con-logisession/package-lock.json +3313 -0
- package/test-aplicacion.con-logisession/package.json +32 -0
- package/test-aplicacion.con-logisession/public/blackcoffee-welcome/index.html +1339 -0
- package/test-aplicacion.con-logisession/public/css/style.css +64 -0
- package/test-aplicacion.con-logisession/public/ejemplo-estatica/index.html +18 -0
- package/test-aplicacion.con-logisession/public/ejemplo-estatica/script.js +16 -0
- package/test-aplicacion.con-logisession/public/ejemplo-estatica/styles.css +43 -0
- package/test-aplicacion.con-logisession/public/images/logo.svg +7 -0
- package/test-aplicacion.con-logisession/public/js/main.js +67 -0
- package/test-aplicacion.con-logisession/routes/analytics-routes.json +8 -0
- package/test-aplicacion.con-logisession/routes/auth-routes.json +98 -0
- package/test-aplicacion.con-logisession/routes/blackcoffee-welcome-routes.json +20 -0
- package/test-aplicacion.con-logisession/routes/duplicate-test-routes.json.disabled +16 -0
- package/test-aplicacion.con-logisession/routes/ejemplo-estatica-routes.json +11 -0
- package/test-aplicacion.con-logisession/routes/endpoints-routes.json +8 -0
- package/test-aplicacion.con-logisession/routes/ia-queue-routes.json +26 -0
- package/test-aplicacion.con-logisession/routes/product-routes.json.disabled +20 -0
- package/test-aplicacion.con-logisession/routes/queue-routes.json +32 -0
- package/test-aplicacion.con-logisession/routes/qwen-routes.json +14 -0
- package/test-aplicacion.con-logisession/routes/static-routes.json +29 -0
- package/test-aplicacion.con-logisession/routes/tracking-routes.json +58 -0
- package/test-aplicacion.con-logisession/routes/tracking-with-loadmodel-routes.json +51 -0
- package/test-aplicacion.con-logisession/utils/dbAdapter.js +88 -0
- package/test-aplicacion.con-logisession/utils/qbWrapper.js +4 -0
- package/test-aplicacion.con-logisession/utils/queueProcessor.js +305 -0
- package/test-aplicacion.con-logisession/utils/qwenRulesService.js +131 -0
- package/test-aplicacion.con-logisession/utils/tokenHelper.js +22 -0
- package/test-aplicacion.con-logisession/views/auth/dashboard.html +443 -0
- package/test-aplicacion.con-logisession/views/auth/forgot-password.html +200 -0
- package/test-aplicacion.con-logisession/views/auth/login.html +213 -0
- package/test-aplicacion.con-logisession/views/auth/register.html +294 -0
- package/test-aplicacion.con-logisession/views/contact/form.html +47 -0
- package/test-aplicacion.con-logisession/views/products/index.html +39 -0
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Modelo para la tabla tokens en el framework JERK
|
|
3
|
+
* Implementación del componente MVC TokenModel.js
|
|
4
|
+
* Utiliza MariaDB como adaptador de base de datos
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const { ModelBase, hooks } = require('insitu-js');
|
|
8
|
+
const { getSharedAdapter } = require('../../utils/dbAdapter');
|
|
9
|
+
const { QueryBuilder } = require('insitu-js');
|
|
10
|
+
|
|
11
|
+
class TokenModel extends ModelBase {
|
|
12
|
+
constructor(options = {}) {
|
|
13
|
+
// Obtener el adaptador centralizado
|
|
14
|
+
const adapter = getSharedAdapter();
|
|
15
|
+
|
|
16
|
+
super({
|
|
17
|
+
...options,
|
|
18
|
+
tableName: options.tableName || 'tokens',
|
|
19
|
+
adapter: adapter
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
// Inicializar QueryBuilder con el adaptador centralizado
|
|
23
|
+
this.queryBuilder = new QueryBuilder(adapter, 'tokens');
|
|
24
|
+
|
|
25
|
+
// Definir campos del modelo
|
|
26
|
+
this.fields = {
|
|
27
|
+
id: { type: 'integer', primaryKey: true, autoIncrement: true },
|
|
28
|
+
token: { type: 'string', required: true },
|
|
29
|
+
created_at: { type: 'datetime', auto: 'create' },
|
|
30
|
+
store_id: { type: 'integer' }
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Valida un token contra la base de datos
|
|
36
|
+
* @param {string} token - Token a validar
|
|
37
|
+
* @returns {Promise<boolean>} - True si el token es válido y no revocado, false en caso contrario
|
|
38
|
+
*/
|
|
39
|
+
async validateToken(token) {
|
|
40
|
+
if (!token) {
|
|
41
|
+
// Disparar hook de validación de token fallida
|
|
42
|
+
hooks.doAction('token_validation_failed', { token: token, reason: 'Token vacío o nulo' });
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Disparar hook de inicio de validación de token
|
|
47
|
+
hooks.doAction('token_validation_start', { token: token });
|
|
48
|
+
|
|
49
|
+
try {
|
|
50
|
+
// Buscar el token en la base de datos usando QueryBuilder
|
|
51
|
+
const tokenRecord = await this.queryBuilder
|
|
52
|
+
.reset()
|
|
53
|
+
.select('*')
|
|
54
|
+
.where('token', token)
|
|
55
|
+
.first();
|
|
56
|
+
|
|
57
|
+
if (tokenRecord) {
|
|
58
|
+
// Verificar si el token está revocado
|
|
59
|
+
if (tokenRecord.revoked === 1) {
|
|
60
|
+
// Disparar hook de validación de token fallida por revocación
|
|
61
|
+
hooks.doAction('token_validation_failed', { token: token, reason: 'Token revocado' });
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Disparar hook de validación de token exitosa
|
|
66
|
+
hooks.doAction('token_validation_success', { token: token, tokenRecord: tokenRecord });
|
|
67
|
+
return true;
|
|
68
|
+
} else {
|
|
69
|
+
// Disparar hook de validación de token fallida
|
|
70
|
+
hooks.doAction('token_validation_failed', { token: token, reason: 'Token no encontrado en la base de datos' });
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
} catch (error) {
|
|
74
|
+
console.error('[ERROR] TokenModel.validateToken:', error);
|
|
75
|
+
// Disparar hook de validación de token fallida por error
|
|
76
|
+
hooks.doAction('token_validation_error', { token: token, error: error.message });
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Obtiene un token por su valor
|
|
83
|
+
* @param {string} token - Valor del token
|
|
84
|
+
* @returns {Promise<Object|null>} - Registro del token o null si no existe
|
|
85
|
+
*/
|
|
86
|
+
async getToken(token) {
|
|
87
|
+
if (!token) {
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
try {
|
|
92
|
+
return await this.queryBuilder
|
|
93
|
+
.reset()
|
|
94
|
+
.select('*')
|
|
95
|
+
.where('token', token)
|
|
96
|
+
.first();
|
|
97
|
+
} catch (error) {
|
|
98
|
+
console.error('[ERROR] TokenModel.getToken:', error);
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Obtiene todos los tokens
|
|
105
|
+
* @returns {Promise<Array>} - Lista de todos los tokens
|
|
106
|
+
*/
|
|
107
|
+
async getAllTokens() {
|
|
108
|
+
try {
|
|
109
|
+
return await this.queryBuilder
|
|
110
|
+
.reset()
|
|
111
|
+
.select('*')
|
|
112
|
+
.get();
|
|
113
|
+
} catch (error) {
|
|
114
|
+
console.error('[ERROR] TokenModel.getAllTokens:', error);
|
|
115
|
+
return [];
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Crea un nuevo token
|
|
121
|
+
* @param {Object} tokenData - Datos del token
|
|
122
|
+
* @returns {Promise<Object>} - Token creado
|
|
123
|
+
*/
|
|
124
|
+
async createToken(tokenData) {
|
|
125
|
+
try {
|
|
126
|
+
const result = await this.queryBuilder
|
|
127
|
+
.reset()
|
|
128
|
+
.insert(tokenData);
|
|
129
|
+
|
|
130
|
+
// Obtener y devolver el token recién creado
|
|
131
|
+
return await this.queryBuilder
|
|
132
|
+
.reset()
|
|
133
|
+
.select('*')
|
|
134
|
+
.where('id', result.insertId)
|
|
135
|
+
.first();
|
|
136
|
+
} catch (error) {
|
|
137
|
+
console.error('[ERROR] TokenModel.createToken:', error);
|
|
138
|
+
throw error;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Revoca un token marcándolo como inhabilitado
|
|
144
|
+
* @param {string} token - Token a revocar
|
|
145
|
+
* @returns {Promise<boolean>} - True si se revocó correctamente
|
|
146
|
+
*/
|
|
147
|
+
async revokeToken(token) {
|
|
148
|
+
try {
|
|
149
|
+
const result = await this.queryBuilder
|
|
150
|
+
.reset()
|
|
151
|
+
.update({
|
|
152
|
+
revoked: 1,
|
|
153
|
+
revoked_at: new Date()
|
|
154
|
+
})
|
|
155
|
+
.where('token', token);
|
|
156
|
+
|
|
157
|
+
return result.affectedRows > 0;
|
|
158
|
+
} catch (error) {
|
|
159
|
+
console.error(`[ERROR] TokenModel.revokeToken:`, error);
|
|
160
|
+
throw error;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Revoca todos los tokens de un usuario
|
|
166
|
+
* @param {number} userId - ID del usuario
|
|
167
|
+
* @returns {Promise<number>} - Número de tokens revocados
|
|
168
|
+
*/
|
|
169
|
+
async revokeAllUserTokens(userId) {
|
|
170
|
+
try {
|
|
171
|
+
const result = await this.queryBuilder
|
|
172
|
+
.reset()
|
|
173
|
+
.update({
|
|
174
|
+
revoked: 1,
|
|
175
|
+
revoked_at: new Date()
|
|
176
|
+
})
|
|
177
|
+
.where('user_id', userId);
|
|
178
|
+
|
|
179
|
+
return result.affectedRows;
|
|
180
|
+
} catch (error) {
|
|
181
|
+
console.error(`[ERROR] TokenModel.revokeAllUserTokens:`, error);
|
|
182
|
+
throw error;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Verifica si un token está revocado
|
|
188
|
+
* @param {string} token - Token a verificar
|
|
189
|
+
* @returns {Promise<boolean>} - True si el token está revocado
|
|
190
|
+
*/
|
|
191
|
+
async isTokenRevoked(token) {
|
|
192
|
+
try {
|
|
193
|
+
const tokenRecord = await this.queryBuilder
|
|
194
|
+
.reset()
|
|
195
|
+
.select(['revoked'])
|
|
196
|
+
.where('token', token)
|
|
197
|
+
.first();
|
|
198
|
+
|
|
199
|
+
return tokenRecord ? tokenRecord.revoked === 1 : true;
|
|
200
|
+
} catch (error) {
|
|
201
|
+
console.error(`[ERROR] TokenModel.isTokenRevoked:`, error);
|
|
202
|
+
return true; // En caso de error, asumir que está revocado por seguridad
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
module.exports = TokenModel;
|