protected virtual byte[] CreateCodeResourcesDirectory(string CFBundleExecutable) { // Create a rules dict that includes (by wildcard) everything but Info.plist and the rules file Dictionary <string, object> Rules = new Dictionary <string, object>(); Rules.Add(".*", true); Rules.Add("^Info.plist", CreateOmittedResource(10)); // Create the full list of files to exclude (some files get excluded by 'magic' even though they aren't listed as special by rules) Dictionary <string, object> TrueExclusionList = new Dictionary <string, object>(); TrueExclusionList.Add("Info.plist", null); TrueExclusionList.Add(CFBundleExecutable, null); TrueExclusionList.Add("CodeResources", null); TrueExclusionList.Add("_CodeSignature/CodeResources", null); // Hash each file IEnumerable <string> FileList = FileSystem.GetAllPayloadFiles(); SHA1CryptoServiceProvider HashProvider = new SHA1CryptoServiceProvider(); Utilities.PListHelper HashedFileEntries = new Utilities.PListHelper(); foreach (string Filename in FileList) { if (!TrueExclusionList.ContainsKey(Filename)) { byte[] FileData = FileSystem.ReadAllBytes(Filename); byte[] HashData = HashProvider.ComputeHash(FileData); HashedFileEntries.AddKeyValuePair(Filename, HashData); } } // Create the CodeResources file that will contain the hashes Utilities.PListHelper CodeResources = new Utilities.PListHelper(); CodeResources.AddKeyValuePair("files", HashedFileEntries); CodeResources.AddKeyValuePair("rules", Rules); // Write the CodeResources file out string CodeResourcesAsString = CodeResources.SaveToString(); byte[] CodeResourcesAsBytes = Encoding.UTF8.GetBytes(CodeResourcesAsString); FileSystem.WriteAllBytes("_CodeSignature/CodeResources", CodeResourcesAsBytes); return(CodeResourcesAsBytes); }
protected virtual byte[] CreateCodeResourcesDirectory(string CFBundleExecutable) { // Create a rules dict that includes (by wildcard) everything but Info.plist and the rules file Dictionary <string, object> Rules1 = new Dictionary <string, object>(); Rules1.Add("^", true); Rules1.Add("^.*\\.lproj/", CreateOptionalResource(1000)); Rules1.Add("^.*\\.lproj/locversion.plist$", CreateOmittedResource(1100)); Rules1.Add("^version.plist$", true); Dictionary <string, object> Rules2 = new Dictionary <string, object>(); Rules2.Add(".*\\.dSYM($|/)", CreateResource(11)); Rules2.Add("^", CreateResource(20)); Rules2.Add("^(.*/)?\\.DS_Store$", CreateOmittedResource(2000)); Rules2.Add("^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/", CreateNestedResource(10)); Rules2.Add("^.*", true); Rules2.Add("^.*\\.lproj/", CreateOptionalResource(1000)); Rules2.Add("^.*\\.lproj/locversion.plist$", CreateOmittedResource(1100)); Rules2.Add("^Info\\.plist$", CreateOmittedResource(20)); Rules2.Add("^PkgInfo$", CreateOmittedResource(20)); Rules2.Add("^[^/]+$", CreateNestedResource(10)); Rules2.Add("^embedded\\.provisionprofile$", CreateResource(20)); Rules2.Add("^version\\.plist$", CreateResource(20)); // Create the full list of files to exclude (some files get excluded by 'magic' even though they aren't listed as special by rules) Dictionary <string, object> TrueExclusionList1 = new Dictionary <string, object>(); TrueExclusionList1.Add(CFBundleExecutable, null); TrueExclusionList1.Add("CodeResources", null); TrueExclusionList1.Add("_CodeSignature/CodeResources", null); Dictionary <string, object> TrueExclusionList2 = new Dictionary <string, object>(); TrueExclusionList2.Add("Info.plist", null); TrueExclusionList2.Add("PkgInfo", null); TrueExclusionList2.Add(CFBundleExecutable, null); TrueExclusionList2.Add("CodeResources", null); TrueExclusionList2.Add("_CodeSignature/CodeResources", null); // Hash each file IEnumerable <string> FileList = FileSystem.GetAllPayloadFiles(); SHA1CryptoServiceProvider HashProvider = new SHA1CryptoServiceProvider(); Utilities.PListHelper HashedFileEntries1 = new Utilities.PListHelper(); Utilities.PListHelper HashedFileEntries2 = new Utilities.PListHelper(); foreach (string Filename in FileList) { if (!TrueExclusionList1.ContainsKey(Filename)) { byte[] FileData = FileSystem.ReadAllBytes(Filename); byte[] HashData = HashProvider.ComputeHash(FileData); HashedFileEntries1.AddKeyValuePair(Filename, HashData); } if (!TrueExclusionList2.ContainsKey(Filename)) { byte[] FileData = FileSystem.ReadAllBytes(Filename); byte[] HashData = HashProvider.ComputeHash(FileData); HashedFileEntries2.AddKeyValuePair(Filename, HashData); } } // Create the CodeResources file that will contain the hashes Utilities.PListHelper CodeResources = new Utilities.PListHelper(); CodeResources.AddKeyValuePair("files", HashedFileEntries1); CodeResources.AddKeyValuePair("files2", HashedFileEntries2); CodeResources.AddKeyValuePair("rules", Rules1); CodeResources.AddKeyValuePair("rules2", Rules2); // Write the CodeResources file out string CodeResourcesAsString = CodeResources.SaveToString(); byte[] CodeResourcesAsBytes = Encoding.UTF8.GetBytes(CodeResourcesAsString); FileSystem.WriteAllBytes("_CodeSignature/CodeResources", CodeResourcesAsBytes); return(CodeResourcesAsBytes); }
protected virtual Utilities.PListHelper LoadInfoPList() { byte[] RawInfoPList = FileSystem.ReadAllBytes("Info.plist"); return(new Utilities.PListHelper(Encoding.UTF8.GetString(RawInfoPList))); }