diff --git a/classes/security/EmbedFilter.class.php b/classes/security/EmbedFilter.class.php
index 382bf0fe0..d6e9e5f01 100644
--- a/classes/security/EmbedFilter.class.php
+++ b/classes/security/EmbedFilter.class.php
@@ -4,216 +4,78 @@
class EmbedFilter
{
/**
- * allow script access list
+ * Deprecated properties
* @var array
*/
- var $allowscriptaccessList = array();
- var $whiteUrlList = array();
- var $whiteIframeUrlList = array();
- var $mimeTypeList = array();
- var $extList = array();
- var $parser = NULL;
-
- /**
- * @constructor
- * @return void
- */
- function __construct()
- {
- $this->_makeWhiteDomainList();
- }
+ public $whiteUrlList = array();
+ public $whiteIframeUrlList = array();
+ public $mimeTypeList = array();
+ public $extList = array();
/**
* Return EmbedFilter object
- * This method for singleton
+ *
* @return EmbedFilter
*/
function getInstance()
{
- if(!isset($GLOBALS['__EMBEDFILTER_INSTANCE__']))
- {
- $GLOBALS['__EMBEDFILTER_INSTANCE__'] = new EmbedFilter();
- }
- return $GLOBALS['__EMBEDFILTER_INSTANCE__'];
+ return new self();
}
-
+
public function getWhiteUrlList()
{
- return $this->whiteUrlList;
+ return Rhymix\Framework\Security\MediaFilter::getObjectWhitelist();
}
-
+
public function getWhiteIframeUrlList()
{
- return $this->whiteIframeUrlList;
+ return Rhymix\Framework\Security\MediaFilter::getIframeWhitelist();
}
-
- /**
- * Check the content.
- * @return void
- */
+
+ function isWhiteDomain($urlAttribute)
+ {
+ return Rhymix\Framework\Security\MediaFilter::matchObjectWhitelist($urlAttribute);
+ }
+
+ function isWhiteIframeDomain($urlAttribute)
+ {
+ return Rhymix\Framework\Security\MediaFilter::matchIframeWhitelist($urlAttribute);
+ }
+
+ function isWhiteMimetype($mimeType)
+ {
+ return true;
+ }
+
+ function isWhiteExt($ext)
+ {
+ return true;
+ }
+
function check(&$content)
{
// This functionality has been moved to the HTMLFilter class.
}
-
- /**
- * Check iframe tag in the content.
- * @return void
- */
+
function checkIframeTag(&$content)
{
// This functionality has been moved to the HTMLFilter class.
}
-
- /**
- * Check object tag in the content.
- * @return void
- */
+
function checkObjectTag(&$content)
{
// This functionality has been moved to the HTMLFilter class.
}
-
- /**
- * Check embed tag in the content.
- * @return void
- */
+
function checkEmbedTag(&$content)
{
// This functionality has been moved to the HTMLFilter class.
}
-
- /**
- * Check param tag in the content.
- * @return void
- */
+
function checkParamTag(&$content)
{
// This functionality has been moved to the HTMLFilter class.
}
-
- /**
- * Check white domain in object data attribute or embed src attribute.
- * @return string
- */
- function isWhiteDomain($urlAttribute)
- {
- if(is_array($this->whiteUrlList))
- {
- foreach($this->whiteUrlList AS $key => $value)
- {
- if(preg_match('@^https?://' . preg_quote($value, '@') . '@i', $urlAttribute))
- {
- return TRUE;
- }
- }
- }
- return FALSE;
- }
-
- /**
- * Check white domain in iframe src attribute.
- * @return string
- */
- function isWhiteIframeDomain($urlAttribute)
- {
- if(is_array($this->whiteIframeUrlList))
- {
- foreach($this->whiteIframeUrlList AS $key => $value)
- {
- if(preg_match('@^https?://' . preg_quote($value, '@') . '@i', $urlAttribute))
- {
- return TRUE;
- }
- }
- }
- return FALSE;
- }
-
- /**
- * Check white mime type in object type attribute or embed type attribute.
- * @return string
- */
- function isWhiteMimetype($mimeType)
- {
- if(isset($this->mimeTypeList[$mimeType]))
- {
- return TRUE;
- }
- return FALSE;
- }
-
- function isWhiteExt($ext)
- {
- if(isset($this->extList[$ext]))
- {
- return TRUE;
- }
- return FALSE;
- }
-
- /**
- * Make white domain list cache file from xml config file.
- * @param $whitelist array
- * @return void
- */
- function _makeWhiteDomainList($whitelist = NULL)
- {
- $whiteUrlDefaultList = (include RX_BASEDIR . 'common/defaults/whitelist.php');
- $this->extList = $whiteUrlDefaultList['extensions'];
- $this->mimeTypeList = $whiteUrlDefaultList['mime'];
- $this->whiteUrlList = array();
- $this->whiteIframeUrlList = array();
-
- if($whitelist !== NULL)
- {
- if(!is_array($whitelist) || !isset($whitelist['object']) || !isset($whitelist['iframe']))
- {
- $whitelist = array(
- 'object' => isset($whitelist->object) ? $whitelist->object : array(),
- 'iframe' => isset($whitelist->iframe) ? $whitelist->iframe : array(),
- );
- }
- foreach ($whitelist['object'] as $prefix)
- {
- $this->whiteUrlList[] = preg_match('@^https?://(.*)$@i', $prefix, $matches) ? $matches[1] : $prefix;
- }
- foreach ($whitelist['iframe'] as $prefix)
- {
- $this->whiteIframeUrlList[] = preg_match('@^https?://(.*)$@i', $prefix, $matches) ? $matches[1] : $prefix;
- }
- }
- else
- {
- foreach ($whiteUrlDefaultList['object'] as $prefix)
- {
- $this->whiteUrlList[] = $prefix;
- }
- foreach ($whiteUrlDefaultList['iframe'] as $prefix)
- {
- $this->whiteIframeUrlList[] = $prefix;
- }
- if ($embedfilter_object = config('embedfilter.object'))
- {
- foreach ($embedfilter_object as $prefix)
- {
- $this->whiteUrlList[] = preg_match('@^https?://(.*)$@i', $prefix, $matches) ? $matches[1] : $prefix;
- }
- }
- if ($embedfilter_iframe = config('embedfilter.iframe'))
- {
- foreach ($embedfilter_iframe as $prefix)
- {
- $this->whiteIframeUrlList[] = preg_match('@^https?://(.*)$@i', $prefix, $matches) ? $matches[1] : $prefix;
- }
- }
- }
-
- $this->whiteUrlList = array_unique($this->whiteUrlList);
- $this->whiteIframeUrlList = array_unique($this->whiteIframeUrlList);
- natcasesort($this->whiteUrlList);
- natcasesort($this->whiteIframeUrlList);
- }
}
/* End of file : EmbedFilter.class.php */
/* Location: ./classes/security/EmbedFilter.class.php */
diff --git a/common/defaults/whitelist.php b/common/defaults/whitelist.php
index 272da733b..7fb02f008 100644
--- a/common/defaults/whitelist.php
+++ b/common/defaults/whitelist.php
@@ -77,1652 +77,4 @@ return array(
// Afreeca
'afree.ca/',
),
-
- /**
- * Allowed extensions in )?!is', $replacement, $input);
+ $input = preg_replace('!]*>(.*?)?!is', $replacement, $input);
+ $input = preg_replace('!
]*editor_component="multimedia_link"[^>]*>(.*?)?!is', $replacement, $input);
+ return $input;
+ }
+
+ /**
+ * Load whitelists.
+ *
+ * @param array $custom_whitelist
+ * @return void
+ */
+ protected static function _loadWhitelists($custom_whitelist = array())
+ {
+ $default_whitelist = (include RX_BASEDIR . 'common/defaults/whitelist.php');
+ self::$_object_whitelist = array();
+ self::$_iframe_whitelist = array();
+
+ if(count($custom_whitelist))
+ {
+ if(!is_array($custom_whitelist) || !isset($custom_whitelist['iframe']) || !isset($custom_whitelist['object']))
+ {
+ $whitelist = array(
+ 'iframe' => isset($whitelist->iframe) ? $whitelist->iframe : array(),
+ 'object' => isset($whitelist->object) ? $whitelist->object : array(),
+ );
+ }
+ foreach ($custom_whitelist['iframe'] as $prefix)
+ {
+ self::$_iframe_whitelist[] = preg_match('@^https?://(.*)$@i', $prefix, $matches) ? $matches[1] : $prefix;
+ }
+ foreach ($custom_whitelist['object'] as $prefix)
+ {
+ self::$_object_whitelist[] = preg_match('@^https?://(.*)$@i', $prefix, $matches) ? $matches[1] : $prefix;
+ }
+ }
+ else
+ {
+ foreach ($default_whitelist['iframe'] as $prefix)
+ {
+ self::$_iframe_whitelist[] = $prefix;
+ }
+ foreach ($default_whitelist['object'] as $prefix)
+ {
+ self::$_object_whitelist[] = $prefix;
+ }
+ if ($iframe_whitelist = config('mediafilter.iframe') ?: config('embedfilter.iframe'))
+ {
+ foreach ($iframe_whitelist as $prefix)
+ {
+ self::$_iframe_whitelist[] = preg_match('@^https?://(.*)$@i', $prefix, $matches) ? $matches[1] : $prefix;
+ }
+ }
+ if ($object_whitelist = config('mediafilter.object') ?: config('embedfilter.object'))
+ {
+ foreach ($object_whitelist as $prefix)
+ {
+ self::$_object_whitelist[] = preg_match('@^https?://(.*)$@i', $prefix, $matches) ? $matches[1] : $prefix;
+ }
+ }
+ }
+
+ self::$_object_whitelist = array_unique(self::$_object_whitelist);
+ self::$_iframe_whitelist = array_unique(self::$_iframe_whitelist);
+ natcasesort(self::$_object_whitelist);
+ natcasesort(self::$_iframe_whitelist);
+ }
+}
diff --git a/common/legacy.php b/common/legacy.php
index 729166e14..665d443ff 100644
--- a/common/legacy.php
+++ b/common/legacy.php
@@ -1036,7 +1036,7 @@ function stripEmbedTagForAdmin(&$content, $writer_member_srl)
$security_msg = '
' .
'
' . lang('security_warning_embed') . '
';
- $content = Rhymix\Framework\Security\HTMLFilter::removeEmbeddedMedia($content, $security_msg);
+ $content = Rhymix\Framework\Security\MediaFilter::removeEmbeddedMedia($content, $security_msg);
}
return;
diff --git a/tests/unit/framework/security/HTMLFilterTest.php b/tests/unit/framework/security/HTMLFilterTest.php
index 01162dc9c..169b41c48 100644
--- a/tests/unit/framework/security/HTMLFilterTest.php
+++ b/tests/unit/framework/security/HTMLFilterTest.php
@@ -64,20 +64,4 @@ class HTMLFilterTest extends \Codeception\TestCase\Test
$this->assertEquals($test[1], Rhymix\Framework\Security\HTMLFilter::clean($test[0]));
}
}
-
- public function testRemoveEmbeddedMedia()
- {
- $tests = array(
- '' => '',
- '' => '',
- '' => '',
- '' => '',
- '' => '',
- );
-
- foreach ($tests as $from => $to)
- {
- $this->assertEquals($to, Rhymix\Framework\Security\HTMLFilter::removeEmbeddedMedia($from));
- }
- }
}
diff --git a/tests/unit/framework/security/MediaFilterTest.php b/tests/unit/framework/security/MediaFilterTest.php
new file mode 100644
index 000000000..920ad2fd7
--- /dev/null
+++ b/tests/unit/framework/security/MediaFilterTest.php
@@ -0,0 +1,47 @@
+assertTrue(in_array('www.youtube.com/', Rhymix\Framework\Security\MediaFilter::getIframeWhitelist()));
+ $this->assertFalse(in_array('random-website.com/', Rhymix\Framework\Security\MediaFilter::getIframeWhitelist()));
+
+ // iframe whitelist as regex.
+ $this->assertTrue(strpos(Rhymix\Framework\Security\MediaFilter::getIframeWhitelistRegex(), '|www\.youtube\.com/') !== false);
+ $this->assertFalse(strpos(Rhymix\Framework\Security\MediaFilter::getIframeWhitelistRegex(), 'www.youtube.com/') !== false);
+
+ // Match individual URL against iframe whitelist.
+ $this->assertTrue(Rhymix\Framework\Security\MediaFilter::matchIframeWhitelist('https://www.youtube.com/v'));
+ $this->assertFalse(Rhymix\Framework\Security\MediaFilter::matchIframeWhitelist('http://www-youtube.com/v'));
+
+ // object whitelist as array.
+ $this->assertTrue(in_array('www.youtube.com/', Rhymix\Framework\Security\MediaFilter::getObjectWhitelist()));
+ $this->assertFalse(in_array('random-website.com/', Rhymix\Framework\Security\MediaFilter::getObjectWhitelist()));
+
+ // object whitelist as regex.
+ $this->assertTrue(strpos(Rhymix\Framework\Security\MediaFilter::getObjectWhitelistRegex(), '|www\.youtube\.com/') !== false);
+ $this->assertFalse(strpos(Rhymix\Framework\Security\MediaFilter::getObjectWhitelistRegex(), 'www.youtube.com/') !== false);
+
+ // Match individual URL against object whitelist.
+ $this->assertTrue(Rhymix\Framework\Security\MediaFilter::matchObjectWhitelist('https://www.youtube.com/v'));
+ $this->assertFalse(Rhymix\Framework\Security\MediaFilter::matchObjectWhitelist('http://www-youtube.com/v'));
+ }
+
+ public function testRemoveEmbeddedMedia()
+ {
+ $tests = array(
+ '' => '',
+ '' => '',
+ '' => '',
+ '' => '',
+ '' => '',
+ );
+
+ foreach ($tests as $from => $to)
+ {
+ $this->assertEquals($to, Rhymix\Framework\Security\MediaFilter::removeEmbeddedMedia($from));
+ }
+ }
+}