utn-cli 2.0.38 → 2.0.40

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "utn-cli",
3
- "version": "2.0.38",
3
+ "version": "2.0.40",
4
4
  "description": "Herramienta CLI unificada para la gestión de plantillas en SIGU.",
5
5
  "main": "index.js",
6
6
  "type": "module",
@@ -23,6 +23,25 @@ Router.get('/funcionDeEjemplo', async (solicitud, respuesta, next) => {
23
23
  }
24
24
  });
25
25
 
26
+ // Router.get('/listarArchivosExterno/:Etiquetas', async (solicitud, respuesta, next) => {
27
+ // try {
28
+ // if (await Miscelaneo.validarTokenV2(solicitud.headers.authorization) && await Miscelaneo.validarAccesoDelOrigen(solicitud)) {
29
+ // try {
30
+ // const Datos = { Etiquetas: solicitud.params.Etiquetas };
31
+ // Datos.Token = solicitud.headers.authorization;
32
+ // return respuesta.json({ body: await Miscelaneo.listarArchivosExterno(Datos), error: undefined });
33
+ // } catch (error) {
34
+ // const MensajeDeError = 'No fue posible obtener los arcvhivos';
35
+ // console.error(new ManejadorDeErrores(MensajeDeError, ManejadorDeErrores.obtenerNumeroDeLinea(), true, `Dirección IP: ${solicitud.ip}`));
36
+ // return respuesta.status(500).json({ body: undefined, error: MensajeDeError });
37
+ // }
38
+ // }
39
+ // return respuesta.status(401).json({ body: undefined, error: ManejadorDeErrores.mensajeDeError401() });
40
+ // } catch (error) {
41
+ // next(error);
42
+ // }
43
+ // });
44
+
26
45
  // Router.get("/descargarArchivo/:ArchivoId", async (solicitud, respuesta, next) => {
27
46
  // try {
28
47
  // if (await Miscelaneo.validarToken(solicitud.headers.authorization) && await Miscelaneo.validarAccesoDelOrigen(solicitud)) {
@@ -368,7 +368,6 @@ class Miscelaneo {
368
368
  return;
369
369
  }
370
370
 
