feat: secure home credentials

This commit is contained in:
Artem Kokos
2026-04-22 23:25:48 +07:00
parent 6a961209cc
commit 7c0a2675c6
22 changed files with 1782 additions and 397 deletions

View File

@@ -1,10 +1,9 @@
/// Модель "дома" -- один физический сервер Ignis.
/// Каждый дом имеет свой URL и API-ключ.
/// Содержит только несекретные настройки. API-ключ хранится отдельно.
class HomeConfig {
final String id; // уникальный идентификатор (uuid или timestamp)
final String name; // человекочитаемое название ("Квартира", "Дача")
final String url; // адрес сервера (например ignis.akokos.ru)
final String apiKey; // ключ авторизации
final double? latitude; // GPS-широта дома (для гео-автоматизации)
final double? longitude; // GPS-долгота дома (для гео-автоматизации)
final bool geofenceEnabled; // автовыключение при уходе из дома
@@ -13,7 +12,6 @@ class HomeConfig {
required this.id,
required this.name,
required this.url,
required this.apiKey,
this.latitude,
this.longitude,
this.geofenceEnabled = false,
@@ -27,45 +25,40 @@ class HomeConfig {
/// Сериализация в JSON для хранения в SharedPreferences
Map<String, dynamic> toJson() => {
'id': id,
'name': name,
'url': url,
'apiKey': apiKey,
if (latitude != null) 'latitude': latitude,
if (longitude != null) 'longitude': longitude,
'geofenceEnabled': geofenceEnabled,
};
'id': id,
'name': name,
'url': url,
if (latitude != null) 'latitude': latitude,
if (longitude != null) 'longitude': longitude,
'geofenceEnabled': geofenceEnabled,
};
factory HomeConfig.fromJson(Map<String, dynamic> json) => HomeConfig(
id: json['id'] as String,
name: json['name'] as String,
url: json['url'] as String,
apiKey: json['apiKey'] as String,
latitude: (json['latitude'] as num?)?.toDouble(),
longitude: (json['longitude'] as num?)?.toDouble(),
geofenceEnabled: json['geofenceEnabled'] as bool? ?? false,
);
id: json['id'] as String,
name: json['name'] as String,
url: json['url'] as String,
latitude: (json['latitude'] as num?)?.toDouble(),
longitude: (json['longitude'] as num?)?.toDouble(),
geofenceEnabled: json['geofenceEnabled'] as bool? ?? false,
);
/// Копирование с изменениями
HomeConfig copyWith({
String? name,
String? url,
String? apiKey,
double? latitude,
double? longitude,
bool? geofenceEnabled,
bool clearCoordinates = false,
}) =>
HomeConfig(
id: id,
name: name ?? this.name,
url: url ?? this.url,
apiKey: apiKey ?? this.apiKey,
latitude: clearCoordinates ? null : (latitude ?? this.latitude),
longitude: clearCoordinates ? null : (longitude ?? this.longitude),
// Если очищаем координаты -- геофенс тоже выключается
geofenceEnabled: clearCoordinates
? false
: (geofenceEnabled ?? this.geofenceEnabled),
);
}
}) => HomeConfig(
id: id,
name: name ?? this.name,
url: url ?? this.url,
latitude: clearCoordinates ? null : (latitude ?? this.latitude),
longitude: clearCoordinates ? null : (longitude ?? this.longitude),
// Если очищаем координаты -- геофенс тоже выключается
geofenceEnabled: clearCoordinates
? false
: (geofenceEnabled ?? this.geofenceEnabled),
);
}