diff --git a/plugins/personal/mail/class_mailAccount.inc b/plugins/personal/mail/class_mailAccount.inc
index 9f89c679eecc42c7b508a82d521164c537fa154c..80f9ba64bea1bbf2f1d196d1bcecb9788627d22f 100644 (file)
*/
/* Load sieve support */
-require_once ("class_sieve.inc");
+require_once ("sieve/libsieve.inc");
/* Load mail methods */
global $BASE_DIR;
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");
-
/* plugin specific values */
var $mail = "";
var $uid = "";
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();
+ var $mailboxList = array("INBOX");
var $default_permissions = "none";
var $member_permissions = "post";
var $members = array();
/* attribute list for save action */
var $attributes= array("mail", "gosaMailServer", "gosaMailQuota", "gosaMailMaxSize","gosaMailForwardingAddress",
"gosaMailDeliveryMode", "gosaSpamSortLevel", "gosaSpamMailbox","gosaMailAlternateAddress",
- "gosaVacationMessage", "gosaMailAlternateAddress", "gosaMailForwardingAddress");
+ "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 */
}
}
-
/* 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.";
}
-
-
+
/* This is not a new account, parse additional attributes */
if (($dn != NULL) && ($dn != "new") && $this->is_account){
}
}
+ /* 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 */
$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 ($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'.");
}
}
}
/* 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 */
}
/* Display mail account tab */
+ if($this->gosaVacationStart ==0){
+ $date= getdate(time());
+ $this->gosaVacationStart = time();
+ }else{
+ $date= getdate($this->gosaVacationStart);
+ }
+ $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("mailServers", $mailserver);
- foreach(array("gosaMailServer", "gosaMailQuota", "perms", "mail",
- "gosaMailAlternateAddress", "gosaMailForwardingAddress",
- "gosaVacationMessage", "gosaMailDeliveryMode",
- "gosaMailMaxSize", "gosaSpamSortLevel", "gosaSpamMailbox") as $val){
-
- $smarty->assign("$val", $this->$val);
+ 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", progressbar(round(($this->quotaUsage * 100)/ $this->gosaMailQuota),100,15,true));
$smarty->assign("quotadefined", "true");
}
}
}
+ if(isset($this->parent->by_object['connectivity']->plugin['kolabAccount'])){
+ if($this->parent->by_object['connectivity']->plugin['kolabAccount']->is_account){
+ return(true);
+ }
+ }
return(false);
}
}
}
+ /* 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", array('uid'=> $this->uid));
}
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;
}
}
}
$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);
$this->cleanup();
/* 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->gosaSpamMailbox,
$this->gosaSpamSortLevel,
$this->gosaVacationMessage);
+ $this->is_modified = TRUE;
+ }else{
+ $this->sieve_management->save();
}
}
}
$this->handle_post_events("add", array('uid'=>$this->uid));
}
+ $this->updateSharedFolder();
}
}
}
$ldap->cd($this->config->current['BASE']);
- $ldap->search ("(&(!(objectClass=gosaUserTemplate))(objectClass=gosaMailAccount)(|(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.");
}
$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);
}
{
$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 ();
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("/kolab/i",$method)){
+ if(preg_match("/olab/i",$method)){
$ldap = $this->config->get_ldap_link();
$ldap->cd($this->config->current['BASE']);
$ldap->cat($this->dn);
}
}
}
+
+ /* 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: