Merge pull request #4216 from MrPetovan/bug/4173-fix-oembed-iframe-url

Fix link attachment display
This commit is contained in:
Michael Vogel 2018-01-13 00:45:32 +01:00 committed by GitHub
commit 70942202c0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 74 additions and 55 deletions

View file

@ -82,7 +82,7 @@ function bb_attachment($return, $simplehtml = false, $tryoembed = true)
} }
} catch (Exception $e) { } catch (Exception $e) {
if ($simplehtml != 4) { if ($simplehtml != 4) {
$return = sprintf('<span class="type-%s">', $data["type"]); $return = sprintf('<div class="type-%s">', $data["type"]);
} }
if ($data["image"] != "") { if ($data["image"] != "") {
@ -97,12 +97,16 @@ function bb_attachment($return, $simplehtml = false, $tryoembed = true)
$return .= sprintf('<h4><a href="%s">%s</a></h4>', $data['url'], $data['title']); $return .= sprintf('<h4><a href="%s">%s</a></h4>', $data['url'], $data['title']);
} }
if (trim($data["description"]) != "") { if ($data["description"] != "" && $data["description"] != $data["title"]) {
$return .= sprintf('<blockquote>%s</blockquote>', trim(bbcode($data["description"]))); $return .= sprintf('<blockquote>%s</blockquote>', trim(bbcode($data["description"])));
} }
if ($data["type"] == "link") {
$return .= sprintf('<h5><a href="%s">%s</a></h5>', $data['url'], parse_url($data['url'], PHP_URL_HOST));
}
if ($simplehtml != 4) { if ($simplehtml != 4) {
$return .= '</span>'; $return .= '</div>';
} }
} }
} }
@ -957,6 +961,28 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $simplehtml = fa
} while ($oldtext != $Text); } while ($oldtext != $Text);
} }
// Set up the parameters for a URL search string
$URLSearchString = "^\[\]";
// Set up the parameters for a MAIL search string
$MAILSearchString = $URLSearchString;
// if the HTML is used to generate plain text, then don't do this search, but replace all URL of that kind to text
if (!$forplaintext) {
// Autolink feature
if ($simplehtml != 7) {
$Text = preg_replace("/([^\]\='".'"'."]|^)(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,\@]+)/ism", '$1<a href="$2" target="_blank">$2</a>', $Text);
} else {
$Text = preg_replace("/([^\]\='".'"'."]|^)(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,\@]+)/ism", '$1[url]$2[/url]', $Text);
$Text = preg_replace_callback("/\[url\]([$URLSearchString]*)\[\/url\]/ism", 'bb_style_url', $Text);
$Text = preg_replace_callback("/\[url\=([$URLSearchString]*)\]([$URLSearchString]*)\[\/url\]/ism", 'bb_style_url', $Text);
}
} else {
$Text = preg_replace("(\[url\]([$URLSearchString]*)\[\/url\])ism", " $1 ", $Text);
$Text = preg_replace_callback("&\[url=([^\[\]]*)\]\[img\](.*)\[\/img\]\[\/url\]&Usi", 'bb_RemovePictureLinks', $Text);
}
// Handle attached links or videos // Handle attached links or videos
$Text = bb_attachment($Text, $simplehtml, $tryoembed); $Text = bb_attachment($Text, $simplehtml, $tryoembed);
@ -966,11 +992,6 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $simplehtml = fa
$Text = str_replace(array("\n", "\r"), array('', ''), $Text); $Text = str_replace(array("\n", "\r"), array('', ''), $Text);
} }
// Set up the parameters for a URL search string
$URLSearchString = "^\[\]";
// Set up the parameters for a MAIL search string
$MAILSearchString = $URLSearchString;
// Remove all hashtag addresses // Remove all hashtag addresses
if ((!$tryoembed || $simplehtml) && !in_array($simplehtml, array(3, 7))) { if ((!$tryoembed || $simplehtml) && !in_array($simplehtml, array(3, 7))) {
$Text = preg_replace("/([#@!])\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism", '$1$3', $Text); $Text = preg_replace("/([#@!])\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism", '$1$3', $Text);
@ -1023,23 +1044,6 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $simplehtml = fa
$expression = "=diaspora://.*?/post/([0-9A-Za-z\-_@.:]{15,254}[0-9A-Za-z])=ism"; $expression = "=diaspora://.*?/post/([0-9A-Za-z\-_@.:]{15,254}[0-9A-Za-z])=ism";
$Text = preg_replace($expression, System::baseUrl()."/display/$1", $Text); $Text = preg_replace($expression, System::baseUrl()."/display/$1", $Text);
// if the HTML is used to generate plain text, then don't do this search, but replace all URL of that kind to text
// if ($simplehtml != 7) {
if (!$forplaintext) {
if ($simplehtml != 7) {
$Text = preg_replace("/([^\]\='".'"'."]|^)(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)/ism", '$1<a href="$2" target="_blank">$2</a>', $Text);
} else {
$Text = preg_replace("/([^\]\='".'"'."]|^)(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)/ism", '$1[url]$2[/url]', $Text);
$Text = preg_replace_callback("/\[url\]([$URLSearchString]*)\[\/url\]/ism", 'bb_style_url', $Text);
$Text = preg_replace_callback("/\[url\=([$URLSearchString]*)\]([$URLSearchString]*)\[\/url\]/ism", 'bb_style_url', $Text);
}
} else {
$Text = preg_replace("(\[url\]([$URLSearchString]*)\[\/url\])ism", " $1 ", $Text);
$Text = preg_replace_callback("&\[url=([^\[\]]*)\]\[img\](.*)\[\/img\]\[\/url\]&Usi", 'bb_RemovePictureLinks', $Text);
}
// }
if ($tryoembed) { if ($tryoembed) {
$Text = preg_replace_callback("/\[url\]([$URLSearchString]*)\[\/url\]/ism", $tryoembed_callback, $Text); $Text = preg_replace_callback("/\[url\]([$URLSearchString]*)\[\/url\]/ism", $tryoembed_callback, $Text);
} }
@ -1237,7 +1241,7 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $simplehtml = fa
// Try to Oembed // Try to Oembed
if ($tryoembed) { if ($tryoembed) {
$Text = preg_replace("/\[video\](.*?\.(ogg|ogv|oga|ogm|webm|mp4))\[\/video\]/ism", '<video src="$1" controls="controls" width="' . $a->videowidth . '" height="' . $a->videoheight . '"><a href="$1">$1</a></video>', $Text); $Text = preg_replace("/\[video\](.*?\.(ogg|ogv|oga|ogm|webm|mp4))\[\/video\]/ism", '<video src="$1" controls="controls" width="' . $a->videowidth . '" height="' . $a->videoheight . '" loop="true"><a href="$1">$1</a></video>', $Text);
$Text = preg_replace("/\[audio\](.*?\.(ogg|ogv|oga|ogm|webm|mp4|mp3))\[\/audio\]/ism", '<audio src="$1" controls="controls"><a href="$1">$1</a></audio>', $Text); $Text = preg_replace("/\[audio\](.*?\.(ogg|ogv|oga|ogm|webm|mp4|mp3))\[\/audio\]/ism", '<audio src="$1" controls="controls"><a href="$1">$1</a></audio>', $Text);
$Text = preg_replace_callback("/\[video\](.*?)\[\/video\]/ism", $tryoembed_callback, $Text); $Text = preg_replace_callback("/\[video\](.*?)\[\/video\]/ism", $tryoembed_callback, $Text);
@ -1351,7 +1355,7 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $simplehtml = fa
// sanitizes src attributes (http and redir URLs for displaying in a web page, cid used for inline images in emails) // sanitizes src attributes (http and redir URLs for displaying in a web page, cid used for inline images in emails)
static $allowed_src_protocols = array('http', 'redir', 'cid'); static $allowed_src_protocols = array('http', 'redir', 'cid');
$Text = preg_replace('#<([^>]*?)(src)="(?!' . implode('|', $allowed_src_protocols) . ')(.*?)"(.*?)>#ism', $Text = preg_replace('#<([^>]*?)(src)="(?!' . implode('|', $allowed_src_protocols) . ')(.*?)"(.*?)>#ism',
'<$1$2=""$4 class="invalid-src" title="' . t('Invalid source protocol') . '">', $Text); '<$1$2=""$4 data-original-src="$3" class="invalid-src" title="' . t('Invalid source protocol') . '">', $Text);
// sanitize href attributes (only whitelisted protocols URLs) // sanitize href attributes (only whitelisted protocols URLs)
// default value for backward compatibility // default value for backward compatibility
@ -1362,7 +1366,7 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $simplehtml = fa
$allowed_link_protocols[] = 'redir/'; $allowed_link_protocols[] = 'redir/';
$regex = '#<([^>]*?)(href)="(?!' . implode('|', $allowed_link_protocols) . ')(.*?)"(.*?)>#ism'; $regex = '#<([^>]*?)(href)="(?!' . implode('|', $allowed_link_protocols) . ')(.*?)"(.*?)>#ism';
$Text = preg_replace($regex, '<$1$2="javascript:void(0)"$4 class="invalid-href" title="' . t('Invalid link protocol') . '">', $Text); $Text = preg_replace($regex, '<$1$2="javascript:void(0)"$4 data-original-href="$3" class="invalid-href" title="' . t('Invalid link protocol') . '">', $Text);
if ($saved_image) { if ($saved_image) {
$Text = bb_replace_images($Text, $saved_image); $Text = bb_replace_images($Text, $saved_image);

View file

@ -90,12 +90,13 @@ function get_old_attachment_data($body) {
* 'title' -> Title of the attachment * 'title' -> Title of the attachment
* 'description' -> Description of the attachment * 'description' -> Description of the attachment
*/ */
function get_attachment_data($body) { function get_attachment_data($body)
{
$data = [];
$data = array(); if (!preg_match("/(.*)\[attachment(.*?)\](.*?)\[\/attachment\](.*)/ism", $body, $match)) {
if (!preg_match("/(.*)\[attachment(.*?)\](.*?)\[\/attachment\](.*)/ism", $body, $match))
return get_old_attachment_data($body); return get_old_attachment_data($body);
}
$attributes = $match[2]; $attributes = $match[2];
@ -103,79 +104,95 @@ function get_attachment_data($body) {
$type = ""; $type = "";
preg_match("/type='(.*?)'/ism", $attributes, $matches); preg_match("/type='(.*?)'/ism", $attributes, $matches);
if ($matches[1] != "") if (x($matches, 1)) {
$type = strtolower($matches[1]); $type = strtolower($matches[1]);
}
preg_match('/type="(.*?)"/ism', $attributes, $matches); preg_match('/type="(.*?)"/ism', $attributes, $matches);
if ($matches[1] != "") if (x($matches, 1)) {
$type = strtolower($matches[1]); $type = strtolower($matches[1]);
}
if ($type == "") if ($type == "") {
return(array()); return [];
}
if (!in_array($type, array("link", "audio", "photo", "video"))) if (!in_array($type, ["link", "audio", "photo", "video"])) {
return(array()); return [];
}
if ($type != "") if ($type != "") {
$data["type"] = $type; $data["type"] = $type;
}
$url = ""; $url = "";
preg_match("/url='(.*?)'/ism", $attributes, $matches); preg_match("/url='(.*?)'/ism", $attributes, $matches);
if ($matches[1] != "") if (x($matches, 1)) {
$url = $matches[1]; $url = $matches[1];
}
preg_match('/url="(.*?)"/ism', $attributes, $matches); preg_match('/url="(.*?)"/ism', $attributes, $matches);
if ($matches[1] != "") if (x($matches, 1)) {
$url = $matches[1]; $url = $matches[1];
}
if ($url != "") if ($url != "") {
$data["url"] = html_entity_decode($url, ENT_QUOTES, 'UTF-8'); $data["url"] = html_entity_decode($url, ENT_QUOTES, 'UTF-8');
}
$title = ""; $title = "";
preg_match("/title='(.*?)'/ism", $attributes, $matches); preg_match("/title='(.*?)'/ism", $attributes, $matches);
if ($matches[1] != "") if (x($matches, 1)) {
$title = $matches[1]; $title = $matches[1];
}
preg_match('/title="(.*?)"/ism', $attributes, $matches); preg_match('/title="(.*?)"/ism', $attributes, $matches);
if ($matches[1] != "") if (x($matches, 1)) {
$title = $matches[1]; $title = $matches[1];
}
if ($title != "") { if ($title != "") {
$title = bbcode(html_entity_decode($title, ENT_QUOTES, 'UTF-8'), false, false, true); $title = bbcode(html_entity_decode($title, ENT_QUOTES, 'UTF-8'), false, false, true);
$title = html_entity_decode($title, ENT_QUOTES, 'UTF-8'); $title = html_entity_decode($title, ENT_QUOTES, 'UTF-8');
$title = str_replace(array("[", "]"), array("&#91;", "&#93;"), $title); $title = str_replace(["[", "]"], ["&#91;", "&#93;"], $title);
$data["title"] = $title; $data["title"] = $title;
} }
$image = ""; $image = "";
preg_match("/image='(.*?)'/ism", $attributes, $matches); preg_match("/image='(.*?)'/ism", $attributes, $matches);
if ($matches[1] != "") if (x($matches, 1)) {
$image = $matches[1]; $image = $matches[1];
}
preg_match('/image="(.*?)"/ism', $attributes, $matches); preg_match('/image="(.*?)"/ism', $attributes, $matches);
if ($matches[1] != "") if (x($matches, 1)) {
$image = $matches[1]; $image = $matches[1];
}
if ($image != "") if ($image != "") {
$data["image"] = html_entity_decode($image, ENT_QUOTES, 'UTF-8'); $data["image"] = html_entity_decode($image, ENT_QUOTES, 'UTF-8');
}
$preview = ""; $preview = "";
preg_match("/preview='(.*?)'/ism", $attributes, $matches); preg_match("/preview='(.*?)'/ism", $attributes, $matches);
if ($matches[1] != "") if (x($matches, 1)) {
$preview = $matches[1]; $preview = $matches[1];
}
preg_match('/preview="(.*?)"/ism', $attributes, $matches); preg_match('/preview="(.*?)"/ism', $attributes, $matches);
if ($matches[1] != "") if (x($matches, 1)) {
$preview = $matches[1]; $preview = $matches[1];
}
if ($preview != "") if ($preview != "") {
$data["preview"] = html_entity_decode($preview, ENT_QUOTES, 'UTF-8'); $data["preview"] = html_entity_decode($preview, ENT_QUOTES, 'UTF-8');
}
$data["description"] = trim($match[3]); $data["description"] = trim($match[3]);
$data["after"] = trim($match[4]); $data["after"] = trim($match[4]);
return($data); return $data;
} }
function get_attached_data($body, $item = array()) { function get_attached_data($body, $item = array()) {

View file

@ -131,14 +131,12 @@ class OEmbed
$j->embedurl = $embedurl; $j->embedurl = $embedurl;
// If fetching information doesn't work, then improve via internal functions // If fetching information doesn't work, then improve via internal functions
if (($j->type == "error") || ($no_rich_type && ($j->type == "rich"))) { if ($no_rich_type && ($j->type == "rich")) {
$data = ParseUrl::getSiteinfoCached($embedurl, true, false); $data = ParseUrl::getSiteinfoCached($embedurl, true, false);
$j->type = $data["type"]; $j->type = $data["type"];
if ($j->type == "photo") { if ($j->type == "photo") {
$j->url = $data["url"]; $j->url = $data["url"];
//$j->width = $data["images"][0]["width"];
//$j->height = $data["images"][0]["height"];
} }
if (isset($data["title"])) { if (isset($data["title"])) {