From 988a52cf1acdfdc43577c6a58d7f29b3c25548ec Mon Sep 17 00:00:00 2001 From: epriestley Date: Fri, 23 Jun 2017 07:34:29 -0700 Subject: [PATCH] Fix ambiguous URI parsing in Youtube Remarkup rule Summary: Fixes T12867. Also: - Simplify the code a little. - Stop mutating this on text/mobile -- there's no inherent value in the "youtu.be" link so I think this just changes the text the user wrote unnecessarily. Test Plan: {F5013804} Reviewers: chad Reviewed By: chad Maniphest Tasks: T12867 Differential Revision: https://secure.phabricator.com/D18149 --- .../rule/PhabricatorYoutubeRemarkupRule.php | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/src/infrastructure/markup/rule/PhabricatorYoutubeRemarkupRule.php b/src/infrastructure/markup/rule/PhabricatorYoutubeRemarkupRule.php index bad8e0eacf..25422b970d 100644 --- a/src/infrastructure/markup/rule/PhabricatorYoutubeRemarkupRule.php +++ b/src/infrastructure/markup/rule/PhabricatorYoutubeRemarkupRule.php @@ -2,34 +2,37 @@ final class PhabricatorYoutubeRemarkupRule extends PhutilRemarkupRule { - private $uri; - public function getPriority() { return 350.0; } public function apply($text) { - $this->uri = new PhutilURI($text); - - if ($this->uri->getDomain() && - preg_match('/(^|\.)youtube\.com$/', $this->uri->getDomain()) && - idx($this->uri->getQueryParams(), 'v')) { - return $this->markupYoutubeLink(); + try { + $uri = new PhutilURI($text); + } catch (Exception $ex) { + return $text; } - return $text; - } + $domain = $uri->getDomain(); + if (!preg_match('/(^|\.)youtube\.com\z/', $domain)) { + return $text; + } + + $params = $uri->getQueryParams(); + $v_param = idx($params, 'v'); + if (!strlen($v_param)) { + return $text; + } - public function markupYoutubeLink() { - $v = idx($this->uri->getQueryParams(), 'v'); $text_mode = $this->getEngine()->isTextMode(); $mail_mode = $this->getEngine()->isHTMLMailMode(); if ($text_mode || $mail_mode) { - return $this->getEngine()->storeText('http://youtu.be/'.$v); + return $text; } - $youtube_src = 'https://www.youtube.com/embed/'.$v; + $youtube_src = 'https://www.youtube.com/embed/'.$v_param; + $iframe = $this->newTag( 'div', array( @@ -45,6 +48,7 @@ final class PhabricatorYoutubeRemarkupRule extends PhutilRemarkupRule { 'frameborder' => 0, ), '')); + return $this->getEngine()->storeText($iframe); }