// just an unoptimized example of SHA1 hashing public static string GetHash(string firstBuildHash) { var stringBytes = StringUtils.StringToBytes(firstBuildHash); var sha1 = new SHA1Wrapper(); var hash = sha1.ComputeHash(stringBytes); sha1.Clear(); return(StringUtils.HashBytesToHexString(hash)); }
private List <BuildHashes> GetHashedBuilds(BuildReport report) { var sha1 = new SHA1Wrapper(); List <BuildHashes> result = null; #if UNITY_ANDROID result = GetAndroidBuildHashes(report, GetFileFilters(), sha1); #elif UNITY_STANDALONE_WIN result = GetStandaloneWindowsBuildHashes(report, GetFileFilters(), sha1); #endif sha1.Clear(); return(result); }
/// <summary> /// Calls selection dialog and calculates hashes for the selected build. /// </summary> /// <returns>Valid BuildHashes instance or null in case of error / user cancellation.</returns> public static BuildHashes CalculateExternalBuildHashes() { var buildPath = EditorUtility.OpenFilePanel("Select Standalone Windows build exe or Android build apk / aab", "", "exe,apk,aab"); if (string.IsNullOrEmpty(buildPath)) { Debug.Log(ACTkConstants.LogPrefix + "Hashing cancelled by user."); return(null); } var extension = Path.GetExtension(buildPath); if (string.IsNullOrEmpty(extension)) { return(null); } extension = extension.ToLower(CultureInfo.InvariantCulture); BuildHashes result = null; var sha1 = new SHA1Wrapper(); try { var il2Cpp = PlayerSettings.GetScriptingBackend(EditorUserBuildSettings.selectedBuildTargetGroup) == ScriptingImplementation.IL2CPP; if (extension == ".apk" || extension == ".aab") { result = GetAndroidArchiveHashes(buildPath, CodeHashGenerator.GetFileFiltersAndroid(il2Cpp), sha1); } else { var buildFolder = Path.GetDirectoryName(buildPath); var filters = CodeHashGenerator.GetFileFiltersStandaloneWindows(il2Cpp); result = StandaloneWindowsWorker.GetBuildHashes(buildFolder, filters, sha1); } } catch (Exception e) { Debug.LogError(ACTkConstants.LogPrefix + "Error while trying to hash build: " + e); } finally { sha1.Clear(); EditorUtility.ClearProgressBar(); } return(result); }
// --------------------------------------------------------------- // Standalone Windows build post-processing // --------------------------------------------------------------- private List <BuildHashes> GetStandaloneWindowsBuildHashes(BuildReport report, FileFilter[] fileFilters, SHA1Wrapper sha1) { var result = new List <BuildHashes>(); var folder = Path.GetDirectoryName(report.summary.outputPath); if (folder == null) { Debug.LogError(EditorTools.ConstructError("Could not found build folder for this file: " + report.summary.outputPath)); return(result); } var buildHashes = StandaloneWindowsWorker.GetBuildHashes(folder, fileFilters, sha1); if (buildHashes == null) { return(result); } result.Add(buildHashes); return(result); }
private static List <FileHash> HashSuitableFilesInZipFile(string path, FileFilter[] fileFilters, SHA1Wrapper sha1) { ZipFile zf = null; var fileHashes = new List <FileHash>(); try { var fs = File.OpenRead(path); zf = new ZipFile(fs); var i = 0f; foreach (ZipEntry zipEntry in zf) { i++; if (!zipEntry.IsFile) { continue; } var entryFileName = zipEntry.Name; var suitableFile = false; foreach (var fileFilter in fileFilters) { if (fileFilter.MatchesPath(entryFileName)) { suitableFile = true; break; } } if (!suitableFile) { continue; } EditorUtility.DisplayProgressBar("ACTk: Generating code hash", "Hashing files...", i / zf.Count); var zipStream = zf.GetInputStream(zipEntry); var hash = sha1.ComputeHash(zipStream); var hashString = StringUtils.HashBytesToHexString(hash); fileHashes.Add(new FileHash(entryFileName, hashString)); //Debug.Log("Path: " + zipEntry.Name + "\nHash: " + hashString); zipStream.Close(); } } catch (Exception e) { Debug.LogError(ACTkConstants.LogPrefix + "Error while calculating code hash: " + e); return(null); } finally { if (zf != null) { zf.IsStreamOwner = true; zf.Close(); } } return(fileHashes); }
private static BuildHashes GetAndroidArchiveHashes(string path, FileFilter[] fileFilters, SHA1Wrapper sha1) { var fileHashes = HashSuitableFilesInZipFile(path, fileFilters, sha1); return(new BuildHashes(path, fileHashes, sha1)); }
// --------------------------------------------------------------- // Android build post-processing // --------------------------------------------------------------- private List <BuildHashes> GetAndroidBuildHashes(BuildReport report, FileFilter[] fileFilters, SHA1Wrapper sha1) { var result = new List <BuildHashes>(); foreach (var reportFile in report.files) { var path = reportFile.path; var extension = Path.GetExtension(path); if (!string.IsNullOrEmpty(extension)) { extension = extension.ToLower(CultureInfo.InvariantCulture); } if (extension == ".apk" || extension == ".aab") { var hash = GetAndroidArchiveHashes(path, fileFilters, sha1); result.Add(hash); } } if (result.Count == 0) { Debug.LogWarning(EditorTools.ConstructError("Couldn't find compiled APK or AAB build.\n" + "This is fine if you use Export Project feature. In other case:")); } return(result); }