Tests / test (push) Canceled after 0s
Native crypto / native-crypto (push) Canceled after 0s
Release (main) / android (oneme) (push) Canceled after 0s
Release (main) / android (qlyra) (push) Canceled after 0s
Release (main) / windows (push) Canceled after 0s
Release (main) / linux (push) Canceled after 0s
Release (main) / macos (push) Canceled after 0s
Release (main) / ios (push) Canceled after 0s
Release (main) / release (push) Canceled after 0s
57 lines
2.0 KiB
Dart
57 lines
2.0 KiB
Dart
import 'dart:convert';
|
|
import 'dart:io';
|
|
import 'package:crypto/crypto.dart';
|
|
import 'package:ikar/core/transport/ikar_network.dart';
|
|
|
|
Future<void> main(List<String> 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);
|
|
}
|
|
}
|