Changeset 3991 for branches/2.2.0.1/security/vercert.php
- Timestamp:
- 04/12/11 11:01:29 (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2.2.0.1/security/vercert.php
r3232 r3991 1 1 <?php 2 function item_para_uid($dados_do_certificado)3 {4 /*5 // Exemplo do Array $dados_do_certificado padrao ICP-BRASIL6 // O conteudo do array pode variar conforme a AC emissora.7 Array8 (9 [SERIALNUMBER] => 200903181623280210 [EMISSOR_CAMINHO_COMPLETO] => Array11 (12 [C] => BR13 [O] => ICP-Brasil14 [OU] => CSPB-115 [CN] => HOMAutoridade Certificadora do SERPRO Final v216 )17 18 [EMISSOR] => HOMAutoridade Certificadora do SERPRO Final v219 [INICIO_VALIDADE] => 2009031820521620 [FIM_VALIDADE] => 2012031720521621 [EXPIRADO] =>22 [SUBJECT] => Array23 (24 [C] => BR25 [O] => ICP-Brasil26 [OU] => Pessoa Fisica A327 [CN] => CESAR VIANNA28 )29 30 [NOME] => CESAR VIANNA31 [AUTHORITYKEYIDENTIFIER] => AE34F397BB05B1AA6CC3FD6C4F0E9129BBB61BE232 [KEYUSAGE] => Array33 (34 [digitalSignature] => 135 [nonRepudiation] => 136 [keyEncipherment] => 137 )38 39 [EXTKEYUSAGE] => Array40 (41 [clientAuth] => 1.3.6.1.5.5.7.3.242 [emailProtection] => 1.3.6.1.5.5.7.3.443 )44 45 [CA] =>46 [CRLDISTRIBUTIONPOINTS] => Array47 (48 [0] => http://ccdhom.serpro.gov.br/lcr/serproacfv2.crl49 [1] => http://ccdhom.serpro.gov.br/lcr/serproacfv3.crl50 [2] => http://ccdhom.serpro.gov.br/lcr/serproacfv4.crl51 )52 53 [2.16.76.1.3.6] => Array54 (55 [CADINSS] => 00000000000056 )57 58 [CADINSS] => 00000000000059 [2.16.76.1.3.5] => Array60 (61 [TITULO] => 00000000000062 [ZONA] => 00063 [SECAO] => 000064 [TITULO_CIDADE_UF] =>65 )66 67 [TITULO] => 00000000000068 [ZONA] => 00069 [SECAO] => 000070 [TITULO_CIDADE_UF] =>71 [2.16.76.1.3.1] => Array72 (73 [NASCIMENTO] => 1908198174 [CPF] => 1234567890275 [NIS] => 1234567890176 [RG] => 00020107515095377 [ORGAOUF] => SSPRS78 )79 80 [NASCIMENTO] => 1908198181 [CPF] => 1234567890282 [NIS] => 1234567890183 [RG] => 00020107515095384 [ORGAOUF] => SSPRS85 [EMAIL] => cesar.vianna@pr.planalto.gov.br86 )87 */88 89 // Retorna o CPF para usar como uid.90 return $dados_do_certificado['2.16.76.1.3.1']['CPF'];91 }92 93 94 2 $GLOBALS['phpgw_info']['flags'] = array( 95 3 'disable_Template_class' => True, … … 98 6 'noheader' => True 99 7 ); 100 101 if(!$_REQUEST['certificado'])102 {103 echo '2'.chr(0x0D).chr(0x0A).'Certificado não foi apresentado.';104 exit();105 }106 107 8 if(file_exists('../header.inc.php')) 108 109 110 9 { 10 include('../header.inc.php'); 11 } 111 12 else 112 { 113 echo '1'.chr(0x0D).chr(0x0A).'Arquivo header.inc.php não foi localizado.'; 114 exit(); 115 } 116 13 { 14 echo '1'.chr(0x0D).chr(0x0A).lang('Error. header.inc.php not found'); 15 exit(); 16 } 17 if(!$_POST['certificado']) 18 { 19 echo '2'.chr(0x0D).chr(0x0A).lang('Fail to get certificate'); 20 exit(); 21 } 117 22 require_once('classes/CertificadoB.php'); 118 23 require_once('classes/Verifica_Certificado.php'); 119 24 include('classes/Verifica_Certificado_conf.php'); 120 121 # Transforma o certificado do formato PEM para o formato DER ... 122 function troca_espaco_por_mais($pem_data) 123 { 124 $begin = "CERTIFICATE-----"; 125 $end = "-----END"; 126 $aux = substr($pem_data, strpos($pem_data, $begin)+strlen($begin)); 127 $aux = substr($aux, 0, strpos($aux, $end)); 128 $aux = strtr($aux,' ','+'); 129 $aux = '-----BEGIN CERTIFICATE-----'.$aux.'-----END CERTIFICATE-----'; 130 return $aux; 131 } 132 133 $cert =str_replace(chr(0x0A).chr(0x0A),chr(0x0A),$_REQUEST['certificado']); 25 $cert =str_replace(chr(0x0A).chr(0x0A),chr(0x0A),$_POST['certificado']); 134 26 $cert = troca_espaco_por_mais($cert); 135 136 27 $c = new certificadoB(); 137 28 $c->certificado($cert); 138 139 29 if (!$c->apresentado) 140 { 141 echo '2'.chr(0x0D).chr(0x0A).'Certificado não foi apresentado.'; 142 exit(); 143 } 144 145 if (!$c->dados['CPF']) 146 { 147 echo '2'.chr(0x0D).chr(0x0A).'Não foi possível obter o CPF do certificado apresentado.'; 148 exit(); 149 } 150 30 { 31 echo '3'.chr(0x0D).chr(0x0A).lang('Fail to get certificate'); 32 exit(); 33 } 151 34 $b = new Verifica_Certificado($c->dados,$cert); 152 153 // Testa se Certificado OK.154 35 if(!$b->status) 155 { 156 $msg = '3'.chr(0x0D).chr(0x0A).$b->msgerro; 157 158 foreach($b->erros_ssl as $linha) 159 { 160 $msg .= "\n" . $linha; 161 } 162 163 echo $msg; 164 exit(); 165 } 166 36 { 37 $msg = '4'.chr(0x0D).chr(0x0A).$b->msgerro; 38 foreach($b->erros_ssl as $linha) 39 { 40 $msg .= "\n" . $linha; 41 } 42 echo $msg; 43 exit(); 44 } 167 45 if ( (!empty($GLOBALS['phpgw_info']['server']['ldap_master_host'])) && 168 169 170 171 172 173 174 46 (!empty($GLOBALS['phpgw_info']['server']['ldap_master_root_dn'])) && 47 (!empty($GLOBALS['phpgw_info']['server']['ldap_master_root_pw'])) ) 48 { 49 $ds = $GLOBALS['phpgw']->common->ldapConnect($GLOBALS['phpgw_info']['server']['ldap_master_host'], 50 $GLOBALS['phpgw_info']['server']['ldap_master_root_dn'], 51 $GLOBALS['phpgw_info']['server']['ldap_master_root_pw']); 52 } 175 53 else 176 { 177 $ds = $GLOBALS['phpgw']->common->ldapConnect(); 178 } 179 54 { 55 $ds = $GLOBALS['phpgw']->common->ldapConnect(); 56 } 180 57 if (!$ds) 181 58 { 182 echo ' 8'.chr(0x0D).chr(0x0A).'Não foi possível obter dados do usuario para login.';59 echo '5'.chr(0x0D).chr(0x0A).lang('Failure when get user data to login'); 183 60 exit(); 184 61 } 185 186 $filtro = 'uid='. item_para_uid($c->dados); 187 $atributos = array(); 188 //$atributos[] = 'phpgwaccountexpires'; 189 $atributos[] = 'phpgwlastpasswdchange'; 190 191 if(isset($GLOBALS['phpgw_info']['server']['atributoexpiracao'])) 192 { 193 $atributos[] = $GLOBALS['phpgw_info']['server']['atributoexpiracao']; 194 } 195 196 $atributos[] = "usercertificate"; 197 $atributos[] = "phpgwaccountstatus"; 198 $atributos[] = "cryptpassword"; 199 $atributos[] = "uid"; 200 201 $sr=ldap_search($ds, $GLOBALS['phpgw_info']['server']['ldap_context'],$filtro,$atributos); 202 203 // Pega resultado .... 204 $info = ldap_get_entries($ds, $sr); 205 206 // Tem de achar só uma entrada.....ao menos uma.... 207 if($info["count"]!=1) 62 $cert_atrib_cpf = isset($GLOBALS['phpgw_info']['server']['certificado_atributo_cpf'])&&$GLOBALS['phpgw_info']['server']['certificado_atributo_cpf']!=''?$GLOBALS['phpgw_info']['server']['certificado_atributo_cpf']:"uid"; 63 $filtro = $cert_atrib_cpf .'='. $c->dados['2.16.76.1.3.1']['CPF']; 64 $atributos = array(); 65 $atributos[] = "usercertificate"; 66 $atributos[] = "phpgwaccountstatus"; 67 $atributos[] = "cryptpassword"; 68 $atributos[] = "uid"; 69 $sr=ldap_search($ds, $GLOBALS['phpgw_info']['server']['ldap_context'],$filtro,$atributos); 70 $info = ldap_get_entries($ds, $sr); 71 if($info["count"]!=1) 72 { 73 echo '6'.chr(0x0D).chr(0x0A).lang('Invalid data from users directory'); 74 ldap_close($ds); 75 exit(); 76 } 77 if($info[0]['phpgwaccountstatus'][0]!='A') 208 78 { 209 echo ' 4'.chr(0x0D).chr(0x0A).'Dados inválidos no diretório de usuários';79 echo '7'.chr(0x0D).chr(0x0A).lang('User account is inactive in Expresso'); 210 80 ldap_close($ds); 211 81 exit(); 212 82 } 213 214 // A conta expresso tem de estar ativa....215 if($info[0]['phpgwaccountstatus'][0]!='A')216 {217 echo '5'.chr(0x0D).chr(0x0A).'Conta do usuario nao esta ativa no Expresso.';218 ldap_close($ds);219 exit();220 }221 222 83 if($info[0]["cryptpassword"][0] && $info[0]["usercertificate"][0] && $cert == $info[0]["usercertificate"][0] ) 223 84 { … … 226 87 else 227 88 { 228 if(!$info[0]["usercertificate"][0] || $cert != $info[0]["usercertificate"][0]) 229 { 230 $user_info = array(); 231 $aux1 = $info[0]["dn"]; 232 $user_info['usercertificate'] = $cert; 233 if(isset($GLOBALS['phpgw_info']['server']['atributoexpiracao'])) 234 { 235 if(substr($info[0][$GLOBALS['phpgw_info']['server']['atributoexpiracao']][0],-1,1)=="Z") 236 { 237 $user_info[$GLOBALS['phpgw_info']['server']['atributoexpiracao']] = '19800101000000Z'; 238 } 239 else 240 { 241 $user_info[$GLOBALS['phpgw_info']['server']['atributoexpiracao']] = '0'; 242 } 243 } 244 else 245 { 246 $user_info['phpgwlastpasswdchange'] = '0'; 247 } 248 249 if(!ldap_modify($ds,$aux1,$user_info)) 250 { 251 echo '7'.chr(0x0D).chr(0x0A).'Ocorreu um erro no acolhimento do certificado.',$aux1; 252 } 253 else 254 { 255 echo '6'.chr(0x0D).chr(0x0A).'Seu Certificado foi cadastrado. Sua senha foi expirada. Altere sua senha para concluir o processo.'; 256 } 257 } 258 else 259 { 260 echo '6'.chr(0x0D).chr(0x0A).'Sua senha foi expirada. Altere sua senha para acessar o Expresso usando certificado digital.'; 261 } 89 echo '8'.chr(0x0D).chr(0x0A).lang('The current certificate not registered to login'); 262 90 } 263 91 ldap_close($ds);
Note: See TracChangeset
for help on using the changeset viewer.