Code

Added new function get_sieve
[gosa.git] / include / sieve / class_sieveElement_If.inc
index c35c91a860e9a5abf99734b25649415bf9c989db..1e4f6829f73e71e83093dbf245f9333e9b3b63d6 100644 (file)
@@ -49,8 +49,10 @@ class sieve_if
         "ne"  => _("not equal"));
 
     $this->object_id       = $object_id;
-    $this->elements = $elements;
-    $this->_parsed  = $this->_parse($elements['ELEMENTS'],1);
+    if($elements!=NULL){
+      $this->elements = $elements;
+      $this->_parsed  = $this->_parse($elements['ELEMENTS'],1);
+    }
   }
 
 
@@ -64,6 +66,74 @@ class sieve_if
   } 
 
 
+  /* Return error msgs */
+  function check()
+  {
+    $check = $this->check_recursive();
+    return($check);
+  }
+
+  /* Recursivly fetch all error msgs */
+  function check_recursive($parsed = NULL,$id = 1,$obj_id=1)
+  {
+    $ret = array();
+    if($parsed == NULL){
+      $parsed = $this->_parsed;
+    }
+
+    /* Walk through all elements */
+    foreach($parsed as $key => $data){
+
+      /* Create elements */
+      switch($key)
+      {
+        /*******************
+         * Allof / Anyof
+         *******************/
+        case "anyof" :
+        case "allof" :
+        { 
+          foreach($data as $key2 => $dat){
+            if(($key2 === "Inverse") && ($key2 == "Inverse")){
+              continue;
+            }
+            $msgs = $this->check_recursive($dat, ($id +1),$key2);
+
+            foreach($msgs as $msg){
+              $ret[] = $msg;
+            }
+          }
+          break;
+        }
+
+        /*******************
+         * True / False
+         *******************/
+
+        case "true" :
+        case "fasle" : 
+        {
+          /* Can't fail anyway */
+          break;
+        }
+    
+        /*******************
+         * Default
+         *******************/
+
+        default: 
+        {
+          if(isset($data['LastError']) && !empty($data['LastError'])){
+            $ret[] = $data['LastError'];
+          }
+        }
+      }
+    }
+    return($ret);
+  }
+
   /* Recursivly create a sieve script out of the given 
    *  tags and tokens provided by $parsed.
    *  $id       specifies the depth of the current element.
@@ -76,6 +146,11 @@ class sieve_if
       $parsed = $this->_parsed;
     }
 
+
+    if(!is_array($parsed)){
+      return;
+    }
+
     /* Walk through all elements */
     foreach($parsed as $key => $data){
 
@@ -101,9 +176,7 @@ class sieve_if
           if($Inverse){
             $script .= "not ";
           }
           $script .= $key;
-   
           break;
         }
 
@@ -331,12 +404,83 @@ class sieve_if
     return($script);
   }
 
+  
+  function add_test($data,$type)
+  {
+    switch($type)
+    {
+      case "header" : 
+      case "address" : 
+      case "envelope" : 
+      {
+        /* Add to Tree */
+        $values = array(        "Inverse"         => FALSE,
+                                "Comparator"      => "",
+                                "Expert"          => FALSE,
+                                "LastError"       => "",
+                                "Match_type"      => ":contains",
+                                "Match_type_value"=> "",
+                                "Key_List"        => array(_("emtpy")),
+                                "Value_List"      => array(_("empty"))) ;
+        if($type == "address"){
+          $values["Address_Part"]    = ":all";
+        }
+        $data[$type]=$values;
+        break;
+      }
+      case "allof" :
+      case "anyof" :
+      {
+        $data[$type] = array("Inverse" => FALSE);
+        break;
+      }
+      case "size" :
+      {
+        $tmp= array( 
+            "Inverse"    => FALSE,
+            "Match_type" => ":contains",
+            "Value_List" => array(1,"M"));
+
+        $tmp['LastError'] = "";
+        $data[$type] = $tmp;
+        break;
+      }
+      case "true":
+      {
+        $data['true'] = "true";
+        $data['true']['LastError'] = "";
+        break;
+      }
+      case "false":
+      {
+        $data['false'] = "false";
+        $data['false']['LastError'] = "";
+        break;
+      }
+      case "exists" :
+      {
+        $data['exists'] = array('Inverse' => FALSE,
+                                'Values'  => array(_("Nothing specified right now")),
+                                'LastError' => "");
+        break;
+      }
+      default : echo "Still buggy ";exit;
+    }
+
+    return($data);
+  }
+
 
   /* Ensure that all changes made on the ui 
    *  will be saved. 
    */
   function save_object()
   {
+  
+    if(isset($_POST['add_type']) && isset($_POST["test_type_to_add_".$this->object_id])){
+      $this->_parsed = $this->add_test($this->_parsed,$_POST["test_type_to_add_".$this->object_id]);
+    }
+
     $tmp = $this->save_object_recursive($parsed = NULL,$id = 1,$obj_id=1);
     $this->_parsed = $tmp;
   }
