import 'dart:convert'; import 'package:cryptography/cryptography.dart'; import 'package:flutter/services.dart'; import '../core/build_info.dart'; import '../core/failure.dart'; import 'secure_store.dart'; class Legal { final SecureStore store; String license = ''; final Map guidance = {}; String? _identity; Legal(this.store); Future load() async { try { license = await rootBundle.loadString('assets/legal/LICENSE.txt'); if (!license.contains('Version 1.14') || license.length < 20000) { throw const Failure('licenseError'); } for (final lang in ['cs', 'de', 'en']) { guidance[lang] = await rootBundle.loadString( 'assets/legal/guidance_$lang.md', ); if (guidance[lang]!.isEmpty) throw const Failure('licenseError'); } _identity = base64Encode( (await Sha256().hash( utf8.encode(jsonEncode([appVersion, buildId, license, guidance])), )).bytes, ); final record = await store.read('consent'); if (record == null) return false; final data = jsonDecode(record); return data['identity'] == _identity && data['accepted'] == true && data['guidanceDisplayed'] == true; } catch (_) { throw const Failure('licenseError'); } } Future accept({required bool guidanceDisplayed}) async { if (_identity == null || !guidanceDisplayed) { throw const Failure('licenseError'); } await store.write( 'consent', jsonEncode({ 'identity': _identity, 'accepted': true, 'guidanceDisplayed': true, 'version': appVersion, 'buildId': buildId, 'licenseVersion': '1.14', 'acceptedAt': DateTime.now().toUtc().toIso8601String(), }), ); } }