49 lines
1.7 KiB
Dart
49 lines
1.7 KiB
Dart
import 'dart:convert';
|
|
import 'dart:io';
|
|
import 'package:crypto/crypto.dart';
|
|
import '../lib/core/transport/ikar_network.dart';
|
|
|
|
Future<void> main() async {
|
|
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'] != '1.0.0+1')
|
|
throw StateError('Incorrect release identity');
|
|
final expected = (await File(
|
|
'artifacts/ikar-1.0.0+1.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': '1.0.0+1',
|
|
'sha256': expected,
|
|
'tlsValidation': true,
|
|
'bytes': manifest['release']['packageSizeBytes'],
|
|
'timestamp': DateTime.now().toUtc().toIso8601String(),
|
|
};
|
|
await File(
|
|
'artifacts/release-verification.json',
|
|
).writeAsString(const JsonEncoder.withIndent(' ').convert(report));
|
|
stdout.writeln(jsonEncode(report));
|
|
} finally {
|
|
http.close(force: true);
|
|
}
|
|
}
|