/// <summary> /// Подписывание пакета /// </summary> /// <param name="Package">Пакет</param> /// <param name="outputFile">Путь до выходного пакета</param> /// <returns>Путь до выходного пакета</returns> public static string SignFile(PackageInfo Package, string outputFile) { Environment.Log(string.Format("Подписываем файл \"{0}\"...", Package.Path)); if (Package.NewCert.CanSign) { if (File.Exists(outputFile)) { try { File.Delete(outputFile); } catch (Exception ex) { Environment.Log(string.Format("Не удается удалить файл \"{0}\" Ошибка: {1}", outputFile, ex.Message)); } } Environment.javaProc.StartInfo.Arguments = string.Format( Environment.signerArgs, Environment.signerFile, Package.NewCert.pemPath, Package.NewCert.pk8Path, Package.Path, outputFile ); Environment.javaProc.Start(); string output = Environment.javaProc.StandardOutput.ReadToEnd(); if (!string.IsNullOrEmpty(output)) Environment.Log(output); Environment.javaProc.WaitForExit(); } if (File.Exists(outputFile)) return outputFile; Environment.Log(string.Format("Выходной файл \"{0}\" не был найден. Ошибка.", outputFile)); return null; }
/// <summary> /// Процедура показа информации о сертификате /// </summary> /// <param name="pInfo">Пакет</param> private void ShowCertInfo(PackageInfo pInfo) { if (pInfo.Cert != null) { CertInfoWindow cInfoWnd = new CertInfoWindow(pInfo.Cert.FullInfo, "Информация о сертификате"); cInfoWnd.Show(); } }
/// <summary> /// Основная процедура подписывания файлов /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void bwSignFiles_DoWork(object sender, DoWorkEventArgs e) { //Блокируем интерфейс Block(true); StartButtonMode(true); int ErrorCounter = 0; int FileNum = 0; int FileCount = 0; foreach (PackageInfo pInfo in pReader.Packages) if (pInfo.NewCert.CanSign) FileCount++; foreach (PackageInfo pInfo in pReader.Packages) { // ================================================================================== //Показываем статусную строку и скроллим к итему this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, new Action(delegate() { PackagesLW.ScrollIntoView(pInfo); pInfo.IsComboBoxVisible = false; })); //Пропускаем файлы с явно неуказанными сертификатами if (!pInfo.NewCert.CanSign) { Environment.Log(string.Format("У файла \"{0}\" не выбран пригодный для подписи сертификат. Пропуск...", pInfo.Name)); this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, new Action(delegate() { pInfo.StatusText = STR_INLINE_SKIP; })); continue; } // ================================================================================== //Устанавливаем статус подписи pInfo.StatusText = STR_INLINE_SIGNING; SetStatus(string.Format(STR_STATUS_SIGNING_FILE, pInfo.Path), FileNum, FileCount, false); //Подписываем string SignedFile = Signer.SignFile(pInfo); //Если нулл или пустая - фейл if (string.IsNullOrEmpty(SignedFile)) { ErrorCounter++; this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, new Action(delegate() { pInfo.StatusText = STR_INLINE_SIGNING_ERROR; })); continue; } //Также если файла нет - фейл if (!File.Exists(SignedFile)) { ErrorCounter++; this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, new Action(delegate() { pInfo.StatusText = STR_INLINE_SIGNING_ERROR; })); continue; } // ================================================================================== //Устанавливаем статус алигнинга pInfo.StatusText = STR_INLINE_ALIGNING; SetStatus(string.Format(STR_STATUS_ALIGNING_FILE, pInfo.Path), FileNum, FileCount, false); //Зипалигним string SignedAlignedFile = Aligner.AlignFile(SignedFile); //Если нулл или пустая - фейл if (string.IsNullOrEmpty(SignedAlignedFile)) { ErrorCounter++; this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, new Action(delegate() { pInfo.StatusText = STR_INLINE_ALIGNING_ERROR; })); continue; } //Также если файла нет - фейл if (!File.Exists(SignedAlignedFile)) { ErrorCounter++; this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, new Action(delegate() { pInfo.StatusText = STR_INLINE_ALIGNING_ERROR; })); continue; } // ================================================================================== //Устанавливаем статус копирования pInfo.StatusText = STR_INLINE_COPYING; SetStatus(string.Format(STR_STATUS_COPYING_FILE, pInfo.Path), FileNum, FileCount, false); Environment.Log(string.Format("Копируем временный файл \"{0}\" на исходное место \"{1}\"...", SignedAlignedFile, pInfo.Path)); //Копируем на место try { File.Copy(SignedAlignedFile, pInfo.Path, true); } catch (Exception ex) { ErrorCounter++; Environment.Log(string.Format("Не удается скопировать файл \"{0}\" Ошибка: {1}", SignedAlignedFile, ex.Message)); } // ================================================================================== //Устанавливаем статус очистки pInfo.StatusText = STR_INLINE_CLEANING; //удаляем мусор try { File.Delete(SignedFile); File.Delete(SignedAlignedFile); } catch (Exception ex) { Environment.Log(string.Format("Не удается удалить временные файлы. Ошибка: {0}", ex.Message)); } this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, new Action(delegate() { pInfo.StatusText = STR_INLINE_DONE; })); FileNum++; if (bwSignFiles.CancellationPending) { Environment.Log("Вызвана остановка операции"); break; } } if (ErrorCounter > 0) { if (File.Exists(Environment.logFile)) { if (MessageBox.Show("Обработка некоторых файлов потерпела неудачу. Хотите посмотреть логи?", "Обработка некоторых файлов потерпела неудачу", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes) { this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, new Action(delegate() { CertInfoWindow ErrorInfo = new CertInfoWindow(File.ReadAllText(Environment.logFile), "Лог"); ErrorInfo.Show(); })); } } } else if (IsZip && !bwSignFiles.CancellationPending) //Если указан зип и не сказано остановиться - пакуемся { //Спрашиваем куда сохранить bool result = false; this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, new Action(delegate() { SaveZipBrowser.FileName = Path.GetFileNameWithoutExtension(ZipFile) + "_signed"; result = SaveZipBrowser.ShowDialog() == System.Windows.Forms.DialogResult.OK; })); if (result) { //Получаем выбранный сертификат CertInfo SignCert = new CertInfo(); this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, new Action(delegate() { SignCert = ((CertInfo)ZipSign.SelectedValue); })); //И смотри требуется ли подпись if (SignCert.CanSign) { //Если нужно, запаковываем сперва во временную папку string tempZip = Path.Combine(Environment.TempPath, Path.GetFileNameWithoutExtension(SaveZipBrowser.FileName) + "_zipunsigned.zip"); PackZIP(ZipRootPath, tempZip); //Создаем экземпляр пакета PackageInfo zipPackage = new PackageInfo(); zipPackage.Path = tempZip; zipPackage.IsChangeAllowed = true; zipPackage.NewCert = SignCert; //Устанавливаем статус подписи SetStatus(string.Format(STR_STATUS_SIGNING_FILE, SaveZipBrowser.FileName), 100, 100, true); //Подписываем пакет уже по указанному ранее пути Signer.SignFile(zipPackage, SaveZipBrowser.FileName); //Устанавливаем статус очистки SetStatus(STR_INLINE_CLEANING, 100, 100, true); //Удаляем мусор try { File.Delete(tempZip); } catch { } } else //Если подписывать не нужно, сразу запаковываем по указанному пути PackZIP(ZipRootPath, SaveZipBrowser.FileName); } } this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, new Action(delegate() { pReader.ShowComboBoxes(); })); SetStatus(STR_STATUS_DONE, 0, 100, false); Block(false); StartButtonMode(false); }
/// <summary> /// Подписывание пакета /// </summary> /// <param name="Package">Пакет</param> /// <returns>Путь до выходного файла</returns> public static string SignFile(PackageInfo Package) { string outputFile = Path.Combine(System.IO.Path.GetTempPath(), string.Format("{0}_signed{1}", Path.GetFileNameWithoutExtension(Package.Path), Path.GetExtension(Package.Path))); return SignFile(Package, outputFile); }