Subversion Repositories Sigmater

Rev

Blame | Last modification | View Log | Download | RSS feed

<?
///////////////////////////////////////
// Libreria di funzioni generiche
///////////////////////////////////////

// ************************************************
// INCLUDE CLASSE PEAR Mail/mimeDecode.php
// ************************************************
require_once('Mail/mimeDecode.php');

function show($var, $end = 0) {

    echo"<br>show<pre>";
    print_r($var);
    echo'</pre><br>';

    if ($end == 0)
        die ('end');
}

// ************************************************
// FUNZIONE CHE SCRIVE SU UN FILE DI LOG
// ************************************************
function wlog($keyerrore, $dblog = 0, $descr = '', $up_TI04 = 0, $livello = 0, $filename = '') {
        
        global $ocierr, $progiscrizione, $periodo_da, $periodo_a, $keydett, $progiscrizioneass;
        global $flag_ass, $idfile, $protocollo, $protocollo_ass;
        global $gl_id_richiesta, $gl_id_richiesta_ori, $gl_id_traccia;
        
        $str1 = '';
        $str2 = '';

        if (trim($filename) == '')
                $filename = APP_PATH.'logs/'.LOG_FILE;
        
        if ($ocierr != false) {
                
                $str1 = ' ~~~ MESSAGE: '.$ocierr['message'].' ~~~ SQLTEXT: '.$ocierr['sqltext'];
                $str1 = text_adjust($str1);
        }

        $progiscrizione_log = (isset($progiscrizione)) ? "PROGISCRIZIONE: $progiscrizione ," : '';
        $keydett_log = (isset($keydett)) ? "KEYDETT: $keydett ," : '';
        $flag_ass_log = (isset($flag_ass)) ? "FLAG_ASS: $flag_ass " : '';
        $periodo_da_log = (isset($periodo_da)) ? "PERIODO_DA: $periodo_da ," : '';
        $periodo_a_log = (isset($periodo_a)) ? "PERIODO_A: $periodo_a ," : '';
        $progiscrizioneass_log = (isset($progiscrizioneass)) ? "PROGISCRIZIONEASS: $progiscrizioneass " : '';
        $idfile_log = (isset($idfile)) ? "N_FILE: $idfile ," : '';
        $gl_id_richiesta_log = (isset($gl_id_richiesta)) ? "ID_RICHIESTA: $gl_id_richiesta ," : '';
        $gl_id_richiesta_ori_log = (isset($gl_id_richiesta_ori)) ? "ID_RICHIESTA_ORI: $gl_id_richiesta_ori " : '';
        $gl_id_traccia_log = (isset($gl_id_traccia)) ? "ID_TRACCIA: $gl_id_traccia " : '';
        
        if ((isset($flag_ass) && $flag_ass == 0) || defined('NATIVE'))
                $protocollo_log = (isset($protocollo)) ? "PROTOCOLLO: $protocollo ," : '';
        elseif (isset($flag_ass) && $flag_ass == 1)
                $protocollo_log = (isset($protocollo_ass)) ? "PROTOCOLLO: $protocollo_ass ," : '';      
        else
                $protocollo_log = '';
                        
        $str2 = " ~~~ $progiscrizione_log $periodo_da_log $periodo_a_log $keydett_log ";
        $str2 .= "$flag_ass_log $progiscrizioneass_log $idfile_log $protocollo_log $gl_id_richiesta_log $gl_id_richiesta_ori_log $gl_id_traccia_log ~~~";
        
        $descr = text_adjust($descr);
        
        $errdett = '('.$keyerrore.') '.$descr.$str1;
        
        if (LOGFILE_LEVEL > $livello) {
                error_log (date("d/m/Y H:i:s").' - '.$errdett.$str2."\n\n", 3, $filename);
        }
        
        if ($dblog > 0)
                wdblog($keyerrore, $errdett);
                    
    $ocierr = false;
    
    if ($up_TI04 > 0)
        update_servizidettaglio('LOG', $keyerrore);
        
    $ocierr = false;

}