@@ -355,16 +499,28 @@ class sieve_if
       $parsed = $this->_parsed;
     }
 
+    if(!is_array($parsed)) return;
+
     /* Walk through all elements */
     foreach($parsed as $key => $data){
 
       /* Id used to have unique html names */
       $element_id = $this->object_id."_".$id."_".$obj_id;
+      
+      foreach($_POST as $name => $value){
+        if(preg_match("/Remove_Test_Object_".$element_id."_(x|y)/",$name)) {
+          return(false); 
+        }
+      }
+
+      
+      if(isset($_POST['add_type']) && isset($_POST["test_type_to_add_".$element_id])){
+        $parsed[$key][] = $this->add_test(array(),$_POST["test_type_to_add_".$element_id]);
+      }
 
       /* Create elements */
       switch($key)
       {
         /*******************
          * Address 
          *******************/
@@ -387,6 +543,8 @@ class sieve_if
           $match_types   = $this->match_types; 
           $operators     = $this->operators;
 
+          $parsed[$key]['LastError'] = "";
+
           /* Toggle Inverse ? */
           if(isset($_POST['toggle_inverse_'.$element_id])){
             $parsed[$key]['Inverse'] = !$parsed[$key]['Inverse'];
@@ -401,27 +559,30 @@ class sieve_if
           if(isset($_POST['address_part_'.$element_id])){
             $ap = $_POST['address_part_'.$element_id];
 
-            if(isset($address_parts[$ap])){
-              $parsed[$key]['Address_Part'] = $ap;
+            if(!isset($address_parts[$ap])){
+              $parsed[$key]['LastError'] = _("Invalid type of address part.") ;
             }
+            $parsed[$key]['Address_Part'] = $ap;
           }
 
           /* Check if match type has changed */
           if(isset($_POST['matchtype_'.$element_id])){
             $mt = $_POST['matchtype_'.$element_id];
 
-            if(isset($match_types[$mt])){
-              $parsed[$key]['Match_type'] = $mt;
+            if(!isset($match_types[$mt])){
+              $parsed[$key]['LastError'] = _("Invalid match type given.");
             }
+            $parsed[$key]['Match_type'] = $mt;
           }
 
           /* Get the comparator tag, if posted */
           if(isset($_POST['comparator_'.$element_id])){
             $cp = $_POST['comparator_'.$element_id];
 
-            if(isset($comparators[$cp])){
-              $parsed[$key]['Comparator'] = $cp;
+            if(!isset($comparators[$cp])){
+              $parsed[$key]['LastError'] = _("Invalid operator given.");
             }
+            $parsed[$key]['Comparator'] = $cp;
           }
 
           /* In case of :count and :value match types 
@@ -431,9 +592,10 @@ class sieve_if
             if(isset($_POST['operator_'.$element_id])){
               $op = $_POST['operator_'.$element_id];
 
-              if(isset($operators[$op])){
-                $parsed[$key]['Match_type_value'] = $op;
+              if(!isset($operators[$op])){
+                $parsed[$key]['LastError'] = _("Please specify a valid operator.");
               }
+              $parsed[$key]['Match_type_value'] = $op;
             }
           }
 
@@ -519,45 +681,42 @@ class sieve_if
                                 "K" => _("Kilobyte"));
 
           /* Reset error */
-          $parsed['size']['LastError'] ="";
+          $parsed[$key]['LastError'] ="";
 
           /* Get match type */
           if(isset($_POST['Match_type_'.$element_id])){
             $mt = $_POST['Match_type_'.$element_id];
-            if(isset($Match_types[$mt])){
-              $parsed['size']['Match_type'] = $mt;
-            }else{
-              $parsed['size']['LastError'] = _("Please select a valid match type in the list box below.");
+            if(!isset($Match_types[$mt])){
+              $parsed[$key]['LastError'] = _("Please select a valid match type in the list box below.");
             }
+            $parsed[$key]['Match_type'] = $mt;
           }
 
           /* Get old values */
-          $value = preg_replace("/[^0-9]*$/","",$parsed['size']['Value_List'][0]);
-          $unit  = preg_replace("/^[0-9]*/","",$parsed['size']['Value_List'][0]);
+          $value = preg_replace("/[^0-9]*$/","",$parsed[$key]['Value_List'][0]);
+          $unit  = preg_replace("/^[0-9]*/","",$parsed[$key]['Value_List'][0]);
 
           /* Get value */
           if(isset($_POST['Value_'.$element_id])){
             $vl = $_POST['Value_'.$element_id];
          
-            if(is_numeric($vl) && preg_match("/^[0-9]*$/",$vl)){
-              $value = $vl;
-            }else{
-              $parsed['size']['LastError'] = _("Only numeric values are allowed here.");
+            if(!(is_numeric($vl) && preg_match("/^[0-9]*$/",$vl))){
+              $parsed[$key]['LastError'] = _("Only numeric values are allowed here.");
             }
+            $value = preg_replace("/[^0-9]/","",$vl);
           }        
 
           /* Get unit */
           if(isset($_POST['Value_Unit_'.$element_id])){
             $ut = $_POST['Value_Unit_'.$element_id];
        
-            if(isset($Units[$ut])){
-              $unit = $ut;
-            }else{
-              $parsed['size']['LastError'] = _("No valid unit selected");
+            if(!isset($Units[$ut])){
+              $parsed[$key]['LastError'] = _("No valid unit selected");
             }
-          }        
-
-          $parsed['size']['Value_List'][0] = $value.$unit;
+            $unit = $ut;
+          }       
+          $parsed[$key]['Value_List'] = array(); 
+          $parsed[$key]['Value_List'][0] = $value.$unit;
           break;
         }
 
@@ -574,7 +733,12 @@ class sieve_if
             if(($key2 === "Inverse") && ($key2 == "Inverse")){
               continue;
             }
-            $parsed[$key][$key2] = $this->save_object_recursive($dat, ($id +1),$key2."-".$obj_id);
+            $tmp_data = $this->save_object_recursive($dat, ($id +1),$key2."-".$obj_id);
+            if($tmp_data != false){
+              $parsed[$key][$key2] = $tmp_data;
+            }else{
+              unset( $parsed[$key][$key2]);
+            }
           }
           break ;
         } 
@@ -592,12 +756,17 @@ class sieve_if
             if(($key2 === "Inverse") && ($key2 == "Inverse")){
               continue;
             }
-            $parsed[$key][$key2] =  $this->save_object_recursive($dat, ($id + 1),$key2."-".$obj_id);
+            $tmp_data = $this->save_object_recursive($dat, ($id +1),$key2."-".$obj_id);
+            if($tmp_data != false){
+              $parsed[$key][$key2] = $tmp_data;
+            }else{
+              unset( $parsed[$key][$key2]);
+            }
           }
           break ;
         } 
       }
-    }
+    } 
     return($parsed);
   }  
 
