Untitled
unknown
php
2 years ago
31 kB
7
Indexable
<script src="https://dls.yt.uz/e-imzo.js" type="text/javascript"></script> <script src="https://dls.yt.uz/e-imzo-client.js" type="text/javascript"></script> <? $arResult = CFormResult::GetDataByIDForHTML($arParams["RESULT_ID"]); require_once($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php"); CJSCore::Init(); $APPLICATION->ShowHeadStrings(); # если массив у нас пустой, то: if (empty($arResult)) { $arResult = "null"; } if(!empty($arResult)) { $jsonResult = json_encode($arResult); $jsonResult = md5($jsonResult); if($jsonResult === "9b41ef67651c18488a8b08bb67c75699" || $jsonResult === "37A6259CC0C1DAE299A7866489DFF0BD" || $jsonResult === "37a6259cc0c1dae299a7866489dff0bd") { $jsonResult = "null"; } } $webFormID = $arParams["RESULT_ID"]; if (CModule::IncludeModule("form")) { $arAnswer = CFormResult::GetDataByID($webFormID,array(),$arResult,$arAnswer2); } if (!empty($arAnswer["ecp_field"][0]["USER_TEXT"])) {?> <div class="remodal" data-remodal-id="resident-modal" role="dialog" aria-labelledby="Подписать форму" aria-describedby="Подписать форму" data-remodal-options="hashTracking: false, closeOnOutsideClick: true"> <button data-remodal-action="close" class="remodal-close" aria-label="Close"></button> <div id="besigned"></div> <div class="sign-btn-group"> <button data-remodal-action="cancel" class="danger-btn">Закрыть</button> </div> </div> <script> var pkcgo = '<?=$arAnswer["ecp_field"][0]["USER_TEXT"]?>'; var tsigo = ''; window.onload = function() { CAPIWS.callFunction ( { plugin :"pkcs7", name :"get_pkcs7_attached_info", arguments :[ //Ранее созданный документ PKCS#7/CMS в кодировке BASE64 pkcgo, //Идентификатор хранилища доверенных сертификатов (полученный из фукнции других плагинов), если требуется верификация сертификатов, иначе может быть пустым tsigo ] }, function(event, data) { var sign_key = data.pkcs7Info.signers[0].certificate[0].serialNumber, getjson = document.getElementById("json"), signerdata = QueryStringToJSON(data.pkcs7Info.signers[0].certificate[0].subjectName), verifierdata = QueryStringToJSON(data.pkcs7Info.signers[0].certificate[0].issuerName), sign_time = data.pkcs7Info.signers[0].signingTime, finishjson = { signed_data : utftexts(atob(data.pkcs7Info.documentBase64)), valid_from : data.pkcs7Info.signers[0].certificate[0].validFrom, valid_to : data.pkcs7Info.signers[0].certificate[0].validTo, signer_inn : signerdata["1.2.860.3.16.1.1"], signer_company_type : signerdata.BusinessCategory, signer_country : signerdata.C, signer_fullname : signerdata.CN, signer_district : signerdata.L, signer_name : signerdata.Name, signer_company : signerdata.O, signer_city : signerdata.ST, signer_surname : signerdata.SURNAME, signer_position : signerdata.T, signer_uid : signerdata.UID, verifier_country : verifierdata.C, verifier_fullname : verifierdata.CN, verifier_email : verifierdata.E, verifier_district : verifierdata.L, verifier_company : verifierdata.O, verifier_position : verifierdata.T, verifier_undefined_field : verifierdata.OU, sign_inner : pkcgo, sign_key_id : sign_key, signing_time : sign_time, signed_form_id : '<?=$webFormID?>' }; // console.log(finishjson); // в переменной pkcs7 хранится результат его тут надо передать по аяксу, в нужный скрипт var GridElements = BX.create('DIV', { props: { className: 'sign-detail-container' }, children: [ BX.create('H3', { props: { className: 'sign-detail-title' }, html: 'Документ подписан' }), BX.create('UL', { props: { className: 'sign-detail-list' }, children: [ BX.create('LI', { html: "<span>Дата:</span> " + finishjson.signing_time }), BX.create('LI', { html: "<span>Сертификат подписи:</span> " + finishjson.sign_key_id }), BX.create('LI', { html: "<span>Компания:</span> " + finishjson.signer_company }), BX.create('LI', { html: "<span>ИНН:</span> " + finishjson.signer_inn }), BX.create('LI', { html: "<span>Ф.И.О:</span> " + finishjson.signer_fullname }), ] }), ] }); $('#besigned').html(GridElements); if (finishjson.signed_data !== '<?=$jsonResult?>') { var newnode = BX.create('P', { html: "Веб форма была изменена!" }); document.getElementById("besigned").append(newnode); } }, function(error) { window.alert(error); } ); } </script> <?} else {?> <div class="remodal" data-remodal-id="resident-modal" role="dialog" aria-labelledby="Подписать форму" aria-describedby="Подписать форму" data-remodal-options="hashTracking: false, closeOnOutsideClick: false"> <button data-remodal-action="close" class="remodal-close" aria-label="Close"></button> <?if(MicrosResidentSign::ValidationFields() == false){?> <form name="signForm" id="signFormForm"> <div class="eimzo-container"> <div class="row"> <div class="col-md-12"> <div id="msgserr"></div> <div class="col-md-4"> <div class="msg-title">Выберите ключ</div> <label id="message"></label> </div> <div class="col-md-8"> <div class="fields-groups"> <select name="key" class="inputselect" id="key" onchange="cbChanged(this)"></select> </div> </div> </div> <div class="sign-btn-group"> <button data-remodal-action="cancel" class="danger-btn">Отмена</button> <input type="hidden" name="data" value="<?=$jsonResult?>"/> <button onclick="sign()" class="sign-btn" id="signBtn" type="button">Подписать веб форму</button> <input type hidden id="keyId"> </div> </div> </div> </form> <?}else{?> <style> @media only screen and (min-width: 641px) { .remodal { max-width: 800px; } } </style> <div class="msg-title valid-title">Не заполнены следующие обязательные поля<span class="error">*</span></div> <div class="validation-block"> <?foreach (MicrosResidentSign::ValidationFields() as $stepCode => $group){?> <h3>Шаг: <?=$group['STEP_DETAILS']['UF_FORM_STEP_NAME']?></h3> <ul> <?foreach ($group['FIELDS'] as $FRequired){?> <li> <div class="valid-item"> <p class="error">» "<?=TruncateText($FRequired['FNAME'], '30')?>"</p> </div> </li> <?}?> </ul> <?}?> </div> <div class="sign-btn-group"> <button data-remodal-action="cancel" class="primaty-btn">Закрыть</button> </div> <?}?> </div> <script language="javascript"> $(function () { <?foreach (MicrosResidentSign::getDoneSteps() as $doneStep) {?> $(".steps ul li[data-menu-scode=<?=$doneStep['UF_FORM_STEP_CODE']?>]").removeClass('disabled').addClass('done').attr('aria-disabled', 'false'); <?}?> $(".steps ul li.done").each(function () { if($(this).prev().hasClass('disabled') == true) { $(this).removeClass('done').addClass('disabled').attr('aria-disabled', 'true'); } }); }); // Объявление необходимых констант var EIMZO_MAJOR = 3; var EIMZO_MINOR = 37; // Объявление переменных содержащих ошибки var errorCAPIWS = 'Ошибка соединения с E-IMZO. Возможно у вас не установлен модуль E-IMZO или Браузер E-IMZO.'; var errorBrowserWS = 'Браузер не поддерживает технологию WebSocket. Установите последнюю версию браузера.'; var errorUpdateApp = 'ВНИМАНИЕ !!! Установите новую версию приложения E-IMZO или Браузера E-IMZO.<br /><a href="https://e-imzo.uz/main/downloads/" role="button">Скачать ПО E-IMZO</a>'; var errorWrongPassword = 'Пароль неверный.'; // самая главная функция, которая вызывается при загрузке страницы (вызывается в самом низу кода при помощи window.onload) var AppLoad = function () { // тут мы указываем API ключи , для работы приложения на нашем домене! API ключи , в дальнейшем мы должны получить у представителей E-imzo EIMZOClient.API_KEYS = [ 'localhost', '96D0C1491615C82B9A54D9989779DF825B690748224C2B04F500F370D51827CE2644D8D4A82C18184D73AB8530BB8ED537269603F61DB0D03D2104ABF789970B', '127.0.0.1', 'A7BCFA5D490B351BE0754130DF03A068F855DB4333D43921125B9CF2670EF6A40370C646B90401955E1F7BC9CDBF59CE0B2C5467D820BE189C845D0B79CFC96F', 'null', 'E0A205EC4E7B78BBB56AFF83A733A1BB9FD39D562E67978CC5E7D73B0951DB1954595A20672A63332535E13CC6EC1E1FC8857BB09E0855D7E76E411B6FA16E9D', 'dls.yt.uz', 'EDC1D4AB5B02066FB3FEB9382DE6A7F8CBD095E46474B07568BC44C8DAE27B3893E75B79280EA82A38AD42D10EA0D600E6CE7E89D1629221E4363E2D78650516' ]; // вызываем функцию загрузки ключей uiLoading(); // далее проверяем, версию E-Imzo и выданные нам API ключи, которые были описаны в массиве выше EIMZOClient.checkVersion ( function(major, minor) { var newVersion = EIMZO_MAJOR * 100 + EIMZO_MINOR; var installedVersion = parseInt(major) * 100 + parseInt(minor); if(installedVersion < newVersion) { uiUpdateApp(); } else { EIMZOClient.installApiKeys ( function() { uiLoadKeys(); }, function(e, r) { if(r) { uiShowMessage(r); } else { wsError(e); } } ); } }, function(e, r) { if(r) { uiShowMessage(r); } else { uiNotLoaded(e); } } ); }; function uiShowMessage(message) { alert(message); } // функция загрузки ключей function uiLoading() { var l = document.getElementById('message'); //$('#msgserr').html('Для того, что бы подписать документ, необходимо включить в модуле e-imzo режим разработчика'); l.innerHTML = 'Загрузка ...'; l.style.color = 'red'; } // если у нас загрузились ключи, ничего не делаем function uiNotLoaded(e) { // получаем HTML элемент с id="message" var l = document.getElementById('message'); l.innerHTML = ''; if (e) { wsError(e); } else { // выводим ошибку связанную с тем , веб браузер устаревший, и E-imzo использовать не ок uiShowMessage(errorBrowserWS); } } function uiUpdateApp() { var l = document.getElementById('message'); l.innerHTML = errorUpdateApp; } function uiLoadKeys() { uiClearCombo(); EIMZOClient.listAllUserKeys ( function(o, i) { var itemId = "itm-" + o.serialNumber + "-" + i; return itemId; }, function(itemId, v) { return uiCreateItem(itemId, v); }, function(items, firstId) { uiFillCombo(items); uiLoaded(); uiComboSelect(firstId); }, function(e, r) { uiShowMessage(errorCAPIWS); } ); } function uiComboSelect(itm) { if(itm) { var id = document.getElementById(itm); id.setAttribute('selected','true'); } } function cbChanged(c) { document.getElementById('keyId').innerHTML = ''; } function uiClearCombo() { var combo = document.signForm.key; combo.length = 0; } function uiFillCombo(items) { var combo = document.signForm.key; for (var itm in items) { combo.append(items[itm]); } } function uiLoaded() { var l = document.getElementById('message'); l.innerHTML = ''; } function uiCreateItem(itmkey, vo) { var now = new Date(); vo.expired = dates.compare(now, vo.validTo) > 0; var itm = document.createElement("option"); itm.value = itmkey; itm.text = vo.CN; if (vo.expired) { itm.style.color = 'gray'; itm.text = itm.text + ' (срок истек)'; } itm.setAttribute('vo',JSON.stringify(vo)); itm.setAttribute('id',itmkey); return itm; } function wsError(e) { if (e) { uiShowMessage(errorCAPIWS + " : " + e); } else { uiShowMessage(errorBrowserWS); } } // функция подписания документа function sign() { var itm = document.signForm.key.value; if (itm) { var id = document.getElementById(itm); var vo = JSON.parse(id.getAttribute('vo')); var data = document.signForm.data.value; var keyId = document.getElementById('keyId').innerHTML; if(keyId) { EIMZOClient.createPkcs7 ( keyId, data, null, function(pkcs7) { document.signForm.pkcs7.value = pkcs7; }, function(e, r) { if(r) { if (r.indexOf("BadPaddingException") != -1) { uiShowMessage(errorWrongPassword); } else { uiShowMessage(r); } } else { document.getElementById('keyId').innerHTML = ''; uiShowMessage(errorBrowserWS); } if(e) wsError(e); } ); } else { if (data === 'null') { alert("Веб форма не найдена"); } if (data !== 'null') { EIMZOClient.loadKey ( vo, function(id) { EIMZOClient.createPkcs7 ( id, data, null, function(pkcs7) { var pkcs7_64 = pkcs7; var tsid = ""; var mydata = []; if(pkcs7_64 !== '') { CAPIWS.callFunction ( { plugin :"pkcs7", name :"get_pkcs7_attached_info", arguments :[ //Ранее созданный документ PKCS#7/CMS в кодировке BASE64 pkcs7_64, //Идентификатор хранилища доверенных сертификатов (полученный из фукнции других плагинов), если требуется верификация сертификатов, иначе может быть пустым tsid ] }, function(event, data) { var getjson = document.getElementById("json"); var signerdata = QueryStringToJSON(data.pkcs7Info.signers[0].certificate[0].subjectName); var verifierdata = QueryStringToJSON(data.pkcs7Info.signers[0].certificate[0].issuerName); var finishjson = { signed_data : utftexts(atob(data.pkcs7Info.documentBase64)), valid_from : data.pkcs7Info.signers[0].certificate[0].validFrom, valid_to : data.pkcs7Info.signers[0].certificate[0].validTo, signer_inn : signerdata["1.2.860.3.16.1.1"], signer_company_type : signerdata.BusinessCategory, signer_country : signerdata.C, signer_fullname : signerdata.CN, signer_district : signerdata.L, signer_name : signerdata.Name, signer_company : signerdata.O, signer_city : signerdata.ST, signer_surname : signerdata.SURNAME, signer_position : signerdata.T, signer_uid : signerdata.UID, verifier_country : verifierdata.C, verifier_fullname : verifierdata.CN, verifier_email : verifierdata.E, verifier_district : verifierdata.L, verifier_company : verifierdata.O, verifier_position : verifierdata.T, verifier_undefined_field : verifierdata.OU, sign_inner : pkcs7, signed_form_id : '<?=$webFormID?>' }; // console.log(finishjson); // в переменной pkcs7 хранится результат его тут надо передать по аяксу, в нужный скрипт BX.ajax ( { data : {signinfo : finishjson}, method : 'POST', dataType : 'json', url : "/extranet/resident/ajax.php", <?//=$this->__component->__path . '/ajax.php'?> onsuccess: function(resultsuccess) { window.location.reload(); } } ); }, function(error) { window.alert(error); } ); }; alert("Веб форма успешно подписана!"); setTimeout(function(){ window.location.reload(); }, 100); }, function(e, r) { if(r) { if (r.indexOf("BadPaddingException") != -1) { uiShowMessage(errorWrongPassword); } else { uiShowMessage(r); } } else { document.getElementById('keyId').innerHTML = ''; uiShowMessage(errorBrowserWS); } if(e) wsError(e); } ); }, function(e, r) { if(r) { if (r.indexOf("BadPaddingException") != -1) { uiShowMessage(errorWrongPassword); } else { uiShowMessage(r); } } else { uiShowMessage(errorBrowserWS); } if(e) wsError(e); } ); } } } }; window.onload = AppLoad; </script> <?}?> <script> //функция преобрзования CP-1201 в UTF-8 function utftexts(utftext) { var string = ""; var i = 0; var c = 0; var c1 = 0; var c2 = 0; var c3; while (i < utftext.length) { c = utftext.charCodeAt(i); if (c < 128) { string += String.fromCharCode(c); i++; } else if((c > 191) && (c < 224)) { c2 = utftext.charCodeAt(i+1); string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); i += 2; } else { c2 = utftext.charCodeAt(i+1); c3 = utftext.charCodeAt(i+2); string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); i += 3; } } return string; } //преобразование QueryString в JSON function QueryStringToJSON(querystring) { var pairs = querystring.split(','); var result = {}; pairs.forEach ( function(pair) { pair = pair.split('='); result[pair[0]] = decodeURIComponent(pair[1] || ''); } ); return JSON.parse(JSON.stringify(result)); } </script>
Editor is loading...