function wfile($fname, &$buf) {

        $fn = fopen($fname, 'wt');
        if (!$fn)
                return false;
        flock($fn, LOCK_EX);
        $b = fwrite($fn, $buf);
        flock($fn, LOCK_UN);
        if ($b == -1 || $b == 0)
                return false;

        fclose($fn);

        return true;
}

function wdblog($keyerrore, $errdett) {
        
        global $conn, $progiscrizione, $periodo_da, $periodo_a, $keydett, $flag_ass, $progiscrizioneass, $idfile, $protocollo, $protocollo_ass;
        global $gl_id_richiesta, $gl_id_richiesta_ori, $gl_id_traccia;
        
        $progiscrizione_log = (isset($progiscrizione)) ? $progiscrizione : '';
        $keydett_log = (isset($keydett)) ? $keydett : 'NULL';
        $flag_ass_log = (isset($flag_ass)) ? $flag_ass : 'NULL';
        $periodo_da_log = (isset($periodo_da)) ? "to_date('$periodo_da', 'dd/mm/yyyy')" : 'NULL';
        $periodo_a_log = (isset($periodo_a)) ? "to_date('$periodo_a', 'dd/mm/yyyy')" : 'NULL';
        $progiscrizioneass_log = (isset($progiscrizioneass)) ? $progiscrizioneass : '';         
        $idfile_log = (isset($idfile)) ? $idfile : 'NULL';
        $gl_id_richiesta_log = (isset($gl_id_richiesta)) ? $gl_id_richiesta : 'NULL';
        $gl_id_richiesta_ori_log = (isset($gl_id_richiesta_ori) && !empty($gl_id_richiesta_ori)) ? $gl_id_richiesta_ori : 'NULL';
        $gl_id_traccia_log = (isset($gl_id_traccia)) ? $gl_id_traccia : 'NULL';
        
        if ((isset($flag_ass) && $flag_ass == 0) || defined('NATIVE'))
                $protocollo_log = (isset($protocollo)) ? $protocollo : '';
        elseif (isset($flag_ass) && $flag_ass == 1)
                $protocollo_log = (isset($protocollo_ass)) ? $protocollo_ass : '';
        else
                $protocollo_log = '';
                        
        $errdett = sql_adjust($errdett);
        $errdett = substr($errdett, 0, 4000);
        
        $sql = "insert into S3_TI05_ERRLOG (TI05_ID, TI05_KEYERRORE, TI05_ERROREDETT, ";
        $sql .= "TI05_DATETIME, TI05_PROGISCRIZIONE, TI05_KEYDETT, TI05_FLAG_ASS, TI05_PERIODO_DA, ";
        $sql .= "TI05_PERIODO_A, TI05_PROTOCOLLO, TI05_PROGISCRIZIONEASS, TI05_N_FILE, TI05_ID_RICHIESTA, TI05_ID_RICHIESTA_ORI, TI05_ID_TRACCIA) ";
        $sql .= "values (TI05_SEQ.NEXTVAL, $keyerrore, '$errdett', sysdate, '$progiscrizione_log', $keydett_log, $flag_ass_log, ";
        $sql .= "$periodo_da_log, $periodo_a_log, '$protocollo_log', '$progiscrizioneass_log', $idfile_log, $gl_id_richiesta_log, $gl_id_richiesta_ori_log, $gl_id_traccia_log)";

        /////////////////////////////////////////////////
        // UPDATE S3_TI05_ERRLOG
        /////////////////////////////////////////////////
        $insert = exec_sql($conn, $sql, 1);
        if (!$insert) {
                wlog(1, 0, 'INSERT ERRLOG');
        }
        
}

function sql_adjust($str) {
        
        $str = str_replace("'","`", $str);
        
        return $str;
}

function text_adjust($str) {
        
        $str = trim(str_replace("\n", ' ', $str));
        
        return $str;
}

function out($str, $level = 0) {
        
        if (OUTPUT > $level)
                echo $str.' <br> <br> ';
}

function xml_validation($xsd, $xml) {
        
        exec('sh LSTU_jval9.sh '.$xsd.' '.$xml.' '.ORA_XDK.' '.JRE_HOME.' '.PARENT_DIR.' 2>&1', $arr_ret);
        
        $ret = implode('', $arr_ret);
        
        if ($ret == 'XML Document is valid')
                return ('OK');
        else
                return ($ret);
}

