Add files via upload

This commit is contained in:
Egor
2026-01-18 05:26:47 +03:00
committed by GitHub
parent 5882c305ef
commit 4d7437f069
2 changed files with 94 additions and 0 deletions

57
src/utils/logger.ts Normal file
View File

@@ -0,0 +1,57 @@
/**
* Утилита для логирования только в development режиме
* В production логи не выводятся
*/
const isDev = import.meta.env.DEV
export const logger = {
log: (...args: unknown[]): void => {
if (isDev) {
console.log(...args)
}
},
warn: (...args: unknown[]): void => {
if (isDev) {
console.warn(...args)
}
},
error: (...args: unknown[]): void => {
// Ошибки логируем всегда (важно для отладки в production)
console.error(...args)
},
debug: (...args: unknown[]): void => {
if (isDev) {
console.debug(...args)
}
},
/**
* Создаёт логгер с префиксом для конкретного модуля
*/
createLogger: (prefix: string) => ({
log: (...args: unknown[]): void => {
if (isDev) {
console.log(`[${prefix}]`, ...args)
}
},
warn: (...args: unknown[]): void => {
if (isDev) {
console.warn(`[${prefix}]`, ...args)
}
},
error: (...args: unknown[]): void => {
console.error(`[${prefix}]`, ...args)
},
debug: (...args: unknown[]): void => {
if (isDev) {
console.debug(`[${prefix}]`, ...args)
}
},
}),
}
export default logger

View File

@@ -253,3 +253,40 @@ class TokenRefreshManager {
}
export const tokenRefreshManager = new TokenRefreshManager()
/**
* Безопасный редирект на страницу логина
* Валидирует URL чтобы предотвратить open redirect уязвимость
*/
export function safeRedirectToLogin(): void {
// Разрешённые пути для редиректа (относительные пути нашего приложения)
const loginPath = '/login'
// Проверяем, что мы на том же origin
if (typeof window !== 'undefined') {
// Используем только относительный путь для безопасности
window.location.href = loginPath
}
}
/**
* Валидирует URL для редиректа
* Возвращает true только для безопасных URL (относительные пути или тот же origin)
*/
export function isValidRedirectUrl(url: string): boolean {
// Пустой URL - небезопасен
if (!url) return false
// Относительные пути всегда безопасны
if (url.startsWith('/') && !url.startsWith('//')) {
return true
}
try {
const parsed = new URL(url, window.location.origin)
// Разрешаем только тот же origin
return parsed.origin === window.location.origin
} catch {
return false
}
}