URLs for Internal/External links do not allow the space character.
If the value of the URL contains a space, validation fails and does not allow to add the URL.
If '%20' is used for space, the link is then converted to '%2520' which translates the Encoding twice.
<?php
function _block_titlelink_validate_url($url) {
$text = $url;
// These constants were heisted from the field_module.
// Check if they exist
if(!defined('LINK_EXTERNAL')) {
define('LINK_EXTERNAL', 'external');
}
if(!defined('LINK_INTERNAL')) {
define('LINK_INTERNAL', 'internal');
}
if(!defined('LINK_FRONT')) {
define('LINK_FRONT', 'front');
}
if(!defined('LINK_EMAIL')) {
define('LINK_EMAIL', 'email');
}
if(!defined('LINK_NEWS')) {
define('LINK_NEWS', 'news');
}
if(!defined('LINK_DOMAINS')) {
define('LINK_DOMAINS', 'aero|arpa|asia|biz|com|cat|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel|mobi|local');
}
$LINK_ICHARS_DOMAIN = (string) html_entity_decode(implode("", array(
"æ", // æ
"Æ", // Æ
"ø", // ø
"Ø", // Ø
"å", // å
"Å", // Å
"ä", // ä
"Ä", // Ä
"ö", // ö
"Ö", // Ö
"ü", // ü
"Ü", // Ü
"Ñ", // Ñ
"ñ", // ñ
)), ENT_QUOTES, 'UTF-8');
$LINK_ICHARS = $LINK_ICHARS_DOMAIN . (string) html_entity_decode(implode("", array(
"ß", // ß
)), ENT_QUOTES, 'UTF-8');
$allowed_protocols = variable_get('filter_allowed_protocols', array('http', 'https', 'ftp', 'news', 'nntp', 'telnet', 'mailto', 'irc', 'ssh', 'sftp', 'webcal'));
$protocol = '(('. implode("|", $allowed_protocols) .'):\/\/)';
$authentication = '(([a-z0-9%' . $LINK_ICHARS . ']+(:[a-z0-9%'. $LINK_ICHARS . '!]*)?)?@)';
$domain = '(([a-z0-9' . $LINK_ICHARS_DOMAIN . ']([a-z0-9'. $LINK_ICHARS_DOMAIN . '\-_\[\]])*)(\.(([a-z0-9' . $LINK_ICHARS_DOMAIN . '\-_\[\]])+\.)*('. LINK_DOMAINS .'|[a-z]{2}))?)';
$ipv4 = '([0-9]{1,3}(\.[0-9]{1,3}){3})';
$ipv6 = '([0-9a-fA-F]{1,4}(\:[0-9a-fA-F]{1,4}){7})';
$port = '(:([0-9]{1,5}))';
// Pattern specific to external links.
$external_pattern = '/^'. $protocol .'?'. $authentication .'?('. $domain .'|'. $ipv4 .'|'. $ipv6 .' |localhost)'. $port .'?';
// Pattern specific to internal links.
$internal_pattern = "/^([a-z0-9". $LINK_ICHARS ."_\-+\[\]]+)";
$internal_pattern_file = "/^([a-z0-9". $LINK_ICHARS ."_\-+\[\]\.]+)$/i";
$directories = "(\/[a-z0-9". $LINK_ICHARS ."_\-\.~+%=& ,$'!():;*@\[\]]*)*";
// Yes, four backslashes == a single backslash.
$query = "(\/?\?([?a-z0-9". $LINK_ICHARS ."+_|\-\.\/\\\\%=&,$'():;*@\[\]{} ]*))";
$anchor = "(#[a-z0-9". $LINK_ICHARS ."_\-\.~+%=& ,$'():;*@\[\]\/\?]*)";
// The rest of the path for a standard URL.
$end = $directories .'?'. $query .'?'. $anchor .'?'.'$/i';
$message_id = '[^@].*@'. $domain;
$newsgroup_name = '([0-9a-z+-]*\.)*[0-9a-z+-]*';
$news_pattern = '/^news:('. $newsgroup_name .'|'. $message_id .')$/i';
$user = '[a-zA-Z0-9'. $LINK_ICHARS .'_\-\.\+\^!#\$%&*+\/\=\?\`\|\{\}~\'\[\]]+';
$email_pattern = '/^mailto:'. $user .'@'.'('. $domain .'|'. $ipv4 .'|'. $ipv6 .'|localhost)'. $query .'?$/';
if (strpos($text, '<front>') === 0) {
return LINK_FRONT;
}
if (in_array('mailto', $allowed_protocols) && preg_match($email_pattern, $text)) {
return LINK_EMAIL;
}
if (in_array('news', $allowed_protocols) && preg_match($news_pattern, $text)) {
return LINK_NEWS;
}
if (preg_match($internal_pattern . $end, $text)) {
return LINK_INTERNAL;
}
if (preg_match($external_pattern . $end, $text)) {
return LINK_EXTERNAL;
}
if (preg_match($internal_pattern_file, $text)) {
return LINK_INTERNAL;
}
return FALSE;
}
?>
Line 264: Added Space between "& ,$"
$directories = "(\/[a-z0-9". $LINK_ICHARS ."_\-\.~+%=& ,$'!():;*@\[\]]*)*";
Line 267: Added Space between "& ,$"
$anchor = "(#[a-z0-9". $LINK_ICHARS ."_\-\.~+%=& ,$'():;*@\[\]\/\?]*)";
| Comment | File | Size | Author |
|---|---|---|---|
| #2 | block_titlelink-2240109-2.patch | 915 bytes | cs_shadow |
Comments
Comment #1
adammaloneThanks for your work on this - could you please upload a patch to this issue so I can apply it for testing. Instructions for patching may be found here.
Comment #2
cs_shadow commentedAttached is a patch with changes suggested in the issue description.
Comment #4
anybodyFixed in next release. Thanks a lot!