X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=plugins%2Fadmin%2Fgroups%2Fclass_groupMail.inc;h=31557a6c4c12aa858266cacd3f4ca4826feddfa5;hb=4f507bf6c24fd9a5c50928b3a0c334ba5529c42d;hp=520eade9e339621ed2d2d85517e90362da523012;hpb=84d2c065af9ce3f287fef380606a593a0cda5a81;p=gosa.git diff --git a/plugins/admin/groups/class_groupMail.inc b/plugins/admin/groups/class_groupMail.inc index 520eade9e..31557a6c4 100644 --- a/plugins/admin/groups/class_groupMail.inc +++ b/plugins/admin/groups/class_groupMail.inc @@ -3,72 +3,99 @@ class mailgroup extends plugin { /* CLI vars */ - var $cli_summary= "Manage mail groups/shared folders"; - var $cli_description= "Some longer text\nfor help"; - var $cli_parameters= array("eins" => "Eins ist toll", "zwei" => "Zwei ist noch besser"); - var $method= "mailMethod"; - - /* plugin specific values */ - var $mail= ""; - var $uid= ""; - var $cn= ""; - var $gosaMailAlternateAddress= array(); - var $gosaMailForwardingAddress= array(); - var $gosaMailDeliveryMode= "[L ]"; - var $gosaMailServer= ""; - var $gosaMailQuota= ""; - var $gosaMailMaxSize= ""; - var $gosaVacationMessage= ""; - var $gosaSpamSortLevel= ""; - var $gosaSpamMailbox= ""; - - 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 $cli_summary = "Manage mail groups/shared folders"; + var $cli_description = "Some longer text\nfor help"; + var $cli_parameters = array("eins" => "Eins ist toll", "zwei" => "Zwei ist noch besser"); + + var $uid = ""; // User id + var $cn = ""; // cn + + var $method = "mailMethod"; // Used Mail method + var $mmethod = ""; // Contains the gosa.conf MAILMETHOD + var $mail = ""; // Default mail address + + var $gosaMailAlternateAddress = array(); // Set default Alternate Mail Adresses to empty array + var $gosaMailForwardingAddress = array(); // Forwarding also empty + + var $gosaMailServer = ""; // Selected mailserver + var $gosaMailQuota = ""; // Defined Quota + var $quotaUsage = 0; // Currently used quota + + var $gosaVacationMessage = ""; // Vocation message + + var $imapacl = array('anyone' => 'p', // Set acls for everyone + '%members%' => 'lrsp', // %members% are all group-members + '' => 'p'); // Every user added gets this right + + + var $gosaSpamSortLevel = ""; + var $gosaSpamMailbox = ""; + var $gosaSharedFolderTarget ; + + var $forward_dialog = FALSE; + + var $members = array(); // Group members + + var $mailusers = array(); + var $perms = array(); + var $gosaMailDeliveryMode = "[L ]"; // + var $gosaMailMaxSize = ""; // + /* Helper */ var $indexed_acl= array(); var $indexed_user= array(); /* attribute list for save action */ - var $attributes= array("mail", "gosaMailServer", "gosaMailQuota", "gosaMailMaxSize", + var $attributes= array( "mail", "gosaMailServer", "gosaMailQuota", "gosaMailMaxSize", + "gosaMailAlternateAddress", "gosaMailForwardingAddress", "gosaMailDeliveryMode", "gosaSpamSortLevel", "gosaSpamMailbox", - "gosaVacationMessage"); + "acl","gosaSharedFolderTarget", "gosaVacationMessage"); + var $objectclasses= array("gosaMailAccount"); - /* constructor, if 'dn' is set, the node loads the given - 'dn' from LDAP */ - function mailgroup ($config, $dn= NULL, $ui= NULL) + function mailgroup ($config, $dn= NULL, $parent= NULL) { - /* Configuration is fine, allways */ - $this->config= $config; - - /* Load bases attributes */ - plugin::plugin($config, $dn); + /* Initialise all available attributes ... if possible + */ + plugin::plugin($config, $dn, $parent); - /* Set mailMethod to the one defined in gosa.conf */ + /* 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']; + } + + /* Check if selected mail method exists + */ + 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)); } - /* Convert cn to uid in case of existing entries */ + /* Load Mailserver + */ + if(isset($this->attrs['gosaMailServer'][0])){ + $this->gosaMailServer = $this->attrs['gosaMailServer'][0]; + } + + /* Convert cn to uid in case of existing entry + */ if (isset($this->attrs['cn'][0])){ $this->uid= $this->attrs['cn'][0]; } - if ($dn != NULL){ - /* Load attributes containing arrays */ + /* If this ins't new mailgroup, read all required data from ldap + */ + if (($dn != "new")&&($dn != NULL)){ + + /* Load attributes which represent multiple entries + */ 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]); @@ -76,11 +103,16 @@ class mailgroup extends plugin } } - /* Only do IMAP actions if gosaMailServer attribute is set */ + /* Only do IMAP actions if gosaMailServer attribute is set + */ if (isset ($this->attrs["gosaMailServer"][0])){ + + /* Create new instance of our defined mailclass + */ $method= new $this->method($this->config); + if ($method->connect($this->attrs["gosaMailServer"][0])){ - $quota= $method->getQuota($this->uid); + /* Maybe the entry is not saved in new style, get permissions from IMAP and convert them to acl attributes */ @@ -109,24 +141,44 @@ class mailgroup extends plugin /* Highest count wins as %members%, remove all members with the same acl */ - $this->imapacl['%members%']= $leader; + if(!empty($leader)){ + $this->imapacl['%members%']= $leader; + } foreach ($this->imapacl as $user => $acl){ if ($this->acl == $leader && in_array($user, $this->attrs['memberUid'])){ unset($this->imapacl[$user]); } } - - } + + } // ENDE ! isset ($this->attrs['acl']) + /* Adapt attributes if needed */ + $method->fixAttributesOnLoad($this); + + /* get Quota */ + $quota= $method->getQuota($this->uid); + /* Update quota values */ - $this->quotaUsage= $quota['quotaUsage']; - $this->gosaMailQuota= $quota['gosaMailQuota']; + if(is_array($quota)){ + if ($quota['gosaMailQuota'] == 2147483647){ + $this->quotaUsage= ""; + $this->gosaMailQuota= ""; + } else { + $this->quotaUsage= $quota['quotaUsage']; + $this->gosaMailQuota= $quota['gosaMailQuota']; + } + }else{ + $this->quotaUsage = ""; + $this->gosaMailQuota = ""; +// print_red(sprintf(_("Can't get quota information for '%s'."),$this->uid)); + } $method->disconnect(); - } + } // ENDE $method->connect($this->attrs["gosaMailServer"][0])){ - } + } // ENDE gosaMailServer + + } // ENDE dn != "new" - } /* Get global filter config */ if (!is_global("gmailfilter")){ @@ -139,16 +191,95 @@ class mailgroup extends plugin } /* 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% + */ + if ($user != "anyone" && $user != "%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 + */ + $str = array_pop($tmp2); + if(!empty($str)) { + $this->imapacl['%members%']=$str; + } + + /* 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($this->attrs['memberUid'])) && (is_array($this->attrs['memberUid']))){ + 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{ // Not kolab + /* 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['']); + } } } } + /* Load Mailserver + */ + if(isset($this->attrs['gosaMailServer'][0])){ + $this->gosaMailServer = $this->attrs['gosaMailServer'][0]; + } /* Fill translations */ $this->perms["lrs"]= _("read"); $this->perms["lrsp"]= _("post"); @@ -157,11 +288,10 @@ class mailgroup extends plugin $this->perms["lrswipcd"]= _("write"); } - function execute() { - /* Call parent execute */ - plugin::execute(); + /* Call parent execute */ + //plugin::execute(); /* Load templating engine */ $smarty= get_smarty(); @@ -265,7 +395,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']); @@ -341,7 +471,8 @@ class mailgroup extends plugin } $acl= array($this->config->current['BASE'] => ":all"); - $res= get_list($acl, "(&(objectClass=gosaMailAccount)$filter)", TRUE, $gmailfilter['depselect'], array("sn", "mail", "givenName"), TRUE); + $res= get_list("(&(objectClass=gosaMailAccount)$filter)", $acl, $gmailfilter['depselect'], + array("sn", "mail", "givenName"), GL_SUBSEARCH | GL_SIZELIMIT); $ldap->cd($gmailfilter['depselect']); $ldap->search ("(&(objectClass=gosaMailAccount)$filter)", array("sn", "mail", "givenName")); error_reporting (0); @@ -359,6 +490,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')); @@ -380,6 +512,7 @@ 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%']); } @@ -394,7 +527,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.= ""; @@ -405,11 +538,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; @@ -429,7 +562,7 @@ class mailgroup extends plugin $smarty->assign("$val"."ACL", chkacl($this->acl, "$val")); } if (is_numeric($this->gosaMailQuota) && $this->gosaMailQuota != 0){ - $smarty->assign("quotausage", progressbar(round(($this->quotaUsage * 100)/ $this->gosaMailQuota,100,15,true))); + $smarty->assign("quotausage", progressbar(round(($this->quotaUsage * 100)/ $this->gosaMailQuota),100,15,true)); $smarty->assign("quotadefined", "true"); } else { $smarty->assign("quotadefined", "false"); @@ -443,6 +576,13 @@ 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->objectclasses[] = "kolabSharedFolder"; + } /* include global link_info */ $ldap= $this->config->get_ldap_link(); @@ -454,21 +594,23 @@ class mailgroup extends plugin $this->attrs['gosaMailForwardingAddress']= array(); $this->attrs['gosaSharedFolderTarget']= array(); - /* Keep uid */ - unset ($this->attrs['uid']); - $ldap->cd($this->dn); - $ldap->modify($this->attrs); - show_ldap_error($ldap->get_error()); - /* Connect to IMAP server for account deletion */ - if ($this->is_account){ + if ($this->initially_was_account){ $method= new $this->method($this->config); - if ($method->connect($this->attrs["gosaMailServer"][0])){ + if ($method->connect($this->gosaMailServer)){ /* Remove account from IMAP server */ $method->deleteMailbox($this->uid); $method->disconnect(); } + $method->fixAttributesOnRemove($this); } + /* Keep uid */ + unset ($this->attrs['uid']); + + + $ldap->cd($this->dn); + $ldap->modify ($this->attrs); + show_ldap_error($ldap->get_error(), _("Removing group mail settings failed")); /* Optionally execute a command after we're done */ $this->handle_post_events("remove"); @@ -484,12 +626,12 @@ class mailgroup extends plugin we're in some other dialog. Example for gosaMailDeliveryMode [LR ] - L: Local delivery - R: Reject when exceeding mailsize limit - S: Use spam filter - V: Use vacation message - C: Use custom sieve script - I: Only insider delivery */ +L: Local delivery +R: Reject when exceeding mailsize limit +S: Use spam filter +V: Use vacation message +C: Use custom sieve script +I: Only insider delivery */ if (isset($_POST['mailedit'])){ /* Save ldap attributes */ @@ -529,7 +671,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; } @@ -541,60 +683,103 @@ class mailgroup extends plugin } + /* Save data to LDAP, depending on is_account we save or delete */ function save() { $ldap= $this->config->get_ldap_link(); + $ldap->cd($this->config->current['BASE']); /* 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; - - /* Save acl's */ - $this->attrs['acl']= array(); - foreach ($this->imapacl as $user => $acl){ - if ($user == ""){ - continue; + $this->attrs['gosaMailAlternateAddress'] = $this->gosaMailAlternateAddress; + $this->attrs['gosaMailForwardingAddress'] = $this->gosaMailForwardingAddress; + $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.")(mail=".$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"; } - $this->attrs['acl'][]= "$user $acl"; } - /* Save data to LDAP */ - $ldap->cd($this->dn); - $ldap->modify($this->attrs); - show_ldap_error($ldap->get_error()); - /* Only do IMAP actions if we are not a template */ - if (!$this->is_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); - if ($method->connect($this->gosaMailServer)){ + $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(); } } + /* Exchange '%member%' pseudo entry */ + $memberacl= $this->imapacl['%members%']; + + foreach ($this->members as $user){ + if(preg_match("/kolab/i",$this->mmethod)){ + $ldap->cd($this->config->current['BASE']); + $ldap->search("(&(objectClass=person)(|(mail=".$user.")(uid=".$user.")))",array("mail")); + $at = $ldap->fetch(); + if(isset($at['mail'][0])){ + $user = $at['mail'][0]; + } + } + if (!isset($this->imapacl[$user])){ + $this->imapacl[$user]= $memberacl; + } + } + $this->attrs['acl'] = array(); + foreach($this->imapacl as $user => $acl){ + if(preg_match("/%members%/",$user) || empty($user)) continue; + + $this->attrs['acl'][] = $user." ".$acl; + } + + /* Save data to LDAP */ + $ldap->cd($this->dn); + $this->cleanup(); + $ldap->modify ($this->attrs); + show_ldap_error($ldap->get_error(), _("Saving group mail settings failed")); + /* 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"); + $this->handle_post_events("modify"); } } else { $this->handle_post_events("add"); @@ -606,7 +791,12 @@ class mailgroup extends plugin { $ldap= $this->config->get_ldap_link(); - $message= array(); + /* Call common method to give check the hook */ + $message= plugin::check(); + + if(!$this->is_account) return array(); + + //$message[] = $str; /* must: mail */ if ($this->mail == ""){ @@ -616,12 +806,12 @@ class mailgroup extends plugin $message[]= _("Please enter a valid email addres in 'Primary address' field."); } $ldap->cd($this->config->current['BASE']); - $ldap->search ("(&(!(objectClass=gosaUserTemplate))(|(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."); } - + /* Check quota */ if ($this->gosaMailQuota != '' && chkacl ($this->acl, "gosaMailQuota") == ""){ if (!is_numeric($this->gosaMailQuota)) { @@ -644,7 +834,7 @@ class mailgroup extends plugin if (is_integer(strpos($this->gosaMailDeliveryMode, "reject")) && $this->gosaMailMaxSize == ""){ $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."); } @@ -692,7 +882,7 @@ class mailgroup extends plugin function delForwarder($addresses) { $this->gosaMailForwardingAddress= array_remove_entries ($addresses, - $this->gosaMailForwardingAddress); + $this->gosaMailForwardingAddress); $this->is_modified= TRUE; } @@ -730,7 +920,7 @@ class mailgroup extends plugin function delAlternate($addresses) { $this->gosaMailAlternateAddress= array_remove_entries ($addresses, - $this->gosaMailAlternateAddress); + $this->gosaMailAlternateAddress); $this->is_modified= TRUE; } @@ -755,6 +945,34 @@ class mailgroup extends plugin return ($name); } + function getCopyDialog() + { + if(!$this->is_account) return(""); + + $smarty = get_smarty(); + $smarty->assign("gosaMailAlternateAddress",$this->gosaMailAlternateAddress); + $smarty->assign("gosaMailForwardingAddress",$this->gosaMailForwardingAddress); + $smarty->assign("mail",$this->mail); + $display= $smarty->fetch (get_template_path('paste_mail.tpl', TRUE)); + $ret = array(); + $ret['string'] = $display; + $ret['status'] = ""; + return($ret); + } + + function saveCopyDialog() + { + if(!$this->is_account) return; + + /* Perform ADD / REMOVE ... for mail alternate / mail forwarding addresses + */ + $this->execute(); + if(isset($_POST['mail'])){ + $this->mail = $_POST['mail']; + } + } + + } // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: