/**
* RFC 822 Email address list validation Utility
*
- * PHP versions 4 and 5
+ * PHP version 5
*
* LICENSE:
*
* @author Chuck Hagenbuch <chuck@horde.org
* @copyright 2001-2010 Richard Heyes
* @license http://opensource.org/licenses/bsd-license.php New BSD License
- * @version CVS: $Id: RFC822.php 294749 2010-02-08 08:22:25Z clockwerx $
+ * @version CVS: $Id$
* @link http://pear.php.net/package/Mail/
*/
*
* @author Richard Heyes <richard@phpguru.org>
* @author Chuck Hagenbuch <chuck@horde.org>
- * @version $Revision: 294749 $
+ * @version $Revision$
* @license BSD
* @package Mail
*/
* Sets up the object. The address must either be set here or when
* calling parseAddressList(). One or the other.
*
- * @access public
* @param string $address The address(es) to validate.
* @param string $default_domain Default domain/host etc. If not supplied, will be set to localhost.
* @param boolean $nest_groups Whether to return the structure with groups nested for easier viewing.
*
* @return object Mail_RFC822 A new Mail_RFC822 object.
*/
- function Mail_RFC822($address = null, $default_domain = null, $nest_groups = null, $validate = null, $limit = null)
+ public function __construct($address = null, $default_domain = null, $nest_groups = null, $validate = null, $limit = null)
{
if (isset($address)) $this->address = $address;
if (isset($default_domain)) $this->default_domain = $default_domain;
* Starts the whole process. The address must either be set here
* or when creating the object. One or the other.
*
- * @access public
* @param string $address The address(es) to validate.
* @param string $default_domain Default domain/host etc.
* @param boolean $nest_groups Whether to return the structure with groups nested for easier viewing.
*
* @return array A structured array of addresses.
*/
- function parseAddressList($address = null, $default_domain = null, $nest_groups = null, $validate = null, $limit = null)
+ public function parseAddressList($address = null, $default_domain = null, $nest_groups = null, $validate = null, $limit = null)
{
if (!isset($this) || !isset($this->mailRFC822)) {
$obj = new Mail_RFC822($address, $default_domain, $nest_groups, $validate, $limit);
/**
* Splits an address into separate addresses.
*
- * @access private
* @param string $address The addresses to split.
* @return boolean Success or failure.
*/
- function _splitAddresses($address)
+ protected function _splitAddresses($address)
{
if (!empty($this->limit) && count($this->addresses) == $this->limit) {
return '';
/**
* Checks for a group at the start of the string.
*
- * @access private
* @param string $address The address to check.
* @return boolean Whether or not there is a group at the start of the string.
*/
- function _isGroup($address)
+ protected function _isGroup($address)
{
// First comma not in quotes, angles or escaped:
$parts = explode(',', $address);
/**
* A common function that will check an exploded string.
*
- * @access private
* @param array $parts The exloded string.
* @param string $char The char that was exploded on.
* @return mixed False if the string contains unclosed quotes/brackets, or the string on success.
*/
- function _splitCheck($parts, $char)
+ protected function _splitCheck($parts, $char)
{
$string = $parts[0];
/**
* Checks if a string has unclosed quotes or not.
*
- * @access private
* @param string $string The string to check.
* @return boolean True if there are unclosed quotes inside the string,
* false otherwise.
*/
- function _hasUnclosedQuotes($string)
+ protected function _hasUnclosedQuotes($string)
{
$string = trim($string);
$iMax = strlen($string);
* Checks if a string has an unclosed brackets or not. IMPORTANT:
* This function handles both angle brackets and square brackets;
*
- * @access private
* @param string $string The string to check.
* @param string $chars The characters to check for.
* @return boolean True if there are unclosed brackets inside the string, false otherwise.
*/
- function _hasUnclosedBrackets($string, $chars)
+ protected function _hasUnclosedBrackets($string, $chars)
{
$num_angle_start = substr_count($string, $chars[0]);
$num_angle_end = substr_count($string, $chars[1]);
/**
* Sub function that is used only by hasUnclosedBrackets().
*
- * @access private
* @param string $string The string to check.
* @param integer &$num The number of occurences.
* @param string $char The character to count.
* @return integer The number of occurences of $char in $string, adjusted for backslashes.
*/
- function _hasUnclosedBracketsSub($string, &$num, $char)
+ protected function _hasUnclosedBracketsSub($string, &$num, $char)
{
$parts = explode($char, $string);
for ($i = 0; $i < count($parts); $i++){
/**
* Function to begin checking the address.
*
- * @access private
* @param string $address The address to validate.
* @return mixed False on failure, or a structured array of address information on success.
*/
- function _validateAddress($address)
+ protected function _validateAddress($address)
{
$is_group = false;
$addresses = array();
$addresses[] = $address['address'];
}
- // Check that $addresses is set, if address like this:
- // Groupname:;
- // Then errors were appearing.
- if (!count($addresses)){
- $this->error = 'Empty group.';
- return false;
- }
-
// Trim the whitespace from all of the address strings.
array_map('trim', $addresses);
/**
* Function to validate a phrase.
*
- * @access private
* @param string $phrase The phrase to check.
* @return boolean Success or failure.
*/
- function _validatePhrase($phrase)
+ protected function _validatePhrase($phrase)
{
// Splits on one or more Tab or space.
$parts = preg_split('/[ \\x09]+/', $phrase, -1, PREG_SPLIT_NO_EMPTY);
* can split a list of addresses up before encoding personal names
* (umlauts, etc.), for example.
*
- * @access private
* @param string $atom The string to check.
* @return boolean Success or failure.
*/
- function _validateAtom($atom)
+ protected function _validateAtom($atom)
{
if (!$this->validate) {
// Validation has been turned off; assume the atom is okay.
* Function to validate quoted string, which is:
* quoted-string = <"> *(qtext/quoted-pair) <">
*
- * @access private
* @param string $qstring The string to check
* @return boolean Success or failure.
*/
- function _validateQuotedString($qstring)
+ protected function _validateQuotedString($qstring)
{
// Leading and trailing "
$qstring = substr($qstring, 1, -1);
* mailbox = addr-spec ; simple address
* / phrase route-addr ; name and route-addr
*
- * @access public
* @param string &$mailbox The string to check.
* @return boolean Success or failure.
*/
- function validateMailbox(&$mailbox)
+ public function validateMailbox(&$mailbox)
{
// A couple of defaults.
$phrase = '';
* Angle brackets have already been removed at the point of
* getting to this function.
*
- * @access private
* @param string $route_addr The string to check.
* @return mixed False on failure, or an array containing validated address/route information on success.
*/
- function _validateRouteAddr($route_addr)
+ protected function _validateRouteAddr($route_addr)
{
// Check for colon.
if (strpos($route_addr, ':') !== false) {
* Function to validate a route, which is:
* route = 1#("@" domain) ":"
*
- * @access private
* @param string $route The string to check.
* @return mixed False on failure, or the validated $route on success.
*/
- function _validateRoute($route)
+ protected function _validateRoute($route)
{
// Split on comma.
$domains = explode(',', trim($route));
*
* domain = sub-domain *("." sub-domain)
*
- * @access private
* @param string $domain The string to check.
* @return mixed False on failure, or the validated domain on success.
*/
- function _validateDomain($domain)
+ protected function _validateDomain($domain)
{
// Note the different use of $subdomains and $sub_domains
$subdomains = explode('.', $domain);
* Function to validate a subdomain:
* subdomain = domain-ref / domain-literal
*
- * @access private
* @param string $subdomain The string to check.
* @return boolean Success or failure.
*/
- function _validateSubdomain($subdomain)
+ protected function _validateSubdomain($subdomain)
{
if (preg_match('|^\[(.*)]$|', $subdomain, $arr)){
if (!$this->_validateDliteral($arr[1])) return false;
* Function to validate a domain literal:
* domain-literal = "[" *(dtext / quoted-pair) "]"
*
- * @access private
* @param string $dliteral The string to check.
* @return boolean Success or failure.
*/
- function _validateDliteral($dliteral)
+ protected function _validateDliteral($dliteral)
{
return !preg_match('/(.)[][\x0D\\\\]/', $dliteral, $matches) && $matches[1] != '\\';
}
*
* addr-spec = local-part "@" domain
*
- * @access private
* @param string $addr_spec The string to check.
* @return mixed False on failure, or the validated addr-spec on success.
*/
- function _validateAddrSpec($addr_spec)
+ protected function _validateAddrSpec($addr_spec)
{
$addr_spec = trim($addr_spec);
* Function to validate the local part of an address:
* local-part = word *("." word)
*
- * @access private
* @param string $local_part
* @return mixed False on failure, or the validated local part on success.
*/
- function _validateLocalPart($local_part)
+ protected function _validateLocalPart($local_part)
{
$parts = explode('.', $local_part);
$words = array();
// Split the local_part into words.
- while (count($parts) > 0){
+ while (count($parts) > 0) {
$words[] = $this->_splitCheck($parts, '.');
for ($i = 0; $i < $this->index + 1; $i++) {
array_shift($parts);
// Validate each word.
foreach ($words as $word) {
+ // word cannot be empty (#17317)
+ if ($word === '') {
+ return false;
+ }
// If this word contains an unquoted space, it is invalid. (6.2.4)
if (strpos($word, ' ') && $word[0] !== '"')
{
* @param string $data Addresses to count
* @return int Approximate count
*/
- function approximateCount($data)
+ public function approximateCount($data)
{
return count(preg_split('/(?<!\\\\),/', $data));
}
* @return mixed False if it fails, an indexed array
* username/domain if it matches
*/
- function isValidInetAddress($data, $strict = false)
+ public function isValidInetAddress($data, $strict = false)
{
$regex = $strict ? '/^([.0-9a-z_+-]+)@(([0-9a-z-]+\.)+[0-9a-z]{2,})$/i' : '/^([*+!.&#$|\'\\%\/0-9a-z^_`{}=?~:-]+)@(([0-9a-z-]+\.)+[0-9a-z]{2,})$/i';
if (preg_match($regex, trim($data), $matches)) {