<?php
$__functions['init'][]='_ecp_site_vars' ;
$__functions['boot_site'][]='_ecp_site_boot' ;

function ECP() {return($_SESSION['ecp_system']);$_SESSION['ecp_system']=new c_ecp_system();return($_SESSION['ecp_system']);} ;


function _ecp_site_vars()
{
    $_SESSION['init_options']['ecp']['debug']=0 ;

    //$_SESSION['ARR_chet_operation_types']=array(1=>'Поступление',2=>'Списание') ;
    //$_SESSION['ARR_chet_types']=array(0=>'Расходный',2=>'Приходный') ;

     ////
}

function _ecp_site_boot($options)
{
  create_system_modul_obj('ecp',$options) ;

}


class c_ecp_system
{
    public $table_bill ;
    public $ecp_list ;

  function __construct($create_options=array())
    {
      ENGINE()->reg_ext('cryptopro','Криптопро') ;
    }

  function declare_menu_items_2($page)
  { // только для клиента
      /*
      $page->menu['/cab/ecp/']=array(    'title'=>'ЭЦП',
                                         'class'=>'fa fa-pencil-square-o',
                                         'items'=>array('/cab/ecp/'=>'ЭЦП',
                                                        '/cab/ecp/token/'=>array('title'=>'Токен','class'=>'fa fa-users'),
                                                        '/cab/ecp/OpenSSL/'=>'OpenSSL'
                                                       )
                                         ) ;

      */

  }

  function declare_menu_items_4($page)
  {   $page->menu['/cab/setting/']['items']['/cab/cryptopro/']='Криптопро' ;
  }

  // 1. сохраняем подпись в документе
  // 2. Делаем zip-архив с подписью и исходным файлом
  // 3. Сохраняем подпись в отдеьный фал, если необходимо
  // 4. сохраняем данные ЭЦП в аккаунте пользователя

  function save_signature($form_data,$options=[])
    { $sign=$form_data['sign'] ;  $form_data['sign']='Сигнатура подписи, длина '.strlen($sign) ;
      $cert=$form_data['cert'] ;
      $event_data=[] ;
        ob_start() ;
      ?><strong>SAVE_SIGNATURE</strong><?
      ?><h3>Переданные данные для подписи документа</h3><?
      damp_array($form_data,1,-1) ;
      $file_mhd=MEMBER()->info['_ext_info']['mhd'] ;

      if ($form_data['data_uid']) $this->save_file_signature('data_'.$form_data['data_uid'].'.data',$sign);
      if ($form_data['doc_id']) $event_data=$this->save_doc_signature($form_data['doc_id'],$sign,$cert,$file_mhd);
      if ($form_data['fname']) $this->save_file_signature($form_data['fname'],$sign,$file_mhd) ;

      // сохраняем данные ЭЦП в аккаунте пользователя, чтобы потом выводить её под документом при печати
      if (!MEMBER()->info['evulate_ECP'] and $form_data['doc_id']) $this->save_ecp_data_in_account($cert) ;

      $text=ob_get_clean() ;

      //if ($GLOBALS['LS_trace_sign_JS'] and $_POST['sign_uid'])
          LOG_JSON()->reg('ECP/save_signature',$text);
      //if ($options['show_trace'])
          echo $text ;

      if ($form_data['doc_id'])
      { ob_start() ;
          echo '---------------------------------------<br>' ;
          echo 'Инициируем событие подписи документа<br>' ;
          if (sizeof($event_data)) ENGINE()->on_event('save_doc_signature',$event_data) ;
          $text=ob_get_clean() ;
          if ($GLOBALS['LS_trace_sign_JS'] and $_POST['sign_uid']) LOG_JSON()->reg('on_event:save_doc_signature',$text);
      }

    }

    function save_ecp_data_in_account($cert)
    {
        echo '---------------------------------------<br>' ;
        echo 'Сохраняем данные ЭЦП в аккаунте пользователя<br>' ;
        $cert['time_update']=date('d.m.Y H:i:s') ;
        ACCOUNTS()->account_save(MEMBER()->id,array('ext_info'=>array('certificate'=>$cert,'save_log'=>$GLOBALS['LS_trace_sign_JS']))) ;
        ACCOUNTS()->update_member_info(MEMBER()) ;
    }