// ************************************************
// FUNZIONE di REDIREZIONAMENTO
// ************************************************
function js_redirect($url, $msg = '', $target = 'top') {
    //header("Location:$url"); 
    
                echo "<script>";
                if ($msg != '') {
                        $msg = js_adjust($msg);
                        echo "alert('$msg');";
                }
                echo "$target.location = '$url';";
                echo "</script>";
        
}

function js_adjust($in) {

        $out = addslashes(str_replace("\n", "", str_replace("\r", "", $in)));
        
        return $out;
}

function decode_pkcs7($pkcs7) {

        $params['include_bodies'] = TRUE;
        $params['decode_bodies']  = TRUE;
        $params['decode_headers'] = TRUE;
        $params['crlf']           = "\r\n";
                
        $decode = new Mail_mimeDecode($pkcs7);
        
        $structure = $decode->decode($params);
        
        return $structure;
}

function update_codstato($codstato, $autocommit = 1) {

        global $conn, $progiscrizione, $periodo_da, $periodo_a, $keydett, $flag_ass, $periodicita;
                
        if ($codstato == 1) {
                
                $extra_set = ', TI04_DATATIME_INIZIO = sysdate ';
        }
        elseif ($codstato == 4) {
                
                if (isset($periodicita) && $periodicita == 0) { // UNA TANTUM   
                
                        $sql = "update S3_TI03_SERVIZIRICHIESTI set TI03_DATAFINEISCRIZIONE = sysdate ";
                        $sql .= "where TI03_PROGISCRIZIONE = '$progiscrizione'";
                        
                        if (!exec_sql($conn, $sql, 0)) {
                                
                                OCIRollback($conn);
                                return false;
                        }
                }
                                        
                $extra_set = ', TI04_DATATIME_FINE = sysdate , TI04_PROTOCOLLO = TI07_SEQ.NEXTVAL';
        }
        else {
                
                $extra_set = '';
        }
                
        $sql = "update S3_TI04_SERVIZIDETTAGLIO set TI04_CODSTATO = $codstato $extra_set ";
        $sql .= "where TI04_PROGISCRIZIONE = '$progiscrizione' and ";
        $sql .= "to_char(TI04_PERIODO_DA, 'dd/mm/yyyy') = '$periodo_da' and ";
        $sql .= "to_char(TI04_PERIODO_A, 'dd/mm/yyyy') = '$periodo_a' and ";
        $sql .= "TI04_KEYDETT = $keydett and TI04_FLAG_ASS = $flag_ass";
                
        if (!exec_sql($conn, $sql, $autocommit)) {
                
                OCIRollback($conn);
                return false;
        }

        return true;
}


function update_codstato_ass($codstato, $autocommit = 1,$keydett_ass) {

        global $conn, $progiscrizione, $periodo_da, $periodo_a, $keydett, $flag_ass, $periodicita;

        $sql = "update S3_TI04_SERVIZIDETTAGLIO set TI04_CODSTATO = $codstato ";
        $sql .= "where TI04_PROGISCRIZIONE = '$progiscrizione' and ";
        $sql .= "to_char(TI04_PERIODO_DA, 'dd/mm/yyyy') = '$periodo_da' and ";
        $sql .= "to_char(TI04_PERIODO_A, 'dd/mm/yyyy') = '$periodo_a' and ";
        $sql .= "TI04_KEYDETT = $keydett_ass and TI04_FLAG_ASS = 1";
         
        if (!exec_sql($conn, $sql, $autocommit)) {

                OCIRollback($conn);
                return false;
        }

        return true;
}



