ngx-dsxlibrary 2.21.12 → 2.21.14
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.
|
@@ -893,6 +893,79 @@ function validateEnvironmentConfig(environment) {
|
|
|
893
893
|
console.warn(`[ENVIRONMENT] Valor no reconocido para 'sweetAlertTheme': '${environment.sweetAlertTheme}'. Temas válidos: ${allowedThemes.join(', ')}. Se usará el tema por defecto de SweetAlert2.`);
|
|
894
894
|
}
|
|
895
895
|
}
|
|
896
|
+
// Validar cookieDomain si está definido
|
|
897
|
+
if (environment.cookieDomain !== undefined) {
|
|
898
|
+
validateCookieDomain(environment.cookieDomain);
|
|
899
|
+
}
|
|
900
|
+
}
|
|
901
|
+
/**
|
|
902
|
+
* Valida que cookieDomain tenga un formato correcto para cookies.
|
|
903
|
+
*
|
|
904
|
+
* Reglas de validación:
|
|
905
|
+
* - Debe ser un string no vacío
|
|
906
|
+
* - Debe empezar con un punto (.)
|
|
907
|
+
* - No puede contener espacios en blanco
|
|
908
|
+
* - Solo puede contener caracteres alfanuméricos, puntos y guiones
|
|
909
|
+
* - Debe tener al menos dos partes separadas por puntos (ej: .inalsa.local)
|
|
910
|
+
*
|
|
911
|
+
* Ejemplos válidos:
|
|
912
|
+
* - `.inalsa.local`
|
|
913
|
+
* - `.express.local`
|
|
914
|
+
* - `.example.com`
|
|
915
|
+
* - `.site.co.uk`
|
|
916
|
+
*
|
|
917
|
+
* Ejemplos inválidos:
|
|
918
|
+
* - `inalsa.local` (falta el punto inicial)
|
|
919
|
+
* - `.inalsa` (necesita al menos dos partes)
|
|
920
|
+
* - `. inalsa.local` (contiene espacios)
|
|
921
|
+
* - `.inalsa..local` (puntos consecutivos)
|
|
922
|
+
*
|
|
923
|
+
* @param cookieDomain - Dominio a validar
|
|
924
|
+
* @throws Error si el dominio tiene un formato inválido
|
|
925
|
+
*/
|
|
926
|
+
function validateCookieDomain(cookieDomain) {
|
|
927
|
+
// Validar tipo de dato
|
|
928
|
+
if (typeof cookieDomain !== 'string') {
|
|
929
|
+
throw new Error(`[ENVIRONMENT] El campo 'cookieDomain' debe ser una cadena de texto. ` +
|
|
930
|
+
`Tipo recibido: ${typeof cookieDomain}. Valor: ${cookieDomain}`);
|
|
931
|
+
}
|
|
932
|
+
const domain = cookieDomain.trim();
|
|
933
|
+
// Validar que no esté vacío
|
|
934
|
+
if (domain.length === 0) {
|
|
935
|
+
throw new Error("[ENVIRONMENT] El campo 'cookieDomain' no puede estar vacío. " +
|
|
936
|
+
'Si no necesitas un dominio compartido, omite este campo.');
|
|
937
|
+
}
|
|
938
|
+
// Validar que empiece con un punto
|
|
939
|
+
if (!domain.startsWith('.')) {
|
|
940
|
+
throw new Error(`[ENVIRONMENT] El campo 'cookieDomain' debe empezar con un punto (.). ` +
|
|
941
|
+
`Valor inválido: '${domain}'. ` +
|
|
942
|
+
"Ejemplo correcto: '.inalsa.local'");
|
|
943
|
+
}
|
|
944
|
+
// Validar que no contenga espacios
|
|
945
|
+
if (/\s/.test(domain)) {
|
|
946
|
+
throw new Error(`[ENVIRONMENT] El campo 'cookieDomain' no puede contener espacios en blanco. ` +
|
|
947
|
+
`Valor inválido: '${domain}'`);
|
|
948
|
+
}
|
|
949
|
+
// Validar caracteres permitidos: alfanuméricos, puntos y guiones
|
|
950
|
+
if (!/^(\.[a-zA-Z0-9-]+)+$/.test(domain)) {
|
|
951
|
+
throw new Error(`[ENVIRONMENT] El campo 'cookieDomain' contiene caracteres no permitidos. ` +
|
|
952
|
+
`Valor inválido: '${domain}'. ` +
|
|
953
|
+
'Solo se permiten caracteres alfanuméricos, puntos (.) y guiones (-). ' +
|
|
954
|
+
"Ejemplo correcto: '.inalsa.local'");
|
|
955
|
+
}
|
|
956
|
+
// Validar que tenga al menos dos partes (ej: .inalsa.local)
|
|
957
|
+
const parts = domain.split('.').filter((part) => part.length > 0);
|
|
958
|
+
if (parts.length < 2) {
|
|
959
|
+
throw new Error(`[ENVIRONMENT] El campo 'cookieDomain' debe tener al menos dos partes separadas por puntos. ` +
|
|
960
|
+
`Valor inválido: '${domain}'. ` +
|
|
961
|
+
"Ejemplos correctos: '.inalsa.local', '.express.local'");
|
|
962
|
+
}
|
|
963
|
+
// Validar que no haya puntos consecutivos
|
|
964
|
+
if (domain.includes('..')) {
|
|
965
|
+
throw new Error(`[ENVIRONMENT] El campo 'cookieDomain' no puede tener puntos consecutivos. ` +
|
|
966
|
+
`Valor inválido: '${domain}'. ` +
|
|
967
|
+
"Ejemplo correcto: '.inalsa.local'");
|
|
968
|
+
}
|
|
896
969
|
}
|
|
897
970
|
/**
|
|
898
971
|
* Valida que una URL tenga un formato válido.
|
|
@@ -1750,6 +1823,29 @@ class AuthorizeService {
|
|
|
1750
1823
|
const privateIpv4Pattern = /^(10\.|192\.168\.|172\.(1[6-9]|2\d|3[0-1])\.)/;
|
|
1751
1824
|
return privateIpv4Pattern.test(normalizedHost);
|
|
1752
1825
|
}
|
|
1826
|
+
/**
|
|
1827
|
+
* Resuelve el dominio a usar para cookies según entorno/host actual.
|
|
1828
|
+
*
|
|
1829
|
+
* Orden de prioridad:
|
|
1830
|
+
* 1. Si `environment.cookieDomain` está configurado, lo usa (para ambientes locales).
|
|
1831
|
+
* 2. Si HTTPS público, usa `.itgtxela.com`.
|
|
1832
|
+
* 3. Si no coincide nada, devuelve undefined (sin dominio compartido).
|
|
1833
|
+
*/
|
|
1834
|
+
resolveCookieDomain(isProduction, isHttps) {
|
|
1835
|
+
if (!isProduction || typeof window === 'undefined') {
|
|
1836
|
+
return undefined;
|
|
1837
|
+
}
|
|
1838
|
+
// 1️⃣ Si está configurado en environment, usarlo (para ambientes locales).
|
|
1839
|
+
if (this.environment.cookieDomain) {
|
|
1840
|
+
return this.environment.cookieDomain;
|
|
1841
|
+
}
|
|
1842
|
+
// 2️⃣ Producción pública con HTTPS: mantener dominio corporativo.
|
|
1843
|
+
if (isHttps) {
|
|
1844
|
+
return '.itgtxela.com';
|
|
1845
|
+
}
|
|
1846
|
+
// 3️⃣ Sin coincidencia: sin dominio compartido.
|
|
1847
|
+
return undefined;
|
|
1848
|
+
}
|
|
1753
1849
|
// Función para obtener opciones de cookies estándar
|
|
1754
1850
|
/**
|
|
1755
1851
|
* Construye las opciones usadas por `CookieService` al crear cookies.
|
|
@@ -1769,15 +1865,16 @@ class AuthorizeService {
|
|
|
1769
1865
|
getCookieOptions(expiryDate) {
|
|
1770
1866
|
const isProduction = this.environment.production;
|
|
1771
1867
|
const isHttps = typeof window !== 'undefined' && window.location?.protocol === 'https:';
|
|
1868
|
+
const cookieDomain = this.resolveCookieDomain(isProduction, isHttps);
|
|
1772
1869
|
const cookieOptions = {
|
|
1773
1870
|
path: '/',
|
|
1774
1871
|
expires: expiryDate,
|
|
1775
1872
|
secure: isHttps,
|
|
1776
1873
|
sameSite: isHttps ? 'None' : 'Lax',
|
|
1777
1874
|
};
|
|
1778
|
-
//
|
|
1779
|
-
if (
|
|
1780
|
-
cookieOptions.domain =
|
|
1875
|
+
// Asignar dominio cuando aplique (público HTTPS o red local .local en producción).
|
|
1876
|
+
if (cookieDomain) {
|
|
1877
|
+
cookieOptions.domain = cookieDomain;
|
|
1781
1878
|
}
|
|
1782
1879
|
if (isProduction && !isHttps) {
|
|
1783
1880
|
console.warn('[AuthorizeService] Entorno en producción pero sin HTTPS. Ajustando opciones de cookie para evitar rechazo por Secure/SameSite.');
|
|
@@ -2118,7 +2215,13 @@ class AuthorizeService {
|
|
|
2118
2215
|
this._cookieService.delete(cookieName, '/');
|
|
2119
2216
|
// En producción, también intentar eliminar con dominio específico
|
|
2120
2217
|
if (this.environment.production) {
|
|
2121
|
-
|
|
2218
|
+
const isHttps = typeof window !== 'undefined' &&
|
|
2219
|
+
window.location?.protocol === 'https:';
|
|
2220
|
+
const dynamicDomain = this.resolveCookieDomain(this.environment.production, isHttps);
|
|
2221
|
+
const domainsToDelete = Array.from(new Set(['.itgtxela.com', dynamicDomain].filter(Boolean)));
|
|
2222
|
+
domainsToDelete.forEach((domain) => {
|
|
2223
|
+
this._cookieService.delete(cookieName, '/', domain);
|
|
2224
|
+
});
|
|
2122
2225
|
}
|
|
2123
2226
|
console.debug(`[AuthorizeService] Cookie eliminada: ${cookieName}`);
|
|
2124
2227
|
}
|