source: branches/2.2/security/certificados.js @ 3232

Revision 3232, 18.6 KB checked in by rafaelraymundo, 14 years ago (diff)

Ticket #1237 - Atualizados componentes de suporte ao uso do Certificado Digital.

Line 
1
2var ua = navigator.userAgent.toLowerCase();
3if (ua.indexOf(" chrome/") >= 0 || ua.indexOf(" firefox/") >= 0 || ua.indexOf(' gecko/') >= 0) {
4        var StringMaker = function () {
5                this.str = "";
6                this.length = 0;
7                this.append = function (s) {
8                        this.str += s;
9                        this.length += s.length;
10                }
11                this.prepend = function (s) {
12                        this.str = s + this.str;
13                        this.length += s.length;
14                }
15                this.toString = function () {
16                        return this.str;
17                }
18        }
19} else {
20        var StringMaker = function () {
21                this.parts = [];
22                this.length = 0;
23                this.append = function (s) {
24                        this.parts.push(s);
25                        this.length += s.length;
26                }
27                this.prepend = function (s) {
28                        this.parts.unshift(s);
29                        this.length += s.length;
30                }
31                this.toString = function () {
32                        return this.parts.join('');
33                }
34        }
35}
36
37
38var num = 0;
39var titulo = '';
40
41// This code was written by Tyler Akins and has been placed in the
42// public domain.  It would be nice if you left this header intact.
43// Base64 code from Tyler Akins -- http://rumkin.com
44
45var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
46
47function encode64(input) {
48        var output = new StringMaker();
49        var chr1, chr2, chr3;
50        var enc1, enc2, enc3, enc4;
51        var i = 0;
52
53        while (i < input.length) {
54                chr1 = input.charCodeAt(i++);
55                chr2 = input.charCodeAt(i++);
56                chr3 = input.charCodeAt(i++);
57
58                enc1 = chr1 >> 2;
59                enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
60                enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
61                enc4 = chr3 & 63;
62
63                if (isNaN(chr2)) {
64                        enc3 = enc4 = 64;
65                } else if (isNaN(chr3)) {
66                        enc4 = 64;
67                }
68
69                output.append(keyStr.charAt(enc1) + keyStr.charAt(enc2) + keyStr.charAt(enc3) + keyStr.charAt(enc4));
70   }
71
72   return output.toString();
73}
74
75function decode64(input) {
76        var output = new StringMaker();
77        var chr1, chr2, chr3;
78        var enc1, enc2, enc3, enc4;
79        var i = 0;
80
81        // remove all characters that are not A-Z, a-z, 0-9, +, /, or =
82        input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
83
84        while (i < input.length) {
85                enc1 = keyStr.indexOf(input.charAt(i++));
86                enc2 = keyStr.indexOf(input.charAt(i++));
87                enc3 = keyStr.indexOf(input.charAt(i++));
88                enc4 = keyStr.indexOf(input.charAt(i++));
89
90                chr1 = (enc1 << 2) | (enc2 >> 4);
91                chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
92                chr3 = ((enc3 & 3) << 6) | enc4;
93
94                output.append(String.fromCharCode(chr1));
95
96                if (enc3 != 64) {
97                        output.append(String.fromCharCode(chr2));
98                }
99                if (enc4 != 64) {
100                        output.append(String.fromCharCode(chr3));
101                }
102        }
103
104        return output.toString();
105}
106
107function msgWin(msg,w,h,params)
108{
109    var winl = (screen.width - w ) / 2;
110    var wint = (screen.height - h) / 2;
111    var parm = "width=" + w + ",height=" + h + ",top=" + wint + ",left=" + winl + params;
112    win3 = window.open("","12345" + num,parm);
113    num = num + 1;
114    win3.document.writeln(msg);
115    win3.focus();
116}
117
118function Remover(valor,valor2)
119{
120    var resp = confirm("Remover certificado n. " + valor + " do arquivo " + valor2 + " ?");
121    if (resp){
122        document.getElementById('msgs').innerHTML = '';
123        Remover_Certificado(valor,valor2);
124        Lista_de_Certificados();
125        }
126}
127
128function Submete_Cas(id,msg)
129{
130    if(document.getElementById('file').value != ''){
131        var resp = confirm(msg);
132        if (resp){
133            document.getElementById(id).submit();
134            }
135        else{
136            document.getElementById('file').value = '';
137        }
138     }
139     else{
140         alert('Selecione um arquivo valido( .pem, .der, .cer .pfx,  .p7b');
141     }
142}
143
144function Salvar_arq(id,msg)
145{
146    var resp = confirm(msg);
147    if (resp){
148        document.getElementById(id).submit();
149        }
150}
151
152function Remover_Certificado(valor,valor2)
153{
154    //verifica se o browser tem suporte a ajax11
155    try
156    {
157        ajax1 = new ActiveXObject("Microsoft.XMLHTTP");
158    }
159    catch(e)
160    {
161        try
162        {
163            ajax1 = new ActiveXObject("Msxml2.XMLHTTP");
164        }
165        catch(ex)
166        {
167            try
168            {
169                ajax1 = new XMLHttpRequest();
170            }
171            catch(exc)
172            {
173                alert("Esse browser não tem recursos para uso do ajax1");
174                ajax1 = null;
175            }
176        }
177    }
178
179    //se tiver suporte ajax1
180    if(ajax1)
181    {
182        ajax1.open("POST", "manut_certs.php", true);
183        ajax1.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
184        ajax1.onreadystatechange = function()
185        {
186            if(ajax1.readyState == 4 )
187            {
188                if(ajax1.responseXML)
189                {
190                    var arqx = processa_remover_certificado(ajax1.responseXML);
191                }
192                else
193                {
194                    //caso não seja um arquivo XML emite a mensagem abaixo
195                    //alert('Nao foi possivel remover o certificado(M01).');
196                }
197            }
198        }
199        //passa o código do certificado desejado...
200        var params = "id=" + valor + '&arquivo=' + valor2;
201        ajax1.send(params);
202    }
203}
204
205function processa_remover_certificado(obj)
206{
207    var dataArray   = obj.getElementsByTagName("certificados");
208    //total de elementos contidos na tag
209    if(dataArray.length > 0)
210        {
211            if (navigator.userAgent.match('MSIE'))
212                {
213                    var conteudo = dataArray[0].text;
214                }
215                else
216                {
217                    var conteudo = dataArray[0].textContent;
218                }
219            if(conteudo.substr(0,2) == 'OK')
220                {
221                    alert('Certificado removido de ' + conteudo.substr(2) + '.');
222                    var path3 = conteudo.substr(2);
223                }
224            else
225                {
226                    alert('Certificado nao removido de ' + conteudo.substr(0,4));
227                    var path3 = conteudo.substr(2);
228                }
229        }
230    else
231        {
232            //caso o XML volte vazio, printa a mensagem abaixo
233            alert('Nao foi possivel remover o certificado(M02).');
234            var path3 = '';
235        }
236    return path3;
237}
238
239
240
241function Um_Certificado(valor,valor2)
242{       
243    if(valor.length < 2) {
244        return;
245    }
246    //verifica se o browser tem suporte a ajax3
247    try
248    {
249        ajax3 = new ActiveXObject("Microsoft.XMLHTTP");
250    }
251    catch(e)
252    {
253        try
254        {
255            ajax3 = new ActiveXObject("Msxml2.XMLHTTP");
256        }
257        catch(ex)
258        {
259            try
260            {
261                ajax3 = new XMLHttpRequest();
262            }
263            catch(exc)
264            {
265                alert("Esse browser não tem recursos para uso do ajax3");
266                ajax3 = null;
267            }
268        }
269    }
270
271    //se tiver suporte ajax3
272    if(ajax3)
273    {
274        titulo = valor;
275        ajax3.open("POST", "certs_xml.php", true);
276        ajax3.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
277        ajax3.onreadystatechange = function()
278        {
279            //após ser processado - chama função processa_um_certificado que vai varrer os dados
280            if(ajax3.readyState == 4 )
281            {
282                if(ajax3.responseXML)
283                {
284                    processa_um_certificado(ajax3.responseXML);
285                }
286                else
287                {
288                    //caso não seja um arquivo XML emite a mensagem abaixo
289                    msg = 'N&atilde;o foi poss&iacute;vel obter os dados solicitados(1).' + '<br/><br/><div align="center"><INPUT type="button" value="Fechar" onClick="window.close()">';
290                    parms = ",scrollbars=1";
291                    msgWin(msg,450,200,parms)
292                }
293            }
294        }
295        //passa o código do certificado desejado...
296        var params = "id="+valor + '&arquivo=' + valor2;
297        ajax3.send(params);
298    }
299}
300     
301function processa_um_certificado(obj)
302{
303    // Tab com tags que deve exibir sho o nome....
304    var TBtags = new Array( "EMISSOR_CAMINHO_COMPLETO", "SUBJECT" , "CRLDISTRIBUTIONPOINTS" , "KEYUSAGE" , "EXTKEYUSAGE" );
305    //pega a tag certificado
306    var dataArray   = obj.getElementsByTagName("certificado");
307    //total de elementos contidos na tag
308    if(dataArray.length > 0)
309    {
310        var novo = "<head><title>" + titulo + "</title></head><body><font size=2><h3 align=center ><font color=#0000EE>Dados do certificado</font></h3>";
311        //percorre o arquivo XML para extrair os dados
312        for(var i = 0 ; i < dataArray.length ; i++)
313        {
314            var item = dataArray[i];
315            var cc    =  item.getElementsByTagName("*");
316            len = 0;
317            for(var j = 0 ; j < cc.length ; j++)
318            {
319                //contéudo dos campos no arquivo XML
320                var tag = cc[j].nodeName
321                if(tag == "CA") continue; // skipa tag CA ....
322                var xflag = 0;
323                if(tag.substr(0,3) == "oid") xflag = 1;
324                for(var iz = 0;iz< TBtags.length;iz++)
325                {
326                    if(TBtags[iz] == tag) xflag = 1;
327                }
328                // Testa se deve exibir o valor da tag..
329                if(xflag ==1 )
330                {
331                    var nome    =   "<b>" +tag +":</b> ";
332                }
333                else
334                {
335                    // Testa o browser para usar a propriedade  correta ...
336                    if (navigator.userAgent.match('MSIE'))
337                    {
338                        var conteudo = cc[j].text;
339                    }
340                    else
341                    {
342                        var conteudo = cc[j].textContent;
343                    }
344                                                                               
345                    if(conteudo == "1")
346                    {
347                        conteudo = "Sim.";
348                    }
349                                                                                       
350                    if(conteudo == "")
351                    {
352                        conteudo = "N&atilde;o.";
353                    }
354                                                                                       
355                    switch(tag)
356                    {
357                                                                                       
358                        case "INICIO_VALIDADE":
359                        {
360                            var aux = conteudo.substr(0,4) + "/" + conteudo.substr(4,2) + "/" + conteudo.substr(6,2)  + "  -  " + conteudo.substr(8,2)  + ":" + conteudo.substr(10,2)  + ":" + conteudo.substr(12,2)  + " GMT";
361                            conteudo = aux;
362                            break;
363                        }
364                        case "FIM_VALIDADE":
365                        {
366                            var aux = conteudo.substr(0,4) + "/" + conteudo.substr(4,2) + "/" + conteudo.substr(6,2)  + "  -  " + conteudo.substr(8,2)  + ":" + conteudo.substr(10,2)  + ":" + conteudo.substr(12,2)  + " GMT";
367                            conteudo = aux;
368                            break;
369                        }
370                        default:
371                        {
372                            break;
373                        }
374                    }
375                    var nome    =  "<b>" + tag +":</b> " + conteudo;
376                }
377                novo = novo + nome + '<br/>';
378                len = len + 24;
379            }
380        }
381        msg = novo + '<br/><br/><div align="center"><INPUT type="button" value="Fechar" onClick="window.close()"></font></body>';
382    }
383    else
384    {
385        //caso o XML volte vazio, printa a mensagem abaixo
386        msg = 'N&atilde;o foi poss&iacute;vel obter dados do certificado(2).' + '<br/><br/><div align="center"><INPUT type="button" value="Fechar" onClick="window.close()"></font></body>';
387        len =200;
388    }
389    parms = ",scrollbars=1";
390    num = num + 1;
391    msgWin(msg,450,len,parms)
392}
393
394function Lista_de_Certificados()
395{
396    //document.getElementById('titulo1').innerHTML  = 'Certificados em ' + path4;
397    try
398    {
399        ajax4 = new ActiveXObject("Microsoft.XMLHTTP");
400    }
401    catch(e)
402    {
403        try
404        {
405            ajax4 = new ActiveXObject("Msxml2.XMLHTTP");
406        }
407        catch(ex)
408        {
409            try
410            {
411                ajax4 = new XMLHttpRequest();
412            }
413            catch(exc)
414            {
415                alert("Esse browser não tem recursos para uso do ajax4");
416                ajax4 = null;
417            }
418        }
419    }
420
421    if(ajax4)
422    {
423        ajax4.open("POST", "certs_xml.php", true);
424        ajax4.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
425        ajax4.onreadystatechange = function()
426        {
427            if(ajax4.readyState == 4 )
428            {
429                if(ajax4.responseXML)
430                {
431                    Processa_Lista_de_Certificados(ajax4.responseXML);
432                    Lista_Arvore();
433                }
434                else
435                {
436                    //caso não seja um arquivo XML emite a mensagem abaixo
437                    alert("Ocorreu um erro acessando os dados solicitados.Er-001 - " + ajax4.readyState);
438                }
439            }
440        }
441        document.getElementById('xdiv1').innerHTML = '<br/><font color="#000066"><b> Carregando ...</b></font>';
442        document.getElementById('xdiv2').innerHTML = '<br/><font color="#000066"><b> Carregando ...</b></font>';
443        //document.getElementById('path3x').value = path4;
444        //passa o código do certificado desejado...
445        //var params = "id=A&path3=" + path4;
446        var params = "id=A";
447        ajax4.send(params);
448    }
449}
450
451function Processa_Lista_de_Certificados(obj)
452{
453    //pega a tag certificado
454    var dataArray   = obj.getElementsByTagName("cert");
455    if(dataArray.length > 0)
456    {
457        var novo = '<table border="1" width="100%" ><tr><th>Item</th><th>Remover</th><th>Autoridade Certificadora</th><th>Validade</th></tr>';
458        //percorre o arquivo XML para extrair os dados
459        var conteudo = '';
460        for(var i = 0 ; i < dataArray.length ; i++)
461        {
462            var item = dataArray[i];
463            var cc    =  item.getElementsByTagName("*");
464                    // Testa o browser para usar a propriedade  correta ...
465                //var aux = path5.split('/');
466                var aux = 'todos.cer';
467                //aux_novo =  '<a href="javascript:Remover(\''+ cc[0].textContent + '\',\'' + aux[aux.length-1] + '\')" style="text-decoration: none;margin:0 0 0 20" ><img src="delete.gif" style="border:none" title="Clique para remover este certificado..."/></a>';
468                aux_novo =  '<a href="javascript:Remover(\''+ cc[0].textContent + '\',\'' + aux + '\')" style="text-decoration: none;margin:0 0 0 20" ><img src="delete.gif" style="border:none" title="Clique para remover este certificado..."/></a>';
469                //novo = novo + aux_novo + conteudo + '<br/>';
470                    if (navigator.userAgent.match('MSIE'))
471                    {
472                        var conteudo1 = cc[1].text;
473                        if (conteudo1.indexOf('DUPLICADO') != -1)
474                            {
475                                var conteudo1 = '<font color="#FF0000"><b>' + conteudo + '</b></font>';
476                            }
477                        var conteudo = '<tr><td><font size="1">' + cc[0].text + '</font></td><td><font size="1">' + aux_novo + '</font> </td><td><font size="1">' + conteudo1  + ' </font></td><td><font size="1">' + cc[2].text + '</font></td></tr>';
478                    }
479                    else
480                    {
481                        if ( cc[2].textContent.indexOf('DUPLICADO') != -1)
482                            {
483                                var conteudo2 = '<font size="1" color="#FF0000"><b>' + cc[2].textContent + '</b></font>';
484                            }
485                        else
486                            {
487                                var conteudo2 = '<font size="1">' +  cc[2].textContent + '</font>';
488                            }
489                        var conteudo = '<tr><td><font size="1">' + cc[0].textContent + '</font></td><td><font size="1">' + aux_novo + ' </font></td><td><font size="1">' + cc[1].textContent  + ' </font></td><td>' + conteudo2 + '</td></tr>';
490                        //var conteudo = cc[0].textContent + ' - ' + cc[1].textContent  + ' # ' + cc[2].textContent;
491                    }
492
493                    if (conteudo.indexOf('DUPLICADO') != -1)
494                    {
495                        var conteudo = '<font color="#FF0000"><b>' + conteudo + '</b></font>';
496                    }
497
498
499                    novo = novo + conteudo;
500
501        }
502        msg = novo + '</table>';
503    }
504    else
505    {
506        //caso o XML volte vazio, printa a mensagem abaixo
507        msg = 'N&atilde;o foi poss&iacute;vel obter dados dos certificados.V02';
508    }
509    document.getElementById('xdiv1').innerHTML = msg;
510}
511
512function Lista_Arvore(path3)
513{
514    //document.getElementById('titulo1').innerHTML  = 'Certificados em ' + path3;
515    //verifica se o browser tem suporte a ajax5
516    try
517    {
518        ajax5 = new ActiveXObject("Microsoft.XMLHTTP");
519    }
520    catch(e)
521    {
522        try
523        {
524            ajax5 = new ActiveXObject("Msxml2.XMLHTTP");
525        }
526        catch(ex)
527        {
528            try
529            {
530                ajax5 = new XMLHttpRequest();
531            }
532            catch(exc)
533            {
534                alert("Esse browser não tem recursos para uso do ajax5");
535                ajax5 = null;
536            }
537        }
538    }
539    //se tiver suporte ajax5
540    if(ajax5)
541    {
542        ajax5.open("POST", "gera-arvore.php", true);
543        ajax5.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
544        ajax5.onreadystatechange = function()
545        {
546            if(ajax5.readyState == 4 )
547            {
548                if(ajax5.responseXML)
549                {
550                    Processa_Lista_Arvore(ajax5.responseXML);
551                }
552                else
553                {
554                    //caso não seja um arquivo XML emite a mensagem abaixo
555                    alert("Erro lendo Certificdos das Cas...")
556                }
557            }
558        }
559        //passa o código do certificado desejado...
560        var params = "path3=" + path3;
561        ajax5.send(params);
562    }
563}
564
565function Processa_Lista_Arvore(obj)
566{
567    var dataArray   = obj.getElementsByTagName("certificados");
568    if(dataArray[0].textContent)
569        {
570            document.getElementById('xdiv2').innerHTML = decode64(dataArray[0].textContent);
571        }
572    else
573        {
574             document.getElementById('xdiv2').innerHTML = 'N&atilde;o foi poss&iacute;vel obter dados dos certificados.V01';
575        }
576}
Note: See TracBrowser for help on using the repository browser.