Subversion Repositories Sigmater

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
6 Andrea 1
<?
2
///////////////////////////////////////
3
// Libreria di funzioni generiche
4
///////////////////////////////////////
5
 
6
// ************************************************
7
// INCLUDE CLASSE PEAR Mail/mimeDecode.php
8
// ************************************************
9
require_once('Mail/mimeDecode.php');
10
 
11
function show($var, $end = 0) {
12
 
13
    echo"<br>show<pre>";
14
    print_r($var);
15
    echo'</pre><br>';
16
 
17
    if ($end == 0)
18
        die ('end');
19
}
20
 
21
// ************************************************
22
// FUNZIONE CHE SCRIVE SU UN FILE DI LOG
23
// ************************************************
24
function wlog($keyerrore, $dblog = 0, $descr = '', $up_TI04 = 0, $livello = 0, $filename = '') {
25
 
26
	global $ocierr, $progiscrizione, $periodo_da, $periodo_a, $keydett, $progiscrizioneass;
27
	global $flag_ass, $idfile, $protocollo, $protocollo_ass;
28
	global $gl_id_richiesta, $gl_id_richiesta_ori, $gl_id_traccia;
29
 
30
	$str1 = '';
31
	$str2 = '';
32
 
33
	if (trim($filename) == '')
34
		$filename = APP_PATH.'logs/'.LOG_FILE;
35
 
36
	if ($ocierr != false) {
37
 
38
		$str1 = ' ~~~ MESSAGE: '.$ocierr['message'].' ~~~ SQLTEXT: '.$ocierr['sqltext'];
39
		$str1 = text_adjust($str1);
40
	}
41
 
42
	$progiscrizione_log = (isset($progiscrizione)) ? "PROGISCRIZIONE: $progiscrizione ," : '';
43
	$keydett_log = (isset($keydett)) ? "KEYDETT: $keydett ," : '';
44
	$flag_ass_log = (isset($flag_ass)) ? "FLAG_ASS: $flag_ass " : '';
45
	$periodo_da_log = (isset($periodo_da)) ? "PERIODO_DA: $periodo_da ," : '';
46
	$periodo_a_log = (isset($periodo_a)) ? "PERIODO_A: $periodo_a ," : '';
47
	$progiscrizioneass_log = (isset($progiscrizioneass)) ? "PROGISCRIZIONEASS: $progiscrizioneass " : '';
48
	$idfile_log = (isset($idfile)) ? "N_FILE: $idfile ," : '';
49
	$gl_id_richiesta_log = (isset($gl_id_richiesta)) ? "ID_RICHIESTA: $gl_id_richiesta ," : '';
50
	$gl_id_richiesta_ori_log = (isset($gl_id_richiesta_ori)) ? "ID_RICHIESTA_ORI: $gl_id_richiesta_ori " : '';
51
	$gl_id_traccia_log = (isset($gl_id_traccia)) ? "ID_TRACCIA: $gl_id_traccia " : '';
52
 
53
	if ((isset($flag_ass) && $flag_ass == 0) || defined('NATIVE'))
54
		$protocollo_log = (isset($protocollo)) ? "PROTOCOLLO: $protocollo ," : '';
55
	elseif (isset($flag_ass) && $flag_ass == 1)
56
		$protocollo_log = (isset($protocollo_ass)) ? "PROTOCOLLO: $protocollo_ass ," : '';	
57
	else
58
		$protocollo_log = '';
59
 
60
	$str2 = " ~~~ $progiscrizione_log $periodo_da_log $periodo_a_log $keydett_log ";
61
	$str2 .= "$flag_ass_log $progiscrizioneass_log $idfile_log $protocollo_log $gl_id_richiesta_log $gl_id_richiesta_ori_log $gl_id_traccia_log ~~~";
62
 
63
	$descr = text_adjust($descr);
64
 
65
	$errdett = '('.$keyerrore.') '.$descr.$str1;
66
 
67
	if (LOGFILE_LEVEL > $livello) {
68
		error_log (date("d/m/Y H:i:s").' - '.$errdett.$str2."\n\n", 3, $filename);
69
	}
70
 
71
	if ($dblog > 0)
72
		wdblog($keyerrore, $errdett);
73
 
74
    $ocierr = false;
75
 
76
    if ($up_TI04 > 0)
77
    	update_servizidettaglio('LOG', $keyerrore);
78
 
79
    $ocierr = false;
80
 
81
}
82
 
83
function wfile($fname, &$buf) {
84
 
85
	$fn = fopen($fname, 'wt');
86
	if (!$fn)
87
		return false;
88
        flock($fn, LOCK_EX);
89
	$b = fwrite($fn, $buf);
90
        flock($fn, LOCK_UN);
91
	if ($b == -1 || $b == 0)
92
		return false;
93
 
94
	fclose($fn);
95
 
96
	return true;
97
}
98
 
