Code

Starting move
[gosa.git] / gosa-core / plugins / personal / connectivity / class_kolabAccount.inc
1 <?php
2 class kolabAccount extends plugin
3 {
4   /* Definitions */
5   var $plHeadline       = "Kolab";
6   var $plDescription    = "This does something";
8   /* Kolab attributes */
9   var $kolabInvitationPolicy  = array();
10   var $kolabFreeBusyFuture    = 60;
11   var $unrestrictedMailSize   = 0;
12   var $calFBURL               = "";
13   var $kolabDelegate          = array();
15   /* attribute list for save action */
16   var $attributes     = array("kolabFreeBusyFuture", "unrestrictedMailSize", "calFBURL","kolabDelegate","kolabInvitationPolicy");
17   var $objectclasses  = array("kolabInetOrgPerson");
19   /* Helper */
20   var $imapping= array();
21   var $mail_Account   = false;
22   var $ReadOnly = false;
23   var $view_logged = FALSE;
24   var $uid = "";
26   function kolabAccount (&$config, $dn= NULL,$parent = NULL)
27   {
28     plugin::plugin ($config, $dn, $parent);
30     /* Setting uid to default */
31     if(isset($this->attrs['uid'][0])){
32       $this->uid = $this->attrs['uid'][0];
33     }
35     /* Pull arrays */
36     foreach(array("kolabDelegate", "kolabInvitationPolicy") as $attr){
37       if (isset($this->attrs["$attr"]["count"])){
38         $tmp = array();
39         for ($i= 0; $i<$this->attrs["$attr"]["count"]; $i++){
40           $tmp[]=$this->attrs["$attr"][$i];
41         }
42         $this->$attr = $tmp;
43       }
44     }
46     /* If this one is empty, preset with ACT_MANUAL for anonymous users */
47     if (count ($this->kolabInvitationPolicy) == 0){
48        $this->kolabInvitationPolicy= array("ACT_MANUAL");
49     }
51     /* Check is account state */
52     $this->is_account = false;
53     if(count($this->kolabDelegate)){
54       $this->is_account = true;
55     }
56     foreach(array("calFBURL","unrestrictedMailSize") as $attr){
57       if(!empty($this->$attr)){
58         $this->is_account = true;
59       }
60     } 
62     /* Transfer account states for this union */
63     if (isset($this->parent->by_object['mailAccount']) && $this->parent->by_object['mailAccount']->is_account){
64       $this->mail_Account = true;
65      }elseif( isset($this->attrs) && isset($this->attrs['kolabHomeServer'])){
66        $this->mail_Account= true;
67      }else{
68        $this->is_account  = false;
69       $this->mail_Account = false;
70     }
71   }
74   function execute()
75   {
76           /* Call parent execute */
77         plugin::execute();
79     /* Log view */
80     if($this->is_account && !$this->view_logged){
81       $this->view_logged = TRUE;
82       new log("view","users/".get_class($this),$this->dn);
83     }
85     /* Show tab dialog headers */
86     $display= "";
88     /* Show main page */
89     $smarty= get_smarty();
91     /* Load attributes */
92     foreach($this->attributes as $val){
93       $smarty->assign("$val", $this->$val);
94     }
96     $tmp = $this->plInfo();
97     foreach($tmp['plProvidedAcls'] as $acl => $description){
98       $smarty->assign($acl."ACL",$this->getacl($acl,$this->ReadOnly));
99       $smarty->assign($acl."_W", $this->acl_is_writeable($acl,$this->ReadOnly));
100     }
101     $smarty->assign("is_account" ,  $this->is_account); 
103     if($this->ReadOnly){
104       $smarty->assign("is_removeable",false); 
105       $smarty->assign("is_createable",false); 
106     }else{
107       $smarty->assign("is_removeable",$this->acl_is_removeable()); 
108       $smarty->assign("is_createable",$this->acl_is_createable()); 
109     }
111     /* Check for invitation action */
112     $nr= 0;
113     while (isset($_POST["policy$nr"])){
114       if (isset($_POST["add$nr"])){
115         $this->kolabInvitationPolicy[]= ": ACT_MANUAL";
116       }
117       if (isset($_POST["remove$nr"])){
118         $new= array();
119         foreach ($this->kolabInvitationPolicy as $entry){
120           if (!preg_match("/^".$this->imapping[$nr].":/", $entry)){
121             $new[]= $entry;
122           }
123         }
124         $this->kolabInvitationPolicy= $new;
125       }
126       $nr++;
127     }
129     /* Unify addresses */
130     $new= array();
131     foreach($this->kolabInvitationPolicy as $value){
132       $address= preg_replace('/^([^:]+:).*$/', '\1', $value);
133       $new[$address]= $value;
134     }
135     $this->kolabInvitationPolicy= array();
136     foreach($new as $value){
137       $this->kolabInvitationPolicy[]= $value;
138     }
140     /* Add delegation */
141     if (isset($_POST['add_delegation'])){
142       if ($_POST['delegate_address'] != ""){
144         /* Valid email address specified? */
145         $address= $_POST['delegate_address'];
146         $valid= FALSE;
147         if (!is_email($address)){
148           if (!is_email($address, TRUE)){
149               print_red (_("You're trying to add an invalid email address to the list of delegations."));
150           }
151         } else {
153           $ldap= $this->config->get_ldap_link();
154           $ldap->cd ($this->config->current['BASE']);
155           $ldap->search('(mail='.$address.')',array("mail"));
156           if ($ldap->count() == 0){
157             print_red (_("The mail address you're trying to add is no primary mail address of an existing user."));
158           } else {
159             $valid= TRUE;
160           }
161         }
163         if ($valid){
164           /* Add it */
165           if ($this->acl_is_writeable("kolabDelegate")){
166             $this->addDelegate ($address);
167             $this->is_modified= TRUE;
168           }
170         }
171       }
172     }
174     /* Delete forward email addresses */
175     if ((isset($_POST['delete_delegation'])) && (isset($_POST['delegate_list']))){
176       if (count($_POST['delegate_list']) && $this->acl_is_writeable("kolabDelegate")){
177         $this->delDelegate ($_POST['delegate_list']);
178       }
179     }
181     /* Assemble policies */
182     $policies= array( 'ACT_ALWAYS_ACCEPT'       => _("Always accept"),
183                       'ACT_ALWAYS_REJECT'       => _("Always reject"),
184                       'ACT_REJECT_IF_CONFLICTS' => _("Reject if conflicts"),
185                       'ACT_MANUAL_IF_CONFLICTS' => _("Manual if conflicts"),
186                       'ACT_MANUAL'              => _("Manual"));
187     $smarty->assign('policies', $policies);
189     /* Adjust checkbox */
190     if ($this->unrestrictedMailSize){
191       $smarty->assign('unrestrictedMailSizeState', "checked");
192     } else {
193       $smarty->assign('unrestrictedMailSizeState', "");
194     }
196     /* Transfer delegation list */
197     if (!count($this->kolabDelegate)){
198       /* Smarty will produce <option value=""></option> and tidy don't like that, so tell smarty to create no option (array();)*/
199       $smarty->assign("kolabDelegate", array());
200     } else {
201       $smarty->assign("kolabDelegate", $this->kolabDelegate);
202     }
204     $smarty->assign("mail_account",$this->mail_Account);
206     /* Create InvitationPolicy table */
207     $invitation= "";
208     $this->imapping= array();
209     $nr= 0;
210     $changeState  = "";
211     foreach ($this->kolabInvitationPolicy as $entry){
213       if($this->acl_is_writeable("kolabInvitationPolicy")){
214         $changeState .= "changeState('address".$nr."'); \n changeState('policy".$nr."'); \n
215           changeState('add".$nr."'); \n changeState('remove".$nr."'); \n";
216       }
218       if(!$this->acl_is_writeable("kolabInvitationPolicy")){
219         $dis = " disabled ";
220       }else{
221         if($this->is_account){
222           $dis = " ";
223         }else{
224           $dis = " disabled ";
225         }
226       }
227       $invitation.= "<tr><td>";
229       if(!$this->acl_is_readable("kolabInvitationPolicy"))    {
230       }
232       /* The default entry does not have colons... */
233       if (!preg_match('/:/', $entry)){
234         $invitation.= _("Anonymous");
235         $name= "";
236         $mode= $entry;
237       } else {
238         $name= preg_replace('/:.*$/', '', $entry);
239         $mode= preg_replace('/^[^:]*: */', '', $entry);
241         if(!$this->acl_is_readable("kolabInvitationPolicy")){
242           $name='';
243         }
244         $invitation.= "<input name=\"address$nr\" size=16 maxlength=60  value=\"$name\" id='address".$nr."' ".$dis.">";
245       }
246       $invitation.= "</td>";
248       /* Add mode switch */
249       $invitation.= "<td><select size=\"1\" name=\"policy$nr\" id='policy".$nr."' ".$dis.">";
250       foreach($policies as $key => $value){
251         if ($key == $mode){
252           $invitation.= "<option value=\"$key\" selected>$value</option>";
253         } else {
254           $invitation.= "<option value=\"$key\">$value</option>";
255         }
256       }
257       
258       /* Assign buttons */
259       $button= "";
260       if ($nr == count($this->kolabInvitationPolicy)-1){
261         $button= "<input type=submit name=\"add$nr\" value=\""._("Add")."\" id='add".$nr."' ".$dis.">";
262       }
263       if ($nr != 0) {
264         $button.= "<input type=submit name=\"remove$nr\" value=\""._("Remove")."\" id='remove".$nr."' ".$dis.">";
265       }
266       
267       $invitation.= "</select>&nbsp;$button</td></tr>\n";
268       $this->imapping[$nr]= $name;
269       $nr++;
270     }
271     $smarty->assign("invitation", $invitation);
272     $smarty->assign("changeState", $changeState);
273     $smarty->assign("kolabState",$this->is_account);
274     $display.= $smarty->fetch (get_template_path('kolab.tpl', TRUE, dirname(__FILE__)));
277     return ($display);
278   }
280   function remove_from_parent()
281   {
282     if(!$this->initially_was_account){
283       return;
284     }
285   
286     /* Optionally execute a command after we're done */
287     plugin::remove_from_parent();
288     
289     if(!in_array("kolabInetOrgPerson",$this->attrs['objectClass'])){
290       $this->attrs['objectClass'][] = "kolabInetOrgPerson";
291     }
293     $ldap = $this->config->get_ldap_linK(); 
294     $ldap->cd($this->config->current['BASE']);
295     $ldap->cd ($this->dn);
296     $ldap->modify($this->attrs);
298     /* Log last action */
299     new log("remove","users/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error());
301     $this->handle_post_events('remove',array("uid" => $this->uid));
302     show_ldap_error($ldap->get_error(), sprintf(_("Removing of user/kolab account with dn '%s' failed."),$this->dn));
303   }
306   function check()
307   {
308     /* Call common method to give check the hook */
309     $message= plugin::check();
311     /* FBFuture is in days... */
312     if ($this->kolabFreeBusyFuture != "" && !preg_match('/^[0-9]+$/', $this->kolabFreeBusyFuture)){
313       $message[]= _("The value specified as Free Busy future needs to be an integer.");
314     }
316     /* Check for URL scheme... */
317     if(!empty($this->calFBURL) && !preg_match("/http+(s)*:\/\//",$this->calFBURL)){
318       $message[]= _("The value specified as Free Busy Information URL is invalid.");
319     }
321     /* Check invitation policy for existing mail addresses */
322     foreach($this->kolabInvitationPolicy as $policy){
323       
324       /* Ignore anonymous string */
325       if (!preg_match('/:/', $policy)){
326         continue;
327       }
328       
329       $address= preg_replace('/^([^:]+).*$/', '\1', $policy);
330       if (!is_email($address)){
331         if (!is_email($address, TRUE)){
332           $message[]= sprintf(_("The invitation policy entry for address '%s' is not valid."), $address);
333         }
334       } else {
336         $ldap= $this->config->get_ldap_link();
337         $ldap->cd ($this->config->current['BASE']);
338         $ldap->search('(mail='.$address.')',array("mail"));
339         if ($ldap->count() == 0){
340           $message[]= sprintf(_("There's no mail user with address '%s' for your invitation policy!"), $address);
341         } else {
342           $valid= TRUE;
343         }
344       }
345     }
347     return ($message);
348   }
350   /* Save data to object */
351   function save_object()
352   {
353     /* Do we need to flip is_account state? */
354     if (isset($_POST['connectivityTab'])){
356       if(isset($_POST["kolabState"])){
357         if($this->acl_is_createable()){
358           $this->is_account = true;
359         }
360       }else{
361         if($this->acl_is_removeable()){
362           $this->is_account = false;
363         }
364       }
365       
366       if ($this->acl_is_writeable("unrestrictedMailSize")){
367         if (isset($_POST['unrestrictedMailSize']) && $_POST['unrestrictedMailSize'] == 1){
368           $this->unrestrictedMailSize= 1;
369         } else {
370           $this->unrestrictedMailSize= 0;
371         }
372       }
373     }
375     plugin::save_object();
377     /* Save changes done in invitation policies */
378     if($this->acl_is_writeable("kolabInvitationPolicy")){
379       $nr= 0;
380       $this->kolabInvitationPolicy= array();
381       while (isset($_POST["policy$nr"])){
383         /* Anonymous? */
384         if (!isset($_POST["address$nr"])){
385           $this->kolabInvitationPolicy[]= $_POST["policy$nr"];
386         } else {
387           $this->kolabInvitationPolicy[]= $_POST["address$nr"].": ".$_POST["policy$nr"];
388         }
390         $nr++;
391       }
393       /* If this one is empty, preset with ACT_MANUAL for anonymous users */
394       if (count ($this->kolabInvitationPolicy) == 0){
395         $this->kolabInvitationPolicy= array("ACT_MANUAL");
396       }
397     }
398   }
401   /* Save to LDAP */
402   function save()
403   {
404     /* Check mailmethod before doing something useful */
405     plugin::save();
407     /* Transfer arrays */
408     $this->attrs['kolabDelegate']= $this->kolabDelegate;
409     $this->attrs['kolabInvitationPolicy']= $this->kolabInvitationPolicy;
411     /* unrestrictedMailSize is boolean */
412     if($this->attrs['unrestrictedMailSize']){
413       $this->attrs['unrestrictedMailSize'] = "TRUE";
414     }else{
415       $this->attrs['unrestrictedMailSize'] = "FALSE";
416     }
417   
418     /* Write back to ldap */
419     $ldap= $this->config->get_ldap_link();
420     $ldap->cd($this->dn);
421     $this->cleanup();
422     $ldap->modify ($this->attrs); 
424     /* Log last action */
425     if($this->initially_was_account){
426       new log("modify","users/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error());
427     }else{
428       new log("create","users/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error());
429     }
431     show_ldap_error($ldap->get_error(), sprintf(_("Saving of user/kolab account with dn '%s' failed."),$this->dn));
433     /* Optionally execute a command after we're done */
434     if ($this->initially_was_account == $this->is_account){
435       if ($this->is_modified){
436         $this->handle_post_events("modify",array("uid" => $this->uid));
437       }
438     } else {
439       $this->handle_post_events("add",array("uid" => $this->uid));
440     }
441   }
444   /* Add entry to delegation list */
445   function addDelegate($address)
446   {
447     $this->kolabDelegate[]= $address;
448     $this->kolabDelegate= array_unique ($this->kolabDelegate);
450     sort ($this->kolabDelegate);
451     reset ($this->kolabDelegate);
452     $this->is_modified= TRUE;
453   }
455   function delDelegate($addresses)
456   {
457     $this->kolabDelegate= array_remove_entries ($addresses, $this->kolabDelegate);
458     $this->is_modified= TRUE;
459   }
462   /* Return plugin informations for acl handling  */
463   static function plInfo()
464   {
465     return (array(      
466           "plShortName"     => _("Kolab"),
467           "plDescription"   => _("Kolab account settings")."&nbsp;:&nbsp;<u>"._("Connectivity addon")."</u>",
468           "plSelfModify"    => TRUE,
469           "plDepends"       => array("user"),
470           "plPriority"      => 20,                                 // Position in tabs
471           "plSection"     => array("personal" => _("My account")),
472           "plCategory"    => array("users"),
473           "plOptions"       => array(),
475           "plProvidedAcls"  => array(
476             "kolabFreeBusyFuture"   => _("Free busy future"),
477             "unrestrictedMailSize"  => _("Mail size restriction"),
478             "calFBURL"              => _("Free busy information"),
479             "kolabDelegate"         => _("Delegations"),
480             "kolabInvitationPolicy" => _("Invitation policy"))
481           ));
482   }
485 // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
486 ?>