diff --git a/src/helpers/_getCadesCert.ts b/src/helpers/_getCadesCert.ts index b386bf7..e57bcfb 100644 --- a/src/helpers/_getCadesCert.ts +++ b/src/helpers/_getCadesCert.ts @@ -1,7 +1,7 @@ -import { CadesCertificate } from '../api/certificate'; -import { _afterPluginsLoaded } from './_afterPluginsLoaded'; -import { _extractMeaningfulErrorMessage } from './_extractMeaningfulErrorMessage'; -import { __cadesAsyncToken__, __createCadesPluginObject__, _generateCadesFn } from './_generateCadesFn'; +import {CadesCertificate} from '../api/certificate'; +import {_afterPluginsLoaded} from './_afterPluginsLoaded'; +import {_getCadesUserCert} from "./_getCadesUserCert"; +import {_getCadesContainerCert} from "./_getCadesContainerCert"; /** * Возвращает сертификат в формате Cades по отпечатку @@ -10,79 +10,17 @@ import { __cadesAsyncToken__, __createCadesPluginObject__, _generateCadesFn } fr * @returns сертификат в формате Cades */ export const _getCadesCert = _afterPluginsLoaded( - (thumbprint: string): CadesCertificate => { - const { cadesplugin } = window; + async (thumbprint: string): Promise => { + let cadesCertificate: CadesCertificate; - return eval( - _generateCadesFn(function _getCadesCert() { - let cadesStore; + try { + cadesCertificate = await _getCadesUserCert(thumbprint); + } catch (error) { + console.log(error); - try { - cadesStore = __cadesAsyncToken__ + __createCadesPluginObject__('CAdESCOM.Store'); - } catch (error) { - console.error(error); + cadesCertificate = await _getCadesContainerCert(thumbprint); + } - throw new Error(_extractMeaningfulErrorMessage(error) || 'Ошибка при попытке доступа к хранилищу'); - } - - if (!cadesStore) { - throw new Error('Не удалось получить доступ к хранилищу сертификатов'); - } - - try { - void ( - __cadesAsyncToken__ + - cadesStore.Open( - cadesplugin.CAPICOM_CURRENT_USER_STORE, - cadesplugin.CAPICOM_MY_STORE, - cadesplugin.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED, - ) - ); - } catch (error) { - console.error(error); - - throw new Error(_extractMeaningfulErrorMessage(error) || 'Ошибка при открытии хранилища'); - } - - let cadesCertificateList; - let certificatesCount; - - try { - cadesCertificateList = __cadesAsyncToken__ + cadesStore.Certificates; - certificatesCount = __cadesAsyncToken__ + cadesCertificateList.Count; - } catch (error) { - console.error(error); - - throw new Error(_extractMeaningfulErrorMessage(error) || 'Ошибка получения списка сертификатов'); - } - - if (!certificatesCount) { - throw new Error('Нет доступных сертификатов'); - } - - let cadesCertificate: CadesCertificate; - - try { - cadesCertificateList = - __cadesAsyncToken__ + cadesCertificateList.Find(cadesplugin.CAPICOM_CERTIFICATE_FIND_SHA1_HASH, thumbprint); - - const count = __cadesAsyncToken__ + cadesCertificateList.Count; - - if (!count) { - throw new Error(`Сертификат с отпечатком: "${thumbprint}" не найден`); - } - - cadesCertificate = __cadesAsyncToken__ + cadesCertificateList.Item(1); - } catch (error) { - console.error(error); - - throw new Error(_extractMeaningfulErrorMessage(error) || 'Ошибка при получении сертификата'); - } - - cadesStore.Close(); - - return cadesCertificate; - }), - ); - }, + return cadesCertificate; + } ); diff --git a/src/helpers/_getCadesContainerCert.ts b/src/helpers/_getCadesContainerCert.ts new file mode 100755 index 0000000..bfbad7e --- /dev/null +++ b/src/helpers/_getCadesContainerCert.ts @@ -0,0 +1,88 @@ +import {CadesCertificate} from '../api/certificate'; +import {_afterPluginsLoaded} from './_afterPluginsLoaded'; +import {_extractMeaningfulErrorMessage} from './_extractMeaningfulErrorMessage'; +import {__cadesAsyncToken__, __createCadesPluginObject__, _generateCadesFn} from './_generateCadesFn'; + +/** + * Возвращает сертификат в формате Cades по отпечатку из хранилища закрытого ключа + * + * @param thumbprint - отпечаток сертификата + * @returns сертификат в формате Cades + */ +export const _getCadesContainerCert = _afterPluginsLoaded( + (thumbprint: string): CadesCertificate => { + const {cadesplugin} = window; + + return eval( + _generateCadesFn(function _getCadesCert() { + let cadesStore; + + try { + cadesStore = __cadesAsyncToken__ + __createCadesPluginObject__('CAdESCOM.Store'); + } catch (error) { + console.error(error); + + throw new Error(_extractMeaningfulErrorMessage(error) || 'Ошибка при попытке доступа к хранилищу'); + } + + if (!cadesStore) { + throw new Error('Не удалось получить доступ к хранилищу сертификатов'); + } + + try { + void ( + __cadesAsyncToken__ + + cadesStore.Open( + cadesplugin.CADESCOM_CONTAINER_STORE, + cadesplugin.CAPICOM_MY_STORE, + cadesplugin.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED, + ) + ); + } catch (error) { + console.error(error); + + throw new Error(_extractMeaningfulErrorMessage(error) || 'Ошибка при открытии хранилища закрытого ключа'); + } + + let cadesCertificateList; + let certificatesCount; + + try { + cadesCertificateList = __cadesAsyncToken__ + cadesStore.Certificates; + certificatesCount = __cadesAsyncToken__ + cadesCertificateList.Count; + } catch (error) { + console.error(error); + + throw new Error(_extractMeaningfulErrorMessage(error) || 'Ошибка получения списка сертификатов из хранилища закрытого ключа'); + } + + if (!certificatesCount) { + throw new Error('Нет доступных сертификатов в хранилище закрытого ключа'); + } + + let cadesCertificate: CadesCertificate; + + try { + cadesCertificateList = + __cadesAsyncToken__ + cadesCertificateList.Find(cadesplugin.CAPICOM_CERTIFICATE_FIND_SHA1_HASH, thumbprint); + + const count = __cadesAsyncToken__ + cadesCertificateList.Count; + + if (!count) { + throw new Error(`Сертификат с отпечатком: "${thumbprint}" не найден в хранилище закрытого ключа`); + } + + cadesCertificate = __cadesAsyncToken__ + cadesCertificateList.Item(1); + } catch (error) { + console.error(error); + + throw new Error(_extractMeaningfulErrorMessage(error) || 'Ошибка при получении сертификата из хранилища закрытого ключа'); + } + + cadesStore.Close(); + + return cadesCertificate; + }), + ); + }, +); diff --git a/src/helpers/_getCadesUserCert.ts b/src/helpers/_getCadesUserCert.ts new file mode 100755 index 0000000..af968ee --- /dev/null +++ b/src/helpers/_getCadesUserCert.ts @@ -0,0 +1,88 @@ +import {CadesCertificate} from '../api/certificate'; +import {_afterPluginsLoaded} from './_afterPluginsLoaded'; +import {_extractMeaningfulErrorMessage} from './_extractMeaningfulErrorMessage'; +import {__cadesAsyncToken__, __createCadesPluginObject__, _generateCadesFn} from './_generateCadesFn'; + +/** + * Возвращает сертификат в формате Cades по отпечатку из хранилища пользователя + * + * @param thumbprint - отпечаток сертификата + * @returns сертификат в формате Cades + */ +export const _getCadesUserCert = _afterPluginsLoaded( + (thumbprint: string): CadesCertificate => { + const {cadesplugin} = window; + + return eval( + _generateCadesFn(function _getCadesCert() { + let cadesStore; + + try { + cadesStore = __cadesAsyncToken__ + __createCadesPluginObject__('CAdESCOM.Store'); + } catch (error) { + console.error(error); + + throw new Error(_extractMeaningfulErrorMessage(error) || 'Ошибка при попытке доступа к хранилищу'); + } + + if (!cadesStore) { + throw new Error('Не удалось получить доступ к хранилищу сертификатов'); + } + + try { + void ( + __cadesAsyncToken__ + + cadesStore.Open( + cadesplugin.CAPICOM_CURRENT_USER_STORE, + cadesplugin.CAPICOM_MY_STORE, + cadesplugin.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED, + ) + ); + } catch (error) { + console.error(error); + + throw new Error(_extractMeaningfulErrorMessage(error) || 'Ошибка при открытии хранилища пользователя'); + } + + let cadesCertificateList; + let certificatesCount; + + try { + cadesCertificateList = __cadesAsyncToken__ + cadesStore.Certificates; + certificatesCount = __cadesAsyncToken__ + cadesCertificateList.Count; + } catch (error) { + console.error(error); + + throw new Error(_extractMeaningfulErrorMessage(error) || 'Ошибка получения списка сертификатов из хранилища пользователя'); + } + + if (!certificatesCount) { + throw new Error('Нет доступных сертификатов в хранилище пользователя'); + } + + let cadesCertificate: CadesCertificate; + + try { + cadesCertificateList = + __cadesAsyncToken__ + cadesCertificateList.Find(cadesplugin.CAPICOM_CERTIFICATE_FIND_SHA1_HASH, thumbprint); + + const count = __cadesAsyncToken__ + cadesCertificateList.Count; + + if (!count) { + throw new Error(`Сертификат с отпечатком: "${thumbprint}" не найден в хранилище пользователя`); + } + + cadesCertificate = __cadesAsyncToken__ + cadesCertificateList.Item(1); + } catch (error) { + console.error(error); + + throw new Error(_extractMeaningfulErrorMessage(error) || 'Ошибка при получении сертификата из хранилища пользователя'); + } + + cadesStore.Close(); + + return cadesCertificate; + }), + ); + }, +);