99
function wdblog($keyerrore, $errdett) {
100
 
101
	global $conn, $progiscrizione, $periodo_da, $periodo_a, $keydett, $flag_ass, $progiscrizioneass, $idfile, $protocollo, $protocollo_ass;
102
	global $gl_id_richiesta, $gl_id_richiesta_ori, $gl_id_traccia;
103
 
104
	$progiscrizione_log = (isset($progiscrizione)) ? $progiscrizione : '';
105
	$keydett_log = (isset($keydett)) ? $keydett : 'NULL';
106
	$flag_ass_log = (isset($flag_ass)) ? $flag_ass : 'NULL';
107
	$periodo_da_log = (isset($periodo_da)) ? "to_date('$periodo_da', 'dd/mm/yyyy')" : 'NULL';
108
	$periodo_a_log = (isset($periodo_a)) ? "to_date('$periodo_a', 'dd/mm/yyyy')" : 'NULL';
109
	$progiscrizioneass_log = (isset($progiscrizioneass)) ? $progiscrizioneass : '';		
110
	$idfile_log = (isset($idfile)) ? $idfile : 'NULL';
111
	$gl_id_richiesta_log = (isset($gl_id_richiesta)) ? $gl_id_richiesta : 'NULL';
112
	$gl_id_richiesta_ori_log = (isset($gl_id_richiesta_ori) && !empty($gl_id_richiesta_ori)) ? $gl_id_richiesta_ori : 'NULL';
113
	$gl_id_traccia_log = (isset($gl_id_traccia)) ? $gl_id_traccia : 'NULL';
114
 
115
	if ((isset($flag_ass) && $flag_ass == 0) || defined('NATIVE'))
116
		$protocollo_log = (isset($protocollo)) ? $protocollo : '';
117
	elseif (isset($flag_ass) && $flag_ass == 1)
118
		$protocollo_log = (isset($protocollo_ass)) ? $protocollo_ass : '';
119
	else
120
		$protocollo_log = '';
121
 
122
	$errdett = sql_adjust($errdett);
123
	$errdett = substr($errdett, 0, 4000);
124
 
125
	$sql = "insert into S3_TI05_ERRLOG (TI05_ID, TI05_KEYERRORE, TI05_ERROREDETT, ";
126
	$sql .= "TI05_DATETIME, TI05_PROGISCRIZIONE, TI05_KEYDETT, TI05_FLAG_ASS, TI05_PERIODO_DA, ";
127
	$sql .= "TI05_PERIODO_A, TI05_PROTOCOLLO, TI05_PROGISCRIZIONEASS, TI05_N_FILE, TI05_ID_RICHIESTA, TI05_ID_RICHIESTA_ORI, TI05_ID_TRACCIA) ";
128
	$sql .= "values (TI05_SEQ.NEXTVAL, $keyerrore, '$errdett', sysdate, '$progiscrizione_log', $keydett_log, $flag_ass_log, ";
129
	$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)";
130
 
131
	/////////////////////////////////////////////////
132
	// UPDATE S3_TI05_ERRLOG
133
	/////////////////////////////////////////////////
134
	$insert = exec_sql($conn, $sql, 1);
135
	if (!$insert) {
136
		wlog(1, 0, 'INSERT ERRLOG');
137
	}
138
 
139
}
140
 
141
function sql_adjust($str) {
142
 
143
	$str = str_replace("'","`", $str);
144
 
145
	return $str;
146
}
147
 
148
function text_adjust($str) {
149
 
150
	$str = trim(str_replace("\n", ' ', $str));
151
 
152
	return $str;
153
}
154
 
155
function out($str, $level = 0) {
156
 
157
	if (OUTPUT > $level)
158
		echo $str.' <br> <br> ';
159
}
160
 
161
function xml_validation($xsd, $xml) {
162
 
163
	exec('sh LSTU_jval9.sh '.$xsd.' '.$xml.' '.ORA_XDK.' '.JRE_HOME.' '.PARENT_DIR.' 2>&1', $arr_ret);
164
 
165
  	$ret = implode('', $arr_ret);
166
 
167
	if ($ret == 'XML Document is valid')
168
		return ('OK');
169
  	else
170
		return ($ret);
171
}
172
 
