Untitled
unknown
php
2 years ago
31 kB
9
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...