1. Rinnovabili – Competenza dei Comuni – Selezione delle imprese autorizzate alla realizzazione degli impianti – Non sussiste – Convenzione onerosa tra Comune e impresa – Non ha alcuna efficacia vincolante sulle Amministrazioni competenti alla valutazione di impatto ambientale – Conferenza di servizi – Autorizzazione unica
2. Rinnovabili – Normativa regionale incostituzionale – Inapplicabilità  – Provvedimento emanato in immediata ed esclusiva applicazione di normativa regionale dichiarata incostituzionale – Illegittimità .
3. Valutazione d’impatto ambientale – Ampia discrezionalità  tecnica e amministrativa della P.A.- Non mero giudizio tecnico – Insindacabile dal G.A. salvo ipotesi di manifesta illogicità , travisamento dei fatti, mancanza e/o inadeguatezza dell’istruttoria.
 

  1. In linea generale non può riconoscersi, in base alle norme vigenti in materia di impianti per la produzione di energia da fonti rinnovabili, una potestà  dei Comuni di denegare il relativo nulla-osta ovvero di selezionare l’impresa titolata alla realizzazione degli impianti sul proprio territorio; conseguentemente, l’eventuale convenzione onerosa sottoscritta tra il Comune e l’impresa non ha alcuna efficacia vincolante per le Amministrazioni che, a vario titolo, sono chiamate ad esprimersi in sede di valutazione d’impatto ambientale e nella conferenza di servizi preordinata al rilascio dell’autorizzazione unica, ai sensi dell’art. 12, D.Lgs. n. 387/2003.
  2. La normativa regionale dichiarata  incostituzionale  non può più essere assunta quale parametro di legittimità  dei provvedimenti impugnati; ne consegue l’illegittimità  dell’atto il cui presupposto è costituito esclusivamente dall’applicazione delle norme regolamentari dichiarate incostituzionale.
  3. La giurisprudenza ha ripetutamente chiarito che, nel rendere il giudizio di valutazione d’impatto ambientale, ed a maggior ragione nell’effettuare la verifica preliminare, l’Amministrazione esercita un’amplissima discrezionalità  tecnica, censurabile solo in presenza di macroscopici vizi logici o di travisamento dei presupposti (cfr. Trib. Sup. acque pubbliche, 11 marzo 2009, n. 35; Cons. Stato, Sez. VI, 19 febbraio 2008 n. 561; Id., Sez. IV, 5 luglio 2010 n. 4246). In ogni caso, la valutazione d’impatto ambientale non costituisce un mero giudizio tecnico, suscettibile in quanto tale di verificazione sulla base di oggettivi criteri di misurazione, ma presenta al contempo profili particolarmente intensi di discrezionalità  amministrativa, sul piano dell’apprezzamento degli interessi pubblici in rilievo e della loro ponderazione rispetto all’interesse all’esecuzione dell’opera, apprezzamento che è sindacabile dal giudice amministrativo soltanto in ipotesi di manifesta illogicità  o travisamento dei fatti, nel caso in cui l’istruttoria sia mancata, o sia stata svolta in modo inadeguato, e sia perciò evidente lo sconfinamento del potere discrezionale riconosciuto all’Amministrazione (cfr. Cons. Stato, Sez. V, 22 giugno 2009 n. 4206; idem, Sez. V, 21 novembre 2007 n. 5910; idem., Sez. VI, 17 maggio 2006 n. 2851; idem, sez. IV, 22 luglio 2005 n. 3917; cfr. da ultimo TAR Puglia, Bari, sez. I, 14 maggio 2010 n. 1897).
                                                                                         * * *
Vedi Cons. di Stato, sez. V, sentenza 27 giugno 2012 n. 3782 – 2012, ordinanza 18 aprile 2012, n. 1486; ric.  1930 – 2012 
* * *        

N. 01369/2011 REG.PROV.COLL.
N.   01537/2009  01537/2009 REG.RIC.

REPUBBLICA ITALIANA
IN NOME DEL POPOLO ITALIANO
Il Tribunale Amministrativo Regionale per la Puglia
(Sezione Prima)
ha pronunciato la presente
SENTENZA
sul ricorso numero di registro generale 1537 del 2009, proposto da Inergia s.p.a., rappresentata e difesa dall’avv. Germana Cassar, con domicilio eletto presso l’avv. Maurizio Di Cagno in Bari, via Nicolai, 43;

contro
Regione Puglia, rappresentata e difesa dall’avv. Maria Liberti, con domicilio eletto in Bari, lungomare Nazario Sauro, 31-33;
Comune di Stornarella, non costituito;

nei confronti di
Daunia Wind s.r.l. e Margherita s.r.l., rappresentate e difese dagli avv.ti Antonio Mescia e Giuseppe Mescia, con domicilio eletto presso l’avv. Vincenzo Resta in Bari, via Piccinni, 210;
Fortore Energia s.r.l. e Sorgenia s.p.a., non costituite;

per l’annullamento
della determinazione n. 267 del 18 maggio 2009 del Dirigente dell’Ufficio Programmazione, V.I.A. e Politiche Energetiche della Regione Puglia, avente ad oggetto la verifica di assoggettabilità  a v.i.a. del progetto di impianto eolico da realizzare nel Comune di Stornarella, proposto da Inergia s.p.a.;
del parere reso dal Comitato v.i.a. nella seduta del 5 maggio 2009;
delle determinazioni nn. 265, 266 e 268 del 18 maggio 2009 del Dirigente dell’Ufficio Programmazione, V.I.A. e Politiche Energetiche della Regione Puglia, aventi ad oggetto rispettivamente i progetti presentati da Fortore Energia s.p.a., Daunia Wind s.r.l. e Sorgenia s.p.a.;
ove occorra, del regolamento regionale n. 16 del 2006;
Visti il ricorso e i relativi allegati;
Visti gli atti di costituzione in giudizio della Regione Puglia, di Daunia Wind s.r.l. e di Margherita s.r.l.;
Viste le memorie difensive;
Visti tutti gli atti della causa;
Relatore nell’udienza pubblica del giorno 18 maggio 2011 il dott. Savio Picone e uditi per le parti i difensori, avv.ti Germana Cassar, Maria Liberti e Giuseppe Mescia;
Ritenuto e considerato in fatto e diritto quanto segue.
 

