public bool CompilePackage(string PackageFilename, PKGCompilerArgs Args, out string ErrorText) { string data = ""; UpdateText("Loading data"); try { data = File.ReadAllText(PackageFilename, Encoding.UTF8); } catch (Exception ee) { ErrorText = "Cannot read the file: " + ee.Message; return(false); } PKGRootData r; try { r = JsonConvert.DeserializeObject <PKGRootData>(data); if (r.HeaderID != "FoxPackageScriptV1") { ErrorText = "The file is not a valid Package Script"; return(false); } } catch (Exception ee) { Debug.WriteLine(ee.ToString()); ErrorText = "The file cannot be parsed."; return(false); } bool res = CheckScript(r, out ErrorText); if (res == false) { return(false); } return(CompilePackage(r, Args, out ErrorText)); }
public bool CompilePackage(PKGRootData Package, PKGCompilerArgs Args, out string ErrorText) { try { ErrorText = ""; AbortProcess = false; UpdateText("Preparing data"); PKGRootData ZipDef = new PKGRootData(); ZipDef.Description = Package.Description; ZipDef.HeaderID = Package.HeaderID; ZipDef.Outputfile = ""; ZipDef.PackageID = Package.PackageID; ZipDef.Script = Package.Script; ZipDef.Title = Package.Title; ZipDef.VersionID = Package.VersionID; ZipDef.Folders = new List <PKGFolder>(); //not needed here ZipDef.Files = new List <PKGFile>(); ZipDef.Signatures = new Dictionary <string, List <byte[]> >(); using (Stream filestream = File.Open(Package.Outputfile, FileMode.Create, FileAccess.ReadWrite, FileShare.None)) { using (ZipArchive ZipFile = new ZipArchive(filestream, ZipArchiveMode.Create, true, Encoding.UTF8)) { ZipArchiveEntry entry; byte[] signature; foreach (PKGFile file in Package.Files) { if (AbortProcess == true) { filestream.Close(); ErrorText = "Aborted"; return(false); } UpdateText("Compressing " + file.SrcFile); PKGFile inzipfile = new PKGFile(); inzipfile.ID = file.ID; inzipfile.SrcFile = Guid.NewGuid().ToString(); inzipfile.FileName = file.FileName; inzipfile.FolderName = file.FolderName; inzipfile.KeepInMeta = file.KeepInMeta; inzipfile.InstallThisFile = file.InstallThisFile; Stream FileStream = File.Open(file.SrcFile, FileMode.Open, FileAccess.Read, FileShare.Read); entry = ZipFile.CreateEntry(inzipfile.SrcFile, CompressionLevel.Optimal); using (Stream ZipStream = entry.Open()) { FileStream.CopyTo(ZipStream); } FileStream.Seek(0, SeekOrigin.Begin); if (AbortProcess == true) { filestream.Close(); ErrorText = "Aborted"; return(false); } UpdateText("Signing " + file.SrcFile); signature = null; if (Args.UseExtSign == false) { signature = Certificates.Sign(FileStream, Args.SignCert, Args.SignLocation); } else { SmartCards sm = new SmartCards(); signature = sm.SignData(Args.SignExtCert, FileStream, Args.PIN); } FileStream.Close(); if (signature == null) { ErrorText = "Signing failed"; filestream.Close(); return(false); } UpdateText("Storing Signature " + file.SrcFile); ZipDef.Files.Add(inzipfile); ZipDef.Signatures.Add(inzipfile.SrcFile.ToLower(), new List <byte[]> { signature }); } UpdateText("Finalizing"); byte[] data = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(ZipDef, Formatting.None)); signature = null; if (Args.UseExtSign == false) { signature = Certificates.Sign(data, Args.SignCert, Args.SignLocation); } else { SmartCards sm = new SmartCards(); signature = sm.SignData(Args.SignExtCert, data, Args.PIN); } entry = ZipFile.CreateEntry("Script.json", CompressionLevel.Optimal); using (Stream ZipStream = entry.Open()) { ZipStream.Write(data, 0, data.Length); } entry = ZipFile.CreateEntry("Script.json.sign", CompressionLevel.Optimal); using (Stream ZipStream = entry.Open()) { ZipStream.Write(signature, 0, signature.Length); } return(true); } } } catch (Exception ee) { Debug.WriteLine(ee.ToString()); ErrorText = "SEH Error"; return(false); } }