From ae72bb929acc01260a695bf808120c66ba0e559d Mon Sep 17 00:00:00 2001 From: reganlawton Date: Fri, 3 Nov 2023 09:47:05 +0930 Subject: [PATCH 1/5] feat: Update embed/embed to v4 for support with newer plugins composer.json: - Update embed/embed version to v4.4 FallbackAdapter.php: - Replace Adapter class with EmbedAdapter class - Remove init() function - Remove getCode() function - Inherit from new EmbedAdapter class OembedService.php: - Replace Adapter class with EmbedAdapter class - Replace Utils class with wrav\oembed\adapters\EmbedAdapter class - Modify getOEmbed() to use Embed class for fetching oembed data - Modify create() to initialize EmbedAdapter with oembed data --- CHANGELOG.md | 5 ++++ composer.json | 2 +- src/adapters/EmbedAdapter.php | 41 +++++++++++++++++++++++++++ src/adapters/FallbackAdapter.php | 20 +------------ src/services/OembedService.php | 48 ++++++++++++++++++++------------ 5 files changed, 78 insertions(+), 38 deletions(-) create mode 100755 src/adapters/EmbedAdapter.php diff --git a/CHANGELOG.md b/CHANGELOG.md index 3be5407..94f1442 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # oEmbed Changelog +## 3.0.0 - 2023-11-04 + +### Update +- Update embed/embed to v4 to allow for support with newer plugins. + ## 2.3.1 - 2023-10-11 ### Update diff --git a/composer.json b/composer.json index a4ad4f9..8e54558 100755 --- a/composer.json +++ b/composer.json @@ -31,7 +31,7 @@ ], "require": { "craftcms/cms": "^4.0", - "embed/embed": "^3.3", + "embed/embed": "^v4.4", "ext-dom": "*" }, "repositories": [ diff --git a/src/adapters/EmbedAdapter.php b/src/adapters/EmbedAdapter.php new file mode 100755 index 0000000..731ffd0 --- /dev/null +++ b/src/adapters/EmbedAdapter.php @@ -0,0 +1,41 @@ +data = $data; + } + + public function __call($name, $arguments) + { + return $this->data[$name] ?? null; + } + + public function __get($name) + { + return $this->data[$name] ?? null; + } + + public function __toString() + { + return (string)$this->getCode(); + } + + public function getCode() + { + return isset($this->data['html']) ? $this->data['html'] : ''; + } +} diff --git a/src/adapters/FallbackAdapter.php b/src/adapters/FallbackAdapter.php index 70ec028..3e797a2 100755 --- a/src/adapters/FallbackAdapter.php +++ b/src/adapters/FallbackAdapter.php @@ -10,24 +10,6 @@ namespace wrav\oembed\adapters; -use Embed\Adapters\Adapter; -use Embed\Utils; - -class FallbackAdapter extends Adapter +class FallbackAdapter extends EmbedAdapter { - protected function init() - { - $this->providers = []; - $this->height = null; - $this->width = null; - } - - public function getCode() - { - if (!$this->url) { - return Utils::iframe($this->url); - } - - return null; - } } diff --git a/src/services/OembedService.php b/src/services/OembedService.php index f18bf64..4d6419a 100755 --- a/src/services/OembedService.php +++ b/src/services/OembedService.php @@ -15,15 +15,13 @@ use craft\helpers\Template; use craft\helpers\UrlHelper; use DOMDocument; -use Embed\Adapters\Adapter; use Embed\Embed; use Embed\Exceptions\InvalidUrlException; use Embed\Http\CurlDispatcher; -use Embed\Utils; +use wrav\oembed\adapters\EmbedAdapter; use wrav\oembed\adapters\FallbackAdapter; use wrav\oembed\events\BrokenUrlEvent; use wrav\oembed\Oembed; -use yii\log\Logger; /** * OembedService Service @@ -64,6 +62,7 @@ public function embed($url, array $options = [], array $cacheProps = []) $hash = ''; } $cacheKey = $url . '_' . $hash; + $data = []; if (Oembed::getInstance()->getSettings()->enableCache && Craft::$app->cache->exists($cacheKey)) { return \Craft::$app->cache->get($cacheKey); @@ -76,14 +75,18 @@ public function embed($url, array $options = [], array $cacheProps = []) try { array_multisort($options); - $dispatcher = new CurlDispatcher([ - CURLOPT_REFERER => UrlHelper::siteUrl(), - ]); + $embed = new Embed(); + $infos = $embed + ->get($url) + ; + $infos->setSettings($options); + $data = $infos->getOEmbed()->all(); - /** @var Adapter $media */ - $media = Embed::create($url, $options, $dispatcher); + $media = new EmbedAdapter($data); } catch (InvalidUrlException $e) { - // Trigger notification + Craft::info($e->getMessage(), 'oembed'); + + // Trigger notification event if (Oembed::getInstance()->getSettings()->enableNotifications) { Oembed::getInstance()->trigger(Oembed::EVENT_BROKEN_URL_DETECTED, new BrokenUrlEvent([ 'url' => $url, @@ -91,20 +94,28 @@ public function embed($url, array $options = [], array $cacheProps = []) } // Create fallback - $media = new FallbackAdapter( - $e->getResponse(), - $options, - new CurlDispatcher() - ); + $media = new FallbackAdapter([ + 'html' => $url ? '' : null + ]); } finally { + // Fallback to iframex + if (empty($data)) { + $data = [ + 'html' => $url ? '' : null + ]; + } + // Wrapping to be safe :) try { $dom = new DOMDocument; - $code = $media->getCode(); - if (empty($code) && !($media instanceof FallbackAdapter)) { - $code = empty((string)$url) ? '' : Utils::iframe($media->url); + $html = $media->getCode() ?: null; + + if (empty($html) || empty((string)$url) ) { + $html = empty((string)$url) ? '' : ''; + $dom->loadHTML($html); + } else { + $dom->loadHTML($data['html']); } - $dom->loadHTML($code); $iframe = $dom->getElementsByTagName('iframe')->item(0); $src = $iframe->getAttribute('src'); @@ -195,6 +206,7 @@ public function embed($url, array $options = [], array $cacheProps = []) $cacheKeys = array_unique(array_merge($defaultCacheKeys, $cacheProps)); + // Make sure all keys are set to avoid errors foreach ($cacheKeys as $key) { try { $media->{$key} = $media->{$key}; From 9213f972b524af1296d85485a46c1e7fa16b720f Mon Sep 17 00:00:00 2001 From: reganlawton Date: Mon, 6 Nov 2023 07:50:42 +0930 Subject: [PATCH 2/5] fix: Tweaks to handling of of null fields --- src/models/OembedModel.php | 5 +++-- src/services/OembedService.php | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/models/OembedModel.php b/src/models/OembedModel.php index f3a768b..4b9d768 100644 --- a/src/models/OembedModel.php +++ b/src/models/OembedModel.php @@ -64,10 +64,11 @@ public function __get($name) $oembed = Oembed::getInstance()->oembedService->embed($this->url); if (!$oembed) { - $this->embed = []; + $this->oembed = []; + } else { + $this->oembed = $oembed; } - $this->oembed = $oembed; } return $this->oembed->$name ?? null; diff --git a/src/services/OembedService.php b/src/services/OembedService.php index 4d6419a..2370b5a 100755 --- a/src/services/OembedService.php +++ b/src/services/OembedService.php @@ -217,7 +217,8 @@ public function embed($url, array $options = [], array $cacheProps = []) Craft::$app->cache->set($cacheKey, json_decode(json_encode($media)), $duration); } - return $media; + + return $media ?? []; } } } From c15b445ca5d8137979f536ba653be09480b306a3 Mon Sep 17 00:00:00 2001 From: reganlawton Date: Mon, 6 Nov 2023 10:11:10 +0930 Subject: [PATCH 3/5] chore: Update version in composer.json to 3.0.0 --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 8e54558..5a57784 100755 --- a/composer.json +++ b/composer.json @@ -2,7 +2,7 @@ "name": "wrav/oembed", "description": "A simple plugin to extract media information from websites, like youtube videos, twitter statuses or blog articles.", "type": "craft-plugin", - "version": "2.3.0", + "version": "3.0.0", "keywords": [ "craft", "cms", From ad215552ac04ae7f66abb45bd22992eac11427e7 Mon Sep 17 00:00:00 2001 From: reganlawton Date: Mon, 6 Nov 2023 10:12:34 +0930 Subject: [PATCH 4/5] feat: Add "roave/security-advisories" to the require-dev dependencies in composer.json This acts as a firewall for vulnerable components --- composer.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/composer.json b/composer.json index 5a57784..a6f1330 100755 --- a/composer.json +++ b/composer.json @@ -29,6 +29,9 @@ "homepage": "https://github.com/reganlawton" } ], + "require-dev": { + "roave/security-advisories": "dev-latest" + }, "require": { "craftcms/cms": "^4.0", "embed/embed": "^v4.4", From 2bfe0d4895612e4099011ef5323b5e94c8cfd908 Mon Sep 17 00:00:00 2001 From: reganlawton Date: Wed, 8 Nov 2023 09:43:54 +0930 Subject: [PATCH 5/5] refactor: Refactor EmbedAdapter.php to use null coalescing operator for retrieving HTML data --- src/adapters/EmbedAdapter.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/adapters/EmbedAdapter.php b/src/adapters/EmbedAdapter.php index 731ffd0..419c734 100755 --- a/src/adapters/EmbedAdapter.php +++ b/src/adapters/EmbedAdapter.php @@ -36,6 +36,6 @@ public function __toString() public function getCode() { - return isset($this->data['html']) ? $this->data['html'] : ''; + return $this->data['html'] ?? ''; } }