FATTO
La società  ricorrente impugna la determina n. 267 del 18 maggio 2009, con la quale la Regione Puglia ha stabilito di esonerare soltanto parzialmente dalla valutazione d’impatto ambientale il progetto per la realizzazione di un parco eolico, costituito da quattordici aerogeneratori, nel comune di Stornarella.
Impugna altresì, nei limiti del suo interesse, le determinazioni nn. 265, 266 e 268 del 18 maggio 2009, con cui la Regione Puglia ha provveduto in ordine all’assoggettamento a valutazione d’impatto ambientale dei progetti presentati rispettivamente da Fortore Energia s.p.a., Daunia Wind s.r.l. e Sorgenia s.p.a. su aree contigue.
Deduce motivi così riassumibili:
1) violazione degli artt. 8 e 14 del regolamento regionale n. 16 del 2006, violazione dell’art. 16 della legge regionale n. 11 del 2001 ed eccesso di potere per difetto d’istruttoria ed illogicità : le determinazioni nn. 265, 266 e 268 del 18 maggio 2009 sarebbero viziate, in quanto nessuna delle società  beneficiarie (Fortore Energia s.p.a., Daunia Wind s.r.l. e Sorgenia s.p.a.) avrebbe sottoscritto la convenzione con il Comune di Stornarella;
2) violazione degli artt. 21-octies e 21-nonies della legge n. 241 del 1990, violazione del regolamento regionale n. 16 del 2006 e della legge regionale n. 11 del 2001: la Regione Puglia avrebbe erroneamente ravvisato la formazione del silenzio-assenso (ai fini dell’esclusione della v.i.a.) sull’istanza presentata da Daunia Wind s.r.l.;
3) violazione dell’art. 11 del regolamento regionale n. 16 del 2006, violazione dell’art. 16 della legge regionale n. 11 del 2001 ed eccesso di potere per disparità  di trattamento, difetto d’istruttoria ed illogicità : la Regione avrebbe illegittimamente omesso di effettuare la valutazione d’impatto ambientale dei collegamenti alla rete di trasmissione nazionale, per ognuno dei quattro progetti contigui, ordinando alle imprese proponenti di realizzare un unico cavidotto ed un’unica sottostazione;
4) eccesso di potere per difetto d’istruttoria ed illogicità : la Regione avrebbe illegittimamente giudicato incompatibili due degli aerogeneratori proposti, in considerazione dell’impatto acustico e del pericolo di gittata in caso di rottura;
5) violazione della legge regionale n. 11 del 2001 ed eccesso di potere per sviamento ed illogicità : la Regione avrebbe illegittimamente deciso di sottoporre a v.i.a. gran parte degli aerogeneratori, sulla base di una valutazione integrata con altri progetti ed in considerazione di aspetti estranei alla tutela delle risorse ambientali;
6) in subordine, illegittimità  del regolamento regionale n. 16 del 2006 per violazione del d. lgs. n. 387 del 2003 e degli artt. 3, 41, 97 e 117 della Costituzione, nella parte in cui introduce il parametro “P” di affollamento massimo nel territorio comunale, in relazione al cosiddetto P.R.I.E. (piano regolatore degli impianti eolici).
Si è costituita la Regione Puglia, chiedendo il rigetto dell’impugnativa.
Le controinteressate Daunia Wind s.r.l. e Margherita s.r.l. (quest’ultima subentrata alla prima nella titolarità  dell’autorizzazione n. 266 del 18 maggio 2009) hanno notificato ricorso incidentale, volto ad ottenere l’annullamento della convenzione stipulata il 28 marzo 2007 tra Inergia s.p.a. ed il Comune di Stornarella e della presupposta deliberazione del Consiglio comunale di Stornarella n. 5 del 22 febbraio 2007.
Le parti hanno svolto difese in vista della pubblica udienza del 18 maggio 2011, nella quale la causa è passata in decisione.
DIRITTO
1. La ricorrente Inergia s.p.a., con istanza del 30 marzo 2007, ha richiesto alla Regione Puglia l’autorizzazione per la realizzazione di un parco eolico costituito da quattordici aerogeneratori, nel Comune di Stornarella.
Con l’impugnata determinazione n. 267 del 18 maggio 2009, la Regione ha deciso l’esonero parziale dalla valutazione di impatto ambientale, soltanto per cinque delle quattordici pale progettate.
2. Con il primo motivo, la ricorrente afferma che le determinazioni nn. 265, 266 e 268 del 18 maggio 2009 (aventi ad oggetto la verifica di assoggettabilità  a v.i.a. sui progetti di Fortore Energia s.p.a., Daunia Wind s.r.l. e Sorgenia s.p.a.) sarebbero viziate, in quanto le società  controinteressate non avrebbero sottoscritto la convenzione con il Comune di Stornarella, ai sensi degli artt. 8 e 14 del regolamento regionale n. 16 del 2006.
Il motivo è infondato.
In disparte la sopravvenuta declaratoria d’incostituzionalità  che ha travolto l’intero regolamento regionale n. 16 del 2006, di cui si dirà  appresso, va ribadito in linea generale che non può riconoscersi, in base alle norme vigenti in materia di impianti per la produzione di energia da fonti rinnovabili, una potestà  dei Comuni di denegare il relativo nulla-osta ovvero di selezionare l’impresa titolata alla realizzazione degli impianti sul proprio territorio (si rinvia, sul punto, ai numerosi precedenti di questa Sezione: per tutte, sentenze 8 marzo 2008 n. 530 e 24 settembre 2009 n. 2105).
La convenzione onerosa stipulata il 28 marzo 2007 dal Comune di Stornarella con Inergia s.p.a. non ha alcuna efficacia vincolante per le Amministrazioni che, a vario titolo, sono chiamate ad esprimersi in sede di valutazione d’impatto ambientale e nella conferenza di servizi preordinata al rilascio dell’autorizzazione unica, ai sensi dell’art. 12 del d. lgs. n. 387 del 2003 (in questo senso, su fattispecie identica: TAR Puglia, Bari, sez. I, 14 settembre 2010 n. 3470).
àˆ conseguentemente improcedibile, per difetto d’interesse, il ricorso incidentale proposto da Daunia Wind s.r.l. e Margherita s.r.l. avverso la convenzione stipulata tra Inergia s.p.a. ed il Comune di Stornarella e la presupposta deliberazione del Consiglio comunale di Stornarella n. 5 del 22 febbraio 2007.
3. àˆ inammissibile, per difetto d’interesse, il secondo motivo, con il quale la ricorrente lamenta che la Regione Puglia avrebbe erroneamente ravvisato la formazione del silenzio-assenso (ai fini dell’esclusione della v.i.a.) sull’istanza presentata da Daunia Wind s.r.l. in area contigua.
Invero, proprio con la gravata determinazione n. 266 del 18 maggio 2009, la Regione Puglia ha annullato in autotutela il silenzio-assenso asseritamente formatosi sulla verifica di assoggettabilità  a v.i.a. ed ha poi valutato, in modo autonomo, il progetto di Daunia Wind s.r.l. sotto il profilo della compatibilità  ambientale.
Sotto tale profilo, pertanto, difetta in capo all’odierna ricorrente l’interesse a contestare l’iter procedimentale relativo all’istanza della società  controinteressata.
4. Con il terzo motivo, si afferma che la Regione Puglia avrebbe illegittimamente omesso di effettuare, per ognuno dei quattro progetti contigui, la valutazione d’impatto ambientale sulle opere di collegamento alla rete di trasmissione nazionale, ordinando viceversa alle imprese proponenti di realizzare un unico cavidotto ed un’unica sottostazione.
La censura, laddove s’incentra sulla presunta violazione dell’art. 11 del regolamento regionale n. 16 del 2006, va respinta.
Come è noto, l’intero regolamento regionale n. 16 del 2006 è stato annullato dalla Corte costituzionale con la sentenza n. 344 del 26 novembre 2010, unitamente all’art. 3, comma 16, della legge regionale n. 40 del 2007, che a detto regolamento rinviava integralmente.
Dunque, anche nel presente giudizio la normativa regionale dichiarata incostituzionale non può più essere assunta quale parametro di legittimità  dei provvedimenti impugnati.
Il motivo è poi infondato quanto all’asserito eccesso di potere per disparità  di trattamento, difetto d’istruttoria ed illogicità .
La scelta della Regione Puglia, che in sede di verifica di assoggettabilità  a v.i.a. ha ritenuto di prevedere la costruzione di un’unica linea di collegamento e di un’unica sottostazione, destinate ad essere condivise dalle quattro imprese interessate alla realizzazione di parchi eolici contigui, appare in sè del tutto ragionevole ed immune dai vizi genericamente affermati da parte ricorrente, la quale tenta invano di dimostrare la superiorità  del proprio progetto di collegamento elettrico, sulla base di considerazioni di carattere tecnico che attengono al merito insindacabile dell’azione amministrativa, salvi eventuali profili di manifesta illogicità  o travisamento, nella specie non dimostrati.
5. Ugualmente infondato nel merito è il quarto motivo, con cui la ricorrente deduce eccesso di potere per difetto d’istruttoria ed illogicità , in relazione al giudizio espresso dalla Regione sugli aerogeneratori indicati in progetto ai nn. 9 e 14.
La Regione ha rilevato, per entrambi, la vicinanza di edifici agricoli, posti a distanza inferiore a trecento metri, ed ha giudicato non soddisfacente la relazione tecnica prodotta dalla società  ricorrente, per gli aspetti dell’impatto acustico e del pericolo di gittata in caso di rottura.
La giurisprudenza ha ripetutamente chiarito che, nel rendere il giudizio di valutazione d’impatto ambientale, ed a maggior ragione nell’effettuare la verifica preliminare, l’Amministrazione esercita un’amplissima discrezionalità  tecnica, censurabile solo in presenza di macroscopici vizi logici o di travisamento dei presupposti (cfr. Trib. Sup. acque pubbliche, 11 marzo 2009, n. 35; Cons. Stato, sez. VI, 19 febbraio 2008 n. 561; Id., sez. IV, 5 luglio 2010 n. 4246). Ed in ogni caso, la valutazione d’impatto ambientale non costituisce un mero giudizio tecnico, suscettibile in quanto tale di verificazione sulla base di oggettivi criteri di misurazione, ma presenta al contempo profili particolarmente intensi di discrezionalità  amministrativa, sul piano dell’apprezzamento degli interessi pubblici in rilievo e della loro ponderazione rispetto all’interesse all’esecuzione dell’opera, apprezzamento che è sindacabile dal giudice amministrativo soltanto in ipotesi di manifesta illogicità  o travisamento dei fatti, nel caso in cui l’istruttoria sia mancata, o sia stata svolta in modo inadeguato, e sia perciò evidente lo sconfinamento del potere discrezionale riconosciuto all’Amministrazione (cfr. Cons. Stato, sez. V, 22 giugno 2009 n. 4206; Id., sez. V, 21 novembre 2007 n. 5910; Id., sez. VI, 17 maggio 2006 n. 2851; Id., sez. IV, 22 luglio 2005 n. 3917; cfr. da ultimo TAR Puglia, Bari, sez. I, 14 maggio 2010 n. 1897).
Nella fattispecie, neppure la ricorrente ha contestato, in fatto, l’esistenza degli edifici e la loro vicinanza all’impianto. La Regione ha congruamente motivato il proprio giudizio, che peraltro non comporta affatto il definitivo diniego alla realizzazione dei due aerogeneratori, ma si limita a disporre lo svolgimento della procedura di valutazione d’impatto ambientale.
Donde l’infondatezza, per tale parte, del ricorso.
6. Gli ultimi due motivi possono essere esaminati congiuntamente e vanno accolti.
6.1. Gli aspetti presi in considerazione dalla Regione Puglia e posti a base della decisione sfavorevole qui impugnata (in particolare della motivazione, come pubblicata sul B.U.R.P., pagg. 15037 – 15041) esulano dall’ambito oggettivo d’interesse della valutazione della motivazione ambientale.
Con le determinazioni nn. 265, 266, 267 e 268 del 18 maggio 2009, la Regione ha esaminato contestualmente i progetti presentati da Daunia Wind s.r.l., Fortore Energia s.p.a., Inergia s.p.a. e Sorgenia s.p.a. su aree contigue e li ha rimaneggiati, in modo del tutto arbitrario, riducendo per ognuno di essi il numero di aerogeneratori esenti da v.i.a., dopo averne rilevato la reciproca interferenza.
Nel complesso, la Regione ha rilevato situazioni di “conflitto” per trentotto aerogeneratori su quarantasei.
Tuttavia, le eventuali sovrapposizioni tra impianti proposti da soggetti diversi avrebbero dovuto trovare attenzione in una fase procedimentale successiva e distinta, ossia nella conferenza di servizi preordinata al rilascio dell’autorizzazione unica, ai sensi dell’art. 12 del d. lgs. n. 387 del 2003.
Il richiamo di tali circostanze all’interno della decisione sulla valutazione d’impatto ambientale costituisce sintomo di uso sviato del potere da parte della Regione, che ha illegittimamente giudicato incompatibili, dal punto di vista ambientale, la realizzazione di aerogeneratori che, in sè considerati e per sua stessa ammissione, non determinerebbero alcun impatto ambientale negativo.
6.2. Infine, il provvedimento impugnato è illegittimo laddove dispone un’ulteriore riduzione degli aerogeneratori ammissibili (pagg. 15042 – 15043 della motivazione), da sette a cinque, in applicazione del cosiddetto parametro di controllo introdotto dall’art. 14 del regolamento regionale n. 16 del 2006, che limita il numero massimo di impianti autorizzabili nel territorio del Comune di Stornarella.
Come detto, l’intero regolamento regionale n. 16 del 2006 è stato annullato dalla Corte costituzionale con la sentenza n. 344 del 26 novembre 2010.
Ne consegue, anche per tale parte, l’illegittimità  dell’atto impugnato, il cui presupposto è costituito esclusivamente dall’applicazione delle norme regolamentari dichiarate incostituzionali (cfr. amplius TAR Puglia, Bari, sez. I, 5 gennaio 2011 n. 2).
7. In conclusione, il ricorso è parzialmente accolto e, per l’effetto, è annullata la determinazione n. 267 del 18 maggio 2009, nei sensi di cui in motivazione.
Restano salvi, per la ricorrente, gli effetti favorevoli e non contestati della determina di screening, ossia l’esonero dalla valutazione d’impatto ambientale per cinque aerogeneratori su quattordici.
Il ricorso incidentale proposto da Daunia Wind s.r.l. e Margherita s.r.l. è improcedibile.
Può disporsi l’integrale compensazione delle spese di giudizio, data la complessità  delle questioni affrontate.
P.Q.M.
il Tribunale amministrativo regionale per la Puglia (Sezione prima) definitivamente pronunciando sul ricorso, come in epigrafe proposto, lo accoglie in parte, nei sensi di cui in motivazione.
Dichiara improcedibile il ricorso incidentale.
Spese compensate.
Ordina che la presente sentenza sia eseguita dall’Autorità  amministrativa.
Così deciso in Bari nella camera di consiglio del giorno 18 maggio 2011 con l’intervento dei magistrati:
 
 
Giuseppina Adamo, Presidente FF
Savio Picone, Referendario, Estensore
Francesco Cocomile, Referendario
 
 
 
 

 
 
