Beispiel #1
0
        /// <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);
        }
Beispiel #4
0
 /// <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);
 }