//cecca cache (indiCache())per ibfor ed eventuali altri
if($_SERVER['SERVER_ADDR'] != "178.32.137.20" && (strpos($_SERVER['REQUEST_URI'], "/shoppix_ibfor_com") === 0 || strpos($_SERVER['SERVER_NAME'], "ibfor.com") !== false)){
//if($_SERVER['REMOTE_ADDR'] == '192.168.0.115'){
if (!$_GET["noIndiCache"] && !$_GET["tabellaSitemapAggiorna"]) {
$GLOBALS["indiCache_attiva"] = 1;
}
}
//funzione sempre presente perche' cache include questo file, poi faremo un cakeboot serio
function is_indi() {
/* cecca se cerchi is_admin() o isAdmin() puoi usare !is_indi() */
if (defined('INDI')) return TRUE;
return FALSE;
}
function indiAddslashesRecursiveGpc($var){
if($GLOBALS['CONF']['get_magic_quotes_gpc']) return $var;
else return aS_ricorsivo($var);
}
function indiStripslashesRecursiveGpc($var){
if(!$GLOBALS['CONF']['get_magic_quotes_gpc']) return $var;
else return sS_ricorsivo($var);
}
//viene chiamata anche dall'admin, quindi uso funzioni xcache dirette
function tabellaSitemapAggiornaGetLastRunningPID(){
return xcache_get(tabellaSitemapAggiornaKey());
}
function tabellaSitemapRichiediAggiornamentoInBackground($motivo = "aggiornamentoInBackground"){
background_curl($GLOBALS['CONF']['baseurl']."?tSA=1&log=".$motivo);//il parametro "log" prima era "fromSite"
// exec("wget --spider -bqO- ".escapeshellarg($GLOBALS['CONF']['baseurl']."?tSA=1&fromSite=wgetBackground"));
}
function tabellaSitemapAggiornaKey(){//usata per pid in shared memory e semaforo
global $DB;
if(!$DB['database']) trigger_error("Non trovo il nome del database per tabellaSitemapAggiornaKey");
return $DB['database']."_".$_SERVER['SERVER_NAME']."_tabellaSitemapAggiornaKey";
}
function tabellaSitemapAggiornaSemaforo($setRosso = false){
//potrebbe non essere perfettamente univoca (due shoppix con la stessa iniziale di nome_sito hanno lo stesso id)
//in questo caso i processi avranno la stessa coda, pace
if(!$GLOBALS['tabellaSitemapAggiornaSemaforoID'])//altrimenti alla seconda chiamata (sem_release) ne genera uno diverso!
$GLOBALS['tabellaSitemapAggiornaSemaforoID'] = sem_get(ftok($GLOBALS['CONF']['path_base'], substr($GLOBALS['CONF']['nome_sito'], 0, 1)));//ftok — Convert a pathname and a project identifier to a System V IPC key
// $id = hexdec(substr(sha1(tabellaSitemapAggiornaKey()), 0, 15));//https://stackoverflow.com/questions/3379471/php-number-only-hash
if($setRosso) sem_acquire($GLOBALS['tabellaSitemapAggiornaSemaforoID']);
else sem_release($GLOBALS['tabellaSitemapAggiornaSemaforoID']);
}
function tabellaSitemapAggiornaSetPID($pid = null){//passo 0 alla fine
if(is_null($pid)) $pid = getmypid();
return xcache_set(tabellaSitemapAggiornaKey(), $pid);
}
function tabellaSitemapAggiornaAmILastRunningPID(){
$currentPid = tabellaSitemapAggiornaGetLastRunningPID();
//$currentPid potrebbe non esserci in caso si resetti la cache, però rischio che partano più processi
// if($currentPid != getmypid()) trigger_error("Bloccata una indiTabellaSitemapAggiorna in parallelo con un'altra");
return $currentPid == getmypid();
}
function whatsAppMedia($id){
//https://developers.facebook.com/docs/whatsapp/message-templates/creation
global $DATI;
$token = $DATI['whatsappPlatformToken'] ? $DATI['whatsappPlatformToken'] : 'EAAHVE1cm6L8BOZBFWcGb7GymZC9jDplIcxJ8YjkWVQBxHQFDfl7VfGOd27yG6KagDfH3nTqTBAbCpsjP8Vr9e9ZAzAyKcic5siF0xU21QOOEl3EjiIieXTu4jZBMiaJy43YIUGOozl4cyCkxmPs37twzNXI3ZAS3JNqJtDkxpMCsDFOYNtvYkCoKUl4D7RSEzUopsKaB4fR1pn4m7';
$c = curl_init();
curl_setopt($c, CURLOPT_URL, "https://graph.facebook.com/v22.0/$id");
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($c, CURLOPT_HEADER, 0);
curl_setopt($c, CURLOPT_HTTPHEADER, ['Authorization: Bearer '.$token]);
$result = json_decode(curl_exec($c));
if($result->error) trigger_error("whatsAppMessage get media url: ".$result->error->message);
curl_close($c);
$c = curl_init();
curl_setopt($c, CURLOPT_URL, $result->url);
// curl_setopt($c, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($c, CURLOPT_HEADER, 0);
curl_setopt($c, CURLOPT_HTTPHEADER, [
// 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36',
// 'Content-Type: application/json',
'Authorization: Bearer '.$token,
]);
$result->data = curl_exec($c);
$httpcode = curl_getinfo($c, CURLINFO_HTTP_CODE);
print_r_tnx($httpcode, $_SERVER['REMOTE_ADDR'] == '192.168.0.177');
curl_close($c);
return $result;
}
$CONF['wahaKeyHeader'] = "X-Api-Key: osmmc1003";
$CONF['loc']['wahaHost'] = 'https://demo.tnx.it:1325/';
$CONF['rem']['wahaHost'] = 'https://web.tnx.it:1325/';
$CONF['loc']['wahaRetries'] = 3;
$CONF['rem']['wahaRetries'] = 6;
function wahaContacts(){
global $DATI;
$ch = curl_init($DATI['wahaHost']."api/contacts/all?session=".$DATI['wahaSession']);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
$DATI['wahaKeyHeader']
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
if($response->error) trigger_error("wahaContacts: ".$response->error);
curl_close($ch);
return json_decode($response);
}
function wahaSessionsCreate(){
global $DATI;
$ch = curl_init($DATI['wahaHost']."api/sessions/");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
$DATI['wahaKeyHeader']
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
"name" => $DATI['wahaSession'],
"config" => [
"webhooks" => $DATI['wahaWebhooks']
]
]));
$response = curl_exec($ch);
if($response->error) trigger_error("wahaSessionsCreate: ".$response->error);
curl_close($ch);
return json_decode($response);
}
function wahaSessions($action = ''){//vuoto per session information
//https://waha.devlike.pro/docs/how-to/sessions/#session-status
global $DATI;
$ch = curl_init($DATI['wahaHost']."api/sessions/".$DATI['wahaSession']."/".$action);
curl_setopt($ch, CURLOPT_HTTPHEADER, [$DATI['wahaKeyHeader']]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
if($action){
curl_setopt($ch, CURLOPT_POST, true);
}
$response = curl_exec($ch);
curl_close($ch);
return json_decode($response);
}
function wahaGetQR(){
global $DATI;
$status = wahaCheckSession(["SCAN_QR_CODE", "WORKING"]);
if($status == "WORKING") return (object)["loggedIn"=>true];
$ch = curl_init($DATI['wahaHost']."api/".$DATI['wahaSession']."/auth/qr");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Accept: application/json',
$DATI['wahaKeyHeader']
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
$response = json_decode($response);
$response->htmlTag = '';
return $response;
}
function wahaCheckSession($waitFor = ["WORKING"]){
global $DATI;
for($i=0; $i<$DATI['wahaRetries']; $i++){
$status = wahaSessions();// Idempotent operation - you can call it multiple times, and it’ll start the session only if it’s not running.
if($status->error){
if(!$i && $status->error == 'Not Found'){
wahaSessionsCreate();
continue;
}
else{
trigger_error($status->error." | ".$status->message);
return false;
}
}
$status = $status->status;
if(in_array($status, $waitFor)) return $status;
if($status == "STOPPED") wahaSessions("start");
else if($status == "SCAN_QR_CODE"){
// $qr = wahaGetQR();
if(function_exists("wahaCallbackLoginNecessario")){//definita su sito
wahaCallbackLoginNecessario();
}
else{
trigger_error("Necessario ripetere login WhatsApp (inviata mail al cliente)");
}
return false;
}
else if($status == "FAILED"){
//session is failed due to some error. It’s likely either authorization is required again or device has been disconnected from that account. Try to Restart the session and if it doesn’t help - Logout and **Start ** the session again.
if($i < 2){
trigger_error("wahaSession \"$status\", provo restart");
wahaSessions("restart");
}
else{
trigger_error("wahaSession \"$status\", provo logout");
wahaSessions("logout");
}
}
else{//STARTING, STOPPED
// trigger_error("wahaSessions $DATI[wahaSession] \"$status\", aspetto 1 secondo");
sleep(1);
}
}
trigger_error("wahaSessions \"$status\" dopo $DATI[wahaRetries] tentativi con sleep(1)");
return false;
}
function wahaLinkTest(){//RICHIEDE PLUS - fatto prova per vedere di aggirare le limitazioni per cliccare i link, ma non funziona
global $DATI;
$ch = curl_init($DATI['wahaHost']."api/send/link-custom-preview");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Accept: application/json',
$DATI['wahaKeyHeader']
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
"session" => $DATI['wahaSession'],
"chatId" => "393286833622@c.us",
"text" => "Test ".$DATI['baseurl'],
"linkPreviewHighQuality" => true,
"preview" => [
"url" => $DATI['baseurl'],
"title" => "Titolo del link",
"description" => "Descrizione del link",
"image" => [
"url" => "https://www.tnx.it/_files/immagini/favicon.png"
]
]
]));
$response = curl_exec($ch);
curl_close($ch);
$response = json_decode($response);
return $response;
}
function wahaGroupTest(){
global $DATI;
$ch = curl_init($DATI['wahaHost']."api/".$DATI['wahaSession']."/groups");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Accept: application/json',
$DATI['wahaKeyHeader']
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
$response = json_decode($response);
return $response;
}
function wahaSendPool(){
global $DATI;
$ch = curl_init($DATI['wahaHost']."api/sendPoll");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Accept: application/json',
$DATI['wahaKeyHeader']
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
$response = json_decode($response);
return $response;
}
function wahaSendText($data){
global $DATI, $_DB;
//https://waha.devlike.pro/docs/how-to/send-messages/
$data['session'] = $DATI['wahaSession'];
if(!$data['session']){
trigger_error("nome sessione vuota");
return false;
}
if(!$data['text'] && !$data['poll']){
trigger_error("messaggio vuoto");
return false;
}
if(!$data['chatId']){
trigger_error("destinatario vuoto");
return false;
}
if(!$session = wahaCheckSession()) return false;
$_DB->insert("indi_admin.wahaMessages", ["session"=>$DATI["wahaSession"], "data"=>json_encode($data)]);//vedi wahaQueueTnx
$iid = $_DB->insert_id;//altrimenti viene sovrascritto dalla $_DB->qrs (nel db ci sono varie righe che ho marcato come bug_last_insert_id)
if(strpos($data['chatId'], "+") !== false) $data['chatId'] = str_replace("+", "", $data['chatId']);
if(strlen($data['chatId']) < 11){
//un numero di cellulare (italiano) è almeno 9 cifre + 2 di prefisso internazionale
//se mando un messaggio a 39123 waha (2025.12.1) rimane in attesa a lungo e poi dà "failed to get device list: failed to send usync query: info query timed out"
trigger_error("numero troppo corto");
return false;
}
if(strpos($data['chatId'], "@") === false) $data['chatId'] .= "@c.us";
if($data['text']){
$apiTarget = "sendText";
if(strpos($data['text'], "http://") !== false || strpos($data['text'], "https://") !== false){
$me = wahaSessions();
$me = str_replace("@c.us", "", $me->me->id);
$dest = str_replace("@c.us", "", $data['chatId']);
if(!$_DB->qrs("select * from indi_admin.wahaEngagements where `from` = ? and `to` = ?", [$dest, $me])){
//24/10/25: è sufficiente rispondere, ma lascio il messaggio completo e lo mando solo fino a che non ho registrato una risposta
if($DATI['lang'] == 'ita') $data['text'] .= "\n\n _rispondi \"ok\" (o aggiungi il numero alla rubrica) se il link non è cliccabile_";
else $data['text'] .= "\n\n _reply \"ok\" (or add the number in the contacts) to activate the link_";
}
}
}
else if($data['poll']){
$apiTarget = "sendPoll";
}
$ch = curl_init($DATI['wahaHost']."api/".$apiTarget);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
$DATI['wahaKeyHeader']
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
$response = curl_exec($ch);
$return = json_decode($response);
if(!$return->id) trigger_error("Controllare invio messaggio wahaSendText: ".curl_getinfo($ch, CURLINFO_HTTP_CODE)." ".print_r($response, true));
else $_DB->update("indi_admin.wahaMessages", ["message_id"=>$return->id], $iid);
curl_close($ch);
return $return;
}
function whatsAppMessage($data){
//https://developers.facebook.com/docs/whatsapp/message-templates/creation
global $DATI;
//token d'accesso dell'utente di sistema: valido per tutti i numeri sotto l'account TNX
// https://developers.facebook.com/docs/whatsapp/business-management-api/get-started#1--acquire-an-access-token-using-a-system-user-or-facebook-login
$token = $DATI['whatsappPlatformToken'] ? $DATI['whatsappPlatformToken'] : 'EAA4nWwgYPx4BPmpbUjYydatVwwzTPrQ2klNaBacS8bRBmmObVc50NFx9TSuwHXbpoVQBemKhPUUdQjgdu7LkMhlGsqlLoDTNxjQR17CLNn5fooYQMAhdzscWyXYzscyrBQoUPsPiSPIVLlI1zJQOMoVyM32yduKfcIF6fy70ZBmmVWGfulJ8A64ZB01rn6DYb3tD7VTz7U0z7qJ0dvV0ZAAs754nK8D0wZAycZBPS0SuxZAHNZADiCKhdXWbYZAHvgZDZD';
$objectId = $DATI['whatsappPlatformObjectId'] ? $DATI['whatsappPlatformObjectId'] : '427315567129740';//numero tnx allarme 3334974050
$c = curl_init();
curl_setopt($c, CURLOPT_URL, "https://graph.facebook.com/v22.0/$objectId/messages");
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($c, CURLOPT_HEADER, 0);
curl_setopt($c, CURLOPT_HTTPHEADER, ['Authorization: Bearer '.$token, 'Content-Type: application/json']);
curl_setopt($c, CURLOPT_POSTFIELDS, json_encode($data));
// curl_setopt($c, CURLOPT_POSTFIELDS, "{ \"messaging_product\": \"whatsapp\", \"to\": \"393286833622\", \"type\": \"template\", \"template\": { \"name\": \"hello_world\", \"language\": { \"code\": \"en_US\" } } }");
$result = json_decode(curl_exec($c));
if($result->error) trigger_error("whatsAppMessage: ".$result->error->message);
curl_close($c);
return $result;
}
// if($_SERVER['REMOTE_ADDR'] == '192.168.0.177'){
// $ok = whatsAppMessage([
// "messaging_product" => "whatsapp",
// "to" => "393346243294",
// "type" => "template",
// "template" => [
// "name" => "prenotazione_conferma",
// "language" => ["code" => "en"],
// "components" => [
// [
// "type" => "body",
// "parameters" => [
// [
// "type" => "text",
// "parameter_name" => "nome",
// "text" => "Mario Rossi",
// ],
// [
// "type" => "text",
// "parameter_name" => "nome_sito",
// "text" => "Ristorante TNX",
// ],
// [
// "type" => "text",
// "parameter_name" => "data_ora",
// "text" => "31/12/2025 alle 21:00",
// ],
// ]
// ],
// [
// "type" => "button",
// "index" => "0",
// "sub_type" => "url",
// "parameters" => [
// [
// "type" => "text",
// "text" => "https://esercenti.avatable.com/demo_ristorante/it/gestione-prenotazioni/?id_pren=4OHUSH0JJDTL&type=disdetta"
// ]
// ]
// ]
// ]
// ]
// ]);
// }
function whatsAppLink($dest = '', $testo = '', $usaSintassiNonDocumentataPerDesktop = false){//anche da admin e clonata in js su gestione_consegne (apriWa())
if($dest){
if(substr($dest, 0, 3) == "+39") $dest = substr($dest, 3);
$dest = preg_replace("/[^\d]/", "", $dest);
if(substr($dest, 0, 4) == "0039") $dest = substr($dest, 4);
// if(substr($dest, 0, 1) != "3") return "";//non è un cellulare, è un errore che voglio identificare - UPDATE c'è whatsapp anche su numeri fissi, tipo 0577933737
$dest = "39".$dest;
}
return whatsAppLinkRaw($dest, $testo, $usaSintassiNonDocumentataPerDesktop);
}
function whatsAppLinkRaw($dest = '', $testo = '', $usaSintassiNonDocumentataPerDesktop = false){//anche da admin
if($usaSintassiNonDocumentataPerDesktop && stripos($_SERVER['HTTP_USER_AGENT'], "android") === false && stripos($_SERVER['HTTP_USER_AGENT'], "iphone") === false)//se sono sicuro che verrà utilizzato su desktop in questa maniera risparmio 2 schermate ("preview messaggio > tasto invia" e "sembra che tu non abbia installato whatsapp > link usa whatsappweb")
return "https://web.whatsapp.com/send?text=".rawurlencode($testo).($dest?"&phone=".rawurlencode($dest):"");
else
return "https://wa.me/".rawurlencode($dest).($testo?"?text=".rawurlencode($testo):"");
}
function indiLinkGooglePlayDaId($id){
return "https://play.google.com/store/apps/details?id=".$id;
}
function indiLinkAppStoreDaId($id){
//https://linkmaker.itunes.apple.com/it-it/details/1132202094?country=it&mediaType=ios_apps&term=pizzart&type=software
return "https://apps.apple.com/it/app/id$id?mt=8";
// return "https://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=$id&mt=8";
}
function background_curl($url, $postData = ""){
$cmd = "curl ".(TNX_SECURE_CURL?"":"--insecure ").escapeshellarg($url);
if($postData){
if(is_array($postData)) $postData = http_build_query($postData);
$cmd .= " -d ".escapeshellarg($postData);
}
exec($cmd." > /dev/null &");//If a program is started with this function, in order for it to continue running in the background, the output of the program must be redirected to a file or another output stream. Failing to do so will cause PHP to hang until the execution of the program ends.
}
function redirectWwwSslSeNecessario($ssl = null){
if($_GET['ignoraRedirectAutomatici']) return;//usato su ordinalo per forzare la pagina stampa fiscale a girare senza https
//per certbot letsencrypt abilito la navigazione http per attivare il certificato ssl
//carlo: commento perchè credo inutile (se il file esiste non passa da indi), da' invece problemi se il file non esiste (con tabellasitemapp si raddoppiano gli inserimenti, per la precisione sembra scattare la richiesta di aggiornamento ma questa viene poi ridirezionata non generando i record)
// if(strpos($_SERVER["REQUEST_URI"], ".well-known/acme-challenge") !== false) return;
if($_GET['forza_genera_apache_conf']) $ssl = null;
$redirect = false;
$redirectProtocol = $_SERVER['HTTPS'] != 'on' ? "http" : "https";
//$_SERVER['HTTP_HOST'] può essere vuoto se non mandano l'header (anche se questo è obbligatorio dalle specifiche HTTP/1.1)
//tesato che con http://tnx.it $_SERVER['SERVER_NAME'] = 'tnx.it';
$redirectHost = $_SERVER['SERVER_NAME'];
$redirectUri = $_SERVER['REQUEST_URI'];
//correzione SSL
if(!is_null($ssl)){
if($ssl && $redirectProtocol != 'https'){
$redirect = true;
$redirectProtocol = 'https';
}
else if(!$ssl && $redirectProtocol == 'https'){
$redirect = true;
$redirectProtocol = 'http';
}
}
// if($redirectHost == 'localhost') die;
if(!is_bool($GLOBALS['CONF']['attivaDominiTest'])) $GLOBALS['CONF']['attivaDominiTest'] = time() < strtotime($GLOBALS['CONF']['attivaDominiTest']);
if(!$GLOBALS['CONF']['attivaDominiTest'] && in_array($_SERVER['HTTP_HOST'], $GLOBALS['CONF']['domini_test_online'])){
if($GLOBALS['CONF']["link_sito"] && $GLOBALS['CONF']["link_sito"][0]){
//tolgo la prima cartella
$uri = substr($_SERVER['REQUEST_URI'], strpos($_SERVER['REQUEST_URI'], "/", 1));
$redirect = true;
$redirectHost = is_array($GLOBALS['CONF']["link_sito"]) ? $GLOBALS['CONF']["link_sito"][0] : $GLOBALS['CONF']["link_sito"];
$redirectUri = $uri;
}
else{
header("HTTP/1.0 404 Not Found");
die;
}
}
else if(substr($redirectHost, -1) != '.' /* www.intercultura.it. */ && substr($redirectHost, 0, 4) != 'www.' && !in_array($redirectHost, array("localhost", "web.rbx1.tnx.it", "web.gra1.tnx.it", "ww.w.weddingwithaview.biz")) && !preg_match("/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/", $redirectHost)){
//correzione www (necessario per tabellaSitemap perchè il front end ridirezionando genera sempre gli url relativi a www)
$puntiPrevisti = (substr($redirectHost, -6) == '.co.uk' || substr($redirectHost, -7) == '.com.br') ? 3 : 2;
$puntiTrovati = substr_count($redirectHost, ".");
if($puntiTrovati && $puntiTrovati != $puntiPrevisti){//ignoro domini senza punti
if($puntiTrovati != $puntiPrevisti-1){
// trigger_error("Controlla questo dominio se necessita di www: ".$redirectHost);
}
else{
$redirect = true;
$redirectHost = "www.".$redirectHost;
}
}
}
if($redirect){
if(false&&$_POST){
$dati = $redirectUri.str_replace(" ", "", print_r($_POST, true));
if(
strpos($redirectUri, "index.php?m=member&c=index&a=register&siteid=") === false
&& strpos($redirectUri, "index.php/api/Uploadify/preview") === false
&& strpos($redirectUri, "index.php?option=com_jdownloads&Itemid=0&view=upload") === false
&& strpos($redirectUri, "index.php?option=com_fabrik&c=import&view=import&filetype=csv&table=1") === false
&& strpos($redirectUri, "index.php?option=com_jce&task=plugin&plugin=imgmanager&file=imgmanager&method=form&cid=20") === false
&& strpos($redirectUri, "index.php?g=Comment&m=Widget&a=fetch") === false
&& strpos($redirectUri, "mobileapi/app:iphone/") === false
&& $dati != "Array([submit]=>Submit)"
&& $dati != "Array([pass]=>)"
&& $dati != "Array([name]=>owned.html)"
&& strpos($dati, "fputs(") === false
&& strpos($dati, "[wd]=>{if-A:print") === false
&& strpos($dati, "[login_time]=>999999999999") === false
&& strpos($dati, "org_apache_struts2_ServletActionContext") === false
&& strpos($dati, "[form_id]=>user_register_form") === false
&& strpos($dati, "symphony_xwo") === false
&& strpos($dati, "cfg_basedir") === false
&& strpos($dati, "xbshell") === false
&& strpos($dati, "[z0]") === false
&& strpos($dati, "[codelock_masterdata]") === false
&& strpos($dati, "wp-config.php") === false
&& strpos($dati, "wp.getUsersBlogs") === false
&& strpos($dati, "[filepath]=>upload/common/") === false
&& strpos($dati, "Execute(\"") === false
) trigger_error("Con questo redirect perderò i dati in POST: ".$dati);
}
// if($_POST && $GLOBALS['CONF']['dove_sono'] == 'loc') mailtnx("c@localhost", "Con questo redirect perderò i dati in POST", print_r($_POST, true));
header("HTTP/1.1 301 Moved Permanently");
header("Location: ".$redirectProtocol."://".$redirectHost.$redirectUri);
die;
}
}
function print_r_pulito($value, $return = false){
$value = print_r($value, true);
$value = preg_replace("/(\[([^\]]+)\] => )?Array\n\s*\(/", '$2', $value);
$value = preg_replace("/\n\s*\)\n/", "\n", $value);
// $value = preg_replace("/\[([^\]]+)\] => (.*)/", '$1 $2', $value);
$value = preg_replace("/\[([^\]]+)\] =>/", '[$1] ', $value);
if($return) return $value;
else echo $value;
}
function array_merge_recursive_replace ( array &$array1, array &$array2 ){
$merged = $array1;
foreach ( $array2 as $key => &$value ){
if ( is_array ( $value ) && isset ( $merged [$key] ) && is_array ( $merged [$key] ) ){
$merged [$key] = array_merge_recursive_replace ( $merged [$key], $value );
}
else{
$merged [$key] = $value;
}
}
return $merged;
}
function prezzo_format($float, $valutaDavanti = false){//Secondo la commissione europea il simbolo dell'euro può essere posizionato prima o dopo la cifra.[6] Il Manuale interistituzionale di convenzioni redazionali prescrive l'utilizzo del codice EUR o del simbolo € dopo la cifra, ad eccezione delle lingue inglese, irlandese, lettone e maltese. https://it.wikipedia.org/wiki/Simboli_di_valuta
$davanti = $valutaDavanti ? "€" : "";
$dietro = !$valutaDavanti ? "€" : "";
return $davanti.number_format($float, 2, ",", ".").$dietro;
}
function canUseDbPrivato(){
//controlla restrizioni su include, altrimenti devo usare la chiocciola e mi perdo degli errori che mi fanno perdere tempo
$open_basedir = ini_get('open_basedir');
if($open_basedir){
$target = dirname(dirname(__FILE__))."/INDI_privato";//non uso $CONF perchè usato anche da admin
$paths = explode(PATH_SEPARATOR, ini_get('open_basedir'));
foreach($paths as $p) if(strpos($target, $p) === 0){
return true;//di default c'è /home/httpd/html/pagine/indi
}
return false;
}
return true;
}
//con paretaio 6000 utenti, xcache non gestiva bene la situazione se chiamato ad ogni verifica (esauriva la memoria), così ok
function vemail_cache_get() {
$GLOBALS['vemailDomains'] = xcache_get('vemailDomains5');
}
function vemail_cache_set($usaCacheTime) {
if(!xcache_set('vemailDomains5', $GLOBALS['vemailDomains'], $usaCacheTime)){
trigger_error("La lista vemailDomains è troppo grande e non riesce a essere cachata");
}
}
if($_GET['vemail'] && $_GET['debugtnx']){
$printMe = vemail($_GET['vemail'], true);
echo '
'; echo $_GET['vemail'].''; die; } function vemail($e, $fullInfo = false, $faiConnessione = true) { // if(!$fullInfo) return false;//disattiva // if($_SERVER['TNX_SERVER_ID'] == "web2") $faiConnessione = false;//c'è la porta 25 bloccata e non c'è l'ipv6 (si potrebbe provare a fare fsockopen(gethostbyname($m)...) quando ce la sbloccano per forzare le connessioni in ipv4) /* DIFFERENZE CON LA VECCHIA VERSIONE: - la vecchia dava per buone tutte le email su un qualsiasi dominio esistente (risposta host "has address") - la nuova prova anche la connessione sul record mx, sul cname o sull'A record porta 25 */ /* Return codes: 0: appears to be a valid email 1: didn't match pattern of a valid email 2: looks valid by the pattern, but no DNS records found Try several things to make sure it is most likely valid: 1. preg_match it to make sure it looks valid 2a. If that passes, check for an MX entry for the domain 2b. If no MX, check for any DNS entry for the domain */ if (!preg_match('/^[a-z0-9.+\-_þ]+@(localhost|([a-z0-9-]+(\\.[a-z0-9-]+)+))$/i', $e, $grab)){ /* regexp di phpmailer6 //valida spazi, domini senza punto... es: //castaldo.ornella71 @gmail.com //gianni. naldi@libero.it //domejohn@hot //Nicola300@l if(preg_match( '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' . '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' . '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' . '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' . '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' . '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' . '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' . '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' . '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD', $e )){ trigger_error_to_email("carlo@tnx.it", "email rifiutata, ma corretta seconda regexp di phpmailer6: ".$e); } */ $return = array( 'errorCode' => 1, 'info' => 'Formato non valido' ); } else{ # $grab[0] is the whole address # $grab[1] is the domain $domain = $grab[1]; if($domain == 'localhost') $return = array("errorCode" => 0, "server" => $m); if(!is_array($GLOBALS['vemailDomains'])) $GLOBALS['vemailDomains'] = array();//altrimenti c'è comunque una cache sullo script if(isset($GLOBALS['vemailDomains'][$domain])){ $return = $GLOBALS['vemailDomains'][$domain]; } else{ $return = array(); //cecca 28/06/2021 - aggiungo domini da escludere il test connessione, ad esempio dda@dadgroup.com.ua non lo prendeva perchè il loro server si comporta in modo strano, ha risposto alla prima mail di prova con utente test di proposito, ma poi non risponde alla mail giusta.... bo!!! /* Jun 28 16:02:10 tre postfix/smtp[9738]: 58DB624CDEC: to=
'; if(!$printMe['errorCode']) echo "ok"; else echo "KO: ".$printMe['info']; echo '
'.__FILE__.":".__LINE__; echo '
"; echo "indiGetAllHosts:
"; print_r(indiGetAllHosts($hostConfig)); echo "
getHostForLang eng:
"; print_r(getHostForLang($hostConfig, "eng")); echo "
getHostForLang ita:
"; print_r(getHostForLang($hostConfig, "ita")); echo "
getBaseUrlForLang eng:
"; print_r(getBaseUrlForLang($hostConfig, "eng")); echo "
getBaseUrlForLang ita:
"; print_r(getBaseUrlForLang($hostConfig, "ita")); die; } function indiGetAllHostsLang(){//chiamata solo da indi global $CONF, $LANG; $return = $LANG; if($CONF['hostConfig']){ foreach($CONF['hostConfig'] as $v) if($v['LANG']) $return = array_merge($return, $v['LANG']); } return $return; } //genera codice alfanumerico function indi_genera_codice($lungh = "10", $soloLettere = false, $unSoloGruppoDiLettere = false){ $stringa = ""; // inizializzo stringa $aZ09 = range(65,90); if(!$unSoloGruppoDiLettere) $aZ09 = array_merge($aZ09, range(97,122)); if(!$soloLettere) $aZ09 = array_merge($aZ09, range(48,57)); for($i=0; $i<$lungh; $i++) $stringa .= chr($aZ09[mt_rand(0,count($aZ09)-1)]); return $stringa; } if ($_GET['indiCacheClear']) { $_SERVER["PHP_AUTH_USER"] = "tnx"; $_SERVER["PHP_AUTH_PW"] = "osmmc1003"; xcache_clear_cache(XC_TYPE_VAR); die("indiCacheClear ok"); } /* indiCache* cecca: funzioni per cache forte (tentando di evitare di caricare cake su frontend nelle parti più visitate) */ function indiCacheCheckDelayClear() { //per impostare una invalidazione della cache tra qualche secondo, nel caso vengano chiamate ripetutamente ad esempio dal salvataggio in admin_tnx if (!$GLOBALS["indiCache_attiva"]) return; $k = indiCacheBaseKey() . "-CLEAR-DELAY"; $timeDelayed = time() + 3; $retSet = indiCacheSet($k, $timeDelayed, 0); //mail("mceccarelli@demo.tnx.it", "indiCacheCheckDelayClear $k retSet($retSet) $timeDelayed", "", "From: cecca@tnx.it\n"); } function indiCacheCheckAutoClear($force = false) { global $DATI; /* cecca, richiamata ad ogni richiesta aggiungendo in fondo a boot01000_variabili_pagina.php serve per fare cache di mod_galleria per evitare i controlli sui file delle immagini quindi ogni tot tempo faccio un controllo con il find per capire se alcuni file sono modificati ed allora azzerare la cache |GALL| cioè tutte la cache di mod_galleria */ if (!$GLOBALS["indiCache_attiva"]) return; $debug = false; $info = is_indi() ? true : false; $tempoMinimoControlloSec = 60; if(substr($_SERVER['REMOTE_ADDR'], 0, 10) == '192.168.0.'){ $tempoMinimoControlloSec = 3; } $eseguireClear = false; $clearSoloGall = true; if ($force || $_GET['indiCacheClearSito'] == "force") { $eseguireClear = true; $clearSoloGall = false; } else { //controlo se richiesta di clear da admin_tnx $timeNow = time(); $k = indiCacheBaseKey() . "-CLEAR-DELAY"; $delayClear = indiCacheGet($k); if ($delayClear > 0 && $delayClear < time()) { indiCacheUnset($k); if ($info) d_info("indiCache clear da delay CLEAR perchè delayClear($delayClear ".date('d/m/Y H:i:s', $delayClear).") < time(".$timeNow.") diff(".($timeNow - $delayClear).")"); //mail("mceccarelli@demo.tnx.it", "indiCache clear da delay CLEAR perchè delayClear($delayClear) < time(".time().")", "", "From: cecca@tnx.it\n"); $clearSoloGall = false; $eseguireClear = true; } if (!$eseguireClear) { //allora controllo se fare check immagini $k = indiCacheBaseKey() . "-CLEAR-GALL"; if (!indiCacheIsset($k)) { if ($debug) echo "non esiste $k"; if ($info) d_info("indiCacheCheckAutoClear non esiste $k"); indiCacheSet($k, time(), 0); $eseguireClear = true; } else { //è passato almeno tot tempo? $diffMTimeSec = time() - indiCacheGet($k); if ($debug) echo "time attuale :".time().""; if ($debug) echo "time in cache:".indiCacheGet($k).""; if ($debug) echo "diff. in sec :$diffMTimeSec"; if ($diffMTimeSec > $tempoMinimoControlloSec) { if (is_ajax()) { if ($info) d_info("indiCacheCheckAutoClear NON faccio check con find perchè is ajax"); } else { if ($debug) echo "faccio check con find perchè maggiore di tempoMinimoControlloSec $tempoMinimoControlloSec"; if ($info) d_info("indiCacheCheckAutoClear faccio check con find perchè ($diffMTimeSec) maggiore di tempoMinimoControlloSec $tempoMinimoControlloSec"); if (indiCacheCheckAutoClearCheckWFind("uploads", $checkFile) || indiCacheCheckAutoClearCheckWFind("_files/immagini", $checkFile) ) { //ci sono files modificati dopo l'ultimo controllo azzera cache GALL if ($debug) echo "ci sono files modificati dopo l'ultimo controllo quindi devo fare clear GALL"; if ($info) d_info("indiCacheCheckAutoClear ci sono files modificati dopo l'ultimo controllo quindi devo fare clear GALL"); $eseguireClear = true; } indiCacheSet($k, time(), 0); } } else { if ($debug) echo "NON faccio check con find perchè minore di tempoMinimoControlloSec $tempoMinimoControlloSec"; if ($info) d_info("indiCacheCheckAutoClear NON faccio check con find perchè minore di tempoMinimoControlloSec $tempoMinimoControlloSec"); } } } } if ($debug) echo "eseguireClear = " . ($eseguireClear ? "true" : "false") . ""; if ($info) d_info("indiCacheCheckAutoClear eseguireClear = " . ($eseguireClear ? "true" : "false")); //if ($debug) echo "" . print_r($DATI, true) . ""; if ($eseguireClear) { if ($debug) echo "inizio clear"; if ($info) d_info("indiCacheCheckAutoClear inizio clear"); //mail("mceccarelli@demo.tnx.it", "indiCacheCheckAutoClear inizio clear", "", "From: cecca@tnx.it\n"); $_SERVER["PHP_AUTH_USER"] = "tnx"; $_SERVER["PHP_AUTH_PW"] = "osmmc1003"; //xcache_clear_cache(XC_TYPE_VAR); $list = xcache_list(XC_TYPE_VAR, 0); $list = $list["cache_list"]; if (!$clearSoloGall) { //tutte le var da togliere $kToDelBase = indiCacheBaseKey() . "|"; } else { //solo gall $kToDelBase = indiCacheBaseKey() . "|GALL|"; } $keysRemoved = array(); $keysNotRemoved = array(); foreach($list as $k=>$v) { if (substr($v["name"],0, strlen($kToDelBase)) == $kToDelBase) { $keysRemoved[] = $v["name"]; if ($debug) echo "indiCache clear unset " . $v["name"] . ""; if ($info) d_info("indiCache clear unset " . $v["name"]); xcache_unset($v["name"]); } else { $keysNotRemoved[] = $v["name"]; if ($debug) echo "indiCache clear NON unset " . $v["name"] . " perchè " . substr($v["name"],0, strlen($kToDelBase)) . " != " . $kToDelBase . ""; if ($info) d_info("indiCache clear NON unset " . $v["name"] . " perchè " . substr($v["name"],0, strlen($kToDelBase)) . " != " . $kToDelBase); } } if ($debug) echo "fine clear"; if ($info) d_info("indiCacheCheckAutoClear fine clear"); //mail("mceccarelli@demo.tnx.it", "indiCache clear removed not removed", print_r($keysRemoved, true) . "\n\n\n\n" . print_r($keysNotRemoved, true), "From: cecca@tnx.it\n"); } } function indiCacheCheckAutoClearCheckWFind($dir, $checkFile) { global $DATI; $checkDir = ($DATI["path_utente"] ? $DATI["path_utente"] : ".") . "/" . $dir; //$checkFile = "utenti/ibfor_com/cache/cache/.htaccess"; $cmd = "find " . $checkDir . " -newer " . $checkFile; //echo "" . $cmd . ""; $ret = shell_exec($cmd); //echo "" . $ret . ""; //echo "" . ($ret ? "true" : "false") . ""; return $ret ? true : false; } function indiCacheBaseKey() { global $DATI; $base = $DATI["base"]; if (!$base || $base == "/") { $base = $DATI["baseurl"]; } if (!$base) { $base = $_SERVER['SERVER_NAME']; } $base = str_replace("http://", "", $base); $base = str_replace("https://", "", $base); $base = str_replace("/", "", $base); if ($base == "demo.tnx.it") { $base = explode("/", $_SERVER['REQUEST_URI']); $base = $base[1]; } return "iC|" . $base; } function indiCache($catK /* VAR,DB,CAKE,GALL */, $varK, $func, $funcOnCached = null, $t = 86400 /* default 1 giorno */) { global $DATI; //cecca, funzione per cachare ritorno da una funzione, vedi function_base di shoppix riga 92 /* esempio: $uplContain = indiCache("VAR", "uplContain", function() { return cakeBoot("Upload")->attributiIndicizzazione ? array("Didascalia", "Altindexing", "Titleindexing") : array("Didascalia"); }); usata anche per velocizzare mod_galleria GALL ho aggiunto */ //scommentando questa riga sotto si ignroa completamente la cache (in caso di problemi strani...) //return $func(); if ($_GET['no_cache'] || !$GLOBALS["indiCache_attiva"] || $_GET["noIndiCache"]) return $func(); $debug = false; $info = true; $suffK = ""; if (!empty($_SESSION['othAuth'])) $suffK = "|ADMIN"; $varK .= $suffK; $k = indiCacheBaseKey() . "|" . $catK . "|" . $varK; //if ($debug) echo "*** indicache: k = $k"; if (indiCacheIsset($k)) { $ret = indiCacheGet($k); if ($debug) echo "*** indicache: GET $k"; if ($info) d_info("indiCache GET $k > sizeof(ret)=" . sizeof($ret)); //controllo se prenseti funzioni da eseguire $kfunc = indiCacheBaseKey() . "|FUNC|" . $varK; $retfunc = indiCacheGet($kfunc); if (is_array($retfunc)) { foreach($retfunc as $kf=>$vf) { if ($debug) echo "*** indicache: GET $k | func " . $vf["func"] . ""; if ($info) d_info("indiCache GET $k | indiCacheFunc func " . $vf["func"] . " start"); $vf["func"](...$vf["params"]); if ($info) d_info("indiCache GET $k | indiCacheFunc func " . $vf["func"] . " end"); } } if ($funcOnCached) { $funcOnCached($ret); } } else { if (!$GLOBALS["indiCache_currentKey_nestLevel"]) $GLOBALS["indiCache_currentKey_nestLevel"] = 0; $GLOBALS["indiCache_currentKey_nestLevel"]++; $GLOBALS["indiCache_currentKey"][$GLOBALS["indiCache_currentKey_nestLevel"]] = array("catK"=>$catK, "varK"=>$varK); $GLOBALS["indiCache_currentKey_t"][$GLOBALS["indiCache_currentKey_nestLevel"]] = $t; $ret = $func(); $retSet = indiCacheSet($k, $ret, $t); //if ($debug) echo "*** indicache: SET $k / retSet = $retSet"; if ($info) d_info("indiCache SET $k / retSet = $retSet / global k " . $GLOBALS["indiCache_currentKey"][$GLOBALS["indiCache_currentKey_nestLevel"]]["varK"] . " NL=" . $GLOBALS["indiCache_currentKey_nestLevel"]); $GLOBALS["indiCache_currentKey"][$GLOBALS["indiCache_currentKey_nestLevel"]] = null; $GLOBALS["indiCache_currentKey_t"][$GLOBALS["indiCache_currentKey_nestLevel"]] = null; $GLOBALS["indiCache_currentKey_nestLevel"]--; } return $ret; } function indiCacheFunc($catKvarK, $func, $params) { $debug = false; $info = true; if ($GLOBALS["indiCache_attiva"] && $GLOBALS["indiCache_currentKey"][$GLOBALS["indiCache_currentKey_nestLevel"]]) { $k = indiCacheBaseKey() . "|FUNC|" . $catKvarK["varK"]; $get = indiCacheGet($k); if (!$get) { $get = array(); } $get[] = array("func"=>$func, "params"=>$params); $retSet = indiCacheSet($k, $get, $GLOBALS["indiCache_currentKey_t"][$GLOBALS["indiCache_currentKey_nestLevel"]]); if ($debug) echo "*** indicachefunc: SET $k / retSet = $retSet"; if ($info) d_info("indiCacheFunc SET $k / retSet = $retSet"); } else { //if ($info) d_info("indiCacheFunc non faccio SET perchè richiamata da GET $k"); } } function indiCacheSet($k, $d, $t=0 /*0=forever*/){ if(is_object($d)){ trigger_error("Gli oggetti possono non essere gestiti correttamente, usare un/serialize. Con xcache 3.2.0 (server intercultura) passando un oggetto a xcache un oggetto viene generato un fatal."); return false; } // if(!$t){ // trigger_error("Questa variabile di cache non ha scadenza: ".$k); // } $return = xcache_set($k, $d, $t); if(!$return){ trigger_error("Non è stato possibile cachare la variabile ".$k." (troppo grossa?)"); } return $return; } function indiCacheGet($k){ if($_GET['no_cache']) return null; return xcache_get($k); } function indiCacheUnset($k){ return xcache_unset($k); } function indiCacheIsset($k){ return xcache_isset($k); } function indiCacheStat(){//funzione necessaria sia per autenticarsi, sia per cumulare i valori divisi tra i vari slot $_SERVER["PHP_AUTH_USER"] = "tnx"; $_SERVER["PHP_AUTH_PW"] = "osmmc1003"; $count = xcache_count(XC_TYPE_VAR); // [slots] => 8192 // [compiling] => 0 // [misses] => 155299 // [hits] => 688783 // [clogs] => 0 // [ooms] => 0 // [errors] => 0 // [cached] => 6661 // [deleted] => 0 // [gc] => 150 // [size] => 16777216 // [avail] => 13544552 // [can_readonly] => // [free_blocks] => Array $return = array( 'size' => 0, 'avail' => 0, ); for($i=0; $i<$count; $i++){ $blockStat = xcache_info(XC_TYPE_VAR, $i); foreach($return as $k=>$v) $return[$k] += $blockStat[$k]; } return $return; } //chiamata anche da admin function mittenteProblematico($fromEmailToCheck, $noCache = false){ global $DATI; // if($_SERVER['REMOTE_ADDR'] == '192.168.0.177') return true; // if($_SERVER['REMOTE_ADDR'] == '192.168.0.177') $fromEmailToCheck = "info@afdsaxcdasgag.it"; // $noCache = $_SERVER['REMOTE_ADDR'] == '192.168.0.177'; //questa funzione serve per poi cambiare il from (in indi_email o mod_form) nel caso questo non sia un indirizzo gestito dai nostri server //l'obiettivo è non essere marcati come spam, oppure bloccati del tutto nel caso di gmail quando vede un from @gmail.com: //tizio@gmail.com: bounced (host gmail-smtp-in.l.google.com[74.125.140.26] said: 550-5.7.1 [149.202.141.135 11] Our system has detected that this message is 550-5.7.1 not RFC 5322 compliant: 550-5.7.1 'From' header has non compliant domain name. 550-5.7.1 To reduce the amount of spam sent to Gmail, this message has been 550-5.7.1 blocked. Please visit 550-5.7.1 https://support.google.com/mail/?p=RfcMessageNonCompliant 550 5.7.1 and review RFC 5322 specifications for more information. p17si3642812wro.330 - gsmtp (in reply to end of DATA command)) if($DATI["ignora_mittenteProblematico"]) return false; $requestDomain = $_SERVER['SERVER_NAME']; $emailDomain = substr($fromEmailToCheck, strrpos($fromEmailToCheck, "@")+1); $emailDomainPrimoLivello = implode(".", array_slice(explode(".", $emailDomain), substr($emailDomain, -6) == ".co.uk" ? -3 : -2)); $key = "mittenteProblematico2".$emailDomainPrimoLivello; if(!$noCache && indiCacheIsset($key)) return indiCacheGet($key); // if($_SERVER['REMOTE_ADDR'] == '192.168.0.177') die; $errore = ''; /* vecchio controllo sul dominio, sostituito 11/4/22 $requestDomainIp = gethostbyname($requestDomain); if($requestDomainIp === $requestDomain){ //Returns a string containing the unmodified hostname on failure. $errore = "Il dominio della richiesta utente non esiste"; } $emailDomainIp = gethostbyname($emailDomain); if($emailDomainIp === $emailDomain){ //Returns a string containing the unmodified hostname on failure. $errore = "Il dominio della casella email non esiste"; } if($requestDomainIp !== $emailDomainIp){ $errore = "l'ip del dominio dell'email usata come from ($fromEmailToCheck > $emailDomain > $emailDomainIp) non corrisponde all'ip del sito visitato ($requestDomain > $requestDomainIp)"; } */ $isMittenteProblematico2022 = false; if(!in_array($emailDomainPrimoLivello, [ "localhost", "invoicex.it",//register: spf, dmark "cometaspa.com",//register: spf, dmark "vesuviotour.nl",//transip: spf "diesse.it",//aruba: spf "xpbikes.it",//aruba: spf "consegnapizza.it",//aruba: spf "intercultura.it",//register: spf "itinerevillas.com",//register: spf ])){ $nss = dns_get_record($emailDomainPrimoLivello, DNS_NS); if($nss !== false /* warning dns_get_record(): A temporary server error occurred */ && !in_array($nss[0]['target'], ['ns1.tnx.it','ns2.tnx.it','ns3.tnx.it'])){ $isMittenteProblematico2022 = "Name Server $emailDomainPrimoLivello ($fromEmailToCheck) non gestito da tnx: ".($nss?$nss[0]['target']:"- risposta dns vuota -"); } } // if($isMittenteProblematico2022 && function_exists("trigger_error_to_email")) trigger_error_to_email("c@localhost", "[mittenteProblematico] ".$isMittenteProblematico2022." - ".print_r($nss[0], true). // " https://mxtoolbox.com/SuperTool.aspx?action=dmarc%3a".$emailDomainPrimoLivello."&run=toolpage". // " https://mxtoolbox.com/SuperTool.aspx?action=spf%3a".$emailDomainPrimoLivello."&run=toolpage"); indiCacheSet($key, $isMittenteProblematico2022, 86400); return $isMittenteProblematico2022; } function rimuoviBomUtf8Csv($s){ if(substr($s,0,3)==chr(hexdec('EF')).chr(hexdec('BB')).chr(hexdec('BF'))){ return substr($s,3); }else{ return $s; } } if($_GET['isMittenteProblematico']){//inserire DOMINIO 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']."()'; die; } $CONF['disattivaSegnalazioniEmailTnx'] = !SEGNALAZIONE_ERRORI_TNX; //die(defined('INDI')); // $CONF['parametroDiTest'] = 'defaultBase'; // $CONF['loc']['parametroDiTest'] = 'defaultBaseLoc'; $CONF['indi_subversion'] = '0'; //introdotta il 11-06-09 //prevedo di poter evitare questo workaround in futuro $CONF['simulaMagicQuotesPhp5.2'] = function_exists("simulaMagicQuotesTnx"); //altri flah tutti cachati //is_production() //is_tnx() //is_online() //test x lingue $TXT['xxx']['test_txt'] = "Test XXX base.inc.php"; $TXT['ita']['test_txt'] = "Test ITA base.inc.php"; $TXT['xxx']['nessun_contenuto_da_visualizzare'] = "No content to display"; $TXT['ita']['nessun_contenuto_da_visualizzare'] = "Nessun contenuto da visualizzare"; //$TXT['test_txt'] = "Test GEN base.inc.php"; //prefissi aggiunti all'id per creare la chiave di $TXT quando vengono uniti $CONF['tipoLabelsTxt'] = 'Frontend'; $CONF['prefissoLabelsTxt'] = '';//di default vuoto perchè in base non veniva aggiunto niente e ci sono degli usi negli elementi, da luglio 2018 aggiunto in base e aggiornati gli elementi $CONF['tipoTestiTxt'] = 'Frontend'; $CONF['prefissoTestiTxt'] = 'testo_'; //variabili strane $indi_error_messages = NULL; //array dove vengono salvati gli errori importanti in locale $CONF['baseurl_locale'] = 'http://demo.tnx.it/'; //per alcuni hack $CONF['baseurl_secure'] = 'https://demo.tnx.it/'; //per raggiungere tutte le pagine con SSL $CONF['base'] = 'AUTO'; //es -> '/SITI/technosystem/'; $CONF['baseurl'] = 'AUTO'; //es -> 'http://www.techno-system.it/SITI/technosystem/'; $CONF['basetarget'] = ''; //es -> '_top'; $CONF['baseurl_port'] = 'AUTO'; //mette la porta solo se diversa da default $CONF['path_base'] = 'AUTO'; //es -> /tnx/www/html/www/indi/SITI/ramservizi/ $CONF['dir_base'] = "AUTO"; //es /tnx/www/html/www/indi/INDI_ver1.1/ $CONF['dominio_sito'] = "AUTO"; //dominio derivato dal base url $CONF['sito'] = 'AUTO'; //cartella di indi dove e' il sito //lo definisco qui invece che in boot00500_variabili_sito.php perchè non dipende dal sito e così posso usare mobile detect in indi.inc.php $CONF['dir_lib'] = dirname(realpath(__FILE__))."/_lib/"; $CONF["auth_password_solo_minuscole"] = true;//la controllo anche in admin_tnx, dovrebbe rimanere true solo per i siti vecchissimi, SE SI CAMBIA VANNO AGGIORNATE ANCHE LE PASSWORD NEL DATABASE ALTRIMENTI SI BLOCCANO I LOGIN DI CHI HA LE MAIUSCOLE NELLA PASSWORD $CONF['nome_programma'] = 'index.php'; //SSL //$CONF['SSL_baseurl'] = 'NO'; //converte il base in https:// //variabili interne NON SETTABILI GLOBALMENTE!!! $CONF["lingua_def"] = NULL; //se AUTO controlla la lingua del browser e la imposta se e' fra quelle di $LANG, senno' prende la prima di $LANG come default $CONF["autoredirect_a_lingua_browser"] = true;//quando si chiama la home senza parametri fa un (unico) autoredirect alla versione nella lingua del browser (se presente), se un sito ha più domini ogni lingua dovrebbe essere attiva su uno solo, altrimenti con questo parametro attivo si potrebbe andare a visitare la home in lingua diversa da quella del dominio $CONF["autoredirect_a_lingua_browser_disable_params"] = array("gclid");//lista parametri che, se presenti nell'url, disattivano la funzione autoredirect_a_lingua_browser $CONF['lingua_fallback'] = NULL; //lingua nel caso non ci sono traduzioni $CONF['lang_nome'] = NULL; //nome della lingua $CONF['lang'] = NULL; //$CONF['pagina'] = NULL; //da testare //$CONF['agg'] = NULL; //$CONF['agg_raw'] = NULL; $CONF['lang2'] = NULL; //codice 2 lettere $CONF['lang3'] = NULL; //codice 3 lettere jetbox $CONF['nazione'] = NULL; //nazione 2 lettere derivata dalla lingua del sito indi_nazione_from_lang() $CONF['lang_browser'] = NULL; //lingua 3 lettere derivata dal browser (tra quelle definite nel sito), vedi indi_lingua_browser() $CONF['pagina_inc'] = NULL; //variabili di default //indicizzazione ??? $CONF['nome_sito'] = 'default'; $CONF['desc_sito'] = ''; $CONF['key_sito'] = ''; //template di base $CONF['template'] = 'template.php'; //SE == NO / ajax / function non include niente //opzioni indi pagine $CONF['protetta'] = 'NO'; //solo con mod_auth attivo se messa a SI la pagina viene protetta $CONF['link_sito'] = NULL; //serve solo per carlo //cecca - deprecati entrambi - i server al 02/2018 sono indi.tnx.it / hap.tnx.it / hap.rbx1.tnx.it / hap.gra1.tnx.it / web.rbx1.tnx.it / web.gra1.tnx.it //$CONF['host_remoto_test'] = "indi.tnx.it"; //DEPRECATO //$CONF['dominio_test_online'] = "indi.tnx.it"; //serve per capire se sono in test o in produzione indi_is_production(); $CONF['domini_test_online'] = array("indi.tnx.it", "indi3.tnx.it", /*"secure.tnx.it", */"web.tnx.it", "web3.tnx.it", "hap.tnx.it", "hap.rbx1.tnx.it", "hap.gra1.tnx.it", "web.rbx1.tnx.it", "web.gra1.tnx.it", $_SERVER['SERVER_ADDR']/*per evitare di accedere a http://148.251.64.174/base/ */); $CONF['attivaDominiTest'] = false;//'2018-07-01';//data disattivazione automatica $CONF['sito_base'] = "base"; //sito base principale per checkout e altro $CONF['sito_admin'] = "admin"; //sito admin gestione siti //altre opzioni $CONF['indi_tpl_file'] = 'tpl.txt'; //viene messo in -> indi/{file_log} $CONF['indi_tpl_txt'] = '{lang}\t{key|e}'; //viene messo in -> indi/{file_log} $CONF['db_tab_log'] = 'indi_log'; // non implementata $CONF['dir_indi'] = 'indi/'; $CONF['path_rel'] = '../'; //subversione < 4 deprecato $CONF['dir_template'] = '_template/'; //deprecato $CONF['dir_include'] = '_includes/'; $CONF['dir_pagine'] = '_pagine/'; $CONF['dir_file'] = '_files/'; $CONF['dir_pic'] = '_pics/'; $CONF['dir_indi_img'] = '_pics/'; $CONF["dir_admin_tnx"] = 'admin_tnx/'; //admin tnx cache $CONF['dir_copy_sync'] = '../potta/'; //sito dal quale prendere la roba //deprecato $CONF['FILE_FSYNC'] = 'NO'; //se si forza la resincronizzazione di tutti i file in copia !non usare mai! $CONF['minifyCss'] = true; $CONF['minifyHtml'] = false; //Cache variabili $CONF['indi_apc'] = 'AUTO'; //abilita la cache o no in base alla presenza del modulo indi_apco xcache //NON UTILIZZATA $CONF['indi_apc_type'] = 'AUTO'; //memoria/filesystem in base alla disponibilità del modulo indi_apc / xcache $CONF['indi_apc_indice_menu']= 'AUTO'; //abilita la cache per l' indice del menu (in automatico quando ci sono piu' di 1000 pagine) $CONF['indi_apc_all_query'] = 'NO'; //abilita la cache per tutte le query $CONF['indi_apc_time'] = 60*30; //tempo di default di permanenza dei dati in cache (30 min), non viene applicato automaticamente a tutte le chiamate apc_store ma alla chiamata di molte $CONF['indi_apc_output'] = 'NO'; // cache x pagina di tutto il contenuto della pagina $CONF['indi_apc_output_time'] = 1800; // (30 min) oppure 0 per disabilitare $CONF['indi_apc_menu'] = 'NO'; //abilita la cache per tutti i menu $CONF['indi_apc_menu_time'] = 28800; //8 ore oppure 0 per disabilitare, cache relativa a tutte le funzioni indi //blocchi $CONF['block_include_dir'] = NULL; //(cartella o cartelle nelle quali cercare i blocchi) stringa separata da , o array $CONF['block_cache'] = "NO"; /* attiva la cache per i blocchi */ $CONF['block_cache_time'] = $CONF['indi_apc_time']; $CONF['block_cache_key'] = NULL; //variabile globale per invialidare la cache // CONFIGURAZIONE BASE SITO//###################################################### // REWRITE INDIRIZZI es x specificare alias fisso nel menu // $MENU["pagina"]["xxx"]["rew_alias"] = "sitemap"; $CONF['htmlDiversoPerDevice'] = false;//indica ai proxy che l'html varia in base all'user agent (header "Vary: User-Agent") // if(function_exists('indi_is_phone')){ if(is_indi()){ if(indi_is_phone()){ $CONF['elementiDevice'] = array('phone'); } else if(indi_is_tablet()){ $CONF['elementiDevice'] = array('tablet', 'desktop'); } else{ $CONF['elementiDevice'] = array('desktop'); } //è un array perchè prevedo di specificare anche una lista di fallback //$CONF['elementiDevice'] può essere sovrascritta dentro al sito per: //- usare la versione mobile sul tablet //- forzare una versione unica (desktop anche su mobile) //- attivare altre versioni (tablet, app, device futuristici...) che potrebbero essere in cdn, ma anche solo nel sito (indiIncludePathCustom) } $CONF['REW'] = 'NO'; // ver_1 ver_2 ver_3 ver_4 ver_5 ver_5 (usare solo ver_3/ver_5 gli altri non sono testati) $CONF['tabellaSitemap'] = false;//può essere true o "import" (import dopo la prima importazione si comporta come true) if($_GET['tabellaSitemapImportTest']) $CONF['tabellaSitemap'] = 'import'; $CONF["tabellaSitemapSostituisciSpazi"] = true;//altrimenti vengono encodati in %20 (firefox li decoda nella barra dell'indirizzo) $CONF["tabellaSitemapSostituisciCaratteriRiservati"] = true;//!*'();:@&=+$,/?#[], ci ho aggiunto "%" se false vengono encodati, ma i browser nella barra non li decodano comunque (firefox decoda !*'()[] nella barra dell'indirizzo, chrome nessuno), più aggressivo è $CONF['rew_alias_solo_alfanumerici'] $CONF["tabellaSitemapCarattereSostituzione"] = "-"; $CONF["tabellaSitemapLivelliGerarchia"] = 1; $CONF['tabellaSitemapIntervalloRigenerazione'] = 'background';//quando impostato disattiva la rigenerazione in tempo reale su salvataggio modello o cambio $MENU - se 'background' attiva la rigenerazione in background, se 0 = manuale, se int > 0 = intervallo in minuti con cui si inserisce la chiamata nel cron (?tabellaSitemapAggiorna=1) per informare il cliente $CONF['tabellaSitemapAggiornaReport'] = false;//invia email report a ogni rigenerazione $CONF['tabellaSitemapRewIdVarchar'] = false; $CONF['tabellaSitemapProvaAInterpretareUrlIso'] = false;//se c'era un vecchio sito potrei ricevere delle visite con url encodati iso, con questo parametro dopo aver interpretato l'url in utf8, provo a interpreatarlo anche in iso $CONF['tabellaSitemapProvaAInterpretareErroreECommerciale'] = false;//se c'era un (tux) fail su un sito precendete per cui google aveva indicizzato roba del tipo https://www.italiandesigncontract.com/it/Prodotti-lista/Egizia-Arte-del-Vetro-decorato/Collezione-Portadolci-&-portafrutta $CONF['tabellaSitemapLunghezzaMassimaUrl'] = false;//numero caratteri, escluso domnio, oltre a questa lunghezza ci sono da considerare un carattere per il separatore + n caratteri contatori (almeno 1+2 direi) $CONF['tabellaSitemapRedirectPermanentCentralizzati'] = false;//numero caratteri, escluso domnio, oltre a questa lunghezza ci sono da considerare un carattere per il separatore + n caratteri contatori (almeno 1+2 direi) //$CONF['tabellaSitemapRimuoviParole']['ita'] = array();lista di parole minuscole, xxx non previsto al momento // $CONF['loc']['tabellaSitemapRigeneraAutomaticamenteDaMenu'] = true; // $CONF['rem']['tabellaSitemapRigeneraAutomaticamenteDaMenu'] = false;//time() < mktime(23, 59, 0, 8, 8, 2018);//gestione migrazione pagina 404 > error_404 - 12/9/2023 cosa vuol dire?!? $CONF['tabellaSitemapRigeneraAutomaticamenteDaMenu'] = true; $CONF['rew_alias_solo_alfanumerici'] = false;//forza url con solo caratteri ascii $CONF['rew_alias_minuscolo'] = false;//solo caratteri minuscoli negli url //ARRAY "www.domino.ext/eventualeprimolivello" => $CONF //in locale mettere sempre il primo livello e non utilizzare $CONF['sito'] (non avvalorato quando siamo in admin) //serve in admin per generare i link (ad ese newsletter) e per chiamare tabellaSitemapAggiorna=1 al salvataggio //è pensato per avere lingue / pagine diverse su domini diversi e quindi poter fare genera_link cross-domain //funziona anche con la stessa lingua su più domini, in questo caso viene data precedenza a quello che si sta visitando $CONF['hostConfig'] = array(); //lista di id=>paramentro_get_per_forzare_il_server per chiamare tabellaSitemapAggiorna su tutti i server al salvataggio $CONF['hapConfig'] = array(); // $CONF['rem']['hostConfig'] = array( // 'www.ilparetaio.it' => array( // 'LANG' => array( // 'ita' => $LANG_NOME['ita'], // 'eng' => $LANG_NOME['eng'], // ), // 'CONF' => array( // 'google_webmaster' => 'KW_Yaj2qV5t-mnCtBRas3CkWLr91uSKxCGzy0BjsFNU' // ), // ), // 'www.equitationitalie.com' => array( // 'LANG' => array( // 'fra' => $LANG_NOME['fra'] // ), // 'CONF' => array( // 'google_webmaster' => 'bZ9jzex2NHW7pNFEC25DOdid7lkrfNQrMyvTyJEBdAY' // ), // ), // 'www.reitentoskana.de' => array( // 'LANG' => array( // 'ger' => $LANG_NOME['ger'] // ), // 'CONF' => array( // 'google_webmaster' => 'fxo0imCSCwZ1U0SJvYzAZlQZgIsqKpa61AJgCcd2eWI' // ) // ), // ); // $CONF['loc']['hostConfig'] = array( // 'demo.tnx.it' => array( // 'LANG' => array( // 'ita' => $LANG_NOME['ita'], // 'eng' => $LANG_NOME['eng'], // ), // ), // 'demo2.tnx.it' => array( // 'LANG' => array( // 'fra' => $LANG_NOME['fra'], // 'ger' => $LANG_NOME['ger'] // ), // ), // ); $indiRedirectDaFare = array(); $CONF['usaNuovaDbQ'] = true;//$CONF['dove_sono'] == 'loc' || $_GET['debugtnx'] || !mt_rand(0,9); $CONF['usaMysqli'] = PHP_MAJOR_VERSION >= 7;//su php7 (auto_prepend_file) sono state ridefinite le funzioni mysql_* che chiamano mysql_tnx_* // $CONF['usaMysqli'] = $_SERVER['REMOTE_ADDR'] == '192.168.0.177'; $CONF['indiHreflang'] = false;//genera "link rel=alternate hreflang=" nell'head, vedi https://support.google.com/webmasters/answer/189077?hl=it non è true di default perchè non tutti i siti hanno tutte le pagine in tutti le lingue (vesuvio) $CONF['indiCanonical'] = true;//true usa un genera_link che toglie tutti i parametri (opzionale indiCanonicalUseRewId), stringa si può passare un link già generato. genera "link rel=canonical href=" nell'head, vedi https://support.google.com/webmasters/answer/139066?hl=it $CONF['indiCanonicalUseRewId'] = true;//usa il rewId nella generazione del link canonical (credo vada usato sempre nel caso ci siano delle varianti con url personalizzato...) $CONF['generaLinkNoRewriteGet'] = array();//questi parametri in get non vengono "trasformati" nella versione rewrite (nome:val), può servire per le librerie javascript che li controllano (creato per adwords con gclid che veniva trasfomato in gclid:xxx da autoredirect_a_lingua_browser, ma poi non usato) $CONF['generaLinkFallbackLang'] = "";//se impostato, quando viene fatto un genera_link a una pagina inesistente viene fatta una ricerca anche in questa seconda lingua (utile per i siti multilingua) $CONF['generaLinkPersistentGet'] = array();//lista di paramentri che vengono automaticamente aggiunti a ogni genera link prendendoli dall'url corrente $CONF['REW5_monolang'] = false; $CONF['redirects_genera_link'] = "genera_link_email";//funzione usata per generare i link dei redirects, impostata a genera_link in base dal 15/7/2016 $CONF['sito_ssl'] = false; //flag per specificare che il sito è solo in ssl quindi se si chiama senza ssl viene fatto redirect $CONF['sito_ssl_escludi'] = array(); //pagine di un sito ssl che devono girare in http (viceversa usare forza_ssl sul menu) - ho fatto questo array perchè il redirect http > https del sito viene fatto molto "in alto", dove non posso avere ancora tutte le info $MENU / pagine dinamiche, queste pagine devono essere richiate con url tecnico p=xx (attivaUrlTecnico = true) $CONF['forza_ssl'] = false; //da usare sulla singola pagina ($MENU[$pagina]['xxx']['forza_ssl']) per forzarla in ssl su un sito sito_ssl=false (viceversa usare sito_ssl_escludi), i link alla pagina verranno fatti in ssl, se viene chiamata senza ssl sarà fatto un 301 $CONF['sslDaContenitore'] = false;//la pagina funzionerà sia in ssl che senza, il link seguirà il protocollo usato nella pagina in cui viene fatto il genera_link, serve per le pagine di servizio (ajax) nei siti ibridi $CONF['correggiSslBaseurl'] = true;//se il baseurl non è corretto viene corretto in fase di genera_link, in casi particolari (esercenti.ordinalo.net in ssl che genera link a vari siti non ssl), può essere necessario disattivarlo $CONF['REW_alias_automatico'] = 'NO'; // SI/NO serve per prendere l' alias direttamente dal nome della pagina o rew_alias se definito $CONF['REW_alias_gerarchico'] = 'NO'; // SI/NO struttura padre/figli con nome della pagina o rew_alias o rew_alias se definito $CONF['REW_alias_gerarchico_force_ver_1'] = FALSE; // forza la versione vecchia del rewrite gerarchico fatto x fritegotto //errori gravi in sovraimpressione locali, fatti con il trigger error $CONF['loc']['indi_error'] = 'SI'; $CONF['rem']['indi_error'] = 'NO'; $CONF['loc']['indi_sadmin'] = 'SI'; $CONF['rem']['indi_sadmin'] = 'NO'; $CONF['indi_404'] = 0; //se 1 significa che una pagina ha tornato 404 //varie da cambiare solo in maniera globale dentro indi.inc.php $CONF['OUT'] = 'SI'; //visualizza l' output del sito (non cambiare) $CONF['INDI'] = 'NO'; // se attiva l' indicizzazione avanzata (non usata per ora) $CONF['INDI_write'] = 'NO'; //non scrive se non e' stato preso indi ??? $CONF['HCSS'] = 'NO'; //(Def: NO) nasconde il testo con class descrizione (rimosso) $CONF['SESS'] = 'SI'; //disabilito sessioni pagina e cookie di tracciamento ATTENZIONE: questo parametro era settato a NO su $MENU per pagine ajax e 404 ma non poteva funzionare in quanto viene controllato da $CONF! $CONF['cookie_id_utente'] = false;//imposta un $_COOKIE["id_utente"] con id utente numerico $CONF["INDI_BUFFER"] = true;//se false disabilita il buffering di indi, quindi tutte le operazioni di templating / cache $CONF['DURATA_SESSIONE'] = NULL; //forzo la durata della sessione ad un tempo specifico di secondi, normalmente se non settato equivale alla durata della sessione di navigazione, se specifico questo parametro la sessione è salvata nella cartella di indi $CONF['SESSIONI_IN_CARTELLA_INDI'] = false;//per spostare i file di sessione nella cartella indi/sessions (si attiva anche in caso di DURATA_SESSIONE) $CONF['TKD'] = 'NO'; //Abilita i template del titolo, mkey e mdesk (obsoleto) $CONF['ERD'] = 'NO'; //??? IN SVILUPPO Nelle sotopagine Eredita la configurazione dalle pagine precedenti ??? in sviluppo $CONF['DTXT'] = 'NO'; //abilita testi dinamici ???? da fare $CONF['IMAGE_SWAP'] = 'NO'; //abilita la sostituzione automatica delle immagini ???? $CONF['MEDIA'] = 'screen'; //non cambiare $CONF['STAMPA'] = 'NO'; //non cambiare $CONF['STAT_trace'] = 'SI'; // $CONF['STAT'] = 'NO'; //???(Def: NO) $CONF['STAT_log'] = 'NO'; //log delle pagine viste - 23/3/21 ho allungato la sessione a 1 giorno, disattivo per evitare dimensioni enormi $CONF['OUTPUT_HEADER'] = 'SI'; //header automatici di indi $CONF['OUTPUT_FILTRO'] = 'SI'; //abilita / disabilita tutta la sostituzione dell' output TPL MTK TXT $CONF['OUTPUT_HEAD_BODY_JS_CSS'] = 'SI'; //non effettua sostituzioni automatiche nell header nel body $CONF['OUTPUT_TPL'] = 'SI';//non effettua sostituzioni delle variabili di template {variabile} $CONF['FORM_ANTISPAM'] = 'SI'; //aggiunge automoaticamente un sistema di antispam a tutti i form $CONF['GENERA_CAMBIO_VALUTE'] = 'SI'; // $CONF['VERSIONING'] = 'AUTO'; //AUTO gestione versione sito automatico, se specificato un numero viene gestita manualmente $CONF['CAKE'] = 'NO'; //cake php $CONF['mod_newsletter'] = 'NO'; $CONF['mod_prodotti'] = 'NO'; $CONF['mesi_stampati_calendari'] = 0; $CONF['adminTnxPagineConParagrafi'] = false; $CONF['adminTnxSezioniHabtm'] = false; $CONF['pagine_dinamiche2_titolo_html'] = false; $CONF['adminTnxEditParagrafiCliente'] = false; $CONF['permettiDatiUtenteMaiuscoli'] = false; $CONF['indiIncludePathCustom'] = ""; $CONF['dirIconeParagrafiAggiuntive'] = ""; $CONF["auth_wrapper_funct_plain_password"] = false;//invia a auth_wrapper_funct_logout la password in chiaro (invece di fare il doppio md5) $CONF['rem']['indi_max_execution_time'] = 600; $CONF['loc']['indi_max_execution_time'] = 30; //$CONF['indi_max_query_time'] = 10; //tempo massimo esecuzione query da fare $CONF['statisticheSitiIndi'] = true;//abilita statistiche su database indi_admin //refresh database globale ogni ora o in base alla modifica di indi oppure con $CONF['admin_refresh_db'] = true; $CONF['admin_refresh_db_time'] = 60*60*12; //DEPRECATO CARLO (PER ORA) - 3 ore oppure forzato con indi_admin_refresh_db=1 //sistema di sync database $CONF['admin_db_sync'] = 'NO'; $CONF['admin_db_sync_auto'] = 'NO'; //oppure forzo da url ?indi_admin_db_sync=1 $CONF['admin_db_sync_file'] = NULL; //file esterno che contiene la configurazione //CDN TNX Content delivery network // per ora e' supportato in $DATI['files:_pics/aaa/bbb.js'] = 'VIS,CDN' $CONF['rem']['cdn_baseurl'] = 'https://cdn.tnx.it/'; $CONF['loc']['cdn_baseurl'] = 'https://'.$_SERVER['SERVER_NAME'].'/cdn/';//inserito SERVER_NAME perchè se visito demo4.tnx.it e carico da demo.tnx.it arriva un avviso di sicurezza (caricamento risorse da rete interna, chrome 11/2025) //$CONF['rem']['cdn_baseurl'] = 'http://510642500.r.cdn77.net/cdn/'; /* link per la cdn TNX */ // $CONF['cdn_basepath'] = '../cdn/'; /* mi riferisco sempre alla root del sito*/ $CONF['cdn_basepath'] = 'AUTO'; //CDN Esterna PULL (per uso con contenuti statici, dentro less usare) $CONF['cdn_static_active'] = 'NO'; /* modifica il funzionamento delle funzioni di indi per tornare i link ai file statici sulla CDN, es: gall, vis_img, ecc) */ $CONF['cdn_baseurl_static'] = ''; /* 'http://510642500.r.cdn77.net/#CARTELLA#/' esempio indirizzo della CDN con tecnologia PULL */ $CONF['indi_remove_xss'] = "SI";//carlo: attiva per tutti (con alert se scatta) dal 30/05/2023 // MODULI $CONF['mod_snippet'] = 'SI'; //snippet html $CONF['mod_auth'] = 'NO'; //autenticazione $CONF['mod_carr'] = 'NO'; //carrello $CONF['mod_html'] = 'NO'; //cd-rom $CONF['mod_menujb'] = 'NO'; $CONF['mod_menujb2'] = 'NO'; //in lavorazione $CONF['mod_pagine_dinamiche'] = 'NO'; //pagine dinamiche ultima versione $CONF['mod_xfiles'] = 'NO'; //xfiles $CONF['mod_smarty'] = 'NO'; //smarty $CONF['mod_grab'] = 'NO'; //grab interno $CONF['mod_disponibilita'] = 'NO'; //disponibilita $CONF['mod_moduli'] = 'NO'; $CONF['mod_templating'] = 'NO'; $CONF['mod_apache_autoconf'] = 'SI'; $CONF['mod_apache_autoconf_file'] = 'AUTO'; //prende l' indi.inc.php se non specificato //es: //$CONF["apache:xxx.it"] = "DOMINIO_2_LIVELLO => SI"; //DOMINIO //prende solo il secondo livello come ServerName e mette alias www //$CONF["apache:www.dominio_con_redirect.it"] = "REDIRECT => xxx.it"; //redirect altro dominio //variabili globali sempre disponibili $CONF['tag_dir'] = 'AUTO'; //setta la direzione del testo, usato solo per arabo, non viene forzato per ele altre lingue (rtl / ltr) $CONF["meta_favicon"] = "AUTO"; //aggiunge meta favicon automatica favicon.com, in base al browser e ai file presenti .ico o .gif $CONF["meta_noindex"] = "AUTO"; //aggiunge il meta per non indicizzare il sito o la pagina, gestione automatica in idex1.1 //user agent old $CONF['ua'] = 'AUTO'; //ua2 fi3 ie6 ie7, ecc $CONF['ua2'] = 'AUTO'; //motore di rendering -> ie/ge/wk/op //user agent new $CONF['ua_version'] = 'AUTO'; //3/4/5, ecc $CONF['ua_engine'] = 'AUTO'; //wk/ge/ie/op $CONF['ua_name'] = 'AUTO'; //ie/fi/ch/sa $CONF['ua_system'] = 'AUTO'; //mac/windows/linux $CONF['force_no_redirect'] = 'NO'; //se messo a si non viene effettuato nessun redirect $CONF["png_fix"] = "NO";//fix per le png su ie6 /old //LESS $CONF["less_dynamic_css_vars"] = ""; //contine solo le variabili, viene messo in testa in caso di file unico, viene usato per tutti i file in caso di lessSeparate (modificandolo vengono rigenerati tutti) $CONF["less_dynamic_css"] = ""; //variabile contenente codice css direttamente processato dal less, che fa' rigenerare il file $CONF["less_dynamic_css_array"] = array(); //come sopra, ma qui posso usare delle chiavi associative per non aggiungere più volte lo stesso css $CONF["less_dynamic_css_array_before"] = array(); //come sopra, ma messa prima di tutto il less stringa, viene utilizzata per fare i file lessSeparate $CONF["less_dynamic_css_after"] = ""; //come sopra, ma messa in coda al file (stringa) $CONF["less_dir"] = false;//nome sottocartella per i css (in base "css") senza slash finale - NON LA POSSO CAMBIARE, ALTRIMENTI NEI VECCHI SITI SALTANO I PATH RELATIVI DELLE IMMAGINI $CONF["deferAllScript"] = false;//aggiunge defer alle inclusioni di tipo "JS" ed estrae dalla pagina gli script inline per inserirli in file js deferred messo in preclode $CONF["minifiedJsDir"] = "js"; $CONF["deferredInlineScriptDir"] = "js"; $CONF["less_import_dir"] = NULL; $CONF["less_filename"] = NULL; //il nome calcolato da indi del file less (NON IMPOSTARE MAI !) $CONF["less_evita_generazioni_contemporanee"] = true; $CONF["lessNodeJs"] = false;//FUNZIONA SOLO IN LOCALE: abilita il nuovo less che è più stringente e ha la sourceMap $CONF["noMinJs"] = false; //mettere a true per disabilitare la minizzazione dei javascript //HEADER $CONF['indi_cache_header'] = 'AUTO'; //manda in automatico gli header della cache ( cache_default | cache_form | cache_no | cache_reset | cache_si ) $CONF['cakeBootCache'] = false; // attiva il salvataggio di modelli e controller bootati su variabile $GLOBALS, così in caso di doppi boot riduce utilizzo di memoria $CONF['loadCssViaJavascript'] = false; // attiva il caricamento dei css esterni tramite javascript in modo che non vengano considerate block rendering resources /* decide come impostare gli header per la cache del browser, se la cache e' attiva indipendentemente dalla sessione se la sessione e' partita e' necessario stare attenti che la cache sia disabilitata nella procedura di autenticazione, quando e' attivo il carrello e comunque in ogni caso in cui e' stata richiamata indipendentemente da INDI il controllo e' fatto prima dell' output del sito, per cambiarlo e' necessario usare le variabili apposite no_cache comportamento se la sessione e' attiva se la sessione e' iniziata da indi -> private se c'e' un post -> private se c'e' un se le sessione e' stata messa a mano con sessionstart e non era partita quella di indi -> off comportamento se la sessione non e' attiva (non ancora possibile su indi) se ci sono post o get -> private auto -> on se autenticati o con carrello -> off in caso di post -> private si altera cambiando la variabile corrente private, max-age=300, pre-check=10800 no-store, no-cache, must-revalidate, post-check=0, pre-check=0 no-cache */ //opzioni log $CONF['LOG'] = 'SI'; //attiva la funzione di log $CONF['file_log_setup'] = 'setup.log'; //viene messo in -> indi/{file_log_setup} // SOVRASCRITTURE OUTPUT //DEPRECATA !!!!!!! funzione personalizzata che viene eseguita prima della costruzione della pagina $CONF['pre_page_action'] = NULL; //DEPRECATA !!!!!!!!! funzione personalizzata che viene eseguita dopo l' esecuzione della pagina $CONF['out_page_action'] = NULL; //per modificare al volo il contenuto del sito usare queste funzioni //pre_module_action_function, pre_module_action_function, pre_page_function, post_page_function, pre_output_function, post_output_function //e-mail principale del sito alla quale vanno tutte le form e le mail generate dal sito di default $CONF['email'] = 'staff@tnx.it'; $CONF['STAT_email'] = 'NO'; //statistiche in e-mail $DATI[email/cc/copia] email_statistiche - DISATTIVATO 10/11/2020 d'accordo carlo / cecca / andrea (rischio spam, clienti che rispondono senza levarlo...) $CONF['STAT_email_pagine'] = 'NO'; //log pagine sulle e-mail in uscita indirizzate a $DATI[email/cc/copia] $CONF['email_smtp'] = 'NO'; $CONF['email_smtp_server'] = 'smtp.tnx.it'; $CONF['email_smtp_port'] = '25'; $CONF['email_smtp_username'] = NULL; $CONF['email_smtp_password'] = NULL; $CONF['email_phpmailer'] = 'SI'; // $CONF['email_phpmailer'] = 'NO'; $CONF['email_log'] = 'SI'; //logga tutte le mail inviate nel file di log $CONF['email_hack_sendmail'] = 'SI'; //imposta come mittente di ritorno della mail l' indirizzo from_email automatico, ovvero quello del sito $CONF['email_html'] = 'NO'; //se mettere le e-mail in html $CONF['email_html_row'] = NULL; //se mettere le e-mail in html con template vuoto $CONF['email_from_generico'] = "no-reply@tnx.it";//da usare in caso il mittente richiesto non sia validato da mittenteProblematico $CONF['email_html_template'] = NULL; $CONF['email_html_css_file'] = NULL; $CONF['email_allegato_file'] = NULL; //vedi sito test -> email $CONF['email_encode'] = 'AUTO'; //auto in base all' encode del sito $CONF['email_indi'] = 'staff@tnx.it'; //email del core dove vanno le mail di servizio / errore / ecc $CONF['email_return'] = 'postmaster@tnx.it'; //e-mail di ritorno per tutte le mail inviate con email_hack_sendmail=NO $CONF['email_cc'] = NULL; // $CONF['email_bcc'] = NULL; // $CONF['email_copia'] = 'AUTO'; //manda una copia di tutte le mail a $DATI[email] se non specificato niente, oppure a $DATI[email_copia] se il destinatario e' diverso da $DATI[email_copia] $CONF['email_spy'] = 'SI'; //DEPRECATO vecchio parametro, manda una copia di tutte le mail non indirizzate a $DATI[email], mettendo $DATI[email/cc/copia] in cc usando le funzioni e-mail di indi $CONF['email_debug'] = null; //ATTENZIONE email_debug_cliente va definito obbligatoriamente nell'indi, se si definisce dentro una pagina non funziona $CONF['email_debug_cliente'] = null;//da admin indiDATI: chiave "email_debug_cliente" non trovata // $CONF['rem']['email_debug_cliente'] = "tizio@email.com"; //se voglio far testare un sito online bloccando tutte le email $CONF['loc']['email_debug_cliente'] = 'staff@tnx.it';// nel caso in cui il sito è in locale e viene visitato dall' esterno //######## MAPPA GOOGLE ############################################# $CONF['google_maps_api_key_server_to_server'] = 'AIzaSyCEXyYGcdo7YQc-idxl-UwcyQQU5VM2uTo';//questa non ha protezione, usare solo in chiamate server to server (solo geocoding al momento) $googleMapsApiKey = 'AIzaSyATeyTQXZajqzRX6hRuN0LosLupJoOO7Jk';//chiave protetta con referer $CONF['google_maps_api_key'] = $googleMapsApiKey; //DEPRECATE: //per remoto c'era questa (sia per map_google_api, sia per google_maps_api): 'ABQIAAAAdoftIffWWOn9SGHGdq71rRSoSoFqociufEnZejON7n7PsjO17xRlFxK7d2nBtfSGz4aJ3D7BpgFkwA' $CONF['map_google_api'] = $googleMapsApiKey; $CONF['google_maps_api'] = $googleMapsApiKey; // $CONF['google_analytics_version'] = 1;//deprecato, da versione 4 c'è indi_is_google_analytics4() che deduce versione da ID monitoraggio (G-XXXXXXXXXX) // $CONF["rem"]["google_analytics"] = ''; //di solito non si attiva in locale, ma c'è comunque un controllo. vedi prossima proprietà per disattivarlo // if($_SERVER['REMOTE_ADDR'] == '192.168.0.177') $CONF["loc"]["google_analytics"] = 'G-1BEKTPGCLX'; $CONF["google_analytics_test_locale"] = false;//solo per gli eventi, per le pageview basta settare $CONF["loc"]["google_analytics"] $CONF["google_analytics_api_secret"] = "";//necessaria per eventi s2s (Admin > Data Streams > choose your stream > Measurement Protocol > Create) $CONF["facebookPixelId"] = ""; // Id del pixel di facebook $CONF["facebookApiConversionToken"] = ""; // Token per attivare le conversioni tramite APIConversion $CONF["apiConversionTestEventCode"] = ""; // Codice per test eventi $CONF["apiConversionTestEventNames"] = []; // Array con i nomi degli eventi da testare (es. ["PageView", "AddToCart", "Purchase"]). Se vuoto viene attivato sempre. https://www.facebook.com/business/help/402791146561655?id=1205376682832142 //######## google_analytics (versioni <4 deprecate a luglio 2023) ############################################# //https://developers.google.com/analytics/devguides/collection/gajs // $CONF['google_analytics_script'] = ""; //https://developers.google.com/analytics/devguides/collection/analyticsjs#the_javascript_measurement_snippet // $CONF['google_analytics_script2'] = ""; //GOOGLE ANALYTICS 4 //hhttps://developers.google.com/analytics/devguides/collection/ga4 //(un codice identico viene utilizzato anche dalla versione "universal analytics", deprecata 1/7/23: https://developers.google.com/analytics/devguides/collection/gtagjs/pages#manual_pageviews) //data-tnx="anonymized" viene (veniva) controllato dal gestore cookie per capire se verrà inizializzato con 'anonymize_ip': true //rimosso: gtag('config', '{google_analytics}', { 'anonymize_ip': true }); //However, in GA4, the IP anonymization feature is automatically enabled and cannot be modified by users. This means that GA4 does not store the IP addresses of users by default. $CONF['google_analytics_script4'] = " "; $CONF['matomo_script'] = " "; //######## googletagmanager ############################################# $CONF['googletagmanager_head_script'] = " "; $CONF['googletagmanager_post_open'] = ''; //######## facebook pixel ############################################# // $CONF['pixel_head_script'] = " // "; //nodefer perchè facebookPixelId contiene il timestamp e se combinato con deferAllScript verrà generato un file .js ad ogni visita $CONF['pixel_head_script'] = " "; //######## HEADER ############################################# //meta base $CONF['title'] = '{menu_txt|e} - {nome_sito|e}'; $CONF['mkey'] = ''; $CONF['mdesc'] = ''; //meta default $CONF['mautore'] = 'www.tnx.it - Siti Internet Poggibonsi - Siena - Toscana - Italia'; $CONF['mcharset'] = 'AUTO'; //automaticamente in base alla lingua o UTF-8 per forzarlo $CONF["mcharset_head"] = "SI"; //aggiunge il tag , se NO deve essere dentro .htaccess $CONF['mfavicon'] = 'AUTO'; //automaticamente fasvicon.ico //per abilitare la classe nascondi class hol //$DATI['javascript:hol();'] = 'VIS'; // SMS //###################################################### $CONF['sms_fornitore'] = 'Mobyt';//Mobyt / Aimon $CONF['sms_from_email'] = '';//per copie / segnalazioni $CONF['sms_username'] = ''; $CONF['sms_password'] = ''; // FLASH //###################################################### $CONF['loc']['file:_files/expressInstall.swf'] = 'SYNC'; //SWF CHE ESEGUE L'EXPRESS INSTALL SE CE N'E' BISOGNO // FILE AUTOMATICI DI BASE //###################################################### $CONF['file:_files/common.js'] = 'SYNC,VIS'; //NON TOCCARE PIU $CONF['file:_files/screen.css'] = 'VIS'; //NON TOCCARE PIU $CONF['file:_pics/null.gif'] = 'COPY'; //NON TOCCARE PIU $CONF['file:_includes/lang_xxx.inc.php'] = 'COPY'; //LINGUE BASE (non include) $CONF['file:_template/vuoto.php'] = 'COPY'; //LINGUE BASE (non include) $CONF['file:_template/popup.php'] = 'COPY,VIS'; //template con lo stile e gli include del sito, senza header e footer //altre cose $CONF['file:_pics/no_img.jpg'] = 'COPY'; //IMMAGINE NULLA // PAGINA SOSTITUTIVA (SARà MESSA COME LINK NASCOSTO NEI SITI PER L'INDICIZZAZIONE) $CONF['loc']['file:_files/siti_internet_x.css'] = 'COPY'; //IL CSS $CONF['loc']['file:_template/siti_internet_x.inc.php'] = 'COPY'; $CONF['loc']['file:_pics/siti_internet_x_bg_color.gif'] = 'COPY'; $CONF['loc']['file:_pics/siti_internet_x_header.gif'] = 'COPY'; $CONF['loc']['file:_pics/siti_internet_x_footer.gif'] = 'COPY'; $CONF['loc']['file:_pics/siti_internet_x_logo.jpg'] = 'COPY'; $MENU['siti_internet_x']['xxx']['menu_txt'] = 'TNX'; $MENU['siti_internet_x']['xxx']['template'] = 'siti_internet_x.inc.php'; $MENU['siti_internet_x']['xxx']['menu_pagina_vis'] = 'NO'; //$CONF['file:_files/swfobject.js'] = 'COPY:VIS'; non serv più ora è nel common //###################[ JETBOX ]####################### //riscrivo nell' output gli indirizzi delle immagini, per editor tinymce $CONF['jetbox'] = 'SI'; //sempre attivo per ora ma non usato $CONF['jetbox_tab_file'] = 'tnx_downloads'; $CONF['jetbox_tab_img'] = 'images'; $CONF['jetbox_webimage_src'] = 'webimages/'; $CONF['jetbox_webimage_dst'] = 'jb/webimages/'; $CONF['jetbox_webimage_safe'] = 'jb/jb/webimages/'; $CONF['jetbox_webfiles_src'] = 'webfiles/'; $CONF['jetbox_webfiles_dst'] = 'jb/webfiles/'; $CONF['jetbox_webfiles_safe'] = 'jb/jb/webfiles/'; $CONF['jb_tinymce_type'] = 'tnx'; //deprecata (solo per compat) //###################[ INDICIZZAZIONE ]####################### //SEME per pseudorandomizzazione NON CAMBIARE MAI $CONF['SEME'] = 'indi'; //per tenere fisso il random, inizializza con la funzione srand() //INDICIZZAZIONE BASE $CONF['title_sep'] = ' - '; $CONF['mkey_sep'] = ', '; $CONF['mdesc_sep'] = '. '; //parole chiavi relative alle pagine e' la variabile che di solito si usa per la parola chiave $CONF['key'] = ''; //###################[ LINK TNX ]####################### //ATTENZIONE - usare funzione $CONF['ita']['vis_tnx'] = ' Realizzato da tnx.it - {vis_tnx_parole|random} {vis_tnx_agg}'; $CONF['xxx']['vis_tnx'] = 'Powered by tnx.it - {vis_tnx_parole|random} {vis_tnx_agg}'; $CONF['ita']['vis_tnx_small'] = 'Powered by tnx.it {vis_tnx_agg}'; $CONF['xxx']['vis_tnx_small'] = 'Powered by tnx.it {vis_tnx_agg}'; $CONF['ita']['vis_tnx_sitoturismo'] = 'powered by Sito Turismo - tnx.it {vis_tnx_agg}'; $CONF['xxx']['vis_tnx_sitoturismo'] = 'powered by Sito Turismo - tnx.it {vis_tnx_agg}'; $CONF['ita']['vis_tnx_parole'] = 'Siti Internet,Realizzazione siti internet,Creazione siti web'; $CONF['xxx']['vis_tnx_parole'] = 'Web Design'; /*######################## TIP NAVIGAZIONE ################################ nel sito mettere:
"; $printMe = mittenteProblematico("info@".$_GET['isMittenteProblematico'], true); 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 '