function check_lockfile($name) {

        global $fd_lockfile;

        $lock = APP_PATH.'tmp/'.$name.'.lock';
        
        $fd_lockfile = fopen($lock, 'a');  // NB: $fd_lockfile deve essere global!
        
        if(flock($fd_lockfile, LOCK_EX+LOCK_NB)) {

                set_file_buffer($fd_lockfile, 0);
                ftruncate($fd_lockfile, 0);
                fwrite($fd_lockfile, getmypid().' '.date('d/m/Y H:i:s')."\n");
                // NON chiamo fclose per mantenere flock!
        }
        else {
                
                fclose($fd_lockfile);
                
                //Lock file già in uso - uscita
                exit();
        }
}

function read_xml_single_tag($xml, $path) {

        global $gl_PP_xml_path;

        $gl_PP_xml_path = $path;

                // ************************************************
                // INCLUDE CLASSE PATH_PARSER
                // ************************************************
                require_once(APP_PATH.'include/LSTM_class_path_parser.php');

        $parser = new Path_parser();
        $parser->set_handler($path, "single_tag");

        if (!$parser->parse($xml,0)) 
                return ("Error: ".$parser->get_error());
        else
                return '';
}

//MM Funzione per i dati assenti
function read_xml_if_exist_single_tag($xml, $path) {

        global $gl_PP_xml_path;

        $gl_PP_xml_path = $path;

                // ************************************************
                // INCLUDE CLASSE PATH_PARSER
                // ************************************************
                require_once(APP_PATH.'include/LSTM_class_path_parser.php');

        $parser = new Path_parser();
        $parser->set_handler($path, "single_tag");

        return $parser->parse($xml,0);
}

function single_tag($name, $attribs, $content) {

        global $gl_PP_xml_path;
        global $gl_PP_arr_xml;
        static $arr_xml_app;

        $content = strip_tags($content);
                
        $arr_xml_app[$gl_PP_xml_path] = $content;

        $gl_PP_arr_xml = $arr_xml_app;
}

function elimina_iscrizione($p_iscr) {

        global $conn, $ocierr;
        
        $sql = "select count(*) from S3_TI04_SERVIZIDETTAGLIO where TI04_CODSTATO <> 0 ";
        $sql .= "and TI04_PROGISCRIZIONE = '$p_iscr'";
        
        $r_select = exec_select_format($conn, $sql);

        if (!$r_select)
                return 'Operazione in errore: '.$ocierr['message'];
        
        if ($r_select[0][0] > 0)
                return 'Operazione non eseguita: iscrizione non eliminabile.';

        $sql = "delete S3_TI04_SERVIZIDETTAGLIO where TI04_PROGISCRIZIONE = '$p_iscr'";

        if (!exec_sql($conn, $sql, 0))
                return 'Operazione in errore: '.$ocierr['message'];
                
        $sql = "delete S3_TI03_SERVIZIRICHIESTI where TI03_PROGISCRIZIONE = '$p_iscr'";
        
        // AUTOCOMMIT
        if (!exec_sql($conn, $sql, 1)) {
        
                OCIRollback($conn);
                return 'Operazione in errore: '.$ocierr['message'];
        }
                        
        return 'Operazione correttamente eseguita.';
}

function lastChar($str, $sep) {
        
        if (strrpos($str, $sep) == strlen($str)-strlen($sep))
                $str = substr($str, 0, strlen($str)-strlen($sep));
        
        return $str;
}

function get_segnatura_client() {
        
        $arr_Identificatore = array('CodiceAmministrazione' => '', 
                                                                'CodiceAOO' => '', 
                                                                'NumeroRegistrazione' => '', 
                                                                'DataRegistrazione' => '');
        
        // ------------------
        $arr_Ruolo = array('Denominazione' => 'Text', 
                                                                 'Identificativo' => '');
        
        $arr_Amministrazione = array('Denominazione' => '', 
                                                                 'CodiceAmministrazione' => '',
                                                                 'Ruolo' => $arr_Ruolo);
                                                                                
        $arr_Mittente = array('Amministrazione' => $arr_Amministrazione, 
                                                  'AOO' => '');
        
        $arr_Origine = array('IndirizzoTelematico' => '', 
                                                 'Mittente' => $arr_Mittente);
        // ------------------
        
        $arr_Destinazione = array('IndirizzoTelematico' => '');
        
        // ------------------
        
        
        $arr_Intestazione = array('Identificatore' => $arr_Identificatore, 
                                                          'Origine' => $arr_Origine, 
                                                          'Destinazione' => $arr_Destinazione,
                                                          'Oggetto' => '');
        // ------------------                                                                                                                                                                                                                   
        $arr_Segnatura = array('Intestazione' => $arr_Intestazione);

        return $arr_Segnatura;
}

