Changeset 3991


Ignore:
Timestamp:
04/12/11 11:01:29 (9 years ago)
Author:
rafaelraymundo
Message:

Ticket #1739 - Login com certificado em atributo customizável

Location:
branches/2.2.0.1
Files:
1 added
10 edited

Legend:

Unmodified
Added
Removed
  • branches/2.2.0.1/preferences/inc/hook_preferences.inc.php

    r2 r3991  
    1616                $file['Change your Password'] = $GLOBALS['phpgw']->link('/preferences/changepassword.php'); 
    1717        } 
     18        if (isset($GLOBALS['phpgw_info']['server']['certificado'])) 
     19            { 
     20                if ($GLOBALS['phpgw_info']['server']['certificado']) 
     21                { 
     22                        $file['Register Digital Certificate'] = $GLOBALS['phpgw']->link('/preferences/handlecertificate.php'); 
     23                } 
     24            } 
    1825        $file['change your settings'] = $GLOBALS['phpgw']->link('/preferences/preferences.php','appname=preferences'); 
    1926         
  • branches/2.2.0.1/security/classes/funcoes_auxiliares.php

    r3563 r3991  
    151151        } 
    152152 
    153  
     153        function troca_espaco_por_mais($pem_data) 
     154        { 
     155            $begin = "CERTIFICATE-----"; 
     156            $end   = "-----END"; 
     157            $aux = substr($pem_data, strpos($pem_data, $begin)+strlen($begin)); 
     158            $aux = substr($aux, 0, strpos($aux, $end)); 
     159            $aux = strtr($aux,' ','+'); 
     160            $aux = '-----BEGIN CERTIFICATE-----'.$aux.'-----END CERTIFICATE-----'; 
     161            return $aux; 
     162        } 
    154163        function verificaopenssl() 
    155164        { 
  • branches/2.2.0.1/security/vercert.php

    r3232 r3991  
    11<?php 
    2 function item_para_uid($dados_do_certificado) 
    3         { 
    4 /* 
    5 // Exemplo do Array $dados_do_certificado padrao ICP-BRASIL 
    6 // O conteudo do array pode variar conforme a AC emissora. 
    7 Array 
    8 ( 
    9     [SERIALNUMBER] => 2009031816232802 
    10     [EMISSOR_CAMINHO_COMPLETO] => Array 
    11         ( 
    12             [C] => BR 
    13             [O] => ICP-Brasil 
    14             [OU] => CSPB-1 
    15             [CN] => HOMAutoridade Certificadora do SERPRO Final v2 
    16         ) 
    17  
    18     [EMISSOR] => HOMAutoridade Certificadora do SERPRO Final v2 
    19     [INICIO_VALIDADE] => 20090318205216 
    20     [FIM_VALIDADE] => 20120317205216 
    21     [EXPIRADO] => 
    22     [SUBJECT] => Array 
    23         ( 
    24             [C] => BR 
    25             [O] => ICP-Brasil 
    26             [OU] => Pessoa Fisica A3 
    27             [CN] => CESAR VIANNA 
    28         ) 
    29  
    30     [NOME] => CESAR VIANNA 
    31     [AUTHORITYKEYIDENTIFIER] => AE34F397BB05B1AA6CC3FD6C4F0E9129BBB61BE2 
    32     [KEYUSAGE] => Array 
    33         ( 
    34             [digitalSignature] => 1 
    35             [nonRepudiation] => 1 
    36             [keyEncipherment] => 1 
    37         ) 
    38  
    39     [EXTKEYUSAGE] => Array 
    40         ( 
    41             [clientAuth] => 1.3.6.1.5.5.7.3.2 
    42             [emailProtection] => 1.3.6.1.5.5.7.3.4 
    43         ) 
    44  
    45     [CA] => 
    46     [CRLDISTRIBUTIONPOINTS] => Array 
    47         ( 
    48             [0] => http://ccdhom.serpro.gov.br/lcr/serproacfv2.crl 
    49             [1] => http://ccdhom.serpro.gov.br/lcr/serproacfv3.crl 
    50             [2] => http://ccdhom.serpro.gov.br/lcr/serproacfv4.crl 
    51         ) 
    52  
    53     [2.16.76.1.3.6] => Array 
    54         ( 
    55             [CADINSS] => 000000000000 
    56         ) 
    57  
    58     [CADINSS] => 000000000000 
    59     [2.16.76.1.3.5] => Array 
    60         ( 
    61             [TITULO] => 000000000000 
    62             [ZONA] => 000 
    63             [SECAO] => 0000 
    64             [TITULO_CIDADE_UF] => 
    65         ) 
    66  
    67     [TITULO] => 000000000000 
    68     [ZONA] => 000 
    69     [SECAO] => 0000 
    70     [TITULO_CIDADE_UF] => 
    71     [2.16.76.1.3.1] => Array 
    72         ( 
    73             [NASCIMENTO] => 19081981 
    74             [CPF] => 12345678902 
    75             [NIS] => 12345678901 
    76             [RG] => 000201075150953 
    77             [ORGAOUF] => SSPRS 
    78         ) 
    79  
    80     [NASCIMENTO] => 19081981 
    81     [CPF] =>  12345678902 
    82     [NIS] => 12345678901 
    83     [RG] => 000201075150953 
    84     [ORGAOUF] => SSPRS 
    85     [EMAIL] => cesar.vianna@pr.planalto.gov.br 
    86 ) 
    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  
    942$GLOBALS['phpgw_info']['flags'] = array( 
    953                'disable_Template_class' => True, 
     
    986                'noheader'               => True 
    997        ); 
    100  
    101 if(!$_REQUEST['certificado']) 
    102 { 
    103    echo '2'.chr(0x0D).chr(0x0A).'Certificado não foi apresentado.'; 
    104    exit(); 
    105 } 
    106  
    1078if(file_exists('../header.inc.php')) 
    108         { 
    109                 include('../header.inc.php'); 
    110         } 
     9    { 
     10        include('../header.inc.php'); 
     11    } 
    11112else 
    112         { 
    113                 echo '1'.chr(0x0D).chr(0x0A).'Arquivo header.inc.php n&atilde;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    } 
     17if(!$_POST['certificado']) 
     18    { 
     19        echo '2'.chr(0x0D).chr(0x0A).lang('Fail to get certificate'); 
     20        exit(); 
     21    } 
    11722require_once('classes/CertificadoB.php'); 
    11823require_once('classes/Verifica_Certificado.php'); 
    11924include('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']); 
    13426$cert = troca_espaco_por_mais($cert); 
    135  
    13627$c = new certificadoB(); 
    13728$c->certificado($cert); 
    138  
    13929if (!$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    } 
    15134$b = new Verifica_Certificado($c->dados,$cert); 
    152  
    153 // Testa se Certificado OK. 
    15435if(!$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    } 
    16745if ( (!empty($GLOBALS['phpgw_info']['server']['ldap_master_host'])) && 
    168                     (!empty($GLOBALS['phpgw_info']['server']['ldap_master_root_dn'])) && 
    169                     (!empty($GLOBALS['phpgw_info']['server']['ldap_master_root_pw'])) ) 
    170         { 
    171                 $ds = $GLOBALS['phpgw']->common->ldapConnect($GLOBALS['phpgw_info']['server']['ldap_master_host'], 
    172                         $GLOBALS['phpgw_info']['server']['ldap_master_root_dn'], 
    173                         $GLOBALS['phpgw_info']['server']['ldap_master_root_pw']); 
    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    } 
    17553else 
    176         { 
    177                 $ds = $GLOBALS['phpgw']->common->ldapConnect(); 
    178         } 
    179  
     54    { 
     55        $ds = $GLOBALS['phpgw']->common->ldapConnect(); 
     56    } 
    18057if (!$ds) 
    18158     { 
    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'); 
    18360        exit(); 
    18461     } 
    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); 
     71if($info["count"]!=1) 
     72{ 
     73    echo '6'.chr(0x0D).chr(0x0A).lang('Invalid data from users directory'); 
     74    ldap_close($ds); 
     75    exit(); 
     76} 
     77if($info[0]['phpgwaccountstatus'][0]!='A') 
    20878    { 
    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'); 
    21080        ldap_close($ds); 
    21181        exit(); 
    21282    } 
    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  
    22283if($info[0]["cryptpassword"][0] && $info[0]["usercertificate"][0] && $cert == $info[0]["usercertificate"][0] ) 
    22384    { 
     
    22687else 
    22788    { 
    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'); 
    26290    } 
    26391ldap_close($ds); 
  • branches/2.2.0.1/setup/manageheader.php

    r3304 r3991  
    596596                                        $setup_tpl->set_var('use_https_0',' checked'); 
    597597                                        $setup_tpl->set_var('div_cert',' style="display:none" '); 
     598                                        $setup_tpl->set_var('div_atributo_cpf',' style="display:none" '); 
    598599                                        $setup_tpl->set_var('div_criptox',' style="display:none" '); 
    599600                                         
     
    614615                                default: 
    615616                                        $setup_tpl->set_var('certificado_0',' checked'); 
     617                                        $setup_tpl->set_var('div_atributo_cpf',' style="display:none" '); 
    616618                                        $setup_tpl->set_var('div_cripto',' style="display:none" '); 
    617619                                        $setup_tpl->set_var('div_criptox',' style="display:none" '); 
     
    623625                                        break; 
    624626                        } 
    625                          
     627 
     628                        if($GLOBALS['phpgw_info']['server']['certificado_atributo_cpf']) 
     629                        { 
     630                                $setup_tpl->set_var('certificado_atributo_cpf',$GLOBALS['phpgw_info']['server']['certificado_atributo_cpf']); 
     631                        } 
     632 
    626633                        switch($GLOBALS['phpgw_info']['server']['captcha']) 
    627634                        { 
  • branches/2.2.0.1/setup/templates/default/manageheader.tpl

    r3304 r3991  
    2222                document.getElementById('cert_0').checked = true; 
    2323        } 
     24        if(xdiv.id == "criptografiax") { 
     25                document.getElementById("atributo_cpf").style.display='none'; 
     26        } 
    2427        if( xdiv.id == "certificado" || xdiv.id == "criptografia") { 
    2528                var xdiv = document.getElementById('criptografia'); 
    2629                document.getElementById('cripto_0').checked = true; 
     30                document.getElementById("atributo_cpf").style.display='none'; 
    2731        } 
    2832        if(xdiv.id == "certificado" || xdiv.id == "criptografia" ) { 
     
    4145  { 
    4246        var xdiv = document.getElementById(zdiv); 
     47        if(zdiv == "criptografiax") { 
     48                document.getElementById("atributo_cpf").style.display=''; 
     49        } 
    4350        if(xdiv.id == "cripto_options") { 
    4451                document.getElementById('maxcerttxt').value = '10'; 
     
    183190        <tr><td colspan="2"><b>Usar Certificado Digital (para identificar o usuario no processo de login)?</b></td></tr> 
    184191        <tr><td colspan="2"> 
    185                   <font color='red'>Obs.: Para habilitar este item o uso do HTTPS deve ter sido habilitado.</font><br> 
     192                <font color='red'>Obs.: Para habilitar este item o uso do HTTPS deve ter sido habilitado.</font><br> 
    186193                <INPUT id="cert_0" type="radio" {certificado_0} name="setting[certificado]" onclick="javascript:ocultar('criptografiax')" value="0" >N&Atilde;O Usar Certificado Digital.<BR> 
    187194                 
    188195                <INPUT id="cert_1" type="radio" {certificado_1} name="setting[certificado]" onclick="javascript:exibir('criptografiax')" value="1">Usar Certificado Digital.<BR> 
     196               <div id="atributo_cpf" {div_atributo_cpf}> 
     197                <b>Nome do atributo , no ldap, para identificar CPF do proprietario do certificado digital</b><BR> 
     198                <INPUT type="text" maxlength="50" size="40" name="setting[certificado_atributo_cpf]" id="certificado_atributo_cpf" value="{certificado_atributo_cpf}" ><BR> 
     199               </div> 
    189200        </td></tr> 
    190201        </table> 
Note: See TracChangeset for help on using the changeset viewer.