source: branches/2.2/security/vercert.php @ 3984

Revision 3984, 4.6 KB checked in by rafaelraymundo, 13 years ago (diff)

Ticket #1738 - Corrige falha no login com certificado digital.

Line 
1<?php
2$GLOBALS['phpgw_info']['flags'] = array(
3                'disable_Template_class' => True,
4                'login'                  => True,
5                'currentapp'             => 'login',
6                'noheader'               => True
7        );
8
9if(!$_REQUEST['certificado'])
10{
11   echo '2'.chr(0x0D).chr(0x0A).'Certificado não foi apresentado.';
12   exit();
13}
14
15if(file_exists('../header.inc.php'))
16        {
17                include('../header.inc.php');
18        }
19else
20        {
21                echo '1'.chr(0x0D).chr(0x0A).'Arquivo header.inc.php n&atilde;o foi localizado.';
22                exit();
23        }
24
25require_once('classes/CertificadoB.php');
26require_once('classes/Verifica_Certificado.php');
27include('classes/Verifica_Certificado_conf.php');
28
29$cert =str_replace(chr(0x0A).chr(0x0A),chr(0x0A),$_REQUEST['certificado']);
30$cert = troca_espaco_por_mais($cert);
31
32$c = new certificadoB();
33$c->certificado($cert);
34
35if (!$c->apresentado)
36{
37   echo '2'.chr(0x0D).chr(0x0A).'Certificado não foi apresentado.';
38   exit();
39}
40
41if (!$c->dados['CPF'])
42{
43   echo '2'.chr(0x0D).chr(0x0A).'Não foi possível obter o CPF do certificado apresentado.';
44   exit();
45}
46
47$b = new Verifica_Certificado($c->dados,$cert);
48
49// Testa se Certificado OK.
50if(!$b->status)
51{
52   $msg = '3'.chr(0x0D).chr(0x0A).$b->msgerro;
53
54   foreach($b->erros_ssl  as $linha)
55   {
56        $msg .= "\n" . $linha;
57   }
58
59   echo $msg;
60   exit();
61}
62
63if ( (!empty($GLOBALS['phpgw_info']['server']['ldap_master_host'])) &&
64                    (!empty($GLOBALS['phpgw_info']['server']['ldap_master_root_dn'])) &&
65                    (!empty($GLOBALS['phpgw_info']['server']['ldap_master_root_pw'])) )
66        {
67                $ds = $GLOBALS['phpgw']->common->ldapConnect($GLOBALS['phpgw_info']['server']['ldap_master_host'],
68                        $GLOBALS['phpgw_info']['server']['ldap_master_root_dn'],
69                        $GLOBALS['phpgw_info']['server']['ldap_master_root_pw']);
70        }
71else
72        {
73                $ds = $GLOBALS['phpgw']->common->ldapConnect();
74        }
75
76if (!$ds)
77     {
78        echo '8'.chr(0x0D).chr(0x0A).'Não foi possível obter dados do usuario para login.';
79        exit();
80     }
81     
82    $filtro = 'uid='. $c->dados['2.16.76.1.3.1']['CPF'];
83    $atributos = array();
84    if(isset($GLOBALS['phpgw_info']['server']['atributoexpiracao']) && $GLOBALS['phpgw_info']['server']['atributoexpiracao'])
85        {
86            $atributos[] = $GLOBALS['phpgw_info']['server']['atributoexpiracao'];
87        }
88    else
89        {
90            $atributos[] = 'phpgwlastpasswdchange';
91        }
92     $atributos[] = "usercertificate";
93     $atributos[] = "phpgwaccountstatus";
94     $atributos[] = "cryptpassword";
95     $atributos[] = "uid";
96
97    $sr=ldap_search($ds, $GLOBALS['phpgw_info']['server']['ldap_context'],$filtro,$atributos);
98
99    // Pega resultado ....
100    $info = ldap_get_entries($ds, $sr);
101
102    // Tem de achar só uma entrada.....ao menos uma....
103    if($info["count"]!=1)
104    {
105        echo '4'.chr(0x0D).chr(0x0A).'Dados inválidos no diretório de usuários';
106        ldap_close($ds);
107        exit();
108    }
109
110// A conta expresso tem de estar ativa....
111if($info[0]['phpgwaccountstatus'][0]!='A')
112    {
113        echo '5'.chr(0x0D).chr(0x0A).'Conta do usuario nao esta ativa no Expresso.';
114        ldap_close($ds);
115        exit();
116    }
117
118if($info[0]["cryptpassword"][0] && $info[0]["usercertificate"][0] && $cert == $info[0]["usercertificate"][0] )
119    {
120        echo '0'.chr(0x0D).chr(0x0A).$info[0]["uid"][0].chr(0x0D).chr(0x0A).$info[0]["cryptpassword"][0];
121    }
122else
123    {
124        if(!$info[0]["usercertificate"][0] || $cert != $info[0]["usercertificate"][0])
125                {
126                        $user_info = array();
127                        $aux1 = $info[0]["dn"];
128                        $user_info['usercertificate'] = $cert;
129                        if(isset($GLOBALS['phpgw_info']['server']['atributoexpiracao']) && $GLOBALS['phpgw_info']['server']['atributoexpiracao'])
130                                {
131                                        if(substr($info[0][$GLOBALS['phpgw_info']['server']['atributoexpiracao']][0],-1,1)=="Z")
132                                                {
133                                                        $user_info[$GLOBALS['phpgw_info']['server']['atributoexpiracao']] = '19800101000000Z';
134                                                }
135                                        else
136                                                {
137                                                        $user_info[$GLOBALS['phpgw_info']['server']['atributoexpiracao']] = '0';
138                                                }
139                                }
140                        else
141                                {
142                                        $user_info['phpgwlastpasswdchange'] = '0';
143                                }
144
145                        if(!ldap_modify($ds,$aux1,$user_info))
146                            {
147                                echo '7'.chr(0x0D).chr(0x0A).'Ocorreu um erro no acolhimento do certificado.',$aux1;
148                            }
149                        else
150                            {
151                                echo '6'.chr(0x0D).chr(0x0A).'Seu Certificado foi cadastrado. Sua senha foi expirada. Altere sua senha para concluir o processo.';
152                            }
153                }
154        else
155                {
156                        echo '6'.chr(0x0D).chr(0x0A).'Sua senha foi expirada. Altere sua senha para acessar o Expresso usando certificado digital.';
157                }
158    }
159ldap_close($ds);
160?>
Note: See TracBrowser for help on using the repository browser.