]> granicus.if.org Git - php/commitdiff
ext/filter support for validating MAC addresses.
authorMartin Jansen <martin@divbyzero.net>
Mon, 24 Dec 2012 13:14:24 +0000 (14:14 +0100)
committerMartin Jansen <martin@divbyzero.net>
Sun, 3 Feb 2013 12:23:53 +0000 (13:23 +0100)
ext/filter/filter.c
ext/filter/filter_private.h
ext/filter/logical_filters.c
ext/filter/php_filter.h
ext/filter/tests/008.phpt
ext/filter/tests/033.phpt
ext/filter/tests/033_run.inc
ext/filter/tests/055.phpt [new file with mode: 0644]

index 2aa8dd57d9c0c655cd45e6e5872bb95fa5ad76cf..da951feb042dd2911ab6e0971453c070716d068b 100644 (file)
@@ -47,6 +47,7 @@ static const filter_list_entry filter_list[] = {
        { "validate_url",    FILTER_VALIDATE_URL,           php_filter_validate_url    },
        { "validate_email",  FILTER_VALIDATE_EMAIL,         php_filter_validate_email  },
        { "validate_ip",     FILTER_VALIDATE_IP,            php_filter_validate_ip     },
+       { "validate_mac",    FILTER_VALIDATE_MAC,           php_filter_validate_mac    },
 
        { "string",          FILTER_SANITIZE_STRING,        php_filter_string          },
        { "stripped",        FILTER_SANITIZE_STRING,        php_filter_string          },
@@ -233,6 +234,7 @@ PHP_MINIT_FUNCTION(filter)
        REGISTER_LONG_CONSTANT("FILTER_VALIDATE_URL", FILTER_VALIDATE_URL, CONST_CS | CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("FILTER_VALIDATE_EMAIL", FILTER_VALIDATE_EMAIL, CONST_CS | CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("FILTER_VALIDATE_IP", FILTER_VALIDATE_IP, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("FILTER_VALIDATE_MAC", FILTER_VALIDATE_MAC, CONST_CS | CONST_PERSISTENT);
 
        REGISTER_LONG_CONSTANT("FILTER_DEFAULT", FILTER_DEFAULT, CONST_CS | CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("FILTER_UNSAFE_RAW", FILTER_UNSAFE_RAW, CONST_CS | CONST_PERSISTENT);
index 9bc53a0e4757f8e432f8ac2bbe5ccfc86e255e13..65e61dfea7fdb6ea9876d36150815aca4cd9cad1 100644 (file)
@@ -63,7 +63,8 @@
 #define FILTER_VALIDATE_URL           0x0111
 #define FILTER_VALIDATE_EMAIL         0x0112
 #define FILTER_VALIDATE_IP            0x0113
-#define FILTER_VALIDATE_LAST          0x0113
+#define FILTER_VALIDATE_MAC           0x0114
+#define FILTER_VALIDATE_LAST          0x0114
 
 #define FILTER_VALIDATE_ALL           0x0100
 
index 58d5870c112e155fc58caa7afaecd7e9ada1f524..52d948b1889674966d465fa17966b0b7bad982ba 100644 (file)
@@ -784,6 +784,54 @@ void php_filter_validate_ip(PHP_INPUT_FILTER_PARAM_DECL) /* {{{ */
 }
 /* }}} */
 
+void php_filter_validate_mac(PHP_INPUT_FILTER_PARAM_DECL) /* {{{ */
+{
+       char *input = Z_STRVAL_P(value);
+       int input_len = Z_STRLEN_P(value);
+       int tokens, length, i, offset;
+       char separator;
+       long ret = 0;
+
+       if (14 == input_len) {
+               /* EUI-64 format: Four hexadecimal digits separated by dots. Less
+                * commonly used but valid nonetheless.
+                */
+               tokens = 3;
+               length = 4;
+               separator = '.';
+       } else if (17 == input_len && memchr(input + 2, '-', 1)) {
+               /* IEEE 802 format: Six hexadecimal digits separated by hyphens. */
+               tokens = 6;
+               length = 2;
+               separator = '-';
+       } else if (17 == input_len && memchr(input + 2, ':', 1)) {
+               /* IEEE 802 format: Six hexadecimal digits separated by colons. */
+               tokens = 6;
+               length = 2;
+               separator = ':';
+       } else {
+               RETURN_VALIDATION_FAILED;
+       }
+
+       /* Essentially what we now have is a set of tokens each consisting of
+        * a hexadecimal number followed by a separator character. (With the
+        * exception of the last token which does not have the separator.)
+        */
+       for (i = 0; i < tokens; i++) {
+               offset = i * (length + 1);
+
+               if (i < tokens - 1 && !memchr(input + offset + length, separator, 1)) {
+                       /* The current token did not end with e.g. a "." */
+                       RETURN_VALIDATION_FAILED
+               }
+               if (php_filter_parse_hex(input + offset, length, &ret) < 0) {
+                       /* The current token is no valid hexadecimal digit */
+                       RETURN_VALIDATION_FAILED
+               }
+       }
+}
+/* }}} */
+
 /*
  * Local variables:
  * tab-width: 4
index cbe1c4720093b23d15cbd1373061ecd8d9d6c90b..e31f0f08175d3e669466c23eae87c6418e913c52 100644 (file)
@@ -78,6 +78,7 @@ void php_filter_validate_regexp(PHP_INPUT_FILTER_PARAM_DECL);
 void php_filter_validate_url(PHP_INPUT_FILTER_PARAM_DECL);
 void php_filter_validate_email(PHP_INPUT_FILTER_PARAM_DECL);
 void php_filter_validate_ip(PHP_INPUT_FILTER_PARAM_DECL);
+void php_filter_validate_mac(PHP_INPUT_FILTER_PARAM_DECL);
 
 void php_filter_string(PHP_INPUT_FILTER_PARAM_DECL);
 void php_filter_encoded(PHP_INPUT_FILTER_PARAM_DECL);
index 8a4340542f2d4cfd2064c51ec3e7dbda42a3e015..a499219ee76e5f1c8d5e5243d821f9fa5b07fd26 100644 (file)
@@ -11,7 +11,7 @@ var_dump(filter_list(array()));
 echo "Done\n";
 ?>
 --EXPECTF--    
-array(19) {
+array(20) {
   [0]=>
   string(3) "int"
   [1]=>
@@ -27,28 +27,30 @@ array(19) {
   [6]=>
   string(11) "validate_ip"
   [7]=>
-  string(6) "string"
+  string(12) "validate_mac"
   [8]=>
-  string(8) "stripped"
+  string(6) "string"
   [9]=>
-  string(7) "encoded"
+  string(8) "stripped"
   [10]=>
-  string(13) "special_chars"
+  string(7) "encoded"
   [11]=>
-  string(18) "full_special_chars"
+  string(13) "special_chars"
   [12]=>
-  string(10) "unsafe_raw"
+  string(18) "full_special_chars"
   [13]=>
-  string(5) "email"
+  string(10) "unsafe_raw"
   [14]=>
-  string(3) "url"
+  string(5) "email"
   [15]=>
-  string(10) "number_int"
+  string(3) "url"
   [16]=>
-  string(12) "number_float"
+  string(10) "number_int"
   [17]=>
-  string(12) "magic_quotes"
+  string(12) "number_float"
   [18]=>
+  string(12) "magic_quotes"
+  [19]=>
   string(8) "callback"
 }
 
index 04daa61333970121ce886c92f68f1a689390159f..d76f9ab3b8a55f8312a26bfffa3e44221a64d1a4 100644 (file)
@@ -10,22 +10,23 @@ default_charset=UTF-8
 include dirname(__FILE__) . '/033_run.inc';
 ?>
 --EXPECT--     
-int                      1                                               123                                               
-boolean                  1                                                                                                 
-float                    1                                               123                                               
-validate_regexp                                                                                   O'Henry                  
-validate_url                               http://a.b.c                                                                    
-validate_email              foo@bar.com                                                                                    
-validate_ip                                                    1.2.3.4                                                     
-string              PHP  1  foo@bar.com    http://a.b.c        1.2.3.4   123  123abc()            O&#39;Henry    하퍼    
-stripped            PHP  1  foo@bar.com    http://a.b.c        1.2.3.4   123  123abc()            O&#39;Henry    하퍼    
-encoded             PHP  1  foo%40bar.com  http%3A%2F%2Fa.b.c  1.2.3.4   123  123abc%3C%3E%28%29  O%27Henry      %ED%95%98%ED%8D%BC
-special_chars       PHP  1  foo@bar.com    http://a.b.c        1.2.3.4   123  123abc&#60;&#62;()  O&#39;Henry    하퍼    
-full_special_chars  PHP  1  foo@bar.com    http://a.b.c        1.2.3.4   123  123abc&lt;&gt;()    O&#039;Henry   하퍼    
-unsafe_raw          PHP  1  foo@bar.com    http://a.b.c        1.2.3.4   123  123abc<>()          O'Henry        하퍼    
-email               PHP  1  foo@bar.com    httpa.b.c           1.2.3.4   123  123abc              O'Henry                  
-url                 PHP  1  foo@bar.com    http://a.b.c        1.2.3.4   123  123abc<>()          O'Henry                  
-number_int               1                                     1234      123  123                                          
-number_float             1                                     1234      123  123                                          
-magic_quotes        PHP  1  foo@bar.com    http://a.b.c        1.2.3.4   123  123abc<>()          O\'Henry       하퍼    
-callback            PHP  1  FOO@BAR.COM    HTTP://A.B.C        1.2.3.4   123  123ABC<>()          O'HENRY        하퍼  
+int                      1                                               123                                                         
+boolean                  1                                                                                                           
+float                    1                                               123                                                         
+validate_regexp                                                                                   O'Henry                            
+validate_url                               http://a.b.c                                                                              
+validate_email              foo@bar.com                                                                                              
+validate_ip                                                    1.2.3.4                                                               
+validate_mac                                                                                                               aa:bb:cc:dd:ee:ff
+string              PHP  1  foo@bar.com    http://a.b.c        1.2.3.4   123  123abc()            O&#39;Henry    하퍼    aa:bb:cc:dd:ee:ff
+stripped            PHP  1  foo@bar.com    http://a.b.c        1.2.3.4   123  123abc()            O&#39;Henry    하퍼    aa:bb:cc:dd:ee:ff
+encoded             PHP  1  foo%40bar.com  http%3A%2F%2Fa.b.c  1.2.3.4   123  123abc%3C%3E%28%29  O%27Henry      %ED%95%98%ED%8D%BCaa%3Abb%3Acc%3Add%3Aee%3Aff
+special_chars       PHP  1  foo@bar.com    http://a.b.c        1.2.3.4   123  123abc&#60;&#62;()  O&#39;Henry    하퍼    aa:bb:cc:dd:ee:ff
+full_special_chars  PHP  1  foo@bar.com    http://a.b.c        1.2.3.4   123  123abc&lt;&gt;()    O&#039;Henry   하퍼    aa:bb:cc:dd:ee:ff
+unsafe_raw          PHP  1  foo@bar.com    http://a.b.c        1.2.3.4   123  123abc<>()          O'Henry        하퍼    aa:bb:cc:dd:ee:ff
+email               PHP  1  foo@bar.com    httpa.b.c           1.2.3.4   123  123abc              O'Henry                  aabbccddeeff
+url                 PHP  1  foo@bar.com    http://a.b.c        1.2.3.4   123  123abc<>()          O'Henry                  aa:bb:cc:dd:ee:ff
+number_int               1                                     1234      123  123                                                    
+number_float             1                                     1234      123  123                                                    
+magic_quotes        PHP  1  foo@bar.com    http://a.b.c        1.2.3.4   123  123abc<>()          O\'Henry       하퍼    aa:bb:cc:dd:ee:ff
+callback            PHP  1  FOO@BAR.COM    HTTP://A.B.C        1.2.3.4   123  123ABC<>()          O'HENRY        하퍼    AA:BB:CC:DD:EE:FF
\ No newline at end of file
index e3b67387ca2a95e38bdc1d50efd720c4bc702fe5..ecb2cf7be160d4b16758f590d9eeb6be3e235cde 100644 (file)
@@ -16,7 +16,8 @@ $data = array(
        "123",
        "123abc<>()",
        "O'Henry",
-       "하퍼"
+       "하퍼",
+       "aa:bb:cc:dd:ee:ff",
 );
 
 
@@ -35,6 +36,7 @@ foreach(filter_list() as $filter) {
        printf("%-5s",$result[5]);
        printf("%-20s",$result[6]);
        printf("%-15s",$result[7]);
-       printf("%-10s\n",$result[8]);
+       printf("%-10s",$result[8]);
+       printf("%-10s\n",$result[9]);
 }
 ?>
diff --git a/ext/filter/tests/055.phpt b/ext/filter/tests/055.phpt
new file mode 100644 (file)
index 0000000..bf94f35
--- /dev/null
@@ -0,0 +1,34 @@
+--TEST--
+filter_var() and FILTER_VALIDATE_MAC
+--SKIPIF--
+<?php if (!extension_loaded("filter")) die("skip"); ?>
+--FILE--
+<?php
+$values = Array(
+       "01-23-45-67-89-ab",
+       "01-23-45-67-89-AB",
+       "01-23-45-67-89-aB",
+       "01:23:45:67:89:ab",
+       "01:23:45:67:89:AB",
+       "01:23:45:67:89:aB",
+       "01:23:45-67:89:aB",
+       "xx:23:45:67:89:aB",
+       "0123.4567.89ab",
+);
+foreach ($values as $value) {
+       var_dump(filter_var($value, FILTER_VALIDATE_MAC));
+}
+
+echo "Done\n";
+?>
+--EXPECT--     
+string(17) "01-23-45-67-89-ab"
+string(17) "01-23-45-67-89-AB"
+string(17) "01-23-45-67-89-aB"
+string(17) "01:23:45:67:89:ab"
+string(17) "01:23:45:67:89:AB"
+string(17) "01:23:45:67:89:aB"
+bool(false)
+bool(false)
+string(14) "0123.4567.89ab"
+Done