371
-
372
371
  async Autenticar(Solicitud) {
373
372
  const crypto = require('crypto');
374
373
  const bcrypt = require('bcryptjs');
@@ -384,8 +383,7 @@ class Miscelaneo {
384
383
  if (Resultado) {
385
384
  console.log("La clave brindada para el usuario", Solicitud.body.Identificacion, "coincide");
386
385
  const Token = await jwt.sign({ Identificador: Identificador, uid: Identificador }, await this.palabraSecretaParaTokens(), { expiresIn: '2h' });
387
- await ConexionSigu.query("INSERT INTO `SIGU`.`SIGU_Sesiones` VALUES (?, ?, ?, NOW(4), ?) ON DUPLICATE KEY UPDATE `Token` = ?, `LastUser` = ?", [Identificador, Solicitud.headers.host.trim(), Token, LastUser, Token, LastUser]
388
- );
386
+ await ConexionSigu.query("INSERT INTO `SIGU`.`SIGU_Sesiones` VALUES (?, ?, ?, NOW(4), ?) ON DUPLICATE KEY UPDATE `Token` = ?, `LastUser` = ?", [Identificador, Solicitud.headers.host.trim(), Token, LastUser, Token, LastUser]);
389
387
  await ConexionSigu.query("DELETE FROM `SIGU`.`SIGU_SesionesFallidas` WHERE `Identificador` = ?", [Identificador]);
390
388
  const permisos = await ConexionSigu.query("\
391
389
  WITH RECURSIVE`ModulosJerarquia` AS( \
@@ -431,7 +429,6 @@ class Miscelaneo {
431
429
  WHERE `Identificador` = ? AND `DireccionUsadaPorElUsuario` = ?", [Identificador, ipUsuario]);
432
430
  if (ipExiste[0][0].Total === 0) {
433
431
  console.log("IP nueva detectada para el usuario, iniciando 2FA");
434
-
435
432
  // GENERAR CODIGO 2FA
436
433
  let Codigo2FA = await ConexionSigu.query("SELECT UUID() AS `Dato`");
437
434
  Codigo2FA = Codigo2FA[0][0].Dato;
@@ -459,11 +456,10 @@ class Miscelaneo {
459
456
  "Código de verificación 2FA",
460
457
  "<p>Hemos recibido su solicitud de acceso para 2FA.</p>" +
461
458
  "<p>Para continuar con el proceso, por favor utilice el siguiente código único de verificación:</p>" +
462
- "<h2>" + Codigo2FA + "</h2>" +
459
+ "<p>" + Codigo2FA + "</p>" +
463
460
  "<p>Si usted no inició este proceso, puede ignorar este mensaje.</p>"
464
461
  );
465
462
  return { Requiere2FA: true };
466
-
467
463
  }
468
464
 
469
465
  // SI LA IP YA EXISTE CONTINUA
@@ -477,7 +473,7 @@ class Miscelaneo {
477
473
  LastUser,
478
474
  LastUser
479
475
  ]);
480
- return { Token, Dominio: ((process.env.ENV || 'local') === 'production' ? '.sigu.utn.ac.cr' : '.181.193.85.44.nip.io') };
476
+ return { Token, Dominio: ((process.env.ENV || 'local') === 'production' ? '.sigu.utn.ac.cr' : '-') };
481
477
 
482
478
  } else {
483
479
  console.log("La clave brindada para el usuario", Solicitud.body.Identificacion, "no conincide");
@@ -560,20 +556,11 @@ class Miscelaneo {
560
556
  );
561
557
 
562
558
  // Registrar sesión
563
- await ConexionSigu.query(" \
564
- INSERT INTO `SIGU`.`SIGU_Sesiones` \
565
- VALUES (?, ?, ?, NOW(4), ?) \
566
- ON DUPLICATE KEY UPDATE `Token` = ?, `LastUser` = ?", [
567
- Identificador,
568
- Solicitud.headers.host.trim(),
569
- Token,
570
- LastUser,
571
- Token,
572
- LastUser
573
- ]);
559
+ await ConexionSigu.query("INSERT INTO `SIGU`.`SIGU_Sesiones` VALUES (?, ?, ?, NOW(4), ?) ON DUPLICATE KEY UPDATE `Token` = ?, `LastUser` = ?"
560
+ , [Identificador, Solicitud.headers.host.trim(), Token, LastUser, Token, LastUser]);
574
561
  return {
575
562
  Token,
576
- Dominio: ((process.env.ENV || 'local') === 'production' ? '.sigu.utn.ac.cr' : '.181.193.85.44.nip.io')
563
+ Dominio: ((process.env.ENV || 'local') === 'production' ? '.sigu.utn.ac.cr' : '-')
577
564
  };
578
565
  } catch (error) {
579
566
  console.log(error);
@@ -592,7 +579,7 @@ class Miscelaneo {
592
579
 
593
580
  async obtenerDetalleDelModulo() {
594
581
  const Modulos = await ejecutarConsultaSIGU("SELECT `a`.`Nombre`, `a`.`Padre`, `a`.`Descripcion`, `a`.`Detalle`,\
595
- `a`.`Tipo`, CONCAT('https://storage.sigu.utn.ac.cr/images/cards/', `a`.`Icono`) AS `Icono`, `a`.`Color`, `a`.`Correo`,\
582
+ `a`.`Tipo`, IF(`a`.`Icono` <> '', CONCAT('https://storage.sigu.utn.ac.cr/images/cards/', `a`.`Icono`), '') AS `Icono`, `a`.`Color`, `a`.`Correo`,\
596
583
  `a`.`Version`, `a`.`FechaDePublicacion`, `a`.`AcuerdoDeNivelDeServicio`, `a`.`DiccionarioDeDatos`, `a`.`Repositorios`,\
597
584
  `a`.`EnlaceDelVideo`,`a`.`EnlaceDelManual`\
598
585
  , `a`.`Estado`, REGEXP_SUBSTR(`a`.`Repositorios`, '[^,]*front[^,]*') AS `Frontend`\
@@ -658,7 +645,7 @@ class Miscelaneo {
658
645
  const Permisos = await ejecutarConsultaSIGU("SELECT `PermisoId` FROM `SIGU`.`SIGU_PermisosPersonasV2` WHERE `Identificador` = ?"
659
646
  , [Resultado.uid]);
660
647
  const Modulos = await ejecutarConsultaSIGU("SELECT `a`.`Nombre`, `a`.`Padre`, `a`.`Descripcion`, `a`.`Detalle`,\
661
- `a`.`Tipo`, CONCAT('https://storage.sigu.utn.ac.cr/images/cards/', `a`.`Icono`) AS `Icono`, `a`.`Color`, `a`.`Correo`,\
648
+ `a`.`Tipo`, IF(`a`.`Icono` <> '', CONCAT('https://storage.sigu.utn.ac.cr/images/cards/', `a`.`Icono`), '') AS `Icono`, `a`.`Color`, `a`.`Correo`,\
662
649
  `a`.`Version`, `a`.`FechaDePublicacion`, `a`.`AcuerdoDeNivelDeServicio`, `a`.`DiccionarioDeDatos`, `a`.`Repositorios`,\
663
650
  `a`.`EnlaceDelVideo`,`a`.`EnlaceDelManual`\
664
651
  , `a`.`Estado`, REGEXP_SUBSTR(`a`.`Repositorios`, '[^,]*front[^,]*') AS `Frontend`\
@@ -916,7 +903,7 @@ class Miscelaneo {
916
903
  return ((process.env.ENV || 'local') === 'production' ? 'https' : 'http')
917
904
  + '://' + Modulo
918
905
  + ((process.env.ENV || 'local') === 'production' ? '' : '-' + (process.env.ENV || 'local'))
919
- + ((process.env.ENV || 'local') === 'production' ? '.sigu.utn.ac.cr' : '.181.193.85.44.nip.io');
906
+ + ((process.env.ENV || 'local') === 'production' ? '.sigu.utn.ac.cr' : '-');
920
907
  }
921
908
 
922
909
  async registroDelModuloEnSIGU() {
@@ -1273,7 +1260,7 @@ class Miscelaneo {
1273
1260
  // Validación del token en la sesión
1274
1261
  const tokenAlmacenado = await ejecutarConsultaSIGU("SELECT COUNT(*) AS `Total` FROM `SIGU`.`SIGU_Sesiones`\
1275
1262
  WHERE `Identificador` = ? AND `Token` = ?", [Resultado.uid, Resultado.token]);
1276
- if (tokenAlmacenado[0]['Total'] >= 1) { // Se compara con >= para preveer multisesiones
1263
+ if (tokenAlmacenado[0]['Total'] >= 1) {
1277
1264
  // Validación de permisos
1278
1265
  const rolPermisoId = await this.permisoIdV2();
1279
1266
  const permisos = await ejecutarConsultaSIGU("SELECT COUNT(*) AS `Total` FROM `SIGU`.`SIGU_PermisosPersonasV2`\
@@ -1962,6 +1949,27 @@ class Miscelaneo {
1962
1949
  }
1963
1950
  }
1964
1951
 
1952
+ async listarArchivosExterno(Datos) {
1953
+ const Partes = Datos.Etiquetas.split('--');
1954
+ const Etiquetas = Partes.slice(0, -1).join("--");
1955
+ const partes = Datos.Etiquetas.split('--');
1956
+ const ultimaParte = partes[partes.length - 1].split('=')[1];
1957
+ let Resultado = undefined;
1958
+ try {
1959
+ Resultado = await this.obtenerDatosDelUsuario(Datos.Token);
1960
+ if (!Resultado) {
1961
+ throw new ManejadorDeErrores(ManejadorDeErrores.mensajeDeErrorVerificacionDeToken(), ManejadorDeErrores.obtenerNumeroDeLinea());
1962
+ }
1963
+ } catch (error) {
1964
+ console.log(error);
1965
+ return;
1966
+ }
1967
+ return await ejecutarConsulta("SELECT `ArchivoId`, `Identificador`, `Ruta`, CONCAT(`Nombre`, ' (', DATE_FORMAT(`LastUpdate`, '%Y-%M-%d %H:%i'), ')') AS `Nombre`, `Etiquetas`\
1968
+ FROM `" + this.NombreDelRepositorioDeLaBaseDeDatos.slice(0, -3) + "`.`Archivos`\
1969
+ WHERE `Identificador` = ?"
1970
+ , [Etiquetas]);
1971
+ }
1972
+
1965
1973
  async borrarArchivo(Datos) {
1966
1974
  let Resultado = undefined;
1967
1975
  try {
@@ -36,7 +36,7 @@
36
36
  }
37
37
  }
38
38
  <div class="pie">
39
- <button mat-button [disabled]="!EsEditable" (click)="SubirArchivo()">Guardar</button>
40
39
  <button mat-button (click)="Cancelar()">Cerrar</button>
40
+ <button mat-button [disabled]="!EsEditable" (click)="SubirArchivo()">Guardar</button>
41
41
  </div>
42
42
  </div>
@@ -37,7 +37,7 @@
37
37
  background-color: #0069B4 !important;
38
38
  }
39
39
 
40
- .Activa, .Activo, .Finalizado, .Aprobada, .Aprobado, .Ejecutando, .Autorizado, .Aperturado, .Ejecutada {
40
+ .Activa, .Activo, .Finalizado, .Aprobada, .Aprobado, .Ejecutando, .Autorizado, .Aperturado, .Ejecutada, .Confirmada {
41
41
  background-color: #518a5f;
42
42
  color: white;
43
43
  padding: 8px 16px;
@@ -37,6 +37,7 @@
37
37
  flex-direction: column;
38
38
  justify-content: space-between;
39
39
  margin: 10px;
40
+ cursor: pointer;
40
41
  }
41
42
 
42
43
  .modulo-card:hover {
@@ -3,7 +3,11 @@
3
3
  push_pin
4
4
  </span>
5
5
  <div class="modulo-header">
6
+ @if(modulo.Icono) {
6
7
  <img src="{{ modulo.Icono }}" class="modulo-icon" />
8
+ } @else {
9
+ <div class="modulo-icon"></div>
10
+ }
7
11
  <div>
8
12
  <!-- <h2 class="modulo-nombre">{{ modulo.Nombre }}</h2> -->
9
13
  <span class="modulo-tipo tipo-{{ modulo.Tipo.toLowerCase() }}">{{ modulo.Tipo }}</span>
@@ -123,7 +123,10 @@ export class ContenedorComponentesComponent {
123
123
  }
124
124
 
125
125
  irAtras(): void {
126
- this.location.back();
126
+ const rutaActual = this.location.path();
127
+ if (rutaActual !== '' && !rutaActual.includes('accesov2')) {
128
+ this.location.back();
129
+ }
127
130
  }
128
131
 
129
132
  irAlMenuDeModulo(): void {
@@ -38,7 +38,7 @@ export class DatosGlobalesService {
38
38
  // } else {
39
39
  // this.claseDelContenedor = 'contenedor';
40
40
  // }
41
- // portalv2-frontend-pruebas.181.193.85.44.nip.io
41
+ // portalv2-frontend-pruebas
42
42
  // const protocolo = new URL(window.location.href).protocol
43
43
  window.location.href = 'https://accesov2-frontend.sigu.utn.ac.cr/';
44
44
  }
@@ -53,7 +53,7 @@ export class DatosGlobalesService {
53
53
  // } else {
54
54
  // this.claseDelContenedor = 'contenedor';
55
55
  // }
56
- // portalv2-frontend-pruebas.181.193.85.44.nip.io
56
+ // portalv2-frontend-pruebas
57
57
  // const protocolo = new URL(window.location.href).protocol
58
58
  window.location.href = 'https://portalv2-frontend.sigu.utn.ac.cr/';
59
59
  }