X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=plugins%2Fpersonal%2Fmail%2Fclass_mailAccount.inc;h=80f9ba64bea1bbf2f1d196d1bcecb9788627d22f;hb=36132efb753e98b9e0779defb4f991316333eb7c;hp=0cdec484c6c33d4aa51f7fb070c1a5c5279bdedc;hpb=b9306c13c8fb5eed03eb4fa75bb5d047c97b0c6a;p=gosa.git diff --git a/plugins/personal/mail/class_mailAccount.inc b/plugins/personal/mail/class_mailAccount.inc index 0cdec484c..80f9ba64b 100644 --- a/plugins/personal/mail/class_mailAccount.inc +++ b/plugins/personal/mail/class_mailAccount.inc @@ -10,7 +10,7 @@ */ /* Load sieve support */ -@require_once ("class_sieve.inc"); +require_once ("sieve/libsieve.inc"); /* Load mail methods */ global $BASE_DIR; @@ -19,58 +19,67 @@ get_dir_list("$BASE_DIR/include"); class mailAccount extends plugin { /* Definitions */ - var $plHeadline= "Mail"; - var $plDescription= "This does something"; - var $method= "mailMethod"; - - /* CLI vars */ - var $cli_summary= "Manage users mail account"; - var $cli_description= "Some longer text\nfor help"; - var $cli_parameters= array("eins" => "Eins ist toll", "zwei" => "Zwei ist noch besser"); + var $plHeadline = "Mail"; + var $plDescription = "This does something"; + var $method = "mailMethod"; /* plugin specific values */ - var $mail= ""; - var $uid= ""; - 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 $folder_prefix= ""; - var $mailboxList= array(); - var $default_permissions= "none"; - var $member_permissions= "post"; - var $members= array(); - var $admins= array(); - var $vacations= array(); - var $perms= array( "lrs" => "read", "lrsp" => "post", "lrsip" => "append", - "lrswipcd" => "write", "lrswipcda" => "all" ); + var $mail = ""; + var $uid = ""; + var $gosaMailAlternateAddress = array(); + var $gosaMailForwardingAddress = array(); + var $gosaMailDeliveryMode = "[L ]"; + var $gosaMailServer = ""; + var $gosaMailQuota = ""; + var $gosaMailMaxSize = ""; + var $gosaVacationMessage = ""; + var $gosaVacationStart = 0; + var $gosaVacationStop = 0; + var $gosaSpamSortLevel = ""; + var $gosaSpamMailbox = ""; + + var $quotaUsage = 0; + var $forward_dialog = FALSE; + var $folder_prefix = ""; + var $mailboxList = array("INBOX"); + var $default_permissions = "none"; + var $member_permissions = "post"; + var $members = array(); + var $admins = array(); + var $vacations = array(); + var $perms = array( "lrs" => "read", + "lrsp" => "post", + "lrsip" => "append", + "lrswipcd" => "write", + "lrswipcda" => "all" ); /* attribute list for save action */ - var $attributes= array("mail", "gosaMailServer", "gosaMailQuota", "gosaMailMaxSize", - "gosaMailDeliveryMode", "gosaSpamSortLevel", "gosaSpamMailbox", - "gosaVacationMessage", "uid"); + var $attributes= array("mail", "gosaMailServer", "gosaMailQuota", "gosaMailMaxSize","gosaMailForwardingAddress", + "gosaMailDeliveryMode", "gosaSpamSortLevel", "gosaSpamMailbox","gosaMailAlternateAddress", + "gosaVacationMessage", "gosaMailAlternateAddress", "gosaMailForwardingAddress", "gosaVacationStart", "gosaVacationStop"); var $objectclasses= array("gosaMailAccount"); + var $sieve_management = NULL; /* constructor, if 'dn' is set, the node loads the given 'dn' from LDAP */ - function mailAccount ($config, $dn= NULL) + function mailAccount ($config, $dn= NULL, $parent= NULL) { - /* Configuration is fine, allways */ - $this->config= $config; - /* Load bases attributes */ - plugin::plugin($config, $dn); + plugin::plugin($config, $dn, $parent); + + if(isset($this->attrs['uid'])){ + $this->uid = $this->attrs['uid'][0]; + } + + if(is_array($this->gosaMailServer) && isset($this->gosaMailServer[0])){ + $this->gosaMailServer = $this->gosaMailServer[0]; + } + + /* Save initial account state */ + $this->initially_was_account= $this->is_account; - /* 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")){ @@ -80,18 +89,23 @@ class mailAccount extends plugin } } - /* Preset folder prefix. Will change it later to respect + /* Create the account prefix user. user/ + Preset folder prefix. Will change it later to respect altnamespace. */ if (isset($this->config->current['CYRUSUNIXSTYLE']) && $this->config->current['CYRUSUNIXSTYLE'] == "true"){ $this->folder_prefix= "user/"; + }elseif (isset($this->config->data['MAIN']['CYRUSUNIXSTYLE']) && $this->config->data['MAIN']['CYRUSUNIXSTYLE'] == "true"){ + $this->folder_prefix= "user/"; } else { $this->folder_prefix= "user."; } - - if ($dn != NULL){ + + /* This is not a new account, parse additional attributes */ + if (($dn != NULL) && ($dn != "new") && $this->is_account){ /* 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]); @@ -99,25 +113,58 @@ class mailAccount extends plugin } } + /* Only do IMAP actions if gosaMailServer attribute is set */ if (isset ($this->attrs["gosaMailServer"][0])){ - $method= new $this->method($this->config); - $id= $method->uattrib; + + $method = new $this->method($this->config); + $id = $method->uattrib; + + /* Adapt attributes if needed */ + $method->fixAttributesOnLoad($this); + + /* FixAttributesOnLoad possibly creates an array out of gosaMailServer. + If the mail tab wasn't opened once before saving, the account can't be saved */ + if(is_array($this->gosaMailServer)){ + $this->gosaMailServer = $this->gosaMailServer[0]; + } + if ($method->connect($this->attrs["gosaMailServer"][0])){ + + /* Update quota values */ $quota= $method->getQuota($this->folder_prefix.$this->$id); - $this->quotaUsage= $quota['quotaUsage']; - $this->gosaMailQuota= $quota['gosaMailQuota']; - $this->mailboxList= $method->getMailboxList( - $this->folder_prefix.$this->$id, - $this->$id); + + if($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->folder_prefix.$this->$id)); + } + + /* Get mailboxes / folder like INBOX ..*/ + $this->mailboxList= $method->getMailboxList($this->folder_prefix.$this->$id,$this->$id); + $method->disconnect(); + }else{ + /* Could not connect to ldap. + */ + if (isset($this->attrs['gosaMailQuota'][0])){ + $this->gosaMailQuota = $this->attrs['gosaMailQuota'][0]; + } } - - /* Adapt attributes if needed */ - $method->fixAttributesOnLoad($this); } } + + /* Get vacation message */ + /* Fill vacation array */ $this->vacation= array(); if (isset($this->config->current['VACATIONDIR'])){ @@ -136,6 +183,13 @@ class mailAccount extends plugin } } + /* Create sieve management class */ + $method = new $this->method($this->config); + $id = $method->uattrib; + $this->sieve_management = new sieveManagement($this->config,$this->dn,$this,$id); + + /* Create filter */ + /* Get global filter config */ if (!is_global("mailfilter")){ $ui= get_userinfo(); @@ -145,9 +199,6 @@ class mailAccount extends plugin "regex" => "*"); register_global("mailfilter", $mailfilter); } - - /* Save initial account state */ - $this->initially_was_account= $this->is_account; } @@ -174,19 +225,66 @@ class mailAccount extends plugin function execute() { + /* Call parent execute */ + plugin::execute(); + + /* Initialise vars */ + /* Load templating engine */ $smarty= get_smarty(); $display= ""; + /* Get available mailserver */ + $mailserver= array(); + foreach ($this->config->data['SERVERS']['IMAP'] as $key => $val){ + $mailserver[]= $key; + } + + + /* + * Sieve Management + */ + if(isset($_POST['sieveManagement']) + && preg_match("/C/",$this->gosaMailDeliveryMode) + && chkacl($this->acl,"sieveManagement") == "") { + $this->dialog = $this->sieve_management; + } + + /* Cancel sieve edit */ + if(isset($_POST['sieve_cancel'])){ + $this->dialog = NULL; + } + + /* Save sieve changes */ + if(isset($_POST['sieve_finish'])){ + $this->sieve_management = $this->dialog; + $this->dialog = NULL; + } + + if(is_object($this->dialog)){ + $this->dialog->save_object(); + return($this->dialog->execute()); + } + + + /* Handle account state */ + /* Do we need to flip is_account state? */ if (isset($_POST['modify_state'])){ - $this->is_account= !$this->is_account; + + /* Onyl change account state if allowed */ + if($this->is_account && $this->acl == "#all#" && !$this->accountDelegationsConfigured()){ + $this->is_account= !$this->is_account; + }elseif(!$this->is_account && chkacl($this->acl,"create") == ""){ + $this->is_account= !$this->is_account; + } } /* Do we represent a valid account? */ if (!$this->is_account && $this->parent == NULL){ $display= "\"\" ". _("This account has no mail extensions.").""; + $display.= back_to_main(); return ($display); } @@ -194,15 +292,21 @@ class mailAccount extends plugin /* Show tab dialog headers */ if ($this->parent != NULL){ if ($this->is_account){ - $display= $this->show_header(_("Remove mail account"), - _("This account has mail features enabled. You can disable them by clicking below.")); + if($this->accountDelegationsConfigured()){ + $display= $this->show_header(_("Remove mail account"), + _("This account can't be removed while there are delegations configured. Remove those delegations first."),TRUE,TRUE); + }else{ + $display= $this->show_header(_("Remove mail account"), + _("This account has mail features enabled. You can disable them by clicking below.")); + } } else { - $display= $this->show_header(_("Create mail account"), - _("This account has mail features disabled. You can enable them by clicking below.")); + $display= $this->show_header(_("Create mail account"), _("This account has mail features disabled. You can enable them by clicking below.")); return ($display); } } + /* Forwarder subdialog */ + /* Trigger forward add dialog? */ if (isset($_POST['add_local_forwarder'])){ $this->forward_dialog= TRUE; @@ -278,6 +382,9 @@ class mailAccount extends plugin } } + + /* Alternate address handling */ + /* Add alternate email addresses */ if (isset($_POST['add_alternate'])){ if ($_POST['alternate_address'] != "" && @@ -301,7 +408,7 @@ class mailAccount extends plugin if ($valid && ($user= $this->addAlternate ($_POST['alternate_address'])) != ""){ $ui= get_userinfo(); - if ($user != $ui->username){ + if ($user != $ui->username && !$this->is_template){ print_red (_("The address you're trying to add is already used by user")." '$user'."); } } @@ -317,6 +424,9 @@ class mailAccount extends plugin } } + + /* Vocation message */ + /* Import vacation message? */ if (isset($_POST["import_vacation"]) && isset($this->vacation[$_POST["vacation_template"]])){ $contents= ""; @@ -328,16 +438,44 @@ class mailAccount extends plugin } /* Replace attributes */ - $attrs= $this->parent->by_object['user']->attributes; - foreach ($attrs as $val){ - $contents= preg_replace("/%$val/", - $this->parent->by_object['user']->$val, $contents); + $attrs = array(); + $obj = NULL; + if(isset($this->parent->by_object['user'])){ + $attrs = $this->parent->by_object['user']->attributes; + $obj = $this->parent->by_object['user']; + }else{ + $obj = new user($this->config,$this->dn); + $attrs = $obj->attributes; + } + + if($obj){ + foreach ($attrs as $val){ + if(preg_match("/dateOfBirth/",$val)){ + if($obj->use_dob){ + $contents= preg_replace("/%$val/",date("Y-d-m",$obj->dateOfBirth),$contents); + } + }else { + $contents= preg_replace("/%$val/", + $obj->$val, $contents); + } + + /* Replace vacation start and end time */ + if(preg_match("/%start/",$contents)){ + $contents = preg_replace("/%start/",date("d.m.Y",$this->gosaVacationStart),$contents); + } + if(preg_match("/%end/",$contents)){ + $contents = preg_replace("/%end/",date("d.m.Y",$this->gosaVacationStop),$contents); + } + } } /* Save message */ $this->gosaVacationMessage= htmlspecialchars($contents); } + + /* Display forward dialog if requested above */ + /* Show forward add dialog */ if ($this->forward_dialog){ $ldap= $this->config->get_ldap_link(); @@ -381,7 +519,8 @@ class mailAccount extends plugin } $acl= array($this->config->current['BASE'] => ":all"); - $res= get_list($acl, "(&(objectClass=gosaMailAccount)$filter)", TRUE, $mailfilter['depselect'], array("sn", "mail", "givenName"), TRUE); + $res= get_list("(&(objectClass=gosaMailAccount)$filter)", $acl, $mailfilter['depselect'], + array("sn", "mail", "givenName"), GL_SIZELIMIT | GL_SUBSEARCH); $ldap->cd($mailfilter['depselect']); $ldap->search ("(&(objectClass=gosaMailAccount)$filter)", array("sn", "mail", "givenName")); error_reporting (0); @@ -399,6 +538,7 @@ class mailAccount 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')); @@ -419,28 +559,79 @@ class mailAccount extends plugin return ($display); } - /* Show main page */ - $mailserver= array(); - foreach ($this->config->data['SERVERS']['IMAP'] as $key => $val){ - $mailserver[]= $key; + /* Display mail account tab */ + if($this->gosaVacationStart ==0){ + $date= getdate(time()); + $this->gosaVacationStart = time(); + }else{ + $date= getdate($this->gosaVacationStart); } - $smarty->assign("mailServers", $mailserver); - foreach(array("gosaMailServer", "gosaMailQuota", "perms", "mail", - "gosaMailAlternateAddress", "gosaMailForwardingAddress", - "gosaVacationMessage", "gosaMailDeliveryMode", - "gosaMailMaxSize", "gosaSpamSortLevel", "gosaSpamMailbox") as $val){ + $days= array(); + for($d= 1; $d<32; $d++){ + $days[$d]= $d; + } + $years= array(); + for($y= $date['year']-10; $y<$date['year']+10; $y++){ + $years[]= $y; + } + $months= array(_("January"), _("February"), _("March"), _("April"), + _("May"), _("June"), _("July"), _("August"), _("September"), + _("October"), _("November"), _("December")); + $smarty->assign("start_day", $date["mday"]); + $smarty->assign("days", $days); + $smarty->assign("months", $months); + $smarty->assign("start_month", $date["mon"]-1); + $smarty->assign("years", $years); + $smarty->assign("start_year", $date["year"]); + + if($this->gosaVacationStop ==0){ + $date= getdate(time()); + $date["mday"]++; + $this->gosaVacationStop = time() + (60*60*24); + }else{ + $date= getdate($this->gosaVacationStop); + } + $smarty->assign("end_day", $date["mday"]); + $smarty->assign("end_month", $date["mon"]-1); + $smarty->assign("end_year", $date["year"]); - $smarty->assign("$val", $this->$val); + $smarty->assign("mailServers", $mailserver); + foreach(array( + "gosaMailServer", + "gosaMailQuota", + "perms", + "mail", + "gosaMailAlternateAddress", + "gosaMailForwardingAddress", + + // gosaMailDeliveryMode Flags + "drop_own_mails", // No local delivery + "gosaMailMaxSize", // Enable - Drop mails > max size + "gosaSpamSortLevel", "gosaSpamMailbox", // Enable - Spam sort options + "gosaVacationMessage", // Enable - Vacation message + "gosaVacationStart", + "gosaVacationStop", + "custom_sieve", // Use custom sieve script + "only_local" // Send/receive local mails + ) as $val){ + if(isset($this->$val)){ + $smarty->assign("$val", $this->$val); + } $smarty->assign("$val"."ACL", chkacl($this->acl, "$val")); - - } + $smarty->assign("use_vacationACL", chkacl($this->acl,"use_vacation")); + $smarty->assign("gosaVacationTimerACL", chkacl($this->acl,"gosaVacationTimer")); + $smarty->assign("sieveManagementACL", chkacl($this->acl,"sieveManagement")); - + if (preg_match('/V/', $this->gosaMailDeliveryMode)){ + $smarty->assign('rangeEnabled', ""); + } else { + $smarty->assign('rangeEnabled', "disabled"); + } 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"); @@ -452,12 +643,29 @@ class mailAccount extends plugin $smarty->assign("mailACL", "disabled"); } - /* Fill checkboxes */ + if (!preg_match("/L/", $this->gosaMailDeliveryMode)) { $smarty->assign("drop_own_mails", "checked"); } else { $smarty->assign("drop_own_mails", ""); } + + $types = array( + "V"=>"use_vacation", + "S"=>"use_spam_filter", + "R"=>"use_mailsize_limit", + "I"=>"only_local", + "C"=>"own_script"); + + /* Fill checkboxes */ + foreach($types as $option => $varname){ + if (preg_match("/".$option."/", $this->gosaMailDeliveryMode)) { + $smarty->assign($varname, "checked"); + } else { + $smarty->assign($varname, ""); + } + } + if (preg_match("/V/", $this->gosaMailDeliveryMode)) { $smarty->assign("use_vacation", "checked"); } else { @@ -506,48 +714,31 @@ class mailAccount extends plugin $smarty->assign("custom_sieveACL", chkacl($this->acl, "custom_sieve")); $smarty->assign("only_localACL", chkacl($this->acl, "only_local")); - if(isset($this->gosaMailAlternateAddress)&&($this->gosaMailAlternateAddress)) - $smarty->assign("SELECT_gosaMailAlternateAddress",true); - else - $smarty->assign("SELECT_gosaMailAlternateAddress",false); - - if(isset($this->spamlevel)&&($this->spamlevel)) - $smarty->assign("SELECT_spamlevel",true); - else - $smarty->assign("SELECT_spamlevel",false); - - if(isset($this->spambox)&&($this->spambox)) - $smarty->assign("SELECT_spambox",true); - else - $smarty->assign("SELECT_spambox",false); - - if(isset($this->vacationtemplates)&&($this->vacationtemplates)) - $smarty->assign("SELECT_vacationtemplates",true); - else - $smarty->assign("SELECT_vacationtemplates",false); - - if(isset($this->gosaMailForwardingAddress)&&($this->gosaMailForwardingAddress)) - $smarty->assign("SELECT_gosaMailForwardingAddress",true); - else - $smarty->assign("SELECT_gosaMailForwardingAddress",false); - - if(isset($this->mailServers)&&($this->mailServers)) - $smarty->assign("SELECT_mailServers",true); - else - $smarty->assign("SELECT_mailServers",false); - - - - - - - - - $display.= $smarty->fetch (get_template_path('generic.tpl', TRUE, dirname(__FILE__))); return ($display); } + /* check if we have some delegations configured, those delegations must be removed first */ + function accountDelegationsConfigured() + { + /* We are in administrational edit mode. + Check tab configurations directly */ + if(isset($this->attrs)){ + $checkArray = array("kolabInvitationPolicy","unrestrictedMailSize", "calFBURL","kolabDelegate","kolabFreeBusyFuture"); + foreach($checkArray as $index){ + if(isset($this->attrs[$index])){ + return(true); + } + } + } + if(isset($this->parent->by_object['connectivity']->plugin['kolabAccount'])){ + if($this->parent->by_object['connectivity']->plugin['kolabAccount']->is_account){ + return(true); + } + } + return(false); + } + /* remove object from parent */ function remove_from_parent() @@ -571,13 +762,12 @@ class mailAccount extends plugin $method= new $this->method($this->config); $method->fixAttributesOnRemove($this); - /* Mailmethod wants us to remove the entry from LDAP. Keep uid! */ - unset ($this->attrs['uid']); - @DEBUG (DEBUG_LDAP, __LINE__, __FUNCTION__, __FILE__, - $this->attributes, "Save"); + @DEBUG (DEBUG_LDAP, __LINE__, __FUNCTION__, __FILE__,$this->attributes, "Save"); $ldap->cd($this->dn); - $ldap->modify($this->attrs); - show_ldap_error($ldap->get_error()); + $this->cleanup(); + $ldap->modify ($this->attrs); + + show_ldap_error($ldap->get_error(), _("Removing mail account failed")); /* Connect to IMAP server for account deletion */ if ($this->gosaMailServer != ""){ @@ -591,8 +781,11 @@ class mailAccount extends plugin } } + /* Update shared folder membership, ACL may need to be updated */ + $this->updateSharedFolder(); + /* Optionally execute a command after we're done */ - $this->handle_post_events("remove"); + $this->handle_post_events("remove", array('uid'=> $this->uid)); } @@ -617,31 +810,65 @@ class mailAccount extends plugin I: Only insider delivery */ $tmp= ""; - if (!isset($_POST["drop_own_mails"])){ - $tmp.= "L"; - } - if (isset($_POST["use_mailsize_limit"])){ - $tmp.= "R"; - } - if (isset($_POST["use_spam_filter"])){ - $tmp.= "S"; - } - if (isset($_POST["use_vacation"])){ - $tmp.= "V"; + $Flags = array( + "R" => array("ACL" => "gosaMailMaxSize", "POST" => "use_mailsize_limit"), + "V" => array("ACL" => "use_vacation", "POST" => "use_vacation"), + "C" => array("ACL" => "custom_sieve", "POST" => "own_script"), + "I" => array("ACL" => "only_local", "POST" => "only_local")); + + /* Check acls and set new value if allowed. + If we do not have permission to change the value + check for the old value and use this */ + foreach($Flags as $flag => $val){ + $acl = $val['ACL']; + $post = $val['POST']; + if(chkacl($this->acl,$acl) ==""){ + if (isset($_POST[$post])){ + $tmp.= $flag; + } + }else{ + if(preg_match("/".$flag."/",$this->gosaMailDeliveryMode)){ + $tmp.= $flag ; + } + } } - if (isset($_POST["own_script"])){ - $tmp.= "C"; + + /* ! Inverse flag handling for drop_own_mails */ + if(chkacl($this->acl,"drop_own_mails") == ""){ + if (!isset($_POST['drop_own_mails'])){ + $tmp.= "L"; + } + }else{ + if(preg_match("/L/",$this->gosaMailDeliveryMode)){ + $tmp.= "L" ; + } } - if (isset($_POST["only_local"])){ - $tmp.= "I"; + + /* If one of these acls are given, we are allowed to enable disable the the spam settings */ + if(chkacl($this->acl,"gosaSpamMailbox") == "" || chkacl($this->acl,"gosaSpamSortLevel") ==""){ + if (isset($_POST["use_spam_filter"])){ + $tmp.= "S"; + } + }else{ + if(preg_match("/S/",$this->gosaMailDeliveryMode)){ + $tmp.= "S" ; + } } + + /* Check if something has changed an assign new gosaMailDeliveryMode */ $tmp= "[$tmp]"; + if ($this->gosaMailDeliveryMode != $tmp){ + $this->is_modified= TRUE; + } + $this->gosaMailDeliveryMode= $tmp; - if (chkacl ($this->acl, "gosaMailDeliveryMode") == ""){ - if ($this->gosaMailDeliveryMode != $tmp){ - $this->is_modified= TRUE; + if(chkacl($this->acl,"gosaVacationTimer") == "" && preg_match("/V/",$this->gosaMailDeliveryMode)){ + if(isset($_POST['gosaVacationStart'])){ + $this->gosaVacationStart = $_POST['gosaVacationStart']; + } + if(isset($_POST['gosaVacationStop'])){ + $this->gosaVacationStop = $_POST['gosaVacationStop']; } - $this->gosaMailDeliveryMode= $tmp; } } } @@ -662,30 +889,59 @@ class mailAccount extends plugin /* Adapt attributes if needed */ $method= new $this->method($this->config); $id= $method->uattrib; + $method->fixAttributesOnStore($this); + /* Remove Mailquota if = "" or "0" */ + if((isset($this->attrs['gosaMailQuota']))&&(!$this->attrs['gosaMailQuota'])) { + $this->attrs['gosaMailQuota']=0; + } + + if(empty($this->attrs['gosaSpamMailbox'])){ + unset($this->attrs['gosaSpamMailbox']); + } + + $this->attrs['mail'] = strtolower($this->attrs['mail']); + + /* Remove attributes - if not needed */ + if (!preg_match('/V/', $this->gosaMailDeliveryMode)){ + unset($this->attrs['gosaVacationStart']); + unset($this->attrs['gosaVacationStop']); + } + /* Save data to LDAP */ $ldap->cd($this->dn); - $ldap->modify($this->attrs); - show_ldap_error($ldap->get_error()); + $this->cleanup(); + $ldap->modify ($this->attrs); + + show_ldap_error($ldap->get_error(), _("Saving mail account failed")); /* Only do IMAP actions if we are not a template */ if (!$this->is_template){ + if ($method->connect($this->gosaMailServer)){ $method->updateMailbox($this->folder_prefix.$this->$id); + $method->setQuota($this->folder_prefix.$this->$id, $this->gosaMailQuota); $method->disconnect(); - /* Write sieve information only if not in C mode */ - if (!is_integer(strpos($this->gosaMailDeliveryMode, "C"))){ - $method->configureFilter($this->$id, - $this->gosaMailDeliveryMode, - $this->mail, - $this->gosaMailAlternateAddress, - $this->gosaMailMaxSize, - $this->gosaSpamMailbox, - $this->gosaSpamSortLevel, - $this->gosaVacationMessage); + /* Only talk with sieve if the mail account already exists */ + if($this->initially_was_account){ + + /* Write sieve information only if not in C mode */ + if (!is_integer(strpos($this->gosaMailDeliveryMode, "C"))){ + $method->configureFilter($this->$id, + $this->gosaMailDeliveryMode, + $this->mail, + $this->gosaMailAlternateAddress, + $this->gosaMailMaxSize, + $this->gosaSpamMailbox, + $this->gosaSpamSortLevel, + $this->gosaVacationMessage); + $this->is_modified = TRUE; + }else{ + $this->sieve_management->save(); + } } } } @@ -693,20 +949,29 @@ class mailAccount extends plugin /* 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", array('uid'=> $this->uid)); } } else { - $this->handle_post_events("add"); + $this->handle_post_events("add", array('uid'=>$this->uid)); } + $this->updateSharedFolder(); } + /* Check formular input */ function check() { + if(!$this->is_account) return(array()); + $ldap= $this->config->get_ldap_link(); - $message= array(); + /* Call common method to give check the hook */ + $message= plugin::check(); + + if(empty($this->gosaMailServer)){ + $message[]= _("There is no valid mailserver specified, please add one in the system setup."); + } /* must: mail */ if ($this->mail == ""){ @@ -722,8 +987,11 @@ class mailAccount extends plugin } } $ldap->cd($this->config->current['BASE']); - $ldap->search ("(&(objectClass=gosaMailAccount)(!(objectClass=gosaUserTemplate))(|(mail=".$this->mail.")(gosaMailAlternateAddress=". - $this->mail."))(!(uid=".$this->uid."))(!(cn=".$this->uid.")))", array("uid")); + $filter = "(&(!(objectClass=gosaUserTemplate))(!(uid=".$this->uid."))". + "(objectClass=gosaMailAccount)". + "(|(mail=".$this->mail.")(alias=".$this->mail.")(gosaMailAlternateAddress=".$this->mail.")))"; + + $ldap->search($filter,array("uid")); if ($ldap->count() != 0){ $message[]= _("The primary address you've entered is already in use."); } @@ -753,9 +1021,18 @@ class mailAccount extends plugin $message[]= _("You need to set the maximum mail size in order to reject anything."); } + if((preg_match("/S/", $this->gosaMailDeliveryMode))&&(empty($this->gosaSpamMailbox))) { + $message[]= _("You specified Spam settings, but there is no Folder specified."); + } + + if (preg_match('/V/', $this->gosaMailDeliveryMode) && $this->gosaVacationStart > $this->gosaVacationStop){ + $message[]= _("Time interval to show vacation message is not valid."); + } + return ($message); } + /* Adapt from template, using 'dn' */ function adapt_from_template($dn) { @@ -778,17 +1055,18 @@ class mailAccount extends plugin $this->mail= strtolower(rewrite($this->mail)); } + /* Add entry to forwarder list */ function addForwarder($address) { $this->gosaMailForwardingAddress[]= $address; $this->gosaMailForwardingAddress= array_unique ($this->gosaMailForwardingAddress); - sort ($this->gosaMailForwardingAddress); reset ($this->gosaMailForwardingAddress); $this->is_modified= TRUE; } + /* Remove list of addresses from forwarder list */ function delForwarder($addresses) { @@ -797,17 +1075,17 @@ class mailAccount extends plugin } - + /* Add given mail address to the list of alternate adresses , + check if this mal address is used, skip adding in this case */ function addAlternate($address) { $ldap= $this->config->get_ldap_link(); - $address= strtolower($address); - + /* Is this address already assigned in LDAP? */ $ldap->cd ($this->config->current['BASE']); - $ldap->search ("(&(objectClass=gosaMailAccount)(|(mail=$address)". - "(gosaMailAlternateAddress=$address)))", array("uid")); + $ldap->search ("(&(!(objectClass=gosaUserTemplate))(objectClass=gosaMailAccount)(|(mail=$address)". + "(alias=$address)(gosaMailAlternateAddress=$address)))", array("uid")); if ($ldap->count() > 0){ $attrs= $ldap->fetch (); @@ -822,7 +1100,6 @@ class mailAccount extends plugin sort ($this->gosaMailAlternateAddress); reset ($this->gosaMailAlternateAddress); - return (""); } @@ -854,6 +1131,86 @@ class mailAccount extends plugin return ($name); } + + /* Create the mail part for the copy & paste dialog */ + function getCopyDialog() + { + if(!$this->is_account) return(""); + $smarty = get_smarty(); + $smarty->assign("mail",$this->mail); + $smarty->assign("gosaMailAlternateAddress",$this->gosaMailAlternateAddress); + $smarty->assign("gosaMailForwardingAddress",$this->gosaMailForwardingAddress); + $str = $smarty->fetch(get_template_path("copypaste.tpl",TRUE, dirname(__FILE__))); + + $ret = array(); + $ret['status'] = ""; + $ret['string'] = $str; + return($ret); + } + + function saveCopyDialog() + { + if(!$this->is_account) return; + + /* Execute to save mailAlternateAddress && gosaMailForwardingAddress */ + $this->execute(); + + if(isset($_POST['mail'])){ + $this->mail = $_POST['mail']; + } + } + + + function PrepareForCopyPaste($source) + { + plugin::PrepareForCopyPaste($source); + + /* Reset alternate mail addresses */ + $this->gosaMailAlternateAddress = array(); + } + + + function allow_remove() + { + if (isset($this->config->current['MAILMETHOD'])){ + $method= $this->config->current['MAILMETHOD']; + if(preg_match("/olab/i",$method)){ + $ldap = $this->config->get_ldap_link(); + $ldap->cd($this->config->current['BASE']); + $ldap->cat($this->dn); + if($ldap->count()){ + $attrs = $ldap->fetch(); + if(isset($attrs['kolabDeleteFlag'])){ + return(_("Waiting for kolab to remove mail properties.")); + }elseif(in_array("gosaMailAccount",$attrs['objectClass'])){ + return(_("Please remove the mail account first, to allow kolab to call its remove methods.")); + } + } + } + } + } + + /* Upated shared folder ACLs + */ + function updateSharedFolder() + { + $ldap = $this->config->get_ldap_link(); + $ldap->cd($this->config->current['BASE']); + $ldap->search("(&(objectClass=posixGroup)(objectClass=gosaMailAccount)(memberUid=".$this->uid."))",array('dn','cn')); + if(class_exists("grouptabs")){ + while($attrs = $ldap->fetch()){ + $tmp = new grouptabs($this->config, $this->config->data['TABS']['GROUPTABS'], $attrs['dn']); + if(isset($tmp->by_object['mailgroup'])){ + $tmp->by_object['mailgroup']->members= $tmp->by_object['group']->memberUid; + if(!$this->is_account){ + $tmp->by_object['mailgroup']->removeUserAcl($this->uid); + $tmp->by_object['mailgroup']->removeUserAcl($this->mail); + } + $tmp->by_object['mailgroup']->save(); + } + } + } + } } // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: