Browse Source

ext/filter support for validating MAC addresses.

pull/247/merge
Martin Jansen 14 years ago
parent
commit
2f33443883
  1. 2
      ext/filter/filter.c
  2. 3
      ext/filter/filter_private.h
  3. 48
      ext/filter/logical_filters.c
  4. 1
      ext/filter/php_filter.h
  5. 26
      ext/filter/tests/008.phpt
  6. 39
      ext/filter/tests/033.phpt
  7. 6
      ext/filter/tests/033_run.inc
  8. 34
      ext/filter/tests/055.phpt

2
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);

3
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

48
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

1
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);

26
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"
}

39
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&#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

6
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]);
}
?>

34
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
Loading…
Cancel
Save