improve image-proxy

- use passthrough mode for image proxy (fixes #295)
- add image proxy when rendering an article (fixes #314)
- add referrer cloaking option to feed options (fixes #319)
This commit is contained in:
Mathias Kresin 2015-02-01 22:54:57 +01:00
parent e1d0de8054
commit f3e9b4d9b5
40 changed files with 138 additions and 39 deletions

View File

@ -74,12 +74,6 @@ Router\get_action('more', function() {
// Image proxy (avoid SSL mixed content warnings)
Router\get_action('proxy', function() {
list($content, $type) = Model\Proxy\download(rawurldecode(Request\param('url')));
if (empty($content)) {
Response\text('Not Found', 404);
}
Response\content_type($type);
Response\raw($content);
Model\Proxy\download(rawurldecode(Request\param('url')));
exit;
});

View File

@ -158,9 +158,9 @@ Router\action('subscribe', function() {
}
}
$values += array('download_content' => 0, 'rtl' => 0);
$values += array('download_content' => 0, 'rtl' => 0, 'cloak_referrer' => 0);
$url = trim($url);
$feed_id = Model\Feed\create($url, $values['download_content'], $values['rtl']);
$feed_id = Model\Feed\create($url, $values['download_content'], $values['rtl'], $values['cloak_referrer']);
if ($feed_id) {
Session\flash(t('Subscription added successfully.'));

View File

@ -66,6 +66,15 @@ Router\get_action('show', function() {
break;
}
$image_proxy = Model\Config\get('image_proxy');
// add the image proxy if requested and required
$item['content'] = Model\Proxy\addProxyToTags($item['content'], $item['url'], $image_proxy, $feed['cloak_referrer']);
if ($image_proxy && strpos($item['enclosure_type'], 'image') === 0) {
$item['enclosure'] = Model\Proxy\addProxyToLink($item['enclosure']);
}
Response\html(Template\layout('show_item', array(
'nb_unread_items' => $nb_unread_items = Model\Item\count_by_status('unread'),
'item' => $item,
@ -73,7 +82,6 @@ Router\get_action('show', function() {
'item_nav' => isset($nav) ? $nav : null,
'menu' => $menu,
'title' => $item['title'],
'image_proxy_enabled' => (bool) Model\Config\get('image_proxy'),
)));
});
@ -107,8 +115,15 @@ Router\get_action('feed-items', function() {
// Ajax call to download an item (fetch the full content from the original website)
Router\post_action('download-item', function() {
$id = Request\param('id');
Response\json(Model\Item\download_content_id(Request\param('id')));
$item = Model\Item\get($id);
$feed = Model\Feed\get($item['feed_id']);
$download = Model\Item\download_content_id($id);
$download['content'] = Model\Proxy\addProxyToTags($download['content'], $item['url'], Model\Config\get('image_proxy'), $feed['cloak_referrer']);
Response\json($download);
});
// Ajax call change item status

View File

@ -235,4 +235,5 @@ return array(
// 'Nothing to show. Enable the debug mode to see log messages.' => '',
// 'Enable debug mode' => '',
// 'Original link marks article as read' => '',
// 'Cloak the image referrer' => '',
);

View File

@ -235,4 +235,5 @@ return array(
// 'Nothing to show. Enable the debug mode to see log messages.' => '',
// 'Enable debug mode' => '',
// 'Original link marks article as read' => '',
// 'Cloak the image referrer' => '',
);

View File

@ -235,4 +235,5 @@ return array(
// 'Nothing to show. Enable the debug mode to see log messages.' => '',
// 'Enable debug mode' => '',
// 'Original link marks article as read' => '',
// 'Cloak the image referrer' => '',
);

View File

@ -235,4 +235,5 @@ return array(
'Nothing to show. Enable the debug mode to see log messages.' => 'Rien à montrer. Activez le mode debug pour voir les messages de log.',
'Enable debug mode' => 'Activer le mode debug',
'Original link marks article as read' => 'Marquer les articles comme lu lors d\'un clic sur le lien original',
'Cloak the image referrer' => 'Cloak the image referrer',
);

View File

@ -235,4 +235,5 @@ return array(
// 'Nothing to show. Enable the debug mode to see log messages.' => '',
// 'Enable debug mode' => '',
// 'Original link marks article as read' => '',
// 'Cloak the image referrer' => '',
);

View File

@ -235,4 +235,5 @@ return array(
// 'Nothing to show. Enable the debug mode to see log messages.' => '',
// 'Enable debug mode' => '',
// 'Original link marks article as read' => '',
// 'Cloak the image referrer' => '',
);

View File

@ -235,4 +235,5 @@ return array(
// 'Nothing to show. Enable the debug mode to see log messages.' => '',
// 'Enable debug mode' => '',
// 'Original link marks article as read' => '',
// 'Cloak the image referrer' => '',
);

View File

@ -32,10 +32,6 @@ function get_reader_config()
// Filter
$config->setFilterIframeWhitelist(get_iframe_whitelist());
if ((bool) get('image_proxy')) {
$config->setFilterImageProxyUrl('?action=proxy&url=%s');
}
if ((bool) get('debug_mode')) {
Logger::enable();
}

View File

@ -102,6 +102,7 @@ function update(array $values)
'enabled' => empty($values['enabled']) ? 0 : $values['enabled'],
'rtl' => empty($values['rtl']) ? 0 : $values['rtl'],
'download_content' => empty($values['download_content']) ? 0 : $values['download_content'],
'cloak_referrer' => empty($values['cloak_referrer']) ? 0 : $values['cloak_referrer'],
));
}
@ -148,7 +149,7 @@ function import_opml($content)
}
// Add a new feed from an URL
function create($url, $enable_grabber = false, $force_rtl = false)
function create($url, $enable_grabber = false, $force_rtl = false, $cloak_referrer = false)
{
try {
$db = Database::get('db');
@ -185,6 +186,7 @@ function create($url, $enable_grabber = false, $force_rtl = false)
'last_modified' => $resource->getLastModified(),
'last_checked' => time(),
'etag' => $resource->getEtag(),
'cloak_referrer' => $cloak_referrer ? 1 : 0,
));
if ($result) {

View File

@ -3,26 +3,61 @@
namespace Model\Proxy;
use Model\Config;
use PicoFeed\Config\Config as PicoFeedConfig;
use PicoFeed\Filter\Filter;
use PicoFeed\Client\Client;
use PicoFeed\Client\ClientException;
function isSecureConnection()
{
return (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off');
}
function addProxyToLink($link) {
if (isSecureConnection() && strpos($link, 'http:') === 0) {
$link = '?action=proxy&url='.urlencode($link);
}
return $link;
}
function addProxyToTags($html, $website, $proxy_images, $cloak_referrer)
{
if ($html === '' // no content, no proxy
|| (! $cloak_referrer && ! $proxy_images) // neither cloaking nor proxing enabled
|| (! $cloak_referrer && $proxy_images && ! isSecureConnection())) { // only proxy enabled, but not connected via HTTPS
return $html;
}
$config = new PicoFeedConfig();
$config->setFilterImageProxyUrl('?action=proxy&url=%s');
if (! $cloak_referrer && $proxy_images) {
// image proxy mode only: https links do not need to be proxied, since
// they do not trigger mixed content warnings.
$config->setFilterImageProxyProtocol('http');
}
elseif (! $proxy_images && $cloak_referrer && isSecureConnection() ) {
// cloaking mode only: if a request from a HTTPS connection to a HTTP
// connection is made, the referrer will be omitted by the browser.
// Only the referrer for HTTPS to HTTPs requests needs to be cloaked.
$config->setFilterImageProxyProtocol('https');
}
$filter = Filter::html($html, $website);
$filter->setConfig($config);
return $filter->execute();
}
function download($url)
{
try {
$client = Client::getInstance();
$client->setUserAgent(Config\HTTP_USER_AGENT);
$client->execute($url);
$content = array(
$client->getContent(),
$client->getContentType(),
);
}
catch (ClientException $e) {
$content = array(false, false);
}
$client = Client::getInstance();
$client->setUserAgent(Config\HTTP_USER_AGENT);
$client->enablePassthroughMode();
$client->execute($url);
// does not work
Config\write_debug();
return $content;
}

View File

@ -5,7 +5,12 @@ namespace Schema;
use PDO;
use Model\Config;
const VERSION = 38;
const VERSION = 39;
function version_39($pdo)
{
$pdo->exec('ALTER TABLE feeds ADD COLUMN cloak_referrer INTEGER DEFAULT 0');
}
function version_38($pdo)
{

View File

@ -19,6 +19,7 @@
<?= Helper\form_checkbox('rtl', t('Force RTL mode (Right-to-left language)'), 1, isset($values['rtl']) ? $values['rtl'] : false) ?><br/>
<?= Helper\form_checkbox('download_content', t('Download full content'), 1, isset($values['download_content']) ? $values['download_content'] : false) ?><br/>
<?= Helper\form_checkbox('cloak_referrer', t('Cloak the image referrer'), 1, isset($values['cloak_referrer']) ? $values['cloak_referrer'] : false) ?><br />
<p class="form-help"><?= t('Downloading full content is slower because Miniflux grab the content from the original website. You should use that for subscriptions that display only a summary. This feature doesn\'t work with all websites.') ?></p>
<div class="form-actions">

View File

@ -25,6 +25,8 @@
<?= Helper\form_checkbox('download_content', t('Download full content'), 1, isset($values['download_content']) ? $values['download_content'] : false) ?><br />
<?= Helper\form_checkbox('cloak_referrer', t('Cloak the image referrer'), 1, isset($values['cloak_referrer']) ? $values['cloak_referrer'] : false) ?><br />
<?= Helper\form_checkbox('enabled', t('Activated'), 1, isset($values['enabled']) ? $values['enabled'] : false) ?>
<div class="form-actions">

View File

@ -81,11 +81,7 @@
</div>
<?php elseif (strpos($item['enclosure_type'], 'image') !== false && $item['content'] === ''): ?>
<div id="item-content-enclosure">
<?php if ($image_proxy_enabled): ?>
<img src="?action=proxy&amp;url=<?= urlencode($item['enclosure']) ?>" alt="enclosure"/>
<?php else: ?>
<img src="<?= $item['enclosure'] ?>" alt="enclosure"/>
<?php endif ?>
<img src="<?= $item['enclosure'] ?>" alt="enclosure"/>
</div>
<?php endif ?>
<?php endif ?>

View File

@ -12,6 +12,7 @@
<column>download_content</column>
<column>parsing_error</column>
<column>rtl</column>
<column>cloak_referrer</column>
<row>
<value>1</value>
<value>http://miniflux.net/</value>
@ -24,6 +25,7 @@
<value>0</value>
<value>0</value>
<value>0</value>
<value>0</value>
</row>
</table>
<table name="items">

View File

@ -12,6 +12,7 @@
<column>download_content</column>
<column>parsing_error</column>
<column>rtl</column>
<column>cloak_referrer</column>
<row>
<value>1</value>
<value>http://miniflux.net/</value>
@ -24,6 +25,7 @@
<value>0</value>
<value>0</value>
<value>0</value>
<value>0</value>
</row>
</table>
<table name="items">

View File

@ -12,6 +12,7 @@
<column>download_content</column>
<column>parsing_error</column>
<column>rtl</column>
<column>cloak_referrer</column>
<row>
<value>1</value>
<value>http://miniflux.net/</value>
@ -24,6 +25,7 @@
<value>0</value>
<value>0</value>
<value>0</value>
<value>0</value>
</row>
</table>
<table name="items">

View File

@ -12,6 +12,7 @@
<column>download_content</column>
<column>parsing_error</column>
<column>rtl</column>
<column>cloak_referrer</column>
<row>
<value>1</value>
<value>http://miniflux.net/</value>
@ -24,6 +25,7 @@
<value>0</value>
<value>0</value>
<value>0</value>
<value>0</value>
</row>
</table>
<table name="items">

View File

@ -12,6 +12,7 @@
<column>download_content</column>
<column>parsing_error</column>
<column>rtl</column>
<column>cloak_referrer</column>
<row>
<value>1</value>
<value>http://miniflux.net/</value>
@ -24,6 +25,7 @@
<value>0</value>
<value>0</value>
<value>0</value>
<value>0</value>
</row>
</table>
<table name="items">

View File

@ -12,6 +12,7 @@
<column>download_content</column>
<column>parsing_error</column>
<column>rtl</column>
<column>cloak_referrer</column>
<row>
<value>1</value>
<value>http://miniflux.net/</value>
@ -24,6 +25,7 @@
<value>0</value>
<value>0</value>
<value>0</value>
<value>0</value>
</row>
</table>
<table name="items">

View File

@ -12,6 +12,7 @@
<column>download_content</column>
<column>parsing_error</column>
<column>rtl</column>
<column>cloak_referrer</column>
<row>
<value>1</value>
<value>http://miniflux.net/</value>
@ -24,6 +25,7 @@
<value>0</value>
<value>0</value>
<value>0</value>
<value>0</value>
</row>
</table>
<table name="items">

View File

@ -12,6 +12,7 @@
<column>download_content</column>
<column>parsing_error</column>
<column>rtl</column>
<column>cloak_referrer</column>
<row>
<value>1</value>
<value>http://miniflux.net/</value>
@ -24,6 +25,7 @@
<value>0</value>
<value>0</value>
<value>0</value>
<value>0</value>
</row>
</table>
<table name="items">

View File

@ -12,6 +12,7 @@
<column>download_content</column>
<column>parsing_error</column>
<column>rtl</column>
<column>cloak_referrer</column>
<row>
<value>1</value>
<value>http://miniflux.net/</value>
@ -24,6 +25,7 @@
<value>0</value>
<value>0</value>
<value>0</value>
<value>0</value>
</row>
<row>
<value>2</value>

View File

@ -12,6 +12,7 @@
<column>download_content</column>
<column>parsing_error</column>
<column>rtl</column>
<column>cloak_referrer</column>
<row>
<value>1</value>
<value>http://miniflux.net/</value>
@ -24,6 +25,7 @@
<value>0</value>
<value>0</value>
<value>0</value>
<value>0</value>
</row>
<row>
<value>2</value>

View File

@ -12,6 +12,7 @@
<column>download_content</column>
<column>parsing_error</column>
<column>rtl</column>
<column>cloak_referrer</column>
<row>
<value>1</value>
<value>http://miniflux.net/</value>
@ -24,6 +25,7 @@
<value>0</value>
<value>0</value>
<value>0</value>
<value>0</value>
</row>
<row>
<value>2</value>

View File

@ -12,6 +12,7 @@
<column>download_content</column>
<column>parsing_error</column>
<column>rtl</column>
<column>cloak_referrer</column>
<row>
<value>1</value>
<value>http://miniflux.net/</value>
@ -24,6 +25,7 @@
<value>0</value>
<value>0</value>
<value>0</value>
<value>0</value>
</row>
</table>
<table name="items">

View File

@ -12,6 +12,7 @@
<column>download_content</column>
<column>parsing_error</column>
<column>rtl</column>
<column>cloak_referrer</column>
<row>
<value>1</value>
<value>http://miniflux.net/</value>
@ -24,6 +25,7 @@
<value>0</value>
<value>0</value>
<value>0</value>
<value>0</value>
</row>
</table>
<table name="items">

View File

@ -12,6 +12,7 @@
<column>download_content</column>
<column>parsing_error</column>
<column>rtl</column>
<column>cloak_referrer</column>
<row>
<value>1</value>
<value>http://miniflux.net/</value>
@ -24,6 +25,7 @@
<value>0</value>
<value>0</value>
<value>0</value>
<value>0</value>
</row>
</table>
<table name="items">

View File

@ -12,6 +12,7 @@
<column>download_content</column>
<column>parsing_error</column>
<column>rtl</column>
<column>cloak_referrer</column>
<row>
<value>1</value>
<value>http://miniflux.net/</value>
@ -24,6 +25,7 @@
<value>0</value>
<value>0</value>
<value>0</value>
<value>0</value>
</row>
</table>
<table name="items">

View File

@ -12,6 +12,7 @@
<column>download_content</column>
<column>parsing_error</column>
<column>rtl</column>
<column>cloak_referrer</column>
<row>
<value>1</value>
<value>http://miniflux.net/</value>
@ -24,6 +25,7 @@
<value>0</value>
<value>0</value>
<value>0</value>
<value>0</value>
</row>
</table>
<table name="items">

View File

@ -12,6 +12,7 @@
<column>download_content</column>
<column>parsing_error</column>
<column>rtl</column>
<column>cloak_referrer</column>
<row>
<value>1</value>
<value>http://miniflux.net/</value>
@ -24,6 +25,7 @@
<value>0</value>
<value>0</value>
<value>0</value>
<value>0</value>
</row>
</table>
<table name="items">

View File

@ -12,6 +12,7 @@
<column>download_content</column>
<column>parsing_error</column>
<column>rtl</column>
<column>cloak_referrer</column>
<row>
<value>1</value>
<value>http://miniflux.net/</value>
@ -24,6 +25,7 @@
<value>0</value>
<value>0</value>
<value>0</value>
<value>0</value>
</row>
<row>
<value>2</value>

View File

@ -12,6 +12,7 @@
<column>download_content</column>
<column>parsing_error</column>
<column>rtl</column>
<column>cloak_referrer</column>
<row>
<value>1</value>
<value>http://miniflux.net/</value>
@ -24,6 +25,7 @@
<value>0</value>
<value>0</value>
<value>0</value>
<value>0</value>
</row>
<row>
<value>2</value>

View File

@ -12,6 +12,7 @@
<column>download_content</column>
<column>parsing_error</column>
<column>rtl</column>
<column>cloak_referrer</column>
<row>
<value>1</value>
<value>http://miniflux.net/</value>
@ -24,6 +25,7 @@
<value>0</value>
<value>0</value>
<value>0</value>
<value>0</value>
</row>
</table>
<table name="items">

View File

@ -12,6 +12,7 @@
<column>download_content</column>
<column>parsing_error</column>
<column>rtl</column>
<column>cloak_referrer</column>
<row>
<value>1</value>
<value>http://miniflux.net/</value>
@ -24,6 +25,7 @@
<value>0</value>
<value>1</value>
<value>0</value>
<value>0</value>
</row>
</table>
<table name="items">

View File

@ -12,6 +12,7 @@
<column>download_content</column>
<column>parsing_error</column>
<column>rtl</column>
<column>cloak_referrer</column>
<row>
<value>2</value>
<value>https://github.com/fguillot/miniflux/commits/master</value>
@ -24,6 +25,7 @@
<value>0</value>
<value>0</value>
<value>0</value>
<value>0</value>
</row>
</table>
<table name="items">

View File

@ -12,6 +12,7 @@
<column>download_content</column>
<column>parsing_error</column>
<column>rtl</column>
<column>cloak_referrer</column>
<row>
<value>1</value>
<value>http://www.01net.com/actus/</value>
@ -24,6 +25,7 @@
<value>0</value>
<value>0</value>
<value>0</value>
<value>0</value>
</row>
<row>
<value>2</value>