import 'dart:convert'; import 'dart:io'; import 'package:crypto/crypto.dart'; import 'package:ikar/core/transport/ikar_network.dart'; Future main(List args) async { final version = args.isEmpty ? '1.0.0' : args[0]; final code = args.length < 2 ? 1 : int.parse(args[1]); final reportSuffix = code == 1 ? '' : '-$version'; final http = IkarNetwork.client(); try { final base = Uri.parse('https://ikar.kusoft.xyz'); final response = await (await http.getUrl( base.resolve('/api/apps/ikar/manifest'), )).close(); if (response.statusCode != 200) { throw StateError('Release manifest unavailable'); } final manifest = jsonDecode(await utf8.decodeStream(response)); if (manifest['app']['packageName'] != 'ru.ikar.app' || manifest['release']['version'] != '$version+$code') { throw StateError('Incorrect release identity'); } final expected = (await File( 'artifacts/ikar-$version+$code.apk.sha256', ).readAsString()).split(' ').first; if (manifest['release']['sha256'] != expected) { throw StateError('Manifest checksum mismatch'); } final download = await (await http.getUrl( base.resolve(manifest['release']['downloadPath']), )).close(); if (download.statusCode != 200) { throw StateError('APK download unavailable'); } final digest = await sha256.bind(download).first; if (digest.toString() != expected) { throw StateError('Downloaded APK checksum mismatch'); } final report = { 'passed': true, 'package': 'ru.ikar.app', 'version': '$version+$code', 'sha256': expected, 'tlsValidation': true, 'bytes': manifest['release']['packageSizeBytes'], 'timestamp': DateTime.now().toUtc().toIso8601String(), }; await File( 'artifacts/release-verification$reportSuffix.json', ).writeAsString(const JsonEncoder.withIndent(' ').convert(report)); stdout.writeln(jsonEncode(report)); } finally { http.close(force: true); } }