173
// ************************************************
174
// FUNZIONE di REDIREZIONAMENTO
175
// ************************************************
176
function js_redirect($url, $msg = '', $target = 'top') {
177
    //header("Location:$url"); 
178
 
179
		echo "<script>";
180
		if ($msg != '') {
181
			$msg = js_adjust($msg);
182
			echo "alert('$msg');";
183
		}
184
		echo "$target.location = '$url';";
185
		echo "</script>";
186
 
187
}
188
 
189
function js_adjust($in) {
190
 
191
	$out = addslashes(str_replace("\n", "", str_replace("\r", "", $in)));
192
 
193
	return $out;
194
}
195
 
196
function decode_pkcs7($pkcs7) {
197
 
198
	$params['include_bodies'] = TRUE;
199
	$params['decode_bodies']  = TRUE;
200
	$params['decode_headers'] = TRUE;
201
	$params['crlf']           = "\r\n";
202
 
203
	$decode = new Mail_mimeDecode($pkcs7);
204
 
205
	$structure = $decode->decode($params);
206
 
207
	return $structure;
208
}
209
 
210
function update_codstato($codstato, $autocommit = 1) {
211
 
212
	global $conn, $progiscrizione, $periodo_da, $periodo_a, $keydett, $flag_ass, $periodicita;
213
 
214
	if ($codstato == 1) {
215
 
216
		$extra_set = ', TI04_DATATIME_INIZIO = sysdate ';
217
	}
218
	elseif ($codstato == 4) {
219
 
220
		if (isset($periodicita) && $periodicita == 0) { // UNA TANTUM	
221
 
222
			$sql = "update S3_TI03_SERVIZIRICHIESTI set TI03_DATAFINEISCRIZIONE = sysdate ";
223
			$sql .= "where TI03_PROGISCRIZIONE = '$progiscrizione'";
224
 
225
			if (!exec_sql($conn, $sql, 0)) {
226
 
227
				OCIRollback($conn);
228
				return false;
229
			}
230
		}
231
 
232
		$extra_set = ', TI04_DATATIME_FINE = sysdate , TI04_PROTOCOLLO = TI07_SEQ.NEXTVAL';
233
	}
234
	else {
235
 
236
		$extra_set = '';
237
	}
238
 
239
	$sql = "update S3_TI04_SERVIZIDETTAGLIO set TI04_CODSTATO = $codstato $extra_set ";
240
	$sql .= "where TI04_PROGISCRIZIONE = '$progiscrizione' and ";
241
	$sql .= "to_char(TI04_PERIODO_DA, 'dd/mm/yyyy') = '$periodo_da' and ";
242
	$sql .= "to_char(TI04_PERIODO_A, 'dd/mm/yyyy') = '$periodo_a' and ";
243
	$sql .= "TI04_KEYDETT = $keydett and TI04_FLAG_ASS = $flag_ass";
244
 
245
	if (!exec_sql($conn, $sql, $autocommit)) {
246
 
247
		OCIRollback($conn);
248
		return false;
249
	}
250
 
251
	return true;
252
}
253
 
254
 
255
function update_codstato_ass($codstato, $autocommit = 1,$keydett_ass) {
256
 
257
        global $conn, $progiscrizione, $periodo_da, $periodo_a, $keydett, $flag_ass, $periodicita;
258
 
259
        $sql = "update S3_TI04_SERVIZIDETTAGLIO set TI04_CODSTATO = $codstato ";
260
        $sql .= "where TI04_PROGISCRIZIONE = '$progiscrizione' and ";
261
        $sql .= "to_char(TI04_PERIODO_DA, 'dd/mm/yyyy') = '$periodo_da' and ";
262
        $sql .= "to_char(TI04_PERIODO_A, 'dd/mm/yyyy') = '$periodo_a' and ";
263
        $sql .= "TI04_KEYDETT = $keydett_ass and TI04_FLAG_ASS = 1";
264
 
265
        if (!exec_sql($conn, $sql, $autocommit)) {
266
 
267
                OCIRollback($conn);
268
                return false;
269
        }
270
 
271
        return true;
272
}
273
 
274
 
275
 
276
function check_lockfile($name) {
277
 
278
	global $fd_lockfile;
279
 
280
	$lock = APP_PATH.'tmp/'.$name.'.lock';
281
 
282
	$fd_lockfile = fopen($lock, 'a');  // NB: $fd_lockfile deve essere global!
283
 
284
	if(flock($fd_lockfile, LOCK_EX+LOCK_NB)) {
285
 
286
		set_file_buffer($fd_lockfile, 0);
287
		ftruncate($fd_lockfile, 0);
288
		fwrite($fd_lockfile, getmypid().' '.date('d/m/Y H:i:s')."\n");
289
		// NON chiamo fclose per mantenere flock!
290
	}
291
	else {
292
 
293
		fclose($fd_lockfile);
294
 
295
		//Lock file già in uso - uscita
296
		exit();
297
	}
298
}
299
 
