-
-
-
+
-
-
Выберите подписанта
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- № 01/20/2020 (.PDF)
- Постановление
-
-
Скачать
-
-
-
-
-
-
-
-
-
-
-
-
- Ошибка
- Подписан не соответствует указанному подписанту в анкете
-
-
);
}
}
+
+function mapStateToProps(state, ownProps)
+{
+ return {
+ main: state.questionnaire.main,
+ legal_address: state.questionnaire.legal_address,
+ fact_address: state.questionnaire.fact_address,
+ postal_address: state.questionnaire.postal_address,
+ head_person: state.questionnaire.head_person,
+ head_person_files: state.questionnaire.head_person_files,
+ signatory_person: state.questionnaire.signatory_person,
+ signatory_person_files: state.questionnaire.signatory_person_files,
+ founded_persons: state.questionnaire.founded_persons,
+ client_contacts: state.questionnaire.client_contacts,
+ non_profit: state.questionnaire.non_profit,
+ }
+}
+
+export const getServerSideProps = reduxWrapper.getServerSideProps(store =>
+ async ({ req, res, query }) =>
+ {
+ }
+);
+
+export default connect(mapStateToProps)(Form_8_Signing);
\ No newline at end of file
diff --git a/pages/questionnaire/components/forms/QuestionnaireForm.js b/pages/questionnaire/components/forms/QuestionnaireForm.js
index a8d9654..b29ee6d 100644
--- a/pages/questionnaire/components/forms/QuestionnaireForm.js
+++ b/pages/questionnaire/components/forms/QuestionnaireForm.js
@@ -139,6 +139,15 @@ export default class QuestionnaireForm extends React.Component
this.setState(update);
}
+ _handle_onFieldChange = (name, payload) =>
+ {
+ console.log("_handle_onFieldChange", name, payload);
+
+ const update = { ...this.state };
+ _set(update, name, payload);
+ this.setState(update);
+ }
+
_handle_onAddFile = (name, files) =>
{
console.log("QuestionnaireForm", "_handle_onAdd", { name, files });
diff --git a/pages/questionnaire/index.js b/pages/questionnaire/index.js
index a7fdd7c..7766c26 100644
--- a/pages/questionnaire/index.js
+++ b/pages/questionnaire/index.js
@@ -15,7 +15,7 @@ import InnerMenu from "./components/InnerMenu";
import Header from '../components/Header';
import Footer from '../components/Footer';
-import { sendPhoneChangeNumber, sendPhoneChangeNumberSmsCode, setUserPhone, getQuestionnaire } from '../../actions';
+import { sendPhoneChangeNumber, sendPhoneChangeNumberSmsCode, setUserPhone, getQuestionnaire, getContractGraphicChangeSignatories } from '../../actions';
import AccountLayout from "../components/Layout/Account";
import Form_1_Main from "./components/forms/Form_1_Main";
import Form_2_Contacts from "./components/forms/Form_2_Contacts";
@@ -35,95 +35,23 @@ class QuestionnairePage extends React.Component
phone: "",
phone_check_loading: false,
phone_number_format_error: false,
+ signatories: [],
+ };
+ }
+
+ static getDerivedStateFromProps(nextProps, prevState)
+ {
+ return {
+ signatories: nextProps.signatories,
};
}
componentDidMount()
{
- getQuestionnaire({ dispatch: this.props.dispatch });
- }
+ const { dispatch } = this.props;
- _handle_onPhoneSubmit = (event) =>
- {
- event.preventDefault();
-
- const { user, phone, phone_check_loading } = this.state;
-
- if(!phone_check_loading)
- {
- this.setState({ phone_check_loading: true }, () =>
- {
- sendPhoneChangeNumber({ email: user.email, phone })
- .then(() =>
- {
- this.setState({ phone_check_loading: false, phone_number_error: false, timer: 60, phone_form_step: 2, }, () =>
- {
- this.timer_ref = setInterval(() =>
- {
- const t = this.state.timer - 1;
- this.setState({ timer: t, }, () =>
- {
- if(t === 0)
- {
- clearInterval(this.timer_ref);
- }
- });
- }, 1000);
- });
- })
- .catch(() =>
- {
- this.setState({ phone_number_error: true, phone_check_loading: false });
- });
- });
- }
- }
-
- _handle_onCodeSubmit = (event) =>
- {
- event.preventDefault();
-
- const { phone, phone_code, code_check_loading } = this.state;
-
- if(!code_check_loading)
- {
- this.setState({ code_check_loading: true }, () =>
- {
- sendPhoneChangeNumberSmsCode({ phone, code: phone_code })
- .then(() =>
- {
- const new_user = { ...this.state.user };
- new_user.phone = phone;
-
- setUserPhone({ dispatch: this.props.dispatch, user: new_user });
-
- this.setState({ phone_sms_code_error: false, code_check_loading: false, phone_form_step: 3 });
- })
- .catch(() =>
- {
- this.setState({ phone_sms_code_error: true, code_check_loading: false });
- });
- });
- }
- }
-
- _handle_onResendCode = (event) =>
- {
- this.setState({ phone_sms_code_error: false }, () =>
- {
- this._handle_onPhoneSubmit(event);
- });
- }
-
- _handle_onPhoneChange = (value) =>
- {
- const phone_number_format_error = value.length > 1 && (value[0] !== "+" || value[1] !== "7") ? true : false;
- this.setState({ phone: value, phone_login_disabled: this._check_fields_disabled([ value ]), phone_number_error: false, phone_number_format_error: phone_number_format_error });
- }
-
- _handle_onPhoneCodeChange = (value) =>
- {
- this.setState({ phone_code: value, phone_code_submit_disabled: this._check_fields_disabled([ value ]), phone_sms_code_error: false });
+ getQuestionnaire({ dispatch });
+ getContractGraphicChangeSignatories({ dispatch });
}
_check_fields_disabled = (values) =>
@@ -141,12 +69,13 @@ class QuestionnairePage extends React.Component
_renderForm = () =>
{
+ const { signatories } = this.state;
const route = this.props.router.asPath;
if (route.indexOf("#main") > -1) return (
);
if (route.indexOf("#contacts") > -1) return (
);
if (route.indexOf("#signer") > -1) return (
);
- if (route.indexOf("#shareholders") > -1) return (
);
+ if (route.indexOf("#shareholders") > -1) return (
);
if (route.indexOf("#regulatory") > -1) return (
);
if (route.indexOf("#non-profit") > -1) return (
);
if (route.indexOf("#check") > -1) return (
);
@@ -191,8 +120,7 @@ class QuestionnairePage extends React.Component
function mapStateToProps(state, ownProps)
{
return {
- observer: state.auth.observer,
- user: state.user,
+ signatories: state.contract.change.signatories,
}
}
diff --git a/public/assets/js/cadesplugin_api.js b/public/assets/js/cadesplugin_api.js
new file mode 100644
index 0000000..817466c
--- /dev/null
+++ b/public/assets/js/cadesplugin_api.js
@@ -0,0 +1,734 @@
+
+;(function () {
+ //already loaded
+ if(window.cadesplugin)
+ return;
+
+ var pluginObject;
+ var plugin_resolved = 0;
+ var plugin_reject;
+ var plugin_resolve;
+ var isOpera = 0;
+ var isFireFox = 0;
+ var isEdge = 0;
+ var isSafari = 0;
+ var failed_extensions = 0;
+
+ var canPromise = !!window.Promise;
+ var cadesplugin;
+
+ if(canPromise)
+ {
+ cadesplugin = new Promise(function(resolve, reject)
+ {
+ plugin_resolve = resolve;
+ plugin_reject = reject;
+ });
+ } else
+ {
+ cadesplugin = {};
+ }
+
+ function check_browser() {
+ var ua= navigator.userAgent, tem, M= ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [];
+ if(/trident/i.test(M[1])){
+ tem= /\brv[ :]+(\d+)/g.exec(ua) || [];
+ return {name:'IE',version:(tem[1] || '')};
+ }
+ if(M[1]=== 'Chrome'){
+ tem= ua.match(/\b(OPR|Edge)\/(\d+)/);
+ if(tem!= null) return {name:tem[1].replace('OPR', 'Opera'),version:tem[2]};
+ }
+ M= M[2]? [M[1], M[2]]: [navigator.appName, navigator.appVersion, '-?'];
+ if((tem= ua.match(/version\/(\d+)/i))!= null) M.splice(1, 1, tem[1]);
+ return {name:M[0],version:M[1]};
+ }
+ var browserSpecs = check_browser();
+
+ function cpcsp_console_log(level, msg){
+ //IE9 не может писать в консоль если не открыта вкладка developer tools
+ if(typeof(console) === 'undefined')
+ return;
+ if (level <= cadesplugin.current_log_level ){
+ if (level === cadesplugin.LOG_LEVEL_DEBUG)
+ console.log("DEBUG: %s", msg);
+ if (level === cadesplugin.LOG_LEVEL_INFO)
+ console.info("INFO: %s", msg);
+ if (level === cadesplugin.LOG_LEVEL_ERROR)
+ console.error("ERROR: %s", msg);
+ return;
+ }
+ }
+
+ function set_log_level(level){
+ if (!((level === cadesplugin.LOG_LEVEL_DEBUG) ||
+ (level === cadesplugin.LOG_LEVEL_INFO) ||
+ (level === cadesplugin.LOG_LEVEL_ERROR))){
+ cpcsp_console_log(cadesplugin.LOG_LEVEL_ERROR, "cadesplugin_api.js: Incorrect log_level: " + level);
+ return;
+ }
+ cadesplugin.current_log_level = level;
+ if (cadesplugin.current_log_level === cadesplugin.LOG_LEVEL_DEBUG)
+ cpcsp_console_log(cadesplugin.LOG_LEVEL_INFO, "cadesplugin_api.js: log_level = DEBUG");
+ if (cadesplugin.current_log_level === cadesplugin.LOG_LEVEL_INFO)
+ cpcsp_console_log(cadesplugin.LOG_LEVEL_INFO, "cadesplugin_api.js: log_level = INFO");
+ if (cadesplugin.current_log_level === cadesplugin.LOG_LEVEL_ERROR)
+ cpcsp_console_log(cadesplugin.LOG_LEVEL_INFO, "cadesplugin_api.js: log_level = ERROR");
+ if(isNativeMessageSupported())
+ {
+ if (cadesplugin.current_log_level === cadesplugin.LOG_LEVEL_DEBUG)
+ window.postMessage("set_log_level=debug", "*");
+ if (cadesplugin.current_log_level === cadesplugin.LOG_LEVEL_INFO)
+ window.postMessage("set_log_level=info", "*");
+ if (cadesplugin.current_log_level === cadesplugin.LOG_LEVEL_ERROR)
+ window.postMessage("set_log_level=error", "*");
+ }
+ }
+
+ function set_constantValues()
+ {
+ cadesplugin.CAPICOM_LOCAL_MACHINE_STORE = 1;
+ cadesplugin.CAPICOM_CURRENT_USER_STORE = 2;
+ cadesplugin.CADESCOM_LOCAL_MACHINE_STORE = 1;
+ cadesplugin.CADESCOM_CURRENT_USER_STORE = 2;
+ cadesplugin.CADESCOM_CONTAINER_STORE = 100;
+
+ cadesplugin.CAPICOM_MY_STORE = "My";
+
+ cadesplugin.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED = 2;
+
+ cadesplugin.CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME = 1;
+
+ cadesplugin.CADESCOM_XML_SIGNATURE_TYPE_ENVELOPED = 0;
+ cadesplugin.CADESCOM_XML_SIGNATURE_TYPE_ENVELOPING = 1;
+ cadesplugin.CADESCOM_XML_SIGNATURE_TYPE_TEMPLATE = 2;
+
+ cadesplugin.XmlDsigGost3410UrlObsolete = "http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411";
+ cadesplugin.XmlDsigGost3411UrlObsolete = "http://www.w3.org/2001/04/xmldsig-more#gostr3411";
+ cadesplugin.XmlDsigGost3410Url = "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102001-gostr3411";
+ cadesplugin.XmlDsigGost3411Url = "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr3411";
+
+ cadesplugin.CADESCOM_CADES_DEFAULT = 0;
+ cadesplugin.CADESCOM_CADES_BES = 1;
+ cadesplugin.CADESCOM_CADES_T = 0x5;
+ cadesplugin.CADESCOM_CADES_X_LONG_TYPE_1 = 0x5d;
+ cadesplugin.CADESCOM_PKCS7_TYPE = 0xffff;
+
+ cadesplugin.CADESCOM_ENCODE_BASE64 = 0;
+ cadesplugin.CADESCOM_ENCODE_BINARY = 1;
+ cadesplugin.CADESCOM_ENCODE_ANY = -1;
+
+ cadesplugin.CAPICOM_CERTIFICATE_INCLUDE_CHAIN_EXCEPT_ROOT = 0;
+ cadesplugin.CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN = 1;
+ cadesplugin.CAPICOM_CERTIFICATE_INCLUDE_END_ENTITY_ONLY = 2;
+
+ cadesplugin.CAPICOM_CERT_INFO_SUBJECT_SIMPLE_NAME = 0;
+ cadesplugin.CAPICOM_CERT_INFO_ISSUER_SIMPLE_NAME = 1;
+
+ cadesplugin.CAPICOM_CERTIFICATE_FIND_SHA1_HASH = 0;
+ cadesplugin.CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME = 1;
+ cadesplugin.CAPICOM_CERTIFICATE_FIND_ISSUER_NAME = 2;
+ cadesplugin.CAPICOM_CERTIFICATE_FIND_ROOT_NAME = 3;
+ cadesplugin.CAPICOM_CERTIFICATE_FIND_TEMPLATE_NAME = 4;
+ cadesplugin.CAPICOM_CERTIFICATE_FIND_EXTENSION = 5;
+ cadesplugin.CAPICOM_CERTIFICATE_FIND_EXTENDED_PROPERTY = 6;
+ cadesplugin.CAPICOM_CERTIFICATE_FIND_APPLICATION_POLICY = 7;
+ cadesplugin.CAPICOM_CERTIFICATE_FIND_CERTIFICATE_POLICY = 8;
+ cadesplugin.CAPICOM_CERTIFICATE_FIND_TIME_VALID = 9;
+ cadesplugin.CAPICOM_CERTIFICATE_FIND_TIME_NOT_YET_VALID = 10;
+ cadesplugin.CAPICOM_CERTIFICATE_FIND_TIME_EXPIRED = 11;
+ cadesplugin.CAPICOM_CERTIFICATE_FIND_KEY_USAGE = 12;
+
+ cadesplugin.CAPICOM_DIGITAL_SIGNATURE_KEY_USAGE = 128;
+
+ cadesplugin.CAPICOM_PROPID_ENHKEY_USAGE = 9;
+
+ cadesplugin.CAPICOM_OID_OTHER = 0;
+ cadesplugin.CAPICOM_OID_KEY_USAGE_EXTENSION = 10;
+
+ cadesplugin.CAPICOM_EKU_CLIENT_AUTH = 2;
+ cadesplugin.CAPICOM_EKU_SMARTCARD_LOGON = 5;
+ cadesplugin.CAPICOM_EKU_OTHER = 0;
+
+ cadesplugin.CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME = 0;
+ cadesplugin.CAPICOM_AUTHENTICATED_ATTRIBUTE_DOCUMENT_NAME = 1;
+ cadesplugin.CAPICOM_AUTHENTICATED_ATTRIBUTE_DOCUMENT_DESCRIPTION = 2;
+ cadesplugin.CADESCOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME = 0;
+ cadesplugin.CADESCOM_AUTHENTICATED_ATTRIBUTE_DOCUMENT_NAME = 1;
+ cadesplugin.CADESCOM_AUTHENTICATED_ATTRIBUTE_DOCUMENT_DESCRIPTION = 2;
+ cadesplugin.CADESCOM_ATTRIBUTE_OTHER = -1;
+
+ cadesplugin.CADESCOM_STRING_TO_UCS2LE = 0;
+ cadesplugin.CADESCOM_BASE64_TO_BINARY = 1;
+
+ cadesplugin.CADESCOM_DISPLAY_DATA_NONE = 0;
+ cadesplugin.CADESCOM_DISPLAY_DATA_CONTENT = 1;
+ cadesplugin.CADESCOM_DISPLAY_DATA_ATTRIBUTE = 2;
+
+ cadesplugin.CADESCOM_ENCRYPTION_ALGORITHM_RC2 = 0;
+ cadesplugin.CADESCOM_ENCRYPTION_ALGORITHM_RC4 = 1;
+ cadesplugin.CADESCOM_ENCRYPTION_ALGORITHM_DES = 2;
+ cadesplugin.CADESCOM_ENCRYPTION_ALGORITHM_3DES = 3;
+ cadesplugin.CADESCOM_ENCRYPTION_ALGORITHM_AES = 4;
+ cadesplugin.CADESCOM_ENCRYPTION_ALGORITHM_GOST_28147_89 = 25;
+
+ cadesplugin.CADESCOM_HASH_ALGORITHM_SHA1 = 0;
+ cadesplugin.CADESCOM_HASH_ALGORITHM_MD2 = 1;
+ cadesplugin.CADESCOM_HASH_ALGORITHM_MD4 = 2;
+ cadesplugin.CADESCOM_HASH_ALGORITHM_MD5 = 3;
+ cadesplugin.CADESCOM_HASH_ALGORITHM_SHA_256 = 4;
+ cadesplugin.CADESCOM_HASH_ALGORITHM_SHA_384 = 5;
+ cadesplugin.CADESCOM_HASH_ALGORITHM_SHA_512 = 6;
+ cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411 = 100;
+ cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256 = 101;
+ cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_512 = 102;
+ cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_HMAC = 110;
+ cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256_HMAC = 111;
+ cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_512_HMAC = 112;
+
+ cadesplugin.LOG_LEVEL_DEBUG = 4;
+ cadesplugin.LOG_LEVEL_INFO = 2;
+ cadesplugin.LOG_LEVEL_ERROR = 1;
+
+ cadesplugin.CADESCOM_AllowNone = 0;
+ cadesplugin.CADESCOM_AllowNoOutstandingRequest = 0x1;
+ cadesplugin.CADESCOM_AllowUntrustedCertificate = 0x2;
+ cadesplugin.CADESCOM_AllowUntrustedRoot = 0x4;
+ cadesplugin.CADESCOM_SkipInstallToStore = 0x10000000;
+ }
+
+ function async_spawn(generatorFunc) {
+ function continuer(verb, arg) {
+ var result;
+ try {
+ result = generator[verb](arg);
+ } catch (err) {
+ return Promise.reject(err);
+ }
+ if (result.done) {
+ return result.value;
+ } else {
+ return Promise.resolve(result.value).then(onFulfilled, onRejected);
+ }
+ }
+ var generator = generatorFunc(Array.prototype.slice.call(arguments, 1));
+ var onFulfilled = continuer.bind(continuer, "next");
+ var onRejected = continuer.bind(continuer, "throw");
+ return onFulfilled();
+ }
+
+ function isIE() {
+ // var retVal = (("Microsoft Internet Explorer" == navigator.appName) || // IE < 11
+ // navigator.userAgent.match(/Trident\/./i)); // IE 11
+ return (browserSpecs.name === 'IE' || browserSpecs.name === 'MSIE');
+ }
+
+ function isIOS() {
+ return (navigator.userAgent.match(/ipod/i) ||
+ navigator.userAgent.match(/ipad/i) ||
+ navigator.userAgent.match(/iphone/i));
+ }
+
+ function isNativeMessageSupported()
+ {
+ // В IE работаем через NPAPI
+ if(isIE())
+ return false;
+ // В Edge работаем через NativeMessage
+ if(browserSpecs.name === 'Edge') {
+ isEdge = true;
+ return true;
+ }
+ // В Chrome, Firefox, Safari и Opera работаем через асинхронную версию в зависимости от версии
+ if(browserSpecs.name === 'Opera') {
+ isOpera = true;
+ if(browserSpecs.version >= 33){
+ return true;
+ }
+ else{
+ return false;
+ }
+ }
+ if(browserSpecs.name === 'Firefox') {
+ isFireFox = true;
+ if(browserSpecs.version >= 52){
+ return true;
+ }
+ else{
+ return false;
+ }
+ }
+ if(browserSpecs.name === 'Chrome') {
+ if(browserSpecs.version >= 42){
+ return true;
+ }
+ else{
+ return false;
+ }
+ }
+ //В Сафари начиная с 12 версии нет NPAPI
+ if(browserSpecs.name === 'Safari') {
+ isSafari = true;
+ if(browserSpecs.version >= 12) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+ }
+
+ // Функция активации объектов КриптоПро ЭЦП Browser plug-in
+ function CreateObject(name) {
+ if (isIOS()) {
+ // На iOS для создания объектов используется функция
+ // call_ru_cryptopro_npcades_10_native_bridge, определенная в IOS_npcades_supp.js
+ return call_ru_cryptopro_npcades_10_native_bridge("CreateObject", [name]);
+ }
+ if (isIE()) {
+ // В Internet Explorer создаются COM-объекты
+ if (name.match(/X509Enrollment/i)) {
+ try {
+ // Объекты CertEnroll пробуем создавать через нашу фабрику,
+ // если не получилось то через CX509EnrollmentWebClassFactory
+ var objCertEnrollClassFactory = document.getElementById("webClassFactory");
+ return objCertEnrollClassFactory.CreateObject(name);
+ }
+ catch (e) {
+ try {
+ var objWebClassFactory = document.getElementById("certEnrollClassFactory");
+ return objWebClassFactory.CreateObject(name);
+ }
+ catch (err) {
+ throw ("Для создания обьектов X509Enrollment следует настроить веб-узел на использование проверки подлинности по протоколу HTTPS");
+ }
+ }
+ }
+ // Объекты CAPICOM и CAdESCOM создаются через CAdESCOM.WebClassFactory
+ try {
+ var objWebClassFactory = document.getElementById("webClassFactory");
+ return objWebClassFactory.CreateObject(name);
+ }
+ catch (e) {
+ // Для версий плагина ниже 2.0.12538
+ return new ActiveXObject(name);
+ }
+ }
+ // создаются объекты NPAPI
+ return pluginObject.CreateObject(name);
+ }
+
+ function decimalToHexString(number) {
+ if (number < 0) {
+ number = 0xFFFFFFFF + number + 1;
+ }
+
+ return number.toString(16).toUpperCase();
+ }
+
+ function GetMessageFromException(e) {
+ var err = e.message;
+ if (!err) {
+ err = e;
+ } else if (e.number) {
+ err += " (0x" + decimalToHexString(e.number) + ")";
+ }
+ return err;
+ }
+
+ function getLastError(exception) {
+ if(isNativeMessageSupported() || isIE() || isIOS() ) {
+ return GetMessageFromException(exception);
+ }
+
+ try {
+ return pluginObject.getLastError();
+ } catch(e) {
+ return GetMessageFromException(exception);
+ }
+ }
+
+ // Функция для удаления созданных объектов
+ function ReleasePluginObjects() {
+ return cpcsp_chrome_nmcades.ReleasePluginObjects();
+ }
+
+ // Функция активации асинхронных объектов КриптоПро ЭЦП Browser plug-in
+ function CreateObjectAsync(name) {
+ return pluginObject.CreateObjectAsync(name);
+ }
+
+ //Функции для IOS
+ var ru_cryptopro_npcades_10_native_bridge = {
+ callbacksCount : 1,
+ callbacks : {},
+
+ // Automatically called by native layer when a result is available
+ resultForCallback : function resultForCallback(callbackId, resultArray) {
+ var callback = ru_cryptopro_npcades_10_native_bridge.callbacks[callbackId];
+ if (!callback) return;
+ callback.apply(null,resultArray);
+ },
+
+ // Use this in javascript to request native objective-c code
+ // functionName : string (I think the name is explicit :p)
+ // args : array of arguments
+ // callback : function with n-arguments that is going to be called when the native code returned
+ call : function call(functionName, args, callback) {
+ var hasCallback = callback && typeof callback === "function";
+ var callbackId = hasCallback ? ru_cryptopro_npcades_10_native_bridge.callbacksCount++ : 0;
+
+ if (hasCallback)
+ ru_cryptopro_npcades_10_native_bridge.callbacks[callbackId] = callback;
+
+ var iframe = document.createElement("IFRAME");
+ var arrObjs = new Array("_CPNP_handle");
+ try{
+ iframe.setAttribute("src", "cpnp-js-call:" + functionName + ":" + callbackId+ ":" + encodeURIComponent(JSON.stringify(args, arrObjs)));
+ } catch(e){
+ alert(e);
+ }
+ document.documentElement.appendChild(iframe);
+ iframe.parentNode.removeChild(iframe);
+ iframe = null;
+ }
+ };
+
+ function call_ru_cryptopro_npcades_10_native_bridge(functionName, array){
+ var tmpobj;
+ var ex;
+ ru_cryptopro_npcades_10_native_bridge.call(functionName, array, function(e, response){
+ ex = e;
+ var str='tmpobj='+response;
+ eval(str);
+ if (typeof (tmpobj) === "string"){
+ tmpobj = tmpobj.replace(/\\\n/gm, "\n");
+ tmpobj = tmpobj.replace(/\\\r/gm, "\r");
+ }
+ });
+ if(ex)
+ throw ex;
+ return tmpobj;
+ }
+
+ function show_firefox_missing_extension_dialog()
+ {
+ if (!window.cadesplugin_skip_extension_install)
+ {
+ var ovr = document.createElement('div');
+ ovr.id = "cadesplugin_ovr";
+ ovr.style = "visibility: hidden; position: fixed; left: 0px; top: 0px; width:100%; height:100%; background-color: rgba(0,0,0,0.7)";
+ ovr.innerHTML = "
" +
+ "
" +
+ "
Для работы КриптоПро ЭЦП Browser plugin на данном сайте необходимо расширение для браузера. Убедитесь, что оно у Вас включено или установите его." +
+ "
Скачать расширение
" +
+ "
";
+ document.getElementsByTagName("Body")[0].appendChild(ovr);
+ document.getElementById("cadesplugin_close_install").addEventListener('click',function()
+ {
+ plugin_loaded_error("Плагин недоступен");
+ document.getElementById("cadesplugin_ovr").style.visibility = 'hidden';
+ });
+
+ ovr.addEventListener('click',function()
+ {
+ plugin_loaded_error("Плагин недоступен");
+ document.getElementById("cadesplugin_ovr").style.visibility = 'hidden';
+ });
+ ovr.style.visibility="visible";
+ }
+ }
+
+
+ //Выводим окно поверх других с предложением установить расширение для Opera.
+ //Если установленна переменная cadesplugin_skip_extension_install - не предлагаем установить расширение
+ function install_opera_extension()
+ {
+ if (!window.cadesplugin_skip_extension_install)
+ {
+ document.addEventListener('DOMContentLoaded', function() {
+ var ovr = document.createElement('div');
+ ovr.id = "cadesplugin_ovr";
+ ovr.style = "visibility: hidden; position: fixed; left: 0px; top: 0px; width:100%; height:100%; background-color: rgba(0,0,0,0.7)";
+ ovr.innerHTML = "
" +
+ "
" +
+ "
Для работы КриптоПро ЭЦП Browser plugin на данном сайте необходимо установить расширение из каталога дополнений Opera." +
+ "
" +
+ "
";
+ document.getElementsByTagName("Body")[0].appendChild(ovr);
+ var btn_install = document.getElementById("cadesplugin_install");
+ btn_install.addEventListener('click', function(event) {
+ opr.addons.installExtension("epebfcehmdedogndhlcacafjaacknbcm",
+ function()
+ {
+ document.getElementById("cadesplugin_ovr").style.visibility = 'hidden';
+ location.reload();
+ },
+ function(){})
+ });
+ document.getElementById("cadesplugin_close_install").addEventListener('click',function()
+ {
+ plugin_loaded_error("Плагин недоступен");
+ document.getElementById("cadesplugin_ovr").style.visibility = 'hidden';
+ });
+
+ ovr.addEventListener('click',function()
+ {
+ plugin_loaded_error("Плагин недоступен");
+ document.getElementById("cadesplugin_ovr").style.visibility = 'hidden';
+ });
+ ovr.style.visibility="visible";
+ document.getElementById("cadesplugin_ovr_item").addEventListener('click',function(e){
+ e.stopPropagation();
+ });
+ });
+ }else
+ {
+ plugin_loaded_error("Плагин недоступен");
+ }
+ }
+
+ function firefox_or_edge_nmcades_onload() {
+ cpcsp_chrome_nmcades.check_chrome_plugin(plugin_loaded, plugin_loaded_error);
+ }
+
+ function nmcades_api_onload () {
+ window.postMessage("cadesplugin_echo_request", "*");
+ window.addEventListener("message", function (event){
+ if (typeof(event.data) !== "string" || !event.data.match("cadesplugin_loaded"))
+ return;
+ if(isFireFox || isEdge || isSafari)
+ {
+ // Для Firefox, Сафари, Edge вместе с сообщением cadesplugin_loaded прилетает url для загрузки nmcades_plugin_api.js
+ var url = event.data.substring(event.data.indexOf("url:") + 4);
+ var fileref = document.createElement('script');
+ fileref.setAttribute("type", "text/javascript");
+ fileref.setAttribute("src", url);
+ fileref.onerror = plugin_loaded_error;
+ fileref.onload = firefox_or_edge_nmcades_onload;
+ document.getElementsByTagName("head")[0].appendChild(fileref);
+ // Для Firefox, Safari и Edge у нас только по одному расширению.
+ failed_extensions++;
+ }else {
+ cpcsp_chrome_nmcades.check_chrome_plugin(plugin_loaded, plugin_loaded_error);
+ }
+ }, false);
+ }
+
+ //Загружаем расширения для Chrome, Opera, YaBrowser, FireFox, Edge, Safari
+ function load_extension()
+ {
+
+ if(isFireFox || isEdge || isSafari){
+ // вызываем callback руками т.к. нам нужно узнать ID расширения. Он уникальный для браузера.
+ nmcades_api_onload();
+ } else {
+ // в асинхронном варианте для chrome и opera подключаем оба расширения
+ var fileref = document.createElement('script');
+ fileref.setAttribute("type", "text/javascript");
+ fileref.setAttribute("src", "chrome-extension://iifchhfnnmpdbibifmljnfjhpififfog/nmcades_plugin_api.js");
+ fileref.onerror = plugin_loaded_error;
+ fileref.onload = nmcades_api_onload;
+ document.getElementsByTagName("head")[0].appendChild(fileref);
+ fileref = document.createElement('script');
+ fileref.setAttribute("type", "text/javascript");
+ fileref.setAttribute("src", "chrome-extension://epebfcehmdedogndhlcacafjaacknbcm/nmcades_plugin_api.js");
+ fileref.onerror = plugin_loaded_error;
+ fileref.onload = nmcades_api_onload;
+ document.getElementsByTagName("head")[0].appendChild(fileref);
+ }
+ }
+
+ //Загружаем плагин для NPAPI
+ function load_npapi_plugin()
+ {
+ var elem = document.createElement('object');
+ elem.setAttribute("id", "cadesplugin_object");
+ elem.setAttribute("type", "application/x-cades");
+ elem.setAttribute("style", "visibility: hidden");
+ document.getElementsByTagName("body")[0].appendChild(elem);
+ pluginObject = document.getElementById("cadesplugin_object");
+ if(isIE())
+ {
+ var elem1 = document.createElement('object');
+ elem1.setAttribute("id", "certEnrollClassFactory");
+ elem1.setAttribute("classid", "clsid:884e2049-217d-11da-b2a4-000e7bbb2b09");
+ elem1.setAttribute("style", "visibility: hidden");
+ document.getElementsByTagName("body")[0].appendChild(elem1);
+ var elem2 = document.createElement('object');
+ elem2.setAttribute("id", "webClassFactory");
+ elem2.setAttribute("classid", "clsid:B04C8637-10BD-484E-B0DA-B8A039F60024");
+ elem2.setAttribute("style", "visibility: hidden");
+ document.getElementsByTagName("body")[0].appendChild(elem2);
+ }
+ }
+
+ //Отправляем событие что все ок.
+ function plugin_loaded()
+ {
+ plugin_resolved = 1;
+ if(canPromise)
+ {
+ plugin_resolve();
+ }else {
+ window.postMessage("cadesplugin_loaded", "*");
+ }
+ }
+
+ //Отправляем событие что сломались.
+ function plugin_loaded_error(msg)
+ {
+ if(isNativeMessageSupported())
+ {
+ //в асинхронном варианте подключаем оба расширения, если сломались оба пробуем установить для Opera
+ failed_extensions++;
+ if(failed_extensions<2)
+ return;
+ if(isOpera && (typeof(msg) === 'undefined'|| typeof(msg) === 'object'))
+ {
+ install_opera_extension();
+ return;
+ }
+ }
+ if(typeof(msg) === 'undefined' || typeof(msg) === 'object')
+ msg = "Плагин недоступен";
+ plugin_resolved = 1;
+ if(canPromise)
+ {
+ plugin_reject(msg);
+ } else {
+ window.postMessage("cadesplugin_load_error", "*");
+ }
+ }
+
+ //проверяем что у нас хоть какое то событие ушло, и если не уходило кидаем еще раз ошибку
+ function check_load_timeout()
+ {
+ if(plugin_resolved === 1)
+ return;
+ if(isFireFox)
+ {
+ show_firefox_missing_extension_dialog();
+ }
+ plugin_resolved = 1;
+ if(canPromise)
+ {
+ plugin_reject("Истекло время ожидания загрузки плагина");
+ } else {
+ window.postMessage("cadesplugin_load_error", "*");
+ }
+
+ }
+
+ //Вспомогательная функция для NPAPI
+ function createPromise(arg)
+ {
+ return new Promise(arg);
+ }
+
+ function check_npapi_plugin (){
+ try {
+ var oAbout = CreateObject("CAdESCOM.About");
+ plugin_loaded();
+ }
+ catch (err) {
+ document.getElementById("cadesplugin_object").style.display = 'none';
+ // Объект создать не удалось, проверим, установлен ли
+ // вообще плагин. Такая возможность есть не во всех браузерах
+ var mimetype = navigator.mimeTypes["application/x-cades"];
+ if (mimetype) {
+ var plugin = mimetype.enabledPlugin;
+ if (plugin) {
+ plugin_loaded_error("Плагин загружен, но не создаются обьекты");
+ }else
+ {
+ plugin_loaded_error("Ошибка при загрузке плагина");
+ }
+ }else
+ {
+ plugin_loaded_error("Плагин недоступен");
+ }
+ }
+ }
+
+ //Проверяем работает ли плагин
+ function check_plugin_working()
+ {
+ var div = document.createElement("div");
+ div.innerHTML = "";
+ var isIeLessThan9 = (div.getElementsByTagName("i").length === 1);
+ if (isIeLessThan9) {
+ plugin_loaded_error("Internet Explorer версии 8 и ниже не поддерживается");
+ return;
+ }
+
+ if(isNativeMessageSupported())
+ {
+ load_extension();
+ }else if(!canPromise) {
+ window.addEventListener("message", function (event){
+ if (event.data !== "cadesplugin_echo_request")
+ return;
+ load_npapi_plugin();
+ check_npapi_plugin();
+ },
+ false);
+ }else
+ {
+ if(document.readyState === "complete"){
+ load_npapi_plugin();
+ check_npapi_plugin();
+ } else {
+ window.addEventListener("load", function (event) {
+ load_npapi_plugin();
+ check_npapi_plugin();
+ }, false);
+ }
+ }
+ }
+
+ function set_pluginObject(obj)
+ {
+ pluginObject = obj;
+ }
+
+ function is_capilite_enabled()
+ {
+ if ((typeof (cadesplugin.EnableInternalCSP) !== 'undefined') && cadesplugin.EnableInternalCSP)
+ return true;
+ return false;
+ };
+
+ //Export
+ cadesplugin.JSModuleVersion = "2.1.2";
+ cadesplugin.async_spawn = async_spawn;
+ cadesplugin.set = set_pluginObject;
+ cadesplugin.set_log_level = set_log_level;
+ cadesplugin.getLastError = getLastError;
+ cadesplugin.is_capilite_enabled = is_capilite_enabled;
+
+ if(isNativeMessageSupported())
+ {
+ cadesplugin.CreateObjectAsync = CreateObjectAsync;
+ cadesplugin.ReleasePluginObjects = ReleasePluginObjects;
+ }
+
+ if(!isNativeMessageSupported())
+ {
+ cadesplugin.CreateObject = CreateObject;
+ }
+
+ if(window.cadesplugin_load_timeout)
+ {
+ setTimeout(check_load_timeout, window.cadesplugin_load_timeout);
+ }
+ else
+ {
+ setTimeout(check_load_timeout, 20000);
+ }
+
+ set_constantValues();
+
+ cadesplugin.current_log_level = cadesplugin.LOG_LEVEL_ERROR;
+ window.cadesplugin = cadesplugin;
+ check_plugin_working();
+}());
\ No newline at end of file
diff --git a/reducers/initialState.js b/reducers/initialState.js
index 4be9843..1ad1fd3 100644
--- a/reducers/initialState.js
+++ b/reducers/initialState.js
@@ -122,6 +122,7 @@ export const defaultState = {
individual_executive: "",
other_control: "",
nko: false,
+ accept: false,
},
legal_address: {
title: "",
@@ -198,6 +199,7 @@ export const defaultState = {
},
signatory_person_files: [],
founded_persons_template: {
+ signatory_id: null,
lastname: "",
firstname: "",
middlename: "",
@@ -260,6 +262,17 @@ export const defaultState = {
}
}
},
+ non_profit: {
+ fin_source_business: false,
+ fin_source_donate: false,
+ fin_source_fees: false,
+ fin_source_another: false,
+ fin_source_another_description: "",
+ foreign_payers: false,
+ fin_goals_cars: "",
+ fin_goals_trucks: "",
+ fin_goals_special: "",
+ },
},
};
diff --git a/store/index.js b/store/index.js
index 4711c28..423b147 100644
--- a/store/index.js
+++ b/store/index.js
@@ -48,7 +48,7 @@ const makeStore = (context) =>
const persistConfig = {
key: 'lkevoleasing',
- whitelist: [ 'auth', 'user', 'company', 'events', 'companies', 'contracts_info', 'contract_events', 'contract_fines', 'questionnaire'],
+ whitelist: [ 'auth', 'user', 'company', 'events', 'companies', 'contracts_info', 'contract_events', 'contract_fines', ],
storage
};
diff --git a/utils/digital_signature/index.js b/utils/digital_signature/index.js
new file mode 100644
index 0000000..68fb0a7
--- /dev/null
+++ b/utils/digital_signature/index.js
@@ -0,0 +1,401 @@
+import moment from "moment";
+
+export function isPluginCryptoProInstalled()
+{
+ return new Promise(function(resolve, reject)
+ {
+ console.log("isPluginCryptoProInstalled");
+ console.log("window.cadesplugin", window.cadesplugin);
+
+ window.cadesplugin.async_spawn(function *(args)
+ {
+ try {
+ yield window.cadesplugin
+ } catch (e) {
+ reject({message: e})
+ return;
+ }
+
+ resolve();
+ });
+ });
+}
+
+/**
+* Получение списка сертификатов пользователя
+* @returns {*}
+*/
+export function getCertificates()
+{
+ return new Promise(function(resolve, reject)
+ {
+ window.cadesplugin.async_spawn(function *(args)
+ {
+ try {
+ var store = yield window.cadesplugin.CreateObjectAsync("CAdESCOM.Store");
+
+ yield store.Open(
+ window.cadesplugin.CAPICOM_CURRENT_USER_STORE,
+ window.cadesplugin.CAPICOM_MY_STORE,
+ window.cadesplugin.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED
+ );
+ var certificates = yield store.Certificates;
+ var certificatesCount = yield certificates.Count
+
+ var data = [];
+ for (let i = 0; i < certificatesCount; i++)
+ {
+ let certificate = yield certificates.Item(i+1)
+
+ data.push({
+ index: i+1,
+ certificate: certificate,
+ info: {
+ subjectName: parseSubjectNameToObj(yield certificate.SubjectName)['name'],
+ subjectFields: parseSubjectNameToArray(yield certificate.SubjectName),
+ issuerName: yield certificate.IssuerName,
+ validFromDate: yield certificate.ValidFromDate,
+ validToDate: yield certificate.ValidToDate
+ }
+ });
+ }
+
+ store.Close();
+ resolve(data);
+ } catch (e) {
+ reject(e);
+ }
+ });
+ });
+}
+
+/**
+* Парсинг данных владельца сертификата
+* @param string - Строка с информацией о владельце
+* @returns {[{}]}
+*
+* example:
+* input: 'C=RU, S="Магаданская область", L=Магадан, O="OOO ""Несуществующая компания""", OU=Подразделение, CN=Иван Иванов, E=ivan@mail.ru'
+* output: [{
+* fieldName: 'Имя',
+* value: 'Иван Иванов'
+* }, {
+* fieldName: 'Электронная почта',
+* value: 'ivan@mail.ru'
+* }, {
+* fieldName: 'Страна',
+* value: 'RU'
+* }, {
+* fieldName: 'Область, шташ',
+* value: '"Магаданская область"'
+* }, {
+* fieldName: 'Город',
+* value: 'Магадан'
+* }, {
+* fieldName: 'Организация',
+* value: 'OOO ""Несуществующая компания""'
+* }, {
+* fieldName: 'Подраздиление',
+* value: 'Подразделение'
+* }]
+*
+*/
+
+function parseSubjectNameToArray(string)
+{
+ let outputData = [];
+
+ let fieldsNames = {
+ 'CN': 'Имя',
+ 'E': 'Электронная почта',
+ 'C': 'Страна',
+ 'S': 'Область, штат',
+ 'L': 'Город',
+ 'O': 'Организация',
+ 'OU': 'Подраздиление'
+ };
+
+ // 'C=RU, S="Область, штат"' -> [['C', 'RU'], ['S', '"Область, штат"']]
+
+ let reg = RegExp('[а-яА-Я\\w]*=.*?((?=, [а-яА-Я\\w]+=)|$)','g');
+ let fields = string.matchAll(reg);
+ fields = Array.from(fields, x => x[0]);
+ fields = fields.map(field => field.split('='));
+
+ fields.forEach(field => {
+ if (field[0] in fieldsNames)
+ {
+ let fieldName = fieldsNames[field[0]];
+ outputData.push({
+ fieldName: fieldName,
+ value: field[1]
+ });
+ }
+ });
+
+ return outputData;
+}
+
+/**
+* Парсинг данных владельца сертификата
+* @param string - Строка с информацией о владельце
+* @returns {{}}
+*
+* example:
+* input: 'C=RU, S="Магаданская область", L=Магадан, O="OOO ""Несуществующая компания""", OU=Подразделение, CN=Иван Иванов, E=ivan@mail.ru'
+* output: {
+* name: 'Иван Иванов',
+* email: 'ivan@mail.ru',
+* country: 'RU',
+* state: '"Магаданская область"',
+* city: 'Магадан',
+* organization: '"OOO ""Несуществующая компания"""',
+* subdivision: 'Подразделение'
+* }
+*
+*/
+function parseSubjectNameToObj(string)
+{
+ let outputData = [];
+
+ let fieldsNames = {
+ 'CN': 'name',
+ 'E': 'email',
+ 'C': 'country',
+ 'S': 'state',
+ 'L': 'city',
+ 'O': 'organization',
+ 'OU': 'subdivision'
+ };
+
+ // 'C=RU, S="Область, штат"' -> [['C', 'RU'], ['S', '"Область, штат"']]
+ let reg = RegExp('[а-яА-Я\\w]*=.*?((?=, [а-яА-Я\\w]+=)|$)','g');
+ let fields = string.matchAll(reg);
+ fields = Array.from(fields, x => x[0]);
+ fields = fields.map(field => field.split('='));
+
+ fields.forEach(field => {
+ if (field[0] in fieldsNames)
+ {
+ let fieldName = fieldsNames[field[0]];
+ outputData[fieldName] = field[1];
+ }
+ });
+
+ return outputData;
+}
+
+/**
+* Подпись данных
+* @param dataToSign {String} - Данные для подписи
+* @param certificate - Сертификат подписи
+*
+* @param returnObj - RETURN_DATA | RETURN_SIGNATURE
+* RETURN_SIGNED_DATA - Возвращает подписанный файл
+* RETURN_SIGNATURE - Возвращает подпись
+*
+* @param signingType - SIGN_ALL_DATA | ADD_SIGNATURE_TO_DATA
+* SIGN_ALL_DATA - Подписать данные целиком
+* ADD_SIGNATURE_TO_DATA - Добавить подпись к уже подписанным данным
+*
+* @returns {*}
+*/
+export function signData(dataToSign, certificate, returnObj, signingType)
+{
+ return new Promise(function(resolve, reject)
+ {
+ window.cadesplugin.async_spawn(function *(args)
+ {
+ try {
+ var oSigner = yield window.cadesplugin.CreateObjectAsync("CAdESCOM.CPSigner");
+ yield oSigner.propset_Certificate(certificate);
+
+ var oSignedData = yield window.cadesplugin.CreateObjectAsync("CAdESCOM.CadesSignedData");
+ var CADES_BES = 1;
+
+ yield oSignedData.propset_ContentEncoding(1); //CADESCOM_BASE64_TO_BINARY
+ yield oSignedData.propset_Content(dataToSign);
+ yield oSigner.propset_Options(window.cadesplugin.CAPICOM_CERTIFICATE_INCLUDE_END_ENTITY_ONLY);
+
+ let returnObjFlags = {
+ 'RETURN_SIGNED_DATA': false,
+ 'RETURN_SIGNATURE': true
+ };
+
+ let returnObjFlag = returnObjFlags[returnObj];
+ if (returnObjFlag === undefined)
+ {
+ reject("Некорректное значения параметра returnObj. Данный параметр может принимать значения RETURN_SIGNED_DATA или RETURN_SIGNATURE");
+ return;
+ }
+
+ let signedData = '';
+ if (signingType === 'SIGN_ALL_DATA')
+ {
+ signedData = yield oSignedData.SignCades(oSigner, CADES_BES, returnObjFlag);
+ }
+ else if (signingType === 'ADD_SIGNATURE_TO_DATA')
+ {
+ yield oSignedData.VerifyCades(dataToSign, CADES_BES);
+ signedData = yield oSignedData.CoSignCades(oSigner, CADES_BES, returnObjFlag);
+ }
+ else
+ {
+ reject('Incorrect signature type');
+ }
+
+ resolve(signedData);
+ } catch (e)
+ {
+ console.error(e);
+ reject(e);
+ }
+ });
+ });
+}
+
+/**
+* Проверка наличия у данных подписи
+* @param data
+* @returns {*} - true | false
+* true - данные подписаны
+* false - данные не подписаны
+*/
+export function hasDataSignature(data)
+{
+ return new Promise((resolve, reject) =>
+ {
+ window.cadesplugin.async_spawn(function *(args)
+ {
+ try
+ {
+ var oSignedData = yield window.cadesplugin.CreateObjectAsync("CAdESCOM.CadesSignedData");
+ try
+ {
+ let CADES_BES = 1;
+ yield oSignedData.VerifyCades(data, CADES_BES);
+ resolve(true);
+ }
+ catch (e2)
+ {
+ resolve(false);
+ }
+ }
+ catch (e)
+ {
+ reject(e);
+ }
+ });
+ });
+}
+
+/**
+* Подписание файла
+* @param file - Файл для подписи
+* @param certificate - Сертификат подписи
+*
+* @param returnObj - RETURN_DATA | RETURN_SIGNATURE
+* RETURN_SIGNED_DATA - Возвращает подписанный файл
+* RETURN_SIGNATURE - Возвращает подпись
+*
+* @returns Подписанный файл
+*/
+export function signing(file, certificate, returnObj)
+{
+ return new Promise((resolve, reject) =>
+ {
+ // Подписываем файл, у которого нет подписи
+ let handlerWithoutSig = (file) =>
+ {
+ return new Promise((resolve, reject) =>
+ {
+ var oFReader = new FileReader();
+ oFReader.readAsDataURL(file);
+ oFReader.onload = (oFREvent) =>
+ {
+ var header = ";base64,";
+ var sFileData = oFREvent.target.result;
+ var sBase64Data = sFileData.substr(sFileData.indexOf(header) + header.length);
+
+ signData(sBase64Data, certificate, returnObj, 'SIGN_ALL_DATA').then(resolve, reject);
+ }
+ });
+ }
+
+ // Подписываем файл, у которого уже есть подпись
+ let handlerWithSig = (file) =>
+ {
+ return new Promise((resolve, reject) =>
+ {
+ file.text()
+ .then(text =>
+ {
+ signData(text, certificate, returnObj, 'ADD_SIGNATURE_TO_DATA').then(resolve, reject);
+ })
+ .catch(reject);
+ });
+ }
+
+ file.text()
+ .then(text =>
+ {
+ return hasDataSignature(text)
+ })
+ .then(result =>
+ {
+ if (result)
+ {
+ return handlerWithSig(file)
+ }
+ else
+ {
+ return handlerWithoutSig(file)
+ }
+ })
+ .then(resolve).catch(reject);
+ });
+}
+
+/**
+* Подпись файла и вернуть подписанный файл
+* @param file - Файл для подписи
+* @param certificate - Сертификат подписи
+* @returns Подписанный файл
+*/
+export function signFile(file, certificate)
+{
+ return new Promise((resolve, reject) =>
+ {
+ signing(file, certificate, 'RETURN_SIGNED_DATA')
+ .then(signedData =>
+ {
+ let filename = file.name + '.sig';
+ let signedFile = new File([signedData], filename);
+
+ resolve(signedFile);
+ })
+ .catch(reject);
+ });
+}
+
+/**
+* Подписать файл и вернуть файл с данными подписи
+* @param file - Файл для подписи
+* @param certificate - Сертификат подписи
+* @returns Подписанный файл
+*/
+export function generateSignature(file, certificate)
+{
+ return new Promise((resolve, reject) =>
+ {
+ signing(file, certificate, 'RETURN_SIGNATURE')
+ .then(signedData =>
+ {
+ let filename = file.name + '.sig';
+ let signedFile = new File([signedData], filename);
+
+ resolve(signedFile);
+ })
+ .catch(reject);
+ });
+}
\ No newline at end of file
diff --git a/yarn.lock b/yarn.lock
index f4f54e5..5ff69d9 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -249,6 +249,11 @@
resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45"
integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==
+"@mpth/react-no-ssr@^1.0.1":
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/@mpth/react-no-ssr/-/react-no-ssr-1.0.1.tgz#4840b157d38b51ef3014959e9de6420e5d788695"
+ integrity sha512-roOiU0MFvoB75kESxKI+w2QVK6DGQLFOPOWzcnFfaVJCuvrpbUf0AgppTtchV/hEVk/ltXpe3lgrQybQpkGO2g==
+
"@nano-sql/core@^2.3.7":
version "2.3.7"
resolved "https://registry.yarnpkg.com/@nano-sql/core/-/core-2.3.7.tgz#df4ea7916272cab7c4a4bf4294197dd64637fe59"
@@ -687,14 +692,6 @@ babel-plugin-macros@^3.1.0:
cosmiconfig "^7.0.0"
resolve "^1.19.0"
-babel-runtime@6.x.x:
- version "6.26.0"
- resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
- integrity sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==
- dependencies:
- core-js "^2.4.0"
- regenerator-runtime "^0.11.0"
-
balanced-match@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
@@ -1076,11 +1073,6 @@ core-js-pure@^3.20.2:
resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.24.1.tgz#8839dde5da545521bf282feb7dc6d0b425f39fd3"
integrity sha512-r1nJk41QLLPyozHUUPmILCEMtMw24NG4oWK6RbsDdjzQgg9ZvrUsPBj1MnG0wXXp1DCDU6j+wUvEmBSrtRbLXg==
-core-js@^2.4.0:
- version "2.6.12"
- resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec"
- integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==
-
core-util-is@~1.0.0:
version "1.0.3"
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85"
@@ -3320,13 +3312,6 @@ react-lifecycles-compat@^3.0.4:
resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362"
integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==
-react-no-ssr@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/react-no-ssr/-/react-no-ssr-1.1.0.tgz#313b48d2e26020f969ed98e472f10481604e3cc8"
- integrity sha512-3td8iPIEFKWXOJ3Ar5xURvZAsv/aIlngJLBH6fP5QC3WhsfuO2pn7WQR0ZlkTE0puWCL0RDEvXtOfAg4qMp+xA==
- dependencies:
- babel-runtime "6.x.x"
-
react-redux@^7.2.6:
version "7.2.8"
resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.8.tgz#a894068315e65de5b1b68899f9c6ee0923dd28de"
@@ -3474,11 +3459,6 @@ redux@^4.0.0, redux@^4.1.2:
dependencies:
"@babel/runtime" "^7.9.2"
-regenerator-runtime@^0.11.0:
- version "0.11.1"
- resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
- integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==
-
regenerator-runtime@^0.13.4:
version "0.13.9"
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52"