X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=plugins%2Fpersonal%2Fmail%2Fclass_mailAccount.inc;h=ccab73185e972f58ea1e8578f7490a88566d2e23;hb=077239ddf12d4489618151c7a131f1e6bd0c854c;hp=6f5fc7e1c557c10e917b9be5ea6c642da5f1297e;hpb=88d5ebc89f43839178ab4badc7f050f1c2d54ad7;p=gosa.git diff --git a/plugins/personal/mail/class_mailAccount.inc b/plugins/personal/mail/class_mailAccount.inc index 6f5fc7e1c..ccab73185 100644 --- a/plugins/personal/mail/class_mailAccount.inc +++ b/plugins/personal/mail/class_mailAccount.inc @@ -19,44 +19,47 @@ get_dir_list("$BASE_DIR/include"); class mailAccount extends plugin { /* Definitions */ - var $plHeadline= "Mail"; - var $plDescription= "This does something"; - var $method= "mailMethod"; + 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 $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"); /* 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 $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" ); /* 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"); var $objectclasses= array("gosaMailAccount"); @@ -64,13 +67,21 @@ class mailAccount extends plugin 'dn' from LDAP */ function mailAccount ($config, $dn= NULL) { - /* Configuration is fine, allways */ - $this->config= $config; - /* Load bases attributes */ plugin::plugin($config, $dn); - /* Set mailMethod to the one defined in gosa.conf */ + 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 */ if (isset($this->config->current['MAILMETHOD'])){ $method= $this->config->current['MAILMETHOD']; if (class_exists("mailMethod$method")){ @@ -80,7 +91,9 @@ 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/"; @@ -88,10 +101,13 @@ class mailAccount extends plugin $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,22 +115,52 @@ 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); } } @@ -136,6 +182,9 @@ class mailAccount extends plugin } } + + /* Create filter */ + /* Get global filter config */ if (!is_global("mailfilter")){ $ui= get_userinfo(); @@ -145,9 +194,6 @@ class mailAccount extends plugin "regex" => "*"); register_global("mailfilter", $mailfilter); } - - /* Save initial account state */ - $this->initially_was_account= $this->is_account; } @@ -174,26 +220,28 @@ 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; } + /* Handle account state */ + /* Do we need to flip is_account state? */ if (isset($_POST['modify_state'])){ $this->is_account= !$this->is_account; } - /* Show main page */ - $mailserver= array(); - foreach ($this->config->data['SERVERS']['IMAP'] as $key => $val){ - $mailserver[]= $key; - } - /* Do we represent a valid account? */ if (!$this->is_account && $this->parent == NULL){ $display= "\"\" ". @@ -214,6 +262,9 @@ class mailAccount extends plugin } } + + /* Forwarder subdialog */ + /* Trigger forward add dialog? */ if (isset($_POST['add_local_forwarder'])){ $this->forward_dialog= TRUE; @@ -289,6 +340,9 @@ class mailAccount extends plugin } } + + /* Alternate address handling */ + /* Add alternate email addresses */ if (isset($_POST['add_alternate'])){ if ($_POST['alternate_address'] != "" && @@ -328,6 +382,9 @@ class mailAccount extends plugin } } + + /* Vacation message */ + /* Import vacation message? */ if (isset($_POST["import_vacation"]) && isset($this->vacation[$_POST["vacation_template"]])){ $contents= ""; @@ -349,6 +406,9 @@ class mailAccount extends plugin $this->gosaVacationMessage= htmlspecialchars($contents); } + + /* Display forward dialog if requested above */ + /* Show forward add dialog */ if ($this->forward_dialog){ $ldap= $this->config->get_ldap_link(); @@ -392,7 +452,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); @@ -410,6 +471,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')); @@ -430,6 +492,8 @@ class mailAccount extends plugin return ($display); } + /* Display mail account tab */ + $smarty->assign("mailServers", $mailserver); foreach(array("gosaMailServer", "gosaMailQuota", "perms", "mail", "gosaMailAlternateAddress", "gosaMailForwardingAddress", @@ -441,7 +505,7 @@ class mailAccount extends plugin } if (is_numeric($this->gosaMailQuota) && $this->gosaMailQuota != 0){ - $smarty->assign("quotausage", progressbar(($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"); @@ -453,12 +517,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 { @@ -534,18 +615,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! */ - #fixme: || kolab || is differs here, you can't delete all attrs specified in this plugin .... - #fixme: there are some attributes we have to keep, i think. - 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(), sprintf(_("Removing of user/mail account with dn '%s' failed."),$this->dn)); /* Connect to IMAP server for account deletion */ if ($this->gosaMailServer != ""){ @@ -630,17 +705,33 @@ 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']); + /* 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(), sprintf(_("Saving of user/mail account with dn '%s' failed."),$this->dn)); /* 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(); @@ -661,7 +752,7 @@ 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"); } } else { $this->handle_post_events("add"); @@ -669,12 +760,16 @@ class mailAccount extends plugin } + /* 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."); @@ -694,8 +789,7 @@ class mailAccount extends plugin } } $ldap->cd($this->config->current['BASE']); - $ldap->search ("(&(!(objectClass=gosaUserTemplate))(|(mail=".$this->mail.")(gosaMailAlternateAddress=". - $this->mail."))(!(uid=".$this->uid."))(!(cn=".$this->uid.")))", array("uid")); + $ldap->search ("(&(!(objectClass=gosaUserTemplate))(objectClass=gosaMailAccount)(|(mail=".$this->mail.")(gosaMailAlternateAddress=".$this->mail."))(!(uid=".$this->uid."))(!(cn=".$this->uid.")))", array("uid")); if ($ldap->count() != 0){ $message[]= _("The primary address you've entered is already in use."); } @@ -725,9 +819,14 @@ 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."); + } + return ($message); } + /* Adapt from template, using 'dn' */ function adapt_from_template($dn) { @@ -750,17 +849,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) { @@ -769,17 +869,16 @@ 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=gosaMailAccount)(|(mail=$address)"."(gosaMailAlternateAddress=$address)))", array("uid")); if ($ldap->count() > 0){ $attrs= $ldap->fetch (); @@ -794,7 +893,6 @@ class mailAccount extends plugin sort ($this->gosaMailAlternateAddress); reset ($this->gosaMailAlternateAddress); - return (""); } @@ -826,6 +924,82 @@ 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 allow_remove() + { + if (isset($this->config->current['MAILMETHOD'])){ + $method= $this->config->current['MAILMETHOD']; + if(preg_match("/kolab/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.")); + } + } + } + } + } + + + function plInfo() + { + return (array("plDescription" => _("Mail settings"), + "plSelfModify" => TRUE, + "plDepends" => array("objectClass" => "gosaAccount"), + + "mail" => _("Mail address"), + "gosaMailServer" => _("Mail server"), + "gosaMailQuota" => _("Quota size"), + "gosaMailMaxSize" => _("Mail max size"), + "gosaMailForwardingAddress" => _("Forwarding address"), + "gosaMailDeliveryMode_L" => "FIXME"._("Local delivery"), // This is flag of gosaMailDeliveryMode + "gosaMailDeliveryMode_R" => "FIXME"._("Reject due to mailsize"), // This is flag of gosaMailDeliveryMode + "gosaMailDeliveryMode_s" => "FIXME"._("Use spam filter"), // This is flag of gosaMailDeliveryMode + "gosaMailDeliveryMode_V" => "FIXME"._("Add vacation information"), // This is flag of gosaMailDeliveryMode + "gosaMailDeliveryMode_C" => "FIXME"._("Use custom sieve script"), // This is flag of gosaMailDeliveryMode + "gosaMailDeliveryMode_I" => "FIXME"._("Only insider delivery"), // This is flag of gosaMailDeliveryMode + "gosaSpamSortLevel" => _("Spam level"), + "gosaSpamMailbox" => _("Spam mail box"), + "gosaMailAlternateAddress" => _("Mail alternative addresses"), + + "gosaVacationMessage" => _("Vacation message"), + "gosaMailForwardingAddress" => _("Forwarding address"))); + + } } // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: