X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=include%2Fsieve%2Fclass_sieveManagement.inc;h=be2ef4ed93186acec0ffbf64bfe82fc5a4de5d48;hb=4ef5a0ec2c799536446dd29d5d828488cc14608f;hp=94b8a1116a3667a421f0d85af585fe721261282f;hpb=0b683e2fb15696d0effcdf5fd021e0962b2caa68;p=gosa.git diff --git a/include/sieve/class_sieveManagement.inc b/include/sieve/class_sieveManagement.inc index 94b8a1116..be2ef4ed9 100644 --- a/include/sieve/class_sieveManagement.inc +++ b/include/sieve/class_sieveManagement.inc @@ -64,7 +64,7 @@ class sieveManagement extends plugin plugin::plugin($config,$dn); /* Get sieve */ - if(!$sieve = $this->get_sieve()){ + if(!$this->sieve_handle = $this->get_sieve()){ print_red( sprintf( _("Can't log into SIEVE server. Server says '%s'."), @@ -74,9 +74,9 @@ class sieveManagement extends plugin /* Get all sieve scripts names */ - if($sieve->sieve_listscripts()){ - if (is_array($sieve->response)){ - foreach($sieve->response as $key => $name){ + if($this->sieve_handle->sieve_listscripts()){ + if (is_array($this->sieve_handle->response)){ + foreach($this->sieve_handle->response as $key => $name){ $data = array(); $data['NAME'] = $name; @@ -93,11 +93,11 @@ class sieveManagement extends plugin /* Get script contents */ foreach($this->scripts as $key => $script){ - $p = new My_Parser; - $sieve->sieve_getscript($script['NAME']); + $p = new My_Parser($this); + $this->sieve_handle->sieve_getscript($script['NAME']); $script = ""; - foreach($sieve->response as $line){ + foreach($this->sieve_handle->response as $line){ $script.=$line; } @@ -118,7 +118,7 @@ class sieveManagement extends plugin $this->scripts[$key]['PARSER'] = $p; $this->scripts[$key]['EDITED'] = FALSE; } - $this->sieve_handle = $sieve; + $this->sieve_handle = $this->sieve_handle; } @@ -127,24 +127,31 @@ class sieveManagement extends plugin */ function get_sieve() { + /* Connect to sieve class and try to get all available sieve scripts */ - $cfg= $this->config->data['SERVERS']['IMAP'][$this->parent->gosaMailServer]; - $this->Sieve_Error = ""; - - /* Log into the mail server */ - $sieve= new sieve( - $cfg["sieve_server"], - $cfg["sieve_port"], - $this->parent->uid, - $cfg["password"], - $cfg["admin"]); - - /* Try to login */ - if (!$sieve->sieve_login()){ - $this->Sieve_Error = $sieve->error_raw; + if(isset($this->config->data['SERVERS']['IMAP'][$this->parent->gosaMailServer])){ + $cfg= $this->config->data['SERVERS']['IMAP'][$this->parent->gosaMailServer]; + $this->Sieve_Error = ""; + + /* Log into the mail server */ + $this->sieve_handle= new sieve( + $cfg["sieve_server"], + $cfg["sieve_port"], + $this->parent->uid, + $cfg["password"], + $cfg["admin"]); + + /* Try to login */ + if (!$this->sieve_handle->sieve_login()){ + $this->Sieve_Error = $this->sieve_handle->error_raw; + return(FALSE); + } + return($this->sieve_handle); + }else{ + $this->Sieve_Error = sprintf(_("The specified mail server '%s' does not exist within the GOsa configuration."), + $this->parent->gosaMailServer); return(FALSE); } - return($sieve); } @@ -196,6 +203,11 @@ class sieveManagement extends plugin if(preg_match("/[^a-z]/i",$name)){ $err = _("Only a-z are allowed in script names."); } + + $tmp = $this->get_used_script_names(); + if(in_array_ics($name,$tmp)){ + $err =_("The specified name is already in use."); + } } /* Create script if everything is ok */ @@ -209,7 +221,7 @@ class sieveManagement extends plugin "stop;"; /* Create a new parser and initialize default values */ - $p = new My_Parser; + $p = new My_Parser($this); $ret = $p->parse($script); $sc['SCRIPT'] = $script; $sc['ORIG_SCRIPT'] = $script; @@ -217,11 +229,11 @@ class sieveManagement extends plugin $sc['MSG'] = ""; if(!$ret){ $sc['STATUS'] = FALSE; - $sc['MODE'] = "Source-Only"; + $sc['MODE'] = "Source"; $sc['MSG'] = _("Parse failed")."".$p->status_text.""; }else{ $sc['STATUS'] = TRUE; - $sc['MODE'] = "Strucktured"; + $sc['MODE'] = "Structured"; $sc['MSG'] = _("Parse successful"); } $sc['PARSER'] = $p; @@ -257,42 +269,46 @@ class sieveManagement extends plugin $this->current_script = $script; $this->current_handler = $this->scripts[$script]['PARSER']; + $this->scripts[$script]['SCRIPT_BACKUP'] = $this->scripts[$script]['SCRIPT']; } /* remove script requested */ - if(preg_match("/^delscript_/",$name) && $once && !$this->current_handler){ + if($this->parent->acl_is_writeable("sieveManagement") && preg_match("/^delscript_/",$name) && $once && !$this->current_handler){ $script = preg_replace("/^delscript_/","",$name); $script = preg_replace("/_(x|y)/","",$script); $once = FALSE; - $this->script_to_delete = $script; } /* Activate script */ - if(preg_match("/^active_script_/",$name) && $once && !$this->current_handler){ + if($this->parent->acl_is_writeable("sieveManagement") && preg_match("/^active_script_/",$name) && $once && !$this->current_handler){ $script = preg_replace("/^active_script_/","",$name); $script = preg_replace("/_(x|y)/","",$script); $once = FALSE; - /* Get sieve */ - if(!$sieve = $this->get_sieve()){ - print_red( - sprintf( - _("Can't log into SIEVE server. Server says '%s'."), - to_string($this->Sieve_Error))); - } + /* We can only activate existing scripts */ + if(!$this->scripts[$script]['IS_NEW']){ - /* Try to activate the given script and update - * class script array. - */ - if(!$sieve->sieve_setactivescript($this->scripts[$script]['NAME'])){ - print_red(sprintf(_("Can't activate sieve script on server. Server says '%s'."),to_string($sieve->error_raw))); - }else{ - foreach($this->scripts as $key => $data){ - if($key == $script){ - $this->scripts[$key]['ACTIVE'] = TRUE; - }else{ - $this->scripts[$key]['ACTIVE'] = FALSE; + /* Get sieve */ + if(!$this->sieve_handle = $this->get_sieve()){ + print_red( + sprintf( + _("Can't log into SIEVE server. Server says '%s'."), + to_string($this->Sieve_Error))); + } + + /* Try to activate the given script and update + * class script array. + */ + if(!$this->sieve_handle->sieve_setactivescript($this->scripts[$script]['NAME'])){ + print_red(sprintf(_("Can't activate sieve script on server. Server says '%s'."),to_string($this->sieve_handle->error_raw))); + }else{ + foreach($this->scripts as $key => $data){ + if($key == $script){ + $this->scripts[$key]['ACTIVE'] = TRUE; + }else{ + $this->scripts[$key]['ACTIVE'] = FALSE; + } } } } @@ -310,7 +326,7 @@ class sieveManagement extends plugin } /* Remove confirmed */ - if(isset($_POST['delete_script_confirm'])){ + if($this->parent->acl_is_writeable("sieveManagement") && isset($_POST['delete_script_confirm'])){ $script = $this->scripts[$this->script_to_delete]; @@ -320,15 +336,15 @@ class sieveManagement extends plugin }else{ /* Get sieve */ - if(!$sieve = $this->get_sieve()){ + if(!$this->sieve_handle = $this->get_sieve()){ print_red( sprintf( _("Can't log into SIEVE server. Server says '%s'."), to_string($this->Sieve_Error))); } - if(!$sieve->sieve_deletescript($this->scripts[$this->script_to_delete]['NAME'])){ - print_red(sprintf(_("Can't remove sieve script from server. Server says '%s'."),to_string($sieve->error_raw))); + if(!$this->sieve_handle->sieve_deletescript($this->scripts[$this->script_to_delete]['NAME'])){ + print_red(sprintf(_("Can't remove sieve script from server. Server says '%s'."),to_string($this->sieve_handle->error_raw))); }else{ unset($this->scripts[$this->script_to_delete]); } @@ -352,16 +368,19 @@ class sieveManagement extends plugin /* Abort saving */ if(isset($_POST['cancel_sieve_changes'])){ + $tmp = $this->scripts[$this->current_script]['SCRIPT_BACKUP']; + $this->scripts[$this->current_script]['SCRIPT'] = $tmp; + $this->scripts[$this->current_script]['PARSER']->parse($tmp); $this->current_handler = NULL; } /* Save currently edited sieve script. */ - if(isset($_POST['save_sieve_changes'])){ + if($this->parent->acl_is_writeable("sieveManagement") && isset($_POST['save_sieve_changes'])){ $chk = $this->current_handler->check(); if(!count($chk)){ $sc = $this->scripts[$this->current_script]['SCRIPT']; - $p = new My_Parser; + $p = new My_Parser($this); if($p -> parse($sc)){ if($this->scripts[$this->current_script]['MODE'] == "Source-Only"){ @@ -420,6 +439,7 @@ class sieveManagement extends plugin }else{ $this->scripts[$this->current_script]['MODE'] = "Structured"; } + $this->Script_Error = ""; $this->Import_Script = FALSE; } } @@ -489,98 +509,10 @@ class sieveManagement extends plugin * the selected position */ if(isset($_POST['select_new_element_type'])){ - - $this->add_new_id; - $data = $this->current_handler->tree_->pap; - - /* Get index of the element identified by object_id == $this->add_new_id; */ - $index = -1; - foreach($data as $key => $obj){ - if($obj->object_id == $this->add_new_id && $index==-1){ - $index = $key; - } - } - - /* We have found the specified object_id - * and want to detect the next free position - * to insert the new element. - */ - if($index != -1){ - if($this->add_above_below == "above"){ - $direction ="up"; - $next_free = $this->current_handler->tree_->_get_next_free_move_slot($index,$direction); - $next_free ++; - }else{ - $direction = "down"; - $next_free = $this->current_handler->tree_->_get_next_free_move_slot($index,$direction); - } - $this->add_new_id = $this->current_handler->tree_->pap[$next_free]->object_id; - } - - /* Create elements we should add */ - if($this->add_element_type == "sieve_if"){ - $ele[] = new $this->add_element_type(NULL, preg_replace("/[^0-9]/","",microtime())); - $ele[] = new sieve_block_start(NULL,preg_replace("/[^0-9]/","",microtime())); - $ele[] = new sieve_block_end(NULL,preg_replace("/[^0-9]/","",microtime())); - }elseif($this->add_element_type == "sieve_else"){ - $ele[] = new sieve_block_end(NULL,preg_replace("/[^0-9]/","",microtime())); - $ele[] = new $this->add_element_type(NULL, preg_replace("/[^0-9]/","",microtime())); - $ele[] = new sieve_block_start(NULL,preg_replace("/[^0-9]/","",microtime())); - }elseif($this->add_element_type == "sieve_elsif"){ - $ele[] = new sieve_block_end(NULL,preg_replace("/[^0-9]/","",microtime())); - $ele[] = new $this->add_element_type(NULL, preg_replace("/[^0-9]/","",microtime())); - $ele[] = new sieve_block_start(NULL,preg_replace("/[^0-9]/","",microtime())); - }else{ - $ele[] = new $this->add_element_type(NULL, preg_replace("/[^0-9]/","",microtime())); - } - - $start = $end = array(); - $found = false; - - /* Add above current element*/ - if($this->add_above_below == "above"){ - foreach($data as $key => $obj){ - if($obj->object_id == $this->add_new_id){ - $found = true; - } - if(!$found){ - $start[] = $obj; - }else{ - $end[] = $obj; - } - } - }else{ - /* Add below current element */ - foreach($data as $key => $obj){ - if(!$found){ - $start[] = $obj; - }else{ - $end[] = $obj; - } - if($obj->object_id == $this->add_new_id){ - $found = true; - } - } - } - - - /* Only add, if current element could be located */ - if($found){ - $new = array(); - foreach($start as $obj){ - $new[] = $obj; - } - foreach($ele as $el){ - $new[] = $el; - } - foreach($end as $obj){ - $new[] = $obj; - } - $data= $new; - $this->current_handler->tree_->pap = $data; + if($this->add_new_element_to_current_script($this->add_element_type,$this->add_new_id,$this->add_above_below)){ $this->add_new_element = FALSE; }else{ - print_red(_("Something went wrong while adding a new entry.")); + print_red(_("Failed to add new element.")); } } } @@ -590,17 +522,46 @@ class sieveManagement extends plugin $smarty = get_smarty(); $add_else_elsif = FALSE; - foreach($this->current_handler->tree_->pap as $obj){ - if($obj->object_id == $this->add_new_id && in_array(get_class($obj),array("sieve_if","sieve_elsif"))){ - $add_else_elsif = TRUE; + + /* Check if we should add else/elsif to the select box + * or not. We can't add else twice!. + */ + if($this->add_above_below == "below"){ + + /* Get posistion of the current element + */ + foreach($this->current_handler->tree_->pap as $key => $obj){ + + if($obj->object_id == $this->add_new_id && in_array(get_class($obj),array("sieve_if","sieve_elsif"))){ + + /* Get block start/end */ + $end_id = $this->current_handler->tree_->get_block_end($key); + $else_found = FALSE; + $elsif_found = FALSE; + + /* Check if there is already an else in this block + */ + for($i = $key ; $i < $end_id ; $i ++){ + if(get_class($this->current_handler->tree_->pap[$i]) == "sieve_else"){ + $else_found = TRUE; + } + if(get_class($this->current_handler->tree_->pap[$i]) == "sieve_elsif"){ + $elsif_found = TRUE; + } + } + + /* Only allow adding 'else' if there is currently + * no 'else' statement. And don't allow adding + * 'else' before 'elseif' + */ + if(!$else_found && (!(get_class($obj) == "sieve_if" && $elsif_found))){ + $element_types['sieve_else'] = _("Else"); + } + $element_types['sieve_elsif'] = _("Else if"); + } } } - if($add_else_elsif && $this->add_above_below == "below"){ - $element_types['sieve_else'] = _("Else"); - $element_types['sieve_elsif'] = _("Else if"); - } - $smarty->assign("element_types",$element_types ); $smarty->assign("element_type",$this->add_element_type); $str = $smarty->fetch(get_template_path("templates/add_element.tpl",TRUE,dirname(__FILE__))); @@ -681,15 +642,19 @@ class sieveManagement extends plugin "attach" => "style='width:30px;'"); } - if($active){ - $field6 = array("string" => " ". - "". - ""); + if($this->parent->acl_is_writeable("sieveManagement")){ + $del = ""; + }else{ + $del = " "; + } + + if($active || $script['IS_NEW'] || !$this->parent->acl_is_writeable("sieveManagement")){ + $activate = " "; }else{ - $field6 = array("string" => "". - "". - ""); + $activate = ""; } + + $field6 = array("string" => $activate."".$del); $List ->AddEntry(array($field1,$field2,$field3,$field4,$field5,$field6)); } @@ -706,10 +671,164 @@ class sieveManagement extends plugin return($display);; } + + /* Add a new element to the currently opened script editor. + * The insert position is specified by + */ + function add_new_element_to_current_script($type,$id,$position) + { + /* Test given data */ + if(!in_array_ics($position,array("above","below"))){ + trigger_error("Can't add new element with \$position=".$position.". Only 'above','below' are allowed here."); + return(FALSE); + } + if(!is_numeric($id)){ + trigger_error("Can't add new element, given id is not numeric."); + return(FALSE); + } + $tmp = get_declared_classes(); + if(!in_array($type,$tmp)){ + trigger_error("Can't add new element, given \$class=".$class." does not exists."); + return(FALSE); + } + if(!is_object($this->current_handler) || get_class($this->current_handler) != "My_Parser"){ + trigger_error("Can't add new element, there is no valid script editor opened."); + return(FALSE); + } + + /* Create elements we should add + * -Some element require also surrounding block elements + */ + $parent = $this->current_handler->tree_; + if($this->add_element_type == "sieve_if"){ + $ele[] = new $this->add_element_type(NULL, preg_replace("/[^0-9]/","",microtime()),$parent); + $ele[] = new sieve_block_start(NULL,preg_replace("/[^0-9]/","",microtime()),$parent); + $ele[] = new sieve_block_end(NULL,preg_replace("/[^0-9]/","",microtime()),$parent); + }elseif($this->add_element_type == "sieve_else"){ + $ele[] = new sieve_block_end(NULL,preg_replace("/[^0-9]/","",microtime()),$parent); + $ele[] = new $this->add_element_type(NULL, preg_replace("/[^0-9]/","",microtime()),$parent); + $ele[] = new sieve_block_start(NULL,preg_replace("/[^0-9]/","",microtime()),$parent); + }elseif($this->add_element_type == "sieve_elsif"){ + $ele[] = new sieve_block_end(NULL,preg_replace("/[^0-9]/","",microtime()),$parent); + $ele[] = new $this->add_element_type(NULL, preg_replace("/[^0-9]/","",microtime()),$parent); + $ele[] = new sieve_block_start(NULL,preg_replace("/[^0-9]/","",microtime()),$parent); + }else{ + $ele[] = new $this->add_element_type(NULL, preg_replace("/[^0-9]/","",microtime()),$parent); + } + + /* Get index of the element identified by object_id == $id; + */ + $index = -1; + $data = $this->current_handler->tree_->pap; + foreach($data as $key => $obj){ + if($obj->object_id == $id && $index==-1){ + $index = $key; + } + } + + /* Tell to user that we couldn't find the given object + * so we can't add an element. + */ + if($index == -1 ){ + trigger_error("Can't add new element, specified \$id=".$id." could not be found in object tree."); + return(FALSE); + } + + /* We have found the specified object_id + * and want to detect the next free position + * to insert the new element. + */ + if($position == "above"){ + $direction ="up"; + $next_free = $this->current_handler->tree_->_get_next_free_move_slot($index,$direction,TRUE); + }else{ + $direction = "down"; + $next_free = $this->current_handler->tree_->_get_next_free_move_slot($index,$direction,TRUE); + } + /* This is extremly necessary, cause some objects + * updates the tree objects ... Somehow i should change this ... + */ + $data = $this->current_handler->tree_->pap; + $start = $end = array(); + + if($position == "above"){ + $start = array_slice($data,0,$next_free); + $end = array_slice($data,$next_free); + }else{ + $start = array_slice($data,0,$next_free+1); + $end = array_slice($data,$next_free+1); + } + + $new = array(); + foreach($start as $obj){ + $new[] = $obj; + } + foreach($ele as $el){ + $new[] = $el; + } + foreach($end as $obj){ + $new[] = $obj; + } + $data= $new; + $this->current_handler->tree_->pap = $data; + return(TRUE); + } + + + function save_object() { if($this->current_handler){ + if(isset($_GET['Add_Object_Top_ID'])){ + $this->add_new_element = TRUE; + $this->add_new_id = $_GET['Add_Object_Top_ID']; + $this->add_above_below = "above"; + } + + if(isset($_GET['Add_Object_Bottom_ID'])){ + $this->add_new_element = TRUE; + $this->add_new_id = $_GET['Add_Object_Bottom_ID']; + $this->add_above_below = "below"; + } + + if(isset($_GET['Remove_Object_ID'])){ + $found_id = -1; + foreach($this->current_handler->tree_->pap as $key => $element){ + if($element->object_id == $_GET['Remove_Object_ID']){ + $found_id = $key; + } + } + if($found_id != -1 ){ + $this->current_handler->tree_->remove_object($found_id); + } + } + + if(isset($_GET['Move_Up_Object_ID'])){ + $found_id = -1; + foreach($this->current_handler->tree_->pap as $key => $element){ + if($element->object_id == $_GET['Move_Up_Object_ID']){ + $found_id = $key; + } + } + if($found_id != -1 ){ + $this->current_handler->tree_->move_up_down($found_id,"up"); + } + } + + if(isset($_GET['Move_Down_Object_ID'])){ + $found_id = -1; + foreach($this->current_handler->tree_->pap as $key => $element){ + if($element->object_id == $_GET['Move_Down_Object_ID']){ + $found_id = $key; + } + } + if($found_id != -1 ){ + $this->current_handler->tree_->move_up_down($found_id,"down"); + } + } + + /* Check if there is an add object requested */ $data = $this->current_handler->tree_->pap; @@ -755,7 +874,7 @@ class sieveManagement extends plugin if(isset($_POST['script_contents'])){ $sc = stripslashes($_POST['script_contents']); $this->scripts[$this->current_script]['SCRIPT'] = $sc; - $p = new My_Parser; + $p = new My_Parser($this); if($p -> parse($sc)){ $this->Script_Error = ""; } else { @@ -767,7 +886,7 @@ class sieveManagement extends plugin if(in_array($Mode,array("Structured"))){ $sc = $this->current_handler->get_sieve_script(); $this->scripts[$this->current_script]['SCRIPT'] = $sc; - $p = new My_Parser; + $p = new My_Parser($this); if($p -> parse($sc)){ $this->Script_Error = ""; } else { @@ -789,7 +908,7 @@ class sieveManagement extends plugin if($old_mode != $new_mode){ $sc = $this->scripts[$this->current_script]['SCRIPT']; - $p = new My_Parser; + $p = new My_Parser($this); if($p -> parse($sc)){ $this->current_handler->parse($sc); @@ -803,11 +922,22 @@ class sieveManagement extends plugin } } + + function get_used_script_names() + { + $ret = array(); + foreach($this->scripts as $script){ + $ret[] = $script['NAME']; + } + return($ret); + } + + function save() { /* Get sieve */ - if(!$sieve = $this->get_sieve()){ + if(!$this->sieve_handle = $this->get_sieve()){ print_red( sprintf( _("Can't log into SIEVE server. Server says '%s'."), @@ -819,13 +949,13 @@ class sieveManagement extends plugin foreach($this->scripts as $key => $script){ if($script['EDITED']){ $data = $this->scripts[$key]['SCRIPT']; - if(!$sieve->sieve_sendscript($script['NAME'], $data)){ - gosa_log("Failed to save sieve script named '".$script['NAME']."': ".to_string($sieve->error_raw)); + if(!$this->sieve_handle->sieve_sendscript($script['NAME'], addcslashes ($data,"\\"))){ + gosa_log("Failed to save sieve script named '".$script['NAME']."': ".to_string($this->sieve_handle->error_raw)); $everything_went_fine = FALSE; - print_red(to_string($sieve->error_raw)); + print_red(to_string($this->sieve_handle->error_raw)); $this->scripts[$key]['MSG'] = "". _("Failed to save sieve script").": ". - to_string($sieve->error_raw). + to_string($this->sieve_handle->error_raw). ""; } }