Skip to content

Commit

Permalink
Добавлено:
Browse files Browse the repository at this point in the history
- Аргумент `-cert` для режима export
- Предупреждение о невозможности установки pfx контейнеров на версии КриптоПро 4.0.9842 R2 и ниже

Изменения:
- Изменена логика переименования контейнера в режиме export
- Удаление временного контейнера в режиме export
  • Loading branch information
Demetrous-fd committed Feb 19, 2025
1 parent 6447014 commit 5f480ff
Show file tree
Hide file tree
Showing 4 changed files with 77 additions and 40 deletions.
5 changes: 4 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -69,12 +69,15 @@ Flags:
Flags:
-cont string
[Требуется] Название контейнера или путь до папки
-cert string
Путь до сертификата
-name string
Название контейнера
Новое название контейнера
-o string
Путь до нового pfx контейнера
-pass string
Пароль от pfx контейнера

```

### Поддержка проекта
Expand Down
3 changes: 3 additions & 0 deletions core/cades.go
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,9 @@ func InstallESignature(rootContainersFolder string, installParams *ESignatureIns
pfxResult, err := InstallContainerFromPfx(installParams.ContainerPath, installParams.PfxPassword, installParams.Exportable)
if err != nil {
slog.Error(fmt.Sprintf("Не удалось установить контейнер из pfx файла %s", containerFilename))
if strings.Contains(pfxResult.Output, "unrecognized option `-pfx") {
slog.Warn("Установка контейнеров из pfx файлов доступна с версии КриптоПро CSP 4.0.9944 R3 (Xenocrates) от 22.02.2018.")
}
return err
} else {
slog.Debug(fmt.Sprintf("Контейнер установлен из Pfx[%s], Имя контейнера:'%s'", containerFilename, pfxResult.Container.ContainerName))
Expand Down
66 changes: 47 additions & 19 deletions core/exporter.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,11 @@ import (
)

type ExportContainerParams struct {
ContainerPath string
ContainerName string
PfxPassword string
PfxLocation string
ContainerPath string
ContainerName string
CertificatePath string
PfxPassword string
PfxLocation string
}

func ExportContainerToPfxCLI(certFolderPath string, rootContainersFolder string, params *ExportContainerParams) error {
Expand All @@ -26,9 +27,8 @@ func ExportContainerToPfxCLI(certFolderPath string, rootContainersFolder string,
var container *cades.Container
var containerBeforeExists bool
var err error
isContainer := IsContainerName(params.ContainerPath)

if !isContainer {
if !IsContainerName(params.ContainerPath) {
containerPath, errPath := GetFilePath(params.ContainerPath, certFolderPath)
if errPath != nil {
params.ContainerPath = ClearDoubleSlashes(params.ContainerPath)
Expand All @@ -38,10 +38,14 @@ func ExportContainerToPfxCLI(certFolderPath string, rootContainersFolder string,
slog.Error(err.Error())
return errPath
}
isContainer = true
containerBeforeExists = true

} else {
containerFilename := filepath.Base(containerPath)
if params.CertificatePath == "" {
slog.Warn("Укажите путь до сертификата через параметр `-cert <путь до сертификата>`")
return errors.New("certificate not set")
}

container, err = InstallContainerFromFolder(containerPath, rootContainersFolder, params.ContainerName)
if err != nil {
Expand All @@ -57,6 +61,7 @@ func ExportContainerToPfxCLI(certFolderPath string, rootContainersFolder string,
} else {
params.ContainerPath = ClearDoubleSlashes(params.ContainerPath)
container, err = GetContainer(params.ContainerPath)
containerBeforeExists = true
if err != nil {
slog.Error(err.Error())
return err
Expand All @@ -77,14 +82,43 @@ func ExportContainerToPfxCLI(certFolderPath string, rootContainersFolder string,
pfxLocation = filepath.Join(filepath.Dir(params.PfxLocation), filename)
}

if params.ContainerName != "" {
if params.ContainerName != "" && !containerBeforeExists {
container, err = RenameContainer(container, params.ContainerName)

if errors.Is(err, cades.ErrContainerNotExportable) {
slog.Debug(fmt.Sprintf("Контейнер[%s] не экспортируемый", container.ContainerName))
return cades.ErrContainerNotExportable
} else if err != nil {
if err != nil {
if errors.Is(err, cades.ErrContainerNotExportable) {
slog.Debug(fmt.Sprintf("Контейнер[%s] не экспортируемый", container.ContainerName))
return cades.ErrContainerNotExportable
}
slog.Debug(fmt.Sprintf("Не удалось переименовать контейнер [%s] -> [%s]", container.ContainerName, params.ContainerName))
}
} else if params.ContainerName != "" {
containerStorageName := strings.ReplaceAll(container.ContainerName, `\\.\`, "")
containerStorageName = strings.Split(containerStorageName, `\`)[0]

location := fmt.Sprintf(`\\.\%s\%s`, containerStorageName, params.ContainerName)
if location == container.ContainerName || location == container.UniqueContainerName {
slog.Debug(fmt.Sprintf("RenameContainer: The new container name matches the old one. OLD[%s] = NEW[%s]", container.ContainerName, location))
}

m := cades.CadesManager{}
container, err = m.CopyContainer(container, location)

if err != nil {
if errors.Is(err, cades.ErrContainerNotExportable) {
slog.Debug(fmt.Sprintf("Контейнер[%s] не экспортируемый", container.ContainerName))
return cades.ErrContainerNotExportable
}
slog.Debug(fmt.Sprintf("Не удалось переименовать контейнер [%s] -> [%s]", container.ContainerName, params.ContainerName))
} else {
defer DeleteContainer(container)
}
}

if params.CertificatePath != "" {
_, err := LinkCertWithContainer(params.CertificatePath, container.ContainerName)
if err != nil {
slog.Debug(fmt.Sprintf("Не удалось установить сертификат[%s] в закрытый контейнер[%s]", params.CertificatePath, container.UniqueContainerName))
}
}

Expand All @@ -95,13 +129,7 @@ func ExportContainerToPfxCLI(certFolderPath string, rootContainersFolder string,
return err
}

slog.Info(fmt.Sprintf("Контейнер[%s] экспортирован в файл: %s", params.ContainerName, pfxPath))

m := cades.CadesManager{}
container, err = m.GetContainer(params.ContainerName)
if err == nil && !isContainer && !containerBeforeExists {
DeleteContainer(container)
}
slog.Info(fmt.Sprintf("Контейнер[%s] экспортирован в файл: %s", container.ContainerName, pfxPath))

return nil
}
43 changes: 23 additions & 20 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,21 +14,22 @@ import (
)

var (
versionFlag *bool
debugFlag *bool
waitFlag *bool
skipRootFlag *bool
containerPathInstallArg *string
containerPathExportArg *string
containerNameInstallArg *string
containerNameExportArg *string
certificatePathArg *string
pfxPasswordInstallArg *string
pfxPasswordExportArg *string
pfxLocationArg *string
containerExportableArg *bool
InstallFlagSet *flag.FlagSet
ExporterFlagSet *flag.FlagSet
versionFlag *bool
debugFlag *bool
waitFlag *bool
skipRootFlag *bool
containerPathInstallArg *string
containerPathExportArg *string
certificatePathExportArg *string
containerNameInstallArg *string
containerNameExportArg *string
certificatePathArg *string
pfxPasswordInstallArg *string
pfxPasswordExportArg *string
pfxLocationArg *string
containerExportableArg *bool
InstallFlagSet *flag.FlagSet
ExporterFlagSet *flag.FlagSet
)

func init() {
Expand All @@ -49,6 +50,7 @@ func init() {
ExporterFlagSet = flag.NewFlagSet("export", flag.ExitOnError)
ExporterFlagSet.Usage = ExporterHelpUsage
containerPathExportArg = ExporterFlagSet.String("cont", "", "[Требуется] Название контейнера или путь до папки")
certificatePathExportArg = ExporterFlagSet.String("cert", "", "Путь до сертификата")
containerNameExportArg = ExporterFlagSet.String("name", "", "Новое название контейнера")
pfxPasswordExportArg = ExporterFlagSet.String("pass", "", "Пароль от pfx контейнера")
pfxLocationArg = ExporterFlagSet.String("o", "", "Путь до нового pfx контейнера")
Expand All @@ -75,7 +77,7 @@ func main() {
}

if *versionFlag {
fmt.Println("Mass version 1.4.1")
fmt.Println("Mass version 1.5.0")
fmt.Println("Repository: https://github.com/Demetrous-fd/CryptoPro-Mass-Installer")
fmt.Println("Maintainer: Lazydeus (Demetrous-fd)")
return
Expand Down Expand Up @@ -129,10 +131,11 @@ func main() {
// Parsing subcommand flags
if slices.Contains(flagArgs, "export") {
exportParams := &core.ExportContainerParams{
ContainerPath: *containerPathExportArg,
ContainerName: *containerNameExportArg,
PfxPassword: *pfxPasswordExportArg,
PfxLocation: *pfxLocationArg,
ContainerPath: *containerPathExportArg,
ContainerName: *containerNameExportArg,
CertificatePath: *certificatePathExportArg,
PfxPassword: *pfxPasswordExportArg,
PfxLocation: *pfxLocationArg,
}
err := core.ExportContainerToPfxCLI(certsPath, rootContainersFolder, exportParams)
if err != nil {
Expand Down

0 comments on commit 5f480ff

Please sign in to comment.