function get_segnatura_server() {
        
        $arr_Identificatore = array('ns4:CodiceAmministrazione' => '', 
                                                                'ns4:CodiceAOO' => '', 
                                                                'ns4:NumeroRegistrazione' => '', 
                                                                'ns4:DataRegistrazione' => '');
        
        // ------------------
        $arr_Amministrazione = array('ns4:Denominazione' => '', 
                                                                 'ns4:CodiceAmministrazione' => '');
                                                                                
        $arr_Mittente = array('ns4:Amministrazione' => $arr_Amministrazione, 
                                                  'ns4:AOO' => 'Text');
        
        $arr_Origine = array('ns4:IndirizzoTelematico' => '', 
                                                 'ns4:Mittente' => $arr_Mittente);
        // ------------------
        
        $arr_Destinazione = array('ns4:IndirizzoTelematico' => '');
        
        // ------------------
        
        
        $arr_Intestazione = array('ns4:Identificatore' => $arr_Identificatore, 
                                                          'ns4:Origine' => $arr_Origine, 
                                                          'ns4:Destinazione' => $arr_Destinazione,
                                                          'ns4:Oggetto' => '');
        // ------------------                                                                                                                                                                                                                   
        $arr_Segnatura = array('ns4:Intestazione' => $arr_Intestazione);

        return $arr_Segnatura;
}

function verify($pkcs7, $cert_filename) {

   $prefix = 'PP7M_'.substr(md5(microtime().posix_getpid()), 0, 8);

    // salvo l'allegato su file per poterne verificare la firma
    $to_verify_filename = APP_PATH.'tmp/'.$prefix;

    echo "CREO IL FILE INIZIO".$to_verify_filename."\n";
    wlog(1,0, "CREO IL FILE INIZIO".$to_verify_filename."\n");

    $pkcs7 = rtrim($pkcs7, "\x00..\x1F");
    $pkcs7 = trim($pkcs7);
    $pkcs7 .="\n";

    if(!wfile($to_verify_filename, $pkcs7)) {
        @unlink($to_verify_filename);
        echo 'Errore scrittura file: '.$to_verify_filename;
        return false;
    }
    wlog(1,0, "CREO IL FILE FINE".$to_verify_filename."\n");
    echo "CREO IL FILE FINE".$to_verify_filename."\n";

    $cainfo = FILE_CA;

    echo "INIZIO VERIFICA openssl_pkcs7_verify"."\n";
    wlog(1,0,"INIZIO VERIFICA openssl_pkcs7_verify"."\n");

    // verifica della firma
    // $ret = openssl_pkcs7_verify($to_verify_filename,PKCS7_TEXT|PKCS7_NOVERIFY, $cert_filename, $cainfo);
    $cmd = "openssl smime -verify -binary -in $to_verify_filename -CAfile $cainfo -signer $cert_filename 2>/dev/null";
    $ret = exec($cmd, $content, $rc);
    if ($rc === 0)
        $ret = true;
    else
        $ret = false;

    echo "FINE VERIFICA openssl_pkcs7_verify valore di ritorno: ".$ret."\n";
    wlog(1,0, "FINE VERIFICA openssl_pkcs7_verify valore di ritorno: ".$ret."\n");

    @unlink($to_verify_filename); 

    return $ret;                        
}

