1 | <?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 | |
---|
94 | $GLOBALS['phpgw_info']['flags'] = array( |
---|
95 | 'disable_Template_class' => True, |
---|
96 | 'login' => True, |
---|
97 | 'currentapp' => 'login', |
---|
98 | 'noheader' => True |
---|
99 | ); |
---|
100 | |
---|
101 | if(!$_REQUEST['certificado']) |
---|
102 | { |
---|
103 | echo '2'.chr(0x0D).chr(0x0A).'Certificado não foi apresentado.'; |
---|
104 | exit(); |
---|
105 | } |
---|
106 | |
---|
107 | if(file_exists('../header.inc.php')) |
---|
108 | { |
---|
109 | include('../header.inc.php'); |
---|
110 | } |
---|
111 | else |
---|
112 | { |
---|
113 | echo '1'.chr(0x0D).chr(0x0A).'Arquivo header.inc.php nã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 | |
---|
122 | require_once('classes/CertificadoB.php'); |
---|
123 | require_once('classes/Verifica_Certificado.php'); |
---|
124 | include('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 | |
---|
145 | if (!$c->apresentado) |
---|
146 | { |
---|
147 | echo '2'.chr(0x0D).chr(0x0A).'Certificado não foi apresentado.'; |
---|
148 | exit(); |
---|
149 | } |
---|
150 | |
---|
151 | if (!$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. |
---|
160 | if(!$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 | |
---|
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 | |
---|
183 | if(isset($GLOBALS['phpgw_info']['server']['atributoexpiracao']))
|
---|
184 | {
|
---|
185 | $atributos[] = $GLOBALS['phpgw_info']['server']['atributoexpiracao'];
|
---|
186 | }
|
---|
187 | |
---|
188 | $atributos[] = "usercertificate"; |
---|
189 | $atributos[] = "phpgwaccountstatus"; |
---|
190 | $atributos[] = "cryptpassword"; |
---|
191 | $atributos[] = "uid"; |
---|
192 | |
---|
193 | // Pesquisa uid no RHDS/LDAP |
---|
194 | $sr=ldap_search($cc, $ldap_context,$filtro,$atributos); |
---|
195 | |
---|
196 | // Pega resultado .... |
---|
197 | $info = ldap_get_entries($cc, $sr); |
---|
198 | |
---|
199 | // Tem de achar só uma entrada.....ao menos uma.... |
---|
200 | if($info["count"]!=1) |
---|
201 | { |
---|
202 | echo '4'.chr(0x0D).chr(0x0A).'Dados inválidos no diretório de usuários'; |
---|
203 | ldap_close($cc); |
---|
204 | exit(); |
---|
205 | } |
---|
206 | |
---|
207 | // A conta expresso tem de estar ativa.... |
---|
208 | if($info[0]['phpgwaccountstatus'][0]!='A') |
---|
209 | { |
---|
210 | echo '5'.chr(0x0D).chr(0x0A).'Conta do usuario nao esta ativa no Expresso.'; |
---|
211 | ldap_close($cc); |
---|
212 | exit(); |
---|
213 | } |
---|
214 | |
---|
215 | if($info[0]["cryptpassword"][0] && $info[0]["usercertificate"][0] && $cert == $info[0]["usercertificate"][0] ) |
---|
216 | { |
---|
217 | echo '0'.chr(0x0D).chr(0x0A).$info[0]["uid"][0].chr(0x0D).chr(0x0A).$info[0]["cryptpassword"][0]; |
---|
218 | //echo '0' . "\n" . $info[0]["uid"][0] . "\n" . $info[0]["cryptpassword"][0]; |
---|
219 | } |
---|
220 | else |
---|
221 | { |
---|
222 | if(!$info[0]["usercertificate"][0] || $cert != $info[0]["usercertificate"][0]) |
---|
223 | { |
---|
224 | $user_info = array(); |
---|
225 | $aux1 = $info[0]["dn"]; |
---|
226 | $user_info['usercertificate'] = $cert; |
---|
227 | if(isset($GLOBALS['phpgw_info']['server']['atributoexpiracao'])) |
---|
228 | { |
---|
229 | if(substr($info[0][$GLOBALS['phpgw_info']['server']['atributoexpiracao']][0],-1,1)=="Z") |
---|
230 | { |
---|
231 | ###quando a data de expiracao estah no formato yyyymmddhhmmssZ |
---|
232 | $user_info[$GLOBALS['phpgw_info']['server']['atributoexpiracao']] = '19800101000000Z'; |
---|
233 | } |
---|
234 | else |
---|
235 | { |
---|
236 | ###Outro atributo ldap que, assim como o phpgwaccounttype, tambem contem hora em formato unix |
---|
237 | $user_info[$GLOBALS['phpgw_info']['server']['atributoexpiracao']] = '0'; |
---|
238 | } |
---|
239 | } |
---|
240 | else |
---|
241 | { |
---|
242 | $user_info['phpgwaccountexpires'] = '0'; |
---|
243 | } |
---|
244 | ldap_modify($cc,$aux1,$user_info); |
---|
245 | echo '6'.chr(0x0D).chr(0x0A).'Seu Certificado foi cadastrado. Sua senha foi expirada. Altere sua senha para concluir o processo.'; |
---|
246 | } |
---|
247 | else |
---|
248 | { |
---|
249 | echo '6'.chr(0x0D).chr(0x0A).'Sua senha foi expirada. Altere sua senha para acessar o Expresso usando certificado digital.'; |
---|
250 | } |
---|
251 | } |
---|
252 | ldap_close($cc); |
---|
253 | ?> |
---|