"); } else{ $GLOBALS['DATI']['head:'] = "VIS"; return true; } } session_write_close();//provato a mettere dopo gli altri header per la sessione pagamento che salta su ordinalo con auth_login_stay_on_page if($tipo == "permanent") header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$link); // if($GLOBALS["DATI"]['sito'] == 'ordinalo') indi_log("Headers al redirect: ".implode("|", headers_list())); die(); } function indi_redirect_permanent_pagina($pagina, $lingua=null, $agg=null) { return indi_redirect_permanent(genera_link($pagina, $lingua, $agg)); } function indi_redirect_permanent($link) { return indi_redirect($link, "permanent"); } function indi_redirect_premanent($link){//compatibilità nome fail return indi_redirect_permanent($link); } function indi_redirect_meta($link) { return indi_redirect($link, "meta"); } function indi_redirect_pagina($pagina=null, $lingua=null, $agg=null, $ancora=null, $tipo="") { return indi_redirect(str_replace("&","&",$GLOBALS['CONF']['redirects_genera_link']($pagina, $lingua, $agg, $ancora)), $tipo); } function indi_redirect_pagina_permanent($pagina, $lingua=null, $agg=null, $ancora=null){ return indi_redirect_pagina($pagina, $lingua, $agg, $ancora, "permanent"); } function indi_redirect_pagina_meta($pagina, $lingua=null, $agg=null, $ancora=null){ return indi_redirect_pagina($pagina, $lingua, $agg, $ancora, "meta"); } function indi_redirect_agg($pagina=null, $lingua=null, $agg=null){ return indi_redirect(genera_link_agg($pagina, $lingua, $agg)); } /* -------------------------- gestione azioni / filtri e sovrascritture ------------------------------------ vedi anche: http://demo.tnx.it/test/it/action/ Funzionamento: In pratica ci sono dei punti chiamati hook, sui quali si puo' registrare una funzione tramite indi_add_action e questa viene eseguita in quello specifico punto. Caratteristiche: - Aggiunta hook indi_do_action(NOME_HOOK); - Esecuzione funzione su hook, possibili anche funzioni multiple sullo stesso hook con gestione della priorità, non obb. (default 10) indi_add_action(HOOK, NOME_FUNZIONE, PRIORITA); - Possibilità di rimuovere una funzione legata ad un hook specifico indi_remove_action(NOME_FUNZIONE); Esempio: indi_add_action("pre_template","_funzione_da_eseguire"); function _funzione_da_eseguire() { //codice funzione } Esempio futuro nel caso di PHP >= 5.3 con l' utilizzo di funzioni anonime indi_add_action("pre_template", _funzione_da_eseguire() { //codice funzione }); Lista di hook base del core di indi pre_conf post_conf post_setup pre_menu post_menu pre_routing post_routing pre_module post_module pre_include post_include pre_template post_template post_output */ $ACTIONS = array(); function indiCallCached($func, $args){ $key = serialize(func_get_args()); if(!$GLOBALS['indiCallCachedCache'][$key]) $GLOBALS['indiCallCachedCache'][$key] = call_user_func_array($func, $args); return $GLOBALS['indiCallCachedCache'][$key]; } function indi_add_action($hook, $func, $pri = 10) { global $ACTIONS; $pri = (int) $pri; //converto in interno $new = array('hook' => $hook,'func' => $func, 'pri' => $pri,'called'=>0); $ACTIONS['hook'][$hook][$pri][] = $func; //array hook $ACTIONS['func'][$func] = $new; //array info funzioni $ACTIONS['count']++; //contatore globale chiamata funzione //ordino in base alle chiavi if($ACTIONS['count']) ksort($ACTIONS['hook'][$hook],SORT_NUMERIC); //$ACTIONS[$hook][$pri] = } //rimuovo la funzione function indi_remove_action($func) { global $ACTIONS; if($GLOBALS["CONF"]["DEBUG"] == "SI" or is_tnx_locale()) d_info("Rimuovo hook: '$hook'","indi_remove_action($hook)"); if(is_array($ACTIONS['func'][$func])) unset($ACTIONS['func'][$func]); else d_err("Non esiste funzione '$func' da rimuovere!","indi_remove_action($func)"); } //esegue le varie funzioni se presenti function indi_do_action($hook,$parametri=array()) { global $ACTIONS; //salvo azione if($ACTIONS && (!is_array($ACTIONS['hook']) || !is_array($ACTIONS))) { trigger_error("Qui ci sarà un fatal!"); } if(is_array($ACTIONS['hook'][$hook])) { foreach($ACTIONS['hook'][$hook] as $action) { foreach($action as $func) { //debug if($GLOBALS["CONF"]["DEBUG"] == "SI" or is_tnx_locale()) d_info("Eseguo funzione: '$func'","indi_do_action($hook)"); //logging da fare //controllo che l' la funzione non sia stata rimossa da indi_remove_action() if(is_array($ACTIONS['func'][$func])) { if( function_exists($func) ) { $ACTIONS['current_action'] = $func; $ACTIONS['current_hook'] = $hook; call_user_func_array($func,$parametri); $ACTIONS['log'][] = $hook." -> ".$func."()"; $ACTIONS['func'][$func]['called']++; } else { d_err("Non esiste la funzione: '$func'","indi_do_action($hook)"); } } } } return TRUE; } else { //non faccio niente return TRUE; } } /* ####### BLOCCHI ####### I blocchi sono include di file fisici richiamabili tramite una funzione, e danno la possibilità di avere una funzione wrapper (che avvolge) il codice di visualizzazione di di un sito - Prevede l' uso di file fisico che permette quindi un integrazione rapida, un riutilizzo facile del codice, e un maggior controllo del codice stesso. - A differenza di una funzione il codice di un blocco puo' essere copiato e incollato su un codice preesistente, questo permette un riutilizzo del codice all' esterno del blocco. - La possibilità di parametrizzazione ne consente un utilizzo piu' vasto come una funzione e quindi un riutilizzo maggiore rispetto ad un include. - La bunzione blocco usa la cattura dell' output, quindi è possibile scriverci come se fosse un vero include - Import automatico variabili globali come un include ma a differenza di un include le variabili rimangono locali come in una funzione. - Possibilità di integrazione tramite ajax con log e controllo errori impostazioni globali (indi.inc.php / template / menu / pagina) --------------------------------------------------------------------- Sono variabili di configurazione globali, ereditate da tutti i blocchi: $CONF['block_include_dir'] = NULL; //(cartella o cartelle nelle quali cercare i blocchi) stringa separata da , o array $CONF['block_cache'] = "NO"; [NO|SI|numero_in_secondi > 0] //attiva la cache per tutti i blocchi, default vedi sotto //$CONF['block_cache_time'] = 60*60*2; //variabile globale per il tempo della cache del blocco, default uguale a $CONF['indi_apc_time'] (30 min) $CONF['block_cache_key'] = NULL; //variabile globale per invialidare la cache di tutti i blocchi contemporaneamente $CONF['block_cache_all'] = true|false; //cache tutti i blocchi di default (non usato se non per debug) ============================================ block( NOME_FILE, PARAMETRI, ABSOLUTE ); ============================================ NOME_FILE ------------------------ E' il nome del file con o senza estensione, puo' contenere variabili di template automaticamente sostituite, si possono specificare piu' file contemporaneamente, l' ordine di ricerca in squenza, il file è cercato all' interno della directory $CONF[block_include_dir] es: block("mappa"); block("mappa.php"); block("mappa-{pagina},mappa"); //Cerca il blocco "mappa-{pagina}", se non viene trovato include il blocco "mappa" PARAMETRI ---------------------------- Si possono specificare sia come ARRAY o come stringa (sintassi come quelli di un url) es: block("mappa-box",array("gps"=>"43,12")) //sintassi con array block("mappa-box","gps=43,12") //sintassi alternativa con stringa tipo url PARAMETRI riservati ---------------------------- - $block_param['cache'] [NO|SI|numero_in_secondi > 0] //attiva la cache per tutti i blocchi, se specificato un numero questo indica il numero di secondi es: 60 - $block_param['cache_key'] //key per la cache del blocco - $block_param['param_import'] //array aggiuntivo di parametri, per evitare l' array merge ABSOLUTE / alias: block_absolute( NOME, PARAMETRI ); ------------------------------------------------------------- Puo assumere valore TRUE / FALSE, di default è FALSE Se impostato a TRUE viene ignorato il parametro $CONF[block_include_dir], e l' inclusione è realizzata partendo dalla root del sito, e' quindi necessario specificare il path relativo completo es: block_absolute("_pagine/mappa.inc.php") variabili impostabili internamente al blocco ------------------------------------------------------------- - $block_return // forza il return del blocco, senno' di default torna l' output, ATTENDIONE dentro al blocco non e' permesso tornare niente con la direttiva 'return'! - $block_id [block_id] //id random univoco del blocco, "bid_".md5(mt_rand(1,1000000)) - $block_name o [block_name] //nome del file del blocco senza ".php" finale, - $block_file_inc //nome del file con estensione completa ============================================ block_ajax( NOME, PARAMETRI); ============================================ Stessa sintassi della funzione block(), ma include il blocco tramite ajax "ajax_loading" => 'Loading...', //immagine di loading "ajax_pagina" => "ajax", // pagina usata dal genera_link alla quale arriva la richiesta ajax "ajax_action" => "block", // la pagina ajax_pagina viene richiamata con il seguende parametro action=ajax_action "ajax_timeout" => 10000, // timeout ajax dopo il quale la richiesta Abortisce "ajax_delay" => 10000, // ritardo nella chiamata ajax "ajax_class" => NULL, // classe aggiuntiva specifica "ajax_id" => NULL, // id alternativo nel caso di blocchi ripetuti */ /* variabili globali blocchi mettere tutto in un array */ $BLOCK = array(); $_block_include_dir_array = array(); $_block_include_dir_array_ordinato = array(); $_block_included = array(); $_block_included_ajax = array(); $_block_included_name = array(); $_block_included_log = array(); $_block_included_current = NULL; $_block_included_prev = NULL; $_block_included_parent = NULL; /* da fare */ $_block_included_structure_level = 0; $_block_included_structure_level_old = 0; $_block_included_count = 0; function block_add_dir($dir, $priorita = 10){ global $_block_include_dir_array, $_block_include_dir_array_ordinato, $BLOCK; if(!is_array($_block_include_dir_array[$dir])) { $_block_include_dir_array[$dir] = $priorita; $_block_include_dir_array_ordinato[$priorita][] = $dir; ksort($_block_include_dir_array_ordinato,SORT_NUMERIC); } //array ordinato $BLOCK['dir'] = array(); foreach($_block_include_dir_array_ordinato as $k => $v){ foreach($v as $kk => $vv){ $BLOCK['dir'][] = $vv; } } return true; } function block_include_dir(){ global $BLOCK; return (array) $BLOCK['dir']; } /* alias di block include */ function block() { $param = func_get_args(); return call_user_func_array("block_include", $param); } /* DAusa un percorso assoluto per includere il blocco */ function block_absolute() { $param = func_get_args(); return call_user_func_array("block_include", $param,true); } /* usa un percorso assoluto per includere il blocco */ function block_include_absolute() { $param = func_get_args(); return call_user_func_array("block_include", $param,true); } function block_log() { } /* crea un div come placeholder html per la chiamata ajax che andrà poi a sostituire il contenuto */ function block_ajax() { if($GLOBALS["DATI"]["deferAllScript"]) trigger_error("non usare block_ajax() con deferAllScript perchè usa un valore random che genererebbe infiniti files"); //parametri specifici ajax $param_ajax = array( "ajax" => "1", "ajax_loading" => 'Loading...', /* immagine di loading */ "ajax_pagina" => "ajax", "ajax_action" => "block", "ajax_timeout" => 10000, "ajax_delay" => 0, "ajax_class" => NULL, "ajax_id" => NULL, "ajax_type" => "GET", ); //id univoco se non specificato */ if(!$_block_ajax_id) $_block_ajax_id = "ajax_bid_".md5(mt_rand(1,1000000)); else $_block_ajax_id = $param_ajax['id']; //parametri originali $param_func_orig = func_get_args(); //log chiamate ajax pagina $GLOBALS['_block_included_ajax'][$_block_ajax_id] = $param_func_orig; //serializzo la richiesta originale $_block_ajax_serialize_param = http_build_query($param_func_orig); //$_block_ajax_serialize_param = http_build_str($param_func); //aggiungo parametri ajax $param_func[0] = $param_func_orig[0]; $param_func[1] = array_merge((array)$param_ajax,(array)$param_func_orig[1]); //javascript con logging e report errori in locale if(is_tnx_locale()) $_ajax_error = 'if(error1.status != 200) {console.log(error1); $("#'.$_block_ajax_id.'").html("
block_ajax ('.$param_func[0].') ERROR : \'"+error1.responseText+"\' - \'"+error1.status+" "+error1.statusText+'.'"\' - \''.indi_htmlentities(indi_rimuovi_acapo(indi_var_dump($param_func_orig))).'\'
");}'; else $_ajax_error = '$("#'.$_block_ajax_id.'").html("");'; //codice AJAX $codice_ajax = ' $.ajax({type: "' . $param_func[1]["ajax_type"] . '", url: "'.genera_link_email($param_func[1]['ajax_pagina']).'", dataType: "json",timeout: '.$param_func[1]['ajax_timeout'].', data: {"action":"block","ajax_data":"'.$_block_ajax_serialize_param.'"}, success: function(data){ if(data) { $("#'.$_block_ajax_id.'").replaceWith(data); ' . ($param_func[1]["js_dopo_conferma"] ? $param_func[1]["js_dopo_conferma"] : "") . ' } },error: function(error1, a, textStatus){ '.$_ajax_error.' } }); '; //delay (ritardo) if((int)$param_func[1]['ajax_delay']) { $codice_ajax = ' setTimeout(function(){ '.$codice_ajax.' }, '.(int)$param_func[1]['ajax_delay'].' ); '; } //inject del javascript nel body $GLOBALS['DATI']['body:'.$codice_ajax] = "JS,PRE_CLOSE"; return "
".$param_func[1]['ajax_loading']."
"; } /* id univoco di un blocco da richiamare dentro un blocco */ /* funzione per viste di indi */ function block_include($_file,$block_param=NULL,$force=false) { //x compatibilita if(isset($block_param['import'])) $block_param['param_import'] = $block_param['import']; if($block_param) { if(is_array($block_param)) { //se ci sono altri parametri da importare rifaccio il merge // if(is_array($block_param['param_import'])) { //$block_param = array_merge($block_param ,(array) $block_param['param_import']); // } //nome semplice attenzione !!! if(is_array($block_param['param_import'])) { $block_param = array_merge((array) $block_param['param_import'], $block_param ); unset($block_param['param_import']); } } else { //caso stringa, ricostruisco array $block_param = indi_get_param_from_string($block_param); } } //assegno a variabile dentro questa funzione if(is_array($block_param)) { extract($block_param,EXTR_SKIP); //EXTR_SKIP per non sovrascrivere niente più sicuro ! } //stat if($GLOBALS["CONF"]["DEBUG"] == "SI" or is_tnx_locale()) $_time = indi_time(); //trovo nome blocco senza .php, non posso usare basename senno' non includo le cartelle $_file = str_replace(".inc.php","",$_file); $_file = str_replace(".php","",$_file); $_FILE = (array_unique(indi_array_trim(explode(",",$_file)))); //doppio include ??? ////d($_nome_blocco); //ordine dei percorsi, faccio qui il controllo per permettere di personalizzare l' ordine tramite la var DATI $_new_block_include_dir = block_include_dir(); if($_new_block_include_dir) $_new_block_include_dir = implode(",\n",block_include_dir()).",\n".$GLOBALS[DATI]['block_include_dir']."\n"; else $_new_block_include_dir = $GLOBALS[DATI]['block_include_dir']; //se non c'e' una cartella di inclusione uso la root del sito, nel caso di indi non configurati bene o percorsi assoluti if(!$_new_block_include_dir) { $_DIR = array($GLOBALS["CONF"]["path_base"]); } else { if($force == FALSE) $_DIR = array_reverse(array_unique(indi_array_trim(explode(",",indi_tpl($_new_block_include_dir,$GLOBALS[DATI],0))))); if($force == TRUE) $_DIR = array($GLOBALS["CONF"]["path_base"]); //da togliere come terzo parametro e sostituire con eventuali dati } //risolvo variabili di template $fileTrovato = false; foreach((array)$_DIR as $_dir) { if($_dir) foreach((array)$_FILE as $_file) { //metto assoluto //$_dir = $GLOBALS["CONF"]["path_base"].$_dir; //risolvo nomi template $_file = indi_tpl($_file,$GLOBALS['DATI'],0); //$_file_inc = $_dir.$_file.".php"; //trovo estensione if(is_file($_dir.$_file.".php")) $_file_inc = $_dir.$_file.".php"; elseif(is_file($_dir.$_file.".inc.php")) $_file_inc = $_dir.$_file.".inc.php"; else { if($GLOBALS["CONF"]["DEBUG"] == "SI") { $_time2 = indi_time(); $_time_s = $_time2 - $_time; //d_err("ERR: ".$_dir.$_file.".php/.inc.php NON_TROVATO (file:$_file) (dir:$_dir) (T:$_time_s)","block_include","INDI"); } } //controllo sicurezza include if($_file_inc and indi_above_dir($_file_inc,$_dir) == true) { d_err("ERR indi_above_dir: _file_inc:$_file_inc dir:'$_dir' file:'$_file'","block_include","INDI"); } //controllino if (isset($_file_inc)) { $fileTrovato = true; //loggo $GLOBALS['_block_included_log'][] = array($_file,$_file_inc,$_dir); //struttura //statistica x blocco $GLOBALS['_block_included'][$_file_inc]['name'] = $_file; $GLOBALS['_block_included'][$_file_inc]['tot']++; $GLOBALS['_block_included_current'] = $_file; /* if($GLOBALS['_block_included_structure_level_old'] != $GLOBALS['_block_included_structure_level']) { $GLOBALS['_block_included_structure'][$GLOBALS[_block_included_count]] = $_file; } else { if($GLOBALS['_block_included_structure_level_old'] < $GLOBALS['_block_included_structure_level']) { $GLOBALS['_block_included_structure']["$GLOBALS[_block_included_count] - $GLOBALS[_block_included_structure_level]"] = $_file; } if($GLOBALS['_block_included_structure_level_old'] > $GLOBALS['_block_included_structure_level']) { } } */ $GLOBALS['_block_included_structure_level_old'] = $GLOBALS['_block_included_structure_level']; $GLOBALS['_block_included_structure_level']++; $GLOBALS['_block_included_count']++; //loggo struttura $GLOBALS['_block_included_parent'] = $GLOBALS['_block_included_current']; //imposto variabili globali blocco nome globale blocco $block_id = "bid_".md5(mt_rand(1,1000000)); $block_name = $_file; $block_file_inc = $_file_inc; $region_name = $GLOBALS['_region_current']; //????? if(!$block_name) $block_name = "anonymous"; if(is_string($block_param)) trigger_error("\$block_param è una stringa: ".$block_param); //decido se usare la cache if ( ($block_param['cache'] == "SI" or (int)$block_param['cache'] > 0 or $GLOBALS['DATI']['block_cache_all']) and $GLOBALS['DATI']['block_cache'] == "SI" and !$_GET['no_cache'] and !$_GET['no_block_cache']) { $_cache=1; } else { $_cache=0; } //forzo a zero non so' perche bo ???? //carlo: infatti con questo if $block_param['cache'] == "SI" non funziona //if((int)$block_param['cache'] === 0) $_cache=0; //cache attiva if($_cache === 1) { //tempo cache if((int)$block_param['cache'] > 1) $block_param['cache_time'] = $block_param['cache']; else $block_param['cache_time'] = $GLOBALS['DATI']['block_cache_time']; //d_err($block_param['cache_time']); //md5 per cache //da FARE, mettere versioning su file di configurazione!!! // Si può passare nei parametri del blocco la variabile block_cache_key per modificare il serialize dei parametri e ottenere l'aggiornamento del blocco su variabili specifiche $_cache_key = md5(filemtime($_file_inc).$_file_inc.serialize($block_param).$GLOBALS['DATI']['lang'].$GLOBALS['DATI']['sito'].$GLOBALS['DATI']['block_cache_key'].cacheDefaultKeyForClient()); //controllo $_cache_out = indi_apc_fetch($_cache_key); //torno se trovo o se non scaduta if($_cache_out !== FALSE) { //debug if($GLOBALS["CONF"]["DEBUG"] == "SI") { $_time2 = indi_time(); $_time_s = $_time2 - $_time; d_info($_file,"block_include CACHE (T:$_time_s)","INDI"); } //cache hit return $_cache_out; } else { if($GLOBALS["CONF"]["DEBUG"] == "SI") { $_time2 = indi_time(); $_time_s = $_time2 - $_time; d_info($_file,"block_include CACHE non trovata ma CACHE = 1 (T:$_time_s)","INDI"); } } } else { if($GLOBALS["CONF"]["DEBUG"] == "SI") { $_time2 = indi_time(); $_time_s = $_time2 - $_time; d_info($_file,"block_include CACHE _cache !== 1 (T:$_time_s)","INDI"); } } //cache miss if ($_cache_out == FALSE or $block_param['cache'] == NULL) { ob_start(); //definisco blocco per eventuale sovarscrittura successiva //sembra ci sia un bug di php: http://www.demo.tnx.it/carlo/extract_bug/ //UPDATE: ripristinato con php 5.6 perchè la versione sotto era parecchio più lenta e lo script di test non riproduce più il bug extract($GLOBALS, EXTR_REFS); // foreach($GLOBALS as $key=>$ooo){ // if($key != "block_param") $$key = &$GLOBALS[$key]; // } if($DATI['chi_sono'] == 'noi' && $_GET['blockShow']){ $blockShowTime = -microtime(true); } include($_file_inc); //decido cosa tornare if($block_return !== NULL) { ob_get_clean(); return $_block_output = $block_return; } else { $_block_output = ob_get_clean(); } //sostituisco variabili template blocco $_block_output = str_replace("[block_name]",$block_name,$_block_output); $_block_output = str_replace("[region_name]",$region_name,$_block_output); $_block_output = str_replace("[block_id]",$block_id,$_block_output); //debug if($GLOBALS["CONF"]["DEBUG"] == "SI" or is_tnx_locale()) { $_time2 = indi_time(); $_time_s = $_time2 - $_time; } //cache if($_cache) apc_store($_cache_key, $_block_output, $block_param['cache_time']); if($GLOBALS["CONF"]["DEBUG"] == "SI") d_info("OK file:".$_file_inc."(T:$_time_s,".$GLOBALS['_block_included_structure_level'].")","block_include","INDI"); //loggo $GLOBALS['_block_included_structure_level']--; $GLOBALS['_block_included'][$_file_inc]['time'] += $_time_s; $GLOBALS['_block_included_prev'] = $GLOBALS['_block_included_current']; if($blockShowTime){ $blockShowTime = round(($blockShowTime+microtime(true))*100)/100; $absolute = $_file_inc; if(strpos($absolute, "/tnx/www/html/www/indi/") !== 0) $absolute = $DATI['path_base'] . $absolute; $_block_output = '
'. "".str_replace("/tnx/www/html/www/indi/SITI/", "", $absolute).' '.$blockShowTime."sec". $_block_output. '
'; } //ritorno return $_block_output; } } } } if(!$fileTrovato){ trigger_error("Blocco $_file non trovato", E_USER_ERROR); } return NULL; } function indi_mime_content_type($filename) { $mime_types = array( 'txt' => 'text/plain', 'htm' => 'text/html', 'html' => 'text/html', 'php' => 'text/html', 'css' => 'text/css', 'js' => 'application/javascript', 'json' => 'application/json', 'xml' => 'application/xml', 'swf' => 'application/x-shockwave-flash', 'flv' => 'video/x-flv', // images 'png' => 'image/png', 'jpe' => 'image/jpeg', 'jpeg' => 'image/jpeg', 'jpg' => 'image/jpeg', 'gif' => 'image/gif', 'bmp' => 'image/bmp', 'ico' => 'image/vnd.microsoft.icon', 'tiff' => 'image/tiff', 'tif' => 'image/tiff', 'svg' => 'image/svg+xml', 'svgz' => 'image/svg+xml', // archives 'zip' => 'application/zip', 'rar' => 'application/x-rar-compressed', 'exe' => 'application/x-msdownload', 'msi' => 'application/x-msdownload', 'cab' => 'application/vnd.ms-cab-compressed', // audio/video 'mp3' => 'audio/mpeg', 'qt' => 'video/quicktime', 'mov' => 'video/quicktime', // adobe 'pdf' => 'application/pdf', 'psd' => 'image/vnd.adobe.photoshop', 'ai' => 'application/postscript', 'eps' => 'application/postscript', 'ps' => 'application/postscript', // ms office 'doc' => 'application/msword', 'rtf' => 'application/rtf', 'xls' => 'application/vnd.ms-excel', 'ppt' => 'application/vnd.ms-powerpoint', // open office 'odt' => 'application/vnd.oasis.opendocument.text', 'ods' => 'application/vnd.oasis.opendocument.spreadsheet', ); $ext = strtolower(array_pop(explode('.',$filename))); if (array_key_exists($ext, $mime_types)) { return $mime_types[$ext]; } /*elseif (function_exists('finfo_open')) { $finfo = finfo_open(FILEINFO_MIME); $mimetype = finfo_file($finfo, $filename); finfo_close($finfo); return $mimetype; } else { ob_start(); system('file -i -b '.$filename); $output = ob_get_clean(); $output = explode("; ", $output); if (is_array($output)) { return trim($output[0]); } else { return 'application/octet-stream'; } }*/ return 'application/octet-stream'; } /* -------------------------- CORE ------------------------------------ */ //da ereditare dal core appena fatta //sintassi: function indi_get_param_from_string($string=NULL) { if(isset($string)) { parse_str($string,$output); // return $output; return indi_stripslashes($output); } return NULL; } /* -------------------------- CDN ------------------------------------ */ // funzioni per uso cdn /* function cdn_baseurl() { } */ function cdn_baseurl_static() { //$return = indi_get_cache("cdn_baseurl_static"); //if($return === NULL) { $return = str_replace("#CARTELLA#",indi_site_folder(),$GLOBALS['DATI']['cdn_baseurl_static']); // return indi_set_cache("cdn_baseurl_static",$return); //} else { return $return; //} } function cdn_genera_link($pagina=NULL, $lang=NULL, $agg=NULL, $ancora=NULL, $andtype="&"){ $ret = genera_link($pagina, $lang, $agg, $ancora, $andtype, false, 1); if($GLOBALS["DATI"]["cdn_static_active"] == "SI") { $ret = str_replace(indi_baseurl(),cdn_baseurl_static(),$ret); } return $ret; } function cdn_force_genera_link($pagina=NULL, $lang=NULL, $agg=NULL, $ancora=NULL, $andtype="&"){ $ret = genera_link($pagina, $lang, $agg, $ancora, $andtype, false, 1); $ret = str_replace(indi_baseurl(),cdn_baseurl_static(),$ret); return $ret; } /* -------------------------- URL ------------------------------------ */ function indi_get_url($http=TRUE) { //PORTA if(($GLOBALS['CONF']['baseurl_port'] == 'AUTO' and $_SERVER["SERVER_PORT"] != "80" and $_SERVER["SERVER_PORT"] != "443") or $GLOBALS['CONF']['baseurl_port'] == 'SI') $port = ":".$_SERVER["SERVER_PORT"]; if($http) return "http".($_SERVER['HTTPS']=='on'?'s':'')."://$_SERVER[SERVER_NAME]$port$_SERVER[REQUEST_URI]"; else return $_SERVER["SERVER_NAME"].$port.$_SERVER["REQUEST_URI"]; } /* -------------------------- DOMINI MULTIPLI ------------------------------------ $BASEURL['yyy'] = "http://www.yyy.it"; $BASEURL['xxx'] = "http://www.xxx.it"; dentro indi: if(indi_baseurl_get() == 'yyy') { $CONF[nome_sito] = "yyy"; } funzioni frontend / conf: - indi_baseurl_get - indi_baseurl_switch - indi_baseurl_link_switch - indi_baseurl_list note; - non accedere mai alle variabili direttamente es: $GLOBALS['BASEURL'], usare sempre le funzioni da fare: - genera link con base - Gestione SSL (se il contesto e' ssl deve generare https in automatico, ora e' fatto dentro index1.1) - Nello switch, sovrascrittura di tutte le variabili associate a quella base (pagina:def, lingua_def, ecc) - Prenizializzazione permanente dentro index1.1 - Controllo dipendenze - Controllo chiamate fuori contesto - Gestione errori - Controllo compatibilità con vecchio sistema - Controllo compatibilità con sitoturismo - Migliorare indi_baseurl_link_switch - generare dentro init il baseurl se non c'e', per rendere il modulo indipendente */ function indi_baseurl_init() { if($GLOBALS['indi_baseurl_init'] === 0) { //variabili globali $GLOBALS['indi_baseurl_init'] = 1; //inizializzo } } //baseurl CDN function indi_cdn_baseurl() { return $GLOBALS['DATI']['cdn_baseurl']; } //torna sempre il baseurl della relativa base //??? da fare tutto dentro indi_baseurl function indi_baseurl_get_baseurl($base=NULL) { if($GLOBALS['BASEURL'][$base]) return $GLOBALS['BASEURL'][$base]; else return false; } //restituisce la chiave corrente del baseurl se c'e' //definita dentro indi // $BASEURL['xxx'] = "http://www.xxx.it/"; // $BASEURL['yyy'] = "http://www.yyy.it/"; function indi_baseurl_get() { indi_baseurl_init(); if(indi_is_locale()){ //se ho una sessione attiva uso questa per determinare il baseurl indi_session_start(); $_tmp_base = $_GET[indi_baseurl_switch]; //da fare in altro posto if($_GET['indi_baseurl_switch'] == "reset") { unset($_SESSION['indi_base_current_key']); return indi_baseurl(true); } else { //uso il get per un cambio realtime if($GLOBALS['BASEURL'][$_tmp_base]) { $base = $_tmp_base; } else $base = $_SESSION['indi_base_current_key']; } return $base; } else { foreach($GLOBALS['BASEURL'] as $k => $v) { //mettere controllo per wvitare il www if($v == indi_baseurl()) return $k; } } return indi_baseurl(); //caso di default ??? da capire se è giusto o deve tornare il primo baseurl } //solo per basi multiple //funzione per cambiare / settare il baseurl anche dentro la pagina //forza anche le variabili baseurl2 e dominio sito function indi_baseurl_switch($base=NULL) { indi_baseurl_init(); //eseguo eventuale azione indi_do_action("indi_baseurl_switch"); //solo se se ci sono piu' basi if(count($GLOBALS['BASEURL']) > 0 and $base != "") { //se trovo la base corrispondente if(array_key_exists($base,$GLOBALS['BASEURL'])) { //imposto current $GLOBALS['indi_base_current_key'] = $base; //in locale lascio il baseurl invariato e uso solo la sessione x distinguere la base if(indi_is_locale()) { indi_session_start(); $_SESSION['indi_base_current_key'] = $base; return true; } else { //sovrascrivo sempre baseurl, baseurl2, dominio_sito $GLOBALS['CONF']['baseurl'] = indi_baseurl_get_baseurl($base); if($GLOBALS['DATI']['baseurl']) $GLOBALS['DATI']['baseurl'] = $GLOBALS['CONF']['baseurl']; //baseurl2 $GLOBALS['CONF']['baseurl2'] = substr($GLOBALS['CONF']['baseurl'],0,strlen($GLOBALS['CONF']['baseurl'])-1); //per compatibilità; if($GLOBALS['DATI']['baseurl2']) $GLOBALS['DATI']['baseurl2'] = $GLOBALS['CONF']['baseurl2']; //dominio sito $GLOBALS['CONF']['dominio_sito'] = str_replace("http://","",$GLOBALS['CONF']['baseurl2']); if($GLOBALS['DATI']['dominio_sito']) $GLOBALS['DATI']['dominio_sito'] = $GLOBALS['CONF']['dominio_sito']; return true; } } else { if($base != "reset") d_err("indi_baseurl_switch('$base') non presente in \$BASEURL"); } } return false; } //genera il link per lo switch function indi_baseurl_link_switch($base="reset") { indi_baseurl_init(); $base_val = indi_baseurl_get_baseurl($base); if(indi_is_locale()) { //devo tornare solo se cambia la base, senno' in locale non funziona //return "?indi_baseurl_switch=$base"; if($base == "reset" or $base == "") return indi_baseurl(true)."?indi_baseurl_switch=reset"; return indi_baseurl(true)."?indi_baseurl_switch=$base"; } else { return $base_val; } } function indi_baseurl_list() { indi_baseurl_init(); return $GLOBALS['BASEURL']; } function indi_baseurl($ignoro_baseurl=false) { indi_baseurl_init(); /* bug: se è configurato il BASEURL (basi multiple), cerca di risolverlo prima tramite questo da fare: - Memorizzazione statica dal baseurl dipendono: - $CONF[dominio_sito] - $CONF[baseurl] - $CONF[baseurl2] (senza slash finale) */ if($ignoro_baseurl == false) { //se settato il baseurl globale prendo questo if($CONF['baseurl'] != "") return $CONF['baseurl']; //fare alias inverso per velocizzare if(is_array($GLOBALS['BASEURL'])) { foreach($GLOBALS['BASEURL'] as $k => $v) { if(stristr("http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]/",$v)){ return $v; } } } } if(($GLOBALS['CONF']['baseurl_port'] == 'AUTO' and $_SERVER["SERVER_PORT"] != "80" and $_SERVER["SERVER_PORT"] != "443") or $GLOBALS['CONF']['baseurl_port'] == 'SI') $port = ":".$_SERVER["SERVER_PORT"]; //vecchio codice basato su cartella $HH = $_SERVER["SERVER_NAME"].$port; $AA = explode($_SERVER["DOCUMENT_ROOT"],$_SERVER["SCRIPT_FILENAME"]); $BB = explode("/",$AA[1]); $togli = $GLOBALS['tnxBoot'] == 'admin_tnx' ? 3 : 1; for ($i = 0; $i < sizeof($BB)-$togli; $i++ ) { $U = $U."/".$BB[$i]; } if (substr($U, 1,1) == "/") $U = substr($U, 1); $UU = str_replace("//","/",$HH.$U."/"); return "http://".$UU; } function indi_baseurl_query() { $ret = str_replace(indi_baseurl(),"",indi_get_url()); return $ret; } //trovo cartella principale di indi function indi_site_folder() { global $CONFIGURAZIONE; if(stristr($CONFIGURAZIONE, "/")){ $out = explode("/",$CONFIGURAZIONE); $out = $out[1]; } else { $out = array_reverse(explode("/",realpath("./"))); $out = $out[0]; } if($out) return $out; else d_err("ERR Cartella sito 'site'"); } function indi_site_domain() { $base = indi_baseurl(); return str_replace("http://","",substr($base,0,strlen($base)-1)); } //vecchie funzioni per compatibilità function genera_BASEURL() { return indi_baseurl(); } //deprecata trova la cartella in cui risiede il sito function ind_trova_sito() { return indi_site_folder(); } //deprecata, usare indi_dominio function genera_dominio() { return indi_site_domain(); } /* -------------------------- BASE PATH ------------------------------------ */ function indi_base() { /* CESTINATO 10/9/21 dopo almeno 7 mesi di test (vedi if sotto) vecchio codice da cestinare */ /* $AA = explode($_SERVER["DOCUMENT_ROOT"], $_SERVER["SCRIPT_FILENAME"]); $BB = explode("/",$AA[1]); $togli = $GLOBALS['tnxBoot'] == 'admin_tnx' ? 3 : 1; for ($i = 0; $i < sizeof($BB)-$togli; $i++ ) { $U = $U."/".$BB[$i]; } if (substr($U, 1,1) == "/") $U = substr($U, 1); $UU = str_replace("//","/",$U."/"); */ /* FINE vecchio codice da cestinare */ $relative = explode("/", substr($_SERVER["SCRIPT_FILENAME"], strlen($_SERVER["DOCUMENT_ROOT"]))); $tolgo = $GLOBALS['tnxBoot'] == 'admin_tnx' ? 3 : 1; if($GLOBALS["SCRIPT_DEPTH_FOR_BASE_PATH"]) $tolgo += $GLOBALS["SCRIPT_DEPTH_FOR_BASE_PATH"];//se chiamo indi da uno script posizionato più a fondo rispetto all'index devo avvalorare prima questa variabile $return = implode("/", array_slice($relative, 0, -1*$tolgo))."/"; /* if($return != $UU && $GLOBALS["CONF"]["sito"] != 'ordinalo'){ trigger_error("x carlo ".$return." != ".$UU); return $UU; } else */ return $return; } function indi_basepath() { return $_SERVER['DOCUMENT_ROOT'].indi_base(); } //deprecata function genera_BASE() { return indi_base(); } /* -------------------------- CACHE MEMORIA (riservate per il core) ------------------------------------ */ //VELOCIZZAZIONE FUNZIONI, per ora salvo in $_CACHE; //salva un parametro nella configurazione globale CONF in modo che la funzione sia velocizzata se richiamata piu' volte function indi_set_cache($chiave,$valore) { $GLOBALS['_CACHE'][$chiave] = $valore; return $valore; } //mi aspetto sempre un valore diverso da null, senno' cmq torno NULL function indi_get_cache($chiave) { if(isset($GLOBALS['_CACHE'][$chiave]) and $GLOBALS['_CACHE'][$chiave] !== NULL) { return $GLOBALS['_CACHE'][$chiave]; } return NULL; } //è preferibile usare le funzioni indiSiteCache* per avere un riferimento alla variabile //usare indiCache* solo se si ha necessità di condividere il contenuto tra siti //con usi molto ravvicinati xcache non è atomica, passare alla shared memory con php <5.3 è po' tricky (vanno gestiti manualmente la "scadenza" e gli id delle area di memoria http://it2.php.net/manual/en/book.shmop.php#111626), con php 5.3 e le funzioni shm_get_var / shm_put_var potremo eventualmente pensare di abbandonarla function cacheSitePrefix() { return $_SERVER['SERVER_NAME']. ($GLOBALS["CONF"]['dove_sono']=='loc'?"-".str_replace("/", "", $GLOBALS["CONF"]['base']):'')."-". $GLOBALS["DB"]["database"]."-";//necessario per sitimulti-dominio return ($GLOBALS["DATI"]["sito"]?$GLOBALS["DATI"]["sito"]:$GLOBALS["CONF"]["sito"])."-".$GLOBALS["DB"]["database"]."-"; } function cacheDefaultKeyForClient(){//ritorna una chiave che include le caratteristiche del client che possono far variare l'output global $CONF, $DATI; $cacheDefaultKeyForClient = ''; if($DATI["elementiDevice"][0]){ $cacheDefaultKeyForClient .= $DATI["elementiDevice"][0]; } if($CONF["gall_webp"]){ $cacheDefaultKeyForClient .= "_webp"; } if(is_tnx()){//potrebbe avere delle eccezioni is_tnx() che poi sarebbero viste da tutti $cacheDefaultKeyForClient .= "_ip_TNX"; } if($info = cakeLoginInfo()){//amministraButton, altro... $cacheDefaultKeyForClient .= "_gruppo_admin_".$info['Group']['id']; } if($DATI["less_dynamic_css_vars"]){ $cacheDefaultKeyForClient .= $DATI["less_dynamic_css_vars"]; } return $cacheDefaultKeyForClient; } function indiSiteCacheSet($k, $d, $t=0 /*0=forever*/){ return indiCacheSet(cacheSitePrefix().$k, $d, $t); } function indiSiteCacheGet($k){ return indiCacheGet(cacheSitePrefix().$k); } function indiSiteCacheUnset($k){ return indiCacheUnset(cacheSitePrefix().$k); } function indiSiteCacheIsset($k){ return indiCacheIsset(cacheSitePrefix().$k); } /* $listaDati = $MODELLO->find('all'); echo indiOutputDatiCache( //genero una chiave correlata al contenuto //vengono automaticamente generate più versioni della cache, in base a: dispositivo, supporto webp, ip tnx, livello gruppo utente loggato in admin (amministraButton) md5(serialize($listaDati)), //tempo massimo durata cache 86400, //funzione che genera l'html, viene chiamata solo quando non è presente una versione cache, deve ovviamente contenenere più operazioni possibili //le variabili esistenti (ad esempio quelle con cui ho generato la chiave) possono essere passate con la sintassi "use" function() use ($listaDati){ //qui posso usare $listaDati //non devo modificare direttamente $DATI, ma usare le funzioni: //datiAdd($chiave, $valore, $forzaSovrascrittura = false) e datiGet($chiave) return outParagrafi($cfg_out_paragrafi); } ); */ function datiAdd($key, $data, $replace = false, $fromIndiCache = false){ indiCacheFunc($GLOBALS["indiCache_currentKey"][$GLOBALS["indiCache_currentKey_nestLevel"]], "datiAdd", array($key, $data, $replace)); //if ($GLOBALS["indiCache_no_cake"] && $aggiugnere != "indiCache" && !$GLOBALS["indiCache_currentKey"][$GLOBALS["indiCache_currentKey_nestLevel"]]) trigger_error("datiAdd con indiCacheFunc senza indiCache_currentKey NL = " . $GLOBALS["indiCache_currentKey_nestLevel"]); if($GLOBALS['indiOutputDatiCacheStarted']){ if($replace) $GLOBALS['indiOutputDatiCacheDatiReplace'][$key] = $data; else{ if(!$GLOBALS['indiOutputDatiCacheDatiAdd'][$key]) $GLOBALS['indiOutputDatiCacheDatiAdd'][$key] = $data; else if(is_array($GLOBALS['indiOutputDatiCacheDatiAdd'][$key])) $GLOBALS['indiOutputDatiCacheDatiAdd'][$key] = array_merge($GLOBALS['indiOutputDatiCacheDatiAdd'][$key], $data); else if(is_string($GLOBALS['indiOutputDatiCacheDatiAdd'][$key])) $GLOBALS['indiOutputDatiCacheDatiAdd'][$key] .= $data; else trigger_error("Controllare \$GLOBALS[indiOutputDatiCacheDatiAdd][$key]"); } } else{ if($replace) $GLOBALS['DATI'][$key] = $data; else{ if(!$GLOBALS['DATI'][$key]) $GLOBALS['DATI'][$key] = $data; else if(is_array($GLOBALS['DATI'][$key])) $GLOBALS['DATI'][$key] = array_merge($GLOBALS['DATI'][$key], $data); else if(is_string($GLOBALS['DATI'][$key])) $GLOBALS['DATI'][$key] .= $data; else trigger_error("Controllare \$GLOBALS[DATI][$key]"); } } } function datiGet($key){ if($GLOBALS['indiOutputDatiCacheStarted']){ if(isset($GLOBALS['indiOutputDatiCacheDatiReplace'][$key])) return $GLOBALS['indiOutputDatiCacheDatiReplace'][$key]; if(isset($GLOBALS['indiOutputDatiCacheDatiAdd'][$key])) return $GLOBALS['indiOutputDatiCacheDatiAdd'][$key]; } return $GLOBALS['DATI'][$key]; } function indiOutputDatiCachePrepareSet(){ $GLOBALS['indiOutputDatiCacheStarted'] = true; $GLOBALS['indiOutputDatiCacheDatiAdd'] = array(); $GLOBALS['indiOutputDatiCacheDatiReplace'] = array(); $GLOBALS['indiOutputDatiCacheDatiCopia'] = $GLOBALS['DATI']; } function indiOutputDatiCacheMerge($indiOutputDatiCacheDatiAdd, $indiOutputDatiCacheDatiReplace){ foreach($indiOutputDatiCacheDatiAdd as $k=>$v) datiAdd($k, $v, false); foreach($indiOutputDatiCacheDatiReplace as $k=>$v) datiAdd($k, $v, true); } function indiOutputDatiCacheRealKey($cacheKey){ return md5("indiOutputDatiCacheDati2".cacheDefaultKeyForClient().$cacheKey); } function indiOutputDatiCacheUnset($cacheKey){ indiSiteCacheUnset(indiOutputDatiCacheRealKey($cacheKey)); } function indiOutputDatiCacheSet($cacheKey, $html, $time){ if($GLOBALS['indiOutputDatiCacheDatiCopia'] != $GLOBALS['DATI']){ $diff = array_diff_assoc_recursive($GLOBALS['DATI'], $GLOBALS['indiOutputDatiCacheDatiCopia']); $keys = array_keys($diff); trigger_error("Non devi modificare \$DATI, usa datiAdd(\$key, \$data, \$replace = false). Chiavi \$DATI da controllare: ".implode(" ", $keys)); // mailtnx("errori@tnx.it", "Debug ".microtime(true), __FILE__.":".__LINE__."\n".print_r(array($GLOBALS['DATI'][$keys[0]], $GLOBALS['indiOutputDatiCacheDatiCopia'][$keys[0]], $_REQUEST, $_SERVER), true)); } $cacheData = array($html, $GLOBALS['indiOutputDatiCacheDatiAdd'], $GLOBALS['indiOutputDatiCacheDatiReplace']); $GLOBALS['indiOutputDatiCacheStarted'] = false; $GLOBALS['indiOutputDatiCacheDatiAdd'] = array(); $GLOBALS['indiOutputDatiCacheDatiReplace'] = array(); indiSiteCacheSet(indiOutputDatiCacheRealKey($cacheKey), /*serialize*/($cacheData), $time); indiOutputDatiCacheMerge($cacheData[1], $cacheData[2]); } function indiOutputDatiCacheGet($cacheKey){ if($_GET['noOutputDatiCache']) indiOutputDatiCacheUnset($cacheKey); $cacheData = indiSiteCacheGet(indiOutputDatiCacheRealKey($cacheKey)); $html = ''; if($cacheData){ $cacheData = /*unserialize*/($cacheData); $html = $cacheData[0]; // $link = genera_link_agg()."?noOutputDatiCache=1"; $link = genera_link_agg(null, null, array("noOutputDatiCache"=>1)); if($GLOBALS['CONF']['dove_sono'] == 'loc'){ $html = '
Disattiva OutputDatiCache
'.$html.'
'; } else console_log("OutputDatiCache attiva: ".$cacheKey); indiOutputDatiCacheMerge($cacheData[1], $cacheData[2]); } return $html; } function indiOutputDatiCache($cacheKey, $time, $outputFunction){ //controllo se c'è una versione in cache, se c'è viene restituito l'html e vengono sincronizzate le modifiche a $DATI $return = indiOutputDatiCacheGet($cacheKey); if(!$return){ //attivo la registrazione delle modifiche a $DATI indiOutputDatiCachePrepareSet(); //dopo il prepare non devo modificare direttamente $DATI, ma usare le funzioni: //datiAdd($chiave, $valore, $forzaSovrascrittura = false) e datiGet($chiave) $return = $outputFunction(); //salvo in cache l'html e le modifiche a $DATI, viene anche fatto un controllo per eventuali modifiche dirette a $DATI indiOutputDatiCacheSet($cacheKey, $return, $time); } //mando in output l'html return $return; } function array_map_recursive($callback, $array){ return filter_var($array, FILTER_CALLBACK, array('options' => $callback)); } function array_diff_assoc_recursive($array1, $array2){//array_diff_recursive foreach($array1 as $key => $value){ if(is_array($value)){ if(!isset($array2[$key])) { $difference[$key] = $value; } elseif(!is_array($array2[$key])) { $difference[$key] = $value; } else { $new_diff = array_diff_assoc_recursive($value, $array2[$key]); if($new_diff != FALSE) { $difference[$key] = $new_diff; } } } elseif((!isset($array2[$key]) || $array2[$key] != $value) && !($array2[$key]===null && $value===null)) { $difference[$key] = $value; } } return !isset($difference) ? false : $difference; } // se non c'e' APC tento di usare xcache if( !function_exists( 'apc_store' ) ) { function apc_exists( $k ) { return indiSiteCacheIsset($k); } function apc_store( $k , $d , $t = 0) { // fare eventuale workaround per valori NULL //if($d === NULL) d_err("apc_store() wrapper, errore non si puo' salvare un valore NULL! ","indi_cache"); //if($d === NULL) $d = "NULL"; if($d === null) return false; return indiSiteCacheSet( $k , $d , $t ); } // in xcache_get non c'e' un modo per sapere il risultato (secondo parametro) function apc_fetch( $k , &$r=NULL) { if(func_num_args() > 1) $r = indiSiteCacheIsset($k ); // ritorno false x compatibilità visti che apc_fetch torna false se non c'e' il valore // viene da se che non si puo' salvare un valore nullo, metto un warning in apc_store $ret = indiSiteCacheGet($k); if($ret === NULL) return FALSE; //if($ret === "NULL") return NULL; else return $ret; } function apc_delete( $k ) { return indiSiteCacheUnset( $k ); } } function indi_apc_store($key, $value, $time = 0){//solo per uniformare i nomi return apc_store($key, $value, $time); } function indi_apc_fetch($cache_key){ if(!$_GET['no_cache']) return apc_fetch($cache_key); return false; } /* -------------------------- CACHE FILESYSTEM ------------------------------------ Cache permanente su filesystem: - indi_filecache_store($chiave, $valore, $scadenza = 0) - indi_filecache_fetch($chiave,&$success) - indi_filecache_delete($chiave) - indi_filecache_exists($chiave) ATTENZIONE: - Chiave non puo' essere nulla - Non immagazzinare valori booleani nella cache, oppure usare il secondo parametro della funzione indi_cache_fetch() per avere l' esito del risultato ESEMPIO: http://demo.tnx.it/test/it/cache/ */ function indi_filecache_info($chiave, $ext = ".txt", $func = "md5") { global $CONF; $_custom_cache_dir = indi_basepath().$CONF['dir_indi']."cache"; if(!is_dir($_custom_cache_dir)) { if(mkdir($_custom_cache_dir)) { // bloccaAccessiConHtaccess($_custom_cache_dir); indi_log("indi_filecache_init()"); d_info("indi_filecache_init","indi_cache"); } else { d_err("indi_filecache_init() non riesco a creare la cartella '$_custom_cache_dir'","indi_cache"); } } return $_custom_cache_dir."/".$func($chiave).$ext; } function bloccaAccessiConHtaccess($dir) { $file = $dir."/.htaccess"; if(!is_file($file)) file_put_contents($file, "Require all denied"); } function indi_filecache_init() { trigger_error("funzione rimossa"); } function indi_filecache_delete($chiave) { //nome del file $_custom_cache_file = indi_filecache_info($chiave); d_info("indi_get_cache_file($chiave): Cancello file '$_custom_cache_file'","indi_cache"); return unlink($_custom_cache_file); } function indi_filecache_exists($chiave) { indi_filecache_fetch($chiave,$stato); return $stato; } function indi_filecache_add($chiave, $valore, $scadenza = 0) { indi_filecache_fetch($chiave,$stato); if($stato == TRUE) { return FALSE; } else { return indi_filecache_store($chiave,$valore,$scadenza); } } //salva sempre function indi_filecache_store($chiave, $valore, $scadenza = 0) { //nome del file $_custom_cache_file = indi_filecache_info($chiave); $out = file_put_contents($_custom_cache_file, serialize(array($valore,$chiave,$scadenza))); if($out === FALSE) { d_err("indi_set_cache_file($chiave,VALORE,$scadenza): errore creazione file di cache","indi_filecache"); return FALSE; } else d_info("indi_filecache_store($chiave): Scrivo file '$_custom_cache_file'","indi_cache"); return TRUE; } function indi_filecache_fetch($chiave, &$success = NULL) { $_custom_cache_file = indi_filecache_info($chiave); if(is_file($_custom_cache_file)) { $out = unserialize(file_get_contents($_custom_cache_file)); $creazione = (int) filemtime($_custom_cache_file); $chiave_stored = $out[1]; $scadenza = (int) $out[2]; //se non è scaduto ed è la stessa chiave if($chiave_stored == $chiave and ($scadenza === 0 or ($creazione + $scadenza > time()))) { d_info("indi_filecache_fetch($chiave): Leggo file '$_custom_cache_file'","indi_cache"); $success = TRUE; return $out[0]; //se scaduto, cancello ?? da fare con garbage collector ? } else { indi_filecache_delete($chiave); $success = FALSE; return FALSE; } } $success = FALSE; return FALSE; } function indiSiteFileCachePath($key){ return indi_filecache_info($key, ".php", "indiSoloAlfanumerici"); } //https://medium.com/@dylanwenzlau/500x-faster-caching-than-redis-memcache-apc-in-php-hhvm-dcd26e8447ad function indiSiteFileCacheSet($key, $val, $expire = 0){ $path = indiSiteFileCachePath($key); if(gettype($val) == "object" && !method_exists($val, "__set_state")){ // $val = str_replace('stdClass::__set_state', '(object)', $val); trigger_error("Per cachare un oggetto definire metodo statico __set_state (oppure convertire in array)"); return false; } $tmp = $path . uniqid('', true) . '.tmp';// Write to temp file first to ensure atomicity file_put_contents($tmp, '', LOCK_EX); rename($tmp, $path); return touch($path, time()+($expire?$expire:86400*365)); } function indiSiteFileCacheGet($key, &$success = null){ if($path = indiSiteFileCacheIsset($key)){ include $path; if(isset($val)){ $success = true; return $val; } else{ $success = false; return; } } else{ $success = false; return; } } function indiSiteFileCacheIsset($key){ $path = indiSiteFileCachePath($key); if(!is_file($path)) return; else if(filemtime($path) < time()){ unlink($path); return; } else return $path; } /* -------------------------- less ------------------------------------ */ function less_generate_output_exist($path){ global $DATI; if($DATI['less_evita_generazioni_contemporanee']){ $i = 0; $sleep = 0.5; $max = 10; $maxI = $max / $sleep; while(!filesize($path)){ usleep($sleep*1000000); clearstatcache();//filesize cacha if($i++ > $maxI){ trigger_error("Sto aspettando da $max secondi less_generate_output, carico la pagina e cancello il file, controllare $path"); unlink($path);//verrà rigenerato e non dovrebbe essere possibile più generare che sia generato un file di 0 byte return;//non deve arrivare al touch sotto! } } } touch($path);//aggiorno data per il nostro script che cancella i css vecchi } //risparmio memoria se metto dentro funzione function less_generate_output($lessSrc, $fullPath) { global $DATI; //creo il file prima di generare il contenuto per evitare di fare una doppia generazione in caso di visite contemporanee //attenzione: è necessario chiamare anche less_generate_output_exist per non caricare la pagina fino a che la generazione del file css non è completata //altrimenti il browser carica il file vuoto e sopratutto lo tiene in cache per l'intera sessione (nostro cache header per i css) if($DATI['less_evita_generazioni_contemporanee']) touch($fullPath); // sleep(1); if($DATI['dove_sono'] == 'loc') $lesstime = -microtime(true); //if($GLOBALS["DATI"]['sito'] == "sito_turismo_new" and is_online()) include_once($GLOBALS["DATI"]['dir_lib'].'lessphp-0.3.4/lessc.inc.php'); //else include_once($GLOBALS["DATI"]['dir_lib'].'lessphp-latest/lessc.inc.php'); include_once($GLOBALS["DATI"]['dir_lib'].'lessphp-latest/lessc.inc.php'); //include_once($GLOBALS["DATI"]['dir_lib'].'less.php-master/lessc.inc.php'); //include_once($GLOBALS["DATI"]['dir_lib'].'lessphp2.0/lessc.inc.php'); d_info("Include","LESS","INDI"); $less = new lessc(); try { if($GLOBALS["CONF"]["DEBUG"] == "SI") { $less_time = indi_time(); d_info("compile","LESS","INDI"); d_info("baseurl=".indi_baseurl(),"LESS","INDI"); d_info("cdn_baseurl=".indi_cdn_baseurl(),"LESS","INDI"); } //Psso alcune variabili globali di indi x include css $less->setVariables( array( "baseurl" => "'".indi_baseurl()."'", "cdn_baseurl" => "'".indi_cdn_baseurl()."'" ) ); if($GLOBALS["CONF"]["DEBUG"] == "SI") { d_info("DATI[less_import_dir]=".$GLOBALS["DATI"]["less_import_dir"],"LESS","INDI"); } if($GLOBALS["DATI"]["less_import_dir"]) $less->setImportDir($GLOBALS["DATI"]["less_import_dir"]) ; $less_out = trim($less->compile($lessSrc)); //fix per CDN $less_out = str_replace("http://demo.tnx.it/cdn/",$GLOBALS["DATI"]['cdn_baseurl'],$less_out); //debug e log $less_time = round((indi_time()-$less_time)*10)/10; $less_size = strlen($less_out); if($GLOBALS["CONF"]["DEBUG"] == "SI") { indi_log("Size: ".$less_size,"LESS","INDI"); d_info("End compile ($less_time)","LESS","INDI"); } indi_log("less_generate_output: LESS Compilo e salvo ($less_time, $less_size, $fullPath, $DATI[indi_device])"); if($DATI['minifyCss']){ require_once $GLOBALS["DATI"]['libPath'] . '/minify/src/Minify.php'; require_once $GLOBALS["DATI"]['libPath'] . '/minify/src/CSS.php'; require_once $GLOBALS["DATI"]['libPath'] . '/minify/src/JS.php'; require_once $GLOBALS["DATI"]['libPath'] . '/minify/src/Exception.php'; require_once $GLOBALS["DATI"]['libPath'] . '/minify/src/Exceptions/BasicException.php'; require_once $GLOBALS["DATI"]['libPath'] . '/minify/src/Exceptions/FileImportException.php'; require_once $GLOBALS["DATI"]['libPath'] . '/minify/src/Exceptions/IOException.php'; require_once $GLOBALS["DATI"]['libPath'] . '/minify/src/ConverterInterface.php'; require_once $GLOBALS["DATI"]['libPath'] . '/minify/src/Converter.php'; $minifier = new MatthiasMullie\Minify\CSS($sourcePath); $minifier->add($less_out); $less_out = trim($minifier->minify()); } // $less_out .= "\n/*"."http".(!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 's' : '')."://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']."*/"; if(!$less_out && $DATI['less_evita_generazioni_contemporanee']){ // print '
//
' .$fullPath . '
//
' . $lessSrc . '
//
'. $less_out . '
//
'; // die; trigger_error_to_email("marco@tnx.it", "La compilazione less non ha generato output per $fullPath (usa ?lessSeparateDebug=1 per controllo sorgenti)"); $less_out = '/*'; } if($_GET['lessSeparateDebug']){ echo "OUTPUT:\n".$less_out; } $return = file_put_contents($fullPath, $less_out); // if($DATI['dove_sono'] == 'loc') console_log("rigenerato ".array_pop(explode("/", $fullPath))." in ".round(($lesstime+microtime(true))*1000)."ms"); return $return; } catch (Exception $ex) { d_err("less->parse ERROR: ".$ex->getMessage()." (aggiungi ?debugtnx=1&no_less_cache=1 per vedere il file che sto provando a compilare)"); if($_GET['debugtnx']){ echo '
';
			$debugBacktrace = debug_backtrace(); array_unshift($debugBacktrace, array('file'=>__FILE__, 'line'=>__LINE__, 'function'=>'debugTnx')); foreach($debugBacktrace as $debugLine) echo "".str_replace("/tnx/www/html/www/", "", $debugLine['file']).""." ".$debugLine['function']."()
"; $printMe = $lessSrc; ob_start(); if(is_object($printMe)||is_array($printMe)) print_r($printMe); else var_dump($printMe); echo htmlentities(ob_get_clean(), ENT_COMPAT|ENT_HTML401|ENT_SUBSTITUTE, 'UTF-8'); echo '
'; die; } return false; } } function indiRemoveEmoji($text) { $clean_text = ""; // Match Emoticons $regexEmoticons = '/[\x{1F600}-\x{1F64F}]/u'; $clean_text = preg_replace($regexEmoticons, '', $text); // Match Miscellaneous Symbols and Pictographs $regexSymbols = '/[\x{1F300}-\x{1F5FF}]/u'; $clean_text = preg_replace($regexSymbols, '', $clean_text); // Match Transport And Map Symbols $regexTransport = '/[\x{1F680}-\x{1F6FF}]/u'; $clean_text = preg_replace($regexTransport, '', $clean_text); // Match Miscellaneous Symbols $regexMisc = '/[\x{2600}-\x{26FF}]/u'; $clean_text = preg_replace($regexMisc, '', $clean_text); // Match Dingbats $regexDingbats = '/[\x{2700}-\x{27BF}]/u'; $clean_text = preg_replace($regexDingbats, '', $clean_text); // Match Flags $regexDingbats = '/[\x{1F1E6}-\x{1F1FF}]/u'; $clean_text = preg_replace($regexDingbats, '', $clean_text); // Others $regexDingbats = '/[\x{1F910}-\x{1F95E}]/u'; $clean_text = preg_replace($regexDingbats, '', $clean_text); $regexDingbats = '/[\x{1F980}-\x{1F991}]/u'; $clean_text = preg_replace($regexDingbats, '', $clean_text); $regexDingbats = '/[\x{1F9C0}]/u'; $clean_text = preg_replace($regexDingbats, '', $clean_text); $regexDingbats = '/[\x{1F9F9}]/u'; $clean_text = preg_replace($regexDingbats, '', $clean_text); return $clean_text; } /* -------------------------- FILESYSTEM ------------------------------------ */ //trova estensione di un file, da gestire caso estensione nulla function indi_estensione_file ($f) { $ext = substr($f, strrpos($f,".") + 1); return strtolower($ext); } //ripulisce da caratteri strani un nome di file function indi_pulisci_nome_file($file) { $dir = pathinfo($file,PATHINFO_DIRNAME); if($dir) $dir .= "/"; $file = pathinfo($file,PATHINFO_BASENAME); $file = preg_replace("/[^a-z0-9\s_\-\.]/i", "",$file); return $dir.$file; } //ripulisce il nome di un file function indi_nome_file($file) { return pathinfo($file,PATHINFO_FILENAME); } //cancella una cartella e tutto il suo contenuto, controlare la ricorsione function indi_del_dir($dirname) { if (is_dir($dirname)) { if ($handle = @opendir($dirname)) { while (($file = readdir($handle)) !== false) { if ($file != "." && $file != "..") { $fullpath = $dirname . '/' . $file; /* if (is_dir($fullpath)) { remove($fullpath); @rmdir($fullpath); } else { @unlink($fullpath); } */ unlink($fullpath); } } closedir($handle); rmdir($dirname); return TRUE; } } return FALSE; } //---nuove sub ver > 5 /* -------------------------- RETE ------------------------------------ */ //controlla se un IP e' un una lista RBL function indi_ip_in_rbl($ip, $server, $timeout=1) { d_info("Inizio","indi_ip_in_rbl($ip,$server)","INDI"); $response = array(); $host = implode(".", array_reverse(explode('.', $ip))).'.'.$server.'.'; $cmd = sprintf('nslookup -type=A -timeout=%d %s 2>&1', $timeout, escapeshellarg($host)); exec($cmd, $response); d_info("Fine","indi_ip_in_rbl","INDI"); // The first 3 lines (0-2) of output are not the DNS response for ($i=3; $iread())){ $fullPath = $path."/".$entry; if(is_file($fullPath) && (!$regexp || preg_match($regexp, $entry)) && (!$maxAge || ((time()-filectime($fullPath)) > $maxAge))){ unset($fullPath); } } $d->close(); } function indi_redirect_with_session($url){ indi_redirect(indi_session_duplicate_url($url)); } function indi_session_duplicate_url($url){ $_SESSION['tokenSessioneIndi'] = mt_rand(); $_SESSION['tokenSessioneIndiScandenza'] = time() + 30; $url .= strpos($url, "?") !== false ? "&" : "?"; return $url . "token=" . $_SESSION['tokenSessioneIndi'] . "&sessionId=" . session_id(); } function indi_session_destroy(){ $GLOBALS['indi_session_start'] = false; session_destroy(); } //funzione per start sessione una sola volta function indi_session_start(){ global $CONF, $indiRedirectDaFare; if($CONF["SESS"] == "SI" and !isset($_REQUEST["no_sess"])) { if(!$GLOBALS['indi_session_start']){ $name = ini_get("session.name"); $path = indi_cookie_path(); $validaToken = false; //impostavo manualmente il session id per swfupload in area protetta (problema sicurezza forse) // if (isset($_POST["PHPSESSID"])) { // trigger_error("Uso di swfupload o tentativo di hack sessione"); // session_id($_POST["PHPSESSID"]); // } if($_GET['sessionId'] && $_GET['token']){ session_id($_GET["sessionId"]); $validaToken = $_GET['token']; } if(isset($_REQUEST["sessioneStampa"])){//deve essere passato come parametro standard (&sessioneStampa=) perchè scatta prima del parsing dei parametri della rewrite (ricordarsi anche di chiudere prima la sessione se è una server su server altrimenti si blocca tutto in attesa del termine della prima richiesta) session_id($_REQUEST["sessioneStampa"]); } d_info("indi_session_start 1","INFO","INDI"); /**************************************************************************************************/ /******************* tenere in sync con admin_tnx (controller->constructClasses()) ****************/ /**************************************************************************************************/ if($CONF['SESSIONI_IN_CARTELLA_INDI'] || $CONF['DURATA_SESSIONE']){// //inizializzazione creazione cartella e .htaccess, una volta sola $custom_session_dir = $CONF['path_base'].$CONF['dir_indi']."sessions";//tenere in sync con app_controller > constructClasses if(!is_dir($custom_session_dir)) { mkdir($custom_session_dir); // bloccaAccessiConHtaccess($custom_session_dir); } ini_set("session.save_path", $custom_session_dir);//separo le sessioni di questo sito dagli altri per far funzionare il gc //15/2/2018 TESTATO CHE IL GARBAGE COLLECTOR "GIRA" NELLA DIRECTORY CUSTOM // indiPulisciDirectory($custom_session_dir, $CONF['DURATA_SESSIONE']?$CONF['DURATA_SESSIONE']:86400, "/sess.*/"); /* paramtri default php (non c'è bisogno di risettarli): ini_set("session.gc_probability", 1);//frequenza gc: 1 volta... ini_set("session.gc_divisor", 100); //...ogni 100 visite ini_set("session.gc_maxlifetime", 1440); //durata standard */ //cecca 06/02/2024 , no in realtà è disabilitato per default, quindi riabilito ini_set("session.gc_probability", 1);//frequenza gc: 1 volta... ini_set("session.gc_divisor", 100); //...ogni 100 visite } d_info("indi_session_start 2","INFO","INDI"); if($CONF['DURATA_SESSIONE']){ ini_set('session.cookie_lifetime', $CONF['DURATA_SESSIONE']); //allungo la vita del cookie if($_COOKIE[$name]) setcookie($name, $_COOKIE[$name], time()+$CONF['DURATA_SESSIONE'], $path);//rinnovo il cookie se c'è già ini_set('session.gc_maxlifetime', $CONF['DURATA_SESSIONE']); //allungo la vita del file di sessione if(session_status() == PHP_SESSION_ACTIVE) session_regenerate_id();//se la sessione è già partita risetta il cookie con i nuovi parametri } //tipo di cache di sessione // indi_session_cache("SI"); ini_set('session.cookie_path', $path); d_info("indi_session_start 3","INFO","INDI"); /*******************************************************************************************************/ /******************* FINE tenere in sync con admin_tnx (controller->constructClasses()) ****************/ /*******************************************************************************************************/ if(!preg_match("/^[a-z0-9\-]+$/i", $_COOKIE[$name])) @session_start();//carlo: sopprimo errore perchè a volte ci sono utenti col cookie vuoto, forse qualche programma per privacy aggiuntiva oppure anche roba del tipo [PHPSESSID] => A2~me7eme011lrkefsn3s8gnvm324 else session_start(); d_info("indi_session_start 4","INFO","INDI"); if($validaToken){ $errore = false; if($validaToken != $_SESSION['tokenSessioneIndi']){ $errore = "non autorizzato"; } else if(time() > $_SESSION['tokenSessioneIndiScandenza']){ $errore = "scaduto"; } if($errore){ trigger_error("Tentativo di passaggio sessione tra siti ".$errore); indi_session_destroy(); return false; } unset($_SESSION['tokenSessioneIndi']); $indiRedirectDaFare = array(null, null, array('sessionId'=>'', 'token'=>'')); } d_info("indi_session_start 5","INFO","INDI"); if(session_name() != "PHPSESSID") indi_log("session_name:".session_name()); $GLOBALS['indi_session_start'] = true; } } } //imposta la cache della sessione e in generale | public | private_no_expire //???? da parametrizzare 30 minuti function indi_session_cache($STATO="NO"){ // if($GLOBALS[indi_session_start]) { if($STATO != "SI"){ session_cache_limiter('nocache'); } else { //disabilito cache session_cache_limiter('private'); session_cache_expire(30); } // session_write_close(); session_start(); // } } //funzione che gestiche gli header di cache, richiamata nell' index1.1 function indi_cache_header() { global $DATI; if($DATI['indi_cache_header'] == "AUTO") { //default $DATI['indi_cache_header'] = "cache_default"; //se c'e' un post // if(count($_POST) > 0) { //$DATI['indi_cache_header'] = "cache_form"; //d($_POST); // } //se sono autenticato o se ho roba nel carrello no cache sempre //per ora non importarebbe con il cache_default che aggiorna sempre if($DATI['auth'] == "SI" or count($_SESSION['indicarr']) > 0) { $DATI['indi_cache_header'] = "cache_no"; } } if($DATI['indi_cache_header'] == "cache_default") { header("Expires: "); header("Pragma: "); // header("Cache-Control: private"); header("Cache-Control: private, pre-check=0"); // header("Cache-Control: private, max-age=600, pre-check=600"); } //tolgo gli header elseif($DATI['indi_cache_header'] == "cache_reset") { //tolgo la roba header("Pragma: "); header("Expires: "); header("Cache-Control: "); } //abilito cache elseif($DATI['indi_cache_header'] == "cache_si") { header("Expires: "); header("Pragma: "); header("Cache-Control: private, max-age=600, pre-check=600"); } elseif($DATI['indi_cache_header'] == "cache_for_prefetch") {//attivata dalla paginazione di indi, serve per firefox, vedi indi_prefetch header("Expires: "); header("Pragma: "); header("Cache-Control: private, max-age=300, pre-check=300"); } //abilito cache elseif($DATI['indi_cache_header'] == "cache_form") {//non sembra essere usata //header("Expires: Thu, 19 Nov 1981 08:52:00 GMT"); header("Expires: "); header("Pragma: "); header("Cache-Control: private, max-age=300, pre-check=300"); } //disabilito cache elseif($DATI['indi_cache_header'] == "cache_no") { header("Expires: Thu, 19 Nov 1981 08:52:00 GMT"); header("Pragma: no-cache"); header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0"); //header("Cache-Control: private, pre-check=0"); } else { d_err("indi_cache_header:no_defined","INDI"); } } //session_cache_limiter('private'); //???riesumo la sessione da dentro la pagina in test function indi_session_resume(){ ini_set("session.use_cookies", false); $name = ini_get("session.name"); if(trim($_COOKIE[$name]))//aggiunto carlo, spesso è vuoto e arrivano errori session_id($_COOKIE[$name]); session_start(); } function indi_404_and_redirect(){ global $DATI; indi_404(); indi_redirect_pagina($DATI["pagina_def"], null, null, null, "meta");//uso il meta tag altrimenti lo status è 302 e non 404 } //funzione richiamata manualmente o in automatico dalla pagina 404 function indi_404() { global $CONF,$DATI; if($_GET['debug404']){ echo '
';
		$debugBacktrace = debug_backtrace(); array_unshift($debugBacktrace, array('file'=>__FILE__, 'line'=>__LINE__, 'function'=>'debugTnx')); foreach($debugBacktrace as $debugLine) echo "".str_replace("/tnx/www/html/www/", "", $debugLine['file']).""." ".$debugLine['function']."()
"; $printMe = indi_404; ob_start(); if(is_object($printMe)||is_array($printMe)) print_r($printMe); else var_dump($printMe); echo htmlentities(ob_get_clean(), ENT_COMPAT|ENT_HTML401|ENT_SUBSTITUTE, 'UTF-8'); echo '
'; die; } //eseguo una volta sola if(!$DATI['indi_404']) { //non loggo favicon e robots if( !stristr($_SERVER['REQUEST_URI'],"favicon.ico") and !stristr($_SERVER['REQUEST_URI'],"robots.txt") ){ //loggo il resto indi_log_file("ERRORE - 404 - $CONF[url_richiesto]"); } $DATI['indi_404'] = 1; if (function_exists(indi_404_personalizzata)) indi_404_personalizzata(); header ("HTTP/1.0 404 Not Found"); //prevengo indicizzazione $DATI["meta_noindex"] = "SI"; //se non sono richieste di pagine esce /* $ext = indi_estensione_file($_SERVER['REQUEST_URI']); if( $ext == "js" or $ext == "css" or $ext == "jpg" or $ext == "jpeg" or $ext == "png" or $ext == "gif" or $ext == "ico" or $ext == "txt" or $ext == "asp" or $ext == "doc" or $ext == "pdf" ) exit(); */ //eventualmente esco e visualizzo messaggio con torna alla home page //print "

Pagina non trovata

".htmlentities($CONF["baseurl2"].$_SERVER['REQUEST_URI']); //if($CONF["dove_sono"] == "rem" and ($_SESSION["amministrazioneIndi"] != "1" or $_REQUEST["amministrazioneIndi"] != "1")) indi_debug_email(null,"INDI 404 [".$CONF["baseurl2"].$_SERVER['REQUEST_URI']."]"); } } /* -------------------------- ------------------------------------ */ //ritorna vero se chi sta visitando è uno spider if($GLOBALS['tnxBoot'] != "admin_tnx"){ function preg_match_spider($string){ //questa stringa è anche negli alias del server .bashrc preg_match_all('/ngx_lua|lua-resty|crawler|googleimageproxy|awariobot|pingdom|paracrawl|vagabondo|semrushbot|yandex|bing|hopperbot|admantx|ecosia|duckduckgo|toscrawler|speedy_spider|httrack|msnbot|almaden|becomebot|link-checker-pro|ia_archiver|archive_crawler|exabot|googlebot|google|surveybot|zyborg|w3c-checklink|checklink|linkwalker|webcr|yahoo|slurp|naverbot|dloader|converacrawler|w3c_validator|innerprisebot|innerprise|topicspy|poodle predictor|ichiro|link checker pro|grub-client|gigabot|psbot|mj12bot|nextgensearchbot|tutorgigbot|gaisbot|xenu link sleuth|turnitinbot|iconsurf|zoe indexer|ahrefsbot|zoominfobot|bingbot|ccbot|dotbot|yandexbot|applebot|baiduspider|datanyze|zoombot|mojeekbot|the knowledge ai|crawler|blexbot|qwantify/i', $string, $result); return $result[0][0]; } function is_spider(){ $return = indi_get_cache("is_spider"); if($return === NULL){ $return = preg_match_spider($_SERVER["HTTP_USER_AGENT"]) // || substr($_SERVER["HTTP_REFERER"], -6) == ".best/"//a gennaio 2020 visto che c'è un bot che non si presenta come tale, riconoscibile perchè ha referrer svariati domini .best inesistenti (ad es "http://amaryllidaceae.best/"), su mtp fa il 34% delle visite, quasi nessuna invece su tutto il resto dei siti nello stesso giorno (0,3%) ; indi_set_cache("is_spider", $return); } return $return; } function string4js($string, $delimiter = '"'){ return $delimiter.str_replace(array($delimiter, "\n", "\r"), array('\\'.$delimiter, " "), $string).$delimiter; } function trimAfter($string, $limit = 40, $suffix = " […]"){ $string = strip_tags($string); if(strlen($string) > $limit) return substr($string, 0, $limit).$suffix; else return $string; } //htmlentities ricorsivo ibrido tra print_r e htmlentities function html_r($data, $recursive = 1){ if($recursive) for($j=0; $j<$recursive; $j++) $prefix .= " "; if(is_array($data) || is_object($data)){ $return .= is_array($data) ? "Array" : "Object"; $return .= "
$prefix(

"; foreach($data as $i=>$string){ $return .= $prefix."[$i] => ".html_r($string, $recursive+1); } return $return."
$prefix)
"; } else{ return htmlentities($data)."
"; } } function array_to_jsObj($array){//converte un array php in un oggetto js if(!$array) return "{\n}";//l'invio serve per non far fare la sostiuzione a indi come se fosse una variabile $elements = array(); foreach($array as $nome=>$value){ $element = "'".$nome."'".':'; if(is_bool($element)) $element .= $value; else $element .= '"'.text4flash($value).'"'; $elements[] = $element; } return "{".implode(",", $elements)."}"; } } //se la pagina e' richiesta da javascript in ajax function is_ajax(){ if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') { return TRUE; } else { return FALSE; } /* vecchia versione if(stristr($GLOBALS['_SERVER']['HTTP_X_REQUESTED_WITH'],"XMLHttpRequest"))return TRUE; else return FALSE; */ } //funzione deprecata usare sempre indi_is_locale function is_locale(){ if(indi_location() == 'loc') return true; return false; } //funzione deprecata usare sempre indi_is_online function is_online(){ if(indi_location() == 'rem') return true; else return false; } //funziona solo in locale function is_tnx_locale(){ if(strpos($_SERVER['REMOTE_ADDR'], "192.168.0") === 0) return true; else return false; } function is_tnx(){ $return = indi_get_cache("is_tnx"); if($return === NULL) { $return = is_tnx_raw(); //è dentro index1.1 } return indi_set_cache("is_tnx",$return); } function is_cecca(){ if ($_SERVER["REMOTE_ADDR"] == "192.168.0.115") return true; return false; } function indi_location(){ //imposto dove sono //return 'rem'; //if (strstr($_SERVER['SERVER_NAME'],'demo.tnx.it') or strstr($_SERVER['SERVER_ADDR'],'192.168.0.105') ) { if ( $_SERVER['SERVER_ADDR'] == '192.168.0.105' || preg_match("/demo[\d]*\.tnx\.it/", $_SERVER['SERVER_NAME']) || substr($_SERVER['SERVER_NAME'], -11) == 'demo.tnx.it' ) { return 'loc'; } else { return 'rem'; } } //controlla se il sito e' in produzione, ovvero sul dominio indi.tnx.it di test oppure no function indi_is_production() { //cecca - aggiunto test su vari domini test per non indicizzare $CONF["meta_noindex"] = AUTO //if(indi_is_online() and stristr($_SERVER['SERVER_NAME'],$GLOBALS["CONF"]["dominio_test_online"]) == false) { if(indi_is_online() and !indi_is_dominio_test()) { return true; } else { return false; } } function indi_is_dominio_test() { return in_array($_SERVER['SERVER_NAME'], $GLOBALS["CONF"]["domini_test_online"]); } //controlla se siamo nel sito base o no function indi_is_base() { if($GLOBALS["CONF"]['sito'] == $GLOBALS["CONF"]['sito_base']) { return true; } else { return false; } } function indi_is_locale(){ if($GLOBALS['CONF']['dove_sono'] == 'loc') return true; return false; } function indi_is_online(){ if($GLOBALS['CONF']['dove_sono'] == 'rem') return true; else return false; } //aggiunge http:// se non c'e' function indi_fix_url($url) { return "http://".str_ireplace("http://","",$url); } /* piu' veloce e con timeout, torna l' IP da un nome con timeout */ function indi_get_addr_from_host($host, $timeout = 3, $force_whois = false) { $query = `nslookup -timeout=$timeout -retry=1 $host`; if(preg_match('/\nAddress: (.*)\n/', $query, $matches)) return trim($matches[1]); return FALSE; } /* ritorna la nazione fronendo l' ip ne codice 2 cifre STANDARD es: IT */ function indi_get_nazione_from_ip($ip = null) { global $CONF; //GEOIP if(!$ip) $ip = $_SERVER['REMOTE_ADDR']; //se non e' un IP if(!filter_var($ip, FILTER_VALIDATE_IP)) { if(!$ip = indi_get_addr_from_host($ip)) return FALSE; } // $force_whois = true; //cecca 05/09/2016 geoip maxmind - http://dev.maxmind.com/geoip/legacy/geolite/ if ($force_whois) { //vecchia versione con whois //trovare quando privato // if(explode(".",$ip != 4) and !stristr($ip,"192.168.") and !stristr($ip,"127.0.")) { if(count(explode(".",$ip)) == 4 and !stristr($ip,"192.168.") and !stristr($ip,"127.0.")) { $ret = shell_exec ("whois ".escapeshellcmd($ip)); indi_log("indi_get_nazione_from_ip($ip) WHOIS \n $ret"); } else return FALSE; $ret = preg_split("/Country:/i",$ret); $ret = explode("\n",$ret[1]); if(strlen(trim($ret[0])) == "2") return trim($ret[0]); else return FALSE; } else { //trovare quando privato // if(explode(".",$ip != 4) and !stristr($ip,"192.168.") and !stristr($ip,"127.0.")) { if(count(explode(".",$ip)) == 4 and !stristr($ip,"192.168.") and !stristr($ip,"127.0.")) { if (!function_exists("geoip_open")) { //indi_log("indi_get_nazione_from_ip($ip) include di " . $CONF["dir_lib"] . "GeoIP/geoip.inc"); include($CONF["dir_lib"] . "GeoIP/geoip.inc"); } if (function_exists("geoip_open")) { $gi = geoip_open($CONF["dir_lib"] . "GeoIP/GeoIP.dat", GEOIP_STANDARD); $geo_code = geoip_country_code_by_addr($gi, $ip); $geo_name = geoip_country_name_by_addr($gi, $ip); geoip_close($gi); //indi_log("indi_get_nazione_from_ip($ip) GeoIP $geo_code $geo_name"); if (strlen($geo_code) == "2") return $geo_code; } else { echo "function_exists geoip_open false";die; } return FALSE; } else { indi_log("indi_get_nazione_from_ip($ip) Errore ip non valido"); return FALSE; } } } function indi_get_geocoding($indirizzo, $output = "array", $accetta_partial_match = true, $params = null) { global $DATI; //https://developers.google.com/maps/faq#languagesupport if(is_null($params)) $params = "language=".$GLOBALS['LANG3TO2'][$DATI['lang']]; if($params) $params = '&'.$params; $url = "https://maps.googleapis.com/maps/api/geocode/json?key=".$DATI["google_maps_api_key_server_to_server"]."&address=".rawurlencode($indirizzo).$params; // console_log($url); if($res = file_get_contents($url)) { $RES = json_decode($res,true); if($output == "json") return $RES; if($RES["status"] == "OK"){ $return = []; foreach($RES["results"] as $arr){ //https://developers.google.com/maps/documentation/geocoding/requests-geocoding?hl=it if($arr['partial_match'] && !$accetta_partial_match) continue; if(isset($arr['partial_match']) /* query "modena" non c'è */ && !$arr['partial_match'] && $arr['geometry']['location_type'] == 'APPROXIMATE'){ trigger_error("Indirizzo APPROXIMATE, ma partial_match=false: ".$url); } $r = array( "indirizzo_formattato" => $arr["formatted_address"], "latitudine" => $arr["geometry"]["location"]["lat"], "longitudine" => $arr["geometry"]["location"]["lng"], "types" => $arr["types"] ); foreach($arr['address_components'] as $ac){ if(in_array('postal_code', $ac['types'])){ $r['cap'] = preg_replace("/[^\d]+/", "", $ac['long_name']); //pulisco la voce perchè è capitato che: //ci fosse la scritta "CAP: 10136" (5/2025): https://maps.googleapis.com/maps/api/geocode/json?language=ita®ion=it&key=AIzaSyCEXyYGcdo7YQc-idxl-UwcyQQU5VM2uTo&address=Corso%20Orbassano%20132%2CTorino%2C%20TO%2CItaly //ci fosse il numero civico come postal_code (al 7/2024 funziona=: https://maps.googleapis.com/maps/api/geocode/json?language=ita®ion=it&key=AIzaSyCEXyYGcdo7YQc-idxl-UwcyQQU5VM2uTo&address=via%20Acconcia%20parco%20ancar%2031%2CCapodrise%2C%20CE%2CItaly } } $return[] = $r; } return $return; } } return FALSE; } //indi_file_get_content / indi_url_get_content //funzione wrapepr fi file_get_contents(), per scaricare dati remoti con timeout e logging //alias function indi_file_get_contents($url,$context=NULL,$timeout=NULL) { return indi_url_get_content($url,$context,$timeout); } function indi_url_get_content($url,$context=NULL,$timeout=NULL) { //log start indi_log("indi_url_get_content: START (url:$url, timeout:$timeout)"); //timeout if($timeout) { $old_timeout = ini_get("default_socket_timeout"); //60 secondi è il default ini_set("default_socket_timeout", $timeout); } //scarico $content = @file_get_contents($url,FALSE,$context);//gestisco l'errore in maniera estesa sotto //$http_response_header è disponibile anche fuori da questa funzione //controllo errori if($content === FALSE) { indi_log("indi_url_get_content: ERROR (url:$url, timeout:$timeout), size(".strlen($content)."), header(".$http_response_header['0'].")"); //info aggiuntive d_err("Impossibile scaricare $url ($http_response_header[0])");//.print_r($http_response_header, true); if($_GET['debug_http_response_header']){ echo '
';
			$debugBacktrace = debug_backtrace(); array_unshift($debugBacktrace, array('file'=>__FILE__, 'line'=>__LINE__, 'function'=>'debugTnx')); foreach($debugBacktrace as $debugLine) echo "".str_replace("/tnx/www/html/www/", "", $debugLine['file']).""." ".$debugLine['function']."()
"; $printMe = $http_response_header; ob_start(); if(is_object($printMe)||is_array($printMe)) print_r($printMe); else var_dump($printMe); echo htmlentities(ob_get_clean(), ENT_COMPAT|ENT_HTML401|ENT_SUBSTITUTE, 'UTF-8'); echo '
'; die; } } //reimposto timeout if($timeout) ini_set("default_socket_timeout", $old_timeout); //indi_log("default_socket_timeout OK (url:$url, timeout:$timeout), size(".strlen($content)."), header(".$http_response_header['0'].")"); return $content; } function indi_apc_get_url($url, $tempo = 86400 /*null=nocache, 0=forever*/, $key_seed = "", $timeout = NULL, $context = null){ //1 giorno, passare tempo = null per annullare la cache esistente $cache_key = "get_url_".md5(print_r(array($url, $key_seed/*, $context questa non è la config, ma l'id del resource! */), true)); if($tempo === null){ //if($GLOBALS['DATI']['dove_sono'] != 'loc') trigger_error('Chiamata indi_apc_get_url con $tempo null (prima ritornava l\'esito della cancellazione, adesso fa la chiamata)'); /*return */indiSiteCacheUnset($cache_key); } else $cached = indiSiteCacheGet($cache_key); if(!$_GET['no_cache'] && $cached) return $cached;//!$_GET['no_cache'] serve per rinfrescare forzatamente la cache (quello dentro indi_apc_fetch non basta!) else{ $page = indi_file_get_contents($url, $context, $timeout); if($tempo !== null) indiSiteCacheSet($cache_key, $page, $tempo); return $page; } } //torna la nazione 2lettere dalla lingua 3 lettere function indi_nazione_from_lang($lang=NULL) { if(!$lang) $lang = $GLOBALS['DATI']['lang']; if(!$lang) $lang = $GLOBALS['CONF']['lang']; return $GLOBALS['LANG_TO_COUNTRY'][$lang]; } //torna le informazioni sull' user agent function indi_get_browser() { $u_agent = $_SERVER['HTTP_USER_AGENT']; $bname = 'Unknown'; $platform = 'Unknown'; $version= ""; //First get the platform? if (preg_match('/linux/i', $u_agent)) { $platform = 'linux'; } elseif (preg_match('/macintosh|mac os x/i', $u_agent)) { $platform = 'mac'; } elseif (preg_match('/windows|win32/i', $u_agent)) { $platform = 'windows'; } // Next get the name of the useragent yes seperately and for good reason if(preg_match('/MSIE/i',$u_agent) && !preg_match('/Opera/i',$u_agent)) { $bname = 'ie'; $ub = "MSIE"; } elseif(preg_match('/Trident/i',$u_agent)) { $bname = 'ie'; $ub = "rv"; } elseif(preg_match('/Firefox/i',$u_agent)) { $bname = 'fi'; $ub = "Firefox"; } elseif(preg_match('/Chrome/i',$u_agent)) { $bname = 'ch'; $ub = "Chrome"; } elseif(preg_match('/Safari/i',$u_agent)) { $bname = 'sa'; $ub = "Safari"; } elseif(preg_match('/Opera/i',$u_agent)) { $bname = 'op'; $ub = "Opera"; } // finally get the correct version number $known = array('Version', $ub, 'other'); $pattern = '#(?' . join('|', $known) .')[/ |:]+(?[0-9.|a-zA-Z.]*)#'; if (!preg_match_all($pattern, $u_agent, $matches)) { // we have no matching number just continue } // see how many we have $i = count($matches['browser']); if ($i != 1) { //we will have two since we are not using 'other' argument yet //see if version is before or after the name if (strripos($u_agent,"Version") < strripos($u_agent,$ub)){ $version= $matches['version'][0]; } else { $version= $matches['version'][1]; } } else { $version= $matches['version'][0]; } // check if we have a number if ($version==null || $version=="") {$version="?";} return array( 'userAgent' => $u_agent, 'name' => $bname, 'version' => (int) $version, 'platform' => $platform, 'pattern' => $pattern ); } /* ----------------------- CAMBIO ----------------------- */ //valute //estrae la valuta dai dati XML function indi_estrai_cambio($valuta,$data) { $out = explode($valuta,$data); $out = explode("'",$out[1]); return str_replace(",",".",trim($out[2])); } //scarica i dati XML function indi_genera_cambio() { // $xmlUrl = "http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml"; // ora ridireziona su quello sotto $xmlUrl = "https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml"; // XML feed file/URL $xmlStr = indi_apc_get_url($xmlUrl, 3600); $xmlObj = simplexml_load_string($xmlStr); $arrXml = objectsIntoArray($xmlObj); $valute = $arrXml[Cube][Cube][Cube]; if($valute) foreach($valute as $k => $valuta){ $valuta = $valuta["@attributes"]; $CAMBIO[$valuta['currency']] = $valuta['rate']; } $CAMBIO['EUR'] = 1; return $CAMBIO; } function indi_genera_cambio_all(){ return indi_genera_cambio(); } function objectsIntoArray($arrObjData, $arrSkipIndices = array()){ $arrData = array(); // Se in input c'è un oggetto lo converto in un array if (is_object($arrObjData)) $arrObjData = get_object_vars($arrObjData); if (is_array($arrObjData)) { foreach ($arrObjData as $index => $value) { if (is_object($value) || is_array($value)) $value = objectsIntoArray($value, $arrSkipIndices); if (in_array($index, $arrSkipIndices)) continue; $arrData[$index] = $value; } } return $arrData; } /* ----------------------- FINE CAMBIO ----------------------- */ //trim array function indi_array_trim($var) { if (is_array($var)) return array_map("indi_array_trim", $var); if (is_string($var)) return trim($var); return $var; } //ricerca ricursiva function indi_in_array($needle,$haystack) { foreach($haystack as $key=>$value) { $current_key=$key; if($needle===$value OR (is_array($value) && indi_in_array($needle,$value) !== false)) { return $current_key; } } return false; } //indi_above_dir //usage //$dir is the dir you are in //$dir_top is the highest dir allowed. //example /* if(above_dir('../', '/var/www/filemgr')) die('Not allowed. Please stick to your directories'); */ function indi_above_dir($dir, $dir_top){ if($dir == $dir_top) return false; $dir = realpath($dir); $dir_top = realpath($dir_top); $dir = count(explode('/', $dir)); $dir_top = count(explode('/', $dir_top)); if($dir <= $dir_top){ return true; }else{ return false; } } /* //esempio funzione con cache function is_test_generico(){ $res = indi_get_conf("is_test_generico"); if($res === NULL) $res = funzione(); return indi_set_conf("is_test_generico",$res ); } */ //ignora eventuali attributi del tag function indi_prima_dopo_tag ($tag,$buffer,$contenuto,$prima_del_tag=false) { if($tag && $contenuto) { if(!$buffer) return $buffer; $var1 = explode("<$tag",$buffer); $limit = sizeof($var1)-1; //faccio per tutti i form for ($i = 1; $i <= $limit; $i++) { $var2 = explode(">",$var1[$i]); $sostituisco = "<$tag".$var2[0].">"; //so cosa sostituire if($prima_del_tag) $buffer = str_replace($sostituisco,$contenuto.$sostituisco,$buffer); else $buffer = str_replace($sostituisco,$sostituisco.$contenuto,$buffer); } return $buffer; } else { //errore grave d_err("Errore grave da indi_output -> nella sintassi di indi_sostituzione_rapida_tag $tag"); return $buffer; } } function indi_krumo($var){ global $DATI; require_once($DATI['dir_lib'].'krumo/class.krumo.php'); krumo($var); } //funzioni encoding e-mail da cancellare function indi_encode_email_from($input, $charset = null,$tipo = "from"){ trigger_error("7/2/2018: funzione non utilizzata da cestinare"); return indi_encode_header($input,$charset); } function indi_encode_email_oggetto($input, $charset = null,$tipo = "oggetto"){ trigger_error("7/2/2018: funzione non utilizzata da cestinare"); return indi_encode_header($input,$charset); } //quota gli header email, nel caso dei nomi delle email aggiunge le virgolette, se necessario function indiEncodeQuoteMailHeader($input, $charset = null, $isEmailName = false){ global $DATI; //charset if(!$charset) { if($DATI['mcharset'] != "") $charset = $DATI['mcharset']; else $charset = "ISO-8859-1"; } //encodo secondo RFC2047 solo se necessario if(preg_match('/(\w*[\x80-\xFF]+\w*)/', $input)) $input = mb_encode_mimeheader($input,$charset, 'Q'); else if($isEmailName && preg_match("/[^-A-Za-z0-9!#$%&'*+\/=?^_`{|}~\s]/", $input)){ //altrimenti metto le virgolette solo se necessario secondo RFC5322 (solo parte "nome" di un header from/reply-to/to/cc/bcc) $input = '"'.str_replace(array('\\', '"'), array('\\\\', '\"'), $input).'"'; } /* CODICE DAMIANO: il replace non era perfetto e mancavano tutte le casistiche dei caratteri speciali if($tipo == "from") { //gestisce casi particolari if(stristr($input,'"')) $input=str_replace('"','\"',$input); $input=str_replace('\\"','\"',$input); //hackino if(stristr($input,',')) $input='"'.$input.'"'; } */ return $input; } //mescola un array in maniera random //a differenza di indi_mt_shuffle mescola per bene e lavora per reference function indi_shuffle(&$array){ uasort($array, create_function('$a,$b', 'return mt_rand(-1, 1);')); } //mescola un array in maniera random //vecchia versione damiano (usata solo premioceleste e guicciardiniemagni al momento della creazione di indi_shuffle) function indi_mt_shuffle($array){ if(count($array) == 1 || count($array) == 0){ return $array; } else { $randomKeys = array(); $max = count($array); foreach($array as $k => $v){ $randomKeys[mt_rand(0, $max)][] = array($k, $v); } sort($randomKeys); $output = array(); foreach($randomKeys as $key => $level){ foreach($level as $k => $v){ $output[$v[0]] =$v[1]; } } return $output; } } function indiGeneraJsTag($js){ // $defer = $GLOBALS['DATI']['deferAllScript'] ? " defer" : ""; return ""; } function indiCreateCssTag($url, $defer = false){ $base = ''; if($defer){ //https://web.dev/defer-non-critical-css/ return ''; } return $base; } function indiNoWhitespaces($text){ return str_replace([" ", "\t", "\r", "\n"], "", $text); } function indi_output($buffer){ global $CONF,$DATI,$TKD,$TXT,$LANG,$LANG3TO2,$lang,$MENU; $PRE_CLOSE = array(); if($CONF["indi_subversion"] < 4) { //######## JETBOX ######################################################################## if($DATI['jetbox'] == "SI") { $buffer = str_replace($DATI["jetbox_webimage_src"],$DATI["jetbox_webimage_dst"], $buffer); $buffer = str_replace($DATI["jetbox_webimage_safe"],$DATI["jetbox_webimage_dst"], $buffer); $buffer = str_replace($DATI["jetbox_webfiles_src"],$DATI["jetbox_webfiles_dst"], $buffer); $buffer = str_replace($DATI["jetbox_webfiles_safe"],$DATI["jetbox_webfiles_dst"], $buffer); } //######## HEAD ######################################################################## if($DATI["TKD"] == "SI") { //genero le parti dinamiche $DATI["title_din"] = @implode($DATI["title_sep"],$TKD[T]); $DATI["mkey_din"] = @implode($DATI["mkey_sep"],$TKD[K]); $DATI["mdesc_din"] = @implode($DATI["mdesc_sep"],$TKD[D]); //imposto i titoli $DATI["title"] = indi_tkd_title("title"); $DATI["mkey"] = indi_tkd_title("mkey"); $DATI["mdesc"] = indi_tkd_title("mdesc"); } } if($CONF["indi_subversion"] < 5) { $buffer = str_replace("#TITLE#",$DATI["title"], $buffer); $buffer = str_replace("#MKEY#",$DATI["mkey"], $buffer); $buffer = str_replace("#MDESC#",$DATI["mdesc"], $buffer); $buffer = str_replace("#KEY#",$DATI["key"],$buffer); $buffer = str_replace("#PAGINA#",$DATI["menu_txt"], $buffer); $buffer = str_replace("#LANG#",$DATI["lang"], $buffer); if($DATI["javascript"] != "") $buffer = str_replace("#JAVASCRIPT#","\n", $buffer); else str_replace("#JAVASCRIPT#","", $buffer); if($DATI["css"] != "") $buffer = str_replace("#CSS#","\n", $buffer); else str_replace("#CSS#","", $buffer); $buffer = str_replace("#BASE#", $DATI["baseurl"], $buffer); } //30/01/23: in questo if vengono fatte un sacco di operazioni che servono per popolare l'head (ad es generazione less css) o aggiungre roba prima/dopo l'apertura/chiusura del body, ma potrebbero non esserci (pagine ajax), aggiungo quindi il controllo (ne andrebbero fatti 2 diversi?) if($DATI['OUTPUT_HEAD_BODY_JS_CSS'] == "SI" && (stripos($buffer, "#HEAD#") !== false || stripos($buffer, '<'.'body') !== false)){ //debug head d_info($DATI["title"],"TPL:TITLE"); d_info($DATI["mkey"],"TPL:MKEY"); d_info($DATI["mdesc"],"TPL:MDESC"); //genero header AUTOMATICO if($DATI["indiCanonical"]){ if($DATI["indiCanonical"] === true){ $opt = array(); if($DATI['indiCanonicalUseRewId']) $opt = array("rewId" => $_GET['rewId']); $canonical = genera_link(null,null,$opt); } else $canonical = $DATI["indiCanonical"]; $HEAD[3] .= ''; } if($DATI["indiHreflang"]){ $langs = indiGetAllHostsLang(); foreach($langs as $l=>$nome){ if($MENU[$DATI["pagina"]][$l]['menu_pagina_vis'] != 'NO'){ $HEAD[4] .= ''."\n"; } } } if($DATI["rss"] != "") $HEAD[5] .= ''; if($DATI["mcharset"] != "" and $DATI["mcharset_head"] == "SI") $HEAD[8] .= ""; if($DATI["title"] != "") $HEAD[10] .= "".$DATI["title"] .""; if($DATI["mdesc"] != "") $HEAD[12] .= ""; if($DATI["mkey"] != "") $HEAD[14] .= ""; if($DATI["mautore"] != "") $HEAD[16] .= ""; if($DATI["mcopy"] != "") $HEAD[18] .= ""; //charset //webmaster google if($DATI["google_webmaster"] != "") $HEAD[22] .= ""; //webmaster google if($DATI["meta_noindex"] == "SI" || ($DATI["tabellaSitemapPronta"] && !$DATI['isPubblico'])) $HEAD[23] .= ""; //bing (il coniglio non il motore di ricerca ovviamente [cit fanels]) if($DATI["bing_verification"] != "") $HEAD[24] .= ""; $HEAD[25] .= ''; if($DATI["meta_favicon"] == "AUTO" and is_file($DATI["favicon_file_path"])) $HEAD[30] .= ""; if($DATI["meta_favicon"] == "AUTO" and is_file("favicon.gif") and $DATI['ua2'] == "ge") $HEAD[31] .= ""; if($DATI["googletagmanager_id"]){ $DATI['body:'.$DATI['googletagmanager_post_open']] = 'POST_OPEN'; } //INCLUDO CSS DINAMICI E JAVASCRIPT SE SPECIFICATO reset($DATI); $jremoto = 0; //usato per sapere dove posizionare il base if($CONF["indi_subversion"] < 4) $tjswo_c = 1000; //parto da 1000 a else $tjswo_c = 2000;//parto da 1000 a //if in caso stia facendo un cd //per ora non serve uso l'array per fare l'if $miniftJs = false; $miniftJsFiles = array(); $lessActive = trim($DATI['less_dynamic_css']) || trim($DATI['less_dynamic_css_after']) || $DATI['less_dynamic_array']; $lessFiles = array(); //ciclo principale per file, header, footer, body $cssToLoadViaJs = []; while(list($k, $v)=each($DATI)) { $kk = trim(substr($k,0,strpos($k,":"))); $tjswo = substr($k,strlen($kk)+1); if($v != "NO" and $kk != "") { if(!is_spider()){//aggiunto 4/3/2019 if(strpos($tjswo, "maps.google.com") !== false || strpos($tjswo, "maps.googleapis.com") !== false ){ $e = $v."\n".$k; if(strpos($tjswo, "key=") === false){ $tag = "google_maps_js_KO"; } else if(strpos($v, "MAPSOK") === false){ $tag = "google_maps_js"; } else{ $tag = "google_maps_js_ok"; } indiAdminLog($tag, $e); } else if( strpos($tjswo, "google") !== false && strpos($tjswo, "fonts.googleapis.com") === false && strpos($tjswo, "google-analytics") === false && strpos($tjswo, "recaptcha") === false && strpos($tjswo, "googletagmanager") === false && strpos($tjswo, "jquery") === false//dalla cdn di google && strpos($tjswo, "google-site-verification") === false && strpos($tjswo, "_pagine/") === false && strpos($tjswo, "webfont.js") === false && strpos($tjswo, "_gaq") === false ){ indiAdminLog("google", $tjswo." ".$v." ".$k); } } $tjswo_c++; //per i file di default vengono inlusi nell' HEAD, se invece e' specificato il BODY vengono inclusi alla fine del sito ... if($kk == "file") { //risolvo le parentesi $tjswo = indi_tpl($tjswo,$DATI,0); //1ms $file = 0; //gestisco CDN if(stristr($v,"CDN")) { $cdn = 1; $base_head = $DATI["cdn_baseurl"]; $path = $DATI["cdn_basepath"]; if(is_file($path.$tjswo)) $file = 1; } else { $cdn = 0; if(is_file($tjswo)) $file = 1; else $file = 0; $base_head = $DATI["baseurl"]; $path = ""; //supporto CDN statica if($GLOBALS["DATI"]["cdn_static_active"] == "SI") { $base_head = cdn_baseurl_static(); } //cecca, su sito ssl si va a mettere in indi ad esempio $DATI['file://maps.google.com/maps/api/js?sensor=false'] = 'VIS,JS,FORCE'; > in questo caso non si deve aggiungere il base altrimenti scazza l'url if (!$file && substr($tjswo, 0, 2) == "//") { $base_head = ""; } } //gestisco tutti i file anche gli include if($file) { //versioning //23/01/2018 - cecca - risolto bug VER che funzionava a caso, non venendo resettato prendeva l'ultima impostazione, tolto anche la condizione cdn == 0 (non vedo perchè per la cdn non si debba usare) //vedi Query String Accept in cdnsun https://cdnsun.com/cdn/settings/index/id/23675 $_ver = ""; //if($CONF['VERSIONING'] != "NO" and $cdn == 0) { if($CONF['VERSIONING'] != "NO") { $GLOBALS['indi_versioning_array'][$tjswo] = indi_estensione_file($tjswo); if($CONF["indi_subversion"] < 6) { if(stristr($v,"VER") or stristr($tjswo,"_files/screen_base.css") or stristr($tjswo,"_files/script_base.css") or stristr($tjswo,"_files/script.js") or stristr($tjswo,"_files/screen.css") or stristr($tjswo,"_files/screen2.css") ) $_ver = "?v={indi_versioning}"; else $_ver = ""; } else { if(stristr($v, "VER")) $_ver = "?v=".filemtime($path.$tjswo);//carlo: prima qui c'era un valore calcolato da TUTTI i file in versioning del sito ({indi_versioning}) else $_ver = ""; } } if(substr($tjswo,strlen($tjswo)-2) == "js" and stristr($v,"VIS")) { $dove = ''; if(stristr($v,"BODY")) $dove = 'BODY'; else if(stristr($v,"PRE_CLOSE")) $dove = 'PRE_CLOSE'; else $dove = 'HEAD'; if(stristr($v, "MIN") && ($_GET['noMinJs'] || $DATI['noMinJs'])){ d("non ricompilo js per " . ($_GET['noMinJs'] ? "GET['noMinJs'] = true" : "DATI['noMinJs'] = true"),"indi_log","LOG"); } if(stristr($v, "MIN") && !$_GET['noMinJs'] && !$DATI['noMinJs']){ $miniftJsFiles[$dove][] = $path.$tjswo; } else { $js = indiGeneraJsTag($base_head.$tjswo.$_ver); if($dove == 'BODY') $BODY[$tjswo_c] .= $js; else if($dove == 'PRE_CLOSE') $PRE_CLOSE[] = $js; else $HEAD[$tjswo_c + 10000] .= $js; } } if(substr($tjswo,strlen($tjswo)-2) == "ss" and stristr($v,"VIS")) { //less if(stristr($v,"LESS")) { //LESS $lessActive = true; //elenco dei file da leggere (lo faccio sempre) if($DATI['lessSeparate'] && stristr($v,"LESS_SEPARATE")){ $chiave = indi_solo_alfanumerici(str_replace(".css", "", array_pop(explode("/", $tjswo)))); $chiavei = ""; while($DATI["less_dynamic_css_array_before"][$chiave.$chiavei]) $chiavei++; $chiave .= $chiavei; $DATI["less_dynamic_css_array_before"][$chiave] = file_get_contents($tjswo); } else $lessFiles[] = $path.$tjswo; // $tjswo_rel = "stylesheet/less";//non usiamo less via js } else { if($DATI["loadCssViaJavascript"]){ $cssToLoadViaJs[] = $base_head.$tjswo.$_ver; } else { // $tjswo_rel = "stylesheet"; if(stristr($v,"BODY")) $BODY[$tjswo_c] .= indiCreateCssTag($base_head.$tjswo.$_ver); else $HEAD[$tjswo_c] .= indiCreateCssTag($base_head.$tjswo.$_ver); } } } } elseif(stristr($v,"VIS") and stristr($v,"FORCE")) { if(stristr($v,"JS")) { if(stristr($tjswo,"http://") == false && stristr($tjswo,"https://") == false){ if(stristr($v,"BODY")) $BODY[$tjswo_c] .= indiGeneraJsTag($base_head.$tjswo); else $HEAD[$tjswo_c + 10000] .= indiGeneraJsTag($base_head.$tjswo); } else { //caso javascript remoto $jremoto = 1; if(stristr($v,"BODY")) $BODY[$tjswo_c] .= indiGeneraJsTag($tjswo); else $HEAD[$tjswo_c + 10000] .= indiGeneraJsTag($tjswo); } } if(stristr($v,"CSS")) { //less if(stristr($v,"LESS")) { // $tjswo_rel = "stylesheet/less";//non usiamo less via js //non previsto per ora } else { if($DATI["loadCssViaJavascript"]){ $cssToLoadViaJs[] = $base_head.$tjswo.$_ver; } else { // $tjswo_rel = "stylesheet"; if(stristr($tjswo,"http://") == false) $HEAD[$tjswo_c] .= indiCreateCssTag($base_head.$tjswo); else $HEAD[$tjswo_c] .= indiCreateCssTag($tjswo); } } } } else if(stristr($tjswo,".") !== false and stristr($v,"NO_ERR") === false and stristr($v,"COPY") === false){ //CARLO: //questo errore veniva inviato solo in locale con and $CONF['dove_sono'] == "loc" (TOLTO) //aggiunto stristr($v,"COPY") === false perchè in base vengono impostati vari files con il paramentro COPY e in locale vengono copiati i file da base, online darebbero errore (se il sito funzionava in locale senza quei file dovrebbe funzionare anche online) d_err("File non trovato: $tjswo ($v) (potrebbe essere mancanza permesso X su cartella)","indi_output","INDI"); } } //javascript window.onload if($kk == "window.onload") { if(stristr($v,"VIS")) { $DATI["javascript.window.onload"] .= "\t".$tjswo."\n"; } } if($kk == "window.unload") { if(stristr($v,"VIS")) { $DATI["javascript.window.unload"] .= "\t".$tjswo."\n"; } } //javascript semplice if($kk == "javascript") { if(stristr($v,"VIS")) { $DATI["javascript"] .= $tjswo."\n\n"; } } //css semplice if($kk == "css") { if(stristr($v,"VIS")) { $DATI["css"] .= $tjswo."\n\n"; } } //css semplice dopo tutti gli include if($kk == "head") { //aggiungo tag se specificato CSS o JS (5000 perche vanno dopo tutto) if(stristr($v,"JS") or stristr($v,"JAVASCRIPT")) { $HEAD[$tjswo_c+5000] .= ""; } elseif(stristr($v,"CSS") or stristr($v,"STYLE")) { $HEAD[$tjswo_c+5000] .= ""; } elseif(stristr($v,"VIS")) { $HEAD[$tjswo_c+5000] .= googleFontsProxy($tjswo)."\n\n"; } } //body riscittura if($kk == "body") { //aggiungo tag se specificato CSS o JS if(stristr($v,"JS") or stristr($v,"JAVASCRIPT")) { $tjswo2 = ""; } elseif(stristr($v,"CSS") or stristr($v,"STYLE")) { $tjswo2 = ""; } else { $tjswo2 = $tjswo; } if(stristr($v,"PRE_CLOSE") or stristr($v,"VIS")) { $PRE_CLOSE[] = $tjswo2; } elseif(stristr($v,"POST_CLOSE")) { $DATI["body_post_close"] .= $tjswo2."\n"; } elseif(stristr($v,"PRE_OPEN")) { $DATI["body_pre_open"] .= $tjswo2."\n"; } elseif(stristr($v,"POST_OPEN")) { $DATI["body_post_open"] .= "\n".$tjswo2; } else { //?? } } } } if($miniftJsFiles) foreach($miniftJsFiles as $dove=>$files){ $miniftJsName = array(); foreach($files as $v) $miniftJsName[$v] = filemtime($v); //arsort($miniftJsName);//meglio di no, potrebbero esserci delle dipendenze in sequenza if(!is_dir($DATI['dir_indi'].$DATI['minifiedJsDir'])) mkdir($DATI['dir_indi'].$DATI['minifiedJsDir']); $miniftJsName = $DATI['dir_indi'].$DATI['minifiedJsDir']."/minJs".ucfirst(strtolower($dove)).md5(serialize($miniftJsName)).".js"; if(!is_file($miniftJsName) || $_GET['no_cache']){ // mailtnx("c@localhost", "Ricompilo javascript $dove ".$_SERVER["REQUEST_URI"], __FILE__.":".__LINE__."\n".print_r(array($files, $_REQUEST, $_SERVER), true)); d_info("Ricompilo javascript ($dove): ".$miniftJsName); $jsContent = ''; foreach($files as $v) $jsContent .= "\n".file_get_contents($v); $localCompiler = $DATI['libPath']."/closure-compiler/closure-compiler.jar"; if(is_file($localCompiler)){ $tmp = $miniftJsName.mt_rand(); file_put_contents($tmp, $jsContent); $cmd = "java -jar ".$localCompiler." --js $tmp --js_output_file $miniftJsName 2>&1"; exec($cmd, $output, $returnVal); if($returnVal) trigger_error("Errore compilatore JS ($cmd): ".print_r($output, true)); unlink($tmp); } else foreach(array('errors', 'compiled_code') as $task){ $context = stream_context_create(array( 'http' => array( 'method' => 'POST', 'header' => array('Content-type: application/x-www-form-urlencoded;charset=UTF-8'), 'content' => http_build_query(array( 'js_code' => $jsContent, 'compilation_level' => 'SIMPLE_OPTIMIZATIONS',//WHITESPACE_ONLY, SIMPLE_OPTIMIZATIONS, ADVANCED_OPTIMIZATIONS 'output_info' => $task,//compiled_code, warnings, errors, statistics 'output_format' => 'text'//text, json, xml )) ) )); $result = file_get_contents("https://closure-compiler.appspot.com/compile", false, $context); if($task == 'errors'){ if($result){ trigger_error("Errore compilatore JS: ".$result); break;//altrimenti quando chiamo compiled_code, trovo lo stesso testo dell'errore nel risultato } } else{ if(!$result) trigger_error("Risultato compilazione JS vuoto, controlla che i file da compilare siano tutti in UTF8: ".implode(", ", $files)); //serve perchè anche se nella prima chiamata 'errors' c'è un break, può darsi questa errore e altrimenti salverei l'errore nel file js else if(strpos($result, "Error(") === 0) trigger_error("Errore compilazione JS, non salvo il risultato: ".$result); else{ file_put_contents($miniftJsName, $result); } } } } if(is_file($miniftJsName)){/*ricontrollo se la compilazione è andata a buon fine*/ touch($miniftJsName); ${$dove}[] = indiGeneraJsTag($miniftJsName); } } //BASE if($CONF["MEDIA"] == "cdrom" or $CONF["MEDIA"] == "html" or $DATI["NO_BASE_TAG"]) { //non mette il base se il sito viene grabbato } else{ if($DATI["baseurl"] || $DATI["basetarget"]){ $HEAD[1] = ""; else $HEAD[1] = ""; } else { $HEAD[1] = ""; } } */ } //###### AGGIUGO BODY PRECLOSE (javascript e css) (cicolo di 1ms trascurabile) ######################################################## $PRE_CLOSE = implode("\n", $PRE_CLOSE); if($BODY) { ksort($BODY); while(list($k, $v)=@each($BODY)) { $body_tmp .= $v."\n"; } $PRE_CLOSE = $body_tmp.$PRE_CLOSE; } $DATI["body_pre_close"] .= $PRE_CLOSE; //body if($DATI["body_pre_close"] != "") $buffer = str_replace("",$DATI["body_pre_close"]."\n",$buffer); if($DATI["body_post_close"] != "") $buffer = str_replace("","\n".$DATI["body_post_close"],$buffer); if($DATI["body_pre_open"] != "") $buffer = indi_prima_dopo_tag("body",$buffer,$DATI["body_pre_open"],true); if($DATI["body_post_open"] != "") $buffer = indi_prima_dopo_tag("body",$buffer,$DATI["body_post_open"]); //javascript window.onload if($DATI["javascript.window.onload"] != "") $DATI["javascript"] .= "window.onload=function()\n{\n".$DATI["javascript.window.onload"]."\n}\n"; //javascript window.unload if($DATI["javascript.window.unload"] != "") $DATI["javascript"] .= "window.unload=function()\n{\n".$DATI["javascript.window.unload"]."\n}\n"; //######################################### LESS ######################################################################################### //controllo se se e' stato rivelato almeno un file LESS if($_GET['noMinifyCss']) $DATI['minifyCss'] = false; if($lessActive) { $noCache = false; if($_GET["lessSeparate"]){ // $noCache = true; // $DATI["lessNodeJs"] = true; // $DATI['minifyCss'] = false; $DATI['lessSeparate'] = true; } //directory $lessDir = $DATI['dir_indi'].($DATI['less_dir']?$DATI['less_dir']."/":""); if($DATI["less_dir"] && !is_dir($lessDir)) mkdir($lessDir); d_info("Inizio","LESS","INDI"); //l'id dipende da: //- il contenuto di less_dynamic_css_array_before / less_dynamic_css / less_dynamic_css_array / less_dynamic_css_after //- la data di modifica e il path di tutti i files css coinvolti //- ssl on / off //- (node on / off) $lessId = 'v1'; //inizio a creare il buffer con le parti dinamiche che mi servono anche per generare l'id $less_out = ''; $variabiliPerTuttiIFile = "@root = '".str_repeat("../", ($CONF["less_dir"] ? 1 : 0) + substr_count($CONF["dir_indi"].$CONF["less_dir"], "/"))."';". $DATI['less_dynamic_css_vars']; $less_out = $variabiliPerTuttiIFile; if($_GET['no_cache'] || $_GET['no_less_cache'] || $_GET['lessStat']) { $noCache = true; d_info("FORZO rigenerazione less","LESS","INDI"); } if($DATI["less_dynamic_css_array_before"]) { if($DATI['lessSeparate']){ $i = 0; if($_GET['lessSeparateDebug']){ echo '
';
						$debugBacktrace = debug_backtrace(); array_unshift($debugBacktrace, array('file'=>__FILE__, 'line'=>__LINE__, 'function'=>'debugTnx')); foreach($debugBacktrace as $debugLine) echo "".str_replace("/tnx/www/html/www/", "", $debugLine['file']).""." ".$debugLine['function']."()
"; echo '
$variabiliPerTuttiIFile
'; $printMe = $variabiliPerTuttiIFile; ob_start(); if(is_object($printMe)||is_array($printMe)) print_r($printMe); else var_dump($printMe); echo htmlentities(ob_get_clean(), ENT_COMPAT|ENT_HTML401|ENT_SUBSTITUTE, 'UTF-8'); } foreach($DATI["less_dynamic_css_array_before"] as $k=>$v) if($v){ // if($_SERVER['REMOTE_ADDR'] == '192.168.0.177' || $_GET['debugtnx']){ // print '
' . $k . '
'.$v.'
'; // } $i++; $fileName = indiSoloAlfanumerici($k)."_".md5("1".$variabiliPerTuttiIFile.$v).($DATI['minifyCss']?'.min':'').".css"; if($_GET['lessSeparateDebug']){ echo "
$k
$fileName
"; print_r_tnx($v, true); // print_r_tnx($variabiliPerTuttiIFile.$v, true); } $file = $lessDir.$fileName; $path = $DATI["path_base"].$file; if(!is_file($path) || $noCache){ less_generate_output($variabiliPerTuttiIFile.$v, $path); } else { less_generate_output_exist($path); } $HEAD[2999-count($DATI["less_dynamic_css_array_before"])+$i] = indiCreateCssTag($DATI["baseurl"].$file); } if($_GET['lessSeparateDebug']){ echo '
'; die; } } else $less_out .= implode("\n", $DATI["less_dynamic_css_array_before"]); } if($DATI["less_dynamic_css"]) $less_out .= $DATI["less_dynamic_css"]; if($DATI["less_dynamic_css_array"]) { // perché questi non sono separati come l'array before? // qp($DATI["less_dynamic_css_array"]); $less_out .= implode("\n", $DATI["less_dynamic_css_array"]); } $lessId .= indiNoWhitespaces($less_out.$DATI["less_dynamic_css_after"]); //altre variabili da includere nella generazione dell'id $lessId .= (indi_isSsl() ? 1 : 0);//cecca 13/03/17 - aggiungo ssl per far ricompilare, ad esempio param cdn_baseurl in icone pagamenti $lessId .= ($DATI["lessNodeJs"] ? 1 : 0); //files da controllare nella generazione dell'id (nome e data modifica) $lessId_files = $lessFiles; // rimosso 20/5/2022 // if(is_file("indi.inc.php")) $lessId_files[] = "indi.inc.php"; // else $lessId_files[] = "indi.php"; //if(file_exists("_conf/indi_ver_6.inc.php")) $lessId_files[] = "_conf/indi_ver_6.inc.php";//depracato (non c'è più nei nuovi siti, eventualmente aggiungere qui le variabili da controllare) if(is_array($DATI["less_files_check_aggiuntivi"])){ trigger_error_to_carlo("Questa opzione non sembra usata da nessun sito"); $lessId_files = array_merge($lessId_files, $DATI["less_files_check_aggiuntivi"]); } foreach($lessId_files as $f) $lessId .= $f.filemtime($f); //genero nome file $DATI["less_filename"] = $lessDir."less_".md5($lessId).($DATI['minifyCss']?'.min':'').".css";//nome del file relativo a base d_info($DATI["less_filename"],"LESS:less_filename","INDI"); $linkFileLess = true; if($_GET['lessSource'] || $_GET['lessDebug']){ echo '
';
				// $debugBacktrace = debug_backtrace(); array_unshift($debugBacktrace, array('file'=>__FILE__, 'line'=>__LINE__, 'function'=>'debugTnx')); foreach($debugBacktrace as $debugLine) echo "".str_replace("/tnx/www/html/www/", "", $debugLine['file']).""." ".$debugLine['function']."()
"; $printMe = $less_out; ob_start(); if(is_object($printMe)||is_array($printMe)) print_r($printMe); else var_dump($printMe); echo htmlentities(ob_get_clean(), ENT_COMPAT|ENT_HTML401|ENT_SUBSTITUTE, 'UTF-8'); echo '
'; die; } $fullPath = $DATI["path_base"].$DATI["less_filename"]; if($noCache || !is_file($fullPath)) { //ciclo e raccolgo le variabili if($lessFiles){ reset($lessFiles); while(list($k, $v)=each($lessFiles)) { if(is_file($v)) $less_out .= file_get_contents($v); } } if($DATI["less_dynamic_css_after"]) { $less_out .= $DATI["less_dynamic_css_after"]; } if($less_out) { if($_GET['lessStat']){ $less_files_array = ''; foreach($lessFiles as $k=>$v) if(is_file($v)) $less_files_array[$v] = file_get_contents($v); $stat = [ "less_out" => $less_out, "less_dynamic_css_array_before" => $DATI["less_dynamic_css_array_before"], "less_dynamic_css" => $DATI["less_dynamic_css"], "less_dynamic_css_array" => $DATI["less_dynamic_css_array"], "less_files" => $less_files_array, "less_dynamic_css_after" => $DATI["less_dynamic_css_after"], ]; $all = 0; echo "
";
						foreach($stat as $k=>$v){
							if(!is_array($v)) $stampa = [$k=>$v];
							else{
								$stampa = [$k=>implode("", $v)];
								foreach($v as $kk=>$vv) $stampa[" └ ".$kk] = $vv;
							}
							
							foreach($stampa as $kk=>$vv){
								$size = strlen(indiNoWhitespaces($vv));
								if(!$all) $all = $size;
								$perc = round($size / $all  * 1000)/10;
								echo "$kk ".round($size/100)."k ".$perc."%
"; } } die; } if (false && is_locale() && $DATI["lessNodeJs"]) { /* RISULTATI TEST MARZO 2022: funziona, ci sono alcuni problemi da fixare, ma non ci sono differenze di prestazioni rispetto alla libreria php */ $path = $DATI['dir_indi'].($DATI['less_dir']?$DATI['less_dir']."/":"")."/"; //le prime due variabili venivano aggiunte a mano prima della compilazione //le altre sono variabili del bucho che in alcuni casi vengono richiamate senza essere definite $less_out = " @baseurl:'".indi_baseurl()."'; @cdn_baseurl:'".indi_cdn_baseurl()."'; @ELEMENTO_USERADMIN_ID:'test'; @ELEMENTO_USERADMIN_CLASSE_PANNELLI_HEADER :'test'; @ELEMENTO_USERADMIN_CLASSE_PANNELLI_HEADER_TXT :'test'; @ELEMENTO_USERADMIN_CLASSE_PANNELLI:'test'; @CELLE_SELETTORE_ELEMENTO:'test'; @CELLE_SELETTORE_ENTRY:'test'; @ELEMENTO_USERADMIN_CLASSE_GRID_ITEM:'test'; ".$less_out; //questa chiamata da' errore (forse pure tutte le altre) $less_out = str_replace("@{root}", "@root", $less_out); //i calcoli devono essere tra parentesi floor(1/2*3) => floor((1/2*3)) $less_out = preg_replace("/floor\(([^\)]+)\)/is", "floor(($1))", $less_out); $less_out = preg_replace("/ceil\(([^\)]+)\)/is", "ceil(($1))", $less_out); //l'assegnazione di variabili avviene con i due punti @a = 1; => @a: 1; $less_out = preg_replace("/^\s*(@[^=\n]+?)=([^;\n]+?);\s*$/ims", "$1:$2;", $less_out); file_put_contents($path."primario.less", $less_out); if (file_exists($fullPath)) unlink($fullPath); if (file_exists($lessDir."lessc_out1")) unlink($lessDir."lessc_out1"); if (file_exists($lessDir."lessc_out2")) unlink($lessDir."lessc_out2"); // putenv('NODEJS_HOME=/usr/lib/nodejs/node-v8.9.4'); // putenv('PATH=' . getenv('PATH') . ':/usr/lib/nodejs/node-v8.9.4:/usr/lib/nodejs/node-v8.9.4/bin'); //tolto --source-map --source-map-rootpath=../ --source-map-map-inline $cmd = "/var/www/.nvm/versions/node/v10.24.1/lib/node_modules/less/bin/lessc " . $DATI['dir_indi'].($DATI['less_dir']?$DATI['less_dir']."/":"")."/primario.less" . " --silent --include-path=_files/ " . $fullPath . " > ".$lessDir."lessc_out1 2> ".$lessDir."lessc_out2"; $out = exec($cmd, $out, $retvar); if ($retvar !== 0) { echo "
";
							echo $cmd . "\n\n";
							$errout = file_get_contents($lessDir."lessc_out1");
							$errout .= file_get_contents($lessDir."lessc_out2");
							$errout = preg_replace('#\\x1b[[][^A-Za-z]*[A-Za-z]#', '', $errout);
							echo $errout;
							echo "
"; } } else { if(!less_generate_output($less_out, $fullPath)){ //se ho settato solo le costanti, ad esempio, non c'è output e quindi nemmeno il file $linkFileLess = false; } } } } else { less_generate_output_exist($fullPath); d_info("File trovato!","LESS","INDI"); } if($linkFileLess){ //includo il file, la versione dipende dalla data di modifica del file // if($DATI["loadCssViaJavascript"]){ // $cssToLoadViaJs[] = ($GLOBALS["DATI"]["cdn_static_active"] == "SI" ? cdn_baseurl_static() : $DATI["baseurl"]).$DATI["less_filename"]."?ver=".filemtime($fullPath); // } else { if($GLOBALS["DATI"]["cdn_static_active"] == "SI") { $HEAD[3000] = indiCreateCssTag(cdn_baseurl_static().$DATI["less_filename"]); } else { $HEAD[3000] = indiCreateCssTag($DATI["baseurl"].$DATI["less_filename"]); } // } } //pulisco unset($lessFiles); d_info("Fine","LESS","INDI"); } else { //rimuovo il file less generato ? } if($cssToLoadViaJs){ $cssLoaderViaJs .= " "; $buffer = str_replace("",$cssLoaderViaJs."\n",$buffer); } //JAVA E CSS NON INCLUSI IN FILE METTO IN FONDO (vecchio modo) if($DATI["css"] != "") $HEAD[4000] .= "\n"; //cecca 20/02/2018 - portato a 15000 perchè ho impostato i javascript a 10000, vedi sopra (+ 10000) //if($DATI["javascript"] != "") $HEAD[5000] .= "\n"; if($DATI["javascript"] != "") $HEAD[15000] .= "\n"; //GOOGLE ANALYTICS if($DATI["goole_analitycs"]){//epic fail $DATI["google_analytics"] = $DATI["goole_analitycs"]; } if($DATI["google_analitycs"]){//epic fail x 2 $DATI["google_analytics"] = $DATI["google_analitycs"]; } if($DATI["matomoId"]) $HEAD[6500] = $DATI['matomo_script']; if($DATI["google_analytics"] && (indi_is_google_analytics4()||indi_is_google_ads())){ // if(indi_is_google_analytics4()) $v = "4"; // else if($CONF['google_analytics_version'] == 1) $v = ""; // else $v = $CONF['google_analytics_version']; // $HEAD[6000] .= $DATI['google_analytics_script' . $v]; $HEAD[6000] .= $DATI['google_analytics_script4'];//da luglio 2023 solo v4 // if($CONF['mod_pc_gdpr_Aversion'] == "gdpr-2022"){ // if($CONF['mod_pc_services']['google-analytics-anonymized'] && !$CONF['mod_pc_services']['google-analytics-anonymized']['required']){ // if(mod_pc_is_active("google-analytics-anonymized")){ // if(!$_SESSION['google_analytics_setReferrerOverride_done'] && $_SESSION["STAT"]['ref']){//uso la variabile di sessione google_analytics_setReferrerOverride per passare il referrer DOPO l'accettazione del popup // if($CONF['google_analytics_version'] == 1){ // $DATI["google_analytics_custom_script"] .= "_gaq.push(['_setReferrerOverride', ".string4js($_SESSION["STAT"]['ref'])."]);"; // } // else if($CONF['google_analytics_version'] == 2){ // $DATI["google_analytics_script4"] .= "ga('set', 'referrer', ".string4js($_SESSION["STAT"]['ref']).");"; // } // else if($CONF['google_analytics_version'] == 4){ // $DATI["google_analytics_custom_script"] .= "gtag('config', '{google_analytics}', {'page_referrer': ".string4js($_SESSION["STAT"]['ref'])."});"; // } // } // $_SESSION['google_analytics_setReferrerOverride_done'] = true; // } // } // } //carlo 2020/11: google_analytics_js_event non so come (se) è usato //da luglio 2023 solo v4 // if($CONF['google_analytics_version'] == 2){ // $CONF['google_analytics_js_event'] = "ga('send', 'event', elEv.category.toLowerCase(), elEv.action.toLowerCase(), elEv.label.toLowerCase(), elEv.value, elEv.non_i);"; // } // else $CONF['google_analytics_js_event'] = "_gaq.push(['_trackEvent', elEv.category.toLowerCase(), elEv.action.toLowerCase(), elEv.label.toLowerCase(), elEv.value, elEv.non_i]);"; } if($DATI["googletagmanager_id"]){ $HEAD[] = $DATI['googletagmanager_head_script']; } if($DATI["facebookPixelId"]){ $DATI["pixelEventPageViewId"] = "PageView." . $DATI["pagina"] . "." . mktime(); $HEAD[] = $DATI['pixel_head_script']; if($DATI["facebookApiConversionToken"]){ // Invio la chiamata server2server per attivare il token facebook facebookApiConversionEvent("PageView", null, $DATI["pixelEventPageViewId"]); } } /* if($DATI["png_fix"] != "NO"){ $HEAD[6000] .= ""; $DATI['file:_files/pngfix.js'] = 'COPY'; $DATI['file:_pics/null.gif'] = 'COPY'; } */ //###### MOD_MODULI ######################################################## //posizionati nell' head da 1000 a 2000 //non attivo if ($CONF['mod_moduli'] == "SI") { //si occupa di creare i file di cache dei js e css mod_moduli_render_head(); } //###### AGGIUGO HEAD (cicolo di 1ms trascurabile) ######################################################## ksort($HEAD); while(list($k, $v)=@each($HEAD)) { $head_tmp .= $v."\n"; } $buffer = str_replace("#HEAD#", $head_tmp, $buffer); } //fine OUTPUT_HEAD_BODY_JS_CSS if($CONF["indi_subversion"] < 4) { //###### SISTEMO LINK SBAGLIATI ######################################################## $buffer = str_replace($DATI["path_rel"].$DATI["dir_indi"], $DATI["dir_indi"], $buffer); $buffer = str_replace($DATI["path_rel"].$DATI["dir_pagine"], $DATI["dir_pagine"], $buffer); $buffer = str_replace($DATI["path_rel"].$DATI["dir_file"], $DATI["dir_file"], $buffer); $buffer = str_replace($DATI["path_rel"].$DATI["dir_pic"], $DATI["dir_pic"], $buffer); } if($DATI['OUTPUT_TPL'] == "SI") { //###### INDI VERSIONING ######################################################## if($CONF['VERSIONING'] != "NO") { d_info("Inizio","VERSIONING","INDI"); if($CONF['VERSIONING'] == "AUTO") { while(list($k, $v)=each($GLOBALS['indi_versioning_array'])) { //calcolo tempo, non considero la data di modifica della pagina //?.04.2013 carlo: aggiunto if vedi http://www.demo.tnx.it/tordo/todos/edit/5014 //04.07.2013 AGGIUNTO DI NUOVO (era commentato): se non è un file filemtime da' errore! if(is_file($DATI['path_base'].$k)) { //controllo solo i javascript if($v == "css" or $v == "js") $indi_versioning_time += filemtime($DATI['path_base'].$k); } //else $indi_versioning_time_pagina = filemtime($k); } //$DATI['indi_versioning_pagina'] = $indi_versioning_time_pagina; $DATI['indi_versioning'] = $indi_versioning_time + abs(crc32(md5(json_encode($GLOBALS['indi_versioning_array'])))); } else { $DATI['indi_versioning'] = $CONF['VERSIONING']; } d_info($DATI['indi_versioning'],"DATI[indi_versioning]","INDI"); d_info("fine","VERSIONING","INDI"); } //###### FIX MAPPA ########### //sistemo problemi mappe if($DATI["indi_subversion"] < 5) { if(strpos($buffer,"GPoint") and $DATI['sito'] != "mtp" and $DATI['sito'] != "sangi" and $DATI['sito'] != "stelle") { $buffer = str_ireplace("var marker = new GMarker(point);","",$buffer); $buffer2 = $buffer; $buffer = str_ireplace("var point = new GPoint({map_google_lon}, {map_google_lat});","var marker = new GMarker(new GLatLng({map_google_lat},{map_google_lon}));",$buffer); if($buffer == $buffer2) { // d_err("ALERT ERR Sistemo mappa Google v2 -> $DATI[url_richiesto_http]\n\n".$buffer); indi_debug("ALERT ERR Sistemo mappa Google v2 -> $DATI[url_richiesto_http]\n\n".$buffer,"s.fanelli@tnx.it"); indi_log("ALERT ERR Sistemo mappa Google v2 -> $DATI[url_richiesto_http]"); } else { //indi_debug("Sistemo mappa Google v2 -> $DATI[url_richiesto_http]\n\n".$buffer,"damiano@tnx.it"); indi_log("Sistemo mappa Google v2 -> $DATI[url_richiesto_http]"); }; $buffer = str_ireplace("#map_google_box_txt {","#map_google_box_txt {\nheight:60px;\n",$buffer); $buffer = str_ireplace("{map_google_box_txt|ej}","{map_google_box_txt|ds}",$buffer); $buffer = str_ireplace("map.addControl","void",$buffer); } } //###### INDI TEMPLATE ######################################################## //SOSTITUISCO VARIABILI DI TEMPLATE ARRAY DATI ??? //$buffer = indi_out_replace($buffer,$DATI); d_info("Inizio","SOSTITUZIONE","INDI"); $chromeFix = '';//lo avvaloro prima di indi_tpl (per controllare la presenza di {ua}) e lo inietto dopo deferAllScript (usato su shoppix, annulla il fix) /* 30/1/23: tolto carlo/cecca, si spera che dopo tanti anni non serva più e genera doppia versione di ogni pagina if(in_array($DATI['ua_name'], array('fi', 'ch')) && strpos($buffer, "{ua}") !== false){ //uso la classe {ua} che corrisponde a ch+versione e non sarà sicuramente usata per nessuna regola css //la rimuovo sia da body che da html perchè in alcuni vecchi template (pronto pizza) la classe {ua} era data anche al body quindi preload-blink-bug veniva inserita anche lì $buffer = str_replace("{ua}", "{ua} preload-blink-bug", $buffer); $chromeFix = ' '; } */ if ($DATI["cache_brutale"]) { $htmlcachekey = $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] . "|" . json_encode($_POST) . "|DATI"; $htmlcachekeyfile = mb_ereg_replace("([^\w\s\d\-_~,;\[\]\(\).])", '', $htmlcachekey); $htmlcachekeyfile = mb_ereg_replace("([\.]{2,})", '', $htmlcachekeyfile); $htmlcachekey = md5($htmlcachekey); $cacheddati = indi_apc_fetch($htmlcachekey); //$cacheddatifile = "indi/cache/htmlcache_" . $htmlcachekeyfile . ".txt"; //$cacheddati = file_exists($cacheddatifile) ? file_get_contents($cacheddatifile) : ""; d("cache_brutale","indi_log","LOG"); if ($cacheddati && 1 == 1) { d("cache_brutale merge dati da cache","indi_log","LOG"); $tmpDATI = json_decode($cacheddati,true); $DATI = array_merge($DATI, $tmpDATI); } else { d("cache_brutale dati NON da cache (metto in cache)","indi_log","LOG"); indi_apc_store($htmlcachekey, json_encode($DATI), 3600); //file_put_contents($cacheddatifile, json_encode($DATI)); } } $buffer = indi_tpl($buffer,$TXT[$DATI[lang]],0,"#"); $buffer = indi_tpl($buffer,$DATI,0);//sostituisce i paramentri {id} $buffer = indi_tpl($buffer,$TXT[$DATI[lang]],0,"#"); $buffer = indi_tpl($buffer,$DATI,0); $buffer = indi_tpl($buffer,$TXT[$DATI[lang]],0,"#"); $buffer = indi_tpl($buffer,$DATI,0); $buffer = indi_tpl($buffer,$TXT[$DATI[lang]],0,"#"); $buffer = indi_tpl($buffer,$DATI,0); //pulisco testi $buffer = indi_tpl($buffer,$TXT[$DATI[lang]],1,"#"); //pulisco parentesi $buffer = indi_tpl($buffer,$DATI,1); //pulisco testi $buffer = indi_tpl($buffer,$TXT[$DATI[lang]],1,"#"); //pulisco parentesi $buffer = indi_tpl($buffer,$DATI,1); if($DATI['deferAllScript']){ $typeRe = "(\s*type=['\"](text\/)?javascript['\"]\s*)?"; $GLOBALS['deferredInlineScripts'] = array(); $buffer = preg_replace_callback("/(.*?)<\/script>/ims", "grabAndReplaceInlineScript_callback", $buffer); $content = implode("\n\n//-----------------\n\n", $GLOBALS['deferredInlineScripts']); if(!is_dir($DATI['dir_indi'].$DATI['deferredInlineScriptDir'])) mkdir($DATI['dir_indi'].$DATI['deferredInlineScriptDir']); $file = $DATI['dir_indi'].$DATI['deferredInlineScriptDir']."/inlineDeferred".md5($content).".js"; if(!is_file($file)) file_put_contents($file, $content); $buffer = str_replace("", indiGeneraJsTag($file)."\n", $buffer); $buffer = preg_replace_callback("/\s*<\/script>/ims", "deferScript_callback", $buffer); } if($chromeFix) $buffer = str_ireplace("", $chromeFix."", $buffer); //antispam per tutti i form, aggiungo un campo nascosto che non deve essere riempito //Il campo e' nascosto dalla visualizzazione tramite css, il nome e' indi_c_a ($_REQUEST[ifa]); if($DATI["FORM_ANTISPAM"] == "SI") { //uso gli apici singoli per evitare problemi in ajax /*
*/ if($DATI["indi_subversion"] < 5) { $fa_input = " "; } else { $fa_input = " "; } $campo_antispam_a_fine_form = time() > strtotime("2015-05-25 09:00:00"); //$campo_antispam_a_fine_form = is_tnx(); $split_string = "",$fa_var[$i]); //controllo solo i POST if(stristr($fa_var2[0],"post")) { if(!$campo_antispam_a_fine_form){ //vecchia versione che appendeva il campo all'inizio (problema autocomplete firefox) //tutte le volte modificava tutto il buffer, adesso modifico i vari pezzi e poi implodo $buffer = str_ireplace("","".$fa_input,$buffer); } else $fa_var[$i] = str_ireplace("", $fa_input."", $fa_var[$i]); } } if($campo_antispam_a_fine_form) $buffer = implode($split_string, $fa_var); } d_info("Fine","SOSTITUZIONE","INDI"); } //FACCIO UN LOG SPECIALE SE FACCIO IL GRAB if($_SERVER['HTTP_USER_AGENT'] == "INDI_GRAB_LINKGRABBER"){ $b = $DATI["indi_tpl_txt"]; $b = indi_tpl($b,$TXT[$DATI['lang']],0,"#"); $b = indi_tpl($b,$DATI,0); $b = indi_tpl($b,$TXT[$DATI['lang']],0,"#"); $b = indi_tpl($b,$DATI,0); $b = indi_tpl($b,$TXT[$DATI['lang']],0,"#"); $b = indi_tpl($b,$DATI,0); //pulisco testi $b = indi_tpl($b,$TXT[$DATI['lang']],1,"#"); //pulisco parentesi $b = indi_tpl($b,$DATI,1); indi_tpl_file($b); } //Sostituisco i testi //$buffer = indi_out_txt($buffer,$TXT,$DATI["lang"]); return $buffer; } function googleFontsProxy($linkTag){ global $DATI; $urlStart = "https://fonts.googleapis.com/css"; if(strpos($linkTag, $urlStart) === false) return $linkTag; else{ preg_match("/".preg_quote($urlStart, "/")."[^\\\"']*/", $linkTag, $match); $cssUrl = $match[0]; $dir = $DATI['dir_indi']."fonts/"; $localFile = $dir.md5($cssUrl.$DATI['baseurl'])."w.css"; if(!is_file($localFile)){ // die; $context = stream_context_create(array( 'http' => array( 'user_agent' => 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:55.0) Gecko/20100101 Firefox/55.0' ) )); $css = file_get_contents($cssUrl, false, $context); if(!is_dir($dir)) mkdir($dir); $urlStart2 = "https://fonts.gstatic.com/"; preg_match_all("/".preg_quote($urlStart2, "/")."[^\\\)\\\"']*/", $css, $match); $files = array_unique($match[0]); foreach($files as $f){ $dest = $dir.md5($f).substr($f, strrpos($f, ".")); if(!is_file($dest)) file_put_contents($dest, file_get_contents($f)); $css = str_replace($f, $DATI['baseurl'].$dest, $css); } file_put_contents($localFile, $css); } return str_replace($cssUrl, $localFile, $linkTag); } } function deferScript_callback($match){ return str_replace(" src=", " defer src=", $match[0]); } function grabAndReplaceInlineScript_callback($match){ if(strpos($match[3], "nodefer")){ return $match[3]; } else{ $GLOBALS['deferredInlineScripts'][] = $match[3]; return ""; } } //utili function indi_true($xxx) { if($xxx === TRUE) return TRUE; else return FALSE; } function indi_false($xxx) { if($xxx === FALSE) return TRUE; else return FALSE; } function indi_uguale($uguale1,$uguale2) { if($uguale1 == uguale2) return TRUE; else return FALSE; } if(!function_exists('str_ireplace')){ function str_ireplace($search,$replace,$subject){ $token = chr(1); $haystack = strtolower($subject); $needle = strtolower($search); while (($pos=strpos($haystack,$needle))!==FALSE){ $subject = substr_replace($subject,$token,$pos,strlen($search)); $haystack = substr_replace($haystack,$token,$pos,strlen($search)); } $subject = str_replace($token,$replace,$subject); return $subject; } } // serve per mettere salvare in sessione variabili passate via get o post function indi_ssv($var,$start=NULL) { if($start !== NULL and !isset($_SESSION[$var])) $_SESSION[$var] = $start; if(isset($_REQUEST[$var])) { if($_SESSION[$var] != $_REQUEST[$var]) { //setta la variabile $_SESSION[$var] = $_REQUEST[$var]; } } return $_SESSION[$var]; } //viene eseguito una sola volta cancellando il file indi/setup.log, di solito usato prima di andare online function indi_setup() { //creo le directori se non ci sono global $CONF; //ste sta' facendo il setup si ferma if($_GET['dbg']) apc_store($CONF["sito"]."_controllo_setup", 0, 3600); if(apc_fetch($CONF["sito"]."_controllo_setup") == 1) indiManutenzione("indi_setup in corso"); if(!is_dir($CONF['dir_indi'])) @mkdir($CONF['dir_indi']); $errore = ""; if(!is_dir($CONF['dir_indi'])){ $errore = "Manca cartella \"".$CONF['dir_indi']."\""; } else if(!is_writable($CONF['dir_indi'])){ $errore = "La cartella [" . $CONF['dir_indi'] . "] non è scrivibile"; } if($errore){ trigger_error($errore); indiManutenzione($errore); } //FIX FORZATO CARTELLE IMMAGINI if($_GET['indi_fix_dir'] == 1) { indi_log_setup("indi_fix_dir"); for ($i = 0; $i <= 9; $i++) { mkdir($CONF['dir_indi']."_pics/$i"); for ($ii = 0; $ii <= 9; $ii++) { mkdir($CONF['dir_indi']."_pics/$i/$ii"); } } } // $controllaTutteLeCartelle = time() < mktime(9 /*hours*/, 0 /*minutes*/, 0 /*seconds*/, 3 /*month*/, 13 /*day*/, 2021); $controllaTutteLeCartelle = $_GET['debugtnx']; $setupIniziale = !file_exists($CONF["dir_indi"].$CONF["file_log_setup"]); //?? dir di cache ??? //se non c'e' la cartella di indi con il file setup inizializzo if($setupIniziale){ indi_log_setup("Inizio SETUP $CONF[sito]"); indi_log_setup("Cancello cartella indi"); //08/01/2018 cecca - la cartella sessions non va eliminata (soprattutto se fosse un link, vedi haproxy) //system("rm -rf indi/*"); // system("rm -rf ".$CONF['dir_indi']."!(sessions)"); //metto lock apc_store($CONF["sito"]."_controllo_setup","1",3600); $d = dir($CONF['dir_indi']); while(false !== ($entry = $d->read())){ if(!in_array($entry, array(".", "..", "sessions"))){ system("rm -rf ".escapeshellarg("indi/".$entry)); } } $d->close(); clearstatcache(); } if($controllaTutteLeCartelle || $setupIniziale){ if(mkdirIfNotExists($CONF["dir_indi"])) indi_log_setup("mkdir indi"); if(mkdirIfNotExists($CONF["dir_indi"].$CONF["dir_pic"])) indi_log_setup("mkdir ".$CONF["dir_indi"]."_pics"); if(mkdirIfNotExists($CONF["dir_indi"].$CONF["dir_file"])) indi_log_setup("mkdir ".$CONF["dir_indi"]."_files"); for ($i = 0; $i <= 9; $i++) { mkdirIfNotExists($CONF["dir_indi"]."_pics/$i"); for ($ii = 0; $ii <= 9; $ii++) { mkdirIfNotExists($CONF["dir_indi"]."_pics/$i/$ii"); } } indi_log_setup("fine controllo tutte le cartelle ".$CONF["dir_indi"]."_pics/"); } //tolgo lock //admin tnx CARLO: mi sembre inutile, le cache si ricreano al login, le thumbs si ripuliscono automaticamente // if(is_dir($CONF["dir_admin_tnx"]) and $CONF["dir_admin_tnx"] != "") { // indi_log_setup("Cancello cartelle tmp admin_tnx"); // system("rm -rf $CONF[dir_admin_tnx]/tmp/persistent/*"); // system("rm -rf $CONF[dir_admin_tnx]/tmp/cache/*"); // system("rm -rf $CONF[dir_admin_tnx]/webroot/thumbs/cache/*"); // } if($setupIniziale) apc_store($CONF["sito"]."_controllo_setup", "0", 3600); } function mkdirIfNotExists($dir){ if(!file_exists($dir)) return mkdir($dir); } //crea il database se non esiste (da fare) function ind_setup_db() { //controllo il database per l' indicizzazione global $DB,$CONF; if(db_q("SELECT * FROM $CONF[db_tab_log]")) { d_info("OK DB: $DB[database]","ind_setup_db","DATABASE"); return TRUE; } else { d_err("Errore controllo DB $DB[database]","ind_setup_db","DATABASE"); if(db_q("CREATE TABLE `indi_log` ( `id` int(11) NOT NULL auto_increment, `nome` varchar(255) default NULL, `log` text, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1")) { d_info("CREATO TAB: $CONF[db_tab_log]","ind_setup_db","DATABASE"); return TRUE; } else { d_err("Errore creazione TAB o TAB gia esistente: $CONF[db_tab_log]","ind_setup_db","DATABASE"); return FALSE; } } } function ind_rimuove_duplicati($txt) { /* $txt2 = explode(" ",$txt); while(list($k, $v)=@each($txt2)) { $txt = str_replace(" $v $v "," $v ",$txt); } $txt = preg_replace("/(\w+ \w+) \\1/", '$1',$txt); #reduce doubles to singles $txt2 = explode(" ",$txt); while(list($k, $v)=@each($txt2)) { $txt = str_replace(" $v $v "," $v ",$txt); } */ return $txt; } //crea o torna l' indi /* //mi cerca una parola con preferenza e relativo peso di preferenza function ind_cerca_parola2($lang,$parola,$peso) { global $INDI,$DATI; reset($INDI); while(list($k, $v)=each($INDI)) { if($v[lang] == "$lang" and $v[link]=="") { //print $peso; //controllo la parola if(@stristr($v[key],$parola)) { if($v[peso] == "$peso") { //assegno il link. return($k); } } //se non trovo nel peso minore lo aumrnto if($v[peso] > $peso) { $peso++; // print "
- INCPESO -> '$peso'"; } } } //se non trova niente torna 0 return -1; } */ //funzione di ricerca in una stringa separata da | //tipo e' i per non sensibile alle maiuscole e s per sensibile //es indi_cerca("ciao.jpg","jpg|gif|png|) function indi_cerca($stringa,$testo,$tipo=i) { $ARR = explode("|",$stringa); if(sizeof($ARR) == 0) { if(trim(strtolower($stringa)) == trim(strtolower($testo))) return TRUE; } @reset($ARR); while(list($k, $v)=@each($ARR)) { if(trim(strtolower($v)) == trim(strtolower($testo))) return TRUE; } return FALSE; } //cerca un pattner multiplo separato da | indi_cerca_parte("stringa_in_cui_cercare","aaa|bbbb|cccc") function indi_cerca_parte($stringa,$cerca,$tipo=i) { $ARR = explode("|",$cerca); while(list($k, $v)=@each($ARR)) { if($tipo == "i") if(stristr($stringa,$v)) return TRUE; else if(strstr($stringa,$v)) return TRUE; } return NULL; } //cerca un nome di file in una cartella e lo ritorna appena lo trova function indi_file_in_dir($dir=null,$cerca=".jpg|.png|.gif|.jpeg",$return_array=0) { if(is_dir($dir)) { $handle_principale = opendir($dir); while($file = readdir($handle_principale)) { if($file != "." && $file != ".." && indi_cerca_parte($file,$cerca)== TRUE) { if($return_array == 1) $ret[] = $dir.$file; else return $dir.$file; } } if($ret) return $ret; return NULL; } return FALSE; } //DEPRECATA funzione per la costruzione di array da stringhe generica di indi function indi_set($OGGETTO) { //controllo se e' un array if (is_array($OGGETTO)) { return $OGGETTO; } else { //tolgo i new line e i tab $OGGETTO = str_replace("\t","",$OGGETTO); $OGGETTO = str_replace("\n","",$OGGETTO); $OGGETTO = str_replace("\r","",$OGGETTO); $OGGETTO2 = explode("|",$OGGETTO); if(sizeof($OGGETTO2) > 0) { while(list($k, $v)=@each($OGGETTO2)) { $OUT = explode("=>",$v); if(sizeof($OUT) > 1) { //Se torna qualcosa, allora torno l' array con chiave valore $chiave = trim($OUT[0]); $valore = $OUT[1]; $OUT2[$chiave] = "$valore"; } else { //siamo nel caso in cui non c'e' la chiave, la aggiungo $OUT2[] = $v; } } return $OUT2; } else { //E' una stringa controllo preseza parentesi //$OUT = ind_parentesi2($OGGETTO,"[","]"); //if($OUT != FALSE) { $OUT = explode("=>",$v); if(sizeof($OUT) >= 1) { //Se torna qualcosa, allora torno l' array con chiave valore $chiave = trim($OUT[0]); $valore = $OUT[1]; $OUT2[$chiave] = "$valore"; return $OUT2; } else { //siamo nel caso in cui non c'e' la chiave, la aggiungo $OUT[0] = $OGGETTO2[0]; return $OUT; } } } } //serve essere inserito all' interno di stringhe e cambiare velocemente visualizzazione function indi_media($media) { global $DATI; return indi_cerca($media,$DATI[MEDIA]); } function indi_media_no($media) { global $DATI; if(indi_cerca($media,$DATI[MEDIA])) return FALSE; else return TRUE; } //################################################################## //########################## FUNZIONI //############################ //################################################################## //funzione per template di configurazione function tconf($template) { GLOBAL $DATI,$TCONF; if (!$template) return 0; $DATI = array_merge($DATI, $TCONF[$template]); } //LOGGA INIT / SETUP e VARIE function indi_log_setup($testo=NULL) { global $CONF; $FILE = $CONF["dir_indi"].$CONF["file_log_setup"]; $LOG = date("Y/m/d g:i:s")." [".indi_time()."] ->".$testo."\n"; //$LOG .= print_r($_REQUEST, true); //@mailtnx("carlo@tnx.it", "logindi", $LOG); $fp = fopen($FILE, "a+"); fwrite($fp, $LOG, strlen($LOG)); fclose($fp); //clearstatcache(); indi_log($testo); //loggo sempre globale } //LOGGA IN UN FILE function indi_log($oggetto,$messaggio=NULL,$FILE=NULL) { //controlloo per opzione file indi_log_globale($oggetto,$messaggio,$FILE); } //LOGGA IN UN FILE function indi_log_file($TITOLO,$OGGETTO=NULL,$FILE=NULL) { indi_log_globale($TITOLO,$OGGETTO,$FILE); } function indi_log_clear($FILE=NULL) { global $DATI; if(!$DATI) $DATI = $GLOBALS["CONF"]; if($DATI[LOG] == "SI") { if($FILE == NULL) $FILE = $DATI["dir_indi"].$DATI["file_log"]; if(!file_exists($FILE)) return; if(!@unlink($FILE)){ d_err("indi_log_clear() ALERT: IMPOSSIBILE CANCELLARE IL FILE DI LOG $FILE"); } } } //LOGGA IN UN FILE function indi_log_globale($TITOLO,$TESTO=NULL,$FILE=NULL,$contesto=NULL) { global $CONF; if($CONF['LOG'] != "NO") { //i log li metto comunque nel debug come debug d($TITOLO,"indi_log","LOG"); //???? da fare con array $FILE = $CONF['logPath'].$CONF['file_log']; if($TESTO) $TESTO = "--------------------------------------------------------------\n".$TESTO."\n--------------------------------------------------------------\n"; $LOG = date("Y/m/d H:i:s")." [".indi_time()."] <" . $_SERVER["REMOTE_ADDR"] . "> -> ".$CONF["sito"]." [".$CONF["pagina"].":".$CONF["lang"]."] -> ".$TITOLO." -> 'http".($_SERVER['HTTPS']=='on'?'s':'')."://$_SERVER[SERVER_NAME]$_SERVER[REQUEST_URI]' $_SERVER[SERVER_PORT]\n".$TESTO; $fp = @fopen($FILE, "a+"); //se non c'e' il file lo crea if($fp) { fwrite($fp, $LOG, strlen($LOG)); fclose($fp); return true; } return false; } } //INDI TPL IN FILE function indi_tpl_file($OUT) { global $CONF; //if($CONF[LOG] == "SI") { if($FILE == NULL) $FILE = $CONF["dir_indi"].$CONF["indi_tpl_file"]; $LOG = $OUT."\n"; //$LOG .= print_r($_REQUEST, true); //@mailtnx("carlo@tnx.it", "logindi", $LOG); $fp = @fopen($FILE, "a+"); fwrite($fp, $LOG, strlen($LOG)); fclose($fp); //clearstatcache(); //} else return FALSE; } function indi_tpl_clear() { global $CONF; if($FILE == NULL) $FILE = $CONF["dir_indi"].$CONF["indi_tpl_file"]; if(!file_exists($FILE)) return; } /* function indi_urlencode_new($string) { $entities = array('%21', '%2A', '%27', '%28', '%29', '%3B', '%3A', '%40', '%26', '%3D', '%2B', '%24', '%2C', '%2F', '%3F', '%25', '%23', '%5B', '%5D'); $replacements = array('!', '*', "'", "(", ")", ";", ":", "@", "&", "=", "+", "$", ",", "/", "?", "%", "#", "[", "]"); return str_replace($entities, $replacements, urlencode($string)); } */ //encode in base alla versione del rewrite (gli "/" sono encodati due volte se c'è la rewrite attiva) function indi_urlencode($val) { if($_GET['debugtnx']&&is_array($val)){ echo '
';
		$debugBacktrace = debug_backtrace(); array_unshift($debugBacktrace, array('file'=>__FILE__, 'line'=>__LINE__, 'function'=>'debugTnx')); foreach($debugBacktrace as $debugLine) echo "".str_replace("/tnx/www/html/www/", "", $debugLine['file']).""." ".$debugLine['function']."()
