{"version":3,"file":"ngx-redi-core-Security.mjs","sources":["../../../projects/ngx-redi-core/Security/src/modules/security.module.ts","../../../projects/ngx-redi-core/Security/src/modules/security-web-intercept/models/secure-factory.model.ts","../../../projects/ngx-redi-core/Security/src/modules/security-web-intercept/services/cifrado.service.ts","../../../projects/ngx-redi-core/Security/src/modules/security-web-intercept/services/reflection.service.ts","../../../projects/ngx-redi-core/Security/src/modules/security-web-intercept/interceptors/redi-secure.interceptor.ts","../../../projects/ngx-redi-core/Security/src/modules/security-web-intercept/services/cifrado-basico.service.ts","../../../projects/ngx-redi-core/Security/ngx-redi-core-Security.ts"],"sourcesContent":["import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n/**\r\n * Modulo de seguridad\r\n * @decorators `@NgModule`\r\n */\r\n@NgModule({\r\n  declarations: [],\r\n  imports: [\r\n    CommonModule\r\n  ],\r\n  exports: []\r\n})\r\nexport class SecurityModule { }\r\n","import 'reflect-metadata';\r\n\r\n/**\r\n * Fabrica de decoradores para del modulo de seguridad\r\n * @param cipher Indica el algoritmo de cifrado\r\n */\r\nexport function secure(cipher?: string) {\r\n    /**\r\n     * Función para la fabrica de decoradores de clases y propiedades\r\n     * @param target Target del decorador\r\n     * @param propertyKey Nombre de la propiedad\r\n     * @returns Function de devolución para la fabrica de decoradores\r\n     */\r\n    return function (target: unknown, propertyKey?: string) {\r\n        if (propertyKey) {\r\n            Reflect.defineProperty(target as any, propertyKey, { writable: true });\r\n            Reflect.defineMetadata(TOKEN_SECURE, cipher, target as any, propertyKey);\r\n        }\r\n        else {\r\n            Reflect.defineMetadata(TOKEN_SECURE, cipher, (target as any).prototype);\r\n        }\r\n    };\r\n}\r\n\r\n/**\r\n * Token para decorador de seguridad\r\n */\r\nexport const TOKEN_SECURE = secure.name;\r\n","import { Injectable } from '@angular/core';\r\n\r\n/**\r\n * Servicio de cifrado y descifrado de información\r\n * @decorator `@Injectable()`\r\n */\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class CifradoService {\r\n\r\n  /**\r\n   * Método que realiza el cifrado de los datos tipo Texto\r\n   * @param data - Texto a cifrar\r\n   * @returns Datos cifrados en modo tex\r\n   */\r\n  public cifrar(data: string): string {\r\n    return window.btoa(encodeURIComponent(data));\r\n  }\r\n\r\n  /**\r\n   * Método que descifra el texto\r\n   * @params data - Texto a descifrar\r\n   * @returns Texto descifrado\r\n   */\r\n  public descifrar(data: string): string {\r\n    return window.atob(decodeURIComponent(data));\r\n  }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { TOKEN_SECURE } from '../models/secure-factory.model';\r\nimport { CifradoService } from './cifrado.service';\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class ReflectionService {\r\n  constructor(private readonly cifradoService: CifradoService) { }\r\n  /**\r\n   * Valida si la propiedad de un objeto es segura\r\n   * @param data - Objeto a validar\r\n   * @param key - Propiedad del objeto a validar\r\n   * @returns True si es una propiedad segura\r\n   */\r\n  private isValidDecorator(data: unknown, key: string): boolean {\r\n    return data != null && this.propertyHasDecorator(data, key);\r\n  }\r\n\r\n  /**\r\n   * Valida si la propiedad tiene el decorador de seguridad\r\n   * @param data - Entidad objetivo\r\n   * @param key - Nombre de la propiedad\r\n   */\r\n  private propertyHasDecorator(data: unknown, key: string): boolean {\r\n    return Reflect.hasMetadata(TOKEN_SECURE, data ?? {}, key);\r\n  }\r\n\r\n  /**\r\n   * Valida si un objeto es seguro\r\n   * @param data - Objeto a validar\r\n   * @returns True si existe el decorador @Secure\r\n   */\r\n  private hasDecorator(data: unknown): boolean {\r\n    return data != null && Reflect.hasMetadata(TOKEN_SECURE, data);\r\n  }\r\n\r\n  /**\r\n   * Valida si es un objeto y no esta nulo\r\n   * @param object - Objeto a validar\r\n   * @returns True si es un objeto valido\r\n   */\r\n  private isValidObject(object: unknown): boolean {\r\n    return object != null && typeof object === 'object';\r\n  }\r\n\r\n  /**\r\n   * Cifra los datos especificados\r\n   * @param datos - Datos a cifrar\r\n   * @returns Regresa el objeto con los datos cifrados\r\n   */\r\n  public cifrarDatos(datos: unknown): any {\r\n    if (this.isValidObject(datos)) {\r\n      const contenedor: any = Array.isArray(datos) ? [] : {};\r\n      Object.entries(datos ?? {}).forEach(([key, value]) => {\r\n        if (this.isValidObject(value)) {\r\n          contenedor[key] = this.cifrarDatos(value);\r\n        }\r\n        else if (this.isValidDecorator(datos, key)) {\r\n          contenedor[key] = this.cifrarTexto(value as string);\r\n        }\r\n        else {\r\n          contenedor[key] = value;\r\n        }\r\n      });\r\n      return this.hasDecorator(datos) ? this.cifrarTexto(JSON.stringify(contenedor)) : contenedor;\r\n    }\r\n    return datos;\r\n  }\r\n\r\n  /**\r\n   * Descifra los datos a partir de una definición\r\n   * @param datos - Datos a descifrar\r\n   * @param definition - Definición de los datos con los decoradores seguros\r\n   * @returns Datos descifrados\r\n   */\r\n  public descifrarDatos(datos: unknown, definition: unknown): any {\r\n    let contenedor: unknown = datos;\r\n    if (datos && definition) {\r\n\r\n      if (Array.isArray(datos)) {\r\n        contenedor = [];\r\n        Object.entries(datos).forEach(([, value]) => {\r\n          (contenedor as Array<unknown>).push(this.descifrarDatos(value, definition));\r\n        });\r\n      }\r\n      else {\r\n        contenedor = {};\r\n        Object.entries(datos).forEach(([key, value]) => {\r\n          if (this.isValidObject(value)) {\r\n            (contenedor as any)[key] = this.descifrarDatos(value, (definition as any).prototype[key]);\r\n          }\r\n          else if (this.propertyHasDecorator((definition as any).prototype, key)) {\r\n            (contenedor as any)[key] = this.decifrarTexto(value as string);\r\n          }\r\n          else {\r\n            (contenedor as any)[key] = value;\r\n          }\r\n        });\r\n      }\r\n    }\r\n    return contenedor as any;\r\n  }\r\n\r\n  /**\r\n   * Cifra el texto especificado\r\n   * @param datos - Contiene los datos que se cifraran\r\n   * @returns Datos cifrados\r\n   */\r\n  private cifrarTexto(datos: string): string {\r\n    return this.cifradoService.cifrar(datos);\r\n  }\r\n\r\n  /**\r\n   * Descifra el texto proporcionado\r\n   * @param datos - Contiene los datos que se descifraran\r\n   * @returns Datos descifrados\r\n   */\r\n  private decifrarTexto(datosCifrados: string): string {\r\n    return this.cifradoService.descifrar(datosCifrados);\r\n  }\r\n}\r\n","import 'reflect-metadata';\r\nimport { Injectable } from '@angular/core';\r\nimport {\r\n  HttpRequest,\r\n  HttpHandler,\r\n  HttpEvent,\r\n  HttpInterceptor,\r\n  HttpContextToken,\r\n  HttpResponse\r\n} from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\nimport { ReflectionService } from '../services/reflection.service';\r\n\r\n/** Request token para el contexto Http */\r\nexport const REQUEST_TOKEN = new HttpContextToken<unknown>(() => { });\r\n/** Response token para el contexto Http */\r\nexport const RESPONSE_TOKEN = new HttpContextToken<unknown>(() => { });\r\n\r\n/**\r\n * Interceptor de seguridad que cifra y descifra información sensible en las peticiones Web\r\n * @decorator `@Injectable()`\r\n */\r\n@Injectable()\r\nexport class RediSecureInterceptor implements HttpInterceptor {\r\n  constructor(private readonly reflectionService: ReflectionService) { }\r\n\r\n  intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {\r\n    /** Ciframos los datos de la petición */\r\n    return next.handle(this.cifrarRequest(request))\r\n      .pipe(map(event => {\r\n        if (event instanceof HttpResponse) {\r\n          return (event as any).clone({\r\n            body: this.descifrarResponse(request, event)\r\n          });\r\n        }\r\n        return event;\r\n      }));\r\n  }\r\n\r\n  /**\r\n   * Regresa una respuesta HTTP descifrada\r\n   * @param request - Petición web\r\n   * @param response - Respuesta web a descifrar\r\n   * @returns Respuesta http descifrada\r\n   */\r\n  private descifrarResponse(request: HttpRequest<unknown>, response: HttpResponse<unknown>): unknown {\r\n    const responseDefinition = request.context.get(RESPONSE_TOKEN);\r\n    if (responseDefinition && response.body) {\r\n      return this.reflectionService.descifrarDatos(response.body, responseDefinition);\r\n    }\r\n    return response.body;\r\n  }\r\n\r\n  /**\r\n   * Cifra los datos de la petición interceptada y regresa una nueva petición con los datos cifrados\r\n   * @param request - Petición Http\r\n   * @returns - Petición con datos cifrados\r\n   */\r\n  private cifrarRequest(request: HttpRequest<unknown>): HttpRequest<unknown> {\r\n    return request.method === 'POST' ?\r\n      request.clone({ body: this.reflectionService.cifrarDatos(request.body) }) :\r\n      request.clone({ url: this.cifrarPeticionUrl(request) });\r\n  }\r\n\r\n  /**\r\n   * Realiza el cifrado de la petición cuando los datos a cifrar se mandan en la URL\r\n   * @param request - Petición HTTP\r\n   * @returns StringQueryParams cifrados en URL\r\n   */\r\n  private cifrarPeticionUrl(request: HttpRequest<unknown>): string {\r\n    const requestData = request.context.get(REQUEST_TOKEN);\r\n    const queryParams: string[] = [];\r\n    const queryObject: any = {};\r\n    new URL(request.url).searchParams.forEach((value, key) => {\r\n      queryObject[key] = value;\r\n    });\r\n    if (typeof requestData === 'object') {\r\n      Object.entries(queryObject).forEach(([key, value]) => {\r\n        if (!(requestData as any)[key]) {\r\n          (requestData as any)[key] = value;\r\n        }\r\n      });\r\n      Object.entries(this.reflectionService.cifrarDatos(requestData)).forEach(([key, value]) => {\r\n        if (value && typeof value !== 'object') {\r\n          queryParams.push(`${key}=${encodeURI((value) as string)}`);\r\n        }\r\n      });\r\n    }\r\n    const paramsString = queryParams.length ? `?${queryParams.join('&')}` : '';\r\n    const fixedURL = (request.url || '').split('?')[0];\r\n    return `${fixedURL}${paramsString}`;\r\n  }\r\n\r\n}\r\n\r\n","import { Injectable } from '@angular/core';\r\nimport * as CryptoJS from 'crypto-js';\r\n\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class CifradoBasicoService {\r\n  secretPass = 'NGX-REDI-CORE-PASS-DEFAULT';\r\n  llave = CryptoJS.enc.Utf8.parse(this.secretPass);\r\n  llave_tamanio = 256;\r\n\r\n  vector = CryptoJS.lib.WordArray.create(this.llave.words.slice(0, 4));\r\n  vector_tamanio = 128;\r\n  iterations = 100;\r\n\r\n  encrypt_dos(msg: string) {\r\n    const salt = CryptoJS.lib.WordArray.random(128 / 8);\r\n    const key = CryptoJS.PBKDF2(this.secretPass, salt, {\r\n      keySize: this.llave_tamanio / 32,\r\n      iterations: this.iterations\r\n    });\r\n\r\n    const iv = CryptoJS.lib.WordArray.random(128 / 8);\r\n    const encrypted = CryptoJS.AES.encrypt(msg, key, {\r\n      iv: iv,\r\n      padding: CryptoJS.pad.Pkcs7,\r\n      mode: CryptoJS.mode.CBC\r\n    });\r\n\r\n    return salt.toString() + iv.toString() + encrypted.toString();\r\n  }\r\n\r\n\r\n  decrypt_dos(transitmessage: string) {\r\n    const salt = CryptoJS.enc.Hex.parse(transitmessage.substring(0, 32));\r\n    const iv = CryptoJS.enc.Hex.parse(transitmessage.substring(32, 64))\r\n    const encrypted = transitmessage.substring(64);\r\n\r\n    const key = CryptoJS.PBKDF2(this.secretPass, salt, {\r\n      keySize: this.llave_tamanio / 32,\r\n      iterations: this.iterations\r\n    });\r\n\r\n    const decrypted = CryptoJS.AES.decrypt(encrypted, key, {\r\n      iv: iv,\r\n      padding: CryptoJS.pad.Pkcs7,\r\n      mode: CryptoJS.mode.CBC\r\n\r\n    })\r\n    return decrypted.toString(CryptoJS.enc.Utf8);\r\n  }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.CifradoService","i1.ReflectionService"],"mappings":"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"}