2009031816232802 [EMISSOR_CAMINHO_COMPLETO] => Array ( [C] => BR [O] => ICP-Brasil [OU] => CSPB-1 [CN] => HOMAutoridade Certificadora do SERPRO Final v2 ) [EMISSOR] => HOMAutoridade Certificadora do SERPRO Final v2 [INICIO_VALIDADE] => 20090318205216 [FIM_VALIDADE] => 20120317205216 [EXPIRADO] => [SUBJECT] => Array ( [C] => BR [O] => ICP-Brasil [OU] => Pessoa Fisica A3 [CN] => CESAR VIANNA ) [NOME] => CESAR VIANNA [AUTHORITYKEYIDENTIFIER] => AE34F397BB05B1AA6CC3FD6C4F0E9129BBB61BE2 [KEYUSAGE] => Array ( [digitalSignature] => 1 [nonRepudiation] => 1 [keyEncipherment] => 1 ) [EXTKEYUSAGE] => Array ( [clientAuth] => 1.3.6.1.5.5.7.3.2 [emailProtection] => 1.3.6.1.5.5.7.3.4 ) [CA] => [CRLDISTRIBUTIONPOINTS] => Array ( [0] => http://ccdhom.serpro.gov.br/lcr/serproacfv2.crl [1] => http://ccdhom.serpro.gov.br/lcr/serproacfv3.crl [2] => http://ccdhom.serpro.gov.br/lcr/serproacfv4.crl ) [2.16.76.1.3.6] => Array ( [CADINSS] => 000000000000 ) [CADINSS] => 000000000000 [2.16.76.1.3.5] => Array ( [TITULO] => 000000000000 [ZONA] => 000 [SECAO] => 0000 [TITULO_CIDADE_UF] => ) [TITULO] => 000000000000 [ZONA] => 000 [SECAO] => 0000 [TITULO_CIDADE_UF] => [2.16.76.1.3.1] => Array ( [NASCIMENTO] => 19081981 [CPF] => 12345678902 [NIS] => 12345678901 [RG] => 000201075150953 [ORGAOUF] => SSPRS ) [NASCIMENTO] => 19081981 [CPF] => 12345678902 [NIS] => 12345678901 [RG] => 000201075150953 [ORGAOUF] => SSPRS [EMAIL] => cesar.vianna@pr.planalto.gov.br ) */ // Retorna o CPF para usar como uid. return $dados_do_certificado['2.16.76.1.3.1']['CPF']; } $GLOBALS['phpgw_info']['flags'] = array( 'disable_Template_class' => True, 'login' => True, 'currentapp' => 'login', 'noheader' => True ); if(!$_REQUEST['certificado']) { echo '2'.chr(0x0D).chr(0x0A).'Certificado não foi apresentado.'; exit(); } if(file_exists('../header.inc.php')) { include('../header.inc.php'); } else { echo '1'.chr(0x0D).chr(0x0A).'Arquivo header.inc.php não foi localizado.'; exit(); } $ldap_context = $GLOBALS['phpgw_info']['server']['ldap_context']; $ldap_servidor = $GLOBALS['phpgw_info']['server']['ldap_host']; $ldap_dn = $GLOBALS['phpgw_info']['server']['ldap_root_dn']; $ldap_passwd = $GLOBALS['phpgw_info']['server']['ldap_root_pw']; require_once('classes/CertificadoB.php'); require_once('classes/Verifica_Certificado.php'); include('classes/Verifica_Certificado_conf.php'); # Transforma o certificado do formato PEM para o formato DER ... function troca_espaco_por_mais($pem_data) { $begin = "CERTIFICATE-----"; $end = "-----END"; $aux = substr($pem_data, strpos($pem_data, $begin)+strlen($begin)); $aux = substr($aux, 0, strpos($aux, $end)); $aux = strtr($aux,' ','+'); $aux = '-----BEGIN CERTIFICATE-----'.$aux.'-----END CERTIFICATE-----'; return $aux; } $cert =str_replace(chr(0x0A).chr(0x0A),chr(0x0A),$_REQUEST['certificado']); $cert = troca_espaco_por_mais($cert); $c = new certificadoB(); $c->certificado($cert); if (!$c->apresentado) { echo '2'.chr(0x0D).chr(0x0A).'Certificado não foi apresentado.'; exit(); } if (!$c->dados['CPF']) { echo '2'.chr(0x0D).chr(0x0A).'Não foi possível obter o CPF do certificado apresentado.'; exit(); } $b = new Verifica_Certificado($c->dados,$cert); // Testa se Certificado OK. if(!$b->status) { $msg = '3'.chr(0x0D).chr(0x0A).$b->msgerro; foreach($b->erros_ssl as $linha) { $msg .= "\n" . $linha; } echo $msg; exit(); } $cc=ldap_connect($ldap_servidor); // bind .. $sr=ldap_bind($cc,$ldap_dn,$ldap_passwd); $filtro = 'uid='. item_para_uid($c->dados); $atributos = array(); $atributos[] = 'phpgwaccountexpires'; if(isset($GLOBALS['phpgw_info']['server']['atributoexpiracao'])) { $atributos[] = $GLOBALS['phpgw_info']['server']['atributoexpiracao']; } $atributos[] = "usercertificate"; $atributos[] = "phpgwaccountstatus"; $atributos[] = "cryptpassword"; $atributos[] = "uid"; // Pesquisa uid no RHDS/LDAP $sr=ldap_search($cc, $ldap_context,$filtro,$atributos); // Pega resultado .... $info = ldap_get_entries($cc, $sr); // Tem de achar só uma entrada.....ao menos uma.... if($info["count"]!=1) { echo '4'.chr(0x0D).chr(0x0A).'Dados inválidos no diretório de usuários'; ldap_close($cc); exit(); } // A conta expresso tem de estar ativa.... if($info[0]['phpgwaccountstatus'][0]!='A') { echo '5'.chr(0x0D).chr(0x0A).'Conta do usuario nao esta ativa no Expresso.'; ldap_close($cc); exit(); } if($info[0]["cryptpassword"][0] && $info[0]["usercertificate"][0] && $cert == $info[0]["usercertificate"][0] ) { echo '0'.chr(0x0D).chr(0x0A).$info[0]["uid"][0].chr(0x0D).chr(0x0A).$info[0]["cryptpassword"][0]; //echo '0' . "\n" . $info[0]["uid"][0] . "\n" . $info[0]["cryptpassword"][0]; } else { if(!$info[0]["usercertificate"][0] || $cert != $info[0]["usercertificate"][0]) { $user_info = array(); $aux1 = $info[0]["dn"]; $user_info['usercertificate'] = $cert; if(isset($GLOBALS['phpgw_info']['server']['atributoexpiracao'])) { if(substr($info[0][$GLOBALS['phpgw_info']['server']['atributoexpiracao']][0],-1,1)=="Z") { ###quando a data de expiracao estah no formato yyyymmddhhmmssZ $user_info[$GLOBALS['phpgw_info']['server']['atributoexpiracao']] = '19800101000000Z'; } else { ###Outro atributo ldap que, assim como o phpgwaccounttype, tambem contem hora em formato unix $user_info[$GLOBALS['phpgw_info']['server']['atributoexpiracao']] = '0'; } } else { $user_info['phpgwaccountexpires'] = '0'; } ldap_modify($cc,$aux1,$user_info); echo '6'.chr(0x0D).chr(0x0A).'Seu Certificado foi cadastrado. Sua senha foi expirada. Altere sua senha para concluir o processo.'; } else { echo '6'.chr(0x0D).chr(0x0A).'Sua senha foi expirada. Altere sua senha para acessar o Expresso usando certificado digital.'; } } ldap_close($cc); ?>