Fix jwt-token
This commit is contained in:
@@ -272,94 +272,10 @@ class AlertService {
|
|||||||
console.log(`✅ Rule "${rule.name}": No device filter (applies to all devices)`);
|
console.log(`✅ Rule "${rule.name}": No device filter (applies to all devices)`);
|
||||||
}
|
}
|
||||||
|
|
||||||
// PRIORITY 2: Critical threats and Orlan drones (security overrides)
|
// PRIORITY 2: Cooldown period check (applies even to critical threats for the same device)
|
||||||
const isOrlanDrone = detection.drone_type === 1;
|
|
||||||
const isCriticalThreat = threatAssessment.level === 'critical';
|
|
||||||
|
|
||||||
if (isOrlanDrone) {
|
|
||||||
console.log(`🚨 ORLAN DRONE DETECTED - Rule "${rule.name}" will trigger (security override)`);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isCriticalThreat) {
|
|
||||||
console.log(`🚨 CRITICAL THREAT DETECTED - Rule "${rule.name}" will trigger (security override)`);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// PRIORITY 3: Threat level requirements
|
|
||||||
if (rule.min_threat_level) {
|
|
||||||
const threatLevels = { 'monitoring': 0, 'low': 1, 'medium': 2, 'high': 3, 'critical': 4 };
|
|
||||||
const requiredLevel = threatLevels[rule.min_threat_level] || 0;
|
|
||||||
const currentLevel = threatLevels[threatAssessment.level] || 0;
|
|
||||||
|
|
||||||
if (currentLevel < requiredLevel) {
|
|
||||||
console.log(`❌ Rule "${rule.name}": Threat level ${threatAssessment.level} below minimum ${rule.min_threat_level}`);
|
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
console.log(`✅ Rule "${rule.name}": Threat level ${threatAssessment.level} meets minimum ${rule.min_threat_level}`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// PRIORITY 4: Drone type filter
|
|
||||||
if (rule.drone_types && rule.drone_types.length > 0 &&
|
|
||||||
!rule.drone_types.includes(detection.drone_type)) {
|
|
||||||
console.log(`❌ Rule "${rule.name}": Drone type ${detection.drone_type} not in allowed types [${rule.drone_types.join(', ')}]`);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// PRIORITY 5: RSSI thresholds (distance-based)
|
|
||||||
if (rule.min_rssi && detection.rssi < rule.min_rssi) {
|
|
||||||
console.log(`❌ Rule "${rule.name}": RSSI ${detection.rssi} below minimum ${rule.min_rssi}`);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rule.max_rssi && detection.rssi > rule.max_rssi) {
|
|
||||||
console.log(`❌ Rule "${rule.name}": RSSI ${detection.rssi} above maximum ${rule.max_rssi}`);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// PRIORITY 6: Distance requirements
|
|
||||||
if (rule.max_distance && threatAssessment.estimatedDistance > rule.max_distance) {
|
|
||||||
console.log(`❌ Rule "${rule.name}": Distance ${threatAssessment.estimatedDistance}m exceeds maximum ${rule.max_distance}m`);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// PRIORITY 7: Frequency ranges
|
|
||||||
if (rule.frequency_ranges && rule.frequency_ranges.length > 0) {
|
|
||||||
const inRange = rule.frequency_ranges.some(range =>
|
|
||||||
detection.freq >= range.min && detection.freq <= range.max
|
|
||||||
);
|
|
||||||
if (!inRange) {
|
|
||||||
console.log(`❌ Rule "${rule.name}": Frequency ${detection.freq}MHz not in allowed ranges`);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// PRIORITY 8: Time window and minimum detections
|
|
||||||
if (rule.min_detections > 1) {
|
|
||||||
const timeWindowStart = new Date(Date.now() - rule.time_window * 1000);
|
|
||||||
const recentDetections = await DroneDetection.count({
|
|
||||||
where: {
|
|
||||||
device_id: detection.device_id,
|
|
||||||
drone_id: detection.drone_id,
|
|
||||||
server_timestamp: {
|
|
||||||
[Op.gte]: timeWindowStart
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
if (recentDetections < rule.min_detections) {
|
|
||||||
console.log(`❌ Rule "${rule.name}": Only ${recentDetections} detections, need ${rule.min_detections}`);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// PRIORITY 9: Cooldown period check
|
|
||||||
if (rule.cooldown_period > 0) {
|
if (rule.cooldown_period > 0) {
|
||||||
const cooldownStart = new Date(Date.now() - rule.cooldown_period * 1000);
|
const cooldownStart = new Date(Date.now() - rule.cooldown_period * 1000);
|
||||||
|
|
||||||
console.log(`🔍 Checking cooldown for rule "${rule.name}" (${rule.cooldown_period}s) - looking for alerts after ${cooldownStart.toISOString()}`);
|
|
||||||
|
|
||||||
// First, get all recent alert logs for this rule that were successfully sent
|
// First, get all recent alert logs for this rule that were successfully sent
|
||||||
const recentAlerts = await AlertLog.findAll({
|
const recentAlerts = await AlertLog.findAll({
|
||||||
where: {
|
where: {
|
||||||
@@ -377,12 +293,8 @@ class AlertService {
|
|||||||
}]
|
}]
|
||||||
});
|
});
|
||||||
|
|
||||||
console.log(`🔍 Found ${recentAlerts.length} recent alerts for rule "${rule.name}"`);
|
|
||||||
|
|
||||||
// Check if any recent alert was for the same device
|
// Check if any recent alert was for the same device
|
||||||
const deviceAlert = recentAlerts.find(alert => {
|
const deviceAlert = recentAlerts.find(alert => {
|
||||||
console.log(`🔍 Checking alert: detection device_id=${alert.detection?.device_id}, alert device_id=${alert.device_id}, target device_id=${detection.device_id}, sent_at=${alert.sent_at}`);
|
|
||||||
|
|
||||||
// For alerts with detection, check device_id match
|
// For alerts with detection, check device_id match
|
||||||
if (alert.detection && alert.detection.device_id === detection.device_id) {
|
if (alert.detection && alert.detection.device_id === detection.device_id) {
|
||||||
return true;
|
return true;
|
||||||
@@ -402,6 +314,88 @@ class AlertService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// PRIORITY 3: Critical threats and Orlan drones (security overrides)
|
||||||
|
const isOrlanDrone = detection.drone_type === 1;
|
||||||
|
const isCriticalThreat = threatAssessment.level === 'critical';
|
||||||
|
|
||||||
|
if (isOrlanDrone) {
|
||||||
|
console.log(`🚨 ORLAN DRONE DETECTED - Rule "${rule.name}" will trigger (security override)`);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isCriticalThreat) {
|
||||||
|
console.log(`🚨 CRITICAL THREAT DETECTED - Rule "${rule.name}" will trigger (security override)`);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// PRIORITY 4: Threat level requirements
|
||||||
|
if (rule.min_threat_level) {
|
||||||
|
const threatLevels = { 'monitoring': 0, 'low': 1, 'medium': 2, 'high': 3, 'critical': 4 };
|
||||||
|
const requiredLevel = threatLevels[rule.min_threat_level] || 0;
|
||||||
|
const currentLevel = threatLevels[threatAssessment.level] || 0;
|
||||||
|
|
||||||
|
if (currentLevel < requiredLevel) {
|
||||||
|
console.log(`❌ Rule "${rule.name}": Threat level ${threatAssessment.level} below minimum ${rule.min_threat_level}`);
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
console.log(`✅ Rule "${rule.name}": Threat level ${threatAssessment.level} meets minimum ${rule.min_threat_level}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// PRIORITY 5: Drone type filter
|
||||||
|
if (rule.drone_types && rule.drone_types.length > 0 &&
|
||||||
|
!rule.drone_types.includes(detection.drone_type)) {
|
||||||
|
console.log(`❌ Rule "${rule.name}": Drone type ${detection.drone_type} not in allowed types [${rule.drone_types.join(', ')}]`);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// PRIORITY 6: RSSI thresholds (distance-based)
|
||||||
|
if (rule.min_rssi && detection.rssi < rule.min_rssi) {
|
||||||
|
console.log(`❌ Rule "${rule.name}": RSSI ${detection.rssi} below minimum ${rule.min_rssi}`);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rule.max_rssi && detection.rssi > rule.max_rssi) {
|
||||||
|
console.log(`❌ Rule "${rule.name}": RSSI ${detection.rssi} above maximum ${rule.max_rssi}`);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// PRIORITY 7: Distance requirements
|
||||||
|
if (rule.max_distance && threatAssessment.estimatedDistance > rule.max_distance) {
|
||||||
|
console.log(`❌ Rule "${rule.name}": Distance ${threatAssessment.estimatedDistance}m exceeds maximum ${rule.max_distance}m`);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// PRIORITY 8: Frequency ranges
|
||||||
|
if (rule.frequency_ranges && rule.frequency_ranges.length > 0) {
|
||||||
|
const inRange = rule.frequency_ranges.some(range =>
|
||||||
|
detection.freq >= range.min && detection.freq <= range.max
|
||||||
|
);
|
||||||
|
if (!inRange) {
|
||||||
|
console.log(`❌ Rule "${rule.name}": Frequency ${detection.freq}MHz not in allowed ranges`);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// PRIORITY 9: Time window and minimum detections
|
||||||
|
if (rule.min_detections > 1) {
|
||||||
|
const timeWindowStart = new Date(Date.now() - rule.time_window * 1000);
|
||||||
|
const recentDetections = await DroneDetection.count({
|
||||||
|
where: {
|
||||||
|
device_id: detection.device_id,
|
||||||
|
drone_id: detection.drone_id,
|
||||||
|
server_timestamp: {
|
||||||
|
[Op.gte]: timeWindowStart
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (recentDetections < rule.min_detections) {
|
||||||
|
console.log(`❌ Rule "${rule.name}": Only ${recentDetections} detections, need ${rule.min_detections}`);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// PRIORITY 10: Active hours and days
|
// PRIORITY 10: Active hours and days
|
||||||
if (rule.active_hours || rule.active_days) {
|
if (rule.active_hours || rule.active_days) {
|
||||||
const now = new Date();
|
const now = new Date();
|
||||||
|
|||||||
Reference in New Issue
Block a user