фикс
This commit is contained in:
parent
e8c839d493
commit
489f718fec
@ -29,8 +29,8 @@ const isBrowser = typeof window !== 'undefined' && typeof document !== 'undefine
|
|||||||
console.log('Инициализация системы безопасности устройств...');
|
console.log('Инициализация системы безопасности устройств...');
|
||||||
await deviceSecurityService.initialize();
|
await deviceSecurityService.initialize();
|
||||||
|
|
||||||
// Подписываемся на события блокировки устройства
|
// Исправлено: Используем правильный метод onDeviceBlock вместо onDeviceBlocked
|
||||||
deviceSecurityService.onDeviceBlocked(handleDeviceBlocked);
|
deviceSecurityService.onDeviceBlock(handleDeviceBlocked);
|
||||||
|
|
||||||
console.log('Система безопасности устройств инициализирована');
|
console.log('Система безопасности устройств инициализирована');
|
||||||
|
|
||||||
|
@ -18,6 +18,7 @@ class DeviceSecurityService {
|
|||||||
this.suspiciousActivities = [];
|
this.suspiciousActivities = [];
|
||||||
this.lastFingerprintCheck = null;
|
this.lastFingerprintCheck = null;
|
||||||
this.checkInterval = null;
|
this.checkInterval = null;
|
||||||
|
this.blockCallbacks = []; // Добавляем массив для хранения колбэков блокировки
|
||||||
|
|
||||||
// Настройки мониторинга
|
// Настройки мониторинга
|
||||||
this.config = {
|
this.config = {
|
||||||
@ -277,6 +278,17 @@ class DeviceSecurityService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Добавляет обработчик события блокировки устройства
|
||||||
|
* @param {Function} callback Функция обратного вызова
|
||||||
|
*/
|
||||||
|
onDeviceBlock(callback) {
|
||||||
|
if (typeof callback === 'function' && !this.blockCallbacks.includes(callback)) {
|
||||||
|
this.blockCallbacks.push(callback);
|
||||||
|
console.log('[DeviceSecurity] Добавлен обработчик события блокировки устройства');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Обработка блокировки устройства
|
* Обработка блокировки устройства
|
||||||
*/
|
*/
|
||||||
@ -289,6 +301,17 @@ class DeviceSecurityService {
|
|||||||
// Очищаем локальные данные
|
// Очищаем локальные данные
|
||||||
this.clearLocalData();
|
this.clearLocalData();
|
||||||
|
|
||||||
|
// Вызываем все зарегистрированные обработчики
|
||||||
|
if (this.blockCallbacks && this.blockCallbacks.length > 0) {
|
||||||
|
this.blockCallbacks.forEach(callback => {
|
||||||
|
try {
|
||||||
|
callback(blockInfo);
|
||||||
|
} catch (e) {
|
||||||
|
console.error('[DeviceSecurity] Ошибка в обработчике блокировки устройства:', e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// Показываем уведомление пользователю
|
// Показываем уведомление пользователю
|
||||||
this.showBlockedNotification(blockInfo);
|
this.showBlockedNotification(blockInfo);
|
||||||
|
|
||||||
|
@ -175,54 +175,51 @@ class DeviceFingerprint {
|
|||||||
|
|
||||||
return new Promise((resolve) => {
|
return new Promise((resolve) => {
|
||||||
try {
|
try {
|
||||||
|
// Если AudioContext недоступен, просто пропускаем этот шаг
|
||||||
if (!window.AudioContext && !window.webkitAudioContext) {
|
if (!window.AudioContext && !window.webkitAudioContext) {
|
||||||
|
console.warn('[DeviceFingerprint] AudioContext не поддерживается');
|
||||||
|
this.components.set('audio', 'not-available');
|
||||||
resolve();
|
resolve();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const AudioContext = window.AudioContext || window.webkitAudioContext;
|
// Создаём аудио хэш на основе доступных properties AudioContext
|
||||||
const context = new AudioContext();
|
// без использования ScriptProcessorNode
|
||||||
|
const createAudioFingerprintFallback = () => {
|
||||||
|
try {
|
||||||
|
const AudioContext = window.AudioContext || window.webkitAudioContext;
|
||||||
|
const context = new AudioContext();
|
||||||
|
|
||||||
const oscillator = context.createOscillator();
|
const audioProps = {
|
||||||
const analyser = context.createAnalyser();
|
sampleRate: context.sampleRate,
|
||||||
const gainNode = context.createGain();
|
state: context.state,
|
||||||
const scriptProcessor = context.createScriptProcessor(4096, 1, 1);
|
baseLatency: context.baseLatency || 0,
|
||||||
|
outputLatency: context.outputLatency || 0
|
||||||
|
};
|
||||||
|
|
||||||
oscillator.type = 'triangle';
|
// Преобразуем эти свойства в хэш
|
||||||
oscillator.frequency.value = 10000;
|
const audioHash = this.simpleHash(JSON.stringify(audioProps));
|
||||||
|
this.components.set('audio', audioHash);
|
||||||
|
|
||||||
gainNode.gain.value = 0;
|
// Закрываем context
|
||||||
|
if (context.state !== 'closed') {
|
||||||
|
context.close();
|
||||||
|
}
|
||||||
|
|
||||||
oscillator.connect(analyser);
|
resolve();
|
||||||
analyser.connect(scriptProcessor);
|
} catch (e) {
|
||||||
scriptProcessor.connect(gainNode);
|
console.warn('[DeviceFingerprint] Ошибка в audio fingerprint fallback:', e);
|
||||||
gainNode.connect(context.destination);
|
this.components.set('audio', 'error');
|
||||||
|
resolve();
|
||||||
scriptProcessor.onaudioprocess = async (event) => {
|
}
|
||||||
const bins = new Float32Array(analyser.frequencyBinCount);
|
|
||||||
analyser.getFloatFrequencyData(bins);
|
|
||||||
|
|
||||||
const audioHash = await this.hashString(bins.slice(0, 50).join(','));
|
|
||||||
this.components.set('audio', audioHash);
|
|
||||||
|
|
||||||
oscillator.disconnect();
|
|
||||||
context.close();
|
|
||||||
resolve();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
oscillator.start();
|
// Используем безопасный fallback вместо устаревшего ScriptProcessor
|
||||||
|
// и AudioWorklet (который требует отдельного файла и https)
|
||||||
// Таймаут на случай проблем
|
createAudioFingerprintFallback();
|
||||||
setTimeout(() => {
|
|
||||||
try {
|
|
||||||
oscillator.disconnect();
|
|
||||||
context.close();
|
|
||||||
} catch (e) {}
|
|
||||||
resolve();
|
|
||||||
}, 1000);
|
|
||||||
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.warn('[DeviceFingerprint] Не удалось создать audio fingerprint:', e);
|
console.warn('[DeviceFingerprint] Не удалось создать audio fingerprint:', e);
|
||||||
|
this.components.set('audio', 'error');
|
||||||
resolve();
|
resolve();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user