#![allow(clippy::multiple_crate_versions)]
use mkt_ksa_geo_sec::api;
use actix_web::{web, App, HttpServer};
use config::Config;
use config::Environment;
use maxminddb::Reader;
use mkt_ksa_geo_sec::security::secret::SecureBytes;
use std::collections::HashMap;
use std::sync::Arc;
use tokio::sync::RwLock;
#[cfg(feature = "db-mysql")]
compile_error!(
"Feature 'db-mysql' is temporarily disabled for security hardening until a non-vulnerable backend is integrated."
);
use mkt_ksa_geo_sec::core::behavior_bio::{
BehaviorEngine, DefaultAnomalyDetector, DefaultBehavioralModel,
};
use mkt_ksa_geo_sec::core::composite_verification::CompositeVerifier;
use mkt_ksa_geo_sec::core::cross_location::{CrossValidationEngine, DefaultScoringStrategy};
use mkt_ksa_geo_sec::core::device_fp::{
AdaptiveFingerprintEngine, DefaultAiProcessor as FpAiProcessor, DefaultQuantumEngine,
DefaultSecurityMonitor,
};
use mkt_ksa_geo_sec::core::geo_resolver::{
DefaultAiModel as GeoAiModel, DefaultBlockchain, GeoResolver,
};
use mkt_ksa_geo_sec::core::network_analyzer::NetworkAnalyzer;
use mkt_ksa_geo_sec::core::sensors_analyzer::SensorsAnalyzerEngine;
use mkt_ksa_geo_sec::AppState;
#[actix_web::main]
async fn main() -> std::io::Result<()> {
let settings = Config::builder()
.add_source(Environment::default())
.build()
.expect("Failed to build configuration from environment");
let _api_key: String = settings.get_string("API_KEY").expect("API_KEY not set");
let database_url = std::env::var("DATABASE_URL").ok();
let _ = database_url;
let db_pool: Option<mkt_ksa_geo_sec::app_state::DbPool> = {
println!(
"⚠️ ميزة db-mysql غير مفعلة. يعمل التطبيق الآن بدون اتصال قاعدة بيانات (وضع آمن افتراضي)."
);
None
};
println!("🔧 Initializing application engines...");
let geo_reader: Arc<mkt_ksa_geo_sec::core::geo_resolver::GeoReaderEnum> = if db_pool.is_some() {
let geo_db_bytes = hex::decode("4d4d44425f434954590000000000000002000000000000000c000000636f756e747279000700000049534f5f434f44450000").expect("Failed to decode mock geo DB");
Arc::new(mkt_ksa_geo_sec::core::geo_resolver::GeoReaderEnum::Real(
Reader::from_source(geo_db_bytes).expect("Failed to create geo DB reader"),
))
} else {
println!(
"[DEV MODE] لن يتم تحميل قاعدة بيانات MaxMind geo DB. سيتم استخدام كائن وهمي عبر Enum."
);
Arc::new(mkt_ksa_geo_sec::core::geo_resolver::GeoReaderEnum::Mock(
mkt_ksa_geo_sec::core::geo_resolver::MockGeoReader::new(),
))
};
let geo_resolver = Arc::new(GeoResolver::new(
SecureBytes::new(vec![1; 32]),
Arc::new(GeoAiModel),
Arc::new(DefaultBlockchain),
true,
false,
geo_reader.clone(),
));
let fp_engine = Arc::new(AdaptiveFingerprintEngine::new(
Arc::new(DefaultSecurityMonitor::new()),
Arc::new(DefaultQuantumEngine::new().expect("Failed to create quantum engine")),
Arc::new(FpAiProcessor),
Arc::new(RwLock::new(HashMap::new())),
));
let behavior_engine = Arc::new(BehaviorEngine::new(
Arc::new(DefaultBehavioralModel),
Arc::new(DefaultAnomalyDetector {
max_speed_kmh: 1200.0,
}),
10,
));
let scoring_strategy = Arc::new(DefaultScoringStrategy {
location_weight: 0.4,
fingerprint_weight: 0.3,
behavior_weight: 0.3,
});
let sensors_engine = Arc::new(SensorsAnalyzerEngine::new(
SecureBytes::new(vec![42; 48]),
Arc::new(mkt_ksa_geo_sec::core::sensors_analyzer::DefaultSensorAnomalyDetector::default()),
));
let proxy_db = Arc::new(RwLock::new(
mkt_ksa_geo_sec::core::network_analyzer::ProxyDatabase::default(),
));
let network_engine = Arc::new(NetworkAnalyzer::new(
SecureBytes::new(vec![42; 32]),
proxy_db,
geo_reader.clone(),
Arc::new(mkt_ksa_geo_sec::core::network_analyzer::DefaultAiNetworkAnalyzer),
));
let x_engine = Arc::new(CrossValidationEngine::new(
Arc::clone(&geo_resolver),
Arc::clone(&fp_engine),
Arc::clone(&behavior_engine),
Arc::clone(&sensors_engine),
Arc::clone(&network_engine),
scoring_strategy,
SecureBytes::new(b"a_very_secret_final_verdict_key".to_vec()),
));
let composite_verifier = Arc::new(CompositeVerifier {
geo: geo_resolver,
behavior: behavior_engine,
device_fp: fp_engine,
network: network_engine,
});
let app_state = web::Data::new(AppState {
x_engine: Arc::clone(&x_engine),
composite_verifier,
db_pool,
});
println!("✅ Engines initialized successfully.");
println!("🚀 Server starting at http://127.0.0.1:8080");
HttpServer::new(move || {
App::new()
.app_data(app_state.clone())
.configure(api::config)
})
.bind("127.0.0.1:8080")?
.run()
.await
}