forked from blallo/rss-bridge
[core] Apply some fixes
This commit is contained in:
parent
62eec43980
commit
ab16af631e
10 changed files with 153 additions and 136 deletions
|
@ -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">
|
||||||
|
|
|
@ -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>
|
||||||
|
|
84
index.php
84
index.php
|
@ -2,7 +2,7 @@
|
||||||
/*
|
/*
|
||||||
TODO :
|
TODO :
|
||||||
- factorize the annotation system
|
- factorize the annotation system
|
||||||
- factorize to adapter : Format, Bridge, Cache (actually code is almost the same)
|
- factorize to adapter : Format, Bridge, Cache(actually code is almost the same)
|
||||||
- implement annotation cache for entrance page
|
- implement annotation cache for entrance page
|
||||||
- Cache : I think logic must be change as least to avoid to reconvert object from json in FileCache case.
|
- Cache : I think logic must be change as least to avoid to reconvert object from json in FileCache case.
|
||||||
- add namespace to avoid futur problem ?
|
- add namespace to avoid futur problem ?
|
||||||
|
@ -12,9 +12,9 @@ TODO :
|
||||||
|
|
||||||
//define('PROXY_URL', 'tcp://192.168.0.0:28');
|
//define('PROXY_URL', 'tcp://192.168.0.0:28');
|
||||||
// Set to true if you allow users to disable proxy usage for specific bridges
|
// Set to true if you allow users to disable proxy usage for specific bridges
|
||||||
define('PROXY_BYBRIDGE',false);
|
define('PROXY_BYBRIDGE', false);
|
||||||
// Comment this line or keep PROXY_NAME empty to display PROXY_URL instead
|
// Comment this line or keep PROXY_NAME empty to display PROXY_URL instead
|
||||||
define('PROXY_NAME','Hidden Proxy Name');
|
define('PROXY_NAME', 'Hidden Proxy Name');
|
||||||
|
|
||||||
date_default_timezone_set('UTC');
|
date_default_timezone_set('UTC');
|
||||||
error_reporting(0);
|
error_reporting(0);
|
||||||
|
@ -22,23 +22,23 @@ error_reporting(0);
|
||||||
/*
|
/*
|
||||||
Create a file named 'DEBUG' for enabling debug mode.
|
Create a file named 'DEBUG' for enabling debug mode.
|
||||||
For further security, you may put whitelisted IP addresses
|
For further security, you may put whitelisted IP addresses
|
||||||
in the 'DEBUG' file, one IP per line. Empty file allows anyone (!).
|
in the 'DEBUG' file, one IP per line. Empty file allows anyone(!).
|
||||||
Debugging allows displaying PHP error messages and bypasses the cache: this can allow a malicious
|
Debugging allows displaying PHP error messages and bypasses the cache: this can allow a malicious
|
||||||
client to retrieve data about your server and hammer a provider throught your rss-bridge instance.
|
client to retrieve data about your server and hammer a provider throught your rss-bridge instance.
|
||||||
*/
|
*/
|
||||||
if (file_exists('DEBUG')) {
|
if(file_exists('DEBUG')){
|
||||||
$debug_enabled = true;
|
$debug_enabled = true;
|
||||||
$debug_whitelist = trim(file_get_contents('DEBUG'));
|
$debug_whitelist = trim(file_get_contents('DEBUG'));
|
||||||
if (strlen($debug_whitelist) > 0) {
|
if(strlen($debug_whitelist) > 0){
|
||||||
$debug_enabled = false;
|
$debug_enabled = false;
|
||||||
foreach (explode("\n", $debug_whitelist) as $allowed_ip) {
|
foreach(explode("\n", $debug_whitelist) as $allowed_ip){
|
||||||
if (trim($allowed_ip) === $_SERVER['REMOTE_ADDR']) {
|
if(trim($allowed_ip) === $_SERVER['REMOTE_ADDR']){
|
||||||
$debug_enabled = true;
|
$debug_enabled = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ($debug_enabled) {
|
if($debug_enabled){
|
||||||
ini_set('display_errors', '1');
|
ini_set('display_errors', '1');
|
||||||
error_reporting(E_ALL);
|
error_reporting(E_ALL);
|
||||||
define('DEBUG', 'true');
|
define('DEBUG', 'true');
|
||||||
|
@ -48,11 +48,13 @@ if (file_exists('DEBUG')) {
|
||||||
require_once __DIR__ . '/lib/RssBridge.php';
|
require_once __DIR__ . '/lib/RssBridge.php';
|
||||||
|
|
||||||
// extensions check
|
// extensions check
|
||||||
if (!extension_loaded('openssl'))
|
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';
|
||||||
|
@ -74,42 +76,42 @@ $whitelist_default = array(
|
||||||
"WikipediaBridge",
|
"WikipediaBridge",
|
||||||
"YoutubeBridge");
|
"YoutubeBridge");
|
||||||
|
|
||||||
if (!file_exists($whitelist_file)) {
|
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));
|
||||||
}
|
}
|
||||||
|
|
||||||
Cache::purge();
|
Cache::purge();
|
||||||
|
|
||||||
try{
|
try {
|
||||||
|
|
||||||
Bridge::setDir(__DIR__ . '/bridges/');
|
Bridge::setDir(__DIR__ . '/bridges/');
|
||||||
Format::setDir(__DIR__ . '/formats/');
|
Format::setDir(__DIR__ . '/formats/');
|
||||||
Cache::setDir(__DIR__ . '/caches/');
|
Cache::setDir(__DIR__ . '/caches/');
|
||||||
|
|
||||||
$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
|
||||||
if(($pos=strpos($bridge,'Bridge'))===(strlen($bridge)-strlen('Bridge'))){
|
if(($pos = strpos($bridge, 'Bridge')) === (strlen($bridge) - strlen('Bridge'))){
|
||||||
$bridge=substr($bridge,0,$pos);
|
$bridge = substr($bridge, 0, $pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
$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);
|
||||||
die;
|
die;
|
||||||
}
|
}
|
||||||
|
@ -118,21 +120,20 @@ 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']);
|
||||||
unset($params['bridge']);
|
unset($params['bridge']);
|
||||||
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);
|
||||||
|
@ -143,20 +144,19 @@ try{
|
||||||
'uri' => $bridge->getURI(),
|
'uri' => $bridge->getURI(),
|
||||||
))
|
))
|
||||||
->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());
|
||||||
}
|
}
|
||||||
|
@ -182,18 +182,14 @@ $formats = Format::searchInformation();
|
||||||
</header>
|
</header>
|
||||||
<?php
|
<?php
|
||||||
$activeFoundBridgeCount = 0;
|
$activeFoundBridgeCount = 0;
|
||||||
$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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,8 +36,7 @@ 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.'
|
throw new \Exception('The bridge you looking for does not exist. It should be at path '
|
||||||
. ' It should be at path '
|
|
||||||
. $pathBridge);
|
. $pathBridge);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -348,7 +348,7 @@ abstract class BridgeAbstract implements BridgeInterface {
|
||||||
if(is_null($context)){
|
if(is_null($context)){
|
||||||
$context = stream_context_create($contextOptions);
|
$context = stream_context_create($contextOptions);
|
||||||
} else {
|
} else {
|
||||||
$prevContext=$context;
|
$prevContext = $context;
|
||||||
if(!stream_context_set_option($context, $contextOptions)){
|
if(!stream_context_set_option($context, $contextOptions)){
|
||||||
$context = $prevContext;
|
$context = $prevContext;
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,8 +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'
|
throw new \InvalidArgumentException('Name cache must be at least one
|
||||||
. ' one uppercase follow or not by alphanumeric or dash characters.');
|
uppercase follow or not by alphanumeric or dash characters.');
|
||||||
}
|
}
|
||||||
|
|
||||||
$pathCache = self::getDir() . $nameCache . '.php';
|
$pathCache = self::getDir() . $nameCache . '.php';
|
||||||
|
@ -72,7 +72,7 @@ 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(
|
||||||
|
|
|
@ -10,8 +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 '
|
throw new \InvalidArgumentException('Name format must be at least
|
||||||
. 'one uppercase follow or not by alphabetic characters.');
|
one uppercase follow or not by alphabetic characters.');
|
||||||
}
|
}
|
||||||
|
|
||||||
$nameFormat = $nameFormat . 'Format';
|
$nameFormat = $nameFormat . 'Format';
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -73,7 +73,7 @@ CARD;
|
||||||
|
|
||||||
$card .= HTMLUtils::getFormHeader($bridgeName);
|
$card .= HTMLUtils::getFormHeader($bridgeName);
|
||||||
|
|
||||||
foreach($parameter as $id=>$inputEntry){
|
foreach($parameter as $id => $inputEntry){
|
||||||
$additionalInfoString = '';
|
$additionalInfoString = '';
|
||||||
|
|
||||||
if(isset($inputEntry['required']) && $inputEntry['required'] === true)
|
if(isset($inputEntry['required']) && $inputEntry['required'] === true)
|
||||||
|
|
|
@ -19,9 +19,8 @@ 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.'
|
throw new \HttpException('"PHP Simple HTML DOM Parser" library is missing.
|
||||||
. ' Get it from http://simplehtmldom.sourceforge.net and place the script'
|
Get it from http://simplehtmldom.sourceforge.net and place the script "simple_html_dom.php" in '
|
||||||
. ' "simple_html_dom.php" in '
|
|
||||||
. substr(PATH_VENDOR,4)
|
. substr(PATH_VENDOR,4)
|
||||||
. '/simplehtmldom/'
|
. '/simplehtmldom/'
|
||||||
, 500);
|
, 500);
|
||||||
|
|
Loading…
Reference in a new issue