    function save_doc_signature($doc_id,$sign,$cert=[],$file_mhd='')
      { echo '---------------------------------------<br>' ;
        echo 'Передан doc_id, получаем документ<br>' ;
        $rec_doc=DOCS()->get_doc_by_id($doc_id) ;
        echo 'Найден документ '.$rec_doc['obj_name'].'<br>' ;
        $sign_info=array('Серийный номер'=>$cert['SerialNumber'],
                         'Издатель'=>$cert['IssuerName'],
                         'Субъект'=>$cert['SubjectName'],
                         'Отпечаток'=>$cert['Thumbprint'],
                         'Действителен c'=>$cert['ValidFromDate'],
                         'Действителен по'=>$cert['ValidToDate']
        ) ;
        /*ob_start() ;
        var_dump($sign_info)  ; echo '<br>' ;
        var_dump($cert['SerialNumber'])  ;
        $text=ob_get_clean() ;
        $fname=LOGS()->reg_file_log('debug_save_signature',$text) ;
        LOGS()->reg_log('debug_save_signature','<a target=_blank href="' . $fname . '" target=_BLANK>Отчет</a>') ;
        */
        echo 'Сохраняем в документе результат подписи<br>' ;
        damp_array($sign_info,1,-1) ;
        DOCS()->fixed_sign_doc($rec_doc['pkey'],$cert['SerialNumber'],$sign_info) ;
        echo '---------------------------------------<br>' ;
        echo 'Проверяем подписанный документ<br>' ;
        $rec_doc=DOCS()->get_doc_by_id($doc_id) ;
        echo 'sign_member='.$rec_doc['sign_member'].'<br>' ;
        echo 'sign_data='.$rec_doc['sign_data'].'<br>' ;
        echo 'sert_id='.$rec_doc['sert_id'].'<br>' ;
        echo 'sign='.$rec_doc['sign'].'<br>' ;
        echo '---------------------------------------<br>' ;

        $sign_fname=$rec_doc['__doc_dir'].'.sig' ;
        echo 'Сохраняем подпись в прикрепленном файле "'.$sign_fname.'"<br>' ;
        file_put_contents($sign_fname,$sign) ;
        echo 'Проверяем сохранение подписи<br>' ;
        $cont=file_get_contents($sign_fname) ;
        if ($cont==$sign) echo 'Сохраненная подпись соответствует исходной подписи<br>' ;
        else              echo '<div class="alert">Сохраненная подпись не соответствует исходной подписи</div>' ;
        echo '---------------------------------------<br>' ;
        $filename = $rec_doc['__doc_dir'].'.zip' ;
        echo 'Создаем архив документа и подписи "'.$filename.'"<br>' ;
        $zip = new ZipArchive();
        if (file_exists($filename)) unlink($filename);

        if ($zip->open($filename, ZipArchive::CREATE)!==TRUE)
        { echo '<div class="alert">Не удалось создать архив подписи документа</div>' ;
          LOGS()->reg_log('ОШИБКИ','Не удалось создать ZIP архив документа и подписи',array('member_id'=>MEMBER()->id)) ;
        }
        else
        { $zip->addFile($rec_doc['__doc_dir'],basename($rec_doc['__doc_dir']));
        $zip->addFile($rec_doc['__doc_dir'].'.sig',basename($rec_doc['__doc_dir'].'.sig'));
          // добавляем в архив файл МЧД
          if ($file_mhd) $zip->addFile(_DIR_TO_ROOT.'/public/ecp_mhd/'.$file_mhd,$file_mhd);
        $zip->close();
        }

        // генерим событие подписи документа.
        $event_data=array() ;
        $event_data['rec_doc']=$rec_doc ;
        $event_data['zip_fname']=$filename ;
        return($event_data) ;
      }


    function save_file_signature($fname,$sign)
    {
        echo '---------------------------------------<br>' ;
         $fname=basename($fname).'.sig' ;
         if (strpos($fname,'\\') !== false) { $tmp = preg_split("[\\\]",$fname); $fname = $tmp[count($tmp) - 1]; }
         $sign_fname=_TEMP_DIR.$fname ;
         echo 'Передан fname, сохраняем подпись в '.hide_server_dir($sign_fname).'<br>' ;
         file_put_contents($sign_fname,$sign) ;
      }




}



?>
