Code

Updated Placeholder handling, fixed problems with UPPER/lowercase handling
[gosa.git] / gosa-core / include / utils / class_tests.inc
index 4c2d40d5d1c4f978b0640e377c4327b94f40974f..6b2e283a2ac6167972563a6e90d8c5cf24b75d7a 100644 (file)
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
+/*! \brief Test functions
+ *
+ * This class provides various test functions. It enables to check
+ * if a given value is:
+ *
+ * - a phone numnber
+ * - a DNS name
+ * - an URL
+ * etc.
+ *
+ * The functions need to be handled with care, because they are not as strict
+ * as one might expect.
+ */ 
 class tests {
+
+  /*! \brief Test if the given string is a phone number */
   public static function is_phone_nr($nr)
   {
     if ($nr == ""){
       return (TRUE);
     }
 
-    return preg_match ("/^[\/0-9 ()+*-]+$/", $nr);
+    // We require at least one numeric character in the number string.
+    return preg_match ("/^[\/0-9 ()+*-]*[0-9]{1}[\/0-9 ()+*-]*$/", $nr);
   }
 
 
+  /*! \brief Test if the given string contains characters allowed in a DNS name */
   public static function is_dns_name($str)
   {
-    return(preg_match("/^[a-z0-9\.\-]*$/i",$str));
+    return(preg_match("/^[a-z0-9\.\-_]*$/i",$str));
   }
 
 
+  /*! \brief Test if the given string is an URL */
   public static function is_url($url)
   {
     if ($url == ""){
@@ -45,6 +63,7 @@ class tests {
   }
 
 
+  /*! \brief Test if the given string is a DN */
   public static function is_dn($dn)
   {
     if ($dn == ""){
@@ -55,6 +74,7 @@ class tests {
   }
 
 
+  /*! \brief Test if the given string is an uid */
   public static function is_uid($uid)
   {
     if ($uid == ""){
@@ -71,19 +91,38 @@ class tests {
   }
 
 
+  /*! \brief Test if the given string is an IP */
   public static function is_ip($ip)
   {
-    return preg_match("/^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/", $ip);
+    if(function_exists('filter_var')) {
+      return filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4);
+    } else {
+      return preg_match("/^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/", $ip);
+    }
   }
 
 
+  public static function is_ipv6($ip)
+  {
+    if(function_exists('filter_var')) {
+        return filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6);
+    } else {
+        $ipv4 = '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)';
+        $g = '([0-9a-f]{1,4})'; //IPv6 group
+        return preg_match("/^$g:$g:$g:$g:$g:$g:$g:$g$/", $ip) ||
+               preg_match("/^$g:$g:$g:$g:$g:$g:$ipv4$/", $ip);
+    }
+  }
+
+
+  /*! \brief Test if the given string is a mac address */
   public static function is_mac($mac)
   {
     return preg_match("/^[a-f0-9][a-f0-9]:[a-f0-9][a-f0-9]:[a-f0-9][a-f0-9]:[a-f0-9][a-f0-9]:[a-f0-9][a-f0-9]:[a-f0-9][a-f0-9]$/i", $mac);
   }
 
 
-  /* Checks if the given ip address dosen't match 
+  /*! \brief Checks if the given ip address dosen't match 
       "is_ip" because there is also a sub net mask given */
   public static function is_ip_with_subnetmask($ip)
   {
@@ -124,13 +163,17 @@ class tests {
   }
 
 
-  /* Simple is domain check, it checks if the given string looks like "string(...).string" */
+  /*! \brief Simple is domain check
+   *
+   * This checks if the given string looks like "string(...).string"
+   */
   public static function is_domain($str)
   {
-    return(preg_match("/^([a-z0-9i\-]*)\.[a-z0-9]*$/i",$str));
+    return(preg_match("/^(([a-z0-9\-]{2,63})\.)*[a-z]{2,63}$/i",$str));
   }
 
 
+  /*! \brief Check if the given argument is an id */
   public static function is_id($id)
   {
     if ($id == ""){
@@ -141,6 +184,7 @@ class tests {
   }
 
 
+  /*! \brief Check if the given argument is a path */
   public static function is_path($path)
   {
     if ($path == ""){
@@ -154,22 +198,23 @@ class tests {
   }
 
 
+  /*! \brief Check if the given argument is an email */
   public static function is_email($address, $template= FALSE)
   {
     if ($address == ""){
       return (TRUE);
     }
     if ($template){
-      return preg_match ("/^[._a-z0-9%-]+@[_a-z0-9-]+(\.[a-z0-9-]+)(\.[a-z0-9-]+)*$/i",
+      return preg_match ("/^[._a-z0-9{\[\]}%\+-]+@[_a-{}\[\]%z0-9-]+(\.[a-z0-9-]+)(\.[a-z0-9-]+)*$/i",
           $address);
     } else {
-      return preg_match ("/^[._a-z0-9-]+@[_a-z0-9-]+(\.[a-z0-9i-]+)(\.[a-z0-9-]+)*$/i",
+      return preg_match ("/^[._a-z0-9\+-]+@[_a-z0-9-]+(\.[a-z0-9i-]+)(\.[a-z0-9-]+)*$/i",
           $address);
     }
   }
 
 
-  /* Check if the given department name is valid */
+  /* \brief Check if the given department name is valid */
   public static function is_department_name_reserved($name,$base)
   {
     $reservedName = array("systems","apps","incomming","internal","accounts","fax","addressbook",
@@ -192,30 +237,30 @@ class tests {
   }
 
 
-  /* Check if $ip1 and $ip2 represents a valid IP range 
-   *  returns TRUE in case of a valid range, FALSE in case of an error. 
+  /* \brief Check if $ip1 and $ip2 represents a valid IP range
+   *  \return TRUE in case of a valid range, FALSE in case of an error. 
    */
   public static function is_ip_range($ip1,$ip2)
   {
-    if(!is_ip($ip1) || !is_ip($ip2)){
+    if(!tests::is_ip($ip1) || !tests::is_ip($ip2)){
       return(FALSE);
     }else{
-      $ar1 = split("\.",$ip1);
+      $ar1 = explode(".",$ip1);
       $var1 = $ar1[0] * (16777216) + $ar1[1] * (65536) + $ar1[2] * (256) + $ar1[3];
 
-      $ar2 = split("\.",$ip2);
+      $ar2 = explode(".",$ip2);
       $var2 = $ar2[0] * (16777216) + $ar2[1] * (65536) + $ar2[2] * (256) + $ar2[3];
       return($var1 < $var2);
     }
   }
 
 
-  /* Check if the specified IP address $address is inside the given network */
+  /* \brief Check if the specified IP address $address is inside the given network */
   public static function is_in_network($network, $netmask, $address)
   {
-    $nw= split('\.', $network);
-    $nm= split('\.', $netmask);
-    $ad= split('\.', $address);
+    $nw= explode('.', $network);
+    $nm= explode('.', $netmask);
+    $ad= explode('.', $address);
 
     /* Generate inverted netmask */
     for ($i= 0; $i<4; $i++){
@@ -231,13 +276,56 @@ class tests {
     return ($first < $curr&& $last > $curr);
   }
 
+  /* Check if entry value is a valid date */
+  public static function is_date($date)
+  {
+    global $lang;
+
+    if ($date == ""){
+      return (TRUE);
+    }
+
+    #TODO: use $lang to check date format
+    if (!preg_match("/^([0-9]{1,2})\.([0-9]{1,2})\.([0-9]{4})$/", $date, $matches)) {
+      return false;
+    }
 
-  /* Check if the specified IP address $address is inside the given network */
+    return checkdate($matches[2],$matches[1],$matches[3]);
+  }
+  /*
+   * Compares two dates
+   * @param $dataA as String in german dateformat
+   * @param $dataB as String in german dateformat
+   * @return float or false on error
+   * 
+   * * <0 => a<b
+   * 0 => a=b
+   * >0 => a>b
+   */
+ public static function compareDate($dateA, $dateB){
+        /*
+         * TODO:
+         * use $lang to check date format      
+         */ 
+       $tstampA = strtotime($dateA);
+       if($tstampA === false){
+               trigger_error("Given date can not be converted to timestamp(".$dataA.") in function tests::compareDate.");
+               return false;   
+       }
+       $tstampB = strtotime($dateB);
+       if($tstampB === false){
+               trigger_error("Given date can not be converted to timestamp(".$dataB.") in function tests::compareDate.");
+               return false;   
+       }
+       
+       return $tstampA-$tstampB;
+ }
+  /* \brief Check if the specified IP address $address is inside the given network */
   public static function is_in_ip_range($from, $to, $address)
   {
-    $from = split('\.', $from);
-    $to   = split('\.', $to);
-    $ad   = split('\.', $address);
+    $from = explode('.', $from);
+    $to   = explode('.', $to);
+    $ad   = explode('.', $address);
 
     /* Transform to integer */
     $from= $from[0] * (16777216) + $from[1] * (65536) + $from[2] * (256) + $from[3];