function app_tag($tag_name, $tag_value, &$xml, $option = '', $arr_att = false) {


        switch ($option) {
        
                case 'OPTIONAL':
            
                if ($tag_value == '') {
                        return;
                }
                
                break;
                                                                                        
                case 'OPTIONAL-ZERO':
                
                        if ($tag_value == '' || $tag_value == '0') {
                            return;
                        }            
                
                break;

                case 'OPTIONAL-ALLZERO':

                        if (trim($tag_value, '0') == '') {
                            return;
                        }            
                
                break;          
        }
        
        $xml .= '<'.$tag_name;

        if (is_array ($arr_att)) {

        while (list ($att_name, $att_value) = each($arr_att)) {

            $xml .= ' '.$att_name."=\"".$att_value."\"";
        }

        }

        $xml .= '>'.inspect_xml_entities($tag_value).'</'.$tag_name.'>';
        //$xml .= '>'.$tag_value.'</'.$tag_name.'>';
        
}

function ini_tag($tag_name, &$xml, $arr_att = false) {

        $xml .= '<'.$tag_name;
        
        
        if (is_array ($arr_att)) {
        
                while (list ($att_name, $att_value) = each($arr_att)) {
                $xml .= ' '.$att_name."=\"".$att_value."\"";
                }
        }
        
        $xml .= '>';
}

function end_tag($tag_name, &$xml) {

        $xml .= '</'.$tag_name.'>';
}

function inspect_xml_entities($string) {

    $string = strtr($string,array(
                                  '&'  => '&amp;',
                                  '>'  => '&gt;',
                                  '<'  => '&lt;',
                                  '"'  => '&quot;',
                                  '\'' => '&apos;' ));
        
        /*                                  
        $string = str_replace(array('ü', 'Ü', 'ö',
                                 'Ö', 'ä', 'Ä',
                                 'ß', '<', '>',
                                 '"', '\''
                                ),
                           array('&#252;', '&#220;', '&#246;',
                                 '&#214;', '&#228;', '&#196;',
                                  '&#223;', '&lt;', '&gt;',
                                  '&quot;', '&apos;'
                                ),
                           $xml
                          );
        
        $string = preg_replace(array("/\&([a-z\d\#]+)\;/i",
                                  "/\&/",
                                  "/\#\|\|([a-z\d\#]+)\|\|\#/i",
                                  "/([^a-zA-Z\d\s\<\>\&\;\.\:\=\"\-\/\%\?\!\'\(\)\[\]\{\}\$\#\+\,\@_])/e"
                                 ),
                            array("#||\\1||#",
                                  "&amp;",
                                  "&\\1;",
                                  "'&#'.ord('\\1').';'"
                                 ),
                            $xml
                           );
        */
        
        return $string;
}

function read_cert($cert_filename) {

    //$pemdata = implode('', file($cert_filename));
    
    //CORREZIONE MM 
    $fp = fopen($cert_filename, "r");
    $pemdata = fread($fp,filesize($cert_filename)); 
    fclose($fp); 

    // Get a certificate resource from the PEM string.
    $cert_handler = openssl_x509_read($pemdata);

    // Parse the resource
    $arr_cert_data = openssl_x509_parse($cert_handler);

    // Free the resource
    openssl_x509_free($cert_handler);

    return $arr_cert_data;
}

