# n2o-ecp-plugin

## Описание
Плагин упрощающий работу с КриптоПРО в N2O проектах

## Возможности
* простое подключение в любом месте кастомизируемого проекта N2O
* создание модального окна с выбором сертификата и блоком информации по нему
* если найден только один сертификат, которым можно подписать, то автоматически применяется он
* возможность указывать тип HASH подписи (открепленная, присоединенная)
* отправка запроса на получение документа для подписи и его сохранение
* гибкая настройка плагина

## Установка
В конфиге кастомизируемого проекта N2O необходимо:
1. Импортировать button ``import { EcpButton } from 'n2o-ecp-plugin';``
2. Использовать в качестве кастомного действия ``{ buttons: { EcpButton }}``

EcpButton может принимать следующие параметры:
1. ``buttonLabel`` - текст кнопки вызова открытия модального окна с сертификатами
2. ``title`` - заголовок модального окна
3. ``signButtonLabel`` - текст кнопки подтверждения подписи
4. ``cancelButtonLabel`` - текст кнопки отмены
5. ``fileForSign`` - строка для подписи
6. ``signType`` - вид подписи (HASH, XML)
7. ``typeOfSign`` - тип HASH подписи, где ``true`` - открепленная (по умолчанию), ``false`` - присоединенная
8. ``fileRequestService`` - настройка получения документа с сервера
    * ``url`` - путь, на который будет отправлен запрос
    * ``type`` - метод запроса
    * ``data`` - объект или функция, результат которой отправиться вместе с запросом на сервер, для GET запроса отправиться в query, для остальных в body
    * ``documentKey`` - ключ в котором вернется документ из body, по умолчанию 'hash'
9.  ``fileSaveService`` - настройка сохранения подписи
    * ``url`` - путь, на который будет отправлен запрос
    * ``type`` - метод запроса
    * ``data`` - объект или функция, результат которой отправиться вместе с запросом на сервер, для GET запроса отправиться в query, для остальных в body
10. ``successSign`` - callback функция получения подписи
11. ``errorSign`` - callback функция ошибки

### Передача алгоритма
В режиме fileRequestService плагин отправляет алгоритм сертификата вместе с data. Ключ - certificate

### Объект результата подписи

    {
        "Document": "документ",
        "SignedDocument": "подписаный документ",
        "Name": "ФИО из сертификата", 
        "SignDate": "дату и время подписи", 
        "SerialNumber": "серийный номер сертификата", 
        "ValidFrom": "даты действия ('с'' в формате dd.mm.yyyy hh24:mm:ss)", 
        "ValidTo": "даты действия ('по'' в формате dd.mm.yyyy hh24:mm:ss)", 
        "Issuer" : "владелец сертификата",
        "Data": "response fileRequestService"
    }


## EcpApi
Кроме кастомного действия N2O, в пакете также присутствует api для работы с КриптоПРО. 

### Использование
1. Импортируем api ``import { EcpApi } from 'n2o-ecp-plugin';``
2.  Используем ``const certificates = await EcpApi.getCertificates();``

### Методы
Все методы возвращают Promise.
**EcpApi.getCertificates()**  
Метод получения сертификатов.     
Пример данных:

            [
                {
                    algorithm: "ГОСТ Р 34.10-2001",
                    issuerName: "CN=CRYPTO-PRO Test Center 2, O=CRYPTO-PRO LLC, L=Moscow, C=RU, E=support@cryptopro.ru",
                    label: "Test Certificate (до 20.02.2020 17:02:34)",
                    name: "Test Certificate",
                    oid: "1.2.643.2.2.19",
                    serialNumber: "12003D490CF6FB17B679DB04B90001003D490C",
                    subjectName: "CN=Test Certificate",
                    thumbprint: "C478ACE69DD1DFEEDD6695CC8ED7BE3A5FBED89C",
                    validFrom: "20.11.2019 16:52:34",
                    validTo: "20.02.2020 17:02:34",
                }
            ]

**EcpApi.getCertificate(hash)**  
Метод получения сертификата по хешу.  
Аргументы:
* hash - хеш сертификата

**EcpApi.sign({ signType, certificate, data, typeOfSign, fileRequestService, fileSaveService })**  
Метод подписи.   
Агрументы:
* signType - вид подписи вид подписи (HASH, XML)
* certificate - сертификат подписи
* data - данные на подпись, также может быть массивом
* typeOfSign - тип HASH подписи, где ``true`` - открепленная (по умолчанию), ``false`` - присоединенная
* fileRequestService - настройка получения документа с сервера
    * url - путь, на который будет отправлен запрос
    * type - метод запроса
    * data - объект или функция, результат которой отправиться вместе с запросом на сервер, для GET запроса отправиться в query, для остальных в body
    * documentKey - ключ в котором вернется документ из body, по умолчанию 'hash'
* fileSaveService - настройка сохранения подписи
    * url - путь, на который будет отправлен запрос
    * type - метод запроса
    * data - объект или функция, результат которой отправиться вместе с запросом на сервер, для GET запроса 