source: trunk/expressoAdmin1_2/inc/class.group.inc.php @ 317

Revision 317, 17.2 KB checked in by niltonneto, 16 years ago (diff)

Versionamento feito pelo desenvolvedor (jakjr).

  • Property svn:eol-style set to native
  • Property svn:executable set to *
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_session']['session_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['context'];                 
72                       
73                        $group_info = array();
74                        $group_info['cn']                                       = $params['cn'];
75                        $group_info['description']                      = $params['description'];
76                        $group_info['gidNumber']                        = $id;
77                        $group_info['objectClass'][]            = 'top';
78                        $group_info['objectClass'][]            = 'posixGroup';
79                        $group_info['objectClass'][]            = 'phpgwAccount';
80                        $group_info['phpgwAccountExpires']      = '-1';
81                        $group_info['phpgwAccountType']         = 'g';
82                        $group_info['userPassword']                     = '';
83                       
84                        // E-mail for groups
85                        if ($params['email'] != '')
86                                $group_info['mail'] = $params['email'];
87                       
88                        if ( (count($params['members'])) && (is_array($params['members'])) )
89                        {
90                                foreach ($params['members'] as $index => $uidnumber)
91                                {
92                                        $uid = $this->ldap_functions->uidnumber2uid($uidnumber);
93                                        $group_info['memberuid'][] = $uid;
94                                       
95                                        // Chama funcao para incluir os uidnumbers dos usuarios no grupo
96                                        $result = $this->db_functions->add_user2group($id, $uidnumber);
97                                       
98                                        $this->db_functions->write_log("Adicionado usuario $uid ao grupo ".$group_info['cn']." no momento da criação",$dn,$uidnumber,'','');
99                                }
100                        }
101                       
102                        // Suporte ao SAMBA
103                        if (($this->current_config['expressoAdmin_samba_support'] == 'true') && ($params['use_attrs_samba'] == 'on'))
104                        {
105                                $group_info['objectClass'][]  = 'sambaGroupMapping';
106                                $group_info['sambaSID']           = $params['sambasid'] . '-' . (($id * 2) + 1001);
107                                $group_info['sambaGroupType'] = '2';
108                        }
109                       
110                        // ADD ATTRIBUTES
111                        if ($params['phpgwaccountvisible'] == 'on')
112                        {
113                                $group_info['phpgwaccountvisible'] = '-1';
114                        }
115                       
116                        $result = $this->ldap_functions->ldap_add_entry($dn, $group_info);
117                        if (!$result['status'])
118                        {
119                                $return['status'] = false;
120                                if ($result['error_number'] == '65')
121                                        $return['msg'] .= "Não foi possível criar este grupo pois os schemas do servidor LDAP estão desatualizados.\n" .
122                                                                                "O Administrador deve atualizar o diretório /etc/ldap/schema/ e re-inicializar o ldap.\n".
123                                                                                "Uma versão atualizada deste arquivo pode ser encontrada no site:\n" .
124                                                                                "www.expressolivre.org -> Downloads -> schema.tgz";
125                                else
126                                        $return['msg'] .= $result['msg'];
127                        }
128                       
129                        // Chama funcao para incluir os aplicativos ao grupo
130                        $result = $this->db_functions->add_id2apps($id, $params['apps']);
131                        if (!$result['status'])
132                        {
133                                $return['status'] = false;
134                                $return['msg'] .= $result['msg'];
135                        }
136                       
137                        if ($return['status'] == true)
138                        {
139                                $this->db_functions->write_log("Criado grupo de usuários $dn",'',$dn,'','');
140                        }
141                       
142                        return $return;
143                }
144               
145                function save($new_values)
146                {
147                        // Verifica o acesso do gerente
148                        if (!$this->functions->check_acl($_SESSION['phpgw_session']['session_lid'], 'edit_groups'))
149                        {
150                                $return['status'] = false;
151                                $return['msg'] = 'Você não tem acesso para editar grupos.';
152                                return $return;
153                        }
154                       
155                        $return['status'] = true;
156
157                        //Retira os uids duplicados se existir
158                        $array_tmp = array();
159                        $array_tmp = array_unique($new_values['members']);
160                        $new_values['members'] = $array_tmp;
161                                               
162                        $old_values = $this->get_info($new_values['gidnumber'], $new_values['manager_context']);
163                        $diff = array_diff($new_values, $old_values);
164                       
165                        $dn = 'cn=' . $old_values['cn'] . ',' . $old_values['context'];                 
166                        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
167                        // RENAME
168                        if ($diff['context'] || $diff['cn'])
169                        {
170                                $newrdn = 'cn=' . $new_values['cn'];
171                                $newparent = $new_values['context'];
172                                $result =  $this->ldap_functions->change_user_context($dn, $newrdn, $newparent);
173                                if (!$result['status'])
174                                {
175                                        $return['status'] = false;
176                                        $return['msg'] .= $result['msg'];
177                                }
178                                else
179                                {
180                                        $dn = $newrdn . ',' . $newparent;
181                                        $this->db_functions->write_log('Renomeado grupo de usuários de '.$old_values['cn']." para $dn.",'',$dn,$old_values['cn'],'');
182                                }
183                        }
184                       
185                        $ldap_mod_replace = array();
186                        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
187                        // REPLACE SAMBASID OF SAMBA
188                        if ( ($this->current_config['expressoAdmin_samba_support'] == 'true') && ($diff['sambasid']) && ($old_values['sambasid']))
189                        {
190                                $ldap_mod_replace['sambasid'] = $new_values['sambasid'] . '-' . ((2 * $new_values['gidnumber'])+1001);
191                                $this->db_functions->write_log("Alterado dominio samba do grupo $dn para " . $new_values['sambasid'],'',$dn,'','');
192                        }
193                       
194                        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
195                        // REPLACE DESCRIPTION
196                        if ($new_values['description'] != $old_values['description'])
197                        {
198                                $ldap_mod_replace['description'] = $new_values['description'];
199                                $this->db_functions->write_log("Modificado descrição do grupo $dn",'',$dn,'','');
200                        }
201
202                        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
203                        // REPLACE E-Mail
204                        if ((($old_values['email']) && ($diff['email'])) &&
205                                $this->functions->check_acl($_SESSION['phpgw_session']['session_lid'],'edit_email_groups'))
206                        {
207                                $ldap_mod_replace['mail'] = $new_values['email'];
208                                $this->db_functions->write_log("Modificado E-Mail do grupo $dn",'',$dn,'','');
209                        }
210
211                        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
212                        // CALL LDAP_REPLACE FUNCTION
213                        if (count($ldap_mod_replace))
214                        {
215                                $result = $this->ldap_functions->replace_user_attributes($dn, $ldap_mod_replace);
216                                if (!$result['status'])
217                                {
218                                        $return['status'] = false;
219                                        if ($result['error_number'] == '65')
220                                                $return['msg'] .= "Não foi possível salvar alguns atributos deste grupo pois os schemas do servidor LDAP estão desatualizados.\n" .
221                                                                                        "O Administrador deve atualizar o diretório /etc/ldap/schema/ e re-inicializar o ldap.\n".
222                                                                                        "Uma versão atualizada deste arquivo pode ser encontrada no site:\n" .
223                                                                                        "www.expressolivre.org -> Downloads -> schema.tgz";
224                                        else
225                                                $return['msg'] .= $result['msg'];
226                                }
227                        }                       
228                       
229                        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
230                        // REMOVE ATTRS OF SAMBA
231                        if (($this->current_config['expressoAdmin_samba_support'] == 'true') && ($old_values['sambaGroup']) && ($new_values['use_attrs_samba'] != 'on'))
232                        {
233                                $ldap_remove['objectclass']     = 'sambaGroupMapping'; 
234                                $ldap_remove['sambagrouptype']  = array();
235                                $ldap_remove['sambaSID']                = array();
236                               
237                                $result = $this->ldap_functions->remove_user_attributes($dn, $ldap_remove);
238                                if (!$result['status'])
239                                {
240                                        $return['status'] = false;
241                                        $return['msg'] .= $result['msg'];
242                                }
243                                else
244                                        $this->db_functions->write_log("Removido atributos samba do grupo $dn",'',$dn,'','');
245                        }
246
247                        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
248                        // ADD ATTRS OF SAMBA
249                        if (($this->current_config['expressoAdmin_samba_support'] == 'true') && (!$old_values['sambaGroup']) && ($new_values['use_attrs_samba'] == 'on'))
250                        {
251                                //Verifica se o binario para criar as senhas do samba exite.
252                                if (!is_file('/home/expressolivre/mkntpwd'))
253                                {
254                                        $return['status'] = false;
255                                        $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";
256                                }
257                                else
258                                {
259                                        $ldap_add['objectClass'][]              = 'sambaGroupMapping';
260                                        $ldap_add['sambagrouptype']             = '2';
261                                        $ldap_add['sambasid']                   = $new_values['sambasid'] . '-' . ((2 * $new_values['gidnumber'])+1001);
262                                       
263                                        $result = $this->ldap_functions->add_user_attributes($dn, $ldap_add);
264                                        if (!$result['status'])
265                                        {
266                                                $return['status'] = false;
267                                                $return['msg'] .= $result['msg'];
268                                        }
269                                        else
270                                                $this->db_functions->write_log("Adicionado atributos samba ao grupo $dn",'','','','');
271                                }
272                        }
273                       
274                        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
275                        // ADD ATTRIBUTES
276                        $ldap_add = array();
277                        if (($new_values['phpgwaccountvisible'] == 'on') && ($old_values['phpgwaccountvisible'] != '-1'))
278                        {
279                                $ldap_add['phpgwaccountvisible'] = '-1';
280                                $this->db_functions->write_log("Adicionado atributo phpgwaccountvisible ao grupo $dn",'','','','');
281                        }
282                        if ((($new_values['email']) && (!$old_values['email'])) &&
283                                $this->functions->check_acl($_SESSION['phpgw_session']['session_lid'],'edit_email_groups'))
284                        {
285                                $ldap_add['mail'] = $new_values['email'];
286                                $this->db_functions->write_log("Adicionado atributo mail ao grupo $dn",'','','','');
287                        }
288                        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
289                        // CALL LDAP_ADD FUNCTION                       
290                        if (count($ldap_add))
291                        {
292                                $result = $this->ldap_functions->add_user_attributes($dn, $ldap_add);
293                               
294                                if (!$result['status'])
295                                {
296                                        $return['status'] = false;
297                                        if ($result['error_number'] == '65')
298                                                $return['msg'] .= "Não foi possível adicionar alguns atributos deste gruupo pois os schemas do servidor LDAP estão desatualizados.\n" .
299                                                                                        "O Administrador deve atualizar o diretório /etc/ldap/schema/ e re-inicializar o ldap.\n".
300                                                                                        "Uma versão atualizada deste arquivo pode ser encontrada no site:\n" .
301                                                                                        "www.expressolivre.org -> Downloads -> schema.tgz";
302                                        else
303                                                $return['msg'] .= $result['msg'];
304                                }
305                        }
306                                               
307                        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
308                        // REMOVE ATTRIBUTES
309                        $ldap_remove = array();
310                        if (($new_values['phpgwaccountvisible'] != 'on') && ($old_values['phpgwaccountvisible'] == '-1'))
311                        {
312                                $ldap_remove['phpgwaccountvisible'] = array();
313                                $this->db_functions->write_log("Removido atributo phpgwaccountvisible do grupo $dn",'','','','');
314                        }
315                        if (((!$new_values['email']) && ($old_values['email'])) &&
316                                $this->functions->check_acl($_SESSION['phpgw_session']['session_lid'],'edit_email_groups'))
317                        {
318                                $ldap_remove['mail'] = array();
319                                $this->db_functions->write_log("Removido atributo mail do grupo $dn",'','','','');
320                        }
321                        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
322                        // CALL LDAP_REMOVED FUNCTION                   
323                        if (count($ldap_remove))
324                        {
325                                $result = $this->ldap_functions->remove_user_attributes($dn, $ldap_remove);
326                                if (!$result['status'])
327                                {
328                                        $return['status'] = false;
329                                        $return['msg'] .= $result['msg'];
330                                }
331                        }
332
333                        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
334                        // USERS
335
336                        if (!$new_values['members'])
337                                $new_values['members'] = array();
338                        if (!$old_values['members'])
339                                $old_values['members'] = array();
340
341                        $add_users = array_diff($new_values['members'], $old_values['members']);
342                        $remove_users = array_diff($old_values['members'], $new_values['members']);
343
344                        if (count($add_users)>0)
345                        {
346                                $array_memberUids_add = array();
347                                foreach($add_users as $uidnumber)
348                                {
349                                        if (is_numeric($uidnumber) && ($uidnumber != -1))
350                                        {
351                                                $this->db_functions->add_user2group($new_values['gidnumber'], $uidnumber);
352                                                $user = $this->ldap_functions->uidnumber2uid($uidnumber);
353                                                $array_memberUids_add[] = $user;
354                                                $this->db_functions->write_log("Adicionado usuário $user ao grupo $dn.",$dn,'','','');
355                                        }
356                                        else
357                                        {
358                                                // O memberUID existe no grupo, mas o usuário não existe no ldap
359                                                $this->ldap_functions->remove_user2group($new_values['gidnumber'], $uidnumber);
360                                        }
361                                }
362                                $this->ldap_functions->add_user2group($new_values['gidnumber'], $array_memberUids_add);
363                        }
364                        if (count($remove_users)>0)
365                        {
366                                $array_memberUids_remove = array();
367                                foreach($remove_users as $uidnumber)
368                                {
369                                        if ($uidnumber != -1)
370                                        {
371                                                $this->db_functions->remove_user2group($new_values['gidnumber'], $uidnumber);
372                                                $user = $this->ldap_functions->uidnumber2uid($uidnumber);
373                                                $array_memberUids_remove[] = $user;
374                                                $this->db_functions->write_log("Removido usuário $user do grupo $dn.",$dn,'','','');
375                                        }
376                                }
377                                $this->ldap_functions->remove_user2group($new_values['gidnumber'], $array_memberUids_remove);
378                        }
379                       
380                        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
381                        // APPS
382                        $new_values2 = array();
383                        $old_values2 = array();
384                        if (count($new_values['apps'])>0)
385                        {
386                                foreach ($new_values['apps'] as $app=>$tmp)
387                                {
388                                        $new_values2[] = $app;
389                                }
390                        }
391                        if (count($old_values['apps'])>0)
392                        {
393                                foreach ($old_values['apps'] as $app=>$tmp)
394                                {
395                                        $old_values2[] = $app;
396                                }
397                        }
398                       
399                        $add_apps    = array_flip(array_diff($new_values2, $old_values2));
400                        $remove_apps = array_flip(array_diff($old_values2, $new_values2));
401
402                        if (count($add_apps)>0)
403                        {
404                                $this->db_functions->add_id2apps($new_values['gidnumber'], $add_apps);
405                               
406                                foreach ($add_apps as $app => $index)
407                                        $this->db_functions->write_log("Adicionado aplicativo $app ao grupo $dn",'',$dn,'','');
408                        }
409                       
410                        if (count($remove_apps)>0)
411                        {
412                                //Verifica se o gerente tem acesso a aplicação antes de remove-la do usuario.
413                                $manager_apps = $this->db_functions->get_apps($_SESSION['phpgw_session']['session_lid']);
414                                       
415                                foreach ($remove_apps as $app => $app_index)
416                                {
417                                        if ($manager_apps[$app] == 'run')
418                                                $remove_apps2[$app] = $app_index;
419                                }
420                                $this->db_functions->remove_id2apps($new_values['gidnumber'], $remove_apps2);
421                                       
422                                foreach ($remove_apps2 as $app => $access)
423                                        $this->db_functions->write_log("Removido aplicativo $app do grupo $dn",'',$dn,'','');
424                        }
425                        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////                     
426                       
427                        return $return;
428                }               
429               
430               
431                function get_info($gidnumber)
432                {
433                        $group_info_ldap = $this->ldap_functions->get_group_info($gidnumber);
434                        $group_info_db = $this->db_functions->get_group_info($gidnumber);
435                       
436                        $group_info = array_merge($group_info_ldap, $group_info_db);
437                        return $group_info;
438                }
439
440                function delete($params)
441                {
442                        // Verifica o acesso do gerente
443                        if (!$this->functions->check_acl($_SESSION['phpgw_session']['session_lid'], 'delete_groups'))
444                        {
445                                $return['status'] = false;
446                                $return['msg'] = 'Você não tem acesso para excluir grupos.';
447                                return $return;
448                        }
449                       
450                        $return['status'] = true;
451                       
452                        $gidnumber = $params['gidnumber'];
453                        $cn = $params['cn'];
454                       
455                        //LDAP
456                        $result_ldap = $this->ldap_functions->delete_group($gidnumber);
457                        if (!$result_ldap['status'])
458                        {
459                                $return['status'] = false;
460                                $return['msg'] .= $result_ldap['msg'];
461                        }
462                       
463                        //DB
464                        $result_db = $this->db_functions->delete_group($gidnumber);
465                        if (!$result_db['status'])
466                        {
467                                $return['status'] = false;
468                                $return['msg'] .= $result_ldap['msg'];
469                        }
470                       
471                        if ($return['status'] == true)
472                        {
473                                $this->db_functions->write_log("Deletado grupo de usuários $cn",'',$cn,'','');
474                        }
475                       
476                        return $return;
477                }
478               
479        }
480?>
Note: See TracBrowser for help on using the repository browser.