"; $printMe = $val; ob_start(); if(is_object($printMe)||is_array($printMe)) print_r($printMe); else var_dump($printMe); $printMe = htmlentities(ob_get_clean(), ENT_COMPAT|ENT_HTML401, 'UTF-8'); echo $printMe === "" ? "Stringa vuota o non convertibile in UTF-8 (prova ISO o output diretto)" : $printMe; echo '
'; die; } if($GLOBALS['DATI']['REW'] != 'NO') return str_replace('%2F','%252F',rawurlencode($val)); else return rawurlencode($val); } //decode in base alla versione del rewrite (gli "/" sono encodati due volte se c'è la rewrite attiva) function indi_urldecode($val) { if($GLOBALS['DATI']['REW'] != 'NO') return str_replace('%2F','/',rawurldecode($val)); else return rawurldecode($val); } //fa addslashes solo se attive gpc function indiAddslashesIfGpc($val) { if($GLOBALS['CONF']['get_magic_quotes_gpc']) return addslashes($val); else return $val; } function labelAdminTnx($identificativoSenzaPrefisso, $options = 'h'){//lista $options us indi_formatta, si concatenano così "h|upper" return "##".$GLOBALS['DATI']['prefissoLabelsTxt'].$identificativoSenzaPrefisso.($options?('|'.$options):'')."##".amministraButtonByConditions('labels', array('tipo'=>$GLOBALS['DATI']['tipoLabelsTxt'], 'identificativo'=>$identificativoSenzaPrefisso)); } function testoAdminTnx($identificativoSenzaPrefisso){ return "##".$GLOBALS['DATI']['prefissoTestiTxt'].$identificativoSenzaPrefisso."##".amministraButtonByConditions('testi', array('tipo'=>$GLOBALS['DATI']['tipoTestiTxt'], 'identificativo'=>$identificativoSenzaPrefisso)); } function amministraButtonByIdentificativo($controller='', $identificativo, $aClass='', $contenuto = ''){ // return amministraButtonByConditions($controller, array('identificativo'=>$identificativo), $aClass, $contenuto); if(isEditorSezioni()){ if(!in_array($controller, ["labels", "testi"])){ trigger_error("Richiesto amministraButton tramite identificativo su tabella non testi o labels"); } $tabella = strtolower($controller); if(!$GLOBALS["idIdentificativi$tabella"]){ $qAllIdIdentificativi = db_q("SELECT id, identificativo FROM " . $tabella . " WHERE IFNULL(identificativo, '') != ''"); while($idIdentificativo = mysql_tnx_fetch_assoc($qAllIdIdentificativi)) $GLOBALS["idIdentificativi$tabella"][$idIdentificativo["identificativo"]] = $idIdentificativo["id"]; } if($GLOBALS["idIdentificativi$tabella"] && $GLOBALS["idIdentificativi$tabella"][$identificativo]){ return amministraButton($controller, $GLOBALS["idIdentificativi$tabella"][$identificativo], $aClass, $contenuto); } else { $arrayConditions = []; $arrayConditions["identificativo"] = $identificativo; if($controller == "testi") $arrayConditions["tipo"] = $GLOBALS['DATI']['tipoTestiTxt']; else if($controller == "labels") $arrayConditions["tipo"] = $GLOBALS['DATI']['tipoLabelsTxt']; return amministraButtonByConditions($controller, $arrayConditions, $aClass, $contenuto); } } else { return $contenuto; } } function amministraButtonByConditions($controller='', $conditions=array(), $aClass='', $contenuto = ''){ // global $DATI, $CONF; $identificativoAmministraButton = md5(json_encode(func_get_args())); if($GLOBALS["amministraButtonByConditions"] && $GLOBALS["amministraButtonByConditions"][$identificativoAmministraButton]){ $amministraButton = $GLOBALS["amministraButtonByConditions"][$identificativoAmministraButton]; } else { $sql = array_map('addslashes', $conditions); foreach($sql as $k=>$v) $sql[$k] = $k."='$v'"; $id = db_qrs("select id from $controller where ".implode(" AND ", $sql)); if(!$id){ $langs = indiGetAllHostsLang(); foreach($langs as $l=>$nome) $sql[$l] = $l."='".addslashes($conditions['identificativo'])."'"; db_q("insert into $controller set ".implode(",", $sql)); $id = db_last_insert_id(); if($ws = db_get_warnings()){ foreach($ws as $k=>$w) if($w[1] == 1364) unset($ws[$k]);//Field 'eng' doesn't have a default value if($ws){ $k = 'tipo'.ucfirst($controller).'Txt'; trigger_error("Ci sono degli warning durante l'inserimento in $controller, probabilmente manca il tipo \"".$GLOBALS['DATI'][$k]."\". Aggiungilo o personalizza \$CONF[$k]."); } } if($id) $GLOBALS['TXT'][$GLOBALS['DATI']['prefisso'.ucfirst($controller).'Txt'].$conditions['identificativo']] = $conditions['identificativo']; } if ($id == 0) { $amministraButton = "****id=0 non funziona qualcosa****"; } else { $amministraButton = amministraButton($controller, $id, $aClass, $contenuto); } $GLOBALS["amministraButtonByConditions"][$identificativoAmministraButton] = $amministraButton; } return $amministraButton; } function amministraButtonAttributo($controller='', $id=''){ return amministraButton($controller,$id,null,null,"attributo"); } function amministraButtonModel($modello, $associazione, $data, $aClass='', $contenuto = '', $tipo_return = 'elemento'){ return amministraButton( strtolower(Inflector::pluralize($modello->$associazione->name)), $data[$associazione][$modello->primaryKey], $aClass, $contenuto, $tipo_return ); } function amministraButton($controllerOLink='', $id='', $aClass='', $contenuto = '', $tipo_return = 'elemento'){ //$id può essere array($id, array($field1, $field2)) $login = cakeLoginInfo(); if($login && $login['Group']['level'] < 100){ if(is_array($controllerOLink)) $link = $controllerOLink; else{ if(!$controllerOLink){ $controller = 'pagine'; } else $controller = $controllerOLink; if(is_array($id)){ $fields = $id[1]; $id = $id[0]; } else $fields = array(); if($id === ""){ if($controller == 'pagine' && is_numeric($GLOBALS['DATI']['pagina'])) $id = $GLOBALS['DATI']['pagina']; else $id = $_GET['id']; if(!$id) return; } $link = array('controller'=>$controller,'action'=>'win_edit',$id,"amministraButton"); if($fields){ $link['editFields'] = implode(",", $fields); } } $link = genera_link_admin_tnx($link); if(!$vecchiaVersione){ datiAdd("body:function amministraButtonOpen(event, link){ if(typeof(jQuery) != 'undefined' && jQuery.fancybox){ event.preventDefault(); event.stopPropagation(); $.fancybox.open({ href: link, beforeClose:function(){location.reload();}, padding:0, margin:20, width:'95%', height:'95%', autoSize: false, live:true, type:'iframe', iframe:{ preload:false }, openEffect : 'elastic', closeEffect : 'elastic', nextEffect : 'fade', prevEffect : 'fade', helpers : { overlay: { locked: false /*evita scollTop */ } } }); } else window.open(link); return false; }", "JS,PRE_CLOSE", true); if($id !== ""){ $GLOBALS["AMMINISTRABUTTON"][$controller][$id] = true; } $onClick = ' onclick="typeof(amministraButtonOpen)!=\'undefined\'?amministraButtonOpen(event, \''.$link.'\'):window.open(\''.$link.'\')" '; if($tipo_return == 'elemento') { if(!$contenuto){ $contenuto = tnxImage("Amministra $controller $id (visibile solo quando loggati in amministrazione)"); $styleAgg = 'width:auto;height:auto;'; } else $styleAgg = ''; if(substr(trim($contenuto), 0, 1) != "<") $contenuto = ''.$contenuto.'';//metto un contenitore per applicare l'onclick return preg_replace("/(<[^\s>]*)/", '$1 style="'.$styleAgg.'cursor:pointer;" class="amministraButtonLink '.$aClass.'" '.$onClick, $contenuto, 1); } elseif($tipo_return == 'attributo') { return $onClick; } } else { $GLOBALS['DATI']["body:if(typeof(jQuery) != 'undefined' && jQuery.fancybox) jQuery('a.amministraButton').fancybox({ beforeClose:function(){location.reload();}, padding:0, margin:20, width:'95%', height:'95%', autoSize: false, live:true, type:'iframe', iframe:{ preload:false }, openEffect : 'elastic', closeEffect : 'elastic', nextEffect : 'fade', prevEffect : 'fade', helpers : { overlay: { locked: false /*evita scollTop */ } } });"] = "JS,PRE_CLOSE"; return ''.$contenuto.''; } } else return ''; } function immagine_admin_tnx($path = "icons_v2/small/email.png", $assoluto = false){ global $DATI; $return = $assoluto ? $DATI['baseurl'] : ''; $return .= $DATI["CAKE_DIR"] . "/images/"; return $return . $path; } function genera_link_admin_tnx($array, $assoluto = false){ global $DATI; cakeBoot(); // return Router::url($array, $assoluto);//non rispetta baseurl se viene cambiato (ordinalo) // return ($assoluto?$DATI['baseurl']:'').Router::url($array);//Router::url genera sempre rispetto alla root, baseurl invece no $return = $assoluto ? $DATI['baseurl'] : ''; $return .= $DATI["CAKE_DIR"] . "/"; if(is_array($array)){ if($array['controller']) $array['controller'] = strtolower($array['controller']); $return .= $array['controller'] . "/"; $return .= ($array['action'] ? $array['action'] : 'index') . "/"; unset($array['controller']); unset($array['action']); foreach($array as $k => $v){ if(is_numeric($k)) $return .= rawurlencode($v) . "/"; else $return .= rawurlencode($k) . ":" . rawurlencode($v) . "/"; } } else $return .= $array; return $return; } //genera l' url, si dovrebbe chiamare genera url ... //funzione base di indi //function genera_link($pagina=NULL, $lang=NULL, $agg=NULL, $ancora=NULL, $andtype="&") { function genera_link($pagina=NULL, $lang=NULL, $agg=NULL, $ancora=NULL, $andtype="&"/*deprecato*/, $RAW=false/*con tabellaSitemap si usa solo per passare variabili che devo essere usate da indi prima del parse del get (link di servizio non pubblici)*/, $assoluto=0, $ssl=0 /*non utilizzato*/) { //ATTENZIONE: quando genera_link viene chiamato da main_link_globale (che popola $MENU) $DATI non c'è, non leggerlo mai global $DATI,$CONF,$LANG,$MENU; if($CONF['tabellaSitemap']){ //durante il processo di aggiornamento non ho bisogno di link, i genera_link andrebbero a cercare il rew_alias, che non è avvalorato if(!$CONF['tabellaSitemapLetta']) return; $andtype = "&";//se devo encodare il link, va encodato tutto } //metto default if($pagina == NULL) $pagina = $DATI["pagina"]; if($lang == NULL) $lang = $DATI["lang"]; if($ancora !== NULL) $ancora = "#".$ancora; if($CONF['indi_subversion'] < 5) { $baseurl = $CONF["baseurl"]; $DATI_O_CONF = $CONF; } else { $DATI_O_CONF = $DATI["baseurl"] ? $DATI : $CONF; $baseurl = $DATI_O_CONF["baseurl"]; $pagina_def = $DATI_O_CONF['pagina_def']; $lingua_def = $DATI_O_CONF['lingua_def']; $nome_programma = $DATI_O_CONF['nome_programma']; $disable_menu_link = $DATI_O_CONF['disable_menu_link']; if(!$lingua_def || $lingua_def == 'AUTO') $lingua_def = array_shift(array_keys($LANG)); if(!$lang) $lang = $lingua_def;//succede in indi_pagina_personalizzata ad esempio } //sistemo variabili in ingresso in caso di errori $lang=trim($lang); $pagina=trim($pagina); //caso pagina root if($pagina == "root") $pagina = $pagina_def; //commento perchè il controllo viene fatto più sotto e ho aggiunto generaLinkFallbackLang //era $DATI_O_CONF['tabellaSitemap'], prova a evitare segnalazioni "genera_link a pagina inesistente" // if($DATI_O_CONF['tabellaSitemapPronta'] && !$GLOBALS['MENU'][$pagina]){ // trigger_error("genera_link a pagina inesistente: ".$pagina); // } //controllo se c'e' opzione menu_ref $pagina_menu_link = $GLOBALS['MENU'][$pagina][$lang]['menu_link']; if(!$disable_menu_link && $pagina_menu_link != "" && is_array($GLOBALS['MENU'][$pagina_menu_link])) { //cambio pagina $pagina = $pagina_menu_link; } //carlo: il baseurl si adatta alla pagina corrente, quindi se passo da ssl a non-ssl o viceversa devo correggerlo //cecca 13/03/17 - per siti completamente in ssl ignoro e genero come da richiesta (vedi baseurl in index1.1) //carlo 4/9/17: per alcune pagine prevedo che girino in doppia versione per poterle usare via ajax su siti ibridi sia in http / https (altrimenti errore cross origin) //carlo 12/2/18: aggiunto generalinkCorreggeSsl if ($DATI_O_CONF['correggiSslBaseurl'] && !$DATI_O_CONF["sito_ssl"] && !$GLOBALS['MENU'][$pagina][$lang]['sslDaContenitore'] && $GLOBALS['MENU'][$pagina][$lang]['forza_ssl'] != indi_isSsl()) { if($GLOBALS['MENU'][$pagina][$lang]['forza_ssl']) $baseurl = str_replace("http://", "https://", $baseurl); else $baseurl = str_replace("https://", "http://", $baseurl); } //CONTROLLO se e' stato preinpostato il link in maniera forzata e lo ritorno if(isset($GLOBALS['MENU'][$pagina][$lang]['menu_link_force'])) { if(!$agg) return $GLOBALS['MENU'][$pagina][$lang]['menu_link_force']; // else trigger_error("genera_link con parametri a sito esterno (menu_link_force)"); } //creo la stringa $query if($agg != "") { //se e' un array if(is_array($agg)) { //costruisco la query ed encodo perche parse_str non decoda while(list($k, $v)=each($agg)) { if(is_array($v)) foreach($v as $vv) $query .= "&".indi_urlencode($k)."[]=".indi_urlencode((string)/*potrebbero esserci 3 livelli di array, ma non li usiamo*/$vv); else $query .= "&".indi_urlencode($k)."=".indi_urlencode($v); //creo anche la posizione numerica } $query = "p=".$pagina."&l=".$lang."&".$query; } else { //prima converto tutto in & $agg = str_replace("&","&",$agg); //se sbaglio e metto il punto "?" o "&" lo tolgo ! if($agg[0] == "?") $agg = substr($agg,1,strlen($agg)); if($agg[0] == "&") $agg = substr($agg,1,strlen($agg)); //sistemo link $query = "p=".$pagina."&l=".$lang."&".$agg; } } else { $query = "p=".$pagina."&l=".$lang; } $AGG_ARRAY = array(); $rewId = 0; if($agg != "") { //converto in array per evitare generazione di link infiniti e per consentire la modifica dei parametri via get in maniera agevole parse_str($query, $query_raw); //rifaccio il ciclo per togliere gli slash che aggiunge il parse if ($CONF['get_magic_quotes_gpc'] == 1) { while (list($key,$val) = each($query_raw)) {//patch c3k 31.1.11 //patch ceccam 3.7.13, se arrivava in get parametro array tipo (cri[]=1&cri[]=2&cri[]=3) metteva sia i parametri separati sia un finale cri[]=Array perchè non c'era la else, la parte sotto la faaceva sempre if(is_array($val)) { foreach($val as $key2=>$val2){ $AGG_ARRAY[stripslashes($key)."[".stripslashes($key2)."]"] = is_string($val2) ? stripslashes($val2) : (string)$val2; } } else { $val = str_replace("\\\'","'",$val); //??????? mistero x php5 $AGG_ARRAY[stripslashes($key)] = stripslashes($val); } } } else { $AGG_ARRAY = $query_raw; } //print_r($AGG_ARRAY); $query = ""; //ricostruisco l' indirizzo (carlo: viene usato solo in caso si voglia la versione semplice ($RAW, genera_email, INDI_HTML_LINKGRABBER) while(list($k, $v)=each($AGG_ARRAY)) { if(is_array($v)){//patch c3k 31.1.11 foreach($v as $k2=>$v2) { $query .= "&".$k."[".$k2."]"."=".indi_urlencode($v2); } } else { $query .= "&".$k."=".indi_urlencode($v);; } } if($CONF["tabellaSitemapPronta"]){ unset($AGG_ARRAY['p']);//dopo aver ricostruito la query raw le tolgo per coerenza unset($AGG_ARRAY['l']); $rewIdAlias = $GLOBALS['MENU'][$pagina][$lang]['rewIdAlias']; if($AGG_ARRAY['rewId']){ $rewId = $AGG_ARRAY['rewId']; unset($AGG_ARRAY['rewId']); } else if($rewIdAlias && $AGG_ARRAY[$rewIdAlias]){ $rewId = $AGG_ARRAY[$rewIdAlias]; unset($AGG_ARRAY[$rewIdAlias]); } } //tolgo and iniziale $query = substr($query,1,strlen($query)); } //converto i parametri in & compatibili $query = str_replace("&","&",$query); //LINK NORMALE $link = "$nome_programma?$query$ancora"; //creata per usare l'& normale nei link delle mail (outlook non li converte, testato con mail di testo) if($andtype != "&"){ $link = str_replace("&", $andtype, $link); } //se voglio il link raw senza rewrite e assoluto if($RAW) { if($assoluto == 1) $link = $baseurl.str_replace($baseurl, "", $link); //1.1 return $link; } //se grabbo nel sito metto i link elaborati if($_SERVER['HTTP_USER_AGENT'] == "INDI_HTML_LINKGRABBER"){ HTML_saveLink($link); $link = HTML_link($link); return $link; }elseif($_SERVER['HTTP_USER_AGENT'] == "INDI_GRAB_LINKGRABBER"){ GRAB_saveLink($link); $link = GRAB_link($link); return $link; }else if($CONF["tabellaSitemapPronta"] || in_array($CONF["REW"], array("ver_5", "ver_3"))) { $noRewrite = array();//vedi $CONF['generaLinkNoRewriteGet'] if($DATI_O_CONF['generaLinkPersistentGet']) foreach($DATI_O_CONF['generaLinkPersistentGet'] as $k) if(isset($_GET[$k]) && !isset($AGG_ARRAY[$k])) $AGG_ARRAY[$k] = $_GET[$k]; if($CONF["tabellaSitemapPronta"]){ $agg = "";//viene riscritta a partire dall'array fatta sopra if($AGG_ARRAY){ foreach($AGG_ARRAY as $k=>$v) if($v !== ""){ if(is_numeric($k) && $DATI_O_CONF['dove_sono'] == 'loc' /* avverto durante siluppo */) trigger_error("Paramentri url numerici non previsti: ".print_r($AGG_ARRAY, true)); if(in_array($k, $DATI_O_CONF['generaLinkNoRewriteGet'])) $noRewrite[$k] = $v; else $agg .= $k.":".indi_urlencode($v)."/"; } } $uri = null; $hosts = indiGetAllHosts($DATI_O_CONF['hostConfig']); $fallbacksArray = array($lang); if($DATI_O_CONF['generaLinkFallbackLang']) $fallbacksArray[] = $DATI_O_CONF['generaLinkFallbackLang']; foreach($fallbacksArray as $l){ if($rewId && $MENU[$pagina][$l]['rewId'][$rewId]){ $uri = $MENU[$pagina][$l]['rewId'][$rewId]."/"; break; } else if($MENU[$pagina][$l]['rew_alias']){ $uri = $MENU[$pagina][$l]['rew_alias']."/"; break; } else if($uris = db_qa("select host, uri from sitemap where pagina = '".addslashes($pagina)."' AND lang = '".addslashes($l)."' AND rewId = '".addslashes($rewId)."' AND host IN ('".implode("','", $hosts)."') AND status IN (200) order by host != '".addslashes($_SERVER['SERVER_NAME'])."'")){ if(!in_array($pagina, [$pagina_def, "sitemap"])){// la pagina_def è sempre su tutti i domini $quanti = count($uris); if($quanti > 1) trigger_error("Nella tabella sitemap multihost ho trovato $quanti configurazioni per pagina=$pagina e lang=$l"); } $baseurl = str_replace($_SERVER['SERVER_NAME'], $uris[0]['host'], $baseurl); $uri = ($uris[0]['uri']?$uris[0]['uri']."/":""); break; } } if(is_null($uri)){ if( !tabellaSitemapAggiornaGetLastRunningPID() && ($pagina != $pagina_def || $lang != $lingua_def) && strpos($pagina.$lang.$rewId, "'") === false //non è un tentativo di injection && strpos($pagina.$lang.$rewId, '"') === false //non è un tentativo di injection 2 ) trigger_error("Genera link a pagina/lingua inesistente ($pagina - $lang - $rewId)"); $pagina = $pagina_def; $lang = $lingua_def; } if($noRewrite) $agg .= "?".http_build_query($noRewrite); $link = $baseurl.$uri.$agg.$ancora; } else{ if($agg != "" || $AGG_ARRAY) { reset($AGG_ARRAY); $agg = ""; while(@list($k, $v)=@each($AGG_ARRAY)) { if($k !== "l" and $k !== "p") { if($v !== "") { if(is_numeric($k) === true and $v !== "") { $agg .= indi_urlencode($v)."/"; } else { if(in_array($k, $DATI_O_CONF['generaLinkNoRewriteGet'])) $noRewrite[$k] = $v; else $agg .= $k.":".indi_urlencode($v)."/"; } } } } if($agg[0] == "/") $agg = substr($agg,1,strlen($agg)); } if(isset($GLOBALS["REW_ALIAS_INV"][$lang][$pagina])){ if($noRewrite) $agg .= "?".http_build_query($noRewrite); $link = str_replace("%252F", "/", indi_urlencode($GLOBALS["REW_ALIAS_INV"][$lang][$pagina]))."/".$agg.$ancora; } else { $link = ""; //se non trovo niente reimposto home $pagina = $pagina_def; $lang = $lingua_def; } } if(!$CONF["tabellaSitemapPronta"]) { if($CONF["REW"] == "ver_3") { //link homepage if($pagina == $pagina_def and $lang == $lingua_def and $agg == NULL) { $link = $baseurl.$ancora; } else { $link = $baseurl.$link; } } else if($CONF["REW"] == "ver_5") { //tolto and $lang == $lingua_def //link homepage, andrebbe sempre con la lingua (senza parametri) //la lingua c'e' sempre per problemi di indicizzazione if($pagina == $pagina_def /* and $agg == NULL tolto carlo 6/6/2018 (non era tolto, ritolto 9/6/2020) perchè genera_link su home creava un link diverso (aggiungeva stringa rewrite) */) { $REW5_monolang = $CONF['REW5_monolang'] && count($LANG)==1; if($REW5_monolang || $lang == $lingua_def) $link = $baseurl.$agg.$ancora; else $link = $baseurl.$GLOBALS['LANG3TO2'][$lang]."/".$agg.$ancora; //$link = $baseurl.$ancora; //link senza lingua //link homepage lingua non def (senza parametri) //} elseif($pagina == $pagina_def and $agg == NULL) { // $link = $baseurl.$GLOBALS[LANG3TO2][$lang]."/".$ancora; } else { $link = $baseurl.$link; } } if(function_exists("post_genera_link")) { $ARR_PGL['link'] = $link; $ARR_PGL['link_senza_ancora'] = $ancora ? substr($link, 0, -1*strlen($ancora)) : $link;$ARR_PGL['link'] = $link; $ARR_PGL['pagina'] = $pagina; $ARR_PGL['lang'] = $lang; $ARR_PGL['agg'] = $agg; $ARR_PGL['agg_array'] = $AGG_ARRAY; $ARR_PGL['ancora'] = $ancora; $link = post_genera_link($ARR_PGL); } } if($assoluto == 1) $link = $baseurl.str_replace($baseurl, "", $link); //1.1 return $link; }elseif($CONF["REW"] == "ver_4") { if($agg != "") { reset($AGG_ARRAY); $agg = ""; while(@list($k, $v)=@each($AGG_ARRAY)) { if($k !== "l" and $k !== "p") { if($v !== "") { if(is_numeric($k) === true and $v !== "") { $agg .= indi_urlencode($v)."/"; } else { $agg .= $k."/".indi_urlencode($v)."/"; } } } } if($agg[0] == "/") $agg = substr($agg,1,strlen($agg)); //rimuovo lo slash in fondo //if($agg{strlen($agg)-1} == "/") $agg = substr($agg,0,strlen($agg)-1); } //cerco nella chiavi if(isset($GLOBALS["REW_ALIAS_INV"][$lang][$pagina])) $link = indi_urlencode($GLOBALS["REW_ALIAS_INV"][$lang][$pagina])."/".$agg.$ancora; else $link = ""; //home page //se posso sovrascrivere sovrascrivo //link personalizzato if(function_exists("post_genera_link")) { $ARR_PGL['link'] = $link; $ARR_PGL['link_senza_ancora'] = $ancora ? substr($link, 0, -1*strlen($ancora)) : $link;$ARR_PGL['link'] = $link; $ARR_PGL['pagina'] = $pagina; $ARR_PGL['lang'] = $lang; $ARR_PGL['agg'] = $agg; $ARR_PGL['agg_array'] = $AGG_ARRAY; $ARR_PGL['ancora'] = $ancora; $link = post_genera_link($ARR_PGL); } //link speciale per home page if($pagina == $pagina_def and $lang == $lingua_def and $agg == NULL) { $link = $baseurl.$ancora; } else { $link = $baseurl.$link; } //ANDREBBE AGGIUNTO if($assoluto == 1) $link = $baseurl.str_replace($baseurl, "", $link); // return $link; } else { //link personalizzato if(function_exists("post_genera_link")) { $ARR_PGL['link'] = $link; $ARR_PGL['link_senza_ancora'] = $ancora ? substr($link, 0, -1*strlen($ancora)) : $link;$ARR_PGL['link'] = $link; $ARR_PGL['pagina'] = $pagina; $ARR_PGL['lang'] = $lang; $ARR_PGL['agg'] = $agg; $ARR_PGL['agg_array'] = $AGG_ARRAY; $ARR_PGL['ancora'] = $ancora; $link = post_genera_link($ARR_PGL); } if($pagina == $pagina_def and $lang == $lingua_def and $agg == NULL) { $link = ($nome_programma.$ancora); } if($assoluto == 1) $link = $baseurl.str_replace($baseurl, "", $link); //1.1 return $link; } } function genera_relative_link($pagina=NULL, $lang=NULL, $agg=NULL, $ancora=NULL, $andtype="&", $RAW=false){ global $DATI,$CONF; return str_replace($CONF["baseurl"], "", genera_link($pagina, $lang, $agg, $ancora, $andtype, $RAW)); } function genera_link_relativo($pagina=NULL, $lang=NULL, $agg=NULL, $ancora=NULL, $andtype="&", $RAW=false){ global $DATI,$CONF; return str_replace($CONF["baseurl"], "", genera_link($pagina, $lang, $agg, $ancora, $andtype, $RAW)); } function genera_link_relativo_email($pagina=NULL, $lang=NULL, $agg=NULL, $ancora=NULL){ global $DATI,$CONF; return str_replace($CONF["baseurl"], "", genera_link($pagina, $lang, $agg, $ancora, "&", !$DATI['tabellaSitemap']/*no raw con tabellaSitemap*/)); } function genera_ancora($ancora){ return genera_link_agg(null,null,null,$ancora); } //carlo: link che mantiene i parametri dell'url corrente correttamente encodati function genera_link_agg($pagina=NULL, $lang=NULL, $agg=NULL, $ancora=NULL, $andtype="&", $RAW=false, $assoluto=0, $ssl=0){ global $DATI, $CONF; $agg_array = $DATI["agg_array"] ? $DATI["agg_array"] : $CONF["agg_array"];//se lo chiamo presto potrei non avere $DATI (redirect lingua browser) unset($agg_array['noOutputDatiCache']); if(is_array($agg)){ $agg = array_merge($agg_array, $agg); } else $agg = http_build_query($agg_array)."&".$agg; return genera_link($pagina, $lang, $agg, $ancora, $andtype, $RAW, $assoluto, $ssl); } //link assoluto function genera_link_assoluto($pagina=NULL, $lang=NULL, $agg=NULL, $ancora=NULL, $andtype="&"){ return genera_link($pagina, $lang, $agg, $ancora, $andtype, false, 1); } //link senza rewrite assoluto x html function genera_link_raw($pagina=NULL, $lang=NULL, $agg=NULL, $ancora=NULL){ return genera_link($pagina, $lang, $agg, $ancora, "&", true, 1); } //email plaintext function genera_link_email($pagina=NULL, $lang=NULL, $agg=NULL, $ancora=NULL){ global $DATI,$CONF; return genera_link($pagina, $lang, $agg, $ancora, "&", !$DATI['tabellaSitemap']&&!$CONF['tabellaSitemap']/*no raw con tabellaSitemap*/, 1); } //email html function genera_link_email_html($pagina=NULL, $lang=NULL, $agg=NULL, $ancora=NULL){ return genera_link_raw($pagina, $lang, $agg, $ancora, "&", false, 1);//carlo: ultimi 3 parametri inutili } //link ssl: DEPRECATA, i link sono ssl in base alla configurazione della pagina (il parametro ssl nella funzione genera_link non viene utilizzato) function genera_link_ssl($pagina=NULL, $lang=NULL, $agg=NULL, $ancora=NULL, $andtype="&"){ return genera_link($pagina, $lang, $agg, $ancora, $andtype, false, 1, 1); } //link email con : DEPRECATA, i link sono ssl in base alla configurazione della pagina (il parametro ssl nella funzione genera_link non viene utilizzato) function genera_link_email_ssl($pagina=NULL, $lang=NULL, $agg=NULL, $ancora=NULL){ global $DATI,$CONF; return genera_link($pagina, $lang, $agg, $ancora, "&", !$DATI['tabellaSitemap']&&!$CONF['tabellaSitemap']/*no raw con tabellaSitemap*/, 1, 1); } //su demo.tnx.it function genera_link_locale($pagina=NULL, $lang=NULL, $agg=NULL, $ancora=NULL, $andtype="&",$RAW=0){ global $DATI,$CONF; $ret = str_replace($CONF["baseurl"], $CONF["baseurl_locale"].$CONF['sito']."/", genera_link_assoluto($pagina, $lang, $agg, $ancora, $andtype,$RAW)); return $ret; } //??? function genera_link_php5($pagina=NULL, $lang=NULL, $agg=NULL, $ancora=NULL, $andtype="&",$RAW=0){ return genera_link($pagina, $lang, $agg, $ancora, $andtype,$RAW); } //Genera l' indirizzo e-mail nascosto con il javascript e tracciato con il programma INRI function genera_email($email=NULL,$testo_link=NULL,$STAT=NULL,$class=NULL) { global $DATI; if($email == NULL) $email = $DATI[email]; if($DATI['indi_subversion'] > 5) return ''.($testo_link?$testo_link:$email).''; //nuova funzione che evita problemi javascript if($DATI['indi_subversion'] > 4) return genera_email_new($email,$testo_link,$STAT,$class); //controllo statistiche if($DATI[STAT] == "SI") $stat = " OnClick='+ prog+'(\"'+dp+'\",\"mail\",\"width=10,height=10\");"; //if(is_array($STAT)) $stat_url = serialize($STAT); $path = "$DATI[nome_programma]?t=stat&stat=".urlencode($stat_url); if($email != "") { $EMAIL = explode("@",$email); if(isset($EMAIL[2])) $EMAIL[1] = $EMAIL[1]."@".$EMAIL[2]; if($testo_link == NULL) $testo = "emailX=emailE;"; else $testo = 'emailX="'.encode($testo_link).'";'; $email_java = ' '; return $email_java; } } //altra versione Ceccam perchè la document.write andava in conflitto con la bgstretchet function genera_email_new($email=NULL,$testo_link=NULL,$STAT=NULL,$class=NULL) { global $DATI; //controllo statistiche if($DATI[STAT] == "SI") $stat = " OnClick='+ prog+'(\"'+dp+'\",\"mail\",\"width=10,height=10\");"; //if(is_array($STAT)) $stat_url = serialize($STAT); $path = "$DATI[nome_programma]?t=stat&stat=".urlencode($stat_url); if($email == NULL) $email = $DATI[email]; if (indi_isGeneraPdf()) { return $email; } if($email != "") { $EMAIL = explode("@",$email); if(isset($EMAIL[2])) $EMAIL[1] = $EMAIL[1]."@".$EMAIL[2]; if($testo_link == NULL) $testo = "emailX=emailE;"; else $testo = 'emailX="'.encode($testo_link).'";'; if($DATI['deferAllScript']) return ''.($testo_link?$testo_link:$email).''; $idrand = rand(); $email_java = ' '; return $email_java; } } // GENERA //###################################################### //FUNZIONI BASE ########################################### //genra il codice per il javascript function genera_javascript() { global $DATI; if($DATI["javascript"] != "") { return("\n"); } } function genera_css() { global $DATI; if($DATI["css"] != "") { return("\n"); } } //aggiungo del codice javascript nella pagina function javascript($codice) { global $DATI; if ($codice != "") { $DATI["javascript"] .= $codice."\n"; } } function css($codice) { global $DATI; if ($codice != "") { $DATI["css"] .= $codice."\n"; } } //ripristina i valori provenienti dal GET function ind_valori_agg($agg) { //$origin="http://inri.tnx.dyndns.org/index.php/eng_test1_.html?a=100&b=1000"; //$tab=parse_url($origin); //$query=$tab["query"]; if(@stristr("&",$agg)) { $variables=explode("&",$query); for ($i=0;$i<=count($variables);$i++){ $tab=explode("=",$variables[$i]); // $$tab[0]=$tab[1]; $_GET[$tab[0]] = $tab[1]; } } else { $query=$agg; $variables=explode("&",$query); for ($i=0;$i<=count($variables);$i++){ $tab=explode("=",$variables[$i]); // $$tab[0]=$tab[1]; $_GET[$tab[0]] = $tab[1]; } } } function ind_valori_redirect($agg) { //$origin="http://inri.tnx.dyndns.org/index.php/eng_test1_.html?a=100&b=1000"; //$tab=parse_url($origin); //$query=$tab["query"]; $query=$agg; $variables=explode("&",$query); for ($i=0;$i<=count($variables);$i++){ $tab=explode("=",$variables[$i]); // $$tab[0]=$tab[1]; if($tab[0] !== "") $_GET[$tab[0]] = $tab[1]; } } function indi_simile($a,$b) { $len = strlen($a); $similar = similar_text($a,$b); $out = abs(round((((($len - $similar) / $len)*100))-100)); return $out; } function isValidEmail($string){ return preg_match('/^[a-z0-9!#$%&\'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&\'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9][-a-z0-9]*\.)*(?:[a-z0-9][-a-z0-9]{0,62})\.(?:(?:[a-z]{2}\.)?[a-z]{2,4}|museum|travel)$/i', $string); } //FUNZIONE DI RISOSTITUZIONE 1=1 function indi_cambia_par($str){ $GLOBALS['indi_cambia_par'] = TRUE; $trans = array("|" => "<|>", "," => "<,>", "(" => "<(>", ")" => "<)>"); $return = strtr($str, $trans); // return $return ? $return : null; return $return; } function indi_cambia_par_r($str){ $trans = array("<|>" => "|","<,>" => ",", "<(>" => "(","<)>" => ")"); return strtr($str, $trans); } //FUNZIONCIONA AIUTO AIUTO function indi_tpl($testo,$ARR,$pulisci=0,$tipo="G") { global $DATI,$TXT; //non usare /* if($DATI['OUTPUT_TPL_CAKE'] == "SI" && $tipo === "#") {//fatto per sitoturismo, mai usato //d_log("OUTPUT_TPL_CAKE"); $L = cakeNew('Label'); return $L->findAndTranslate($testo, $_GLOBALS['DATI']['lang'], $pulisci, false); } */https://demo.tnx.it/ordinalo_utente1/Ordina-onlin%C3%A8/?debugtnx=1 // if($_GET['debugtnx']) return $testo; //gestione caratteri strani $GLOBALS['indi_cambia_par'] = FALSE; //d("$pulisci $tipo","TPL"); //$tit = $tit+1; //d($tit); if($tipo === "G") { $sx="{"; $dx="}"; $c="{}"; if($DATI['indi_tpl_ignoraDoppieGraffe']){ $sx1="(?)/si'; //metto il ; per i javascript {return;} come questi /* cecca: test regex per escludere '{blabla}' se prima c'è function(), non attivo perchè non mi sento sicuro... */ //if($_SERVER['REMOTE_ADDR'] == '192.168.0.115'){ // if($pulisci != 1) $pattern = '/(?)/si'; //} preg_match_all($pattern, $testo, $matches); if($_GET['debugtnx'] && count($matches[1]) > 1000){ // print_r_tnx($matches[1], $_SERVER['REMOTE_ADDR'] == '192.168.0.177') || die; } if(is_array($matches[1])) { while(list($k, $v)=each($matches[1])) { //cecca 01/04/2020, se la chiave è vuota non faccio la sostituzione, per evitare di togliere i {} $tmpKey = str_replace("{", "", $v); $tmpKey = str_replace("}", "", $v); $tmpKey = trim($tmpKey); //effettua la sostituzione senza lasciare traccia //controllo se c'e' un template di formattazione //->$v e la chiave tra graffe //->$ARR[$v] e' il valore //d($v,"v"); //d($ARR[$v],"ARR"); //{TXT:ciao a tutti} //ricontrollo se ha altri template all' interno if ($tmpKey == "") { //cecca 01/04/2020, se la chiave è vuota non faccio la sostituzione, per evitare di togliere i {} $REP[$k] = $sx.$v.$dx; } else { if(strstr($v,"|")) { $orig_tpl = pos(explode("|",$v)); //$REP[$k] = indi_formatta($v,$ARR[$orig_tpl]); if($pulisci != 1) { //nel caso non trovo la sostituzione e non ci sia un inizio di funzione if(!isset($ARR[$orig_tpl])) { //##ciao|tag(h1)## // print str_replace("##","??",$v); //and stristr($v,"TXT:") === FALSE /*if(strpos($orig_tpl,"##") !== FALSE) { $txt = indi_out_txt($orig_tpl,$TXT,$DATI["lang"]); $REP[$k] = indi_formatta($v,$txt); } else $REP[$k] = $sx.indi_formatta($v,$ARR[$orig_tpl],$orig_tpl).$dx;*/ $REP[$k] = $sx.$v.$dx; //$REP[$k] = indi_formatta($v,$ARR[$orig_tpl],$orig_tpl); //$REP[$k] = indi_cambia_par($REP[$k]); } else { //formatto $REP[$k] = indi_formatta($v,$ARR[$orig_tpl],$orig_tpl); $REP[$k] = indi_cambia_par($REP[$k]); } } else { $REP[$k] = indi_formatta($v,$ARR[$orig_tpl]); $REP[$k] = indi_cambia_par($REP[$k]); } } else { //se non c'e' non formatto niente if($pulisci != 1) { if(!isset($ARR[$v])) { $REP[$k] = $sx.$v.$dx; //and stristr($v,"TXT:") === FALSE //$REP[$k] = indi_tpl("{".$v."}",reset($DATI)); //d($REP[$k]); } else { //$REP[$k] = indi_tpl("{".$v."}",reset($DATI)); $REP[$k] = $ARR[$v]; $REP[$k] = indi_cambia_par($REP[$k]); } } else { $REP[$k] = $ARR[$v]; $REP[$k] = indi_cambia_par($REP[$k]); } } } //d($REP[$k]); //$xx = $REP[$k]; //$REP[$k] = indi_tpl($REP[$k],reset($DATI)); if($GLOBALS["CONF"]["DEBUG"] == "SI" && !$REP[$k] && $pulisci && $v){ d_info("manca la traduzione di ".$v." ($k)".indi_var_dump($REP[$k]), "sostituzione testi", "INDI"); } // trova_var($v, get_defined_vars());die; } //sostituisco solo cosa ho trovato //d($matches[0],"KIAVI"); //d($REP,"REPLACE"); $out = str_replace($matches[0], $REP, $testo); if($GLOBALS['indi_cambia_par']) $out = indi_cambia_par_r($out); //if(isset($apc_key)) apc_store($apc_key, $out, $DATI['indi_apc_menu_time']); return $out; } else { //if(isset($apc_key)) apc_store($apc_key, $testo, $DATI['indi_apc_menu_time']); return $testo; } } /* ------------------------------ CAKE --------------------------- */ function cakeClearCache(){ cakeBoot(); Cache::clear(); } function cakeBoot($init_this=null, $no_auth = false){ global $DATI; if($DATI["cakeBootCache"] && !$init_this && $GLOBALS["cakeBootCacheList"]['mainBootDone']) return; //if($GLOBALS["CONF"]["DEBUG"] == "SI") d_info("$init_this (inizio)","cakeBoot","CAKE"); if (!defined('AUTO_SESSION')) define('AUTO_SESSION', false); if(!$DATI) $DATI = $GLOBALS["CONF"]; $vecchia_cwd = getcwd(); //includo struttura cake $dir = $DATI["CAKE_DIR"]; if(!$dir) $dir = $GLOBALS["CONF"]["CAKE_DIR"]; if(!$dir) $dir = "cake"; //a includere il core ci mette sempre poco, è il boot dei modelli che richiede del tempo... chdir($vecchia_cwd."/".$dir."/webroot"); require_once($vecchia_cwd."/$dir/webroot/index.php");//se lo uso relativo include un altro index //necessario per generare link corretti dal front end Router::setRequestInfo(array(array(), array('base' => defined("CAKE_BOOT_CUSTOM_BASE") ? CAKE_BOOT_CUSTOM_BASE : ($GLOBALS["CONF"]["base"].$GLOBALS["CONF"]["CAKE_DIR"])))); chdir($vecchia_cwd); require_once(VENDORS."/Application3k.php");//ci sono alcune funzioni $GLOBALS["cakeBootCacheList"]['mainBootDone'] = true; // d_info("Fine","benchmark inclusione CAKE","INDI"); /* damiano */ if($init_this){ $isController = substr($init_this, -10) == 'Controller'; $cacheKey = strtolower($init_this) . "_" . ($no_auth ? "no_auth" : ""); if($DATI["cakeBootCache"] && $GLOBALS["cakeBootCacheList"][$cacheKey]) $return = $GLOBALS["cakeBootCacheList"][$cacheKey]; else{ d_info("init ".$cacheKey,"cakeBoot","CAKE"); if($isController){ App::import('Controller', substr($init_this, 0, -10)); // cakeBoot $return = new $init_this(); if($no_auth) $return->othAuthRestrictions = ""; $return->cakeSession = false; $return->constructClasses(); $return->Component->initialize($return); $return->beforeFilter(); $return->Component->startup($return); } else{ // if($GLOBALS["CONF"]["DEBUG"] == "SI") d_info("init_this (step 1b) $init_this","cakeBoot","CAKE"); $return = ClassRegistry::init($init_this);//timebench viene fatto qui dentro perchè ci sono boot a cascata // if($GLOBALS["CONF"]["DEBUG"] == "SI") d_info("init_this (step 2b)","cakeBoot","CAKE"); // if(method_exists($return, "init3k") && !$return->init3k_done) $return->init3k(); // timebench("$init_this init3kAll", 0); if(method_exists($return, "init3kAll")) $return->init3kAll(); // timebench("$init_this init3kAll", 1); // if($GLOBALS["CONF"]["DEBUG"] == "SI") d_info("init_this (step 3b)","cakeBoot","CAKE"); } $GLOBALS["cakeBootCacheList"][$cacheKey] = $return; d_info("init $cacheKey finito","cakeBoot","CAKE"); } $GLOBALS["cakeBootCacheList"]['firstInitDone'] = true; } return $return; } function cakeNew($class){ return cakeBoot($class); } function cakeLoginInfo($refreshSessionData = false){//se nei vecchi c'è bisogno di condividere la sessione tra frontend e backend bisogna impostare PHPSESSID al parametro 'Session.cookie' in config/core.php (messo da oggi in base e per i siti segnalati da bucho) if(empty($_SESSION['othAuth'])) return false; cakeBoot(); App::import('Component', 'othAuth'); $O = new othAuthComponent(); $k = $O->hashkey;//trovo la chiave random usata da othauth if(!is_array($_SESSION['othAuth'][$k])) return false;//potrebbe esserci dentro anche frompage (stringa) else{ if($refreshSessionData) $O->_saveSession($O->_createModel()->find(array('User.id' => $_SESSION['othAuth'][$k]['User']['id'])), true); return $_SESSION['othAuth'][$k]; } } //CAKE function cakePage($url_to_render = null){//prende la parte dopo l'alias e la passa come parametri alla pagina del cake (non la posso usare perchè il componente della paginazione del cake genera i link sempre con il prefisso della pagina cake) if(!$GLOBALS["DATI"]["CAKE"]) return; if(empty($url_to_render)){ $paramas = indi_urldecode(strstr($GLOBALS[REW_QUERY_PATH], "/"));//prendo la parte dell'indirizzo dopo l'alias della pagina indi (i parametri per la funzione cake) //quoto perche se sono quotate in automativo if ($GLOBALS['CONF']['get_magic_quotes_gpc']) $paramas = addslashes($paramas); $paramas = str_replace($GLOBALS["DATI"]["cake_url"], "", $paramas); //controllo (ed eventualmente tolgo) che non ci sia già la directory cake nei parametri (come nel caso della paginazione) if(empty($paramas) || $paramas == "/"){ $url_to_render = $GLOBALS["DATI"]["cake_url"]; } else{ if(substr($paramas, 0, 1) == "/"){ //se comincia con / la tolgo $paramas = substr($paramas, 1); } $url_to_render = $GLOBALS["DATI"]["cake_url"] . $paramas; } } d_info('Renderizzo la pagina cake: '.$url_to_render, "", "CAKE"); // //ATTENZIONE CHE STO COSO SOPRASCIVE LE VARIABILE (ad es. $url) // include_once(CORE_PATH . 'cake' . DS . 'bootstrap.php'); cakeBoot(); //if($_GET['dbg'] != 1) ob_start();//se voglio vedere gli errori del cake non posso bufferare l'output //update: NON SI VEDE NEANCHE COSI'... ob_start(); $Dispatcher = new Dispatcher(); $Dispatcher->dispatch($url_to_render); //if($_GET['dbg'] != 1) return ob_get_clean(); return ob_get_clean(); } function indi_vendor($path){//funzione cakephp style per l'inclusione di librerie esterne if (file_exists($GLOBALS["DATI"]["dir_lib"] . $path . '.php')) { require_once($GLOBALS["DATI"]["dir_lib"] . $path . '.php'); } elseif (file_exists($GLOBALS["DATI"]["dir_lib"] . $path)) { require_once($GLOBALS["DATI"]["dir_lib"] . $path); } else { return false; } } function dircopy($srcdir, $dstdir, $verbose = false) { global $_indi_gc_err; $num = 0; if(!is_dir($dstdir)) mkdir($dstdir); if($curdir = opendir($srcdir)) { while($file = readdir($curdir)) { if($file != '.' && $file != '..') { $srcfile = $srcdir . '/' . $file; $dstfile = $dstdir . '/' . $file; if(is_file($srcfile)) { //copio solo se la cartella non è presente if(is_file($dstfile)) { //$ow = filemtime($srcfile) - filemtime($dstfile); else $ow = 1; $ow = 0; } else { $ow = 1; } if($ow > 0) { if($verbose) echo "Copying '$srcfile' to '$dstfile'..."; if(copy($srcfile, $dstfile)) { touch($dstfile, filemtime($srcfile)); $num++; if($verbose) echo "OK\n"; d_info("COPIATO file: $srcfile","dircopy","INDI"); } else { $_indi_gc_err[] = d_err("Errore copia file: $srcfile","FILE","INDI"); echo "Error: File '$srcfile' could not be copied!\n"; } } } else if(is_dir($srcfile)) { $num += dircopy($srcfile, $dstfile, $verbose); } } } closedir($curdir); } return $num; } /* ------------------------------ INDICIZZAZIONE --------------------------- */ //funzione che mixa le parole, in input una serie di array di parole da mescolare nell' ordine dato function ind_array_mix_gen ($ARR) { if (!$ARR[0]) return 0; $ARRX[0] = ""; //d($ARRX); while(list($k, $v)=each($ARR)) { $ARRX = ind_array_mix($v,$ARRX); //d($ARRX); } return($ARRX); } //funzione che mescola due array function ind_array_mix($ARR1,$ARR2) { while(list($k, $v)=@each($ARR1)) { @reset($ARR2); while(list($kk, $vv)=@each($ARR2)) { if(!$vv) $ARR[] = $v; else $ARR[] = $vv."|".$v; } } return $ARR; } //compone una parola ritornando a caso le varianti function ind_componi_parola($parola) { //salvo testo fra parentesi $parentesi = ind_parentesi($parola, "(", ")"); if($parentesi == "") { $ARR[key] = trim($parola); return $ARR; } $PARENTESI = explode("|",$parentesi); //$PARENTESI[] = ""; //$SN = rand(0,count($PARENTESI)-1); //$opz = $PARENTESI[$SN]; $CHIAVE = explode(")",$parola); $parola = trim($CHIAVE[1]); //genero tutte le varianti $ARR[key] = $parola; $c = sizeof($PARENTESI)-1; while(list($k, $v)=each($PARENTESI)) { $v = trim($v); if($k != $c) $alt .= $v." ".$parola."|"; else $alt .= $v." ".$parola; } if(sizeof($PARENTESI) > 2) $alt = $alt."|".$parola; $ARR[alt] = $alt; //if($tipo == "pulita") return trim($CHIAVE[1]); //else return $opz." ".trim($CHIAVE[1]); return $ARR; } function ind_key_val($stringa,$sep,$k_p){ $K = explode($sep,$stringa); while(list($k, $v)=each($K)) { //$k = $k_p.$k; $v = trim($v); $OUT[$k] = $v; //print "$k --> $v \n"; } return $OUT; } //genera una parola chiave in formato esteso, dalla lista delle parole function ind_mix_key($K) { //completo while(list($k, $v)=each($K)) { $Y = ind_key_val($v,",",$k); $SN = rand(0,count($Y)-1); //print $SN; //print $Y[2]; if($k == 1 or $k == 2 or rand(0,1)) $OUT .= ind_componi_parola($Y[$SN])." "; } return $OUT; } //ritorna una parte random di aaaa|bbbbb|ccccc, torna bbbbb function ind_decidi($stringa){ $OPZ = explode("|",$stringa); $SN = rand(0,count($OPZ)-1); $out = $OPZ[$SN]; return $out; } //genera un testo casuale per il meta description function ind_testo_casuale($testo) { global $IND; $pattern = '/\[([^\]\[]*?)\]/si'; //$pattern = '/\(([^\)\(]*?)\)/si'; if (preg_match_all ($pattern, $testo, $matches)) { // nl2br(print_r ($matches)); } else { //print ("Not matched!\r\n"); } while(list($k, $v)=each($matches[1])) { //print ind_decidi($v)."
"; $REP[$k] = ind_decidi($v); } $out = str_replace($matches[0], $REP, $testo); return $out; } //INDI2 (non usato) //ritorna un array con il testo fra parentesi e quello fuori dalle parentesi function ind_parentesi2($str, $start, $end) { $str_low = @trim(strtolower($str)); $pos_start = @strpos($str_low, $start); $pos_end = @strpos($str_low, $end, ($pos_start + strlen($start))); if ( ($pos_start !== false) && ($pos_end !== false) ) { $pos1 = $pos_start + strlen($start); $pos2 = $pos_end - $pos1; $OUT[chiave] = trim(@substr($str, $pos1, $pos2)); $OUT[valore] = trim(@substr($str, $pos_end+1, strlen($str))); return $OUT; } else return FALSE; } //ritorna il testo fra parentesi o altro in una stringa function ind_parentesi($str, $start, $end) { $str_low = @trim(strtolower($str)); $pos_start = @strpos($str_low, $start); $pos_end = @strpos($str_low, $end, ($pos_start + strlen($start))); if ( ($pos_start !== false) && ($pos_end !== false) ) { $pos1 = $pos_start + strlen($start); $pos2 = $pos_end - $pos1; return @substr($str, $pos1, $pos2); } } /* //funzione che data una lista separata da un separatore torna un array con il valore e indice progressivo function ind_scomponi_gen ($stringa,$separatore) { if (!$stringa) return FALSE; if (!$separatore) return FALSE; $ARR = explode($separatore,$stringa); return $ARR; } function ind_scomponi_parola($key) { //suddivido le parti $KEY = explode(" ",$key); while(list($k, $v)=each($KEY)) { if ($v) $ARR[] = trim($v); } return $ARR; } //Creo un array degli inri trovati function ind_key_base($lang) { global $MENU; reset($MENU); while(list($pag, $APAG)=each($MENU)) { while(list($lan, $dati)=each($APAG)) { if($lan == $lang) { $KEY[$pag] = $MENU[$pag][$lan][inri]; } } } return $KEY; } // indice principale keyword -> peso function ind_key_base_val($lang) { global $MENU,$IND; reset($MENU); while(list($pag, $APAG)=each($MENU)) { while(list($lan, $dati)=each($APAG)) { if($lan == $lang) { $KEY[$pag] = $MENU[$pag][$lan][inri]; } } } if (!$KEY) return 0; while(list($k, $v)=each($KEY)) { $KEYA = explode("|",$v); if (!$KEYA[1]) { $key = trim($KEYA[0]); //seconda parola $val = trim($IND[peso_def]); } else { $key = trim($KEYA[1]); $val = trim($KEYA[0]); } $KEY_DEF[$key] = $val; } asort($KEY_DEF); reset($KEY_DEF); return $KEY_DEF; } function indi_add_t($tkd) { global $TKD; $TKD[T][] = $tkd; } function indi_add_k($tkd) { global $TKD; $TKD[K][] = $tkd; } function indi_add_d($tkd) { global $TKD; $TKD[D][] = $tkd; } function indi_tkd_title($cosa) { global $TKD,$DATI,$KEYG,$lang; //prendo il template $out = $DATI[$cosa]; if(is_array($KEYG)) { //$out = ind2_testo_casuale($out); //$out = ind2_sos_key($out,$KEYG[$lang]); //$out = ind2_testo_casuale($out); //$out = ind2_sos_key($out,$KEYG[$lang]); } //tolgo roba spuria ??? da fare $out = str_replace($DATI[$cosa."_sep"].$DATI[$cosa."_sep"],"",$out); $out = str_replace($DATI[$cosa."_sep"].$DATI[$cosa."_sep"],"",$out); $out = str_replace(trim($DATI[$cosa."_sep"]).trim($DATI[$cosa."_sep"]),"",$out); return encode($out); } */ function indi_stat() { global $DATI; $STAT = $_SESSION["STAT"]; if(is_array($STAT)) { return array( "src" => "\nhttp://$_SERVER[SERVER_NAME]$_SERVER[REQUEST_URI]", "data" => strftime("%D %T"), "script" => $_SERVER['SCRIPT_FILENAME'], "ip" => $_SERVER['192.168.0.105'], "host" => $STAT['host'], "referrer" => $_SERVER['HTTP_REFERER'], "user_agent" => $_SERVER['HTTP_USER_AGENT'], "indi_pagina" => $DATI['pagina'], "indi_lingua" => $DATI['lang'], "indi_tempo" => $STAT['tempo'], "indi_pagine" => $STAT['count_pagina'], //collegato a modulo privacy "indi_referrer" => $STAT['ref'] ); } else { return false; } } function stat_dati_aggiuntivi() { global $DATI,$LANG,$lang,$pagina; $STAT = $_SESSION["STAT"]; if($DATI['STAT_email'] == "SI") { $messaggio_agg .= "\n---------------------------------------------------------------"; $messaggio_agg .= "\n\nDATI AGGIUNTIVI FORM\n"; $messaggio_agg .= "Pagina\t\t -> ".$DATI[pagina]."\n"; $messaggio_agg .= "Lingua\t\t -> ".$DATI[lang]."\n"; $messaggio_agg .= "Param\t\t -> ".$DATI[agg]."\n"; if($STAT['id_utente']) $messaggio_agg .= "ID Utente\t\t -> ".$STAT['id_utente']."\n"; $messaggio_agg .= "ID Sessione\t\t -> ".$STAT[id_sessione]."\n"; $messaggio_agg .= "Lingua\t\t -> ".$STAT[lingua]."\n"; $messaggio_agg .= "Provenienza\t\t -> ".$STAT[ref]."\n"; $messaggio_agg .= "Data\t\t -> ".strftime("%D")."\n"; $messaggio_agg .= "Ora\t\t -> ".strftime("%T")."\n"; $messaggio_agg .= "Pagine\t\t -> ".$STAT[count_pagina]."\n"; $messaggio_agg .= "Tempo\t\t -> ".$STAT['tempo']." sec.\n"; $messaggio_agg .= "IP\t\t -> $_SERVER[REMOTE_ADDR]\n"; $messaggio_agg .= "Host\t\t -> $STAT[host]\n"; $messaggio_agg .= "Browser\t\t -> $_SERVER[HTTP_USER_AGENT]\n"; if($DATI['STAT_email_pagine'] == "SI") $messaggio_agg .= indi_debug_array("Log pagine",$STAT[log]); } return $messaggio_agg; } // TRACKING // ##################################################### //deprecata function stat_bot_detect($USER_AGENT) { //??c'e' anche la funzione is_spider, eventualmente da unire if($USER_AGENT == "") return FALSE; $crawlers = array( array('Google', 'Google'), array('msnbot', 'MSN'), array('Rambler', 'Rambler'), array('Yahoo', 'Yahoo'), array('AbachoBOT', 'AbachoBOT'), array('accoona', 'Accoona'), array('AcoiRobot', 'AcoiRobot'), array('ASPSeek', 'ASPSeek'), array('CrocCrawler', 'CrocCrawler'), array('Dumbot', 'Dumbot'), array('FAST-WebCrawler', 'FAST-WebCrawler'), array('GeonaBot', 'GeonaBot'), array('Gigabot', 'Gigabot'), array('Lycos', 'Lycos spider'), array('MSRBOT', 'MSRBOT'), array('Scooter', 'Altavista robot'), array('AltaVista', 'Altavista robot'), array('IDBot', 'ID-Search Bot'), array('eStyle', 'eStyle Bot'), array('Scrubby', 'Scrubby robot') ); foreach ($crawlers as $c) { if (stristr($USER_AGENT, $c[0])) { return($c[1]); } } return FALSE; } function stat_email($ARR) { global $DATI,$LANG,$lang,$pagina; trigger_error("in uso?"); $STAT = $_SESSION["STAT"]; $from = 'From: "'.$DATI[dominio_sito].'" <'.$DATI[email].'>'."\r\n"; $oggetto = "Statistica -> ".$ARR[tipo]." [".$DATI[dominio_sito]."/".$ARR[rif]."]"; $to = $ARR[to]; $msg = "Questa e' un e-mail di statistica generata automaticamente dal programma che gestisce il sito ".$DATI[dominio_sito]."\n\n"; $msg .= "---------------------------------------------------------------------\n"; $msg .= $ARR[msg]."\n"; $msg .= "---------------------------------------------------------------------\n\n"; $msg .= "\nInformazioni Pagina:\n"; $msg .= "-----------------------------------------\n"; $msg .= "Riferimento\t -> ".$ARR[rif]."\n"; $msg .= "Pagina\t -> ".$ARR[pagina]."\n"; $msg .= "Lingua\t -> ".$ARR[lang]."\n"; $msg .= "URL\t -> ".$_SERVER[REQUEST_URI]."\n"; //$msg .= "URL Ref.\t -> ".$_SERVER["HTTP_REFERER"]."\n"; $msg .= "\nInformazioni Utente:\n"; $msg .= "-----------------------------------------\n"; $msg .= "ID Utente\t -> ".$STAT['id_utente']."\n"; $msg .= "ID Sessione\t -> ".$STAT[id_sessione]."\n"; $msg .= "Lingua\t -> ".$STAT[lingua]."\n"; $msg .= "Provenienza\t -> ".$STAT[ref]."\n"; $msg .= "Data\t -> ".strftime("%D")."\n"; $msg .= "Ora\t -> ".strftime("%T")."\n"; $msg .= "IP\t -> $_SERVER[REMOTE_ADDR]\n"; $msg .= "Host\t -> $STAT[host]\n"; $msg .= "Browser\t -> $_SERVER[HTTP_USER_AGENT]\n"; //mando e-mail mailtnx($to, $oggetto,$msg,$from); //mail di statistica mailtnx($DATI[email_indi], "INDI:stat_email():".$oggetto,$msg,$from); //print $msg; //log indi_log_file("stat_email() to:$to oggetto:$oggetto url:$_SERVER[REQUEST_URI]"); } function stat_trigger($nome, $VAL=NULL, $dove=NULL) { //controllo se ho gia' il trigger if(@array_key_exists($nome,$_SESSION["TRIGGER"])) return FALSE; else { //setto il trigger $TRIGGER = $_SESSION["TRIGGER"]; $TRIGGER[$nome] = $VAL; //risalvo $_SESSION["TRIGGER"] = $TRIGGER; return TRUE; } } function creo_statistiche() { global $CONF; ################# LINGUA ################################# function lixlpixel_get_env_var($Var) { if(empty($GLOBALS[$Var])) { $GLOBALS[$Var] = ((!empty($GLOBALS['_SERVER'][$Var])) ? $GLOBALS['_SERVER'][$Var] : ((!empty($GLOBALS['HTTP_SERVER_VARS'][$Var])) ? $GLOBALS['HTTP_SERVER_VARS'][$Var] : '')); } } function lixlpixel_detect_lang() { // Detect HTTP_ACCEPT_LANGUAGE & HTTP_USER_AGENT. lixlpixel_get_env_var('HTTP_ACCEPT_LANGUAGE'); lixlpixel_get_env_var('HTTP_USER_AGENT'); $_AL=strtolower($GLOBALS['HTTP_ACCEPT_LANGUAGE']); $_UA=strtolower($GLOBALS['HTTP_USER_AGENT']); // Try to detect Primary language if several languages are accepted. foreach($GLOBALS['_LANG'] as $K) { if(strpos($_AL, $K)===0) return $K; } // Try to detect any language if not yet detected. foreach($GLOBALS['_LANG'] as $K) { if(strpos($_AL, $K)!==false) return $K; } foreach($GLOBALS['_LANG'] as $K) { if(preg_match("/[\[\( ]{$K}[;,_\-\)]/",$_UA)) return $K; } // Return default language if language is not yet detected. return $GLOBALS['_DLANG']; } // Define default language. $GLOBALS['_DLANG']='en'; // Define all available languages. // WARNING: uncomment all available languages $GLOBALS['_LANG'] = array( 'af', // afrikaans. 'ar', // arabic. 'bg', // bulgarian. 'ca', // catalan. 'cs', // czech. 'da', // danish. 'de', // german. 'el', // greek. 'en', // english. 'es', // spanish. 'et', // estonian. 'fi', // finnish. 'fr', // french. 'gl', // galician. 'he', // hebrew. 'hi', // hindi. 'hr', // croatian. 'hu', // hungarian. 'id', // indonesian. 'it', // italian. 'ja', // japanese. 'ko', // korean. 'ka', // georgian. 'lt', // lithuanian. 'lv', // latvian. 'ms', // malay. 'nl', // dutch. 'no', // norwegian. 'pl', // polish. 'pt', // portuguese. 'ro', // romanian. 'ru', // russian. 'sk', // slovak. 'sl', // slovenian. 'sq', // albanian. 'sr', // serbian. 'sv', // swedish. 'th', // thai. 'tr', // turkish. 'uk', // ukrainian. 'zh' // chinese. ); d_info("10","creo_statistiche","DEBUG_TEMPI"); if(!isset($_SESSION["STAT"]['id_sessione'])) { d_info("20","creo_statistiche","DEBUG_TEMPI"); $_SESSION["STAT"]['id_utente'] = $_SESSION["STAT"]["id_utente"]; $_SESSION["STAT"]['id_sessione'] = session_id(); d_info("30","creo_statistiche","DEBUG_TEMPI"); $_SESSION["STAT"]['sito'] = $CONF['dominio_sito']; $_SESSION["STAT"]['ref'] = $_SERVER['HTTP_REFERER']; $_SESSION["STAT"]['ip'] = $_SERVER["REMOTE_ADDR"]; $_SESSION["STAT"]['ua'] = $_SERVER["HTTP_USER_AGENT"]; $_SESSION["STAT"]['lingua'] = lixlpixel_detect_lang(); $_SESSION["STAT"]['pagina_ingresso'] = $_SERVER["REQUEST_URI"]; $_SESSION["STAT"]['data'] = time(); $_SESSION["STAT"]['count_pagina'] = 1; if($CONF['STAT_log'] == "SI") $_SESSION["STAT"]['log'][] = $_SERVER['REQUEST_URI']; d_info("40","creo_statistiche","DEBUG_TEMPI"); //Salvo sessione //session_write_close(); } else { d_info("50","creo_statistiche","DEBUG_TEMPI"); $_SESSION["STAT"] = $_SESSION['STAT']; $tempo_old = $_SESSION["STAT"]['tempo']; $_SESSION["STAT"]['tempo'] = round(time()-$_SESSION["STAT"]['data']+((time()-$_SESSION["STAT"]['data'])/$_SESSION["STAT"]['count_pagina'])); $scarto = $_SESSION["STAT"]['tempo'] - $tempo_old; $_SESSION["STAT"]['pagina_uscita'] = $_SERVER['REQUEST_URI']; $_SESSION["STAT"]['count_pagina']++; if($CONF['STAT_log'] == "SI"){ $_SESSION["STAT"]['log'][$_SESSION["STAT"]['tempo'].'('.$scarto.')'] = $_SERVER['REQUEST_URI']; //se un motore di ricerca visita migliaia di pagine il file di sessione diventa 30 e più mega e php genera errore //Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 5029206 bytes) in Unknown on line 0 $_SESSION["STAT"]['log'] = array_slice($_SESSION["STAT"]['log'], -100);//tronco agli ultimi 100 } d_info("60","creo_statistiche","DEBUG_TEMPI"); //Calcolo tempo, sommando anche il successivo tempo medio //riscrivo la sessione //session_write_close(); } if($CONF['STAT_log'] == 'NO') unset($_SESSION["STAT"]['log']); d_info("100","creo_statistiche","DEBUG_TEMPI"); } //cecca, test per uso spammatorio DEPRECATA!!! //$F[$key][tipo] = "textarea" $campi_spam = 0; $campi_spam_values; $flag_spam = false; function mail_check($a, $oggetto, $messaggio, $header_addizionali = null, $parametri_addizionali = null) { global $DATI, $F, $campi_spam, $campi_spam_values, $flag_spam; //9/11/2023 $plainText = ["http".(!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 's' : '')."://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']]; $debugBacktrace = debug_backtrace(); array_unshift($debugBacktrace, array('file'=>__FILE__, 'line'=>__LINE__, 'function'=>'debugTnx')); foreach($debugBacktrace as $debugLine) $plainText[] = $debugLine['file'].":".$debugLine['line']." ".$debugLine['function']."()"; mailtnx("c@localhost", "Non in uso", __FILE__.":".__LINE__."\n".implode("\n", $plainText)."\n".print_r(array($_REQUEST, $_SERVER), true)); if ($flag_spam) return; $campi_spam = 0; $request = ($_SERVER['REQUEST_METHOD'] == "POST") ? $_POST : $_GET; $spam = false; foreach($request as $key => $each) { mail_check_r($each, $key); } if ($campi_spam > 0) { $flag_spam = true; //non invio la mail ma mando a me stesso una mail $stylediv = "padding: 3px; border:1px solid #F00; color:#F00; font-weight:bold; font-family: Tahoma,Sans Serif; font-size: 11px"; print "
"; print "
"; print "L'email non e' stata inviata perche' e' stata identitificata come SPAM."; print "