300
function read_xml_single_tag($xml, $path) {
301
 
302
        global $gl_PP_xml_path;
303
 
304
        $gl_PP_xml_path = $path;
305
 
306
		// ************************************************
307
		// INCLUDE CLASSE PATH_PARSER
308
		// ************************************************
309
		require_once(APP_PATH.'include/LSTM_class_path_parser.php');
310
 
311
        $parser = new Path_parser();
312
        $parser->set_handler($path, "single_tag");
313
 
314
        if (!$parser->parse($xml,0)) 
315
        	return ("Error: ".$parser->get_error());
316
        else
317
        	return '';
318
}
319
 
320
//MM Funzione per i dati assenti
321
function read_xml_if_exist_single_tag($xml, $path) {
322
 
323
        global $gl_PP_xml_path;
324
 
325
        $gl_PP_xml_path = $path;
326
 
327
                // ************************************************
328
                // INCLUDE CLASSE PATH_PARSER
329
                // ************************************************
330
                require_once(APP_PATH.'include/LSTM_class_path_parser.php');
331
 
332
        $parser = new Path_parser();
333
        $parser->set_handler($path, "single_tag");
334
 
335
        return $parser->parse($xml,0);
336
}
337
 
338
function single_tag($name, $attribs, $content) {
339
 
340
        global $gl_PP_xml_path;
341
        global $gl_PP_arr_xml;
342
        static $arr_xml_app;
343
 
344
        $content = strip_tags($content);
345
 
346
        $arr_xml_app[$gl_PP_xml_path] = $content;
347
 
348
        $gl_PP_arr_xml = $arr_xml_app;
349
}
350
 
351
function elimina_iscrizione($p_iscr) {
352
 
353
	global $conn, $ocierr;
354
 
355
	$sql = "select count(*) from S3_TI04_SERVIZIDETTAGLIO where TI04_CODSTATO <> 0 ";
356
	$sql .= "and TI04_PROGISCRIZIONE = '$p_iscr'";
357
 
358
	$r_select = exec_select_format($conn, $sql);
359
 
360
	if (!$r_select)
361
		return 'Operazione in errore: '.$ocierr['message'];
362
 
363
	if ($r_select[0][0] > 0)
364
		return 'Operazione non eseguita: iscrizione non eliminabile.';
365
 
366
	$sql = "delete S3_TI04_SERVIZIDETTAGLIO where TI04_PROGISCRIZIONE = '$p_iscr'";
367
 
368
	if (!exec_sql($conn, $sql, 0))
369
		return 'Operazione in errore: '.$ocierr['message'];
370
 
371
	$sql = "delete S3_TI03_SERVIZIRICHIESTI where TI03_PROGISCRIZIONE = '$p_iscr'";
372
 
373
	// AUTOCOMMIT
374
	if (!exec_sql($conn, $sql, 1)) {
375
 
376
		OCIRollback($conn);
377
		return 'Operazione in errore: '.$ocierr['message'];
378
	}
379
 
380
	return 'Operazione correttamente eseguita.';
381
}
382
 
383
function lastChar($str, $sep) {
384
 
385
	if (strrpos($str, $sep) == strlen($str)-strlen($sep))
386
		$str = substr($str, 0, strlen($str)-strlen($sep));
387
 
388
	return $str;
389
}
390
 
391
function get_segnatura_client() {
392
 
393
	$arr_Identificatore = array('CodiceAmministrazione' => '', 
394
								'CodiceAOO' => '', 
395
								'NumeroRegistrazione' => '', 
396
								'DataRegistrazione' => '');
397
 
398
	// ------------------
399
	$arr_Ruolo = array('Denominazione' => 'Text', 
400
								 'Identificativo' => '');
401
 
402
	$arr_Amministrazione = array('Denominazione' => '', 
403
								 'CodiceAmministrazione' => '',
404
								 'Ruolo' => $arr_Ruolo);
405
 
406
	$arr_Mittente = array('Amministrazione' => $arr_Amministrazione, 
407
						  'AOO' => '');
408
 
409
	$arr_Origine = array('IndirizzoTelematico' => '', 
410
						 'Mittente' => $arr_Mittente);
411
	// ------------------
412
 
413
	$arr_Destinazione = array('IndirizzoTelematico' => '');
414
 
415
	// ------------------
416
 
417
 
418
	$arr_Intestazione = array('Identificatore' => $arr_Identificatore, 
419
							  'Origine' => $arr_Origine, 
420
							  'Destinazione' => $arr_Destinazione,
421
							  'Oggetto' => '');
422
	// ------------------																											
423
	$arr_Segnatura = array('Intestazione' => $arr_Intestazione);
424
 
425
	return $arr_Segnatura;
426
}
427
 
