source: trunk/security/vercert.php @ 1636

Revision 1636, 7.0 KB checked in by rafaelraymundo, 14 years ago (diff)

Ticket #794 - Corrige o vercert/CertificadoB para "setar" a vrs do ldap qdo acessar usercertificate

Line 
1<?php
2function 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.
7Array
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       
94$GLOBALS['phpgw_info']['flags'] = array(
95                'disable_Template_class' => True,
96                'login'                  => True,
97                'currentapp'             => 'login',
98                'noheader'               => True
99        );
100
101if(!$_REQUEST['certificado'])
102{
103   echo '2'.chr(0x0D).chr(0x0A).'Certificado não foi apresentado.';
104   exit();
105}
106
107if(file_exists('../header.inc.php'))
108        {
109                include('../header.inc.php');
110        }
111else
112        {
113                echo '1'.chr(0x0D).chr(0x0A).'Arquivo header.inc.php n&atilde;o foi localizado.';
114                exit();   
115        }
116   
117$ldap_context = $GLOBALS['phpgw_info']['server']['ldap_context'];
118$ldap_servidor = $GLOBALS['phpgw_info']['server']['ldap_host'];
119$ldap_dn = $GLOBALS['phpgw_info']['server']['ldap_root_dn'];
120$ldap_passwd = $GLOBALS['phpgw_info']['server']['ldap_root_pw'];
121
122require_once('classes/CertificadoB.php');
123require_once('classes/Verifica_Certificado.php');
124include('classes/Verifica_Certificado_conf.php');
125
126  # Transforma o certificado do formato PEM para o formato DER ...
127  function troca_espaco_por_mais($pem_data)
128  {
129    $begin = "CERTIFICATE-----";
130    $end   = "-----END";
131    $aux = substr($pem_data, strpos($pem_data, $begin)+strlen($begin));   
132    $aux = substr($aux, 0, strpos($aux, $end));
133    $aux = strtr($aux,' ','+');
134    $aux = '-----BEGIN CERTIFICATE-----'.$aux.'-----END CERTIFICATE-----';
135    return $aux;
136  }
137 
138
139$cert =str_replace(chr(0x0A).chr(0x0A),chr(0x0A),$_REQUEST['certificado']);
140$cert = troca_espaco_por_mais($cert);
141
142$c = new certificadoB();
143$c->certificado($cert);
144
145if (!$c->apresentado)
146{
147   echo '2'.chr(0x0D).chr(0x0A).'Certificado não foi apresentado.';
148   exit();
149}
150
151if (!$c->dados['CPF'])
152{
153   echo '2'.chr(0x0D).chr(0x0A).'Não foi possível obter o CPF do certificado apresentado.';
154   exit();
155}
156
157$b = new Verifica_Certificado($c->dados,$cert);
158
159// Testa se Certificado OK.
160if(!$b->status)
161{
162   $msg = '3'.chr(0x0D).chr(0x0A).$b->msgerro;
163
164   foreach($b->erros_ssl  as $linha)
165   {
166        $msg .= "\n" . $linha;
167   }
168
169   echo $msg;
170   exit();   
171}
172
173    $cc=ldap_connect($ldap_servidor);
174    ldap_set_option($cc, LDAP_OPT_PROTOCOL_VERSION, 3);
175    //  bind ..
176    $sr=ldap_bind($cc,$ldap_dn,$ldap_passwd); 
177
178    $filtro = 'uid='. item_para_uid($c->dados);
179
180    $atributos = array();
181    //$atributos[] = 'phpgwaccountexpires';
182    $atributos[] = 'phpgwlastpasswdchange';
183
184    if(isset($GLOBALS['phpgw_info']['server']['atributoexpiracao']))
185                {
186                    $atributos[] = $GLOBALS['phpgw_info']['server']['atributoexpiracao'];
187                }
188
189     $atributos[] = "usercertificate";
190     $atributos[] = "phpgwaccountstatus";
191     $atributos[] = "cryptpassword";
192     $atributos[] = "uid";
193     
194    // Pesquisa uid no RHDS/LDAP
195    $sr=ldap_search($cc, $ldap_context,$filtro,$atributos);   
196
197    // Pega resultado ....
198    $info = ldap_get_entries($cc, $sr);
199   
200    // Tem de achar só uma entrada.....ao menos uma....
201    if($info["count"]!=1)
202    {
203        echo '4'.chr(0x0D).chr(0x0A).'Dados inválidos no diretório de usuários';       
204        ldap_close($cc);
205        exit();
206    }
207
208// A conta expresso tem de estar ativa....
209if($info[0]['phpgwaccountstatus'][0]!='A')
210    {
211        echo '5'.chr(0x0D).chr(0x0A).'Conta do usuario nao esta ativa no Expresso.';
212        ldap_close($cc);
213        exit();
214    }
215
216if($info[0]["cryptpassword"][0] && $info[0]["usercertificate"][0] && $cert == $info[0]["usercertificate"][0] )
217    {
218        echo '0'.chr(0x0D).chr(0x0A).$info[0]["uid"][0].chr(0x0D).chr(0x0A).$info[0]["cryptpassword"][0];
219        //echo '0' . "\n" . $info[0]["uid"][0] . "\n" . $info[0]["cryptpassword"][0];
220    }
221else
222    {
223        if(!$info[0]["usercertificate"][0] || $cert != $info[0]["usercertificate"][0])
224                {
225                        $user_info = array();
226                        $aux1 = $info[0]["dn"];
227                        $user_info['usercertificate'] = $cert;
228                        if(isset($GLOBALS['phpgw_info']['server']['atributoexpiracao']))
229                                {
230                                        if(substr($info[0][$GLOBALS['phpgw_info']['server']['atributoexpiracao']][0],-1,1)=="Z")
231                                                {
232                                                        $user_info[$GLOBALS['phpgw_info']['server']['atributoexpiracao']] = '19800101000000Z';
233                                                }
234                                        else
235                                                {
236                                                        $user_info[$GLOBALS['phpgw_info']['server']['atributoexpiracao']] = '0';
237                                                }
238                                }
239                        else
240                                {
241                                        $user_info['phpgwlastpasswdchange'] = '0';
242                                }
243                               
244                        if(!ldap_modify($cc,$aux1,$user_info))
245                            {
246                                echo '6'.chr(0x0D).chr(0x0A).'Ocorreu um erro no acolhimento do certificado.',$aux1;
247                            }
248                        else
249                            {
250                                echo '6'.chr(0x0D).chr(0x0A).'Seu Certificado foi cadastrado. Sua senha foi expirada. Altere sua senha para concluir o processo.';
251                            }
252                }
253        else
254                {
255                        echo '6'.chr(0x0D).chr(0x0A).'Sua senha foi expirada. Altere sua senha para acessar o Expresso usando certificado digital.';
256                }
257    }
258ldap_close($cc);
259?>
Note: See TracBrowser for help on using the repository browser.