function check_certificato($arr_cert, $class = false) {
        
        $arr_crl = '';
        
        // CONTROLLO EMITTENTE  
        //
        $trusted_issuer['C'] = CA_C;
        $trusted_issuer['O'] = CA_O;
        $trusted_issuer['OU'] = CA_OU;
        $trusted_issuer['CN'] = CA_CN;

        if ($trusted_issuer['C'] != $arr_cert['issuer']['C'] ||
                $trusted_issuer['O'] != $arr_cert['issuer']['O'] ||
                $trusted_issuer['OU'] != $arr_cert['issuer']['OU'] ||
                $trusted_issuer['CN'] != $arr_cert['issuer']['CN']) {
                
                if ($class) {
                        
                $class->gestione_fault($class->method_namespace, 'Certification Authority non riconosciuta');
                return false;
            }
            else {
                        
                        return array(20026, 'CA emittente: '.$arr_cert['issuer']['C'].' - '.$arr_cert['issuer']['O'].' - '.$arr_cert['issuer']['OU'].' - '.$arr_cert['issuer']['CN']);
                }
        }
        
        // CONTROLLO SUBJECT
        //
        $trusted_subject['C'] = SC_C;
        $trusted_subject['O'] = SC_O;
        $trusted_subject['OU'] = SC_OU;
        $trusted_subject['CN'] = SC_CN;

        if ($trusted_subject['C'] != $arr_cert['subject']['C'] ||
                $trusted_subject['O'] != $arr_cert['subject']['O'] ||
                $trusted_subject['OU'] != $arr_cert['subject']['OU'] ||
                $trusted_subject['CN'] != $arr_cert['subject']['CN']) {
                
                if ($class) {
                        
                $class->gestione_fault($class->method_namespace, 'Soggetto del certificato non riconosciuto');
                return false;
                }
                else {
                                                                
                        return array(20037, 'Subject: '.$arr_cert['subject']['C'].' - '.$arr_cert['subject']['O'].' - '.$arr_cert['subject']['OU'].' - '.$arr_cert['subject']['CN']);
                }
        }
                        
        // CONTROLLO PERIODO DI VALIDITA'    
        //
        /////////////////////////////////////////////////
        // RECUPERO DATA DI SISTEMA DA ORACLE
        /////////////////////////////////////////////////
        $sysdate = oracle_date('yymmddhh24miss');
        
        if (!$sysdate) {

                if ($class) {

                $class->error_code = 60013;
                $class->gestione_fault($class->method_namespace);
                return false;
                }
                else {
                                                
                        return array(20027, '');
                }
        }
        
        $sysdate = (float) $sysdate;
        $valid_from = (float) substr($arr_cert['validFrom'], 0, 12);
        $valid_to = (float) substr($arr_cert['validTo'], 0, 12);
        
        if ($valid_from > $sysdate) {

                if ($class) {
                        
                $class->gestione_fault($class->method_namespace, 'Certificato non valido - Errore: Data inizio validità.');
                return false;
                }
                else {
                                        
                        return array(20028, "Data inizio validità: $valid_from");
                }
        }

        if ($valid_to < $sysdate) {

                if ($class) {
                        
                $class->gestione_fault($class->method_namespace, 'Certificato non valido - Errore: Data fine validità.');
                return false;
                }
                else {
                                        
                        return array(20029, "Data fine validità: $valid_to");
                }
        }
        
        if (CRL_CHECK == 'SI') {
        
                // RECUPERO CRL
                list($err, $ret) = get_crl($class);
                
                if ($err) {

                        if ($class) {
                                
                                $class->error_code = $err;      
                        $class->gestione_fault($class->method_namespace, $ret);
                        return false;
                        }
                        else {                  
        
                                return array($err, $ret);
                        }
                }
                        
                // CONTROLLO CERTIFICATI REVOCATI
                $arr_crl = $ret;
                $needle = '    Serial Number: ';
                
                $serial_number = trim(strtoupper(dechex($arr_cert['serialNumber'])));
                
                foreach($arr_crl as $k=>$v) {
                        
                        $pos = strpos($v, $needle);
                                
                        if ($pos === false) {
        
                                if(strpos($v, 'BEGIN X509 CRL'))                        
                                        break;
                        }
                        else {
                                
                                $sn_revoked = trim(substr($v, strlen($needle)));
                                
                                if ($sn_revoked == $serial_number) {
                                        
                                        if ($class) {
                                                
                                        $class->gestione_fault($class->method_namespace, 'Certificato revocato');
                                        return false;
                                        }
                                        else {                                  
                                        
                                                return array(20031, "SERIAL NUMBER: $serial_number");
                                        }
                                }       
                        }
                }
        }
        
        if ($class)
                return true;
        else
                return array(0, '');
}