428
function get_segnatura_server() {
429
 
430
	$arr_Identificatore = array('ns4:CodiceAmministrazione' => '', 
431
								'ns4:CodiceAOO' => '', 
432
								'ns4:NumeroRegistrazione' => '', 
433
								'ns4:DataRegistrazione' => '');
434
 
435
	// ------------------
436
	$arr_Amministrazione = array('ns4:Denominazione' => '', 
437
								 'ns4:CodiceAmministrazione' => '');
438
 
439
	$arr_Mittente = array('ns4:Amministrazione' => $arr_Amministrazione, 
440
						  'ns4:AOO' => 'Text');
441
 
442
	$arr_Origine = array('ns4:IndirizzoTelematico' => '', 
443
						 'ns4:Mittente' => $arr_Mittente);
444
	// ------------------
445
 
446
	$arr_Destinazione = array('ns4:IndirizzoTelematico' => '');
447
 
448
	// ------------------
449
 
450
 
451
	$arr_Intestazione = array('ns4:Identificatore' => $arr_Identificatore, 
452
							  'ns4:Origine' => $arr_Origine, 
453
							  'ns4:Destinazione' => $arr_Destinazione,
454
							  'ns4:Oggetto' => '');
455
	// ------------------																											
456
	$arr_Segnatura = array('ns4:Intestazione' => $arr_Intestazione);
457
 
458
	return $arr_Segnatura;
459
}
460
 
461
function verify($pkcs7, $cert_filename) {
462
 
463
   $prefix = 'PP7M_'.substr(md5(microtime().posix_getpid()), 0, 8);
464
 
465
    // salvo l'allegato su file per poterne verificare la firma
466
    $to_verify_filename = APP_PATH.'tmp/'.$prefix;
467
 
468
    echo "CREO IL FILE INIZIO".$to_verify_filename."\n";
469
    wlog(1,0, "CREO IL FILE INIZIO".$to_verify_filename."\n");
470
 
471
    $pkcs7 = rtrim($pkcs7, "\x00..\x1F");
472
    $pkcs7 = trim($pkcs7);
473
    $pkcs7 .="\n";
474
 
475
    if(!wfile($to_verify_filename, $pkcs7)) {
476
        @unlink($to_verify_filename);
477
        echo 'Errore scrittura file: '.$to_verify_filename;
478
        return false;
479
    }
480
    wlog(1,0, "CREO IL FILE FINE".$to_verify_filename."\n");
481
    echo "CREO IL FILE FINE".$to_verify_filename."\n";
482
 
483
    $cainfo = FILE_CA;
484
 
485
    echo "INIZIO VERIFICA openssl_pkcs7_verify"."\n";
486
    wlog(1,0,"INIZIO VERIFICA openssl_pkcs7_verify"."\n");
487
 
488
    // verifica della firma
489
    // $ret = openssl_pkcs7_verify($to_verify_filename,PKCS7_TEXT|PKCS7_NOVERIFY, $cert_filename, $cainfo);
490
    $cmd = "openssl smime -verify -binary -in $to_verify_filename -CAfile $cainfo -signer $cert_filename 2>/dev/null";
491
    $ret = exec($cmd, $content, $rc);
492
    if ($rc === 0)
493
	$ret = true;
494
    else
495
	$ret = false;
496
 
497
    echo "FINE VERIFICA openssl_pkcs7_verify valore di ritorno: ".$ret."\n";
498
    wlog(1,0, "FINE VERIFICA openssl_pkcs7_verify valore di ritorno: ".$ret."\n");
499
 
500
    @unlink($to_verify_filename); 
501
 
502
    return $ret;			
503
}
504
 
505
function app_tag($tag_name, $tag_value, &$xml, $option = '', $arr_att = false) {
506
 
507
 
508
	switch ($option) {
509
 
510
		case 'OPTIONAL':
511
 
512
	    	if ($tag_value == '') {
513
	        	return;
514
	        }
515
 
516
		break;
517
 
518
		case 'OPTIONAL-ZERO':
519
 
520
			if ($tag_value == '' || $tag_value == '0') {
521
			    return;
522
			}            
523
 
524
		break;
525
 
526
		case 'OPTIONAL-ALLZERO':
527
 
528
			if (trim($tag_value, '0') == '') {
529
			    return;
530
			}            
531
 
532
		break;		
533
	}
534
 
535
	$xml .= '<'.$tag_name;
536
 
537
	if (is_array ($arr_att)) {
538
 
539
    	while (list ($att_name, $att_value) = each($arr_att)) {
540
 
541
            $xml .= ' '.$att_name."=\"".$att_value."\"";
542
    	}
543
 
544
	}
545
 
546
	$xml .= '>'.inspect_xml_entities($tag_value).'</'.$tag_name.'>';
547
	//$xml .= '>'.$tag_value.'</'.$tag_name.'>';
548
 
549
}
550
 