@@ -627,12 +796,7 @@ class sieve_if
     $smarty->assign("Name", $name);
     $smarty->assign("Contents", $this->get_as_html());
     $object = $smarty->fetch(get_template_path("templates/element_if_else.tpl",TRUE,dirname(__FILE__)));
-
-
-
     $str = preg_replace("/%%OBJECT_CONTENT%%/",$object,$object_container);
-   
-
     return($str);
   }
 
@@ -645,15 +809,23 @@ class sieve_if
       $parsed = $this->_parsed;
     }
 
+    if((!is_array($parsed)) || !count($parsed)) {
+      $smarty = get_smarty();
+      $smarty->assign("ID",$this->object_id);
+      $smarty->assign("DisplayAdd",TRUE);
+      $smarty->assign("DisplayDel",FALSE);
+      $str = $smarty->fetch(get_template_path("templates/object_test_container.tpl",TRUE,dirname(__FILE__)));
+      $ret .= preg_replace("/%%OBJECT_CONTENT%%/",_("Empty"),$str);
+      return($ret);
+    }
+
     /* Walk through all elements */
     foreach($parsed as $key => $data){
 
       /* Create Inverse Tag */
       if(is_array($data) && isset($data['Inverse']) && $data['Inverse']){
-        $str_inverse = "<font color='red'><b>"._("Not")."</b></font>&nbsp;";
         $Inverse = TRUE;
       }else{
-        $str_inverse = "";
         $Inverse = FALSE;
       }
 
@@ -705,11 +877,10 @@ class sieve_if
           $smarty->assign("comparators",$comparators);
           $smarty->assign("match_types",$match_types);
           $smarty->assign("operators",$operators);
-
+          $smarty->assign("LastError",$data['LastError']);
           $smarty->assign("match_type", $data['Match_type']);
           $smarty->assign("operator"  , preg_replace("/\"/","",$data['Match_type_value']));
           $smarty->assign("comparator", preg_replace("/\"/","",$data['Comparator']));
-        
 
           $keys = "";
           foreach($data['Key_List'] as $key){
@@ -727,7 +898,6 @@ class sieve_if
           $smarty->assign("Inverse",$Inverse);
           $smarty->assign("values",$values);
           $smarty->assign("Expert", $data['Expert']);
-
  
           $smarty->assign("ID"  , $element_id); 
           $ret .= $smarty->fetch(get_template_path("templates/element_header.tpl",TRUE,dirname(__FILE__)));
@@ -752,7 +922,7 @@ class sieve_if
           $smarty->assign("Expert", $data['Expert']);
           $smarty->assign("match_types",$match_types);
           $smarty->assign("operators",$operators);
-
+          $smarty->assign("LastError",$data['LastError']);
           $smarty->assign("match_type", $data['Match_type']);
           $smarty->assign("operator"  , preg_replace("/\"/","",$data['Match_type_value']));
           $smarty->assign("comparator", preg_replace("/\"/","",$data['Comparator']));
@@ -793,13 +963,12 @@ class sieve_if
           $smarty->assign("address_parts",$address_parts);
           $smarty->assign("comparators",$comparators);
           $smarty->assign("match_types",$match_types);
+          $smarty->assign("LastError",$data['LastError']);
           $smarty->assign("operators",$operators);
-
           $smarty->assign("match_type", $data['Match_type']);
           $smarty->assign("operator"  , preg_replace("/\"/","",$data['Match_type_value']));
           $smarty->assign("comparator", preg_replace("/\"/","",$data['Comparator']));
           $smarty->assign("address_part", $data['Address_Part']);
-
           $smarty->assign("Expert", $data['Expert']);
         
           $keys = "";
@@ -815,8 +984,6 @@ class sieve_if
           $values = preg_replace("/,$/","",trim($values));
           $smarty->assign("keys",$keys);
           $smarty->assign("values",$values);
-
           $smarty->assign("ID"  , $element_id); 
           $ret .= $smarty->fetch(get_template_path("templates/element_address.tpl",TRUE,dirname(__FILE__)));
           break;
@@ -860,7 +1027,6 @@ class sieve_if
         /*******************
          * Exists 
          *******************/
-       
         
         case "exists" : 
         {
@@ -898,11 +1064,20 @@ class sieve_if
             }
             $Contents .=        $this->get_as_html($dat, ($id +1),$key."-".$obj_id);
           }
+
           $smarty = get_smarty();
+          $smarty->assign("ID"  , $element_id); 
+          $smarty->assign("DisplayAdd",TRUE);
+          $smarty->assign("DisplayDel",FALSE);
+          $cont_tmp = $smarty->fetch(get_template_path("templates/object_test_container.tpl",TRUE,dirname(__FILE__)));
+          $cont_tmp = preg_replace("/%%OBJECT_CONTENT%%/",_("Klick here to add a new test"),$cont_tmp);
+
           $smarty->assign("Inverse",$Inverse);
-          $smarty->assign("Contents",$Contents);
+          $smarty->assign("Contents",$cont_tmp.$Contents);
           $smarty->assign("ID"  , $element_id); 
-          $ret .= $smarty->fetch(get_template_path("templates/element_allof.tpl",TRUE,dirname(__FILE__)));
+          $allof_tmp = $smarty->fetch(get_template_path("templates/element_allof.tpl",TRUE,dirname(__FILE__)));
+
+          $ret = $allof_tmp;
           break ;
         } 
 
