diff --git a/lib/services/rolling_codes_service.dart b/lib/services/rolling_codes_service.dart index 9e86983..4e8bba1 100644 --- a/lib/services/rolling_codes_service.dart +++ b/lib/services/rolling_codes_service.dart @@ -7,25 +7,23 @@ import 'package:waylume_server/core/utils.dart'; import '../config/supabase_config.dart'; class RollingCodesService { - // Shared constants (these should match edge function constants) - static const String registrationSeed = String.fromEnvironment('REGISTRATION_SEED', defaultValue: 'default_registration_seed_change_in_production'); - static const String secretSalt = String.fromEnvironment('SECRET_SALT', defaultValue: 'default_secret_salt_change_in_production'); + // Shared constants (hardcoded to match edge function constants) + static const String registrationSeed = 'waylume_rolling_registration_seed_2025'; + static const String secretSalt = 'waylume_operational_secret_salt_2025'; static const int timeWindowSeconds = 300; // 5 minutes - // Server configuration file path - static const String configFile = '/tmp/waylume_server_config.json'; - static String? _operationalSeed; static String? _serverId; - /// Initialize service and load/generate configuration + /// Initialize service static Future initialize() async { _serverId = fromEnivronment('SERVER_ID'); if (_serverId == null) { throw Exception('SERVER_ID environment variable is required'); } - await _loadConfiguration(); + // No need to load configuration - server re-registers on every restart + print('Rolling codes service initialized for server $_serverId'); } /// Generate registration rolling code @@ -67,9 +65,9 @@ class RollingCodesService { } /// Set operational seed after successful registration - static Future setOperationalSeed(String seed) async { + static void setOperationalSeed(String seed) { _operationalSeed = seed; - await _saveConfiguration(); + print('Operational seed set for server $_serverId'); } /// Get current operational seed @@ -91,42 +89,4 @@ class RollingCodesService { return digest.toString(); } - - /// Load configuration from persistent storage - static Future _loadConfiguration() async { - try { - final file = File(configFile); - if (await file.exists()) { - final content = await file.readAsString(); - final config = jsonDecode(content) as Map; - - if (config['server_id'] == _serverId) { - _operationalSeed = config['operational_seed']; - print('Loaded operational seed for server $_serverId'); - } else { - print('Configuration file exists but server_id does not match. Need to re-register.'); - } - } - } catch (e) { - print('Error loading configuration: $e'); - } - } - - /// Save configuration to persistent storage - static Future _saveConfiguration() async { - try { - final config = { - 'server_id': _serverId, - 'operational_seed': _operationalSeed, - 'last_updated': DateTime.now().toIso8601String(), - }; - - final file = File(configFile); - await file.writeAsString(jsonEncode(config)); - print('Configuration saved for server $_serverId'); - } catch (e) { - print('Error saving configuration: $e'); - throw Exception('Failed to save server configuration'); - } - } } \ No newline at end of file diff --git a/lib/services/server_service.dart b/lib/services/server_service.dart index 5cd8bd0..b61ca55 100644 --- a/lib/services/server_service.dart +++ b/lib/services/server_service.dart @@ -9,11 +9,7 @@ class ServerService { static Future registerServer() async { await RollingCodesService.initialize(); - // If already registered and has operational seed, skip registration - if (RollingCodesService.isRegistered) { - print('Server already registered with operational seed'); - return; - } + // Server always registers on startup to get fresh operational seed GeolocationData geolocationData = await getGeolocationData(); @@ -50,8 +46,8 @@ class ServerService { if (response.statusCode == 200) { final responseData = jsonDecode(response.body); if (responseData['success']) { - // Store operational seed - await RollingCodesService.setOperationalSeed(responseData['operational_seed']); + // Store operational seed in memory (no persistence needed) + RollingCodesService.setOperationalSeed(responseData['operational_seed']); print('Server registered successfully with server-manager'); } else { throw Exception('Registration failed: ${responseData['error']}'); diff --git a/lib/services/supabase_heartbeat.dart b/lib/services/supabase_heartbeat.dart index 0ff9c0c..3cd34f8 100644 --- a/lib/services/supabase_heartbeat.dart +++ b/lib/services/supabase_heartbeat.dart @@ -21,10 +21,10 @@ void initHeartbeat() { DateTime now = DateTime.now().toUtc(); try { - // Wait until rolling codes service is initialized and registered + // Wait until rolling codes service is initialized and has operational seed if (!RollingCodesService.isRegistered) { print("Server not registered yet, skipping heartbeat"); - await Future.delayed(Duration(seconds: 30)); + await Future.delayed(Duration(seconds: 10)); // Check more frequently during startup continue; }