1. Concorsi pubblici – Commissione giudicatrice – Attribuzione punteggio alfanumerico – Valutazione con unico punteggio di tre prove scritte – Legittimità .
2. Concorsi pubblici – Commissione esaminatrice – Scelta del contenuto delle prove d’esame – Insindacabilità – Limiti.
3. Concorsi pubblici – Ammissibilità del ricorso – Prova di resistenza – Superamento – Necessità .
1. E’ legittima l’attribuzione di un punteggio alfanumerico complessivo, specie qualora la commissione giudicatrice abbia previamente individuato puntuali criteri di valutazione.
2. Nei concorsi pubblici la commissione esaminatrice dispone di ampia discrezionalità tecnica nella scelta del contenuto delle prove d’esame e nella valutazione delle stesse; il suo operato è pertanto sindacabile in sede di legittimità unicamente sotto il profilo della manifesta illogicità , irragionevolezza, travisamento o incongruenza.
3. Nelle controversie aventi ad oggetto selezioni pubbliche il ricorrente, ai fini della ammissibilità del ricorso, deve fornire la cd. prova di resistenza, ovvero deve provare (o quantomeno fornire un principio di prova) che, in caso di accoglimento delle censure dedotte, avrebbe ottenuto una utile posizione in graduatoria.
N. 01380/2011 REG.PROV.COLL.
N. 00548/2009 REG.RIC.
REPUBBLICA ITALIANA
IN NOME DEL POPOLO ITALIANO
Il Tribunale Amministrativo Regionale per la Puglia
(Sezione Terza)
ha pronunciato la presente
SENTENZA
sul ricorso numero di registro generale 548 del 2009, integrato da motivi aggiunti, proposto da:
Antonia Marra, rappresentata e difesa dall’avv. Agostino Meale, con domicilio eletto presso lo studio di quest’ultimo in Bari, via M. Celentano, n. 27;
contro
Regione Puglia in persona del Presidente della Giunta Regionale, legale rappresentante p.t., rappresentato e difeso dall’avv. Pierluigi Balducci, con domicilio eletto presso lo studio di quest’ultimo in Bari, via Melo, n. 114;
Commissione Esaminatrice del concorso, per esami, per la copertura di n. 12 posizioni lavorative di Dirigente dell’Area sociosanitaria – non costituita;
nei confronti di
Marta Lisi, Annamaria Maiellaro, Tiziana Di Cosmo, rappresentate e difese dall’avv. Raffaele Guido Rodio, con domicilio eletto presso lo studio di quest’ultimo in Bari, via Putignani, 168;
Maria De Palma, rappresentata e difesa dall’avv. Sabino Persichella, con domicilio eletto presso lo studio di quest’ultimo in Bari, via Principe Amedeo, n. 197;
Rossella Caccavo, Pierluigi Ruggiero, Massimo Bianco, Elisabetta Viesti, Anna Maria Candela, Maria Grazia Lucia Donno, rappresentati e difesi dall’avv. Giuseppe Cozzi, con domicilio eletto presso lo studio di quest’ultimo in Bari, corso Cavour, n. 31;
Alessandro Cappuccio e Nicola Corvasce – non costituiti;
per l’annullamento
previa sospensiva dell’efficacia,
quanto al ricorso introduttivo:
“a. di tutti i verbali della Commissione esaminatrice, ed in particolare:
– n. 5 del 20.01.09, nella parte in cui ha erroneamente valutato l’elaborato scritto della ricorrente;
– n. 6 del 21.01.2009 con il quale si è stilata la graduatoria della prova scritta e stilata la griglia di corrispondenza tra gli elaborati ed i nominativi dei candidati e non ammesso la ricorrente a sostenere la prova orale;
– n. 7 (integrazione del verbale n. 6), del 29.01.2009, nella parte in cui ha suddiviso il voto complessivo attribuito per ciascun quesito oggetto della prova scritta;
– n. 11 del 5.03.2009, nel quale è stata formulata la graduatoria di merito della prova orale;
– e dei verbali nn. 1 e 2, nella parti che riguardano la predeterminazione dei criteri e la scelta delle tracce;
b. nonchè ogni altro atto ad essi presupposto, connesso e conseguenziale, ivi compresa, se medio tempore intervenuta, l’approvazione definitiva degli atti concorsuali.”
quanto al primo ricorso per motivi aggiunti depositato nella Segreteria del Tribunale il 03.06.2009:
“a. determinazione del Dirigente del Servizio Personale ed Organizzazione n. 248 del 24 marzo 2009 con la quale si sono approvati gli atti del concorso pubblico per la copertura di n. 12 posizioni lavorative di dirigente – Area sociosanitaria – di cui 6 riservati al personale interno e la relativa graduatoria definitiva;
b. ogni altro atto ad essa presupposto, connesso e conseguenziale, ivi compresi tutti i verbali della Commissione esaminatrice (già per vero impugnati nell’atto introduttivo del giudizio R.G. n. 548/09).”
quanto al secondo ricorso per motivi aggiunti depositato nella Segreteria del Tribunale il 21.10.2009:
“a. della determinazione del Dirigente del Servizio Personale ed Organizzazione n. 647, adottata a parziale rettifica della determinazione del Dirigente del Servizio Personale ed Organizzazione n. 248 del 24 marzo 2009 (già gravata con motivi aggiunti notificati il 22 maggio 2009), con la quale sono stati approvati gli atti del concorso pubblico per la copertura di n. 12 posizioni lavorative di dirigente – Area sociosanitaria – di cui 6 riservati al personale interno, la graduatoria finale e la nomina dei relativi vincitori;
b. ogni altro atto ad essa presupposto, connesso e consequenziale.”
Visto il ricorso introduttivo, con i relativi allegati;
Visti il primo ed il secondo ricorso per motivi aggiunti e i relativi allegati;
Visto l’atto di costituzione in giudizio della Regione Puglia;
Visto l’atto di costituzione in giudizio di Marta Lisi, Annamaria Maiellaro e Tiziana Di Cosmo;
Visto l’atto di costituzione in giudizio di Maria De Palma;
Visto l’atto di costituzione in giudizio di Rossella Caccavo, Pierluigi Ruggiero, Massimo Bianco, Elisabetta Viesti, Anna Maria Candela e Maria Grazia Lucia Donno;
Viste le memorie difensive;
Visti tutti gli atti della causa;
Vista l’ordinanza n. 240 del 23 aprile 2009, di rigetto dell’istanza incidentale di sospensione cautelare;
Vista l’ordinanza n. 421 del 10 marzo 2011, di integrazione del contraddittorio e di fissazione dell’udienza pubblica del 29 giugno 2011 per il prosieguo;
Relatore nell’udienza pubblica del giorno 29 giugno 2011 la dott.ssa Rosalba Giansante e uditi per le parti i difensori, gli avv.ti Agostino Meale, Raffaele Guido Rodio, Sabino Persichella, Francesca Minuto, su delega di Pierluigi Balducci e Cataldo Balducci su delega di Giuseppe Cozzi;
Ritenuto e considerato in fatto e diritto quanto segue.
FATTO
Espone in fatto la dott.ssa Antonia Marra, dipendente della Regione Puglia a tempo indeterminato (qualifica D6, dirigente f.f.) di aver partecipato al concorso pubblico per la copertura di n.12 posti di dirigente di area sociosanitaria, dei quali 6 riservati al personale interno, indetto con bando della Regione Puglia pubblicato sul B.U.R.P. n. 46 del 29 marzo 2007.
Riferisce di aver superato la prova preselettiva professionale e di essere stata ammessa a sostenere le prove scritte; di aver appreso dalla lettura del verbale n. 6 del 21 giugno 2009, pubblicato sul sito internet della suddetta Regione, di non aver superato la prova scritta e, dunque, di non essere stata ammessa alla prova orale; aggiunge infine di aver conseguito la valutazione di 15/30 a fronte di un punteggio minimo richiesto di 21/30, considerato che l’art. 6 del bando di concorso richiamava gli artt. 36 e 37 del Regolamento regionale 16 ottobre 2006, n. 17 sugli accessi ai rapporti di lavoro a tempo indeterminato.
Con ricorso notificato il 19 e 20 marzo 2009 e depositato nella Segreteria del Tribunale l’8 aprile 2009, la dott.ssa Antonia Marra ha chiesto l’annullamento di tutti i verbali della Commissione esaminatrice, ed in particolare dei verbali: n. 5 del 20 gennaio 2009, nella parte in cui la Commissione ha valutato l’elaborato scritto di essa ricorrente, n. 6 del 21 gennaio 2009 con il quale è stata stilata la graduatoria della prova scritta e stilata la griglia di corrispondenza tra gli elaborati ed i nominativi dei candidati ed essa non è stata ammessa a sostenere la prova orale, n. 7 (integrazione del verbale n. 6), del 29 gennaio 2009, nella parte in cui la Commissione ha suddiviso il voto complessivo attribuito per ciascun quesito oggetto della prova scritta, n. 11 del 5 marzo 2009, nel quale è stata formulata la graduatoria di merito della prova orale e infine dei verbali nn. 1 e 2, nelle parti che riguardano la predeterminazione dei criteri e la scelta delle tracce.
A sostegno del ricorso la ricorrente con un unico motivo di ricorso ha dedotto le seguenti censure: violazione dei principi di imparzialità e buon andamento di cui all’art. 97 della Costituzione, violazione dell’art. 3 della legge n. 241 del 1990 per difetto di motivazione, violazione e falsa applicazione del bando di concorso, violazione delle norme che regolano i concorsi pubblici e della par condicio tra candidati, violazione e falsa applicazione del Regolamento regionale n. 17 del 2006, eccesso di potere per contraddittorietà tra atti della stessa P.A., illogicità ed irrazionalità manifesta, difetto di motivazione, difetto di istruttoria, sviamento.
Si sono costituite a resistere in giudizio la Regione Puglia, le dott.sse Marta Lisi, Annamaria Maiellaro e Tiziana Di Cosmo, nonchè la dott.ssa Maria De Palma, chiedendo il rigetto del gravame.
La Regione resistente e le suddette controinteressate hanno prodotto una memoria per la camera di consiglio; queste ultime nella memoria depositata in data 22 aprile 2009 hanno eccepito la parziale irricevibilità del ricorso per tardività e l’inammissibilità del ricorso stesso per omessa (necessaria) impugnazione di atti presupposti e per difetto di interesse.
La dott.ssa Marra e la Regione Puglia hanno prodotto documentazione.
Alla camera di consiglio del 23 aprile 2009, con ordinanza n. 240, è stata respinta la domanda incidentale di sospensione cautelare.
Con un primo ricorso per motivi aggiunti, depositato nella Segreteria del Tribunale il 3 giugno 2009, la dott.ssa Marra ha chiesto l’annullamento della determinazione del Dirigente del Servizio Personale ed Organizzazione n. 248 del 24 marzo 2009 con la quale sono stati approvati gli atti del concorso pubblico per cui è causa e la relativa graduatoria definitiva.
Avverso questo successivo provvedimento la ricorrente ha riproposto in via derivata le censure già dedotte con il ricorso introduttivo.
Con un secondo ricorso per motivi aggiunti, depositato nella Segreteria del Tribunale il 21 ottobre 2009, parte ricorrente ha chiesto l’annullamento della determinazione n. 647 del 3 luglio 2009, adottata a parziale rettifica della precedente determinazione n. 248 del 24 marzo 2009, già gravata con il primo ricorso per motivi aggiunti, nella parte relativa alla graduatoria finale del concorso stesso e con la quale sono stati nominati i relativi vincitori.
Anche avverso questo ulteriore provvedimento la ricorrente ha riproposto in via derivata le censure già dedotte con il ricorso introduttivo e riproposte con il primo ricorso per motivi aggiunti.
Tutte le parti costituite hanno presentato una memoria per l’udienza di discussione del 24 febbraio 2011.
Con ordinanza n. 421 del 10 marzo 2011, questa Sezione ha disposto l’integrazione del contraddittorio nei confronti di tutti i concorrenti risultanti vincitori secondo la graduatoria definitiva approvata dall’amministrazione resistente, quali controinteressati nei confronti dei provvedimenti impugnati in epigrafe, e fissato per il prosieguo l’udienza pubblica del 29 giugno 2011.
Si sono costituite a resistere in giudizio i dottori Rossella Caccavo, Pierluigi Ruggiero, Massimo Bianco, Elisabetta Viesti, Anna Maria Candela e Maria Grazia Lucia Donno eccependo l’inammissibilità del ricorso introduttivo e dei ricorsi per motivi aggiunti per difetto di interesse e chiedendo il rigetto del gravame.
La dott.ssa De Palma ha depositato un atto di replica per l’udienza di discussione.
Alla udienza pubblica del 29 giugno 2011 la causa è stata chiamata e assunta in decisione.
DIRITTO
Il Collegio ritiene, innanzitutto, di poter prescindere dall’esame delle eccezioni di rito sollevate, essendo il ricorso introduttivo ed i ricorsi per motivi aggiunti infondati nel merito.
A sostegno del ricorso introduttivo la ricorrente con un unico motivo di ricorso ha dedotto le seguenti censure: violazione dei principi di imparzialità e buon andamento di cui all’art. 97 della Costituzione, violazione dell’art. 3 della legge n. 241 del 1990 per difetto di motivazione, violazione e falsa applicazione del bando di concorso, violazione delle norme che regolano i concorsi pubblici e della par condicio tra candidati, violazione e falsa applicazione del Regolamento regionale n. 17 del 2006, eccesso di potere per contraddittorietà tra atti della stessa P.A., illogicità ed irrazionalità manifesta, difetto di motivazione, difetto di istruttoria, sviamento.
Quattro sono sostanzialmente i profili di illegittimità prospettati dalla dott.ssa Marra con le suddette censure.
1) Parte ricorrente, dopo aver premesso che all’atto dell’insediamento la Commissione aveva tra l’altro stabilito che la prova scritta sarebbe consistita nella risposta a n. 3 quesiti c.d. aperti, aveva espressamente previsto che alla risposta elaborata per ciascun quesito sarebbe stato attribuito un punteggio da 1 a 10 e che il punteggio complessivo della prova scritta sarebbe stato quello ottenuto dalla sommatoria dei punteggi conseguiti per ciascuno dei tre quesiti (verbale n.1 del 14 ottobre 2008), lamenta che dalla lettura del verbale n. 6 del 21 gennaio 2009 la Commissione avrebbe agito in modo diverso dalla regola che essa stessa si sarebbe data con il verbale n. 1.
Infatti dal verbale n. 6 del 21 gennaio 2009 risulterebbe che: “La Commissione ha preventivamente stabilito che l’elaborato, articolato in quesiti strettamente integrati sotto il profilo tematico, sarà valutato con attribuzione di un voto unitario, espresso in trentesimi.”.
Successivamente con il verbale n. 7 la Commissione medesima avrebbe provveduto ad integrare il precedente verbale, motivando tale integrazione con la richiesta in tal senso del dirigente responsabile del procedimento, “includendo le colonne omesse contenenti i punteggi assegnati alle singole prove a ciascun quesito oggetto della prova scritta, la cui somma ha determinato il voto complessivo.”; in tutti i compiti visionati non vi sarebbe, però, nessun punteggio per ciascuna risposta ma risulterebbe solo quello finale.
Il motivo è privo di pregio.
Questa Sezione ha già avuto modo di affrontare tale motivo di doglianza per un altro ricorso avverso lo stesso concorso ed ha condivisibilmente ritenuto che l’assegnazione di un punteggio complessivo unitario sui tre quesiti assegnati, in un primo momento disposta dalla Commissione nella seduta del 19 gennaio 2009 (verbale n. 3) e ribadito nella seduta del 19 gennaio 2009 (verbale n. 5) in sede di valutazione dell’elaborato della ricorrente (cui era stato attribuito, come da essa dichiarato in ricorso, il numero 35), risulta attuativa delle vincolanti disposizioni contenute nel regolamento regionale di settore n. 17 del 2006, non impugnato.
Ragion per cui l’operato della Commissione è risultato semmai illegittimo laddove in difformità dal suesposto regolamento, ha inserito un aggravio procedimentale non previsto nè imposto dal bando o da eccezionali esigenze (verbale n.1), con la conseguenza che la successiva attività della Commissione, tesa ad integrare la mancata specificazione del punteggio per ogni singolo quesito, non era in alcun modo richiesta, non trattandosi di integrazione postuma “sanante” o di rinnovata valutazione, bensì di mera “regolarizzazione” formale, comunque del tutto ultronea.
Infatti, alla discrezionalità della Commissione è demandata unicamente la predeterminazione dei criteri valutativi (art 37 regolamento citato) non anche la individuazione del metodo di attribuzione del punteggio, stabilito appunto inderogabilmente dall’art. 36, secondo comma, del regolamento n. 17 del 2006 (cfr. T.A.R. Puglia, Sezione III 8 luglio 2010, n. 2913).
2) Sotto altro aspetto la dott.ssa Marra rappresenta che sempre nel suddetto verbale n. 1 la Commissione ha predeterminato i seguenti criteri di valutazione, ma lamenta che essi sarebbero del tutto insufficienti per determinare l’attribuzione del solo punteggio numerico: 1. capacità e chiarezza espositiva, 2. conoscenza della materia di esame e del quadro normativo di riferimento, 3. capacità di analisi e di elaborazione di proposte, 4. completezza illustrativa dell’argomento; ad avviso di essa ricorrente i criteri sub 2 e 4 sarebbero sostanzialmente un unico criterio e, quindi, nella individuazione dei criteri stessi, in violazione dell’art. 36 del regolamento regionale n. 17 del 2006, sarebbero stati omessi sia il criterio relativo agli errori nella trattazione che quello che impone la verifica della capacità espositiva in relazione alla posizione dirigenziale cui si aspira.
Le censure sono infondate.
L’art. 36 del regolamento n. 17 del 2006, al comma 1, recita: ” la Commissione si deve attenere ai seguenti criteri: – grado di conoscenza della materia d’esame quale risulta dalla trattazione degli argomenti; – numero e gravità degli errori commessi nella trattazione; – capacità espositiva da valutare con riferimento alla posizione lavorativa ammessa al concorso.”.
Il Collegio ritiene di dover evidenziare che il suddetto regolamento disciplina l’accesso di tutti i rapporti di lavoro a tempo indeterminato della Regione Puglia.
La Commissione esaminatrice del concorso per cui è causa, ad avviso del Collegio, ha predeterminato i criteri “con riferimento alla posizione lavorativa ammessa al concorso”, come richiesto dal sopra richiamato art. 36 e tenendo conto, quindi, che si trattava di criteri per la copertura di posizioni dirigenziali; inoltre la circostanza che il criterio relativo agli errori nella trattazione che parte ricorrente assume essere stato omesso, anche se non espresso, in quanto verosimilmente ad avviso del Collegio ritenuto superfluo alla luce del contenuto degli altri criteri e considerata la posizione lavorativa messa a concorso, non significa che, ove siano stati commessi errori, anche se non evidenziati negli elaborati, questi non abbiano pesato nella valutazione della Commissione.
Ritenuti conformi al regolamento e, quindi legittimi i criteri prestabiliti dalla Commissione, il Collegio deve ritenere di conseguenza priva di pregio la censura relativa alla ritenuta loro insufficienza per determinare l’attribuzione del solo punteggio numerico, espressamente previsto dall’art. 37 del regolamento stesso che, come detto, non risulta impugnato.
Il Collegio ritiene tuttavia opportuno richiamare la condivisa giurisprudenza amministrativa (ritenuta principio oramai di “diritto vivente” dalla sentenza della Corte Costituzionale 30 gennaio 2009, n. 20, in riferimento alle prove d’esame per l’abilitazione alla professione forense) che afferma la legittimità dell’attribuzione di un punteggio alfanumerico complessivo, specie poi qualora siano stati preliminarmente individuati puntuali criteri di valutazione, come nella fattispecie per cui è causa (ex multis T.A.R. Puglia, Sezione III 8 luglio 2010, n. 2913 e la giurisprudenza ivi richiamata: Consiglio di Stato sez VI 8 maggio 2008, n.2128, id. 12 novembre 2008, n.5638, id 23 marzo 2009, n.1726, id. sez IV 5 febbraio 2010 n.548, T.A.R. Campania Napoli sez IV, 27 aprile 2010, n. 2177).
3) Una ulteriore doglianza della ricorrente riguarda la scelta delle tracce che, a suo avviso, sarebbe in contrasto con il bando di concorso e più in generale con le regole di correttezza dell’azione amministrativa in quanto tutte le tracce predisposte dalla Commissione, e quindi non solo quelle estratte, avrebbero riguardato esclusivamente la materia dei servizi sociali a fronte di almeno 13 materie previste dal bando e, pertanto, così facendo avrebbe omesso di accertare nell’espletamento della prova scritta la preparazione dei candidati su tutte le materie previste nel bando.
La giurisprudenza del G.A. è consolidata nell’affermare l’ampia discrezionalità tecnica della commissione giudicatrice nella scelta del contenuto delle prove d’esame, non certo vincolata alla verifica di ogni singola materia prevista dal bando, sindacabile in sede di giurisdizione generale di legittimità limitatamente a ragioni di manifesta illogicità o incongruenza (Consiglio di Stato sez IV, 26 luglio 2008, n.3677, T.A.R. Liguria sez II 7 maggio 2004, n.2280, C.G.A. 2002 n.46).
Nella fattispecie per cui è causa, dalla documentazione versata in atti emerge che la traccia sorteggiata formata dalla Commissione attiene in particolare alla materia socio sanitaria e ad altre materie (diritto amministrativo, management, ecc.) comunque interconnesse, in stretta attinenza quindi con i profili professionali di Dirigente dell’area socio sanitaria messi a concorso e con la professionalità richiesta per lo svolgimento delle specifiche funzioni dirigenziali, e dunque non sussiste alcuna chiara ed univoca figura sintomatica di eccesso di potere, sotto il profilo della manifesta illogicità , irragionevolezza, travisamento o incongruenza sindacabile da questo Giudice in sede di giurisdizione generale di legittimità (cfr. T.A.R. Puglia, Sezione III 8 luglio 2010, n. 2913 cit.).
4) La ricorrente lamenta infine che anche le modalità di correzione degli elaborati lascerebbero “intravvedere profili di illegittimità ” in quanto dai rilievi comparativi degli elaborati risulterebbe la non omogeneità dei criteri di valutazione delle prove e di attribuzione dei punteggi.
Il Collegio, concordando con i dottori controinteressati Rossella Caccavo, Pierluigi Ruggiero, Massimo Bianco, Elisabetta Viesti, Anna Maria Candela e Maria Grazia Lucia Donno, ritiene che le censure siano inammissibili per carenza di interesse non avendo la dott.ssa Marra fornito la c.d. prova di resistenza; parte ricorrente avrebbe dovuto provare (o comunque quantomeno fornire un principio di prova) che, in caso di accoglimento delle censure dedotte, avrebbe ottenuto una utile posizione in graduatoria, mentre si è limitata genericamente a fare una comparazione tra gli elaborati.
Al riguardo giova comunque ricordare che, nei confronti della valutazione delle prove di concorso e degli esami in genere, il giudice amministrativo può conoscere del vizio di eccesso di potere solo nei limiti della manifesta illogicità , non potendo egli censurare l’intrinseco contenuto del giudizio, pena uno “sconfinamento” del giudizio nel merito, non ammesso in sede di giurisdizione di legittimità .
Nei concorsi pubblici, infatti, la Commissione esaminatrice dispone di ampia discrezionalità tecnica che è pertanto sindacabile in sede giurisdizionale soltanto per evidenti illogicità ed irrazionalità , non ravvisabili peraltro nel caso di specie (cfr. T.A.R. Puglia, Sezione III 27 maggio 2010, n. 2085).
D’altro canto la stessa ricorrente non sembra convinta della presenza di vizi di illegittimità nella correzione degli elaborati; ciò si deduce dal verbo usato nel censurare l’operato della Commissione laddove “intravvede” soltanto i profili di illegittimità .
Conclusivamente, per i suesposti motivi, il ricorso introduttivo deve ritenersi in parte infondato ed in parte inammissibile.
Il Collegio, considerato che la dott.ssa Marra con entrambi i ricorsi per motivi aggiunti ha riproposto in via derivata le censure già dedotte con il ricorso introduttivo, deve concludere anche per essi per la loro parziale infondatezza e parziale inammissibilità .
Sussistono giusti motivi per la compensazione delle spese processuali, in considerazione della complessità delle questioni trattate.
P.Q.M.
Il Tribunale Amministrativo Regionale per la Puglia (Sezione Terza) definitivamente pronunciando sul ricorso introduttivo e sui ricorsi per motivi aggiunti, come in epigrafe proposti, in parte li respinge ed in parte li dichiara inammissibili, nei termini precisati in motivazione.
Spese compensate.
Ordina che la presente sentenza sia eseguita dall’autorità amministrativa.
Così deciso in Bari nella camera di consiglio del giorno 29 giugno 2011 con l’intervento dei magistrati:
Paolo Amovilli, Presidente FF
Francesca Petrucciani, Referendario
Rosalba Giansante, Referendario, Estensore
L’ESTENSORE | IL PRESIDENTE | |
DEPOSITATA IN SEGRETERIA
Il 22/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