Получение сертификата в формате Cades из личного хранилища пользователя и хранилища закрытого ключа

This commit is contained in:
Artem Vasilev 2022-06-23 12:34:25 +03:00
parent 937da83bb4
commit f0aeb16ec4
3 changed files with 190 additions and 76 deletions

View File

@ -1,7 +1,7 @@
import { CadesCertificate } from '../api/certificate'; import {CadesCertificate} from '../api/certificate';
import { _afterPluginsLoaded } from './_afterPluginsLoaded'; import {_afterPluginsLoaded} from './_afterPluginsLoaded';
import { _extractMeaningfulErrorMessage } from './_extractMeaningfulErrorMessage'; import {_getCadesUserCert} from "./_getCadesUserCert";
import { __cadesAsyncToken__, __createCadesPluginObject__, _generateCadesFn } from './_generateCadesFn'; import {_getCadesContainerCert} from "./_getCadesContainerCert";
/** /**
* Возвращает сертификат в формате Cades по отпечатку * Возвращает сертификат в формате Cades по отпечатку
@ -10,79 +10,17 @@ import { __cadesAsyncToken__, __createCadesPluginObject__, _generateCadesFn } fr
* @returns сертификат в формате Cades * @returns сертификат в формате Cades
*/ */
export const _getCadesCert = _afterPluginsLoaded( export const _getCadesCert = _afterPluginsLoaded(
(thumbprint: string): CadesCertificate => { async (thumbprint: string): Promise<CadesCertificate> => {
const { cadesplugin } = window; let cadesCertificate: CadesCertificate;
return eval( try {
_generateCadesFn(function _getCadesCert() { cadesCertificate = await _getCadesUserCert(thumbprint);
let cadesStore; } catch (error) {
console.log(error);
try { cadesCertificate = await _getCadesContainerCert(thumbprint);
cadesStore = __cadesAsyncToken__ + __createCadesPluginObject__('CAdESCOM.Store'); }
} catch (error) {
console.error(error);
throw new Error(_extractMeaningfulErrorMessage(error) || 'Ошибка при попытке доступа к хранилищу'); return cadesCertificate;
} }
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;
}),
);
},
); );

View File

@ -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;
}),
);
},
);

View File

@ -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;
}),
);
},
);