@@ -921,10 +1096,18 @@ class sieve_if
             $Contents .=        $this->get_as_html($dat, ($id +1),$key."-".$obj_id);
           }
           $smarty = get_smarty();
-          $smarty->assign("Inverse",$Inverse);
-          $smarty->assign("Contents",$Contents);
           $smarty->assign("ID"  , $element_id); 
-          $ret .= $smarty->fetch(get_template_path("templates/element_anyof.tpl",TRUE,dirname(__FILE__)));
+          $smarty->assign("DisplayAdd",TRUE);
+          $smarty->assign("DisplayDel",FALSE);
+          $cont_tmp = $smarty->fetch(get_template_path("templates/object_test_container.tpl",TRUE,dirname(__FILE__)));
+          $cont_tmp = preg_replace("/%%OBJECT_CONTENT%%/",_("Klick here to add a new test"),$cont_tmp);
+
+          $smarty->assign("Inverse",$Inverse);
+          $smarty->assign("Contents",$cont_tmp.$Contents);
+          $allof_tmp = $smarty->fetch(get_template_path("templates/element_anyof.tpl",TRUE,dirname(__FILE__)));
+
+          $ret = $allof_tmp;
+
           break ;
         } 
         default : 
@@ -939,6 +1122,16 @@ class sieve_if
         }
       }
     }
