Changeset 3232 for branches/2.2/security/certificados.js
- Timestamp:
- 09/13/10 15:01:56 (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2.2/security/certificados.js
r1174 r3232 1 var num = 0; 2 var titulo = ''; 3 1 2 var ua = navigator.userAgent.toLowerCase(); 3 if (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 38 var num = 0; 39 var 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 45 var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; 46 47 function 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 75 function 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 4 107 function msgWin(msg,w,h,params) 5 { 6 var winl = (screen.width - w ) / 2; 7 var wint = (screen.height - h) / 2; 8 var parm = "width=" + w + ",height=" + h + ",top=" + wint + ",left=" + winl + params; 9 win3 = window.open("","12345" + num,parm); 10 num = num + 1; 11 win3.document.writeln(msg); 12 win3.focus(); 13 } 14 15 function Um_Certificado(valor) 16 { 17 if(valor.length < 2) { return; } 18 //verifica se o browser tem suporte a ajax 19 try 20 { 21 ajax = new ActiveXObject("Microsoft.XMLHTTP"); 22 } 23 catch(e) 24 { 25 try 26 { 27 ajax = new ActiveXObject("Msxml2.XMLHTTP"); 28 } 29 catch(ex) 30 { 31 try 32 { 33 ajax = new XMLHttpRequest(); 34 } 35 catch(exc) 36 { 37 alert("Esse browser não tem recursos para uso do Ajax"); 38 ajax = null; 39 } 40 } 41 } 42 43 //se tiver suporte ajax 44 if(ajax) 45 { 46 titulo = valor; 47 ajax.open("POST", "certs_xml.php", true); 48 ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 49 ajax.onreadystatechange = function() 50 { 51 //enquanto estiver processando...emite a msg de carregando 52 //if(ajax.readyState == 1) 53 // { 54 // //idOpcao.innerHTML = "Obtendo Certificados ...! "; 55 // } 56 //após ser processado - chama função processa_um_certificado que vai varrer os dados 57 if(ajax.readyState == 4 ) 58 { 59 if(ajax.responseXML) 60 { 61 processa_um_certificado(ajax.responseXML); 62 } 63 else 64 { 65 //caso não seja um arquivo XML emite a mensagem abaixo 66 msg = 'Não foi possível obter dados do certificado.' + '<br/><br/><div align="center"><INPUT type="button" value="Fechar" onClick="window.close()">'; 67 parms = ",scrollbars=1"; 68 msgWin(msg,450,200,parms) 69 } 70 } 71 } 72 //passa o código do certificado desejado... 73 var params = "id="+valor; 74 ajax.send(params); 75 } 76 } 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 118 function 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 128 function 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 144 function Salvar_arq(id,msg) 145 { 146 var resp = confirm(msg); 147 if (resp){ 148 document.getElementById(id).submit(); 149 } 150 } 151 152 function 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 205 function 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 241 function 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ão foi possí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 } 77 300 78 function processa_um_certificado(obj) 79 { 80 // Tab com tags que deve exibir sho o nome.... 81 var TBtags = new Array( "EMISSOR_CAMINHO_COMPLETO", "SUBJECT" , "CRLDISTRIBUTIONPOINTS" , "KEYUSAGE" ); 82 //pega a tag certificado 83 var dataArray = obj.getElementsByTagName("certificado"); 84 //total de elementos contidos na tag 85 if(dataArray.length > 0) 86 { 87 var novo = "<head><title>" + titulo + "</title></head><body><font size=2><h3 align=center ><font color=#0000EE>Dados do certificado</font></h3>"; 88 //percorre o arquivo XML para extrair os dados 89 for(var i = 0 ; i < dataArray.length ; i++) 90 { 91 var item = dataArray[i]; 92 var cc = item.getElementsByTagName("*"); 93 len = 0; 94 for(var j = 0 ; j < cc.length ; j++) 95 { 96 //contéudo dos campos no arquivo XML 97 var tag = cc[j].nodeName 98 if(tag == "CA") continue; // skipa tag CA .... 99 var xflag = 0; 100 for(var iz = 0;iz< TBtags.length;iz++) 101 { 102 if(TBtags[iz] == tag) xflag = 1; 103 } 104 // Testa se deve exibir o valor da tag.. 105 if(xflag ==1 ) 106 { 107 var nome = "<b>" +tag +":</b> "; 108 } 109 else 110 { 111 // Testa o browser para usar a propriedade correta ... 112 if (navigator.userAgent.match('MSIE')) 113 { 114 var conteudo = cc[j].text; 115 } 116 else 117 { 118 var conteudo = cc[j].textContent; 119 } 301 function 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 } 120 344 121 if(conteudo == "1") 122 123 124 345 if(conteudo == "1") 346 { 347 conteudo = "Sim."; 348 } 125 349 126 if(conteudo == "") 127 128 129 } 350 if(conteudo == "") 351 { 352 conteudo = "Não."; 353 } 130 354 131 132 355 switch(tag) 356 { 133 357 134 case "INICIO_VALIDADE": 135 { 136 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"; 137 conteudo = aux; 138 break; 139 } 140 case "FIM_VALIDADE": 141 { 142 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"; 143 conteudo = aux; 144 break; 145 } 146 default: 147 { 148 break; 149 } 150 } 151 var nome = "<b>" + tag +":</b> " + conteudo; 152 } 153 novo = novo + nome + '<br/>'; 154 len = len + 24; 155 } 156 } 157 msg = novo + '<br/><br/><div align="center"><INPUT type="button" value="Fechar" onClick="window.close()"></font></body>'; 158 } 159 else 160 { 161 //caso o XML volte vazio, printa a mensagem abaixo 162 msg = 'Não foi possível obter dados do certificado.' + '<br/><br/><div align="center"><INPUT type="button" value="Fechar" onClick="window.close()"></font></body>'; 163 len =200; 164 } 165 parms = ",scrollbars=1"; 166 num = num + 1; 167 msgWin(msg,450,len,parms) 168 } 169 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ão foi possí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 394 function 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 451 function 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ão foi possível obter dados dos certificados.V02'; 508 } 509 document.getElementById('xdiv1').innerHTML = msg; 510 } 511 512 function 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 565 function 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ão foi possível obter dados dos certificados.V01'; 575 } 576 }
Note: See TracChangeset
for help on using the changeset viewer.