L’ESTENSORE IL PRESIDENTE
 
 
 
 
 

DEPOSITATA IN SEGRETERIA
Il 19/09/2011
IL SEGRETARIO
(Art. 89, co. 3, cod. proc. amm.)

/////////// SEARCH ///////////
var g_aEng;
var g_loc;

// Initialize namespace, use existing context
var searchshield = searchshield || {};

searchshield.clockUrl;

// constants
searchshield.SCORE_SS_SAFE = 1;
searchshield.SCORE_SS_CAUTION = 2;
searchshield.SCORE_SS_WARNING = 3;
searchshield.SCORE_SS_BLOCK = 4;
searchshield.SCORE_SS_VERISIGN = 7;

searchshield.BLOCK_NONE = 0;
searchshield.BLOCK_NORMAL = 1;
searchshield.BLOCK_PHISH = 2;
searchshield.BLOCK_YAHOO = 3;

searchshield.XPLCHECK_RESULT_SEV_NONE = 0;
searchshield.XPLCHECK_RESULT_SEV_LOW = 1;
searchshield.XPLCHECK_RESULT_SEV_MED = 2;
searchshield.XPLCHECK_RESULT_SEV_BLOCK = 3;

searchshield.VERISIGN_SPLIT_NOTEST = 0;
searchshield.VERISIGN_SPLIT_TESTA = 1;
searchshield.VERISIGN_SPLIT_TESTB = 2;

