// Copyright 2014 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import 'dart:io'; import 'package:path/path.dart' as path; String get repoRoot => path.normalize(path.join(path.dirname(Platform.script.toFilePath()), '..', '..')); String get cacheDirectory => path.normalize(path.join(repoRoot, 'bin', 'cache')); /// Check mime-type of file at [filePath] to determine if it is binary bool isBinary(String filePath) { final ProcessResult result = Process.runSync( 'file', [ '--mime-type', '-b', // is binary filePath, ], ); return (result.stdout as String).contains('application/x-mach-binary'); } /// Find every binary file in the given [rootDirectory] List findBinaryPaths([String rootDirectory]) { rootDirectory ??= cacheDirectory; final ProcessResult result = Process.runSync( 'find', [ rootDirectory, '-type', 'f', '-perm', '+111', // is executable ], ); final List allFiles = (result.stdout as String).split('\n').where((String s) => s.isNotEmpty).toList(); return allFiles.where(isBinary).toList(); } /// Given the path to a stamp file, read the contents. /// /// Will throw if the file doesn't exist. String readStamp(String filePath) { final File file = File(filePath); if (!file.existsSync()) { throw 'Error! Stamp file $filePath does not exist!'; } return file.readAsStringSync().trim(); } /// Return whether or not the flutter cache is up to date. bool checkCacheIsCurrent() { try { final String dartSdkStamp = readStamp(path.join(cacheDirectory, 'engine-dart-sdk.stamp')); final String engineVersion = readStamp(path.join(repoRoot, 'bin', 'internal', 'engine.version')); return dartSdkStamp == engineVersion; } catch (e) { print(e); return false; } } void main() { final List failures = []; if (!Platform.isMacOS) { print('Error! Expected operating system "macos", actual operating system ' 'is: "${Platform.operatingSystem}"'); exit(1); } if (!checkCacheIsCurrent()) { print( 'Warning! Your cache is either not present or not matching your flutter\n' 'version. Run a `flutter` command to update your cache, and re-try this\n' 'test.'); exit(1); } for (final String binaryPath in findBinaryPaths(cacheDirectory)) { print('Verifying the code signature of $binaryPath'); final ProcessResult result = Process.runSync( 'codesign', [ '-vvv', binaryPath, ], ); if (result.exitCode != 0) { failures.add(binaryPath); print('File "$binaryPath" does not appear to be codesigned.\n' 'The `codesign` command failed with exit code ${result.exitCode}:\n' '${result.stderr}\n'); } } if (failures.isNotEmpty) { print('Found ${failures.length} unsigned binaries.'); failures.forEach(print); exit(1); } print('Verified that binaries are codesigned.'); }