551
function ini_tag($tag_name, &$xml, $arr_att = false) {
552
 
553
	$xml .= '<'.$tag_name;
554
 
555
 
556
	if (is_array ($arr_att)) {
557
 
558
		while (list ($att_name, $att_value) = each($arr_att)) {
559
	    	$xml .= ' '.$att_name."=\"".$att_value."\"";
560
		}
561
	}
562
 
563
	$xml .= '>';
564
}
565
 
566
function end_tag($tag_name, &$xml) {
567
 
568
	$xml .= '</'.$tag_name.'>';
569
}
570
 
571
function inspect_xml_entities($string) {
572
 
573
    $string = strtr($string,array(
574
                                  '&'  => '&amp;',
575
                                  '>'  => '&gt;',
576
                                  '<'  => '&lt;',
577
                                  '"'  => '&quot;',
578
                                  '\'' => '&apos;' ));
579
 
580
	/*                                  
581
	$string = str_replace(array('ü', 'Ü', 'ö',
582
	                         'Ö', 'ä', 'Ä',
583
	                         'ß', '<', '>',
584
	                         '"', '\''
585
	                        ),
586
	                   array('&#252;', '&#220;', '&#246;',
587
	                         '&#214;', '&#228;', '&#196;',
588
	                          '&#223;', '&lt;', '&gt;',
589
	                          '&quot;', '&apos;'
590
	                        ),
591
	                   $xml
592
	                  );
593
 
594
	$string = preg_replace(array("/\&([a-z\d\#]+)\;/i",
595
	                          "/\&/",
596
	                          "/\#\|\|([a-z\d\#]+)\|\|\#/i",
597
	                          "/([^a-zA-Z\d\s\<\>\&\;\.\:\=\"\-\/\%\?\!\'\(\)\[\]\{\}\$\#\+\,\@_])/e"
598
	                         ),
599
	                    array("#||\\1||#",
600
	                          "&amp;",
601
	                          "&\\1;",
602
	                          "'&#'.ord('\\1').';'"
603
	                         ),
604
	                    $xml
605
	                   );
606
	*/
607
 
608
	return $string;
609
}
610
 
611
function read_cert($cert_filename) {
612
 
613
    //$pemdata = implode('', file($cert_filename));
614
 
615
    //CORREZIONE MM 
616
    $fp = fopen($cert_filename, "r");
617
    $pemdata = fread($fp,filesize($cert_filename)); 
618
    fclose($fp); 
619
 
620
    // Get a certificate resource from the PEM string.
621
    $cert_handler = openssl_x509_read($pemdata);
622
 
623
    // Parse the resource
624
    $arr_cert_data = openssl_x509_parse($cert_handler);
625
 
626
    // Free the resource
627
    openssl_x509_free($cert_handler);
628
 
629
    return $arr_cert_data;
630
}
631
 