searchshield.needLivePhishCheck = false;
searchshield.allowedSites = [];
searchshield.enabled = function (doc)
{
var result = searchshield.avgCallFunc(doc, ‘GetSearchEnabled’);
return (result == ‘1’ ? 1 : 0);
};
searchshield.init = function (doc)
{
if ((doc == null) || (doc.location == null) || (doc.location.href.search(/about:/) != -1))
return;

if (!searchshield.enabled(doc))
return;

if (!g_aEng)
g_aEng = searchshield.Search.prototype.detectEngine(doc.location.href);

if (!g_aEng)
return;

// init search object (not declared or is null)
if (typeof xplSearch === ‘undefined’)
{
// global
xplSearch = new searchshield.Search();

// reset the links added flag
xplSearch.new_links = false;

xplSearch.doc = doc;
xplSearch.href = xplSearch.doc.location.href;
xplSearch.uri = searchshield.parseLink(xplSearch.href);

xplSearch.engine = new searchshield[g_aEng+’SearchEngine’](xplSearch)
xplSearch.addEngine(xplSearch.engine);

searchshield.launch(doc);
}

if (doc.location.href != g_loc)
{
g_loc = doc.location.href;
if ((typeof xplSearch !== ‘undefined’) && (xplSearch != null))
searchshield.launch(doc);
}
};
searchshield.launch = function (doc)
{
// IE specific check
searchshield.quirksMode = (self.top.document.compatMode == ‘BackCompat’);
searchshield.docMode = parseInt(navigator.userAgent.split(‘MSIE’)[1]);

if ((self === top) && (self.document === doc))
{
if (!xplSearch.engine)
return;

// set verdict display config
xplSearch.engine.setRatingsConfig(doc);

// init the alert popup
searchshield.initPopupAlert(doc);

if (xplSearch.engine.type != ‘inline’)
{
// save function reference for memory clean up later
var fn = function(event){avglsflyover.hide(null)};

//hide flyover if these events occur
window.detachEvent(‘onscroll’, fn);
window.attachEvent(‘onscroll’, fn);

doc.detachEvent(‘onkeydown’, fn);
doc.attachEvent(‘onkeydown’, fn);
}

// only start monitor on top doc
searchshield.avgPageMonitor.start(doc);
}

return;
};

