UNPKG

crypto-pro-cadesplugin

Version:

Библиотека предоставляет API для работы c cadesplugin и Крипто Про

213 lines (182 loc) 7.29 kB
'use strict'; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // NOTE Object create //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /** * @description объект, в котором собираются данные о сертификате и методы по работе с этими данными */ const CertificateAdjuster = Object.create(null); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // NOTE Methods //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /** * @method init * @param {Object} currentCert * @description конструктор */ CertificateAdjuster.init = function init(currentCert) { const { certApi, issuerInfo, privateKey, serialNumber, thumbprint, subjectInfo, validPeriod } = currentCert; this.certApi = certApi; this.issuerInfo = issuerInfo; this.privateKey = privateKey; this.serialNumber = serialNumber; this.thumbprint = thumbprint; this.subjectInfo = subjectInfo; this.validPeriod = validPeriod; }; /** * @method getInfo * @param {String} subjectIssuer раздел информации 'issuerInfo' или 'subjectInfo' * @returns {Object} * @throws {Error} * @description возвращает объект из сформированных значений в формате key: value */ CertificateAdjuster.getInfo = function getInfo(subjectIssuer) { if (!this[subjectIssuer]) { throw new Error('Не верно указан аттрибут'); } const subjectIssuerArr = this[subjectIssuer].split(', '); const _possibleInfo = this.possibleInfo(subjectIssuer); const formedSubjectIssuerInfo = {}; subjectIssuerArr.map(tag => { const tagArr = tag.split('='); tagArr[0] = `${tagArr[0]}=`; formedSubjectIssuerInfo[_possibleInfo[tagArr[0]]] = tagArr[1]; }); return formedSubjectIssuerInfo; }; /** * @method getSubjectInfo * @returns {Object} * @description возвращает распаршенную информацию о строке subjectInfo в формате key: value */ CertificateAdjuster.getSubjectInfo = function getSubjectInfo() { return this.getInfo('subjectInfo'); }; /** * @method friendlyInfo * @param {String} subjectIssuer раздел информации 'issuerInfo' или 'subjectInfo' * @returns {Object} * @throws {Error} * @description возврящает объект из сформированных значений */ CertificateAdjuster.friendlyInfo = function friendlyInfo(subjectIssuer) { if (!this[subjectIssuer]) { throw new Error('Не верно указан аттрибут'); } const subjectIssuerArr = this[subjectIssuer].split(', '); const _possibleInfo = this.possibleInfo(subjectIssuer); const formedSubjectIssuerInfo = subjectIssuerArr.map(tag => { const tagArr = tag.split('='); tagArr[0] = `${tagArr[0]}=`; return { text: tagArr[1], value: _possibleInfo[tagArr[0]] }; }); return formedSubjectIssuerInfo; }; /** * @method friendlySubjectInfo * @returns {Array} * @description возвращает распаршенную информацию о строке subjectInfo */ CertificateAdjuster.friendlySubjectInfo = function friendlySubjectInfo() { return this.friendlyInfo('subjectInfo'); }; /** * @method friendlyIssuerInfo * @returns {Array} * @description возвращает распаршенную информацию о строке issuerInfo */ CertificateAdjuster.friendlyIssuerInfo = function friendlyIssuerInfo() { return this.friendlyInfo('issuerInfo'); }; /** * @method friendlyValidPeriod * @returns {Object} * @description возвращает распаршенную информацию об объекте validPeriod */ CertificateAdjuster.friendlyValidPeriod = function friendlyValidPeriod() { const { from, to } = this.validPeriod; return { from: this.friendlyDate(from), to: this.friendlyDate(to) }; }; /** * @method possibleInfo * @param {String} subjectIssuer раздел информации 'issuerInfo' или 'subjectInfo' * @returns {Object} * @throws {Error} * @description функция формирует ключи и значения в зависимости от переданного параметра */ CertificateAdjuster.possibleInfo = function possibleInfo(subjectIssuer) { const attrs = { 'UnstructuredName=': 'Неструктурированное имя', 'E=': 'Email', 'C=': 'Страна', 'S=': 'Регион', 'L=': 'Город', 'STREET=': 'Адрес', 'O=': 'Компания', 'T=': 'Должность', 'ОГРНИП=': 'ОГРНИП', 'OGRNIP=': 'ОГРНИП', 'SNILS=': 'СНИЛС', 'СНИЛС=': 'СНИЛС', 'INN=': 'ИНН', 'ИНН=': 'ИНН', 'ИНН ЮЛ=': 'ИНН_ЮЛ', 'ОГРН=': 'ОГРН', 'OGRN=': 'ОГРН' }; switch (subjectIssuer) { case 'subjectInfo': attrs['SN='] = 'Фамилия'; attrs['G='] = 'Имя/Отчество'; attrs['CN='] = 'Владелец'; attrs['OU='] = 'Отдел/подразделение'; return attrs; case 'issuerInfo': attrs['CN='] = 'Удостоверяющий центр'; attrs['OU='] = 'Тип'; return attrs; default: throw new Error('Не верно указан кейс получаемых данных'); } }; /** * @function friendlyDate * @param {String} date строка с датой * @returns {Object} * @description формирует дату от переданного пареметра */ CertificateAdjuster.friendlyDate = function friendlyDate(date) { const newDate = new Date(date); const [day, month, year] = [newDate.getDate(), newDate.getMonth() + 1, newDate.getFullYear()]; const [hours, minutes, seconds] = [newDate.getHours(), newDate.getMinutes(), newDate.getSeconds()]; return { ddmmyy: `${day}/${month}/${year}`, hhmmss: `${hours}:${minutes}:${seconds}` }; }; /** * @async * @method isValid * @returns {Boolean} возвращает валидность сертификата * @throws {Error} возвращает сообщение об ошибке * @description прозиводит проверку на валидность сертификата */ CertificateAdjuster.isValid = async function isValid() { try { const isValid = await this.certApi.IsValid(); return await isValid.Result; } catch (error) { throw new Error(`Произошла ошибка при проверке валидности сертификата: ${error.message}`); } }; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // NOTE Exports //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// module.exports = CertificateAdjuster;