source: companies/serpro/expressoAdminSerpro/inc/class.group.inc.php @ 903

Revision 903, 17.5 KB checked in by niltonneto, 15 years ago (diff)

Importacao inicial do Expresso do Serpro

Line 
1<?php
2        /**********************************************************************************\
3        * Expresso Administração                                                                                              *
4        * by Joao Alfredo Knopik Junior (joao.alfredo@gmail.com, jakjr@celepar.pr.gov.br) *
5        * --------------------------------------------------------------------------------*
6        *  This program is free software; you can redistribute it and/or modify it                *
7        *  under the terms of the GNU General Public License as published by the                  *
8        *  Free Software Foundation; either version 2 of the License, or (at your                 *
9        *  option) any later version.                                                                                                     *
10        \**********************************************************************************/
11       
12        include_once('class.ldap_functions.inc.php');
13        include_once('class.db_functions.inc.php');
14        include_once('class.imap_functions.inc.php');
15        include_once('class.functions.inc.php');
16       
17        class group
18        {
19                var $ldap_functions;
20                var $db_functions;
21                var $imap_functions;
22                var $functions;
23                var $current_config;
24               
25               
26                function group()
27                {
28                        $this->ldap_functions = new ldap_functions;
29                        $this->db_functions = new db_functions;
30                        $this->imap_functions = new imap_functions;
31                        $this->functions = new functions;
32                        $this->current_config = $_SESSION['phpgw_info']['expresso']['expressoAdmin'];
33                }
34               
35                function validate_fields($params)
36                {
37                        return $this->ldap_functions->validate_fields_group($params);
38                }
39               
40                function create($params)
41                {
42                        // Verifica o acesso do gerente
43                        if (!$this->functions->check_acl($_SESSION['phpgw_info']['expresso']['user']['account_lid'], 'add_groups'))
44                        {
45                                $return['status'] = false;
46                                $return['msg'] = 'Você não tem acesso para criar novos grupos.';
47                                return $return;
48                        }
49                       
50                        $return['status'] = true;
51
52                        //Retira os uids duplicados se existir
53                        $array_tmp = array();
54                        $array_tmp = @array_unique($params['members']);
55                        $params['members'] = $array_tmp;
56
57                        // Leio o ID a ser usado na criação do objecto.
58                        $next_id = ($this->db_functions->get_next_id('groups'));
59                        if ((!is_numeric($next_id['id'])) || (!$next_id['status']))
60                        {
61                                $return['status'] = false;
62                                $return['msg'] = "Problemas obtendo ID do usuário.\n" . $id['msg'];
63                                return $return;
64                        }
65                        else
66                        {
67                                $id = $next_id['id'];
68                        }
69
70                        // Cria array para incluir no LDAP
71                        $dn = 'cn=' . $params['cn'] . ',' . $params['group_dn'];                       
72                       
73                        $group_info = array();
74                        $group_info['cn']                       = $params['cn'];
75                        $group_info['sn']                       = $params['cn'];
76                        $group_info['description']              = $params['description'];
77                        $group_info['gidNumber']                = $id;
78                        $group_info['objectClass'][]            = 'top';
79                        $group_info['objectClass'][]            = 'posixGroup';
80                        $group_info['objectClass'][]            = 'phpgwAccount';
81                        $group_info['objectClass'][]            = 'inetorgperson';
82                        $group_info['phpgwAccountExpires']      = '-1';
83                        $group_info['phpgwAccountType']         = 'g';
84                        $group_info['userPassword']             = '';
85                       
86                        // E-mail for groups
87                        if ($params['email'] != '')
88                                $group_info['mail'] = $params['email'];
89                       
90                        if ( (count($params['members'])) && (is_array($params['members'])) )
91                        {
92                                foreach ($params['members'] as $index => $uidnumber)
93                                {
94                                        $uid = $this->ldap_functions->uidnumber2uid($uidnumber);
95                                        $group_info['memberuid'][] = $uid;
96                                       
97                                        // Chama funcao para incluir os uidnumbers dos usuarios no grupo
98                                        $result = $this->db_functions->add_user2group($id, $uidnumber);
99                                       
100                                        $this->db_functions->write_log("Adicionado usuario $uid ao grupo ".$group_info['cn']." no momento da criação",$dn,$uidnumber,'','');
101                                }
102                        }
103                       
104                        // Suporte ao SAMBA
105                        if (($this->current_config['expressoAdmin_samba_support'] == 'true') && ($params['use_attrs_samba'] == 'on'))
106                        {
107                                $group_info['objectClass'][]  = 'sambaGroupMapping';
108                                $group_info['sambaSID']           = $params['sambasid'] . '-' . (($id * 2) + 1001);
109                                $group_info['sambaGroupType'] = '2';
110                        }
111                       
112                        // ADD ATTRIBUTES
113                        if ($params['phpgwaccountvisible'] == 'on')
114                        {
115                                $group_info['phpgwaccountvisible'] = '-1';
116                        }
117                       
118                        $result = $this->ldap_functions->ldap_add_entry($dn, $group_info);
119                        if (!$result['status'])
120                        {
121                                $return['status'] = false;
122                                if ($result['error_number'] == '65')
123                                        $return['msg'] .= "Não foi possível criar este grupo pois os schemas do servidor LDAP estão desatualizados.\n" .
124                                                                                "O Administrador deve atualizar o diretório /etc/ldap/schema/ e re-inicializar o ldap.\n".
125                                                                                "Uma versão atualizada deste arquivo pode ser encontrada no site:\n" .
126                                                                                "www.expressolivre.org -> Downloads -> schema.tgz";
127                                else
128                                        $return['msg'] .= $result['msg'];
129                        }
130                       
131                        // Chama funcao para incluir os aplicativos ao grupo
132                        $result = $this->db_functions->add_id2apps($id, $params['apps']);
133                        if (!$result['status'])
134                        {
135                                $return['status'] = false;
136                                $return['msg'] .= $result['msg'];
137                        }
138                       
139                        if ($return['status'] == true)
140                        {
141                                $this->db_functions->write_log("Criado grupo de usuários $dn",'',$dn,'','');
142                        }
143                       
144                        return $return;
145                }
146               
147                function save($new_values)
148                {
149                        // Verifica o acesso do gerente
150                        if (!$this->functions->check_acl($_SESSION['phpgw_info']['expresso']['user']['account_lid'], 'edit_groups'))
151                        {
152                                $return['status'] = false;
153                                $return['msg'] = 'Você não tem acesso para editar grupos.';
154                                return $return;
155                        }
156                       
157                        $return['status'] = true;
158
159                        //Retira os uids duplicados se existir
160                        $array_tmp = array();
161                        $array_tmp = array_unique($new_values['members']);
162                        $new_values['members'] = $array_tmp;
163                                               
164                        //$old_values = $this->get_info($new_values['gidnumber'], $new_values['manager_context']);
165                        $old_values = $this->get_info($new_values['gidnumber']);
166                        $new_values['context'] = $new_values['group_dn'];
167                        $diff = array_diff(strtolower($new_values), strtolower($old_values));
168                        $dn = 'cn=' . $old_values['cn'] . ',' . $old_values['context'];                 
169                        ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
170                        // RENAME
171                        if ($diff['context'] || $diff['cn'])
172                        {       
173                                $newrdn = 'cn=' . $new_values['cn'];
174                                $newparent = $new_values['context'];
175                                $result =  $this->ldap_functions->change_user_context($dn, $newrdn, $newparent);
176                                if (!$result['status'])
177                                {
178                                        $return['status'] = false;
179                                        $return['msg'] .= $result['msg'];
180                                }
181                                else
182                                {
183                                        $dn = $newrdn . ',' . $newparent;
184                                        $this->db_functions->write_log('Renomeado grupo de usuários de '.$old_values['cn']." para $dn.",'',$dn,$old_values['cn'],'');
185                                }
186                        }
187                        $ldap_mod_replace = array();
188                        ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
189                        // REPLACE SAMBASID OF SAMBA
190                        if ( ($this->current_config['expressoAdmin_samba_support'] == 'true') && ($diff['sambasid']) && ($old_values['sambasid']))
191                        {
192                                $ldap_mod_replace['sambasid'] = $new_values['sambasid'] . '-' . ((2 * $new_values['gidnumber'])+1001);
193                                $this->db_functions->write_log("Alterado dominio samba do grupo $dn para " . $new_values['sambasid'],'',$dn,'','');
194                        }
195                       
196                        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
197                        // REPLACE DESCRIPTION
198                        if ($new_values['description'] != $old_values['description'])
199                        {
200                                $ldap_mod_replace['description'] = $new_values['description'];
201                                $this->db_functions->write_log("Modificado descrição do grupo $dn",'',$dn,'','');
202                        }
203
204                        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
205                        // REPLACE E-Mail
206                        if ((($old_values['email']) && ($diff['email'])) &&
207                                $this->functions->check_acl($_SESSION['phpgw_info']['expresso']['user']['account_lid'],'edit_email_groups'))
208                        {
209                                $ldap_mod_replace['mail'] = $new_values['email'];
210                                $this->db_functions->write_log("Modificado E-Mail do grupo $dn",'',$dn,'','');
211                        }
212
213                        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
214                        // CALL LDAP_REPLACE FUNCTION
215                        if (count($ldap_mod_replace))
216                        {
217                                $result = $this->ldap_functions->replace_user_attributes($dn, $ldap_mod_replace);
218                                if (!$result['status'])
219                                {
220                                        $return['status'] = false;
221                                        if ($result['error_number'] == '65')
222                                                $return['msg'] .= "Não foi possível salvar alguns atributos deste grupo pois os schemas do servidor LDAP estão desatualizados.\n" .
223                                                                                        "O Administrador deve atualizar o diretório /etc/ldap/schema/ e re-inicializar o ldap.\n".
224                                                                                        "Uma versão atualizada deste arquivo pode ser encontrada no site:\n" .
225                                                                                        "www.expressolivre.org -> Downloads -> schema.tgz";
226                                        else
227                                                $return['msg'] .= $result['msg'];
228                                }
229                        }                       
230                       
231                        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
232                        // REMOVE ATTRS OF SAMBA
233                        if (($this->current_config['expressoAdmin_samba_support'] == 'true') && ($old_values['sambaGroup']) && ($new_values['use_attrs_samba'] != 'on'))
234                        {
235                                $ldap_remove['objectclass']     = 'sambaGroupMapping'; 
236                                $ldap_remove['sambagrouptype']  = array();
237                                $ldap_remove['sambaSID']                = array();
238                               
239                                $result = $this->ldap_functions->remove_user_attributes($dn, $ldap_remove);
240                                if (!$result['status'])
241                                {
242                                        $return['status'] = false;
243                                        $return['msg'] .= $result['msg'];
244                                }
245                                else
246                                        $this->db_functions->write_log("Removido atributos samba do grupo $dn",'',$dn,'','');
247                        }
248
249                        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
250                        // ADD ATTRS OF SAMBA
251                        if (($this->current_config['expressoAdmin_samba_support'] == 'true') && (!$old_values['sambaGroup']) && ($new_values['use_attrs_samba'] == 'on'))
252                        {
253                                //Verifica se o binario para criar as senhas do samba exite.
254                                if (!is_file('/home/expressolivre/mkntpwd'))
255                                {
256                                        $return['status'] = false;
257                                        $return['msg'] .= "O arquivo binário /home/expressolivre/mkntpwd não exite.\\nEle é necessário para a criação das senhas usadas pelo SAMBA.\\nInforme o administrador ExpressoLivre sobre isto.\\n";
258                                }
259                                else
260                                {
261                                        $ldap_add['objectClass'][]              = 'sambaGroupMapping';
262                                        $ldap_add['sambagrouptype']             = '2';
263                                        $ldap_add['sambasid']                   = $new_values['sambasid'] . '-' . ((2 * $new_values['gidnumber'])+1001);
264                                       
265                                        $result = $this->ldap_functions->add_user_attributes($dn, $ldap_add);
266                                        if (!$result['status'])
267                                        {
268                                                $return['status'] = false;
269                                                $return['msg'] .= $result['msg'];
270                                        }
271                                        else
272                                                $this->db_functions->write_log("Adicionado atributos samba ao grupo $dn",'','','','');
273                                }
274                        }
275                       
276                        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
277                        // ADD ATTRIBUTES
278                        $ldap_add = array();
279                        if (($new_values['phpgwaccountvisible'] == 'on') && ($old_values['phpgwaccountvisible'] != '-1'))
280                        {
281                                $ldap_add['phpgwaccountvisible'] = '-1';
282                                $this->db_functions->write_log("Adicionado atributo phpgwaccountvisible ao grupo $dn",'','','','');
283                        }
284                        if ((($new_values['email']) && (!$old_values['email'])) &&
285                                $this->functions->check_acl($_SESSION['phpgw_info']['expresso']['user']['account_lid'],'edit_email_groups'))
286                        {
287                                $ldap_add['mail'] = $new_values['email'];
288                                $this->db_functions->write_log("Adicionado atributo mail ao grupo $dn",'','','','');
289                        }
290                        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
291                        // CALL LDAP_ADD FUNCTION                       
292                        if (count($ldap_add))
293                        {
294                                $result = $this->ldap_functions->add_user_attributes($dn, $ldap_add);
295                               
296                                if (!$result['status'])
297                                {
298                                        $return['status'] = false;
299                                        if ($result['error_number'] == '65')
300                                                $return['msg'] .= "Não foi possível adicionar alguns atributos deste gruupo pois os schemas do servidor LDAP estão desatualizados.\n" .
301                                                                                        "O Administrador deve atualizar o diretório /etc/ldap/schema/ e re-inicializar o ldap.\n".
302                                                                                        "Uma versão atualizada deste arquivo pode ser encontrada no site:\n" .
303                                                                                        "www.expressolivre.org -> Downloads -> schema.tgz";
304                                        else
305                                                $return['msg'] .= $result['msg'];
306                                }
307                        }
308                                               
309                        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
310                        // REMOVE ATTRIBUTES
311                        $ldap_remove = array();
312                        if (($new_values['phpgwaccountvisible'] != 'on') && ($old_values['phpgwaccountvisible'] == '-1'))
313                        {
314                                $ldap_remove['phpgwaccountvisible'] = array();
315                                $this->db_functions->write_log("Removido atributo phpgwaccountvisible do grupo $dn",'','','','');
316                        }
317                        if (((!$new_values['email']) && ($old_values['email'])) &&
318                                $this->functions->check_acl($_SESSION['phpgw_info']['expresso']['user']['account_lid'],'edit_email_groups'))
319                        {
320                                $ldap_remove['mail'] = array();
321                                $this->db_functions->write_log("Removido atributo mail do grupo $dn",'','','','');
322                        }
323                        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
324                        // CALL LDAP_REMOVED FUNCTION                   
325                        if (count($ldap_remove))
326                        {
327                                $result = $this->ldap_functions->remove_user_attributes($dn, $ldap_remove);
328                                if (!$result['status'])
329                                {
330                                        $return['status'] = false;
331                                        $return['msg'] .= $result['msg'];
332                                }
333                        }
334
335                        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
336                        // USERS
337
338                        if (!$new_values['members'])
339                                $new_values['members'] = array();
340                        if (!$old_values['members'])
341                                $old_values['members'] = array();
342
343                        $add_users = array_diff($new_values['members'], $old_values['members']);
344                        $remove_users = array_diff($old_values['members'], $new_values['members']);
345
346                        if (count($add_users)>0)
347                        {
348                                $array_memberUids_add = array();
349                                foreach($add_users as $uidnumber)
350                                {
351                                        if (is_numeric($uidnumber) && ($uidnumber != -1))
352                                        {
353                                                $this->db_functions->add_user2group($new_values['gidnumber'], $uidnumber);
354                                                $user = $this->ldap_functions->uidnumber2uid($uidnumber);
355                                                $array_memberUids_add[] = $user;
356                                                $this->db_functions->write_log("Adicionado usuário $user ao grupo $dn.",$dn,'','','');
357                                        }
358                                        else
359                                        {
360                                                // O memberUID existe no grupo, mas o usuário não existe no ldap
361                                                $this->ldap_functions->remove_user2group($new_values['gidnumber'], $uidnumber);
362                                        }
363                                }
364                                $this->ldap_functions->add_user2group($new_values['gidnumber'], $array_memberUids_add);
365                        }
366                        if (count($remove_users)>0)
367                        {
368                                $array_memberUids_remove = array();
369                                foreach($remove_users as $uidnumber)
370                                {
371                                        if ($uidnumber != -1)
372                                        {
373                                                $this->db_functions->remove_user2group($new_values['gidnumber'], $uidnumber);
374                                                $user = $this->ldap_functions->uidnumber2uid($uidnumber);
375                                                $array_memberUids_remove[] = $user;
376                                                $this->db_functions->write_log("Removido usuário $user do grupo $dn.",$dn,'','','');
377                                        }
378                                }
379                                $this->ldap_functions->remove_user2group($new_values['gidnumber'], $array_memberUids_remove);
380                        }
381                       
382                        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
383                        // APPS
384                        $new_values2 = array();
385                        $old_values2 = array();
386                        if (count($new_values['apps'])>0)
387                        {
388                                foreach ($new_values['apps'] as $app=>$tmp)
389                                {
390                                        $new_values2[] = $app;
391                                }
392                        }
393                        if (count($old_values['apps'])>0)
394                        {
395                                foreach ($old_values['apps'] as $app=>$tmp)
396                                {
397                                        $old_values2[] = $app;
398                                }
399                        }
400                       
401                        $add_apps    = array_flip(array_diff($new_values2, $old_values2));
402                        $remove_apps = array_flip(array_diff($old_values2, $new_values2));
403
404                        if (count($add_apps)>0)
405                        {
406                                $this->db_functions->add_id2apps($new_values['gidnumber'], $add_apps);
407                               
408                                foreach ($add_apps as $app => $index)
409                                        $this->db_functions->write_log("Adicionado aplicativo $app ao grupo $dn",'',$dn,'','');
410                        }
411                       
412                        if (count($remove_apps)>0)
413                        {
414                                //Verifica se o gerente tem acesso a aplicação antes de remove-la do usuario.
415                                $manager_apps = $this->db_functions->get_apps($_SESSION['phpgw_info']['expresso']['user']['account_lid']);
416                                       
417                                foreach ($remove_apps as $app => $app_index)
418                                {
419                                        if ($manager_apps[$app] == 'run')
420                                                $remove_apps2[$app] = $app_index;
421                                }
422                                $this->db_functions->remove_id2apps($new_values['gidnumber'], $remove_apps2);
423                                       
424                                foreach ($remove_apps2 as $app => $access)
425                                        $this->db_functions->write_log("Removido aplicativo $app do grupo $dn",'',$dn,'','');
426                        }
427                        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////                     
428                       
429                        return $return;
430                }               
431               
432               
433                function get_info($gidnumber)
434                {
435                        $group_info_ldap = $this->ldap_functions->get_group_info($gidnumber);
436                        $group_info_db = $this->db_functions->get_group_info($gidnumber);
437                       
438                        $group_info = array_merge($group_info_ldap, $group_info_db);
439                        return $group_info;
440                }
441
442                function delete($params)
443                {
444                        // Verifica o acesso do gerente
445                        if (!$this->functions->check_acl($_SESSION['phpgw_info']['expresso']['user']['account_lid'], 'delete_groups'))
446                        {
447                                $return['status'] = false;
448                                $return['msg'] = 'Você não tem acesso para excluir grupos.';
449                                return $return;
450                        }
451                       
452                        $return['status'] = true;
453                       
454                        $gidnumber = $params['gidnumber'];
455                        $cn = $params['cn'];
456                       
457                        //LDAP
458                        $result_ldap = $this->ldap_functions->delete_group($gidnumber);
459                        if (!$result_ldap['status'])
460                        {
461                                $return['status'] = false;
462                                $return['msg'] .= $result_ldap['msg'];
463                        }
464                       
465                        //DB
466                        $result_db = $this->db_functions->delete_group($gidnumber);
467                        if (!$result_db['status'])
468                        {
469                                $return['status'] = false;
470                                $return['msg'] .= $result_ldap['msg'];
471                        }
472                       
473                        if ($return['status'] == true)
474                        {
475                                $this->db_functions->write_log("Deletado grupo de usuários $cn",'',$cn,'','');
476                        }
477                       
478                        return $return;
479                }
480               
481        }
482?>
Note: See TracBrowser for help on using the repository browser.