+    
+    if(!isset($smarty)){
+      $smarty =get_smarty();
+    }
+
+    $smarty->assign("ID",$element_id);
+    $smarty->assign("DisplayAdd",FALSE);
+    $smarty->assign("DisplayDel",TRUE);
+    $str = $smarty->fetch(get_template_path("templates/object_test_container.tpl",TRUE,dirname(__FILE__)));
+    $ret = preg_replace("/%%OBJECT_CONTENT%%/",$ret,$str);
     return($ret);
   }
 
@@ -1054,6 +1247,7 @@ class sieve_if
           $values["Address_Part"]    = $Address_Part;
         }
         $tmp[$type] = $values;
+        $tmp[$type]['LastError'] = "";
         break;
       }
 
@@ -1091,6 +1285,7 @@ class sieve_if
         $tmp[$type]= array( "Inverse"    => $Inverse,
                             "Match_type" => $Match_type,
                             "Value_List" => $Value_List);
+        $tmp[$type]['LastError'] = "";
         break;
       }
 
@@ -1102,11 +1297,13 @@ class sieve_if
       case "true": 
       {
         $tmp['true'] = "true";
+        $tmp['true']['LastError'] = "";
         break;
       }
       case "false":
       {
         $tmp['false'] = "false";
+        $tmp['false']['LastError'] = "";
         break;
       }
 
@@ -1131,6 +1328,7 @@ class sieve_if
         
         $tmp['exists'] = array('Inverse' => $Inverse,
                                'Values'  => $tmp2['STRINGS']);
+        $tmp[$type]['LastError'] = "";
         break;
       }