Untitled

mail@pastecode.io avatar
unknown
php
a year ago
31 kB
3
Indexable
Never
<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">&#187; "<?=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>