X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=plugins%2Fadmin%2Fgroups%2Fclass_groupMail.inc;h=874391ba46e3a63685c5273964036bf4bdc9bf94;hb=9ff9ad0e14edc40f165433911935c437aa0ad427;hp=23ff9c64e8768c718166dca6ccbf3d434b36104a;hpb=4cc6499d645861f392252cbc9c517da9e3d6347b;p=gosa.git diff --git a/plugins/admin/groups/class_groupMail.inc b/plugins/admin/groups/class_groupMail.inc index 23ff9c64e..874391ba4 100644 --- a/plugins/admin/groups/class_groupMail.inc +++ b/plugins/admin/groups/class_groupMail.inc @@ -21,21 +21,22 @@ class mailgroup extends plugin var $gosaVacationMessage= ""; var $gosaSpamSortLevel= ""; var $gosaSpamMailbox= ""; - + var $gosaSharedFolderTarget; var $quotaUsage= 0; var $forward_dialog= FALSE; var $members= array(); var $mailusers= array(); var $perms= array(); var $imapacl= array('anyone' => 'p', '%members%' => 'lrsp', '' => 'p'); + var $mmethod= ""; /* Helper */ var $indexed_acl= array(); var $indexed_user= array(); /* attribute list for save action */ - var $attributes= array("mail", "gosaMailServer", "gosaMailQuota", "gosaMailMaxSize", - "gosaMailDeliveryMode", "gosaSpamSortLevel", "gosaSpamMailbox", + var $attributes= array("mail", "gosaMailServer", "gosaMailQuota", "gosaMailMaxSize","gosaMailAlternateAddress","gosaMailForwardingAddress", + "gosaMailDeliveryMode", "gosaSpamSortLevel", "gosaSpamMailbox","acl","gosaSharedFolderTarget", "gosaVacationMessage"); var $objectclasses= array("gosaMailAccount"); @@ -52,13 +53,21 @@ class mailgroup extends plugin /* Set mailMethod to the one defined in gosa.conf */ if (isset($this->config->current['MAILMETHOD'])){ - $method= $this->config->current['MAILMETHOD']; - if (class_exists("mailMethod$method")){ - $this->method= "mailMethod$method"; - } else { - print_red(sprintf(_("There is no mail method '%s' specified in your gosa.conf available."), $method)); - } + $this->mmethod= $this->config->current['MAILMETHOD']; } + + if (class_exists("mailMethod$this->mmethod")){ + $this->method= "mailMethod$this->mmethod"; + } else { + print_red(sprintf(_("There is no mail method '%s' specified in your gosa.conf available."), $this->mmethod)); + } + + /* Load Mailserver string, only in case of kolab ???? */ + if(preg_match("/kolab/i",$this->mmethod)){ + if(isset($this->attrs['gosaMailServer'][0])){ + $this->gosaMailServer = $this->attrs['gosaMailServer'][0]; + } + } /* Convert cn to uid in case of existing entries */ if (isset($this->attrs['cn'][0])){ @@ -69,6 +78,7 @@ class mailgroup extends plugin /* Load attributes containing arrays */ foreach (array("gosaMailAlternateAddress", "gosaMailForwardingAddress") as $val){ + $this->$val = array(); if (isset($this->attrs["$val"]["count"])){ for ($i= 0; $i<$this->attrs["$val"]["count"]; $i++){ array_push($this->$val, $this->attrs["$val"][$i]); @@ -115,40 +125,107 @@ class mailgroup extends plugin unset($this->imapacl[$user]); } } - + } - + /* Update quota values */ - $this->quotaUsage= $quota['quotaUsage']; - $this->gosaMailQuota= $quota['gosaMailQuota']; + if ($quota['gosaMailQuota'] == 2147483647){ + $this->quotaUsage= ""; + $this->gosaMailQuota= ""; + } else { + $this->quotaUsage= $quota['quotaUsage']; + $this->gosaMailQuota= $quota['gosaMailQuota']; + } $method->disconnect(); } + /* Adapt attributes if needed */ + $method->fixAttributesOnLoad($this); } - } /* Get global filter config */ - if (!is_global("mailfilter")){ + if (!is_global("gmailfilter")){ $ui= get_userinfo(); $base= get_base_from_people($ui->dn); - $mailfilter= array( "depselect" => $base, + $gmailfilter= array( "depselect" => $base, "muser" => "", "regex" => "*"); - register_global("mailfilter", $mailfilter); + register_global("gmailfilter", $gmailfilter); } /* Load permissions */ - if (isset($this->attrs['acl'])){ - for ($i= 0; $i<$this->attrs['acl']['count']; $i++){ - list($user, $permission)= split(' ', $this->attrs['acl'][$i]); - $this->imapacl[$user]= $permission; - if ($user != "anyone" && $user != "%members%"){ - unset($this->imapacl['']); + $tmp = array(); + if(preg_match("/kolab/i",$this->mmethod)){ + $ldap = $this->config->get_ldap_link(); + if (isset($this->attrs['acl'])){ + for ($i= 0; $i<$this->attrs['acl']['count']; $i++){ + list($user, $permission)= split(' ', $this->attrs['acl'][$i]); + + /* Add to list */ + $this->imapacl[$user]= $permission; + + /* Get all user permissions sorted by acl, to detect the most used acl + This acl is then used for %members% + */ + $tmp[$permission][] = $user; + + /* There is an entry in $this->imapacl like this this ... + $this->attrs['imapacl']['anyone'] = "p"; + $this->attrs['imapacl']['%members%'] = "lprs"; + $this->attrs['imapacl'][''] = ""; <------ This is used to diplay an empty + Field for special acls in our template. + If there is at least one special acl in out imapacl, + we don't need this entry anymore, because it is already displayed. + */ + if ($user != "anyone" && $user != "%members%"){ + unset($this->imapacl['']); + } } } - } + /* In this section we dectect which acl is tho most used + This will be used as %members% acl + */ + $tmp2 = array(); + foreach($tmp as $acl => $user){ + $tmp2[count($tmp[$acl])]=$acl; + } + /* Most used at last */ + ksort($tmp2); + + /* Assign last (most used acl) to %members% acl */ + $this->imapacl['%members%']=array_pop($tmp2); + + /* Open ldap connection */ + $ldap = $this->config->get_ldap_link(); + $ldap->cd($this->config->current['BASE']); + + /* Remove those users, that use %members% acl && are member of this group. */ + foreach($this->imapacl as $mail => $permission){ + $ldap->search("(&(objectClass=person)(mail=".$mail."))",array("uid")); + $atr = $ldap->fetch(); + if((isset($atr['uid'][0]))&&(in_array($atr['uid'][0],$this->attrs['memberUid']))&&($permission == $this->imapacl['%members%'])){ + unset($this->imapacl[$mail]); + } + } + + /* Append an empty entry, for special acl handling */ + if(count($this->imapacl)==2){ + $this->imapacl[''] =""; + } + }else{ + /* Load permissions */ + if (isset($this->attrs['acl'])){ + for ($i= 0; $i<$this->attrs['acl']['count']; $i++){ + list($user, $permission)= split(' ', $this->attrs['acl'][$i]); + $this->imapacl[$user]= $permission; + if ($user != "anyone" && $user != "%members%"){ + unset($this->imapacl['']); + } + } + } + } /* Fill translations */ $this->perms["lrs"]= _("read"); $this->perms["lrsp"]= _("post"); @@ -160,6 +237,9 @@ class mailgroup extends plugin function execute() { + /* Call parent execute */ + //plugin::execute(); + /* Load templating engine */ $smarty= get_smarty(); if ($_SESSION['js']==FALSE){ @@ -175,7 +255,7 @@ class mailgroup extends plugin /* Do we represent a valid account? */ if (!$this->is_account && $this->parent == NULL){ - $display= " ". + $display= "\"\" ". _("This 'dn' has no valid mail extensions.").""; return ($display); } @@ -262,7 +342,7 @@ class mailgroup extends plugin /* Delete forward email addresses */ if (isset($_POST['delete_forwarder'])){ - if (count($_POST['forwarder_list']) + if (count($_POST['forwarder_list']) && chkacl ($this->acl, "gosaMailForwardingAddress") == ""){ $this->delForwarder ($_POST['forwarder_list']); @@ -300,10 +380,10 @@ class mailgroup extends plugin $ldap= $this->config->get_ldap_link(); /* Save data */ - $mailfilter= get_global("mailfilter"); + $gmailfilter= get_global("gmailfilter"); foreach( array("depselect", "muser", "regex") as $type){ if (isset($_POST[$type])){ - $mailfilter[$type]= $_POST[$type]; + $gmailfilter[$type]= $_POST[$type]; } } if (isset($_GET['search'])){ @@ -311,20 +391,20 @@ class mailgroup extends plugin if ($s == "**"){ $s= "*"; } - $mailfilter['regex']= $s; + $gmailfilter['regex']= $s; } - register_global("mailfilter", $mailfilter); + register_global("gmailfilter", $gmailfilter); /* Get actual list */ $mailusers= array (); - if ($mailfilter['regex'] != '*' && $mailfilter['regex'] != ""){ - $regex= $mailfilter['regex']; + if ($gmailfilter['regex'] != '*' && $gmailfilter['regex'] != ""){ + $regex= $gmailfilter['regex']; $filter= "(|(mail=$regex)(gosaMailAlternateAddress=$regex))"; } else { $filter= ""; } - if ($mailfilter['muser'] != ""){ - $user= $mailfilter['muser']; + if ($gmailfilter['muser'] != ""){ + $user= $gmailfilter['muser']; $filter= "$filter(|(uid=$user)(cn=$user)(givenName=$user)(sn=$user))"; } @@ -338,8 +418,8 @@ class mailgroup extends plugin } $acl= array($this->config->current['BASE'] => ":all"); - $res= get_list($acl, "(&(objectClass=gosaMailAccount)$filter)", TRUE, $mailfilter['depselect'], array("sn", "mail", "givenName"), TRUE); - $ldap->cd($mailfilter['depselect']); + $res= get_list($acl, "(&(objectClass=gosaMailAccount)$filter)", TRUE, $gmailfilter['depselect'], array("sn", "mail", "givenName"), TRUE); + $ldap->cd($gmailfilter['depselect']); $ldap->search ("(&(objectClass=gosaMailAccount)$filter)", array("sn", "mail", "givenName")); error_reporting (0); while ($attrs= $ldap->fetch()){ @@ -356,6 +436,7 @@ class mailgroup extends plugin /* Show dialog */ $smarty->assign("search_image", get_template_path('images/search.png')); + $smarty->assign("usearch_image", get_template_path('images/search_user.png')); $smarty->assign("tree_image", get_template_path('images/tree.png')); $smarty->assign("infoimage", get_template_path('images/info.png')); $smarty->assign("launchimage", get_template_path('images/small_filter.png')); @@ -365,7 +446,7 @@ class mailgroup extends plugin $smarty->assign("alphabet", generate_alphabet()); $smarty->assign("hint", print_sizelimit_warning()); foreach( array("depselect", "muser", "regex") as $type){ - $smarty->assign("$type", $mailfilter[$type]); + $smarty->assign("$type", $gmailfilter[$type]); } $smarty->assign("hint", print_sizelimit_warning()); $display.= $smarty->fetch (get_template_path('mail_locals.tpl', TRUE)); @@ -377,12 +458,13 @@ class mailgroup extends plugin if (isset($this->imapacl['anyone'])){ $smarty->assign("default_permissions", $this->imapacl['anyone']); } + $smarty->assign("member_permissions", "lrsp"); if (isset($this->imapacl['%members%'])){ $smarty->assign("member_permissions", $this->imapacl['%members%']); } /* Assemble extra attributes */ - $acl= chkacl($this->acl, "permissions"); + $perm= chkacl($this->acl, "permissions"); $tmp= ""; $nr= 0; $count= count($this->imapacl); @@ -391,7 +473,7 @@ class mailgroup extends plugin foreach($this->imapacl as $user => $acl){ if ($user != "anyone" && $user != "%members%"){ $tmp.= ""; foreach ($this->perms as $key => $value){ if ($acl == $key){ $tmp.= ""; @@ -402,11 +484,11 @@ class mailgroup extends plugin $tmp.= " "; if ($nr == $count - 1){ $tmp.= ""; + "name=\"add_$nr\" $perm>"; } if ($count > 3){ $tmp.= ""; + "name=\"del_$nr\" $perm>"; } } $this->indexed_user[$nr]= $user; @@ -426,7 +508,7 @@ class mailgroup extends plugin $smarty->assign("$val"."ACL", chkacl($this->acl, "$val")); } if (is_numeric($this->gosaMailQuota) && $this->gosaMailQuota != 0){ - $smarty->assign("quotausage", $this->quotaUsage * 100 / $this->gosaMailQuota); + $smarty->assign("quotausage", progressbar(round(($this->quotaUsage * 100)/ $this->gosaMailQuota),100,15,true)); $smarty->assign("quotadefined", "true"); } else { $smarty->assign("quotadefined", "false"); @@ -440,6 +522,14 @@ class mailgroup extends plugin /* remove object from parent */ function remove_from_parent() { + /* Added these ObjectClass and Attributes, because they were not + removed correctly, only in case of kolab ... + */ + if(isset($this->config->current['MAILMETHOD'])&&preg_match("/kolab/i",$this->config->current['MAILMETHOD'])){ + $this->attributes[]="acl"; + $this->attributes[]="kolabHomeServer"; + $this->objectclasses[] = "kolabSharedFolder"; + } /* include global link_info */ $ldap= $this->config->get_ldap_link(); @@ -454,7 +544,9 @@ class mailgroup extends plugin /* Keep uid */ unset ($this->attrs['uid']); $ldap->cd($this->dn); - $ldap->modify($this->attrs); + $this->cleanup(); +$ldap->modify ($this->attrs); + show_ldap_error($ldap->get_error()); /* Connect to IMAP server for account deletion */ @@ -465,6 +557,7 @@ class mailgroup extends plugin $method->deleteMailbox($this->uid); $method->disconnect(); } + $method->fixAttributesOnRemove($this); } /* Optionally execute a command after we're done */ @@ -526,7 +619,7 @@ class mailgroup extends plugin if (!isset($_POST["user_$nr"])){ continue; } - if ($_POST["user_$nr"] != $user || + if ($_POST["user_$nr"] != $user || $_POST["perm_$nr"] != $this->indexed_acl[$nr]){ $this->is_modified= TRUE; } @@ -538,22 +631,35 @@ class mailgroup extends plugin } - /* Save data to LDAP, depending on is_account we save or delete */ + /* + Backup for function save + Änderungen : fixAttributesOnStore($this) wurde erst nach dem this->cleanup(); +$ldap->modify + + Ausgeführt, deshalb wurden die gemappten Attribute auch nicht + gespeichert. + + Von : Fabian Hickert + Datum : 15.12.2005 + + Alter Quellcode : + + /* Save data to LDAP, depending on is_account we save or delete * / function save() { $ldap= $this->config->get_ldap_link(); - /* Call parents save to prepare $this->attrs */ + /* Call parents save to prepare $this->attrs * / plugin::save(); - /* Save arrays */ + /* Save arrays * / $this->attrs['gosaMailAlternateAddress']= $this->gosaMailAlternateAddress; $this->attrs['gosaMailForwardingAddress']= $this->gosaMailForwardingAddress; - /* Save shared folder target */ + /* Save shared folder target * / $this->attrs['gosaSharedFolderTarget']= "share+".$this->uid; - /* Save acl's */ + /* Save acl's * / $this->attrs['acl']= array(); foreach ($this->imapacl as $user => $acl){ if ($user == ""){ @@ -562,14 +668,110 @@ class mailgroup extends plugin $this->attrs['acl'][]= "$user $acl"; } - /* Save data to LDAP */ + /* Save data to LDAP * / $ldap->cd($this->dn); - $ldap->modify($this->attrs); + $this->cleanup(); +$ldap->modify ($this->attrs); + show_ldap_error($ldap->get_error()); - /* Only do IMAP actions if we are not a template */ + /* Only do IMAP actions if we are not a template * / if (!$this->is_template){ $method= new $this->method($this->config); + $method->fixAttributesOnStore($this); + if ($method->connect($this->gosaMailServer)){ + $method->updateMailbox($this->uid); + $method->setQuota($this->uid, $this->gosaMailQuota); + + /* Exchange '%member%' pseudo entry * / + $memberacl= $this->imapacl['%members%']; + unset ($this->imapacl['%members%']); + foreach ($this->members as $user){ + if (!isset($this->imapacl[$user])){ + $this->imapacl[$user]= $memberacl; + } + } + + $method->setSharedFolderPermissions($this->uid, $this->imapacl); + $method->disconnect(); + } + } + + /* Optionally execute a command after we're done * / + if ($this->initially_was_account == $this->is_account){ + if ($this->is_modified){ + $this->handle_post_events("mofify"); + } + } else { + $this->handle_post_events("add"); + } + } + + ENDE Alter Quellcode + */ + + + + + + + + + /* Save data to LDAP, depending on is_account we save or delete */ + function save() + { + $ldap= $this->config->get_ldap_link(); + + /* Call parents save to prepare $this->attrs */ + plugin::save(); + + /* Save arrays */ + $this->attrs['gosaMailAlternateAddress']= $this->gosaMailAlternateAddress; + $this->attrs['gosaMailForwardingAddress']= $this->gosaMailForwardingAddress; + + /* Save shared folder target */ + $this->attrs['gosaSharedFolderTarget']= "share+".$this->uid; + + if(preg_match("/kolab/i",$this->mmethod)){ + /* Save acl's */ + $this->attrs['acl']= array(); + foreach ($this->imapacl as $user => $acl){ + if ($user == ""){ + continue; + } + $ldap->search("(&(objectClass=person)(uid=".$user."))",array("mail")); + $mail = $ldap->fetch(); + if($mail){ + if(isset($mail['mail'][0])){ + $this->attrs['acl'][]= $mail['mail'][0]." $acl"; + } + }else{ + $this->attrs['acl'][]= "$user $acl"; + } + } + }else{ + /* Save acl's */ + $this->attrs['acl']= array(); + foreach ($this->imapacl as $user => $acl){ + if ($user == ""){ + continue; + } + $this->attrs['acl'][]= "$user $acl"; + } + } + + /* Only do IMAP actions if we are not a template */ + if(preg_match("/kolab/i",$this->mmethod)){ + if (empty($this->gosaMailServer)||is_array($this->gosaMailServer)){ + if(isset($this->attrs['gosaMailServer'][0])){ + $this->gosaMailServer = $this->attrs['gosaMailServer'][0]; + } + } + } + + if ((!$this->is_template)&&(!empty($this->gosaMailServer))){ + $method= new $this->method($this->config); + $method->fixAttributesOnStore($this); if ($method->connect($this->gosaMailServer)){ $method->updateMailbox($this->uid); $method->setQuota($this->uid, $this->gosaMailQuota); @@ -582,12 +784,19 @@ class mailgroup extends plugin $this->imapacl[$user]= $memberacl; } } - + $method->setSharedFolderPermissions($this->uid, $this->imapacl); $method->disconnect(); } } + /* Save data to LDAP */ + $ldap->cd($this->dn); + $this->cleanup(); +$ldap->modify ($this->attrs); + + show_ldap_error($ldap->get_error()); + /* Optionally execute a command after we're done */ if ($this->initially_was_account == $this->is_account){ if ($this->is_modified){ @@ -613,7 +822,7 @@ class mailgroup extends plugin $message[]= _("Please enter a valid email addres in 'Primary address' field."); } $ldap->cd($this->config->current['BASE']); - $ldap->search ("(&(|(mail=".$this->mail.")(gosaMailAlternateAddress=". + $ldap->search ("(&(!(objectClass=gosaUserTemplate))(objectClass=gosaMailAccount)(|(mail=".$this->mail.")(gosaMailAlternateAddress=". $this->mail."))(!(uid=".$this->cn."))(!(cn=".$this->cn.")))"); if ($ldap->count() != 0){ $message[]= _("The primary address you've entered is already in use."); @@ -642,6 +851,14 @@ class mailgroup extends plugin $message[]= _("You need to set the maximum mail size in order to reject anything."); } + if(ord($this->imapacl['anyone'][0])==194){ + $message[] = _("Please choose valid permission settings. Default permission can't be emtpy."); + } + + if(empty($this->gosaMailServer)){ + $message[] = _("Please select a valid mail server."); + } + return ($message); }