1
0
Fork 0
forked from blallo/rss-bridge

Merge branch 'ContinuousIntegration' of https://github.com/logmanoriginal/rss-bridge

This commit is contained in:
logmanoriginal 2016-09-10 21:07:13 +02:00
commit 88919a43fd
21 changed files with 1502 additions and 1396 deletions

View file

@ -7,9 +7,7 @@ class FileCache extends CacheAbstract{
public function loadData(){ public function loadData(){
$this->isPrepareCache(); $this->isPrepareCache();
$datas = unserialize(file_get_contents($this->getCacheFile())); $datas = unserialize(file_get_contents($this->getCacheFile()));
return $datas; return $datas;
} }
@ -18,13 +16,10 @@ class FileCache extends CacheAbstract{
//Re-encode datas to UTF-8 //Re-encode datas to UTF-8
//$datas = Cache::utf8_encode_deep($datas); //$datas = Cache::utf8_encode_deep($datas);
$writeStream = file_put_contents($this->getCacheFile(), serialize($datas)); $writeStream = file_put_contents($this->getCacheFile(), serialize($datas));
if(!$writeStream) { if(!$writeStream) {
throw new \Exception("Cannot write the cache... Do you have the right permissions ?"); throw new \Exception("Cannot write the cache... Do you have the right permissions ?");
} }
return $this; return $this;

View file

@ -1,7 +1,8 @@
<?php <?php
/** /**
* Atom * Atom
* Documentation Source http://en.wikipedia.org/wiki/Atom_%28standard%29 and http://tools.ietf.org/html/rfc4287 * Documentation Source http://en.wikipedia.org/wiki/Atom_%28standard%29 and
* http://tools.ietf.org/html/rfc4287
*/ */
class AtomFormat extends FormatAbstract{ class AtomFormat extends FormatAbstract{

View file

@ -13,8 +13,23 @@ class HtmlFormat extends FormatAbstract{
$entryAuthor = isset($item['author']) ? '<br /><p class="author">by: ' . $item['author'] . '</p>' : ''; $entryAuthor = isset($item['author']) ? '<br /><p class="author">by: ' . $item['author'] . '</p>' : '';
$entryTitle = isset($item['title']) ? $this->sanitizeHtml(strip_tags($item['title'])) : ''; $entryTitle = isset($item['title']) ? $this->sanitizeHtml(strip_tags($item['title'])) : '';
$entryUri = isset($item['uri']) ? $item['uri'] : $uri; $entryUri = isset($item['uri']) ? $item['uri'] : $uri;
$entryTimestamp = isset($item['timestamp']) ? '<time datetime="' . date(DATE_ATOM, $item['timestamp']) . '">' . date(DATE_ATOM, $item['timestamp']) . '</time>' : '';
$entryContent = isset($item['content']) ? '<div class="content">' . $this->sanitizeHtml($item['content']). '</div>' : ''; $entryTimestamp = '';
if(isset($item['timestamp'])){
$entryTimestamp = '<time datetime="'
. date(DATE_ATOM, $item['timestamp'])
. '">'
. date(DATE_ATOM, $item['timestamp'])
. '</time>';
}
$entryContent = '';
if(isset($item['content'])){
$entryContent = '<div class="content">'
. $this->sanitizeHtml($item['content'])
. '</div>';
}
$entries .= <<<EOD $entries .= <<<EOD
<section class="feeditem"> <section class="feeditem">
@ -27,7 +42,6 @@ class HtmlFormat extends FormatAbstract{
EOD; EOD;
} }
/* Data are prepared, now let's begin the "MAGIE !!!" */ /* Data are prepared, now let's begin the "MAGIE !!!" */
$toReturn = <<<EOD $toReturn = <<<EOD
<!DOCTYPE html> <!DOCTYPE html>

View file

@ -7,7 +7,6 @@ class JsonFormat extends FormatAbstract{
public function stringify(){ public function stringify(){
$items = $this->getItems(); $items = $this->getItems();
return json_encode($items, JSON_PRETTY_PRINT); return json_encode($items, JSON_PRETTY_PRINT);
} }

View file

@ -14,7 +14,13 @@ class MrssFormat extends FormatAbstract{
$extraInfos = $this->getExtraInfos(); $extraInfos = $this->getExtraInfos();
$title = $this->xml_encode($extraInfos['name']); $title = $this->xml_encode($extraInfos['name']);
$uri = $this->xml_encode(!empty($extraInfos['uri']) ? $extraInfos['uri'] : 'https://github.com/sebsauvage/rss-bridge');
if(!empty($extraInfos['uri'])){
$uri = $this->xml_encode($extraInfos['uri']);
} else {
$uri = 'https://github.com/sebsauvage/rss-bridge';
}
$icon = $this->xml_encode('http://icons.better-idea.org/icon?url='. $uri .'&size=64'); $icon = $this->xml_encode('http://icons.better-idea.org/icon?url='. $uri .'&size=64');
$items = ''; $items = '';
@ -41,7 +47,10 @@ EOD;
/* Data are prepared, now let's begin the "MAGIE !!!" */ /* Data are prepared, now let's begin the "MAGIE !!!" */
$toReturn = '<?xml version="1.0" encoding="UTF-8"?>'; $toReturn = '<?xml version="1.0" encoding="UTF-8"?>';
$toReturn .= <<<EOD $toReturn .= <<<EOD
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:atom="http://www.w3.org/2005/Atom"> <rss version="2.0"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:media="http://search.yahoo.com/mrss/"
xmlns:atom="http://www.w3.org/2005/Atom">
<channel> <channel>
<title>{$title}</title> <title>{$title}</title>
<link>http{$https}://{$httpHost}{$httpInfo}/</link> <link>http{$https}://{$httpHost}{$httpInfo}/</link>

View file

@ -52,7 +52,9 @@ if (!extension_loaded('openssl'))
die('"openssl" extension not loaded. Please check "php.ini"'); die('"openssl" extension not loaded. Please check "php.ini"');
// FIXME : beta test UA spoofing, please report any blacklisting by PHP-fopen-unfriendly websites // FIXME : beta test UA spoofing, please report any blacklisting by PHP-fopen-unfriendly websites
ini_set('user_agent', 'Mozilla/5.0 (X11; Linux x86_64; rv:30.0) Gecko/20121202 Firefox/30.0 (rss-bridge/0.1; +https://github.com/sebsauvage/rss-bridge)'); ini_set('user_agent', 'Mozilla/5.0(X11; Linux x86_64; rv:30.0)
Gecko/20121202 Firefox/30.0(rss-bridge/0.1;
+https://github.com/sebsauvage/rss-bridge)');
// default whitelist // default whitelist
$whitelist_file = './whitelist.txt'; $whitelist_file = './whitelist.txt';
@ -78,8 +80,7 @@ if (!file_exists($whitelist_file)) {
$whitelist_selection = $whitelist_default; $whitelist_selection = $whitelist_default;
$whitelist_write = implode("\n", $whitelist_default); $whitelist_write = implode("\n", $whitelist_default);
file_put_contents($whitelist_file, $whitelist_write); file_put_contents($whitelist_file, $whitelist_write);
} } else {
else {
$whitelist_selection = explode("\n", file_get_contents($whitelist_file)); $whitelist_selection = explode("\n", file_get_contents($whitelist_file));
} }
@ -93,6 +94,7 @@ try{
$action = filter_input(INPUT_GET, 'action'); $action = filter_input(INPUT_GET, 'action');
$bridge = filter_input(INPUT_GET, 'bridge'); $bridge = filter_input(INPUT_GET, 'bridge');
if($action === 'display' && !empty($bridge)){ if($action === 'display' && !empty($bridge)){
// DEPRECATED: 'nameBridge' scheme is replaced by 'name' in bridge parameter values // DEPRECATED: 'nameBridge' scheme is replaced by 'name' in bridge parameter values
// this is to keep compatibility until futher complete removal // this is to keep compatibility until futher complete removal
@ -101,13 +103,13 @@ try{
} }
$format = filter_input(INPUT_GET, 'format'); $format = filter_input(INPUT_GET, 'format');
// DEPRECATED: 'nameFormat' scheme is replaced by 'name' in format parameter values // DEPRECATED: 'nameFormat' scheme is replaced by 'name' in format parameter values
// this is to keep compatibility until futher complete removal // this is to keep compatibility until futher complete removal
if(($pos = strpos($format, 'Format')) === (strlen($format) - strlen('Format'))){ if(($pos = strpos($format, 'Format')) === (strlen($format) - strlen('Format'))){
$format = substr($format, 0, $pos); $format = substr($format, 0, $pos);
} }
// whitelist control // whitelist control
if(!Bridge::isWhitelisted($whitelist_selection, $bridge)){ if(!Bridge::isWhitelisted($whitelist_selection, $bridge)){
throw new \HttpException('This bridge is not whitelisted', 401); throw new \HttpException('This bridge is not whitelisted', 401);
@ -118,14 +120,12 @@ try{
// Data retrieval // Data retrieval
$bridge = Bridge::create($bridge); $bridge = Bridge::create($bridge);
if(!defined("DEBUG")) { if(!defined("DEBUG"))
$bridge->setCache($cache); $bridge->setCache($cache);
}
$noproxy = filter_input(INPUT_GET, '_noproxy', FILTER_VALIDATE_BOOLEAN); $noproxy = filter_input(INPUT_GET, '_noproxy', FILTER_VALIDATE_BOOLEAN);
if(defined('PROXY_URL') && PROXY_BYBRIDGE && $noproxy){ if(defined('PROXY_URL') && PROXY_BYBRIDGE && $noproxy)
$bridge->useProxy = false; $bridge->useProxy = false;
}
$params = $_GET; $params = $_GET;
unset($params['action']); unset($params['action']);
@ -133,6 +133,7 @@ try{
unset($params['format']); unset($params['format']);
unset($params['_noproxy']); unset($params['_noproxy']);
$bridge->setDatas($params); $bridge->setDatas($params);
// Data transformation // Data transformation
try { try {
$format = Format::create($format); $format = Format::create($format);
@ -144,19 +145,18 @@ try{
)) ))
->display(); ->display();
} catch(Exception $e){ } catch(Exception $e){
echo "The bridge has crashed. You should report this to the bridges maintainer";
echo "The brige has crashed. You should report this to the bridges maintainer";
} }
die; die;
}
}
}
}
catch(HttpException $e){ catch(HttpException $e){
header('HTTP/1.1 ' . $e->getCode() . ' ' . Http::getMessageForCode($e->getCode())); header('HTTP/1.1 ' . $e->getCode() . ' ' . Http::getMessageForCode($e->getCode()));
header('Content-Type: text/plain'); header('Content-Type: text/plain');
die($e->getMessage()); die($e->getMessage());
} }
catch(\Exception $e){ catch(\Exception $e){
die($e->getMessage()); die($e->getMessage());
} }
@ -185,15 +185,11 @@ $formats = Format::searchInformation();
$showInactive = filter_input(INPUT_GET, 'show_inactive', FILTER_VALIDATE_BOOLEAN); $showInactive = filter_input(INPUT_GET, 'show_inactive', FILTER_VALIDATE_BOOLEAN);
$inactiveBridges = ''; $inactiveBridges = '';
$bridgeList = Bridge::listBridges(); $bridgeList = Bridge::listBridges();
foreach($bridgeList as $bridgeName) foreach($bridgeList as $bridgeName){
{ if(Bridge::isWhitelisted($whitelist_selection, $bridgeName)){
if(Bridge::isWhitelisted($whitelist_selection, $bridgeName))
{
echo HTMLUtils::displayBridgeCard($bridgeName, $formats); echo HTMLUtils::displayBridgeCard($bridgeName, $formats);
$activeFoundBridgeCount++; $activeFoundBridgeCount++;
} } elseif($showInactive) {
elseif ($showInactive)
{
// inactive bridges // inactive bridges
$inactiveBridges .= HTMLUtils::displayBridgeCard($bridgeName, $formats, false) . PHP_EOL; $inactiveBridges .= HTMLUtils::displayBridgeCard($bridgeName, $formats, false) . PHP_EOL;
} }

View file

@ -36,7 +36,8 @@ EOD;
$pathBridge = self::getDir() . $nameBridge . '.php'; $pathBridge = self::getDir() . $nameBridge . '.php';
if(!file_exists($pathBridge)){ if(!file_exists($pathBridge)){
throw new \Exception('The bridge you looking for does not exist. It should be at path ' . $pathBridge); throw new \Exception('The bridge you looking for does not exist. It should be at path '
. $pathBridge);
} }
require_once $pathBridge; require_once $pathBridge;
@ -92,10 +93,10 @@ EOD;
static public function isWhitelisted($whitelist, $name){ static public function isWhitelisted($whitelist, $name){
if(in_array($name, $whitelist) if(in_array($name, $whitelist)
or in_array($name . '.php', $whitelist) || in_array($name . '.php', $whitelist)
or in_array($name . 'Bridge', $whitelist) // DEPRECATED || in_array($name . 'Bridge', $whitelist) // DEPRECATED
or in_array($name . 'Bridge.php', $whitelist) // DEPRECATED || in_array($name . 'Bridge.php', $whitelist) // DEPRECATED
or count($whitelist) === 1 and trim($whitelist[0]) === '*'){ || count($whitelist) === 1 and trim($whitelist[0]) === '*'){
return true; return true;
} else { } else {
return false; return false;

View file

@ -37,8 +37,9 @@ abstract class BridgeAbstract implements BridgeInterface {
protected function validateTextValue($value, $pattern = null){ protected function validateTextValue($value, $pattern = null){
if(!is_null($pattern)){ if(!is_null($pattern)){
$filteredValue = filter_var($value, FILTER_VALIDATE_REGEXP, $filteredValue = filter_var($value
array('options' => array( , FILTER_VALIDATE_REGEXP
, array('options' => array(
'regexp' => '/^' . $pattern . '$/' 'regexp' => '/^' . $pattern . '$/'
)) ))
); );
@ -215,16 +216,16 @@ abstract class BridgeAbstract implements BridgeInterface {
foreach($set as $id => $properties){ foreach($set as $id => $properties){
if(isset($inputs[$id]) && !empty($inputs[$id])){ if(isset($inputs[$id]) && !empty($inputs[$id])){
$queriedContexts[$context] = true; $queriedContexts[$context] = true;
}elseif(isset($properties['required']) && } elseif(isset($properties['required'])
$properties['required']===true){ && $properties['required'] === true){
$queriedContexts[$context] = false; $queriedContexts[$context] = false;
break; break;
} }
} }
} }
if(array_key_exists('global',static::PARAMETERS) && if(array_key_exists('global', static::PARAMETERS)
$queriedContexts['global']===false){ && $queriedContexts['global'] === false){
return null; return null;
} }
unset($queriedContexts['global']); unset($queriedContexts['global']);
@ -337,7 +338,7 @@ abstract class BridgeAbstract implements BridgeInterface {
$contextOptions = array( $contextOptions = array(
'http' => array( 'http' => array(
'user_agent' => ini_get('user_agent') 'user_agent' => ini_get('user_agent')
), )
); );
if(defined('PROXY_URL') && $this->useProxy){ if(defined('PROXY_URL') && $this->useProxy){

View file

@ -10,7 +10,8 @@ class Cache{
static public function create($nameCache){ static public function create($nameCache){
if(!static::isValidNameCache($nameCache)){ if(!static::isValidNameCache($nameCache)){
throw new \InvalidArgumentException('Name cache must be at least one uppercase follow or not by alphanumeric or dash characters.'); throw new \InvalidArgumentException('Name cache must be at least one
uppercase follow or not by alphanumeric or dash characters.');
} }
$pathCache = self::getDir() . $nameCache . '.php'; $pathCache = self::getDir() . $nameCache . '.php';
@ -71,13 +72,14 @@ class Cache{
static public function purge(){ static public function purge(){
$cacheTimeLimit = time() - 60*60*24 ; $cacheTimeLimit = time() - 86400; // 86400 -> 24h
$cachePath = 'cache'; $cachePath = 'cache';
if(file_exists($cachePath)){ if(file_exists($cachePath)){
$cacheIterator = new RecursiveIteratorIterator( $cacheIterator = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($cachePath), new RecursiveDirectoryIterator($cachePath),
RecursiveIteratorIterator::CHILD_FIRST RecursiveIteratorIterator::CHILD_FIRST
); );
foreach($cacheIterator as $cacheFile){ foreach($cacheIterator as $cacheFile){
if(in_array($cacheFile->getBasename(), array('.', '..'))) if(in_array($cacheFile->getBasename(), array('.', '..')))
continue; continue;

View file

@ -12,9 +12,8 @@ class Http{
static public function getMessageForCode($code){ static public function getMessageForCode($code){
$codes = self::getCodes(); $codes = self::getCodes();
if( isset($codes[$code]) ){ if(isset($codes[$code]))
return $codes[$code]; return $codes[$code];
}
return ''; return '';
} }

View file

@ -50,7 +50,10 @@ abstract class FeedExpander extends BridgeAbstract {
protected function collect_RSS_2_0_data($rssContent, $maxItems){ protected function collect_RSS_2_0_data($rssContent, $maxItems){
$rssContent = $rssContent->channel[0]; $rssContent = $rssContent->channel[0];
$this->debugMessage('RSS content is ===========\n' . var_export($rssContent, true) . '==========='); $this->debugMessage('RSS content is ===========\n'
. var_export($rssContent, true)
. '===========');
$this->load_RSS_2_0_feed_data($rssContent); $this->load_RSS_2_0_feed_data($rssContent);
foreach($rssContent->item as $item){ foreach($rssContent->item as $item){
$this->debugMessage('parsing item ' . var_export($item, true)); $this->debugMessage('parsing item ' . var_export($item, true));

View file

@ -10,7 +10,8 @@ class Format{
static public function create($nameFormat){ static public function create($nameFormat){
if(!preg_match('@^[A-Z][a-zA-Z]*$@', $nameFormat)){ if(!preg_match('@^[A-Z][a-zA-Z]*$@', $nameFormat)){
throw new \InvalidArgumentException('Name format must be at least one uppercase follow or not by alphabetic characters.'); throw new \InvalidArgumentException('Name format must be at least
one uppercase follow or not by alphabetic characters.');
} }
$nameFormat = $nameFormat . 'Format'; $nameFormat = $nameFormat . 'Format';

View file

@ -7,8 +7,7 @@ abstract class FormatAbstract implements FormatInterface{
$contentType, $contentType,
$charset, $charset,
$items, $items,
$extraInfos $extraInfos;
;
public function setCharset($charset){ public function setCharset($charset){
$this->charset = $charset; $this->charset = $charset;

View file

@ -1,6 +1,5 @@
<?php <?php
class HTMLUtils { class HTMLUtils {
public static function displayBridgeCard($bridgeName, $formats, $isActive = true){ public static function displayBridgeCard($bridgeName, $formats, $isActive = true){
$bridgeElement = Bridge::create($bridgeName); $bridgeElement = Bridge::create($bridgeName);
$bridgeClass = $bridgeName . 'Bridge'; $bridgeClass = $bridgeName . 'Bridge';
@ -28,9 +27,24 @@ CARD;
if($isActive){ if($isActive){
if(defined('PROXY_URL') && PROXY_BYBRIDGE){ if(defined('PROXY_URL') && PROXY_BYBRIDGE){
$idArg = 'arg-' . urlencode($bridgeName) . '-' . urlencode('proxyoff') . '-' . urlencode('_noproxy'); $idArg = 'arg-'
$card .= '<input id="' . $idArg . '" type="checkbox" name="_noproxy" />' . PHP_EOL; . urlencode($bridgeName)
$card .= '<label for="' .$idArg. '">Disable proxy ('.((defined('PROXY_NAME') && PROXY_NAME)?PROXY_NAME:PROXY_URL).')</label><br />' . PHP_EOL; . '-'
. urlencode('proxyoff')
. '-'
. urlencode('_noproxy');
$card .= '<input id="'
. $idArg
. '" type="checkbox" name="_noproxy" />'
. PHP_EOL;
$card .= '<label for="'
. $idArg
. '">Disable proxy ('
. ((defined('PROXY_NAME') && PROXY_NAME) ? PROXY_NAME : PROXY_URL)
. ')</label><br />'
. PHP_EOL;
} }
$card .= HTMLUtils::getHelperButtonsFormat($formats); $card .= HTMLUtils::getHelperButtonsFormat($formats);
@ -77,55 +91,140 @@ CARD;
if(!isset($inputEntry['defaultValue'])) if(!isset($inputEntry['defaultValue']))
$inputEntry['defaultValue'] = ''; $inputEntry['defaultValue'] = '';
$idArg = 'arg-' . urlencode($bridgeName) . '-' . urlencode($parameterName) . '-' . urlencode($id); $idArg = 'arg-'
$card .= '<label for="' . $idArg . '">' . $inputEntry['name'] . ' : </label>' . PHP_EOL; . urlencode($bridgeName)
. '-'
. urlencode($parameterName)
. '-'
. urlencode($id);
$card .= '<label for="'
. $idArg
. '">'
. $inputEntry['name']
. ' : </label>'
. PHP_EOL;
if(!isset($inputEntry['type']) || $inputEntry['type'] == 'text'){ if(!isset($inputEntry['type']) || $inputEntry['type'] == 'text'){
$card .= '<input ' . $additionalInfoString . ' id="' . $idArg . '" type="text" value="' . $inputEntry['defaultValue'] . '" placeholder="' . $inputEntry['exampleValue'] . '" name="' . $id . '" /><br />' . PHP_EOL; $card .= '<input '
. $additionalInfoString
. ' id="'
. $idArg
. '" type="text" value="'
. $inputEntry['defaultValue']
. '" placeholder="'
. $inputEntry['exampleValue']
. '" name="'
. $id
. '" /><br />'
. PHP_EOL;
} elseif($inputEntry['type'] == 'number'){ } elseif($inputEntry['type'] == 'number'){
$card .= '<input ' . $additionalInfoString . ' id="' . $idArg . '" type="number" value="' . $inputEntry['defaultValue'] . '" placeholder="' . $inputEntry['exampleValue'] . '" name="' . $id . '" /><br />' . PHP_EOL; $card .= '<input '
. $additionalInfoString
. ' id="'
. $idArg
. '" type="number" value="'
. $inputEntry['defaultValue']
. '" placeholder="'
. $inputEntry['exampleValue']
. '" name="'
. $id
. '" /><br />'
. PHP_EOL;
} else if($inputEntry['type'] == 'list'){ } else if($inputEntry['type'] == 'list'){
$card .= '<select ' . $additionalInfoString . ' id="' . $idArg . '" name="' . $id . '" >'; $card .= '<select '
. $additionalInfoString
. ' id="'
. $idArg
. '" name="'
. $id
. '" >';
foreach($inputEntry['values'] as $name => $value){ foreach($inputEntry['values'] as $name => $value){
if(is_array($value)){ if(is_array($value)){
$card .= '<optgroup label="' . htmlentities($name) . '">'; $card .= '<optgroup label="' . htmlentities($name) . '">';
foreach($value as $subname => $subvalue){ foreach($value as $subname => $subvalue){
if($inputEntry['defaultValue'] === $subname || $inputEntry['defaultValue'] === $subvalue) if($inputEntry['defaultValue'] === $subname
$card .= '<option value="' . $subvalue . '" selected>' . $subname . '</option>'; || $inputEntry['defaultValue'] === $subvalue){
else $card .= '<option value="'
$card .= '<option value="' . $subvalue . '">' . $subname . '</option>'; . $subvalue
. '" selected>'
. $subname
. '</option>';
} else {
$card .= '<option value="'
. $subvalue
. '">'
. $subname
. '</option>';
}
} }
$card .= '</optgroup>'; $card .= '</optgroup>';
} else { } else {
if($inputEntry['defaultValue'] === $name || $inputEntry['defaultValue'] === $value) if($inputEntry['defaultValue'] === $name
$card .= '<option value="' . $value . '" selected>' . $name . '</option>'; || $inputEntry['defaultValue'] === $value){
else $card .= '<option value="'
$card .= '<option value="' . $value . '">' . $name . '</option>'; . $value
. '" selected>'
. $name
. '</option>';
} else {
$card .= '<option value="'
. $value
. '">'
. $name
. '</option>';
}
} }
} }
$card .= '</select><br >'; $card .= '</select><br >';
} elseif($inputEntry['type'] == 'checkbox'){ } elseif($inputEntry['type'] == 'checkbox'){
if($inputEntry['defaultValue'] === 'checked') if($inputEntry['defaultValue'] === 'checked')
$card .= '<input ' . $additionalInfoString . ' id="' . $idArg . '" type="checkbox" name="' . $id . '" checked /><br />' . PHP_EOL; $card .= '<input '
. $additionalInfoString
. ' id="'
. $idArg
. '" type="checkbox" name="'
. $id
. '" checked /><br />'
. PHP_EOL;
else else
$card .= '<input ' . $additionalInfoString . ' id="' . $idArg . '" type="checkbox" name="' . $id . '" /><br />' . PHP_EOL; $card .= '<input '
. $additionalInfoString
. ' id="'
. $idArg
. '" type="checkbox" name="'
. $id
. '" /><br />'
. PHP_EOL;
} }
} }
if($isActive){ if($isActive){
if(defined('PROXY_URL') && PROXY_BYBRIDGE){ if(defined('PROXY_URL') && PROXY_BYBRIDGE){
$idArg = 'arg-' . urlencode($bridgeName) . '-' . urlencode('proxyoff') . '-' . urlencode('_noproxy'); $idArg = 'arg-'
$card .= '<input id="' . $idArg . '" type="checkbox" name="_noproxy" />' . PHP_EOL; . urlencode($bridgeName)
$card .= '<label for="' .$idArg. '">Disable proxy ('.((defined('PROXY_NAME') && PROXY_NAME)?PROXY_NAME:PROXY_URL).')</label><br />' . PHP_EOL; . '-'
} . urlencode('proxyoff')
. '-'
. urlencode('_noproxy');
$card .= '<input id="'
. $idArg
. '" type="checkbox" name="_noproxy" />'
. PHP_EOL;
$card .= '<label for="'
. $idArg
. '">Disable proxy ('
. ((defined('PROXY_NAME') && PROXY_NAME) ? PROXY_NAME : PROXY_URL)
. ')</label><br />'
. PHP_EOL;
}
$card .= HTMLUtils::getHelperButtonsFormat($formats); $card .= HTMLUtils::getHelperButtonsFormat($formats);
} else { } else {
$card .= '<span style="font-weight: bold;">Inactive</span>'; $card .= '<span style="font-weight: bold;">Inactive</span>';
} }
$card .= '</form>' . PHP_EOL; $card .= '</form>' . PHP_EOL;
} }
@ -139,7 +238,12 @@ CARD;
private static function getHelperButtonsFormat($formats){ private static function getHelperButtonsFormat($formats){
$buttons = ''; $buttons = '';
foreach($formats as $name){ foreach($formats as $name){
$buttons .= '<button type="submit" name="format" value="' . $name . '">' . $name . '</button>' . PHP_EOL; $buttons .= '<button type="submit" name="format" value="'
. $name
. '">'
. $name
. '</button>'
. PHP_EOL;
} }
return $buttons; return $buttons;
@ -164,10 +268,12 @@ class HTMLSanitizer {
public static $KEPT_ATTRIBUTES = ["title", "href", "src"]; public static $KEPT_ATTRIBUTES = ["title", "href", "src"];
public static $ONLY_TEXT = []; public static $ONLY_TEXT = [];
public function __construct($tags_to_remove = null, $kept_attributes = null, $only_keep_text = null) { public function __construct($tags_to_remove = null
$this->tagsToRemove = $tags_to_remove == null ? HTMLSanitizer::$DEFAULT_CLEAR_TAGS : $tags_to_remove; , $kept_attributes = null
$this->keptAttributes = $kept_attributes == null ? HTMLSanitizer::$KEPT_ATTRIBUTES : $kept_attributes; , $only_keep_text = null){
$this->onlyKeepText = $only_keep_text == null ? HTMLSanitizer::$ONLY_TEXT : $only_keep_text; $this->tagsToRemove = is_null($tags_to_remove) ? HTMLSanitizer::$DEFAULT_CLEAR_TAGS : $tags_to_remove;
$this->keptAttributes = is_null($kept_attributes) ? HTMLSanitizer::$KEPT_ATTRIBUTES : $kept_attributes;
$this->onlyKeepText = is_null($only_keep_text) ? HTMLSanitizer::$ONLY_TEXT : $only_keep_text;
} }
public function sanitize($textToSanitize){ public function sanitize($textToSanitize){
@ -191,7 +297,9 @@ class HTMLSanitizer {
public static function defaultImageSrcTo($content, $server){ public static function defaultImageSrcTo($content, $server){
foreach($content->find('img') as $image){ foreach($content->find('img') as $image){
if(strpos($image->src, "http") == NULL && strpos($image->src, "//") == NULL && strpos($image->src, "data:") == NULL) if(is_null(strpos($image->src, "http"))
&& is_null(strpos($image->src, "//"))
&& is_null(strpos($image->src, "data:")))
$image->src = $server . $image->src; $image->src = $server . $image->src;
} }
return $content; return $content;

View file

@ -19,7 +19,11 @@ require __DIR__ . '/HTMLUtils.php';
$vendorLibSimpleHtmlDom = __DIR__ . PATH_VENDOR . '/simplehtmldom/simple_html_dom.php'; $vendorLibSimpleHtmlDom = __DIR__ . PATH_VENDOR . '/simplehtmldom/simple_html_dom.php';
if( !file_exists($vendorLibSimpleHtmlDom) ){ if( !file_exists($vendorLibSimpleHtmlDom) ){
throw new \HttpException('"PHP Simple HTML DOM Parser" library is missing. Get it from http://simplehtmldom.sourceforge.net and place the script "simple_html_dom.php" in '.substr(PATH_VENDOR,4) . '/simplehtmldom/', 500); throw new \HttpException('"PHP Simple HTML DOM Parser" library is missing.
Get it from http://simplehtmldom.sourceforge.net and place the script "simple_html_dom.php" in '
. substr(PATH_VENDOR,4)
. '/simplehtmldom/'
, 500);
} }
require_once $vendorLibSimpleHtmlDom; require_once $vendorLibSimpleHtmlDom;

View file

@ -18,38 +18,12 @@
<rule ref="Generic.NamingConventions.UpperCaseConstantName"/> <rule ref="Generic.NamingConventions.UpperCaseConstantName"/>
<rule ref="Generic.PHP.LowerCaseConstant"/> <rule ref="Generic.PHP.LowerCaseConstant"/>
<rule ref="Generic.Strings.UnnecessaryStringConcat"/> <rule ref="Generic.Strings.UnnecessaryStringConcat"/>
<rule ref="Generic.WhiteSpace.DisallowTabIndent"/> <rule ref="Generic.WhiteSpace.DisallowSpaceIndent"/>
<rule ref="Generic.WhiteSpace.ScopeIndent">
<properties>
<property name="indent" value="2"/>
</properties>
</rule>
<rule ref="PEAR.Functions.FunctionCallSignature">
<properties>
<property name="indent" value="2"/>
</properties>
</rule>
<rule ref="PEAR.Functions.ValidDefaultValue"/> <rule ref="PEAR.Functions.ValidDefaultValue"/>
<rule ref="PEAR.NamingConventions.ValidClassName"/> <rule ref="PEAR.NamingConventions.ValidClassName"/>
<rule ref="PEAR.WhiteSpace.ObjectOperatorIndent">
<properties>
<property name="indent" value="2"/>
</properties>
</rule>
<rule ref="PEAR.WhiteSpace.ScopeClosingBrace">
<properties>
<property name="indent" value="2"/>
</properties>
</rule>
<rule ref="PSR2.ControlStructures.ElseIfDeclaration"/> <rule ref="PSR2.ControlStructures.ElseIfDeclaration"/>
<rule ref="PSR2.ControlStructures.SwitchDeclaration">
<properties>
<property name="indent" value="2"/>
</properties>
</rule>
<rule ref="PSR2.Files.EndFileNewline"/> <rule ref="PSR2.Files.EndFileNewline"/>
<rule ref="Squiz.WhiteSpace.CastSpacing"/> <rule ref="Squiz.WhiteSpace.CastSpacing"/>
<rule ref="Squiz.WhiteSpace.ObjectOperatorSpacing"/>
<rule ref="Squiz.WhiteSpace.OperatorSpacing"/> <rule ref="Squiz.WhiteSpace.OperatorSpacing"/>
<rule ref="Squiz.WhiteSpace.SemicolonSpacing"/> <rule ref="Squiz.WhiteSpace.SemicolonSpacing"/>
<rule ref="Squiz.WhiteSpace.SuperfluousWhitespace"/> <rule ref="Squiz.WhiteSpace.SuperfluousWhitespace"/>