diff options
author | Leo Feyer <github@contao.org> | 2015-10-15 11:07:25 +0200 |
---|---|---|
committer | Anatol Belski <ab@php.net> | 2016-07-18 21:52:35 +0200 |
commit | 8f4050709c833b9d42cd65349b7747f8e61d171f (patch) | |
tree | 4aecb37aa0535a109425c6bc0354b9625ebf8463 /ext/filter | |
parent | 42260325a47480bc97f7dceb2ac5d8e8d7799928 (diff) | |
download | php-git-8f4050709c833b9d42cd65349b7747f8e61d171f.tar.gz |
Support Unicode characters in the local part of an e-mail address.
See RFC 6531 (https://tools.ietf.org/html/rfc6531).
Encode IDNA domains.
Add the missing "Done" to the expected output.
Add the FILTER_FLAG_EMAIL_RFC6531 flag.
Fix the filter_var() call.
Diffstat (limited to 'ext/filter')
-rw-r--r-- | ext/filter/filter.c | 2 | ||||
-rw-r--r-- | ext/filter/filter_private.h | 2 | ||||
-rw-r--r-- | ext/filter/logical_filters.c | 7 | ||||
-rw-r--r-- | ext/filter/tests/058.phpt | 57 |
4 files changed, 67 insertions, 1 deletions
diff --git a/ext/filter/filter.c b/ext/filter/filter.c index 2c8dde9d49..3d79a77f8a 100644 --- a/ext/filter/filter.c +++ b/ext/filter/filter.c @@ -286,6 +286,8 @@ PHP_MINIT_FUNCTION(filter) REGISTER_LONG_CONSTANT("FILTER_FLAG_HOSTNAME", FILTER_FLAG_HOSTNAME, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("FILTER_FLAG_EMAIL_RFC6531", FILTER_FLAG_EMAIL_RFC6531, CONST_CS | CONST_PERSISTENT); + sapi_register_input_filter(php_sapi_filter, php_sapi_filter_init); return SUCCESS; diff --git a/ext/filter/filter_private.h b/ext/filter/filter_private.h index 2f9abc32ba..ffce723d52 100644 --- a/ext/filter/filter_private.h +++ b/ext/filter/filter_private.h @@ -57,6 +57,8 @@ #define FILTER_FLAG_HOSTNAME 0x100000 +#define FILTER_FLAG_EMAIL_RFC6531 0x100000 + #define FILTER_VALIDATE_INT 0x0101 #define FILTER_VALIDATE_BOOLEAN 0x0102 #define FILTER_VALIDATE_FLOAT 0x0103 diff --git a/ext/filter/logical_filters.c b/ext/filter/logical_filters.c index 5fd057d5a9..03d4795888 100644 --- a/ext/filter/logical_filters.c +++ b/ext/filter/logical_filters.c @@ -598,7 +598,12 @@ void php_filter_validate_email(PHP_INPUT_FILTER_PARAM_DECL) /* {{{ */ * Feel free to use and redistribute this code. But please keep this copyright notice. * */ - const char regexp[] = "/^(?!(?:(?:\\x22?\\x5C[\\x00-\\x7E]\\x22?)|(?:\\x22?[^\\x5C\\x22]\\x22?)){255,})(?!(?:(?:\\x22?\\x5C[\\x00-\\x7E]\\x22?)|(?:\\x22?[^\\x5C\\x22]\\x22?)){65,}@)(?:(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2F-\\x39\\x3D\\x3F\\x5E-\\x7E]+)|(?:\\x22(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\x7F]|(?:\\x5C[\\x00-\\x7F]))*\\x22))(?:\\.(?:(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2F-\\x39\\x3D\\x3F\\x5E-\\x7E]+)|(?:\\x22(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\x7F]|(?:\\x5C[\\x00-\\x7F]))*\\x22)))*@(?:(?:(?!.*[^.]{64,})(?:(?:(?:xn--)?[a-z0-9]+(?:-+[a-z0-9]+)*\\.){1,126}){1,}(?:(?:[a-z][a-z0-9]*)|(?:(?:xn--)[a-z0-9]+))(?:-+[a-z0-9]+)*)|(?:\\[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9][:\\]]){7,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?)))|(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))(?:\\.(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))){3}))\\]))$/iD"; + if (flags & FILTER_FLAG_EMAIL_RFC6531) { + const char regexp[] = "/^(?!(?:(?:\\x22?\\x5C[\\x00-\\x7E]\\x22?)|(?:\\x22?[^\\x5C\\x22]\\x22?)){255,})(?!(?:(?:\\x22?\\x5C[\\x00-\\x7E]\\x22?)|(?:\\x22?[^\\x5C\\x22]\\x22?)){65,}@)(?:(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2F-\\x39\\x3D\\x3F\\x5E-\\x7E\\pL\\pN]+)|(?:\\x22(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\x7F\\pL\\pN]|(?:\\x5C[\\x00-\\x7F]))*\\x22))(?:\\.(?:(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2F-\\x39\\x3D\\x3F\\x5E-\\x7E\\pL\\pN]+)|(?:\\x22(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\x7F\\pL\\pN]|(?:\\x5C[\\x00-\\x7F]))*\\x22)))*@(?:(?:(?!.*[^.]{64,})(?:(?:(?:xn--)?[a-z0-9]+(?:-+[a-z0-9]+)*\\.){1,126}){1,}(?:(?:[a-z][a-z0-9]*)|(?:(?:xn--)[a-z0-9]+))(?:-+[a-z0-9]+)*)|(?:\\[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9][:\\]]){7,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?)))|(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))(?:\\.(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))){3}))\\]))$/iDu"; + } else { + const char regexp[] = "/^(?!(?:(?:\\x22?\\x5C[\\x00-\\x7E]\\x22?)|(?:\\x22?[^\\x5C\\x22]\\x22?)){255,})(?!(?:(?:\\x22?\\x5C[\\x00-\\x7E]\\x22?)|(?:\\x22?[^\\x5C\\x22]\\x22?)){65,}@)(?:(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2F-\\x39\\x3D\\x3F\\x5E-\\x7E]+)|(?:\\x22(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\x7F]|(?:\\x5C[\\x00-\\x7F]))*\\x22))(?:\\.(?:(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2F-\\x39\\x3D\\x3F\\x5E-\\x7E]+)|(?:\\x22(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\x7F]|(?:\\x5C[\\x00-\\x7F]))*\\x22)))*@(?:(?:(?!.*[^.]{64,})(?:(?:(?:xn--)?[a-z0-9]+(?:-+[a-z0-9]+)*\\.){1,126}){1,}(?:(?:[a-z][a-z0-9]*)|(?:(?:xn--)[a-z0-9]+))(?:-+[a-z0-9]+)*)|(?:\\[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9][:\\]]){7,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?)))|(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))(?:\\.(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))){3}))\\]))$/iD"; + } + pcre *re = NULL; pcre_extra *pcre_extra = NULL; int preg_options = 0; diff --git a/ext/filter/tests/058.phpt b/ext/filter/tests/058.phpt new file mode 100644 index 0000000000..a10f844b63 --- /dev/null +++ b/ext/filter/tests/058.phpt @@ -0,0 +1,57 @@ +--TEST-- +FILTER_VALIDATE_EMAIL unicode support (https://tools.ietf.org/html/rfc6531) +--SKIPIF-- +<?php if (!extension_loaded("filter")) die("skip"); ?> +--FILE-- +<?php +$values = Array( +'niceändsimple@example.com', +'véry.çommon@example.com', +'a.lîttle.lengthy.but.fiñe@dept.example.com', +'dîsposable.style.émail.with+symbol@example.com', +'other.émail-with-dash@example.com', +'üser@[IPv6:2001:db8:1ff::a0b:dbd0]', +'"verî.uñusual.@.uñusual.com"@example.com', +'"verî.(),:;<>[]\".VERÎ.\"verî@\ \"verî\".unüsual"@strange.example.com', +'tést@example.com', +'tést.child@example.com', +'tést@xn--exmple-cua.com', +'tést@xn----zfa.xe', +'tést@subexample.wizard', +'tést@[255.255.255.255]', +'tést@[IPv6:2001:0db8:85a3:08d3:1319:8a2e:0370:7344]', +'tést@[IPv6:2001::7344]', +'tést@[IPv6:1111:2222:3333:4444:5555:6666:255.255.255.255]', +'tést+reference@example.com', +'üñîçøðé@example.com', +'"üñîçøðé"@example.com', +'DžǼ੧ఘⅧ⒇৪@example.com', +); +foreach ($values as $value) { + var_dump(filter_var($value, FILTER_VALIDATE_EMAIL, FILTER_FLAG_EMAIL_RFC6531)); +} +echo "Done\n"; +?> +--EXPECT-- +string(26) "niceändsimple@example.com" +string(25) "véry.çommon@example.com" +string(44) "a.lîttle.lengthy.but.fiñe@dept.example.com" +string(48) "dîsposable.style.émail.with+symbol@example.com" +string(34) "other.émail-with-dash@example.com" +string(35) "üser@[IPv6:2001:db8:1ff::a0b:dbd0]" +string(43) ""verî.uñusual.@.uñusual.com"@example.com" +string(74) ""verî.(),:;<>[]\".VERÎ.\"verî@\ \"verî\".unüsual"@strange.example.com" +string(17) "tést@example.com" +string(23) "tést.child@example.com" +string(24) "tést@xn--exmple-cua.com" +string(18) "tést@xn----zfa.xe" +string(23) "tést@subexample.wizard" +string(23) "tést@[255.255.255.255]" +string(52) "tést@[IPv6:2001:0db8:85a3:08d3:1319:8a2e:0370:7344]" +string(23) "tést@[IPv6:2001::7344]" +string(58) "tést@[IPv6:1111:2222:3333:4444:5555:6666:255.255.255.255]" +string(27) "tést+reference@example.com" +string(26) "üñîçøðé@example.com" +string(28) ""üñîçøðé"@example.com" +string(31) "DžǼ੧ఘⅧ⒇৪@example.com" +Done |