632
function check_certificato($arr_cert, $class = false) {
633
 
634
	$arr_crl = '';
635
 
636
	// CONTROLLO EMITTENTE	
637
	//
638
	$trusted_issuer['C'] = CA_C;
639
	$trusted_issuer['O'] = CA_O;
640
	$trusted_issuer['OU'] = CA_OU;
641
	$trusted_issuer['CN'] = CA_CN;
642
 
643
	if ($trusted_issuer['C'] != $arr_cert['issuer']['C'] ||
644
		$trusted_issuer['O'] != $arr_cert['issuer']['O'] ||
645
		$trusted_issuer['OU'] != $arr_cert['issuer']['OU'] ||
646
		$trusted_issuer['CN'] != $arr_cert['issuer']['CN']) {
647
 
648
		if ($class) {
649
 
650
	        $class->gestione_fault($class->method_namespace, 'Certification Authority non riconosciuta');
651
	        return false;
652
	    }
653
	    else {
654
 
655
			return array(20026, 'CA emittente: '.$arr_cert['issuer']['C'].' - '.$arr_cert['issuer']['O'].' - '.$arr_cert['issuer']['OU'].' - '.$arr_cert['issuer']['CN']);
656
		}
657
	}
658
 
659
	// CONTROLLO SUBJECT
660
	//
661
	$trusted_subject['C'] = SC_C;
662
	$trusted_subject['O'] = SC_O;
663
	$trusted_subject['OU'] = SC_OU;
664
	$trusted_subject['CN'] = SC_CN;
665
 
666
	if ($trusted_subject['C'] != $arr_cert['subject']['C'] ||
667
		$trusted_subject['O'] != $arr_cert['subject']['O'] ||
668
		$trusted_subject['OU'] != $arr_cert['subject']['OU'] ||
669
		$trusted_subject['CN'] != $arr_cert['subject']['CN']) {
670
 
671
		if ($class) {
672
 
673
	        $class->gestione_fault($class->method_namespace, 'Soggetto del certificato non riconosciuto');
674
	        return false;
675
		}
676
		else {
677
 
678
			return array(20037, 'Subject: '.$arr_cert['subject']['C'].' - '.$arr_cert['subject']['O'].' - '.$arr_cert['subject']['OU'].' - '.$arr_cert['subject']['CN']);
679
		}
680
	}
681
 
682
	// CONTROLLO PERIODO DI VALIDITA'    
683
	//
684
	/////////////////////////////////////////////////
685
	// RECUPERO DATA DI SISTEMA DA ORACLE
686
	/////////////////////////////////////////////////
687
	$sysdate = oracle_date('yymmddhh24miss');
688
 
689
	if (!$sysdate) {
690
 
691
		if ($class) {
692
 
693
	    	$class->error_code = 60013;
694
	        $class->gestione_fault($class->method_namespace);
695
	        return false;
696
		}
697
		else {
698
 
699
			return array(20027, '');
700
		}
701
	}
702
 
703
	$sysdate = (float) $sysdate;
704
	$valid_from = (float) substr($arr_cert['validFrom'], 0, 12);
705
	$valid_to = (float) substr($arr_cert['validTo'], 0, 12);
706
 
707
	if ($valid_from > $sysdate) {
708
 
709
		if ($class) {
710
 
711
	        $class->gestione_fault($class->method_namespace, 'Certificato non valido - Errore: Data inizio validità.');
712
	        return false;
713
		}
714
		else {
715
 
716
			return array(20028, "Data inizio validità: $valid_from");
717
		}
718
	}
719
 
720
	if ($valid_to < $sysdate) {
721
 
722
		if ($class) {
723
 
724
	        $class->gestione_fault($class->method_namespace, 'Certificato non valido - Errore: Data fine validità.');
725
	        return false;
726
		}
727
		else {
728
 
729
			return array(20029, "Data fine validità: $valid_to");
730
		}
731
	}
732
 
733
	if (CRL_CHECK == 'SI') {
734
 
735
		// RECUPERO CRL
736
		list($err, $ret) = get_crl($class);
737
 
738
		if ($err) {
739
 
740
			if ($class) {
741
 
742
				$class->error_code = $err;	
743
		        $class->gestione_fault($class->method_namespace, $ret);
744
		        return false;
745
			}
746
			else {			
747
 
748
				return array($err, $ret);
749
			}
750
		}
751
 
752
		// CONTROLLO CERTIFICATI REVOCATI
753
		$arr_crl = $ret;
754
		$needle = '    Serial Number: ';
755
 
756
		$serial_number = trim(strtoupper(dechex($arr_cert['serialNumber'])));
757
 
758
		foreach($arr_crl as $k=>$v) {
759
 
760
			$pos = strpos($v, $needle);
761
 
762
			if ($pos === false) {
763
 
764
				if(strpos($v, 'BEGIN X509 CRL'))			
765
					break;
766
			}
767
			else {
768
 
769
				$sn_revoked = trim(substr($v, strlen($needle)));
770
 
771
				if ($sn_revoked == $serial_number) {
772
 
773
					if ($class) {
774
 
775
				        $class->gestione_fault($class->method_namespace, 'Certificato revocato');
776
				        return false;
777
					}
778
					else {					
779
 
780
						return array(20031, "SERIAL NUMBER: $serial_number");
781
					}
782
				}	
783
			}
784
		}
785
	}
786
 
787
	if ($class)
788
		return true;
789
	else
790
		return array(0, '');
791
}
792
 