// search monitors and processors – doc is always top most document
searchshield.avgPageMonitor = {
previousUrl: null,
start: function(doc){
searchshield.avgPageMonitor.stop();
searchshield.avgPageMonitor.process(doc);
searchshield.avgPageMonitor.timeoutID = window.setTimeout(function(){searchshield.avgPageMonitor.start(doc)}, 1000);
},
process: function(doc){
var currentUrl = doc.location.href;
var refresh = 0;
if (this.previousUrl != currentUrl) {
this.previousUrl = currentUrl;
avgreport.scanResult(doc, currentUrl);
refresh = (xplSearch.engine.name == ‘google’) ? 1 : 0;
}
searchshield.avgProcessSearch(doc, refresh);
},
stop: function(){
if (searchshield.avgPageMonitor.timeoutID)
{
window.clearTimeout(searchshield.avgPageMonitor.timeoutID);
delete searchshield.avgPageMonitor.timeoutID;
}
}
};

searchshield.avgProcessSearch = function (doc, refresh)
{
// doc may be about:Tabs or about:Blank
if (!doc)
return;

if (!searchshield.enabled(doc))
return;

if (!searchshield.clockUrl)
searchshield.clockUrl = searchshield.avgCallFunc(doc, ‘GetIconUrl’, ‘0’);

xplSearch.clockUrl = searchshield.clockUrl

if (!xplSearch.engine)
return;

// get result links
xplSearch.links = [];
var links = searchshield.avgGetSearchLinks(doc, xplSearch.engine, refresh);

searchshield.needLivePhishCheck = false;
for (var i=0; i < links.length; i++) { var isPhishing = searchshield.avglsCheckandUpdate(links[i]); if (isPhishing) searchshield.needLivePhishCheck = true; } if (searchshield.needLivePhishCheck) { var prev = '1'; if ( xplSearch.engine.type == 'inline' ) prev = '0'; searchshield.avgCallFunc(doc, 'GetPhishingResults', prev); searchshield.needLivePhishCheck = false; } else if (links.length > 0 && xplSearch.engine.type != ‘inline’)
{
searchshield.avgCallFunc(doc, ‘FinalScanComplete’);
}

// attach click handlers for popup alerts
doc.body.detachEvent(“onclick”, searchshield.blockClick);
doc.body.attachEvent(“onclick”, searchshield.blockClick);

doc.body.detachEvent(“ondblclick”, searchshield.blockClick);
doc.body.attachEvent(“ondblclick”, searchshield.blockClick);
};
searchshield.avgGetSearchLinks = function (doc, engine, refresh)
{
if (!doc.body)
return;

var alltags = doc.body.getElementsByTagName(‘a’);
for (var i = 0; i < alltags.length; i++) { if ( !refresh ) { // no checked test if refreshing - google if (alltags[i].getAttribute('avglschecked')) continue; } // mark search result anchor so it isn't processed repeatedly alltags[i].setAttribute('avglschecked', '1'); // ignore linked resources if (alltags[i].tagName == 'LINK') continue; // ignore in-page bookmarks and javascript if ((!alltags[i].href) || (alltags[i].href.charAt(0) == '#') || // in-page bookmark (alltags[i].href.indexOf("javascript") == 0)) continue; // ignore verdicts if (/XPLSS_/.test(alltags[i].id)) continue; // ignore flyover anchors if (/avgthreatlabs/.test(alltags[i].host)) continue; var href = engine.includeLink(alltags[i]); if (!href) continue; var newNode = engine.search.addLink(alltags[i], href); engine.addImage(newNode, engine.search.clockUrl, false); } // recursivesly process all frames var docFrames = doc.frames; if (docFrames && engine.processFrames) { for (var j = 0; j < docFrames.length; j++) { var attr; var frameDoc; try { attr = docFrames[j].frameElement.className; frameDoc = docFrames[j].document; } catch(err){} //TODO: make frame processing an engine function or at least make exclusions an engine property // 'editable' frame it's probably a gmail reply if (attr && (attr.indexOf("editable") != -1)) continue; if (frameDoc) searchshield.avgGetSearchLinks(frameDoc, engine, 0); } } return engine.search.links; }; searchshield.avglsCheckandUpdate = function (linkNode) { if (!xplSearch) return; // element is the search result anchor var element = linkNode.element; var href = linkNode.href; var result = searchshield.avgCallFunc(xplSearch.doc, 'CheckSite', href, element.href); if (result == null) return; var resultParse = result.split('::'); var phishing = resultParse[0]; // if phishing then rest of array does not exist. if (phishing == 1) return true; if (resultParse.length < 8) return; var hash = resultParse[1]; var score = resultParse[2]; var new_image = resultParse[3]; var alt_image = resultParse[4]; var flyover = resultParse[5]; var click_thru= resultParse[6]; var altClick_thru = resultParse[7]; // iterate to get verdict anchor nextElem = element.nextSibling; while (nextElem) { if (nextElem.nodeType == 1 && nextElem.id && (nextElem.id.indexOf("XPLSS_") != -1)) break; nextElem = nextElem.nextSibling; } return xplSearch.engine.updateImage(hash, xplSearch.searchHash, score, new_image, alt_image, flyover, click_thru, altClick_thru); }; // click event handler - shows popup for links of caution and warning severity searchshield.blockClick = function(event) { if (!event) event = window.event; // no action needed if click is not the left mouse button if (event.button != 0) return; var anchor = searchshield.getAnchorNode(event.srcElement, function(node) {return ((node.tagName.charAt(0) == "H") || (node.tagName.charAt(0) == "D") || (node.tagName.charAt(0) == "T"))} ); if ((anchor == null) || (anchor.href == null)) return true; // ignore if anchor is on an xpl verdict if (!!anchor.id) { if (anchor.id.indexOf('LXPLSS_') == 0) return true; if (anchor.id.indexOf('XPLSS_INTR') == 0) { searchshield.allowedSites.push(searchshield.GetDomain(anchor.href)); return true; } } // VeriSign A/B Split reporting - only for VerSign domains var avglschecked = anchor.getAttribute("avglschecked"); if (avglschecked && avglschecked != 1) { var sPos = avglschecked.indexOf("S"); var hash = (sPos > -1) ? avglschecked.substring(0, sPos) : null;
var split = (sPos > -1) ? avglschecked.substring(sPos+1) : null;
if (hash && split && split != searchshield.VERISIGN_SPLIT_NOTEST)
{
// check updated verdict anchor for verisign domain
var d = event.srcElement.ownerDocument;
if (d.getElementById(“LXPLSS_” + hash + “U” + searchshield.SCORE_SS_VERISIGN))
{
searchshield.avgCallFunc(d, “RecordVSClick”, hash, d.location.href);
}
}
}

var link = anchor.href;
var verdict = searchshield.getAvgImage(anchor);
var score = -1;
var img_id = ”;
if (verdict != null)
{
score = verdict.score;
img_id = verdict.rawId;
}

// show popup alert (upper left)
if ((score >= searchshield.SCORE_SS_CAUTION) && (score = elementRect.bottom) &&
(nextImgRect.left -1)
return true;

return false;
};
searchshield.FilterUrl = function (url, filter)
{
if (!url || (url.length < 1)) return false; if (!filter || !(filter instanceof Array)) return false; var parts = url.split('/'); if ((parts == null) || (parts.length < 3)) return false; var domain = parts[2]; for (var i = 0; i < filter.length; i++) { if (domain.indexOf(filter[i]) != -1) return true; } return false; }; searchshield.GetDomain = function (url) { if (url != null) { // get url domain var parts = url.split('/'); if ((parts != null) && (parts.length >= 3))
{
return parts[2].toLowerCase();
}
}

return url;
};
searchshield.getUrlContents = function (url)
{
if (url == null)
return null;

// don’t query if local url
if (url.indexOf(“linkscanner://”) != -1)
return null;

try
{
req = new XMLHttpRequest();
req.open(“GET”, url, false);
req.send(null);
if (req.status == 200)
return req.responseText;
else
return null;
}
catch (err)
{
// nothing to do
return null;
}
};
searchshield.parseLink = function (href, simpleMode)
{
var uri = {};
var parameter = {
complex: {
pattern: /^(?:([a-z]+):(?:([a-z]*):)?//)?(?:([^:@]*)(?::([^:@]*))?@)?((?:[a-z0-9_-]+.)+[a-z]{2,})(?::(d+))?(?:([^:?#]+))?(?:?([^#]+))?(?:#([^s]+))?$/i,
element: [‘source’,’scheme’,’subscheme’,’user’,’pass’,’host’,’port’,’path’,’query’,’fragment’]
},
simple: {
pattern: /^(?:([a-z]+)://)?((?:[a-z0-9_-]+.)+[a-z]{2,})(?:/)([^:?]+)?(?:([?|#])([^?]+))?$/i,
element: [‘source’,’scheme’,’host’,’path’,’delimiter’,’query’]
}
};
var mode = simpleMode !== false ? ‘simple’ : ‘complex’;
var pattern = parameter[mode].pattern;
var element = parameter[mode].element;

if (!href)
return uri;

var matches = href.match(pattern);

if (matches)
{
// ——————–
// iterate over the matches array and populate uri properties
// using the respective element parameter as the name.
// NOTE: set raw property type as String to make inArray()
// work properly with instanceof.
// ——————–
for (var i=0; i < matches.length; i++) uri[element[i]] = new String(matches[i] || ""); // -------------------- // create an array, hostArray, from host, for example, // host="www.google.com" and hostArray=["www","google","com"] // -------------------- uri.hostArray = uri.host.split("."); // -------------------- // create an array, qsArray, from query, for example, // query='hl=en&q=javascript&btnG=Search&aq=f&aqi=g10&aql=&oq=&gs_rfai=' // qsArray=[{hl:'en'},{q:javascript}, ... ,(qs_rfai:''}] // // $0=entire match, $1=capture 1, $2=capture 2 // must include $0 even though it is unused so // the replace works properly // -------------------- uri.qsArray = searchshield.parseQuery(uri.query); } //non-standard urls require a fail-safe that relies on simply splitting the href function splitLink(href) { // split the href on '/' var linkParts = href.split("/"); // need domain and path if ((linkParts == null) || (linkParts.length < 2)) return false; var uri = { delimiter: (linkParts[3]).substring(0,1), host: linkParts[2], hostArray: (linkParts[2]).split('.'), path: (linkParts[3]).substring(1), qsArray: [], query: '', scheme: (linkParts[0]).substring(0, linkParts[0].length-1), source: href }; return uri; } if (!uri.host) uri = splitLink(href); return uri; }; searchshield.parseQuery = function (qs) { var qsArray = []; qs.replace(/(?:^|&)([^&=]*)=?([^&]*)/g, function ($0, $1, $2) { if ($1) qsArray[$1] = $2; } ); return qsArray; }; // general functions searchshield.arrayKeys = function (array) { var keys = new Array(); for(k in array) keys.push(k); return keys; }; searchshield.inArray = function (key, array, caseSensitive, exactMatch) { if (! array instanceof Array) return false; if (caseSensitive !== true) caseSensitive = false; if (exactMatch !== false) exactMatch = true; if (key instanceof String) { for (var i=0; i < array.length; i++) { var k = caseSensitive ? key.valueOf() : key.valueOf().toLowerCase(); var a = caseSensitive ? array[i] : array[i].toLowerCase(); if(exactMatch && k === a) return true; else if (!exactMatch && (-1 !== k.indexOf(a))) return true; } } else if (key instanceof Array) { for (var i=0; i < array.length; i++) for (var j=0; j < key.length; j++) { var k = caseSensitive ? key[j] : key[j].toLowerCase(); var a = caseSensitive ? array[i] : array[i].toLowerCase(); if (exactMatch && k === a) return true; else if (!exactMatch && (-1 !== k.indexOf(a))) return true; } } return false; }; searchshield.getClickHandlerParams = function(clickHandler) { var re = /((?:'[^']*')|[w]*)(?:,|))/ig; var chParams = []; clickHandler.replace(re, function($0, $1, $2){ if ($1) chParams.push($1); } ); return chParams; }; // general use functions - end // Search constructor searchshield.Search = function() { this.doc = null; this.engine = null; this.engines = null; this.links = null; this.uri = null; this.searchHash = null; this.checkUrl = null; this.useLocalImgs = null; this.clockUrl = null; // create engine list (actually key/value object will be used) this.engineList = {}; }; searchshield.Search.prototype.getSearchNames = function() { // order is important var names = [ 'Google', 'AVGGoogle', 'AltaVista', 'AVGYahoo', 'Yahoo', 'Bing', 'MSN', // MSN redirects to BING 'Baidu', 'Earthlink', 'AOL', 'Ask', 'Yandex', 'Seznam', 'Webhledani', 'eBay', ///temp 'Digg', 'Slashdot', 'Twitter', 'GMail', 'Facebook', 'MySpace' ]; return names; }; searchshield.Search.prototype.detectEngine = function(href) { if (!href) return; var aEng = searchshield.Search.prototype.getSearchNames(); var aEngLen = aEng.length; for (var i=0; i < aEngLen; i++) { if (searchshield[aEng[i] + 'SearchEngine'].prototype.validSearch(href)) return aEng[i]; } return; }; searchshield.Search.prototype.addEngine = function(engine) { if (!this.engines) this.engines = new Array(); this.engines.push(engine); }; searchshield.Search.prototype.addLink = function(inElement, inHref) { if (!this.links) this.links = new Array(); var hrefHash; try { hrefHash = searchshield.avgCallFunc(this.doc, 'GetHash', inHref); } catch (e){} var newNode = { element: inElement, href: inHref, hash: hrefHash, search: this.searchHash }; this.links.push(newNode); return newNode; } // process the search result page after all search engines have been added searchshield.Search.prototype.process = function(doc) { // only process when searchshield is enabled if (!searchshield.enabled(doc)) return; this.doc = doc; this.href = this.doc.location.href; this.uri = searchshield.parseLink(this.href); try { this.searchHash = searchshield.avgCallFunc(this.doc, 'GetHash', this.href); // get any previously active engine this.engine = this.engineList[this.searchHash.toString()]; } catch (e) {} /* Process Steps: 1. Add all supported search engines 2. Identify the active search engine 3. Get all document links and add AVG images */ // STEP 1 - Add all supported search engines if (!this.engines) { var aEng = xplSearch.getSearchNames(); var aEngLen = aEng.length; for (var i=0; i < aEngLen; i++) { xplSearch.addEngine(new searchshield[aEng[i]+'SearchEngine'](this)); } } // search the engines if we didn't find one if (!this.engine) { // STEP 2 - Identify the active search engine var engLen = this.engines.length; for (var i = 0; i < engLen; i++) { if (this.engines[i].validSearch()) { this.engine = this.engines[i]; break; } } // create a new engine instance to store this.engineList[this.searchHash.toString()] = this.engine; // init this search, if < 1 either an error or disabled //var sdkInit = 0; //try { // sdkInit = xpl_sdk.SXPL_InitSearch(this.href); //} //catch(e){} //if (sdkInit < 1) // return false; } // return immediately if there is not an active search engine if (!this.engine) return false; try { // base url to check for icons this.checkUrl = searchshield.avgCallFunc(this.doc, 'GetIconUrl', '1'); // check if using linked or local icons this.useLocalImgs = !searchshield.getUrlContents(this.checkUrl); // get the clock url this.clockUrl = searchshield.avgCallFunc(this.doc, 'GetIconUrl', '0'); } catch(e){} // STEP 3 - Get all document links and add AVG images var alltags = this.doc.getElementsByTagName("*"); // this method works for IE, FF and Chrome for (var i=0; i < alltags.length; i++) { // ignore verdicts if (alltags[i].id && (alltags[i].id.indexOf("LXPLSS_") != -1)) continue; //should the link be included? Make sure includeLink always returns an href else FALSE, var href = this.engine.includeLink(alltags[i]); if (!href) continue; var newNode = this.addLink(alltags[i], href); this.engine.addImage(newNode, this.clockUrl, false); } return (this.links ? this.links.length : false); }; //////////////// SEARCH //////////////// //////////////// SEARCH ENGINE //////////////// // Interface for a SearchEngine object searchshield.SearchEngine = function(search) { this.search = search; this.type = 'standard'; this.processFrames = false; this.new_links = true; this.onlyPrimaries = true; this.inline = { clockImage: "linkscanner://clock12.png", image: [ "linkscanner://safe12.png", "linkscanner://caution12.png", "linkscanner://warning12.png", "linkscanner://blocked12.png" ], color: { classname: ["green","yellow","orange","red"], border: ["#00A120", "#EAA500", "#F57301", "#D20003"], background: ["#C3E5CA", "#FEEFAE", "#FFD3B0", "#F5D4C1"] } }; this.filter_urls = [ "ad.doubleclick.net", "ads1.revenue.net", "aslads.ask.com", "bluestreak.com", "clickbacktrack.net", "clickbank.net", "clickboothlnk.com", "clickmanager.com", "clickserve.cc-dt.com", "dartsearch.net", "clicktraxmedia.com", "clk.atdmt.com", "dpi-digialphoto.com", "feedpoint.net", "hypertracker.com", "jdoqocy.com", "kqzyfj.com", "m1428.ic-live.com", "mediaplex.com", "mr.mdmngr.com", "n339.asp-cc.com", "offeredby.net", "offerweb.com", "pinktrax.com", "pinktrax.com", "pixel1523.everesttech.net", "qckjmp.com", "r.rd06.com", "revenuewire.net", "s0b.bluestreak.com", "s2.srtk.net", "servedby.advertising.com", "store.yahoo.com", "tf8.cpcmanager.com", "thetoptracker.com", "track.searchignite.com", "tracking.searchmarketing.com", "www.dpbolvw.net", "www.rkdms.com", "www.yellowbookleads.com" ]; this.shortened_urls = [ "3.ly", "bit.ly", "is.gd", "tr.im", "short.to", "tiny.cc", "tinyurl.com", "lnk.ms", "msplinks.com", "t.co", "qr.net" ]; this.showCleanVerdicts = true; this.showLowRiskVerdicts = true; this.showMedRiskVerdicts = true; this.VeriSignSplit = searchshield.VERISIGN_SPLIT_NOTEST; }; searchshield.SearchEngine.prototype.flyoverExists = function (doc) { return !!doc.getElementById("XPLSS_Flyover"); }; searchshield.SearchEngine.prototype.inlineExists = function (doc) { return !!doc.getElementById("XPLSS_InlineFlyover"); }; searchshield.SearchEngine.prototype.validSearch = function(href) { return false; }; searchshield.SearchEngine.prototype.includeLink = function(link) { return false; }; searchshield.SearchEngine.prototype.insertNodes = function(node, doc) { var element = node.element; var parentNode = node.element.parentNode; if (parentNode == null) { // try and find element again based on the hash element = doc.getElementById("xplid_" + node.hash); parentNode = !!element ? element.parentNode : null; } var insertNode = !!element ? element.nextSibling : null; while ((insertNode != null) && (insertNode.tagName != null) && (insertNode.tagName == "SPAN")) { insertNode = insertNode.nextSibling; } return [insertNode, parentNode]; }; searchshield.SearchEngine.prototype.addImage = function(node, image, hidden) { var element = node.element; var hash = node.hash; var score = node.score; // set verdict display configuration var doc = element.ownerDocument; if (this.type != 'inline' && !doc.getElementById('XPLSS_Flyover')) searchshield.initFlyover(doc, this); // get the proper insertion point for the image var insertNodes = this.insertNodes(node, doc); var insertNode = insertNodes[0]; var parentNode = insertNodes[1]; if (!parentNode) return; // see if we already have an image if ((insertNode != null) && (insertNode.id != null) && (insertNode.id.indexOf("XPLSS_") > -1))
{
return;
}

// mark search result anchor so it isn’t processed repeatedly
if (score == undefined)
element.setAttribute(“avglschecked”, hash + “S” + this.VeriSignSplit);

// create a new image
var img = doc.createElement(‘img’);
img.src = image;
img.id = “XPLSS_” + hash;
img.style.borderStyle = “none”;
img.style.margin = “0 3px”;

// for IE, specify these style attributes to prevent inadvertent inheritance from parent
if (img.width && img.height)
{
img.style.width = img.width + ‘px’;
img.style.height = img.height + ‘px’;
}

// apply custom element styles
this.updateElementStyle(img, this.addImageStyle);

// create the link element
var anchor = doc.createElement(“A”);
anchor.setAttribute(“id”, “LXPLSS_” + hash);

if ((hidden != null) && (hidden == true))
{ // hiding the parent will also hide its child nodes
anchor.style.display = “none”;
}

// Default anchor styles
//Over-ride possible border style with inline declaration
anchor.style.borderStyle = “none”;

// apply custom element styles
this.updateElementStyle(anchor, this.addAnchorStyle);

if (score == searchshield.SCORE_SS_VERISIGN)
{
anchor.style.textDecoration = “none”;
anchor.style.background = “none repeat scroll 0 0 transparent”;
}

// append the image to the link
anchor.appendChild(img);

// insert the node as either a sibling or a child
if (insertNode != null)
parentNode.insertBefore(anchor, insertNode);
else
parentNode.appendChild(anchor);

return anchor;
};
searchshield.SearchEngine.prototype.updateImage = function (hash, search, score, image, alt_image, flyover, click_thru, altClick_thru)
{
var updated = false;

var frameDoc = this.search.doc;
var docFrames = frameDoc.frames;
var frameElem;
if (docFrames && this.processFrames)
{
for (var i=0; i < docFrames.length; i++) { try { if (docFrames[i].document.getElementById(hash)) { frameElem = docFrames[i].frameElement; frameDoc = docFrames[i].document; break; } } catch(err){} } } while ((element = frameDoc.getElementById(hash)) != null) { // check configuration to determine if verdict display property var showVerdict = true; var nSeverity = Number(score - 1); switch (nSeverity) { case searchshield.XPLCHECK_RESULT_SEV_LOW: showVerdict = this.showLowRiskVerdicts; break; case searchshield.XPLCHECK_RESULT_SEV_MED: showVerdict = this.showMedRiskVerdicts; break; case searchshield.XPLCHECK_RESULT_SEV_NONE: showVerdict = this.showCleanVerdicts; break; default: if (score == searchshield.SCORE_SS_VERISIGN) showVerdict = this.showCleanVerdicts; break; } // remove image if no url specified if ((!showVerdict) || (image == null) || (image.length < 1)) { // hide the parent anchor node element.parentNode.style.display = "none"; // mark the id as being hidden (element is the image) element.id = element.id + "H"; updated = true; // if not a verisign score if (score != searchshield.SCORE_SS_VERISIGN) continue; } // cleanup flyover, replace any new lines or single quotes flyover = searchshield.CleanupHTML(flyover); // mark the id as having been updated element.id = element.id + "U" + score; element.src = image; element.attachEvent("onmouseover", function(e){avglsf

Share on facebook
Facebook
Share on twitter
Twitter
Share on linkedin
LinkedIn
Share on whatsapp
WhatsApp

Tag

Ultimi aggiornamenti

Galleria