aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Alexandre Alapetite <alexandre@alapetite.fr> 2013-12-27 14:52:56 +0100
committerGravatar Alexandre Alapetite <alexandre@alapetite.fr> 2013-12-27 14:52:56 +0100
commitf52ccf7038199f1eb2f82d7e1f26d2a10caa867b (patch)
tree7c8235198b6b587574b41175a167103d31740a9a
parent7b4451912e2a9008a49854a2496cf9bb99b7ed10 (diff)
parentb99979cef78f7cd0c1cb4ae81115d09881e85926 (diff)
Merge remote-tracking branch 'origin/dev' into beta
-rw-r--r--CHANGELOG8
-rw-r--r--README.md6
-rw-r--r--app/.htaccess3
-rwxr-xr-xapp/Controllers/entryController.php2
-rwxr-xr-xapp/Controllers/feedController.php29
-rw-r--r--app/FreshRSS.php2
-rw-r--r--app/Models/CategoryDAO.php2
-rw-r--r--app/Models/Configuration.php16
-rw-r--r--app/Models/Entry.php7
-rw-r--r--app/Models/Feed.php39
-rw-r--r--app/Models/FeedDAO.php6
-rwxr-xr-xapp/actualize_script.php (renamed from actualize_script.php)2
-rw-r--r--app/i18n/en.php3
-rw-r--r--app/i18n/fr.php3
-rw-r--r--app/index.html13
-rw-r--r--app/layout/nav_menu.phtml6
-rw-r--r--app/views/helpers/javascript_vars.phtml7
-rw-r--r--app/views/index/about.phtml3
-rw-r--r--constants.php19
-rw-r--r--data/index.html2
-rw-r--r--index.html6
-rw-r--r--index.php3
-rw-r--r--lib/.htaccess3
-rw-r--r--lib/Minz/Configuration.php2
-rw-r--r--lib/Minz/Session.php31
-rw-r--r--lib/Minz/Url.php15
-rw-r--r--p/.htaccess (renamed from public/.htaccess)0
-rw-r--r--p/f.php (renamed from public/f.php)11
-rw-r--r--p/favicon.ico (renamed from public/favicon.ico)bin1150 -> 1150 bytes
-rw-r--r--p/favicon.png (renamed from public/favicon.png)bin694 -> 694 bytes
-rwxr-xr-xp/i/index.php (renamed from public/index.php)2
-rw-r--r--p/i/install.php (renamed from public/install.php)42
-rw-r--r--p/index.html12
-rw-r--r--p/index.php3
-rw-r--r--p/robots.txt (renamed from public/robots.txt)0
-rw-r--r--p/scripts/global_view.js (renamed from public/scripts/global_view.js)0
-rw-r--r--p/scripts/jquery-2.0.3.min.map (renamed from public/scripts/jquery-2.0.3.min.map)0
-rw-r--r--p/scripts/jquery.lazyload.min.js (renamed from public/scripts/jquery.lazyload.min.js)0
-rw-r--r--p/scripts/jquery.min.js (renamed from public/scripts/jquery.min.js)0
-rw-r--r--p/scripts/main.js (renamed from public/scripts/main.js)0
-rw-r--r--p/scripts/shortcut.js (renamed from public/scripts/shortcut.js)0
-rw-r--r--p/themes/default/freshrss.css (renamed from public/themes/default/freshrss.css)2
-rw-r--r--p/themes/default/global.css (renamed from public/themes/default/global.css)0
-rw-r--r--p/themes/default/loader.gif (renamed from public/themes/default/loader.gif)bin4167 -> 4167 bytes
-rw-r--r--p/themes/default/metadata.json (renamed from public/themes/default/metadata.json)0
-rw-r--r--p/themes/flat-design/freshrss.css (renamed from public/themes/flat-design/freshrss.css)2
-rw-r--r--p/themes/flat-design/global.css (renamed from public/themes/flat-design/global.css)0
-rw-r--r--p/themes/flat-design/icons/add.svg (renamed from public/themes/flat-design/icons/add.svg)0
-rw-r--r--p/themes/flat-design/icons/all.svg (renamed from public/themes/flat-design/icons/all.svg)0
-rw-r--r--p/themes/flat-design/icons/close.svg (renamed from public/themes/flat-design/icons/close.svg)0
-rw-r--r--p/themes/flat-design/icons/configure.svg (renamed from public/themes/flat-design/icons/configure.svg)0
-rw-r--r--p/themes/flat-design/icons/down.svg (renamed from public/themes/flat-design/icons/down.svg)0
-rw-r--r--p/themes/flat-design/icons/next.svg (renamed from public/themes/flat-design/icons/next.svg)0
-rw-r--r--p/themes/flat-design/icons/prev.svg (renamed from public/themes/flat-design/icons/prev.svg)0
-rw-r--r--p/themes/flat-design/icons/refresh.svg (renamed from public/themes/flat-design/icons/refresh.svg)0
-rw-r--r--p/themes/flat-design/icons/search.svg (renamed from public/themes/flat-design/icons/search.svg)0
-rw-r--r--p/themes/flat-design/icons/up.svg (renamed from public/themes/flat-design/icons/up.svg)0
-rw-r--r--p/themes/flat-design/loader.gif (renamed from public/themes/flat-design/loader.gif)bin4251 -> 4251 bytes
-rw-r--r--p/themes/flat-design/metadata.json (renamed from public/themes/flat-design/metadata.json)0
-rw-r--r--p/themes/fonts/openSans.woff (renamed from public/themes/fonts/openSans.woff)bin21956 -> 21956 bytes
-rw-r--r--p/themes/icons/add.svg (renamed from public/themes/icons/add.svg)0
-rw-r--r--p/themes/icons/all.svg (renamed from public/themes/icons/all.svg)0
-rw-r--r--p/themes/icons/bookmark.svg (renamed from public/themes/icons/bookmark.svg)0
-rw-r--r--p/themes/icons/category-white.svg (renamed from public/themes/icons/category-white.svg)0
-rw-r--r--p/themes/icons/category.svg (renamed from public/themes/icons/category.svg)0
-rw-r--r--p/themes/icons/close.svg (renamed from public/themes/icons/close.svg)0
-rw-r--r--p/themes/icons/configure.svg (renamed from public/themes/icons/configure.svg)0
-rw-r--r--p/themes/icons/down.svg (renamed from public/themes/icons/down.svg)0
-rw-r--r--p/themes/icons/grey.gif (renamed from public/themes/icons/grey.gif)bin56 -> 56 bytes
-rw-r--r--p/themes/icons/help.svg (renamed from public/themes/icons/help.svg)0
-rw-r--r--p/themes/icons/icon.svg (renamed from public/themes/icons/icon.svg)0
-rw-r--r--p/themes/icons/link.svg (renamed from public/themes/icons/link.svg)0
-rw-r--r--p/themes/icons/login.svg (renamed from public/themes/icons/login.svg)0
-rw-r--r--p/themes/icons/logout.svg (renamed from public/themes/icons/logout.svg)0
-rw-r--r--p/themes/icons/next.svg (renamed from public/themes/icons/next.svg)0
-rw-r--r--p/themes/icons/non-starred.svg (renamed from public/themes/icons/non-starred.svg)0
-rw-r--r--p/themes/icons/prev.svg (renamed from public/themes/icons/prev.svg)0
-rw-r--r--p/themes/icons/read.svg (renamed from public/themes/icons/read.svg)0
-rw-r--r--p/themes/icons/refresh.svg (renamed from public/themes/icons/refresh.svg)0
-rw-r--r--p/themes/icons/rss.svg (renamed from public/themes/icons/rss.svg)0
-rw-r--r--p/themes/icons/search.svg (renamed from public/themes/icons/search.svg)0
-rw-r--r--p/themes/icons/share.svg (renamed from public/themes/icons/share.svg)0
-rw-r--r--p/themes/icons/starred.svg (renamed from public/themes/icons/starred.svg)0
-rw-r--r--p/themes/icons/tag.svg (renamed from public/themes/icons/tag.svg)0
-rw-r--r--p/themes/icons/unread.svg (renamed from public/themes/icons/unread.svg)0
-rw-r--r--p/themes/icons/up.svg (renamed from public/themes/icons/up.svg)0
86 files changed, 190 insertions, 122 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 05d3a50ec..336245269 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -51,7 +51,15 @@
* Tous les fichiers utilisateur sont dans “./data/” (y compris “cache”, “favicons”, et “log”)
* Déplacement de “./app/configuration/application.ini” vers “./data/config.php”
* Déplacement de “./public/data/Configuration.array.php” vers “./data/*_user.php”
+ * Déplacement de “./public/index.php” vers “./p/i/index.php” (voir cookie ci-dessous)
+ * Déplacement de “./public/” vers “./p/”
+ * Déplacement de “./actualize_script.php” vers “./app/actualize_script.php”
* Divers :
+ * Nouvelle politique de cookie de session (témoin de connexion)
+ * Utilise un nom poli “FreshRSS”
+ * Se limite au répertoire “./FreshRSS/p/i/” pour de meilleures performances HTTP
+ * Les images, CSS, scripts sont servis sans cookie
+ * utilise “HttpOnly” pour plus de sécurité
* Nouvel “agent utilisateur” exposé lors du téléchargement des flux, par exemple :
* “FreshRSS/0.7 (Linux; http://freshrss.org) SimplePie/1.3.1”
diff --git a/README.md b/README.md
index 716859ccf..5051a936c 100644
--- a/README.md
+++ b/README.md
@@ -31,7 +31,7 @@ Privilégiez pour cela des demandes sur GitHub
# Installation
1. Récupérez l’application FreshRSS via la commande git ou [en téléchargeant l’archive](https://github.com/marienfressinaud/FreshRSS/archive/master.zip)
-2. Placez l’application sur votre serveur (la partie à exposer au Web est le répertoire `./public/`)
+2. Placez l’application sur votre serveur (la partie à exposer au Web est le répertoire `./p/`)
3. Le serveur Web doit avoir les droits d’écriture dans le répertoire `./data/`
4. Accédez à FreshRSS à travers votre navigateur Web et suivez les instructions d’installation
5. Tout devrait fonctionner :) En cas de problème, n’hésitez pas à me contacter.
@@ -45,11 +45,11 @@ Il est recommandé de limiter l’accès à votre FreshRSS, soit :
# Rafraîchissement automatique des flux
* Vous pouvez ajouter une tâche CRON sur le script d’actualisation des flux. Par exemple, pour exécuter le script toutes les heures :
```
-7 * * * * php /chemin/vers/freshrss/actualize_script.php >/dev/null 2>&1
+7 * * * * php /chemin/vers/FreshRSS/app/actualize_script.php >/dev/null 2>&1
```
# Conseils
-* Pour une meilleure sécurité, faites en sorte que seul le répertoire `./public` soit accessible depuis le Web, par exemple en faisant pointer un sous-domaine sur le répertoire `./public`.
+* Pour une meilleure sécurité, faites en sorte que seul le répertoire `./p/` soit accessible depuis le Web, par exemple en faisant pointer un sous-domaine sur le répertoire `./p/`.
* Les données personnelles se trouvent dans le répertoire `./data/` (déjà protégé par un .htaccess pour Apache - vérifiez que cela fonctionne -, à protéger vous-même dans le cas d’autres serveurs Web).
* Le fichier `./constants.php` définit les chemins d’accès aux répertoires clés de l’application. Si vous les bougez, tout se passe ici.
* En cas de problème, les logs peuvent être utile à lire, soit depuis l’interface de FreshRSS, soit manuellement depuis `./data/log/*.log`.
diff --git a/app/.htaccess b/app/.htaccess
new file mode 100644
index 000000000..9e768397d
--- /dev/null
+++ b/app/.htaccess
@@ -0,0 +1,3 @@
+Order Allow,Deny
+Deny from all
+Satisfy all
diff --git a/app/Controllers/entryController.php b/app/Controllers/entryController.php
index 1c3c56c4d..26f3422ca 100755
--- a/app/Controllers/entryController.php
+++ b/app/Controllers/entryController.php
@@ -131,7 +131,7 @@ class FreshRSS_entry_Controller extends Minz_ActionController {
$nb = $feedDAO->cleanOldEntries($feed->id(), $date_min, $feedHistory);
if ($nb > 0) {
$nbTotal += $nb;
- Minz_Log::record($nb . ' old entries cleaned in feed ' . $feed->id(), Minz_Log::DEBUG);
+ Minz_Log::record($nb . ' old entries cleaned in feed [' . $feed->url() . ']', Minz_Log::DEBUG);
$feedDAO->updateLastUpdate($feed->id());
}
}
diff --git a/app/Controllers/feedController.php b/app/Controllers/feedController.php
index 04d0aa98b..ca230232f 100755
--- a/app/Controllers/feedController.php
+++ b/app/Controllers/feedController.php
@@ -20,15 +20,6 @@ class FreshRSS_feed_Controller extends Minz_ActionController {
$this->catDAO->checkDefault ();
}
- private static function entryDateComparer($e1, $e2) {
- $d1 = $e1->date(true);
- $d2 = $e2->date(true);
- if ($d1 === $d2) {
- return 0;
- }
- return ($d1 < $d2) ? -1 : 1;
- }
-
public function addAction () {
@set_time_limit(300);
@@ -55,7 +46,7 @@ class FreshRSS_feed_Controller extends Minz_ActionController {
}
$feed->_httpAuth ($httpAuth);
- $feed->load ();
+ $feed->load(true);
$feedDAO = new FreshRSS_FeedDAO ();
$values = array (
@@ -91,8 +82,7 @@ class FreshRSS_feed_Controller extends Minz_ActionController {
$is_read = $this->view->conf->markUponReception() === 'yes' ? 1 : 0;
$entryDAO = new FreshRSS_EntryDAO ();
- $entries = $feed->entries ();
- usort($entries, 'self::entryDateComparer');
+ $entries = array_reverse($feed->entries()); //We want chronological order and SimplePie uses reverse order
// on calcule la date des articles les plus anciens qu'on accepte
$nb_month_old = $this->view->conf->oldEntries ();
@@ -199,10 +189,9 @@ class FreshRSS_feed_Controller extends Minz_ActionController {
$flux_update = 0;
foreach ($feeds as $feed) {
try {
- $feed->load ();
- $feed->faviconPrepare();
- $entries = $feed->entries ();
- usort($entries, 'self::entryDateComparer');
+ $url = $feed->url();
+ $feed->load(false);
+ $entries = array_reverse($feed->entries()); //We want chronological order and SimplePie uses reverse order
$is_read = $this->view->conf->markUponReception() === 'yes' ? 1 : 0;
@@ -231,7 +220,7 @@ class FreshRSS_feed_Controller extends Minz_ActionController {
if (($feedHistory >= 0) && (rand(0, 30) === 1)) {
$nb = $feedDAO->cleanOldEntries ($feed->id (), $date_min, max($feedHistory, count($entries) + 10));
if ($nb > 0) {
- Minz_Log::record ($nb . ' old entries cleaned in feed ' . $feed->id (), Minz_Log::DEBUG);
+ Minz_Log::record ($nb . ' old entries cleaned in feed [' . $feed->url() . ']', Minz_Log::DEBUG);
}
}
@@ -239,6 +228,10 @@ class FreshRSS_feed_Controller extends Minz_ActionController {
$feedDAO->updateLastUpdate ($feed->id ());
$feedDAO->commit ();
$flux_update++;
+ if ($feed->url() !== $url) { //URL has changed (auto-discovery)
+ $feedDAO->updateFeed($feed->id(), array('url' => $feed->url()));
+ }
+ $feed->faviconPrepare();
} catch (FreshRSS_Feed_Exception $e) {
Minz_Log::record ($e->getMessage (), Minz_Log::NOTICE);
$feedDAO->updateLastUpdate ($feed->id (), 1);
@@ -395,7 +388,7 @@ class FreshRSS_feed_Controller extends Minz_ActionController {
'type' => 'good',
'content' => Minz_Translate::t ('feed_deleted')
);
- FreshRSS_Feed::faviconDelete($id);
+ //TODO: Delete old favicon
} else {
$notif = array (
'type' => 'bad',
diff --git a/app/FreshRSS.php b/app/FreshRSS.php
index 90548793d..60610e352 100644
--- a/app/FreshRSS.php
+++ b/app/FreshRSS.php
@@ -1,7 +1,7 @@
<?php
class FreshRSS extends Minz_FrontController {
public function init () {
- Minz_Session::init ();
+ Minz_Session::init ('FreshRSS');
Minz_Translate::init ();
$this->loadParamsView ();
diff --git a/app/Models/CategoryDAO.php b/app/Models/CategoryDAO.php
index 6b07ab063..1cc616ac0 100644
--- a/app/Models/CategoryDAO.php
+++ b/app/Models/CategoryDAO.php
@@ -90,7 +90,7 @@ class FreshRSS_CategoryDAO extends Minz_ModelPdo {
if ($prePopulateFeeds) {
$sql = 'SELECT c.id AS c_id, c.name AS c_name, '
. ($details ? 'c.color AS c_color, ' : '')
- . ($details ? 'f.* ' : 'f.id, f.name, f.website, f.priority, f.error, f.cache_nbEntries, f.cache_nbUnreads ')
+ . ($details ? 'f.* ' : 'f.id, f.name, f.url, f.website, f.priority, f.error, f.cache_nbEntries, f.cache_nbUnreads ')
. 'FROM `' . $this->prefix . 'category` c '
. 'LEFT OUTER JOIN `' . $this->prefix . 'feed` f ON f.category = c.id '
. 'GROUP BY f.id '
diff --git a/app/Models/Configuration.php b/app/Models/Configuration.php
index 47509636f..cb2f90655 100644
--- a/app/Models/Configuration.php
+++ b/app/Models/Configuration.php
@@ -220,19 +220,13 @@ class FreshRSS_Configuration extends Minz_Model {
public function _sortOrder ($value) {
$this->sort_order = $value === 'ASC' ? 'ASC' : 'DESC';
}
- public function _oldEntries ($value) {
- if (ctype_digit ($value) && $value > 0) {
- $this->old_entries = intval($value);
- } else {
- $this->old_entries = 3;
- }
+ public function _oldEntries($value) {
+ $value = intval($value);
+ $this->old_entries = $value > 0 ? $value : 3;
}
public function _keepHistoryDefault($value) {
- if (ctype_digit($value) && $value >= -1) {
- $this->keep_history_default = intval($value);
- } else {
- $this->keep_history_default = 0;
- }
+ $value = intval($value);
+ $this->keep_history_default = $value >= -1 ? $value : 0;
}
public function _shortcuts ($values) {
foreach ($values as $key => $value) {
diff --git a/app/Models/Entry.php b/app/Models/Entry.php
index ed31ef2b1..ab9605eb1 100644
--- a/app/Models/Entry.php
+++ b/app/Models/Entry.php
@@ -106,11 +106,8 @@ class FreshRSS_Entry extends Minz_Model {
$this->link = $value;
}
public function _date ($value) {
- if (ctype_digit ($value)) {
- $this->date = intval ($value);
- } else {
- $this->date = time ();
- }
+ $value = intval($value);
+ $this->date = $value > 1 ? $value : time();
}
public function _isRead ($value) {
$this->is_read = $value;
diff --git a/app/Models/Feed.php b/app/Models/Feed.php
index dcf97d4ec..32f8546dd 100644
--- a/app/Models/Feed.php
+++ b/app/Models/Feed.php
@@ -16,6 +16,7 @@ class FreshRSS_Feed extends Minz_Model {
private $httpAuth = '';
private $error = false;
private $keep_history = -2;
+ private $hash = null;
public function __construct ($url, $validate=true) {
if ($validate) {
@@ -28,6 +29,14 @@ class FreshRSS_Feed extends Minz_Model {
public function id () {
return $this->id;
}
+
+ public function hash() {
+ if ($this->hash === null) {
+ $this->hash = hash('crc32b', Minz_Configuration::salt() . $this->url);
+ }
+ return $this->hash;
+ }
+
public function url () {
return $this->url;
}
@@ -96,7 +105,7 @@ class FreshRSS_Feed extends Minz_Model {
return $this->nbNotRead;
}
public function faviconPrepare() {
- $file = DATA_PATH . '/favicons/' . $this->id () . '.txt';
+ $file = DATA_PATH . '/favicons/' . $this->hash() . '.txt';
if (!file_exists ($file)) {
$t = $this->website;
if (empty($t)) {
@@ -105,13 +114,13 @@ class FreshRSS_Feed extends Minz_Model {
file_put_contents($file, $t);
}
}
- public static function faviconDelete($id) {
- $path = DATA_PATH . '/favicons/' . $id;
+ public static function faviconDelete($hash) {
+ $path = DATA_PATH . '/favicons/' . $hash;
@unlink($path . '.ico');
@unlink($path . '.txt');
}
public function favicon () {
- return Minz_Url::display ('/f.php?' . $this->id ());
+ return Minz_Url::display ('/f.php/' . $this->hash());
}
public function _id ($value) {
@@ -127,7 +136,8 @@ class FreshRSS_Feed extends Minz_Model {
$this->url = $value;
}
public function _category ($value) {
- $this->category = $value;
+ $value = intval($value);
+ $this->category = $value >= 0 ? $value : 0;
}
public function _name ($value) {
if (is_null ($value)) {
@@ -154,7 +164,8 @@ class FreshRSS_Feed extends Minz_Model {
$this->lastUpdate = $value;
}
public function _priority ($value) {
- $this->priority = ctype_digit ($value) ? intval ($value) : 10;
+ $value = intval($value);
+ $this->priority = $value >= 0 ? $value : 10;
}
public function _pathEntries ($value) {
$this->pathEntries = $value;
@@ -172,13 +183,13 @@ class FreshRSS_Feed extends Minz_Model {
$this->keep_history = $value;
}
public function _nbNotRead ($value) {
- $this->nbNotRead = ctype_digit ($value) ? intval ($value) : -1;
+ $this->nbNotRead = intval($value);
}
public function _nbEntries ($value) {
- $this->nbEntries = ctype_digit ($value) ? intval ($value) : -1;
+ $this->nbEntries = intval($value);
}
- public function load () {
+ public function load ($loadDetails = false) {
if (!is_null ($this->url)) {
if (CACHE_PATH === false) {
throw new Minz_FileNotExistException (
@@ -250,11 +261,13 @@ class FreshRSS_Feed extends Minz_Model {
$this->_url ($subscribe_url);
}
- $title = htmlspecialchars(html_only_entity_decode($feed->get_title()), ENT_COMPAT, 'UTF-8');
- $this->_name (!is_null ($title) ? $title : $this->url);
+ if ($loadDetails) {
+ $title = htmlspecialchars(html_only_entity_decode($feed->get_title()), ENT_COMPAT, 'UTF-8');
+ $this->_name (!is_null ($title) ? $title : $this->url);
- $this->_website(html_only_entity_decode($feed->get_link()));
- $this->_description(html_only_entity_decode($feed->get_description()));
+ $this->_website(html_only_entity_decode($feed->get_link()));
+ $this->_description(html_only_entity_decode($feed->get_description()));
+ }
// et on charge les articles du flux
$this->loadEntries ($feed);
diff --git a/app/Models/FeedDAO.php b/app/Models/FeedDAO.php
index d517f9580..e102da4ec 100644
--- a/app/Models/FeedDAO.php
+++ b/app/Models/FeedDAO.php
@@ -316,11 +316,13 @@ class FreshRSS_FeedDAO extends Minz_ModelPdo {
$key = $dao['id'];
}
if ($catID === null) {
- $catID = isset($dao['category']) ? $dao['category'] : 0;
+ $category = isset($dao['category']) ? $dao['category'] : 0;
+ } else {
+ $category = $catID ;
}
$myFeed = new FreshRSS_Feed(isset($dao['url']) ? $dao['url'] : '', false);
- $myFeed->_category(intval($catID));
+ $myFeed->_category($category);
$myFeed->_name($dao['name']);
$myFeed->_website(isset($dao['website']) ? $dao['website'] : '', false);
$myFeed->_description(isset($dao['description']) ? $dao['description'] : '');
diff --git a/actualize_script.php b/app/actualize_script.php
index 7986ba0b5..20438128a 100755
--- a/actualize_script.php
+++ b/app/actualize_script.php
@@ -1,5 +1,5 @@
<?php
-require('constants.php');
+require(dirname(__FILE__) . '/../constants.php');
$_GET['c'] = 'feed';
$_GET['a'] = 'actualize';
diff --git a/app/i18n/en.php b/app/i18n/en.php
index 498fccd14..f74a7f198 100644
--- a/app/i18n/en.php
+++ b/app/i18n/en.php
@@ -60,7 +60,7 @@ return array (
'access_denied' => 'You don’t have permission to access this page',
'page_not_found' => 'You are looking for a page which doesn’t exist',
'error_occurred' => 'An error occurred',
- 'error_occurred_update' => 'An error occurred during update',
+ 'error_occurred_update' => 'Nothing was changed',
'default_category' => 'Uncategorized',
'categories_updated' => 'Categories have been updated',
@@ -239,6 +239,7 @@ return array (
'freshrss_description' => 'FreshRSS is a RSS feeds aggregator to self-host like <a href="http://tontof.net/kriss/feed/">Kriss Feed</a> or <a href="http://projet.idleman.fr/leed/">Leed</a>. It is light and easy to take in hand while being powerful and configurable tool.',
'credits' => 'Credits',
'credits_content' => 'Some design elements come from <a href="http://twitter.github.io/bootstrap/">Bootstrap</a> although FreshRSS doesn’t use this framework. <a href="https://git.gnome.org/browse/gnome-icon-theme-symbolic">Icons</a> come from <a href="https://www.gnome.org/">GNOME project</a>. <em>Open Sans</em> font police used has been created by <a href="https://www.google.com/webfonts/specimen/Open+Sans">Steve Matteson</a>. Favicons are collected with <a href="https://getfavicon.appspot.com/">getFavicon API</a>. FreshRSS is based on <a href="https://github.com/marienfressinaud/MINZ">Minz</a>, a PHP framework.',
+ 'version' => 'Version',
'logs' => 'Logs',
'logs_empty' => 'Log file is empty',
diff --git a/app/i18n/fr.php b/app/i18n/fr.php
index c918daa44..f9c4d00cc 100644
--- a/app/i18n/fr.php
+++ b/app/i18n/fr.php
@@ -60,7 +60,7 @@ return array (
'access_denied' => 'Vous n’avez pas le droit d’accéder à cette page',
'page_not_found' => 'La page que vous cherchez n’existe pas',
'error_occurred' => 'Une erreur est survenue',
- 'error_occurred_update' => 'Une erreur est survenue lors de la mise à jour',
+ 'error_occurred_update' => 'Rien n’a été modifié',
'default_category' => 'Sans catégorie',
'categories_updated' => 'Les catégories ont été mises à jour',
@@ -240,6 +240,7 @@ return array (
'freshrss_description' => 'FreshRSS est un agrégateur de flux RSS à auto-héberger à l’image de <a href="http://tontof.net/kriss/feed/">Kriss Feed</a> ou <a href="http://projet.idleman.fr/leed/">Leed</a>. Il se veut léger et facile à prendre en main tout en étant un outil puissant et paramétrable.',
'credits' => 'Crédits',
'credits_content' => 'Des éléments de design sont issus du <a href="http://twitter.github.io/bootstrap/">projet Bootstrap</a> bien que FreshRSS n’utilise pas ce framework. Les <a href="https://git.gnome.org/browse/gnome-icon-theme-symbolic">icônes</a> sont issues du <a href="https://www.gnome.org/">projet GNOME</a>. La police <em>Open Sans</em> utilisée a été créée par <a href="https://www.google.com/webfonts/specimen/Open+Sans">Steve Matteson</a>. Les favicons sont récupérés grâce au site <a href="https://getfavicon.appspot.com/">getFavicon</a>. FreshRSS repose sur <a href="https://github.com/marienfressinaud/MINZ">Minz</a>, un framework PHP.',
+ 'version' => 'Version',
'logs' => 'Logs',
'logs_empty' => 'Les logs sont vides',
diff --git a/app/index.html b/app/index.html
new file mode 100644
index 000000000..85faaa37e
--- /dev/null
+++ b/app/index.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-GB" lang="en-GB">
+<head>
+<meta charset="UTF-8" />
+<meta http-equiv="Refresh" content="0; url=/" />
+<title>Redirection</title>
+<meta name="robots" content="noindex" />
+</head>
+
+<body>
+<p><a href="/">Redirection</a></p>
+</body>
+</html>
diff --git a/app/layout/nav_menu.phtml b/app/layout/nav_menu.phtml
index 045f391f9..1f2a7b408 100644
--- a/app/layout/nav_menu.phtml
+++ b/app/layout/nav_menu.phtml
@@ -25,7 +25,7 @@
switch ($get[0]) {
case 'c':
foreach ($this->cat_aside as $cat) {
- if ($cat->id () === $this->get_c) {
+ if ($cat->id () == $this->get_c) {
$foundCurrent = true;
continue;
}
@@ -37,9 +37,9 @@
break;
case 'f':
foreach ($this->cat_aside as $cat) {
- if ($cat->id () === $this->get_c) {
+ if ($cat->id () == $this->get_c) {
foreach ($cat->feeds () as $feed) {
- if ($feed->id () === $this->get_f) {
+ if ($feed->id () == $this->get_f) {
$foundCurrent = true;
continue;
}
diff --git a/app/views/helpers/javascript_vars.phtml b/app/views/helpers/javascript_vars.phtml
index 0c1af45fc..d008e2e48 100644
--- a/app/views/helpers/javascript_vars.phtml
+++ b/app/views/helpers/javascript_vars.phtml
@@ -39,7 +39,8 @@
echo 'str_confirmation="', Minz_Translate::t('confirm_action'), '"', ",\n";
- echo 'auto_actualize_feeds=', Minz_Session::param('actualize_feeds', false) ? 'true' : 'false', ";\n";
- if (Minz_Session::param('actualize_feeds', false)) {
- Minz_Session::_param('actualize_feeds');
+ $autoActualise = Minz_Session::param('actualize_feeds', false);
+ echo 'auto_actualize_feeds=', $autoActualise ? 'true' : 'false', ";\n";
+ if ($autoActualise) {
+ Minz_Session::_param('actualize_feeds', false);
}
diff --git a/app/views/index/about.phtml b/app/views/index/about.phtml
index b5c00a1ed..ae64727d7 100644
--- a/app/views/index/about.phtml
+++ b/app/views/index/about.phtml
@@ -15,6 +15,9 @@
<dt><?php echo Minz_Translate::t ('license'); ?></dt>
<dd><?php echo Minz_Translate::t ('agpl3'); ?></dd>
+
+ <dt><?php echo Minz_Translate::t ('version'); ?></dt>
+ <dd><?php echo FRESHRSS_VERSION; ?></dd>
</dl>
<p><?php echo Minz_Translate::t ('freshrss_description'); ?></p>
diff --git a/constants.php b/constants.php
index 272647947..0c7adc57e 100644
--- a/constants.php
+++ b/constants.php
@@ -1,14 +1,17 @@
<?php
-define('FRESHRSS_VERSION', '0.7-beta2');
+define('FRESHRSS_VERSION', '0.7-beta3');
define('FRESHRSS_WEBSITE', 'http://freshrss.org');
// Constantes de chemins
-define ('FRESHRSS_PATH', dirname(__FILE__));
+define('FRESHRSS_PATH', dirname(__FILE__));
-define ('PUBLIC_PATH', FRESHRSS_PATH . '/public');
-define ('DATA_PATH', FRESHRSS_PATH . '/data');
-define ('LIB_PATH', FRESHRSS_PATH . '/lib');
-define ('APP_PATH', FRESHRSS_PATH . '/app');
+ define('PUBLIC_PATH', FRESHRSS_PATH . '/p');
+ define('INDEX_PATH', PUBLIC_PATH . '/i');
+ define('PUBLIC_RELATIVE', '..');
-define ('LOG_PATH', DATA_PATH . '/log');
-define ('CACHE_PATH', DATA_PATH . '/cache');
+ define('DATA_PATH', FRESHRSS_PATH . '/data');
+ define('LOG_PATH', DATA_PATH . '/log');
+ define('CACHE_PATH', DATA_PATH . '/cache');
+
+ define('LIB_PATH', FRESHRSS_PATH . '/lib');
+ define('APP_PATH', FRESHRSS_PATH . '/app');
diff --git a/data/index.html b/data/index.html
index 2f3b51848..85faaa37e 100644
--- a/data/index.html
+++ b/data/index.html
@@ -4,7 +4,7 @@
<meta charset="UTF-8" />
<meta http-equiv="Refresh" content="0; url=/" />
<title>Redirection</title>
-<meta name="robots" content="noindex,follow" />
+<meta name="robots" content="noindex" />
</head>
<body>
diff --git a/index.html b/index.html
index 937659d57..1bfdea859 100644
--- a/index.html
+++ b/index.html
@@ -2,12 +2,12 @@
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-GB" lang="en-GB">
<head>
<meta charset="UTF-8" />
-<meta http-equiv="Refresh" content="0; url=public/" />
+<meta http-equiv="Refresh" content="0; url=p/i/" />
<title>Redirection</title>
-<meta name="robots" content="noindex,follow" />
+<meta name="robots" content="noindex" />
</head>
<body>
-<p><a href="./public/">FreshRSS</a></p>
+<p><a href="p/i/">FreshRSS</a></p>
</body>
</html>
diff --git a/index.php b/index.php
new file mode 100644
index 000000000..3fdae4285
--- /dev/null
+++ b/index.php
@@ -0,0 +1,3 @@
+<?php
+header('Location: p/i/', true, 301);
+include('index.html');
diff --git a/lib/.htaccess b/lib/.htaccess
new file mode 100644
index 000000000..9e768397d
--- /dev/null
+++ b/lib/.htaccess
@@ -0,0 +1,3 @@
+Order Allow,Deny
+Deny from all
+Satisfy all
diff --git a/lib/Minz/Configuration.php b/lib/Minz/Configuration.php
index 1b108dcdf..6c7206988 100644
--- a/lib/Minz/Configuration.php
+++ b/lib/Minz/Configuration.php
@@ -63,7 +63,7 @@ class Minz_Configuration {
/*
* Getteurs
*/
- public static function selApplication () {
+ public static function salt () {
return self::$sel_application;
}
public static function environment () {
diff --git a/lib/Minz/Session.php b/lib/Minz/Session.php
index 878caa556..f527322f5 100644
--- a/lib/Minz/Session.php
+++ b/lib/Minz/Session.php
@@ -9,21 +9,24 @@ class Minz_Session {
* $session stocke les variables de session
*/
private static $session = array ();
-
+
/**
- * Initialise la session
+ * Initialise la session, avec un nom
+ * Le nom de session est utilisé comme nom pour les cookies et les URLs (i.e. PHPSESSID).
+ * Il ne doit contenir que des caractères alphanumériques ; il doit être court et descriptif
*/
- public static function init () {
+ public static function init ($name) {
// démarre la session
- session_name (md5 (Minz_Configuration::selApplication ()));
+ session_name ($name);
+ session_set_cookie_params (0, './', null, false, true);
session_start ();
-
+
if (isset ($_SESSION)) {
self::$session = $_SESSION;
}
}
-
-
+
+
/**
* Permet de récupérer une variable de session
* @param $p le paramètre à récupérer
@@ -35,11 +38,11 @@ class Minz_Session {
} else {
$return = $default;
}
-
+
return $return;
}
-
-
+
+
/**
* Permet de créer ou mettre à jour une variable de session
* @param $p le paramètre à créer ou modifier
@@ -59,18 +62,18 @@ class Minz_Session {
}
}
}
-
-
+
+
/**
* Permet d'effacer une session
* @param $force si à false, n'efface pas le paramètre de langue
*/
public static function unset_session ($force = false) {
$language = self::param ('language');
-
+
session_unset ();
self::$session = array ();
-
+
if (!$force) {
self::_param ('language', $language);
}
diff --git a/lib/Minz/Url.php b/lib/Minz/Url.php
index 30f7f6231..17f1ddece 100644
--- a/lib/Minz/Url.php
+++ b/lib/Minz/Url.php
@@ -17,12 +17,16 @@ class Minz_Url {
* @return l'url formatée
*/
public static function display ($url = array (), $encodage = 'html', $absolute = false) {
- $url = self::checkUrl ($url);
+ $isArray = is_array($url);
+
+ if ($isArray) {
+ $url = self::checkUrl ($url);
+ }
$url_string = '';
if ($absolute) {
- if (is_array ($url) && isset ($url['protocol'])) {
+ if ($isArray && isset ($url['protocol'])) {
$protocol = $url['protocol'];
} elseif (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') {
$protocol = 'https:';
@@ -30,12 +34,11 @@ class Minz_Url {
$protocol = 'http:';
}
$url_string = $protocol . '//' . Minz_Request::getDomainName () . Minz_Request::getBaseUrl ();
- }
- else {
- $url_string = '.';
+ } else {
+ $url_string = $isArray ? '.' : PUBLIC_RELATIVE;
}
- if (is_array ($url)) {
+ if ($isArray) {
$router = new Minz_Router ();
if (Minz_Configuration::useUrlRewriting ()) {
diff --git a/public/.htaccess b/p/.htaccess
index fefe8b226..fefe8b226 100644
--- a/public/.htaccess
+++ b/p/.htaccess
diff --git a/public/f.php b/p/f.php
index a56d58617..660128a59 100644
--- a/public/f.php
+++ b/p/f.php
@@ -36,8 +36,15 @@ function download_favicon ($website, $dest) {
return true;
}
-$id = isset($_SERVER['QUERY_STRING']) ? $_SERVER['QUERY_STRING'] : '0';
-if (!ctype_digit($id)) {
+if (isset($_SERVER['PATH_INFO'])) {
+ $id = substr($_SERVER['PATH_INFO'], 1);
+} elseif (isset($_SERVER['QUERY_STRING'])) {
+ $id = $_SERVER['QUERY_STRING'];
+} else {
+ $id = '0';
+}
+
+if (!ctype_xdigit($id)) {
$id = '0';
}
diff --git a/public/favicon.ico b/p/favicon.ico
index f7ae0a5b9..f7ae0a5b9 100644
--- a/public/favicon.ico
+++ b/p/favicon.ico
Binary files differ
diff --git a/public/favicon.png b/p/favicon.png
index 3038dc3d1..3038dc3d1 100644
--- a/public/favicon.png
+++ b/p/favicon.png
Binary files differ
diff --git a/public/index.php b/p/i/index.php
index c8b15b3d9..6c25b2c54 100755
--- a/public/index.php
+++ b/p/i/index.php
@@ -21,7 +21,7 @@
if (file_exists ('install.php')) {
require('install.php');
} else {
- require('../constants.php');
+ require('../../constants.php');
session_cache_limiter('');
if (!file_exists(DATA_PATH . '/no-cache.txt')) {
diff --git a/public/install.php b/p/i/install.php
index 13abb010b..0e8a972c6 100644
--- a/public/install.php
+++ b/p/i/install.php
@@ -1,8 +1,10 @@
<?php
-require('../constants.php');
+require('../../constants.php');
include(LIB_PATH . '/lib_rss.php');
-session_start ();
+session_name('FreshRSS');
+session_set_cookie_params(0, './', null, false, true);
+session_start();
if (isset ($_GET['step'])) {
define ('STEP', $_GET['step']);
@@ -115,7 +117,9 @@ WHERE e1.content_bin IS NULL');
define('SQL_CONVERT_UPDATEv006', 'UPDATE `%1$sentry` SET content_bin=COMPRESS(?) WHERE id=?;');
-define('SQL_UPDATE_CACHED_VALUESv006', '
+define('SQL_DROP_BACKUPv006', 'DROP TABLE IF EXISTS `%1$sentry006`, `%1$sfeed006`, `%1$scategory006`;');
+
+define('SQL_UPDATE_CACHED_VALUES', '
UPDATE `%1$sfeed` f
INNER JOIN (
SELECT e.id_feed,
@@ -127,7 +131,7 @@ INNER JOIN (
SET f.cache_nbEntries=x.nbEntries, f.cache_nbUnreads=x.nbUnreads
');
-define('SQL_DROP_BACKUPv006', 'DROP TABLE IF EXISTS `%1$sentry006`, `%1$sfeed006`, `%1$scategory006`;');
+define('SQL_UPDATE_HISTORYv007b', 'UPDATE `%1$sfeed` SET keep_history = CASE WHEN keep_history = 0 THEN -2 WHEN keep_history = 1 THEN -1 ELSE keep_history END;');
//</updates>
function writeLine ($f, $line) {
@@ -231,6 +235,7 @@ function saveStep2 () {
$file_data = DATA_PATH . '/' . $_SESSION['default_user'] . '_user.php';
+ @unlink($file_data); //To avoid access-rights problems
$f = fopen ($file_data, 'w');
writeLine ($f, '<?php');
writeLine ($f, 'return array (');
@@ -282,6 +287,8 @@ function saveStep3 () {
'prefix' => $_SESSION['bd_prefix'],
),
);
+
+ @unlink(DATA_PATH . '/config.php'); //To avoid access-rights problems
file_put_contents(DATA_PATH . '/config.php', "<?php\n return " . var_export($ini_array, true) . ';');
if (file_exists(DATA_PATH . '/config.php') && file_exists(DATA_PATH . '/application.ini')) {
@@ -347,7 +354,11 @@ function updateDatabase($perform = false) {
$stm->execute();
}
- $sql = sprintf(SQL_UPDATE_CACHED_VALUESv006, $_SESSION['bd_prefix_user']);
+ $sql = sprintf(SQL_UPDATE_HISTORYv007b, $_SESSION['bd_prefix_user']);
+ $stm = $c->prepare($sql);
+ $stm->execute();
+
+ $sql = sprintf(SQL_UPDATE_CACHED_VALUES, $_SESSION['bd_prefix_user']);
$stm = $c->prepare($sql);
$stm->execute();
@@ -380,7 +391,7 @@ function updateDatabase($perform = false) {
}
function deleteInstall () {
- $res = unlink (PUBLIC_PATH . '/install.php');
+ $res = unlink (INDEX_PATH . '/install.php');
if ($res) {
header ('Location: index.php');
}
@@ -454,16 +465,6 @@ function delTree($dir) { //http://php.net/rmdir#110489
return rmdir($dir);
}
-function removeOldFiles() {
- $oldDirs = array('/app/configuration/', '/cache/', '/log/', '/public/data/', '/public/themes/printer/'); //v0.6
-
- $ok = true;
- foreach ($oldDirs as $oldDir) {
- $ok &= delTree(FRESHRSS_PATH . $oldDir);
- }
- return $ok;
-}
-
/*** VÉRIFICATIONS ***/
function checkStep () {
$s0 = checkStep0 ();
@@ -479,9 +480,10 @@ function checkStep () {
} elseif (STEP > 3 && $s3['all'] != 'ok') {
header ('Location: index.php?step=3');
}
+ $_SESSION['actualize_feeds'] = true;
}
function checkStep0 () {
- moveOldFiles() && removeOldFiles();
+ moveOldFiles();
if (file_exists(DATA_PATH . '/config.php')) {
$ini_array = include(DATA_PATH . '/config.php');
@@ -932,7 +934,7 @@ function printStep5 () {
function printStep6 () {
?>
- <p class="alert alert-error"><span class="alert-head"><?php echo _t ('oops'); ?></span> <?php echo _t ('install_not_deleted', PUBLIC_PATH . '/install.php'); ?></p>
+ <p class="alert alert-error"><span class="alert-head"><?php echo _t ('oops'); ?></span> <?php echo _t ('install_not_deleted', INDEX_PATH . '/install.php'); ?></p>
<?php
}
@@ -971,8 +973,8 @@ case 6:
<meta charset="utf-8">
<meta name="viewport" content="initial-scale=1.0">
<title><?php echo _t ('freshrss_installation'); ?></title>
- <link rel="stylesheet" type="text/css" media="all" href="themes/default/global.css" />
- <link rel="stylesheet" type="text/css" media="all" href="themes/default/freshrss.css" />
+ <link rel="stylesheet" type="text/css" media="all" href="../themes/default/global.css" />
+ <link rel="stylesheet" type="text/css" media="all" href="../themes/default/freshrss.css" />
</head>
<body>
diff --git a/p/index.html b/p/index.html
new file mode 100644
index 000000000..af91b717e
--- /dev/null
+++ b/p/index.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-GB" lang="en-GB">
+<head>
+<meta charset="UTF-8" />
+<meta http-equiv="Refresh" content="0; url=i/" />
+<title>Redirection</title>
+</head>
+
+<body>
+<p><a href="i/">FreshRSS</a></p>
+</body>
+</html>
diff --git a/p/index.php b/p/index.php
new file mode 100644
index 000000000..e90662078
--- /dev/null
+++ b/p/index.php
@@ -0,0 +1,3 @@
+<?php
+header('Location: i/', true, 301);
+include('index.html');
diff --git a/public/robots.txt b/p/robots.txt
index 1f53798bb..1f53798bb 100644
--- a/public/robots.txt
+++ b/p/robots.txt
diff --git a/public/scripts/global_view.js b/p/scripts/global_view.js
index 0cdcdd3fa..0cdcdd3fa 100644
--- a/public/scripts/global_view.js
+++ b/p/scripts/global_view.js
diff --git a/public/scripts/jquery-2.0.3.min.map b/p/scripts/jquery-2.0.3.min.map
index 472d71bb0..472d71bb0 100644
--- a/public/scripts/jquery-2.0.3.min.map
+++ b/p/scripts/jquery-2.0.3.min.map
diff --git a/public/scripts/jquery.lazyload.min.js b/p/scripts/jquery.lazyload.min.js
index 8dd097dc3..8dd097dc3 100644
--- a/public/scripts/jquery.lazyload.min.js
+++ b/p/scripts/jquery.lazyload.min.js
diff --git a/public/scripts/jquery.min.js b/p/scripts/jquery.min.js
index 2be209dd2..2be209dd2 100644
--- a/public/scripts/jquery.min.js
+++ b/p/scripts/jquery.min.js
diff --git a/public/scripts/main.js b/p/scripts/main.js
index ef05eb2fb..ef05eb2fb 100644
--- a/public/scripts/main.js
+++ b/p/scripts/main.js
diff --git a/public/scripts/shortcut.js b/p/scripts/shortcut.js
index debaffbaa..debaffbaa 100644
--- a/public/scripts/shortcut.js
+++ b/p/scripts/shortcut.js
diff --git a/public/themes/default/freshrss.css b/p/themes/default/freshrss.css
index 2b157b27a..86925accc 100644
--- a/public/themes/default/freshrss.css
+++ b/p/themes/default/freshrss.css
@@ -567,7 +567,7 @@
/*** NOTIFICATION ***/
.notification {
- position: fixed;
+ position: absolute;
top: 10px;
left: 25%; right: 25%;
min-height: 30px;
diff --git a/public/themes/default/global.css b/p/themes/default/global.css
index 440fc6e41..440fc6e41 100644
--- a/public/themes/default/global.css
+++ b/p/themes/default/global.css
diff --git a/public/themes/default/loader.gif b/p/themes/default/loader.gif
index 5ff26f0e3..5ff26f0e3 100644
--- a/public/themes/default/loader.gif
+++ b/p/themes/default/loader.gif
Binary files differ
diff --git a/public/themes/default/metadata.json b/p/themes/default/metadata.json
index d316ec517..d316ec517 100644
--- a/public/themes/default/metadata.json
+++ b/p/themes/default/metadata.json
diff --git a/public/themes/flat-design/freshrss.css b/p/themes/flat-design/freshrss.css
index 7e3f4c81a..7a1682370 100644
--- a/public/themes/flat-design/freshrss.css
+++ b/p/themes/flat-design/freshrss.css
@@ -555,7 +555,7 @@ body {
/*** NOTIFICATION ***/
.notification {
- position: fixed;
+ position: absolute;
top: 10px;
left: 25%; right: 25%;
min-height: 30px;
diff --git a/public/themes/flat-design/global.css b/p/themes/flat-design/global.css
index 90b59d002..90b59d002 100644
--- a/public/themes/flat-design/global.css
+++ b/p/themes/flat-design/global.css
diff --git a/public/themes/flat-design/icons/add.svg b/p/themes/flat-design/icons/add.svg
index 15767a3ad..15767a3ad 100644
--- a/public/themes/flat-design/icons/add.svg
+++ b/p/themes/flat-design/icons/add.svg
diff --git a/public/themes/flat-design/icons/all.svg b/p/themes/flat-design/icons/all.svg
index d20e0f5bf..d20e0f5bf 100644
--- a/public/themes/flat-design/icons/all.svg
+++ b/p/themes/flat-design/icons/all.svg
diff --git a/public/themes/flat-design/icons/close.svg b/p/themes/flat-design/icons/close.svg
index 629fda7ff..629fda7ff 100644
--- a/public/themes/flat-design/icons/close.svg
+++ b/p/themes/flat-design/icons/close.svg
diff --git a/public/themes/flat-design/icons/configure.svg b/p/themes/flat-design/icons/configure.svg
index 969c5719f..969c5719f 100644
--- a/public/themes/flat-design/icons/configure.svg
+++ b/p/themes/flat-design/icons/configure.svg
diff --git a/public/themes/flat-design/icons/down.svg b/p/themes/flat-design/icons/down.svg
index 31730626f..31730626f 100644
--- a/public/themes/flat-design/icons/down.svg
+++ b/p/themes/flat-design/icons/down.svg
diff --git a/public/themes/flat-design/icons/next.svg b/p/themes/flat-design/icons/next.svg
index d75cc40f5..d75cc40f5 100644
--- a/public/themes/flat-design/icons/next.svg
+++ b/p/themes/flat-design/icons/next.svg
diff --git a/public/themes/flat-design/icons/prev.svg b/p/themes/flat-design/icons/prev.svg
index 9ba03ceb2..9ba03ceb2 100644
--- a/public/themes/flat-design/icons/prev.svg
+++ b/p/themes/flat-design/icons/prev.svg
diff --git a/public/themes/flat-design/icons/refresh.svg b/p/themes/flat-design/icons/refresh.svg
index 8f95bf443..8f95bf443 100644
--- a/public/themes/flat-design/icons/refresh.svg
+++ b/p/themes/flat-design/icons/refresh.svg
diff --git a/public/themes/flat-design/icons/search.svg b/p/themes/flat-design/icons/search.svg
index bca7571b4..bca7571b4 100644
--- a/public/themes/flat-design/icons/search.svg
+++ b/p/themes/flat-design/icons/search.svg
diff --git a/public/themes/flat-design/icons/up.svg b/p/themes/flat-design/icons/up.svg
index 3ab11b168..3ab11b168 100644
--- a/public/themes/flat-design/icons/up.svg
+++ b/p/themes/flat-design/icons/up.svg
diff --git a/public/themes/flat-design/loader.gif b/p/themes/flat-design/loader.gif
index ce36565b3..ce36565b3 100644
--- a/public/themes/flat-design/loader.gif
+++ b/p/themes/flat-design/loader.gif
Binary files differ
diff --git a/public/themes/flat-design/metadata.json b/p/themes/flat-design/metadata.json
index 6b94d11c2..6b94d11c2 100644
--- a/public/themes/flat-design/metadata.json
+++ b/p/themes/flat-design/metadata.json
diff --git a/public/themes/fonts/openSans.woff b/p/themes/fonts/openSans.woff
index 55b25f867..55b25f867 100644
--- a/public/themes/fonts/openSans.woff
+++ b/p/themes/fonts/openSans.woff
Binary files differ
diff --git a/public/themes/icons/add.svg b/p/themes/icons/add.svg
index 425c9b4aa..425c9b4aa 100644
--- a/public/themes/icons/add.svg
+++ b/p/themes/icons/add.svg
diff --git a/public/themes/icons/all.svg b/p/themes/icons/all.svg
index 2180f7a4b..2180f7a4b 100644
--- a/public/themes/icons/all.svg
+++ b/p/themes/icons/all.svg
diff --git a/public/themes/icons/bookmark.svg b/p/themes/icons/bookmark.svg
index d6e2cebb5..d6e2cebb5 100644
--- a/public/themes/icons/bookmark.svg
+++ b/p/themes/icons/bookmark.svg
diff --git a/public/themes/icons/category-white.svg b/p/themes/icons/category-white.svg
index 5e61aeea5..5e61aeea5 100644
--- a/public/themes/icons/category-white.svg
+++ b/p/themes/icons/category-white.svg
diff --git a/public/themes/icons/category.svg b/p/themes/icons/category.svg
index 71f95490e..71f95490e 100644
--- a/public/themes/icons/category.svg
+++ b/p/themes/icons/category.svg
diff --git a/public/themes/icons/close.svg b/p/themes/icons/close.svg
index c0c786fd6..c0c786fd6 100644
--- a/public/themes/icons/close.svg
+++ b/p/themes/icons/close.svg
diff --git a/public/themes/icons/configure.svg b/p/themes/icons/configure.svg
index 52df8bca7..52df8bca7 100644
--- a/public/themes/icons/configure.svg
+++ b/p/themes/icons/configure.svg
diff --git a/public/themes/icons/down.svg b/p/themes/icons/down.svg
index 06d031fae..06d031fae 100644
--- a/public/themes/icons/down.svg
+++ b/p/themes/icons/down.svg
diff --git a/public/themes/icons/grey.gif b/p/themes/icons/grey.gif
index c7212bc1f..c7212bc1f 100644
--- a/public/themes/icons/grey.gif
+++ b/p/themes/icons/grey.gif
Binary files differ
diff --git a/public/themes/icons/help.svg b/p/themes/icons/help.svg
index b103ec46d..b103ec46d 100644
--- a/public/themes/icons/help.svg
+++ b/p/themes/icons/help.svg
diff --git a/public/themes/icons/icon.svg b/p/themes/icons/icon.svg
index 8aefed2ad..8aefed2ad 100644
--- a/public/themes/icons/icon.svg
+++ b/p/themes/icons/icon.svg
diff --git a/public/themes/icons/link.svg b/p/themes/icons/link.svg
index ddc8e0706..ddc8e0706 100644
--- a/public/themes/icons/link.svg
+++ b/p/themes/icons/link.svg
diff --git a/public/themes/icons/login.svg b/p/themes/icons/login.svg
index 0a8af162f..0a8af162f 100644
--- a/public/themes/icons/login.svg
+++ b/p/themes/icons/login.svg
diff --git a/public/themes/icons/logout.svg b/p/themes/icons/logout.svg
index 284a67578..284a67578 100644
--- a/public/themes/icons/logout.svg
+++ b/p/themes/icons/logout.svg
diff --git a/public/themes/icons/next.svg b/p/themes/icons/next.svg
index 72637b4e6..72637b4e6 100644
--- a/public/themes/icons/next.svg
+++ b/p/themes/icons/next.svg
diff --git a/public/themes/icons/non-starred.svg b/p/themes/icons/non-starred.svg
index 346717f78..346717f78 100644
--- a/public/themes/icons/non-starred.svg
+++ b/p/themes/icons/non-starred.svg
diff --git a/public/themes/icons/prev.svg b/p/themes/icons/prev.svg
index 67685c50c..67685c50c 100644
--- a/public/themes/icons/prev.svg
+++ b/p/themes/icons/prev.svg
diff --git a/public/themes/icons/read.svg b/p/themes/icons/read.svg
index 932bfd860..932bfd860 100644
--- a/public/themes/icons/read.svg
+++ b/p/themes/icons/read.svg
diff --git a/public/themes/icons/refresh.svg b/p/themes/icons/refresh.svg
index 11728fc5d..11728fc5d 100644
--- a/public/themes/icons/refresh.svg
+++ b/p/themes/icons/refresh.svg
diff --git a/public/themes/icons/rss.svg b/p/themes/icons/rss.svg
index ceaddceee..ceaddceee 100644
--- a/public/themes/icons/rss.svg
+++ b/p/themes/icons/rss.svg
diff --git a/public/themes/icons/search.svg b/p/themes/icons/search.svg
index acfb364cc..acfb364cc 100644
--- a/public/themes/icons/search.svg
+++ b/p/themes/icons/search.svg
diff --git a/public/themes/icons/share.svg b/p/themes/icons/share.svg
index 443321882..443321882 100644
--- a/public/themes/icons/share.svg
+++ b/p/themes/icons/share.svg
diff --git a/public/themes/icons/starred.svg b/p/themes/icons/starred.svg
index d6e2cebb5..d6e2cebb5 100644
--- a/public/themes/icons/starred.svg
+++ b/p/themes/icons/starred.svg
diff --git a/public/themes/icons/tag.svg b/p/themes/icons/tag.svg
index 688aca7a4..688aca7a4 100644
--- a/public/themes/icons/tag.svg
+++ b/p/themes/icons/tag.svg
diff --git a/public/themes/icons/unread.svg b/p/themes/icons/unread.svg
index f541fb25b..f541fb25b 100644
--- a/public/themes/icons/unread.svg
+++ b/p/themes/icons/unread.svg
diff --git a/public/themes/icons/up.svg b/p/themes/icons/up.svg
index dab31a20d..dab31a20d 100644
--- a/public/themes/icons/up.svg
+++ b/p/themes/icons/up.svg