793
function get_crl(&$class) {
794
 
795
	include_once(APP_PATH.'include/LSTU_fastcache.inc');
796
 
797
	$fname_cache = APP_PATH.'tmp/CRL_cache_date';
798
	$fname_in = APP_PATH.'tmp/CRL_binary';
799
	$fname_out = APP_PATH.'tmp/CRL_text';
800
 
801
	// LETTURA FILE CACHE
802
	$ret = fcache_read($fname_cache, $crl);
803
 
804
	if ($ret !== 0) {
805
 
806
		include_once(APP_PATH.'include/LSTU_http_requests.inc');
807
 
808
        // ***************************************************
809
        // CONNESSIONE 
810
        // ***************************************************
811
        $headers[] = new HTTP_Header('User-Agent', 'PHP_soap_client');
812
        //$headers[] = new HTTP_Header('Connection', 'close');
813
        $headers[] = new HTTP_Header('Host', CRL_SERVER);
814
        $script = '/var/crl_territorio.php';
815
 
816
        $req = new HTTP_Req('GET', $script, 'HTTP/1.0', $headers);
817
 
818
        $con = new HTTP_Connection(CRL_SERVER);
819
        $rc = $con->Connect();
820
 
821
        if ($rc) {
822
 
823
			if ($class)
824
				return array(60014, 'CONNESSIONE FALLITA A: '.CRL_SERVER.$script);
825
			else	
826
				return array(20032, 'CONNESSIONE FALLITA A: '.CRL_SERVER.$script);
827
        }
828
        else {
829
 
830
            $con->Request($req); // send request
831
            $con->Response($res); // creates a response obj read from server
832
            $con->Close(); // close connection to server
833
 
834
            $crl = $res->GetEntityBody();// echo entity body from response (file contents)
835
 
836
			if (substr($crl, 0, 5) != 'CRLOK') {
837
 
838
				if ($class)
839
					return array(60015, 'RESPONSE: '.$crl);
840
				else					
841
					return array(20033, 'RESPONSE: '.$crl);
842
			}
843
 
844
			// SCRITTURA FILE CRL BINARIO				
845
			$ret = wfile($fname_in, substr($crl, 5));
846
			if (!$ret) {
847
 
848
				if ($class)
849
					return array(60016, 'Errore scrittura file: '.$fname);
850
				else					
851
					return array(20034, 'Errore scrittura file: '.$fname);
852
			}
853
 
854
			$arr = array();
855
			$ret = '';
856
 
857
			// CONTROLLO FIRMA CRL E
858
			// SCRITTURA FILE CRL TESTO
859
			exec ('openssl crl -inform DER -text -in '.$fname_in.' -out '.$fname_out.' -CAfile '.FILE_CA.' 2>&1', $arr, $ret);
860
 
861
			if ($ret !== 0) {
862
 
863
				if ($class)
864
					return array(60017, 'ERRORE nel comando OPENSSL CRL. Codice di ritorno: '.$ret.'. Message: '.implode(' - ', $arr));
865
				else
866
					return array(20035, 'ERRORE nel comando OPENSSL CRL. Codice di ritorno: '.$ret.'. Message: '.implode(' - ', $arr));
867
			}
868
 
869
			// SCRITTURA FILE CACHE
870
			$data_crl = "\n".'Web Server Date: '.date("d/m/Y H:i:s");
871
			$ret = fcache_write($fname_cache, $data_crl, 3600);
872
			if ($ret !== 0) {
873
 
874
				if ($class)
875
					return array(60018, 'ERRORE nella scrittura del file: '.$fname_cache.'. Codice fcache: '.$ret);
876
				else				
877
					return array(20036, 'ERRORE nella scrittura del file: '.$fname_cache.'. Codice fcache: '.$ret);
878
			}			
879
		} 
880
	}	
881
 
882
	if (is_file($fname_out)) {
883
 
884
		// RITORNO FILE CRL TESTO IN ARRAY	
885
		$arr_crl = file($fname_out);
886
	}
887
 
888
	if (!is_array($arr_crl)) {
889
 
890
		if ($class)
891
			return array(60019, 'Il file '.$fname_out.' è vuoto o non è stato possibile leggerlo.');
892
		else				
893
			return array(20030, 'Il file '.$fname_out.' è vuoto o non è stato possibile leggerlo.');
894
	}
895
 
896
	return array(0, $arr_crl);
897
}
898
 
899
function get_arrpk() {
900
 
901
	$arr_pk = array(PK_ENTE, PK_PWD);
902
	return $arr_pk;
903
}
904
 
905
function firma_allegato($filename_unsigned, $filename_pkcs7) {
906
 
907
	$arr_privkey = get_arrpk();
908
	$arr_header = array();
909
 
910
    if (!openssl_pkcs7_sign($filename_unsigned, $filename_pkcs7, CERT_ENTE, $arr_privkey, $arr_header, PKCS7_TEXT + PKCS7_DETACHED)) {
911
 
912
    	// log errori openssl
913
    	$msg_tot = 'OPENSSL ERROR: ';
914
		while($msg = openssl_error_string()) 
915
			$msg_tot .= ' - '.$msg;
916
 
917
        return $msg_tot;
918
    }
919
 
920
    return 'OK';
921
 }
922
?>