diff options
Diffstat (limited to 'phpBB/includes')
| -rw-r--r-- | phpBB/includes/acp/acp_bbcodes.php | 5 | ||||
| -rw-r--r-- | phpBB/includes/acp/acp_forums.php | 33 | ||||
| -rw-r--r-- | phpBB/includes/functions.php | 166 | ||||
| -rw-r--r-- | phpBB/includes/functions_compatibility.php | 22 | ||||
| -rw-r--r-- | phpBB/includes/functions_user.php | 2 | ||||
| -rw-r--r-- | phpBB/includes/utf/utf_tools.php | 43 | 
6 files changed, 82 insertions, 189 deletions
diff --git a/phpBB/includes/acp/acp_bbcodes.php b/phpBB/includes/acp/acp_bbcodes.php index 5360ab0f7b..a67f3c54f9 100644 --- a/phpBB/includes/acp/acp_bbcodes.php +++ b/phpBB/includes/acp/acp_bbcodes.php @@ -211,11 +211,6 @@ class acp_bbcodes  						$test = $data['bbcode_tag'];  					} -					if (!preg_match('%\\[' . $test . '[^]]*].*?\\[/' . $test . ']%s', $bbcode_match)) -					{ -						trigger_error($user->lang['BBCODE_OPEN_ENDED_TAG'] . adm_back_link($this->u_action), E_USER_WARNING); -					} -  					if (strlen($data['bbcode_tag']) > 16)  					{  						trigger_error($user->lang['BBCODE_TAG_TOO_LONG'] . adm_back_link($this->u_action), E_USER_WARNING); diff --git a/phpBB/includes/acp/acp_forums.php b/phpBB/includes/acp/acp_forums.php index af427eca04..572ae3692a 100644 --- a/phpBB/includes/acp/acp_forums.php +++ b/phpBB/includes/acp/acp_forums.php @@ -986,10 +986,20 @@ class acp_forums  			$errors[] = $user->lang['FORUM_NAME_EMPTY'];  		} -		// No Emojis +		/** +		 * Replace Emojis and other 4bit UTF-8 chars not allowed by MySql to UCR / NCR. +		 * Using their Numeric Character Reference's Hexadecimal notation. +		 */ +		$forum_data_ary['forum_name'] = utf8_encode_ucr($forum_data_ary['forum_name']); + +		/** +		 * This should never happen again. +		 * Leaving the fallback here just in case there will be the need of it. +		 */  		if (preg_match_all('/[\x{10000}-\x{10FFFF}]/u', $forum_data_ary['forum_name'], $matches))  		{  			$character_list = implode('<br>', $matches[0]); +  			$errors[] = $user->lang('FORUM_NAME_EMOJI', $character_list);  		} @@ -1423,8 +1433,8 @@ class acp_forums  		* This event may be triggered, when a forum is deleted  		*  		* @event core.acp_manage_forums_move_children -		* @var	int		from_id		If of the current parent forum -		* @var	int		to_id		If of the new parent forum +		* @var	int		from_id		Id of the current parent forum +		* @var	int		to_id		Id of the new parent forum  		* @var	array	errors		Array of errors, should be strings and not  		*							language key.  		* @since 3.1.0-a1 @@ -1529,8 +1539,8 @@ class acp_forums  		* Event when we move content from one forum to another  		*  		* @event core.acp_manage_forums_move_content -		* @var	int		from_id		If of the current parent forum -		* @var	int		to_id		If of the new parent forum +		* @var	int		from_id		Id of the current parent forum +		* @var	int		to_id		Id of the new parent forum  		* @var	bool	sync		Shall we sync the "to"-forum's data  		* @var	array	errors		Array of errors, should be strings and not  		*							language key. If this array is not empty, @@ -1576,6 +1586,19 @@ class acp_forums  			$db->sql_query($sql);  		} +		/** +		 * Event when content has been moved from one forum to another +		 * +		 * @event core.acp_manage_forums_move_content_after +		 * @var	int		from_id		Id of the current parent forum +		 * @var	int		to_id		Id of the new parent forum +		 * @var	bool	sync		Shall we sync the "to"-forum's data +		 * +		 * @since 3.2.9-RC1 +		 */ +		$vars = array('from_id', 'to_id', 'sync'); +		extract($phpbb_dispatcher->trigger_event('core.acp_manage_forums_move_content_after', compact($vars))); +  		if ($sync)  		{  			// Delete ghost topics that link back to the same forum then resync counters diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php index 3227a21e26..30f9734efd 100644 --- a/phpBB/includes/functions.php +++ b/phpBB/includes/functions.php @@ -3141,172 +3141,6 @@ function phpbb_inet_pton($address)  	return false;  } -/** -* Wrapper for php's checkdnsrr function. -* -* @param string $host	Fully-Qualified Domain Name -* @param string $type	Resource record type to lookup -*						Supported types are: MX (default), A, AAAA, NS, TXT, CNAME -*						Other types may work or may not work -* -* @return mixed		true if entry found, -*					false if entry not found, -*					null if this function is not supported by this environment -* -* Since null can also be returned, you probably want to compare the result -* with === true or === false, -*/ -function phpbb_checkdnsrr($host, $type = 'MX') -{ -	// The dot indicates to search the DNS root (helps those having DNS prefixes on the same domain) -	if (substr($host, -1) == '.') -	{ -		$host_fqdn = $host; -		$host = substr($host, 0, -1); -	} -	else -	{ -		$host_fqdn = $host . '.'; -	} -	// $host		has format	some.host.example.com -	// $host_fqdn	has format	some.host.example.com. - -	// If we're looking for an A record we can use gethostbyname() -	if ($type == 'A' && function_exists('gethostbyname')) -	{ -		return (@gethostbyname($host_fqdn) == $host_fqdn) ? false : true; -	} - -	if (function_exists('checkdnsrr')) -	{ -		return checkdnsrr($host_fqdn, $type); -	} - -	if (function_exists('dns_get_record')) -	{ -		// dns_get_record() expects an integer as second parameter -		// We have to convert the string $type to the corresponding integer constant. -		$type_constant = 'DNS_' . $type; -		$type_param = (defined($type_constant)) ? constant($type_constant) : DNS_ANY; - -		// dns_get_record() might throw E_WARNING and return false for records that do not exist -		$resultset = @dns_get_record($host_fqdn, $type_param); - -		if (empty($resultset) || !is_array($resultset)) -		{ -			return false; -		} -		else if ($type_param == DNS_ANY) -		{ -			// $resultset is a non-empty array -			return true; -		} - -		foreach ($resultset as $result) -		{ -			if ( -				isset($result['host']) && $result['host'] == $host && -				isset($result['type']) && $result['type'] == $type -			) -			{ -				return true; -			} -		} - -		return false; -	} - -	// If we're on Windows we can still try to call nslookup via exec() as a last resort -	if (DIRECTORY_SEPARATOR == '\\' && function_exists('exec')) -	{ -		@exec('nslookup -type=' . escapeshellarg($type) . ' ' . escapeshellarg($host_fqdn), $output); - -		// If output is empty, the nslookup failed -		if (empty($output)) -		{ -			return NULL; -		} - -		foreach ($output as $line) -		{ -			$line = trim($line); - -			if (empty($line)) -			{ -				continue; -			} - -			// Squash tabs and multiple whitespaces to a single whitespace. -			$line = preg_replace('/\s+/', ' ', $line); - -			switch ($type) -			{ -				case 'MX': -					if (stripos($line, "$host MX") === 0) -					{ -						return true; -					} -				break; - -				case 'NS': -					if (stripos($line, "$host nameserver") === 0) -					{ -						return true; -					} -				break; - -				case 'TXT': -					if (stripos($line, "$host text") === 0) -					{ -						return true; -					} -				break; - -				case 'CNAME': -					if (stripos($line, "$host canonical name") === 0) -					{ -						return true; -					} -				break; - -				default: -				case 'AAAA': -					// AAAA records returned by nslookup on Windows XP/2003 have this format. -					// Later Windows versions use the A record format below for AAAA records. -					if (stripos($line, "$host AAAA IPv6 address") === 0) -					{ -						return true; -					} -				// No break - -				case 'A': -					if (!empty($host_matches)) -					{ -						// Second line -						if (stripos($line, "Address: ") === 0) -						{ -							return true; -						} -						else -						{ -							$host_matches = false; -						} -					} -					else if (stripos($line, "Name: $host") === 0) -					{ -						// First line -						$host_matches = true; -					} -				break; -			} -		} - -		return false; -	} - -	return NULL; -} -  // Handler, header and footer  /** diff --git a/phpBB/includes/functions_compatibility.php b/phpBB/includes/functions_compatibility.php index b5b60e118e..1f9131c9c0 100644 --- a/phpBB/includes/functions_compatibility.php +++ b/phpBB/includes/functions_compatibility.php @@ -601,3 +601,25 @@ function upload_attachment($form_name, $forum_id, $local = false, $local_storage  	return $file;  } + +/** +* Wrapper for php's checkdnsrr function. +* +* @param string $host	Fully-Qualified Domain Name +* @param string $type	Resource record type to lookup +*						Supported types are: MX (default), A, AAAA, NS, TXT, CNAME +*						Other types may work or may not work +* +* @return mixed		true if entry found, +*					false if entry not found, +*					null if this function is not supported by this environment +* +* Since null can also be returned, you probably want to compare the result +* with === true or === false, +* +* @deprecated 3.3.0-b2 (To be removed: 4.0.0) +*/ +function phpbb_checkdnsrr($host, $type = 'MX') +{ +	return checkdnsrr($host, $type); +} diff --git a/phpBB/includes/functions_user.php b/phpBB/includes/functions_user.php index e0b6a9d0c6..7dd850111e 100644 --- a/phpBB/includes/functions_user.php +++ b/phpBB/includes/functions_user.php @@ -1910,7 +1910,7 @@ function phpbb_validate_email($email, $config = null)  	{  		list(, $domain) = explode('@', $email); -		if (phpbb_checkdnsrr($domain, 'A') === false && phpbb_checkdnsrr($domain, 'MX') === false) +		if (checkdnsrr($domain, 'A') === false && checkdnsrr($domain, 'MX') === false)  		{  			return 'DOMAIN_NO_MX_RECORD';  		} diff --git a/phpBB/includes/utf/utf_tools.php b/phpBB/includes/utf/utf_tools.php index 89de454427..bb155aeae5 100644 --- a/phpBB/includes/utf/utf_tools.php +++ b/phpBB/includes/utf/utf_tools.php @@ -418,24 +418,43 @@ function utf8_recode($string, $encoding)  }  /** -* Replace all UTF-8 chars that are not in ASCII with their NCR -* -* @param	string	$text		UTF-8 string in NFC -* @return	string				ASCII string using NCRs for non-ASCII chars -*/ + * Replace some special UTF-8 chars that are not in ASCII with their UCR. + * using their Numeric Character Reference's Hexadecimal notation. + * + * Doesn't interfere with Japanese or Cyrillic etc. + * Unicode character visualization will depend on the character support + * of your web browser and the fonts installed on your system. + * + * @see https://en.wikibooks.org/wiki/Unicode/Character_reference/1F000-1FFFF + * + * @param	string	$text		UTF-8 string in NFC + * @return	string				ASCII string using NCR for non-ASCII chars + */ +function utf8_encode_ucr($text) +{ +	return preg_replace_callback('/[\\xF0-\\xF4].../', 'utf8_encode_ncr_callback', $text); +} + +/** + * Replace all UTF-8 chars that are not in ASCII with their NCR + * using their Numeric Character Reference's Hexadecimal notation. + * + * @param	string	$text		UTF-8 string in NFC + * @return	string				ASCII string using NCRs for non-ASCII chars + */  function utf8_encode_ncr($text)  {  	return preg_replace_callback('#[\\xC2-\\xF4][\\x80-\\xBF]{1,3}#', 'utf8_encode_ncr_callback', $text);  }  /** -* Callback used in encode_ncr() -* -* Takes a UTF-8 char and replaces it with its NCR. Attention, $m is an array -* -* @param	array	$m			0-based numerically indexed array passed by preg_replace_callback() -* @return	string				A HTML NCR if the character is valid, or the original string otherwise -*/ + * Callback used in utf8_encode_ncr() and utf8_encode_ucr() + * + * Takes a UTF-8 char and replaces it with its NCR. Attention, $m is an array + * + * @param	array	$m			0-based numerically indexed array passed by preg_replace_callback() + * @return	string				A HTML NCR if the character is valid, or the original string otherwise + */  function utf8_encode_ncr_callback($m)  {  	return '&#' . utf8_ord($m[0]) . ';';  | 