function get_crl(&$class) {
        
        include_once(APP_PATH.'include/LSTU_fastcache.inc');
        
        $fname_cache = APP_PATH.'tmp/CRL_cache_date';
        $fname_in = APP_PATH.'tmp/CRL_binary';
        $fname_out = APP_PATH.'tmp/CRL_text';
        
        // LETTURA FILE CACHE
        $ret = fcache_read($fname_cache, $crl);

        if ($ret !== 0) {
                
                include_once(APP_PATH.'include/LSTU_http_requests.inc');
                        
        // ***************************************************
        // CONNESSIONE 
        // ***************************************************
        $headers[] = new HTTP_Header('User-Agent', 'PHP_soap_client');
        //$headers[] = new HTTP_Header('Connection', 'close');
        $headers[] = new HTTP_Header('Host', CRL_SERVER);
        $script = '/var/crl_territorio.php';

        $req = new HTTP_Req('GET', $script, 'HTTP/1.0', $headers);

        $con = new HTTP_Connection(CRL_SERVER);
        $rc = $con->Connect();

        if ($rc) {
                        
                        if ($class)
                                return array(60014, 'CONNESSIONE FALLITA A: '.CRL_SERVER.$script);
                        else    
                                return array(20032, 'CONNESSIONE FALLITA A: '.CRL_SERVER.$script);
        }
        else {

            $con->Request($req); // send request
            $con->Response($res); // creates a response obj read from server
            $con->Close(); // close connection to server

            $crl = $res->GetEntityBody();// echo entity body from response (file contents)
            
                        if (substr($crl, 0, 5) != 'CRLOK') {

                                if ($class)
                                        return array(60015, 'RESPONSE: '.$crl);
                                else                                    
                                        return array(20033, 'RESPONSE: '.$crl);
                        }
                        
                        // SCRITTURA FILE CRL BINARIO                           
                        $ret = wfile($fname_in, substr($crl, 5));
                        if (!$ret) {
                                
                                if ($class)
                                        return array(60016, 'Errore scrittura file: '.$fname);
                                else                                    
                                        return array(20034, 'Errore scrittura file: '.$fname);
                        }
                        
                        $arr = array();
                        $ret = '';
                        
                        // CONTROLLO FIRMA CRL E
                        // SCRITTURA FILE CRL TESTO
                        exec ('openssl crl -inform DER -text -in '.$fname_in.' -out '.$fname_out.' -CAfile '.FILE_CA.' 2>&1', $arr, $ret);
                        
                        if ($ret !== 0) {

                                if ($class)
                                        return array(60017, 'ERRORE nel comando OPENSSL CRL. Codice di ritorno: '.$ret.'. Message: '.implode(' - ', $arr));
                                else
                                        return array(20035, 'ERRORE nel comando OPENSSL CRL. Codice di ritorno: '.$ret.'. Message: '.implode(' - ', $arr));
                        }
                        
                        // SCRITTURA FILE CACHE
                        $data_crl = "\n".'Web Server Date: '.date("d/m/Y H:i:s");
                        $ret = fcache_write($fname_cache, $data_crl, 3600);
                        if ($ret !== 0) {

                                if ($class)
                                        return array(60018, 'ERRORE nella scrittura del file: '.$fname_cache.'. Codice fcache: '.$ret);
                                else                            
                                        return array(20036, 'ERRORE nella scrittura del file: '.$fname_cache.'. Codice fcache: '.$ret);
                        }                       
                } 
        }       
        
        if (is_file($fname_out)) {
                
                // RITORNO FILE CRL TESTO IN ARRAY      
                $arr_crl = file($fname_out);
        }
        
        if (!is_array($arr_crl)) {
                
                if ($class)
                        return array(60019, 'Il file '.$fname_out.' è vuoto o non è stato possibile leggerlo.');
                else                            
                        return array(20030, 'Il file '.$fname_out.' è vuoto o non è stato possibile leggerlo.');
        }
                
        return array(0, $arr_crl);
}

function get_arrpk() {

        $arr_pk = array(PK_ENTE, PK_PWD);
        return $arr_pk;
}

function firma_allegato($filename_unsigned, $filename_pkcs7) {
        
        $arr_privkey = get_arrpk();
        $arr_header = array();
        
    if (!openssl_pkcs7_sign($filename_unsigned, $filename_pkcs7, CERT_ENTE, $arr_privkey, $arr_header, PKCS7_TEXT + PKCS7_DETACHED)) {

        // log errori openssl
        $msg_tot = 'OPENSSL ERROR: ';
                while($msg = openssl_error_string()) 
                        $msg_tot .= ' - '.$msg;
                                
        return $msg_tot;
    }
    
    return 'OK';
 }
?>