"; print "
"; print "This email is identified as SPAM and it will not send."; print "


"; $dump_campi_spam = var_export($campi_spam_values, true); $dump_request = var_export($request, true); $spam = true; $debug = "oggetto:" . $oggetto . "\n\n"; $debug .= "messaggio:" . $messaggio . "\n\n"; $debug .= "campi spam:" . $dump_campi_spam . "\n\n"; $debug .= "request:" . $dump_request; $file = "/tmp/mailspam_" . time() . "_" . rand(1000, 9999); $f = fopen($file, 'w'); fwrite($f, $debug); fclose($f); $messaggio_spam = indi_debug_array("Campi spam", $campi_spam_values); $messaggio_spam .= indi_debug_array("POST", $_POST); if($DATI['loc'] == "rem") mail_check_redirect($DATI['email_debug'], "INDI:SPAM:mail_spam.inc.php:mail_check() [$DATI[dominio_sito]]", $messaggio_spam); return false; } else { //invio email normale return mail_check_redirect($a, $oggetto, $messaggio, $header_addizionali, $parametri_addizionali); } } function indi_email_wrapper($to, $subject, $message, $additional_headers, $additional_parameters, $fromEmailToCheckDeprecata = null){ global $CONF, $DATI; //log di tutte le mail if($fromEmailToCheckDeprecata) trigger_error("Paramentro deprecato, il controllo viene fatto in indi_email e mod_form e mtp_email, unici punti dove viene chiamata questa funzione"); //MANDO MAIL DEBUG indiEmailCounter(); if($DATI["email_debug"]){ $newmessage = ''; $newline = "\n"; $multipart = false; $additional_headers = explode("\n", $additional_headers); $header_da_riusare = array(); $header_imprevisti = array(); foreach($additional_headers as $header){ $h = trim($header); if(stripos($h, "bcc:") === 0) $bcc = $h; else if(stripos($h, "cc:") === 0) $cc = $h; else if(stripos($h, "from") === 0) $header_da_riusare[] = $header; else if(stripos($h, "MIME-Version") === 0) $header_da_riusare[] = $header; else if(stripos($h, "Content-Transfer-Encoding") === 0) $header_da_riusare[] = $header; else if(stripos($h, "boundary") === 0) { $header_da_riusare[] = $header; $boundary = trim($header); } else if(stripos($h, "Content-Type") === 0){ $header_da_riusare[] = $header; if(stripos($h, "html") !== false) $newline = "
"; if(stripos($h, "multipart") !== false) $multipart = true; } else if($h) $header_imprevisti[] = $h; } $newmessage = "****************************************".$newline; $newmessage .= "*** MESSAGGIO RIDIREZIONATO PER DEMO ***".$newline; $newmessage .= "**************************************** ".$newline; $newmessage .= "DESTINATARIO REALE: $to".$newline; if($cc) $newmessage .= $cc.$newline; if($bcc) $newmessage .= $bcc.$newline; if($header_imprevisti) $newmessage .= "HEADERS PARTICOLARI: ".implode($newline, $header_imprevisti).$newline; if($additional_parameters) $newmessage .= "PARAMETRI sendmail: $additional_parameters".$newline; $newmessage .= "****************************************".$newline; $newmessage .= $newline.$newline; if(!$multipart){ $newmessage .= $message; } else { $subject .= " [mail multipart ridirezionata per demo]"; //$newmessage = add_debug_to_multipart($message, $newmessage, $boundary);//non sembra funzionare con le email html $newmessage = preg_replace("/(]*>)/ims", '$1'.str_replace($newline, "
", htmlentities($newmessage)), $message);//non funzionerebbe con una mail testuale, pace } indi_log("indi_email_wrapper(to: $DATI[email_debug])"); mailtnx($DATI["email_debug"], $subject, $newmessage, implode("\r\n", $header_da_riusare), $additional_parameters); }else{ //mail normale indi_log("indi_email_wrapper(to: $to)"); mailtnx($to, $subject, $message, $additional_headers, $additional_parameters); } } function add_debug_to_multipart($msg, $dbg, $boundary) { $boundary = substr($boundary, strlen("boundary=\"")); $boundary = substr($boundary, 0, strlen($boundary)-1); $pos1 = strpos($msg, $boundary); $pos2 = strpos($msg, "\n", $pos1+1); $pos2 = strpos($msg, "\n", $pos2+1); $prima = substr($msg, 0, $pos2); $dopo = substr($msg, $pos2); return $prima . "\r\n\r\n" . $dbg . $dopo; } function indi_xss_trigger_error($val){ indi_remove_xss($val, true); } //funzone di base per rimuovere gli attacchi XSS da variabili (usata in gpc4html) e nei GET / POST function indi_remove_xss($val, $alertOnly = false){ global $CONF; $valOrig = $val; // remove all non-printable characters. CR(0a) and LF(0b) and TAB(9) are allowed // this prevents some character re-spacing such as // note that you have to handle splits with \n, \r, and \t later since they *are* allowed in some inputs $val = preg_replace('/([\x00-\x08][\x0b-\x0c][\x0e-\x20])/', '', $val); // straight replacements, the user should never need these since they're normal characters // this prevents like $search = 'abcdefghijklmnopqrstuvwxyz'; $search .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; $search .= '1234567890!@#$%^&*()'; $search .= '~`";:?+/={}[]-_|\'\\'; for ($i = 0; $i < strlen($search); $i++) { // ;? matches the ;, which is optional // 0{0,7} matches any padded zeros, which are optional and go up to 8 chars // @ @ search for the hex values $val = preg_replace('/(&#[x|X]0{0,8}'.dechex(ord($search[$i])).';?)/i', $search[$i], $val); // with a ; // @ @ 0{0,7} matches '0' zero to seven times $val = preg_replace('/(�{0,8}'.ord($search[$i]).';?)/', $search[$i], $val); // with a ; } // now the only remaining whitespace attacks are \t, \n, and \r //$ra1 = Array('javascript', 'vbscript', 'expression', 'applet', 'blink', 'script', 'embed', 'object', 'iframe', 'frameset', 'ilayer', 'layer', 'bgsound'); $ra1 = Array(' 0) { $pattern .= '('; $pattern .= '(&#[x|X]0{0,8}([9][a][b]);?)?'; $pattern .= '|(�{0,8}([9][10][13]);?)?'; $pattern .= ')?'; } $pattern .= $ra[$i][$j]; } $pattern .= '/i'; $replacement = substr($ra[$i], 0, 2).''.substr($ra[$i], 2); // add in <> to nerf the tag $val = preg_replace($pattern, $replacement, $val); // filter out the hex tags if ($val_before == $val) { // no replacements were made, so exit the loop $found = false; } } } if($valOrig != $val && $valOrig != 'onmouseenter=\"'){//onmouseenter=\" arriva molte volte ed è innocuo if($alertOnly){ if( stripos($valOrig, "vauleonline.co") === false && stripos($valOrig, "concutelli") === false && stripos($valOrig, "Termoidaulica Non stop di Paroli Enrico") === false && stripos($valOrig, "Via Mondragone") === false ) trigger_error("Controlla XSS (non rimosso) da POST/GET ".substr($valOrig, 0, 100)); } else if($CONF['dove_sono'] == 'loc') trigger_error("Rimossi XSS da ".substr(0, 100, $valOrig)." => ".substr($val, 0, 100)); } return $val; } function mail_check_r($value, $key) { global $F, $campi_spam, $campi_spam_values; if (is_array($value)) { foreach($value as $keyr => $eachr) { mail_check_r($eachr, $keyr); } } else { //faccio controllo, se è di tipo text area puo' avere i ritorni a capo \n \r' if ($F[$key][tipo] == "textarea") { if ( (stripos($value,"bcc:")!==false) || (stripos($value,"Content-Transfer-Encoding")!==false) || (stripos($value,"MIME-Version")!==false) || (stripos($value,"Content-Type")!==false) || (stripos($value,"href=") !== false) || (stripos($value,"href") !== false && (stripos ($value,"sex") !== false || stripos ($value,"viagra") !== false) ) || (stripos($value,"href=http") !== false) || (stripos($value,"href= http") !== false) || (stripos($value,"url=http") !== false) || (stripos($value,"url= http") !== false) || ((stripos($value, "http") !== false) && (stripos($value, "href") !== false)) ) { $campi_spam++; $campi_spam_values[] = "[key=".$key." / value=".$value."]"; } } else if ( (stripos($value,"bcc:")!==false) || (stripos($value,"Content-Transfer-Encoding")!==false) || (stripos($value,"MIME-Version")!==false) || (stripos($value,"Content-Type")!==false) || (stripos($value,"href= http") !== false) || (stripos($value,"url= http") !== false) || (stripos($value,"href=") !== false) || ((stripos($value, "http") !== false) && (stripos($value, "href") !== false)) ){ $campi_spam++; $campi_spam_values[] = "[key=".$key." / value=".$value."]"; } } } function indi_box_implode($array, $before, $after){ return $before.implode($after.$before, $array).$after; } function indi_dir_to_array($dir, $return_full_dir = false){ $d = dir($dir); while($value = $d->read()){ if($value != "." && $value != "..") $return[] = ($return_full_dir?($dir."/"):"").$value; } return $return; } /* ------------------------- FUNZIONI SMS ---------------------- */ function tnxSmsAlert($testo, $numeroOgniminuti = ['3347537306'=>15, "3286833622"=>60]){ global $DATI; $DATI['sms_fornitore'] = 'Aimon'; $stack = debug_backtrace(); $return = true; foreach($numeroOgniminuti as $numero=>$ogniMinuti){ $key = 'smsAlert'.$numero."-".md5($stack[0]['file'].$stack[0]['line']); if(indiCacheGet($key)) continue; if(indi_sms([ "demo" => false,//ordinalo online check partiva da demo.tnx.it "numero_destinatario" => $numero, "testo" => $testo ])) indiCacheSet($key, 1, 60*$ogniMinuti /*0=forever*/); else $return = false; } return $return; } // invio sms tramite aimon (o mobyt) function indi_sms($conf = []) { global $DATI; $classe = $DATI['sms_fornitore'].'Indi'; require_once($DATI['libPath'].strtolower($DATI['sms_fornitore']).'/'.$classe.'.php'); $array_def["charset"] = $DATI['mcharset']; $array_def["demo"] = $DATI['dove_sono'] == 'loc'; $array_def["numero_destinatario"] = "3346243294"; $array_def["mittente"] = "+393346243294";//i mittenti devo essere registrati nel backend mobyt $array_def["testo"] = "Questo è un sms di prova"; $conf = array_merge($array_def, $conf); $SMS = new $classe(); $SMS->charset = $conf["charset"]; $SMS->cc_email = 'tnxstaff@gmail.com'; $SMS->from_email = $DATI['sms_from_email'] ? $DATI['sms_from_email'] : ($DATI['email'] ? $DATI['email'] : 'info@tnx.it'); $SMS->demo = $conf["demo"];//manda le email al posto degli sms $SMS->user = $DATI['sms_username']; $SMS->pass = $DATI['sms_password']; $SMS->from = $conf["mittente"]; $result = $SMS->invia_sms($conf["numero_destinatario"], $conf["testo"]); return $result; } /* ------------------------- FUNZIONI BROWSER ---------------------- */ //controlla la lingua del browser e la ritorna se e' fra quelle di $LANG, senno' null function indi_lingua_browser(){ global $LANG, $LANG3TO2; $langs = array(); // if($_SERVER['REMOTE_ADDR'] == '192.168.0.177' || $_GET['debugtnx']){ // $_SERVER['HTTP_ACCEPT_LANGUAGE'] = 'it-IT,it,en-US,en'; // $_SERVER['HTTP_ACCEPT_LANGUAGE'] = "it-IT,it;q=0.9,en-US;q=0.8,en;q=0.7,nl;q=0.9"; // } if($_SERVER['HTTP_ACCEPT_LANGUAGE']){ // estraggo con pesi preg_match_all('/([a-z]{1,8}(-[a-z]{1,8})?)\s*(;\s*q\s*=\s*(1|0\.[0-9]+))?/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $lang_parse); if($lang_parse[1]){ // riordino array $langs = array_combine($lang_parse[1], $lang_parse[4]); // imposto q factor mancanti e do un peso anche all'ordine in cui si presentano altimenti a parità (o assenza) di valore q=, la funzione asort "mescola" (samsung browser con 'it-IT,it,en-US,en' avrebbe en come prima scelta) $k = 0; foreach ($langs as $lang => $val) { $k++; if ($val === '') $langs[$lang] = 1; $langs[$lang] -= $k * 0.001; } // ordino arsort($langs, SORT_NUMERIC); } foreach ($langs as $k => $v) { foreach ($LANG as $k1 => $v1) { //assegno la lingua con punteggio migliore, la prima che trovo, senno' proseguo if (strpos($k, $LANG3TO2[$k1]) === 0) { return $k1; } } } } } /* ------------------------- FUNZIONI MODULO MOBILE ---------------------- */ //ritorna vero se chi sta visitando è un dispositivo mobile (ha un display piccolo, l'ipad non è mobile in questo caso) function is_mobile(){ $return = indi_get_cache("is_mobile"); if($return === NULL) { preg_match_all('/netfront|windows\sce|symbian|iemobile|webos|midp|\smmp|android|blackberry|ipod|iphone/i', $_SERVER["HTTP_USER_AGENT"], $result); $return = $result[0][0]; } return indi_set_cache("is_mobile", $return); } function is_mobile_html5(){ $return = indi_get_cache("is_mobile_html5"); if($return === NULL) { preg_match_all('/android|ipod|ipad|iphone/i', $_SERVER["HTTP_USER_AGENT"], $result); $return = $result[0][0]; if(!$return && stripos($_SERVER["HTTP_USER_AGENT"], "MSIE") !== false && stripos($_SERVER["HTTP_USER_AGENT"], "Touch") !== false) $return = 'ietouch'; } return indi_set_cache("is_mobile_html5", $return); } function is_mobile_apple(){ $return = indi_get_cache("is_mobile_apple"); if($return === NULL) { preg_match_all('/ipod|ipad|iphone/i', $_SERVER["HTTP_USER_AGENT"], $result); $return = $result[0][0]; } return indi_set_cache("is_mobile_apple", $return); } function is_mobile_android(){ $return = indi_get_cache("is_mobile_android"); if($return === NULL) { preg_match_all('/android/i', $_SERVER["HTTP_USER_AGENT"], $result); $return = $result[0][0]; } return indi_set_cache("is_mobile_android", $return); } function is_mobile_tablet(){ $return = indi_get_cache("is_mobile_tablet"); if($return === NULL) { preg_match_all('/ipad/i', $_SERVER["HTTP_USER_AGENT"], $result); $return = $result[0][0]; if(!$return && is_mobile_android()){ //If there is no ''mobile' in user-agent (Android have that on their phones, but not tablets) http://phpsnips.com/534/User-Agent---Mobile,-Tablet-or-not?-%28Works-with-Android,-iPhone,-Window-Phone-and-more%29#.UqbhLuIueIw $return = strstr(strtolower($_SERVER["HTTP_USER_AGENT"]), 'mobile') === false; } else if(!$return){ // windows 8 ce lo scrive $return = strstr(strtolower($_SERVER["HTTP_USER_AGENT"]), 'tablet') !== false; } } return indi_set_cache("is_mobile_tablet", $return); } //versione detect mobile nuova function indi_device() { $return = indi_get_cache("Mobile-Detect"); if($return === NULL) { require_once $GLOBALS['CONF']['dir_lib'].'/Mobile-Detect/Mobile_Detect.php'; $return = new Mobile_Detect; } return indi_set_cache("Mobile-Detect", $return); } //crea un link geo: per la scelta dell'app su android (e per ios quando lo supporterà) e ha il fallback su google per ios e desktop function geoLink($lat, $lon, $forzaGoogle = false){ // confermato 09/2024: // ios non supporta geo:, forzo google maps (come era prima). tutti i link: https://geohack.toolforge.org/geohack.php?params=42_0_0_N_13_0_0_E // Android adopts an unconventional approach to parsing the points: it does not show a map pin at the point given normally, and a map pin will show up only when given as the query. In other words, to show a pin at the Wikimedia Foundation office, one should not use geo:37.78918,-122.40335 but geo:0,0?q=37.78918,-122.40335. // forzo il link google maps se dentro app nativa oppure desktop oppure dispositivo apple, altrimenti uso geo: che gestisce il sistema if($forzaGoogle || !is_mobile() || is_mobile_apple()) return "https://www.google.com/maps/search/?api=1&query=$lat,$lon"; else return 'geo:'.$lat.','.$lon.'?q='.$lat.','.$lon; } function genera_link_switch_want_phone(){ return genera_link_agg(null, null, array('want_mobile'=>(int)!indi_is_and_want_phone())); } function indi_is_and_want_phone() {//la prima volta va chiamata prima dell'output altrimenti non setta il cookie if(isset($_GET['want_mobile'])){ $use_mobile = (int)$_GET['want_mobile']; setcookie('want_mobile', $use_mobile, 0, indi_cookie_path()); return $use_mobile; } if(isset($_COOKIE['want_mobile'])){ return $_COOKIE['want_mobile']; } return indi_is_phone(); /* if(!indi_is_phone()) return false; else return $use_mobile && indi_is_phone(); */ } //funzioni nuove sui device function indi_is_phone() { if( indi_device()->isMobile() && !indi_device()->isTablet() ){ return true; } return false; } function indi_is_tablet() { if( indi_device()->isTablet() ){ return true; } return false; } function indi_is_mobile() { if( indi_device()->isMobile() ){ return true; } return false; } /* ----------------------------------- ENCODE / FORMATTING / SANITIZING ----------------------------- */ function text4flash($text){//uso questa perchè su uso urlencode mi traduce anche le accentate e poi flash non le visualizza //UPDATE 13/12/07 aggiunto il + tra le sostituzioni, per velocizzare uso i paramentri array invece che il ciclo // $chars = array( // array("&", "%26"), // array("+", "%2B"), // array('"', '\"'), // array(" ", "+"), // ); // $text = strip_tags($text); // if(!in_array($GLOBALS['DATI']['sito'], array("toscanalamiere"))) if($text != strip_tags($text)) indi_debug_email("carlo@tnx.it", "vengono visualizzati caratteri html nel flash di ".$GLOBALS['DATI']['sito']." (flash)", "$text\n\naggiungi le eccezioni in ".__FILE__." linea ".__LINE__); $text = html_entity_decode($text); // foreach($chars as $char){ // $text = str_replace($char[0], $char[1], $text); // } $text2 = str_replace(array("&","+",'"'," ", "\n", "\r"), array("%26","%2B",'\"',"+","+","+"), $text); $text = str_replace(array("%", "&","+",'"'," ", "\n", "\r"), array("%25", "%26","%2B",'\"',"+","+","+"), $text); // TOLTO il 28/07/2009, tenuto per un po' ora sembra tutto ok. c3k. // if($text != $text2){ // if(!in_array($GLOBALS['DATI']['sito'], array("anse","raccianello","weddingsintuscany"))) indi_debug_email("carlo@tnx.it", "encodato % per ".$GLOBALS['DATI']['sito']." (flash)", "aggiungi le eccezioni in ".__FILE__." linea ".__LINE__); // } return $text; } /* ----------------------------------- ROBA DA POTARE / CONTROLLARE NELLE VERSIONI NUOVE ----------------------------- */ //ritorna vero se chi sta visitando supporta il flash function flash_supported(){ //andrebbero tolti gli android e nokia che supportano flash, si farà... preg_match_all('/ipad/i', $_SERVER["HTTP_USER_AGENT"], $result); return !$result[0][0] && !is_mobile(); } function indi_extractTables($html, $filtro_attr = ''){//usato solo per biosinformatica $any_attr = "[^>]*"; if($filtro_attr) $filtro_attr = $any_attr.$filtro_attr.$any_attr; else $filtro_attr = $any_attr; preg_match_all('|(.*?)|ims', $html, $tables); $return = array(); foreach($tables[1] as &$table){ $return_i = array(); preg_match('|(.*?)|ims', $table, $caption); $return_i['caption'] = $caption[1]; $return_i['tr'] = array(); preg_match_all('|(.*?)|ims', $table, $righe); foreach($righe[1] as &$riga){ preg_match_all('|(.*?)|ims', $riga, $celle); $return_i['tr'][] = $celle[1]; } $return[] = $return_i; } return $return; } //non usata function is_file_in_path($file) { if(!file_exists($file)) { $paths=explode(PATH_SEPARATOR,get_include_path()); foreach($paths as $p) if(is_file(preg_replace('%/$%','',$p)."/$file")) return true; return false; } else return true; } function indi_solo_alfanumerici($string, $replaceChar = "", $allowChar = ""){ return indiSoloAlfanumerici($string, $replaceChar, $allowChar); } function indiSoloAlfanumerici($string, $replaceChar = "", $allowChar = ""){ return preg_replace("/[^\d\w".preg_quote($allowChar)."]/im", $replaceChar, $string); } function indiObCleanAll(){//scarta tutto l'output while(ob_get_level()) ob_get_clean();//ob_clean does not destroy the output buffer like ob_end_clean() does. } function indiManutenzione($tnxMsg = '', $messaggio = null, $customFooter = ''){ if(is_null($messaggio)) $h2 = 'temporaneamente offline per manutenzione
temporarily offline for maintenance'; else if(!is_array($messaggio)) $h2 = $messaggio; else $h2 = implode("
", $messaggio); $dominio = str_replace("www.", "", $_SERVER['HTTP_HOST']); if(!is_null($messaggio)){ $h1 = $h2; $h2 = ''; } else $h1 = $dominio; if(!$_GET['testaDbOffline']) indiObCleanAll(); header("HTTP/1.1 503 Service Temporarily Unavailable"); header("Status: 503 Service Temporarily Unavailable"); header("Retry-After: 60"); include("manutenzione.php"); die; } function indi_isSsl() { //08/01/2018 cecca - aggiungo condizione SSL in caso di haproxy <-> apache, il traffico è in chiaro e viene passato l'header [HTTP_X_FORWARDED_PROTO] => https return (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') || $_SERVER['SERVER_PORT'] == 443 || $_SERVER['HTTP_X_FORWARDED_PROTO'] == "https"; } /* Verifica partita IVA e ritorna true o false */ function convalida_partita_iva($vatNumber, $countryCode, $returnOnError = true){ try { $client = new SoapClient("http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl"); $validation = $client->checkVat(array('vatNumber' => $vatNumber, 'countryCode' => $countryCode)); if((int) $validation->valid === 1){ return TRUE; } else { return FALSE; } } catch (Exception $e) { indi_trigger_error("Errore convalida_partita_iva: ".$e->getMessage()); return $returnOnError; } } /* Verifica partita IVA e in caso sia valida ritorna le informazioni dell'azienda (null negli altri casi) */ function informazioni_partita_iva($vatNumber, $countryCode){ try { $client = new SoapClient("http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl"); $validation = $client->checkVat(array('vatNumber' => $vatNumber, 'countryCode' => $countryCode)); if((int) $validation->valid === 1){ return array("ragione_sociale" => (string) $validation->name, "indirizzo" => (string) $validation->address, "nazione" => (string) $validation->countryCode, "partita_iva" => (string) $validation->vatNumber); } else { return null; } } catch (Exception $e) { indi_trigger_error($e->getMessage()); return null; } } function indi_isGeneraPdf() { //cecca: per capire se è la richiesta fatta da wkhtmltopdf per renderizzare la pagina in pdf //mi baso sullo user agent return strpos($_SERVER['HTTP_USER_AGENT'], "wkhtmltopdf") !== false; } function indiMinimizzaHtml($buffer) { $search = array( '/\>[^\S ]+/s', // strip whitespaces after tags, except space '/[^\S ]+\/' // Remove HTML comments ); $replace = array( '>', '<', '\\1', '' ); $buffer = preg_replace($search, $replace, $buffer); return $buffer; } function indi_human_filesize($bytes, $decimals = 2) { $sz = 'BKMGTP'; $factor = floor((strlen($bytes) - 1) / 3); return sprintf("%.{$decimals}f", $bytes / pow(1024, $factor)) . @$sz[$factor]; } function spiderTnx($devices, $urls, $suffissoFisso = ''){ $mobileUa = "Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19"; $chromeAccept = array("Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8"); $contexts = array(); if(in_array('desktop', $devices)) $contexts['desktop'] = array( 'http' => array( 'header' => $chromeAccept, ) ); if(in_array('mobile', $devices)) $contexts['mobile'] = array( 'http' => array( 'user_agent' => $mobileUa, 'header' => $chromeAccept, ) ); if(in_array('tablet', $devices)) $contexts['tablet'] = array( 'http' => array( 'user_agent' => "Mozilla/5.0 (iPad; CPU OS 9_3_2 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13F69 Safari/601.1", 'header' => $chromeAccept, ) ); //ora mando sempre l'header webp visto che tiene vivo entrambe le versioni delle immagini // if(in_array('desktop_webp', $devices)) $contexts['desktop_webp'] = array( // 'http' => array( // 'header' => $chromeAccept, // ) // ); // if(in_array('mobile_webp', $devices)) $contexts['mobile_webp'] = array( // 'http' => array( // 'user_agent' => $mobileUa, // 'header' => $chromeAccept, // ) // ); foreach($contexts as $k=>$v){ $contexts[$k] = stream_context_create(array_merge(['ssl'=>["verify_peer"=>TNX_SECURE_CURL]], $v)); } $time = -microtime(true); foreach($urls as $url){ if($suffissoFisso) $url .= $suffissoFisso; foreach($contexts as $device=>$c){ $page = file_get_contents($url, false, $c); // die($page); // die($url); //per firefox (funzionava su v 60) // echo str_pad('',1024); // echo $device.": ".$url."
"; // ob_flush(); // flush(); } } echo round(($time+microtime(true))*100)/100; echo '" ('.count($urls).' pagine, '.count($devices).' devices)'; echo "
".(round(($time+microtime(true))/(count($urls)*count($devices))*100)/100)."\" per pagina"; } function stringPhpToJs($string, $enclosure = "'", $replaceWith = '"'){ return str_replace(array("\n", $enclosure), array("", $replaceWith), trim($string)); } function printArrayCode($nomeArray = 'array', $array, $path=false, $top=true) { $data = ""; $delimiter = "~~|~~"; $p = null; if(is_array($array)){ foreach($array as $key => $a){ if(!is_array($a) || empty($a)){ if(is_array($a)){ $data .= $path."['{$key}'] = array();".$delimiter; } else { $data .= $path."['{$key}'] = \"".htmlentities(addslashes($a))."\";".$delimiter; } } else { $data .= printArrayCode($nomeArray, $a, $path."['{$key}']", false); } } } if($top){ $return = ""; foreach(explode($delimiter, $data) as $value){ if(!empty($value)){ $return .= '$'.$nomeArray.$value."\n"; } }; return $return; } return $data; } function tnxAbsoluteUrl($url) { global $DATI; if (substr($url, 0, 5) == "http:" || substr($url, 0, 6) == "https:") { return $url; } else { return $DATI["baseurl"] . $url; } } function facebookApiConversionEvent($eventName, $contents = null, $eventId = null, $custom_data = null){ global $_COOKIE, $DATI; if($DATI["facebookPixelId"] && $DATI["facebookApiConversionToken"] && !is_spider()){ $dataParams = []; $dataParams["event_name"] = $eventName; $dataParams["event_time"] = mktime(); if($eventId) $dataParams["event_id"] = $eventId; // Da passare per evitare deduplicazione eventi lato FB (deve essere identico all'EventId passato all'evento js del pixel) $dataParams["user_data"]["client_ip_address"] = $_SERVER['REMOTE_ADDR']; $dataParams["user_data"]["client_user_agent"] = $_SERVER["HTTP_USER_AGENT"]; if($_COOKIE["_fbp"]) $dataParams["user_data"]["fbp"] = $_COOKIE["_fbp"]; if($_COOKIE["_fbc"]) $dataParams["user_data"]["fbc"] = $_COOKIE["_fbc"]; if($custom_data["user_data"]){ foreach($custom_data["user_data"] as $parameterKey => $parameterValue) $dataParams["user_data"][$parameterKey] = $parameterValue; unset($custom_data["user_data"]); } if($contents) $dataParams["contents"] = json_encode($contents); if($custom_data) $dataParams["custom_data"] = json_encode($custom_data); $dataParams["event_source_url"] = genera_link_agg(); $dataParams["action_source"] = "website"; $fields = []; $fields['access_token'] = $DATI["facebookApiConversionToken"]; $fields['data'] = json_encode(array($dataParams)); if( $DATI["apiConversionTestEventCode"] && (!$DATI["apiConversionTestEventNames"] || in_array($eventName, $DATI["apiConversionTestEventNames"])) ){ // è stato impostato un codice di test per la verifica live degli eventi $fields["test_event_code"] = $DATI["apiConversionTestEventCode"]; } $serverUri = "https://graph.facebook.com/v11.0/" . $DATI["facebookPixelId"] . "/events"; $curl = curl_init(); curl_setopt_array($curl, [ CURLOPT_URL => $serverUri, CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => "", CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => "POST", CURLOPT_POSTFIELDS => http_build_query($fields), CURLOPT_HTTPHEADER => ["cache-control: no-cache", "Accept: application/json"], ]); $result = curl_exec($curl); curl_close($curl); return true; } else { return false; } } function indiMailToDb($to, $subj, $body, $headers, $deleteOldMail = "1 MONTH") { /* funzione per usare una tabella invece di inviare mail */ db_q("CREATE TABLE if not exists `mail_to_db` ( `id` INT NOT NULL AUTO_INCREMENT, `to` VARCHAR(250) NULL, `subject` VARCHAR(500) NULL, `body` TEXT NOT NULL, `headers` TEXT NOT NULL, `ts` TIMESTAMP NOT NULL, PRIMARY KEY (`id`) ) COLLATE='utf8_general_ci' ;"); db_q("insert into mail_to_db set `to` = '" . addslashes($to) . "' , subject = '" . addslashes($subj) . "' , body = '" . addslashes($body) . "' , headers = '" . addslashes($headers) . "'"); if ($deleteOldMail) { db_q("DELETE FROM mail_to_db WHERE ts < (NOW() - INTERVAL " . $deleteOldMail . ")"); } } function addLeadToNoCrm($title, $description, $userId = null){ $parametriCreazioneLead = []; $parametriCreazioneLead["title"] = $title; $parametriCreazioneLead["description"] = $description; $parametriCreazioneLead["user_id"] = $userId ? $userId : "200463"; $parametriCreazioneLead["step"] = $datiRichiesta["step"] ? $datiRichiesta["step"] : "505866"; $createLeadCrmApi = curl_init(); curl_setopt($createLeadCrmApi, CURLOPT_URL, "https://tnx.nocrm.io/api/v2/leads"); curl_setopt($createLeadCrmApi, CURLOPT_HTTPHEADER, ["X-API-KEY: 536487f6c0687906a6c7dd887ac5842b49538265c42556a7"]); curl_setopt($createLeadCrmApi, CURLOPT_RETURNTRANSFER, true); curl_setopt($createLeadCrmApi, CURLOPT_VERBOSE, true); curl_setopt($createLeadCrmApi, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($createLeadCrmApi, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($createLeadCrmApi, CURLOPT_POSTFIELDS, $parametriCreazioneLead); $createLeadResult = json_decode(curl_exec($createLeadCrmApi)); } function addContactToSendInBlu($listId, $email, $attributes = null){ $apiKey = "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"; $getSendInBluListDetailRequest = curl_init(); curl_setopt($getSendInBluListDetailRequest, CURLOPT_URL, "https://api.sendinblue.com/v3/contacts/lists/" . $listId); curl_setopt($getSendInBluListDetailRequest, CURLOPT_HTTPHEADER, ["api-key: " . $apiKey, "accept: application/json"]); curl_setopt($getSendInBluListDetailRequest, CURLOPT_RETURNTRANSFER, true); curl_setopt($getSendInBluListDetailRequest, CURLOPT_VERBOSE, true); curl_setopt($getSendInBluListDetailRequest, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($getSendInBluListDetailRequest, CURLOPT_SSL_VERIFYPEER, FALSE); $getSendInBluListDetailResponse = curl_exec($getSendInBluListDetailRequest); curl_close($getSendInBluListDetailRequest); if($getSendInBluListDetailResponse){ $getSendInBluListDetailResult = json_decode($getSendInBluListDetailResponse); if($getSendInBluListDetailResult->id){ // La lista è esistente, procedo a creare il contatto e importarlo nella lista $jsonCreaContatto = []; $jsonCreaContatto["email"] = $email; $jsonCreaContatto["updateEnabled"] = true; $jsonCreaContatto["listIds"] = [$listId]; if($attributes) $jsonCreaContatto["attributes"] = $attributes; $createUpdateContactRequest = curl_init(); curl_setopt_array($createUpdateContactRequest, [ CURLOPT_URL => "https://api.sendinblue.com/v3/contacts", CURLOPT_RETURNTRANSFER => true, CURLOPT_VERBOSE => true, CURLOPT_TIMEOUT => 30, CURLOPT_POST => 1, CURLOPT_POSTFIELDS => json_encode($jsonCreaContatto), CURLOPT_HTTPHEADER => [ "Accept: application/json", "Content-Type: application/json", "api-key: " . $apiKey ] ]); $createUpdateContactResponse = curl_exec($createUpdateContactRequest); $createUpdateContactError = curl_error($createUpdateContactRequest); $createUpdateContactInfo = curl_getinfo($createUpdateContactRequest); curl_close($createUpdateContactRequest); if($createUpdateContactError){ return false; } else { if($createUpdateContactInfo["http_code"] >= 200 && $createUpdateContactInfo["http_code"] <= 204){ return true; } else { if($createUpdateContactResponse->id){ return true; } else { return false; } } } } else { trigger_error("Richiesta iscrizione contatto SendInBlu su lista non esistente (" . $listId . ")"); } } return false; } function indiStrStartsWith($string, $startWith){ return substr($string, 0, strlen($startWith)) === $startWith; } function indiStrEndsWith($string, $startWith) { $length = strlen($startWith); if(!$length) return true; return substr($string, -$length) === $startWith; } function indiGetImgAspectRatio($img) { if (is_file($img)) { list($width, $height, $type, $attr) = getimagesize($img); if ($height > 0) { $ar = $width / $height; return $ar; } } return 1; } function indiNormalizzaTelefono($numberStr, $nazioneId = "IT"){ global $DATI; require $DATI['libPath'] . '/libphonenumber/vendor/autoload.php'; $phoneUtil = \libphonenumber\PhoneNumberUtil::getInstance(); $return['isValid'] = false; $return['numero'] = $numberStr; try { $numberStrProto = $phoneUtil->parse($numberStr, $nazioneId); $isMobile = \libphonenumber\PhoneNumberType::MOBILE == $phoneUtil->getNumberType($numberStrProto); $return['isValid'] = $phoneUtil->isValidNumber($numberStrProto); $return['isMobile'] = $isMobile; if($return['isValid']){ $return['numeroNormalizzato'] = $phoneUtil->format($numberStrProto, \libphonenumber\PhoneNumberFormat::E164); } return $return; } catch (\libphonenumber\NumberParseException $e) { return $return; } } // funzion colore integrate da bucho -- https://gist.github.com/andrewrcollins/4570993 function indiColMix($color_1 = array(0, 0, 0), $color_2 = array(0, 0, 0), $weight = 0.5) { $f = function ($x) use ($weight) { return $weight * $x; }; $g = function ($x) use ($weight) { return (1 - $weight) * $x; }; $h = function ($x, $y) { return round($x + $y); }; return array_map($h, array_map($f, $color_1), array_map($g, $color_2)); } function indiColTint($color, $weight = 0.5) { $t = $color; if (is_string($color)) { $t = indiColHex2Rgb($color); } $u = indiColMix($t, array(255, 255, 255), $weight); if (is_string($color)) { return indiColRgb2Hex($u); } return $u; } function indiColTone($color, $weight = 0.5) { $t = $color; if (is_string($color)) { $t = indiColHex2Rgb($color); } $u = indiColMix($t, array(128, 128, 128), $weight); if (is_string($color)) { return indiColRgb2Hex($u); } return $u; } function indiColShade($color, $weight = 0.5) { $t = $color; if(is_string($color)) { $t = indiColHex2Rgb($color); } $u = indiColMix($t, array(0, 0, 0), $weight); if (is_string($color)) { return indiColRgb2Hex($u); } return $u; } function indiColHex2Rgb($hex = '#000000') { $f = function ($x) { return hexdec($x); }; return array_map($f, str_split(str_replace("#", "", $hex), 2)); } function indiColRgb2Hex($rgb = array(0, 0, 0)){ $f = function ($x) { return str_pad(dechex($x), 2, "0", STR_PAD_LEFT); }; return "#" . implode("", array_map($f, $rgb)); } function indiColCssColorMixPhp($colore1,$colore2,$percentuale) { return indiColRgb2Hex(indiColMix(indiColHex2Rgb($colore1), indiColHex2Rgb($colore2), ((100-$percentuale)/100))); } ?>