diff options
author | Martin Jansen <martin@divbyzero.net> | 2012-12-24 14:14:24 +0100 |
---|---|---|
committer | Martin Jansen <martin@divbyzero.net> | 2013-02-03 13:23:53 +0100 |
commit | 2f334438836f37b82d739b20a4d0f875278e4766 (patch) | |
tree | eb897b7125fa28848c884e675089deda6fb22ba7 /ext | |
parent | 8771c265a43dac2e44aa4ae7af66a6534b0c70ae (diff) | |
download | php-git-2f334438836f37b82d739b20a4d0f875278e4766.tar.gz |
ext/filter support for validating MAC addresses.
Diffstat (limited to 'ext')
-rw-r--r-- | ext/filter/filter.c | 2 | ||||
-rw-r--r-- | ext/filter/filter_private.h | 3 | ||||
-rw-r--r-- | ext/filter/logical_filters.c | 48 | ||||
-rw-r--r-- | ext/filter/php_filter.h | 1 | ||||
-rw-r--r-- | ext/filter/tests/008.phpt | 26 | ||||
-rw-r--r-- | ext/filter/tests/033.phpt | 39 | ||||
-rw-r--r-- | ext/filter/tests/033_run.inc | 6 | ||||
-rw-r--r-- | ext/filter/tests/055.phpt | 34 |
8 files changed, 125 insertions, 34 deletions
diff --git a/ext/filter/filter.c b/ext/filter/filter.c index 2aa8dd57d9..da951feb04 100644 --- a/ext/filter/filter.c +++ b/ext/filter/filter.c @@ -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); diff --git a/ext/filter/filter_private.h b/ext/filter/filter_private.h index 9bc53a0e47..65e61dfea7 100644 --- a/ext/filter/filter_private.h +++ b/ext/filter/filter_private.h @@ -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 diff --git a/ext/filter/logical_filters.c b/ext/filter/logical_filters.c index 58d5870c11..52d948b188 100644 --- a/ext/filter/logical_filters.c +++ b/ext/filter/logical_filters.c @@ -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 diff --git a/ext/filter/php_filter.h b/ext/filter/php_filter.h index cbe1c47200..e31f0f0817 100644 --- a/ext/filter/php_filter.h +++ b/ext/filter/php_filter.h @@ -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); diff --git a/ext/filter/tests/008.phpt b/ext/filter/tests/008.phpt index 8a4340542f..a499219ee7 100644 --- a/ext/filter/tests/008.phpt +++ b/ext/filter/tests/008.phpt @@ -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" } diff --git a/ext/filter/tests/033.phpt b/ext/filter/tests/033.phpt index 04daa61333..d76f9ab3b8 100644 --- a/ext/filter/tests/033.phpt +++ b/ext/filter/tests/033.phpt @@ -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'Henry 하퍼 -stripped PHP 1 foo@bar.com http://a.b.c 1.2.3.4 123 123abc() O'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<>() O'Henry 하퍼 -full_special_chars PHP 1 foo@bar.com http://a.b.c 1.2.3.4 123 123abc<>() O'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'Henry 하퍼 aa:bb:cc:dd:ee:ff +stripped PHP 1 foo@bar.com http://a.b.c 1.2.3.4 123 123abc() O'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<>() O'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<>() O'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 diff --git a/ext/filter/tests/033_run.inc b/ext/filter/tests/033_run.inc index e3b67387ca..ecb2cf7be1 100644 --- a/ext/filter/tests/033_run.inc +++ b/ext/filter/tests/033_run.inc @@ -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 index 0000000000..bf94f3515f --- /dev/null +++ b/ext/filter/tests/055.phpt @@ -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 |