PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 15.3.2
Jetpack – WP Security, Backup, Speed, & Growth v15.3.2
12.0.3 12.1.3 12.2.3 12.3.2 12.4.2 12.5.2 12.6.4 12.7.3 12.8.3 12.9.5 13.0.2 13.1.5 13.2.4 13.3.3 13.4.5 13.5.2 13.6.2 13.7.2 13.8.3 13.9.2 14.0.1 14.1.1 14.2.2 14.3.1 14.4.2 14.5.1 14.6.1 14.7.1 14.8.1 14.9.2 15.0.3 15.1.2 15.2.1 15.3.2 15.4.1 15.5.1 15.6.1 15.7.2 15.8.1 15.9.2 16.0.2 16.1.3 16.2-a.5 16.2-a.3 16.1.2 16.2-a.1 16.1.1 16.1 16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / _inc / lib / class-jetpack-podcast-feed-locator.php
jetpack / _inc / lib Last commit date
admin-pages 9 months ago core-api 9 months ago debugger 9 months ago markdown 9 months ago class-jetpack-ai-helper.php 9 months ago class-jetpack-blog-stats-helper.php 9 months ago class-jetpack-currencies.php 2 years ago class-jetpack-instagram-gallery-helper.php 2 years ago class-jetpack-mapbox-helper.php 3 years ago class-jetpack-newsletter-category-helper.php 9 months ago class-jetpack-podcast-feed-locator.php 9 months ago class-jetpack-podcast-helper.php 9 months ago class-jetpack-recommendations.php 9 months ago class-jetpack-top-posts-helper.php 9 months ago class.color.php 2 years ago class.core-rest-api-endpoints.php 9 months ago class.jetpack-automatic-install-skin.php 2 years ago class.jetpack-iframe-embed.php 3 years ago class.jetpack-password-checker.php 9 months ago class.jetpack-search-performance-logger.php 4 years ago class.media-extractor.php 9 months ago class.media-summary.php 9 months ago class.media.php 9 months ago components.php 9 months ago debugger.php 9 months ago icalendar-reader.php 9 months ago markdown.php 9 months ago plans.php 4 years ago plugins.php 4 years ago tonesque.php 9 months ago widgets.php 9 months ago
class-jetpack-podcast-feed-locator.php
116 lines
1 <?php
2 /**
3 * Extension of the SimplePie\Locator class, to detect podcast feeds
4 *
5 * @package automattic/jetpack
6 */
7
8 if ( ! defined( 'ABSPATH' ) ) {
9 exit( 0 );
10 }
11
12 /**
13 * Class Jetpack_Podcast_Feed_Locator
14 */
15 class Jetpack_Podcast_Feed_Locator extends SimplePie\Locator {
16 /**
17 * Overrides the locator is_feed function to check for
18 * appropriate podcast elements.
19 *
20 * @param SimplePie\File $file The file being checked.
21 * @param boolean $check_html Adds text/html to the mimetypes checked.
22 */
23 public function is_feed( $file, $check_html = false ) {
24 return parent::is_feed( $file, $check_html ) && $this->is_podcast_feed( $file );
25 }
26
27 /**
28 * Checks the contents of the file for elements that make
29 * it a podcast feed.
30 *
31 * @param SimplePie\File $file The file being checked.
32 */
33 private function is_podcast_feed( $file ) {
34 // If we can't read the DOM assume it's a podcast feed, we'll work
35 // it out later.
36 if ( ! class_exists( 'DOMDocument' ) ) {
37 return true;
38 }
39
40 $feed_dom = $this->safely_load_xml( (string) $file->body );
41
42 // Do this as either/or but prioritise the itunes namespace. It's pretty likely
43 // that it's a podcast feed we've found if that namespace is present.
44 return $feed_dom && $this->has_itunes_ns( $feed_dom ) && $this->has_audio_enclosures( $feed_dom );
45 }
46
47 /**
48 * Safely loads an XML file
49 *
50 * @param string $xml A string of XML to load.
51 * @return DOMDocument|false A resulting DOM document or `false` if there is an error.
52 */
53 private function safely_load_xml( $xml ) {
54 if ( empty( $xml ) ) {
55 return false;
56 }
57
58 $disable_entity_loader = PHP_VERSION_ID < 80000;
59
60 if ( $disable_entity_loader ) {
61 // This function has been deprecated in PHP 8.0 because in libxml 2.9.0, external entity loading
62 // is disabled by default, so this function is no longer needed to protect against XXE attacks.
63 // phpcs:ignore Generic.PHP.DeprecatedFunctions.Deprecated, PHPCompatibility.FunctionUse.RemovedFunctions.libxml_disable_entity_loaderDeprecated
64 $loader = libxml_disable_entity_loader( true );
65 }
66
67 $errors = libxml_use_internal_errors( true );
68
69 $return = new DOMDocument();
70 if ( ! $return->loadXML( $xml ) ) {
71 return false;
72 }
73
74 libxml_use_internal_errors( $errors );
75
76 if ( $disable_entity_loader && isset( $loader ) ) {
77 // phpcs:ignore Generic.PHP.DeprecatedFunctions.Deprecated, PHPCompatibility.FunctionUse.RemovedFunctions.libxml_disable_entity_loaderDeprecated
78 libxml_disable_entity_loader( $loader );
79 }
80
81 return $return;
82 }
83
84 /**
85 * Checks the RSS feed for the presence of the itunes podcast namespace.
86 * It's pretty loose and just checks the URI for itunes.com
87 *
88 * @param DOMDocument $dom The XML document to check.
89 * @return boolean Whether the itunes namespace is defined.
90 */
91 private function has_itunes_ns( $dom ) {
92 $xpath = new DOMXPath( $dom );
93 foreach ( $xpath->query( 'namespace::*' ) as $node ) {
94 // phpcs:disable WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase
95 // nodeValue is not valid, but it's part of the DOM API that we don't control.
96 if ( strstr( $node->nodeValue, 'itunes.com' ) ) {
97 return true;
98 }
99 // phpcs:enable
100 }
101 return false;
102 }
103
104 /**
105 * Checks the RSS feed for the presence of enclosures with an audio mimetype.
106 *
107 * @param DOMDocument $dom The XML document to check.
108 * @return boolean Whether enclosures were found.
109 */
110 private function has_audio_enclosures( $dom ) {
111 $xpath = new DOMXPath( $dom );
112 $enclosures = $xpath->query( "//enclosure[starts-with(@type,'audio/')]" );
113 return ! $enclosures ? false : $enclosures->length > 0;
114 }
115 }
116