Merge branch 'dev' into shortcuts

This commit is contained in:
Alexis Degrugillier
2014-01-03 00:03:28 -05:00
23 changed files with 97 additions and 54 deletions

View File

@@ -1,6 +1,6 @@
# Journal des modifications
## 2014-01-xx FreshRSS 0.7.5
## 2014-01-xx FreshRSS 0.7
* Nouveau mode multi-utilisateur
* Lutilisateur par défaut (administrateur) peut créer et supprimer dautres utilisateurs
@@ -8,21 +8,14 @@
* par HTTP (par exemple sous Apache en créant un fichier ./p/i/.htaccess et .htpasswd)
* le nom dutilisateur HTTP doit correspondre au nom dutilisateur FreshRSS
* par Mozilla Persona, en renseignant ladresse courriel des utilisateurs
* Options
* Réorganisation des options
* PHP
* Compatibilité PHP 5.5+ avec OPcache
* Amélioration des performances
## 2014-01-xx FreshRSS 0.7
* Installeur
* Nouvel utilisateur par défaut, en prévision du futur support multi-utilisateurs
* Supporte une mise à jour depuis la version 0.6
* Juste placer application.ini et Configuration.array.php dans le nouveau répertoire “./data/”
* Installateur supportant les mises à jour :
* Depuis une v0.6, placer application.ini et Configuration.array.php dans le nouveau répertoire “./data/” (voir réorganisation ci-dessous)
* Pour les versions suivantes, juste garder “./data/config.php” “./data/*_user.php”
* Importation OPML instantanée et plus tolérante
* Nouvelle gestion des favicons avec téléchargement en parallèle et compatibilité multi-utilisateurs
* Nouvelle gestion des favicons avec téléchargement en parallèle
* Nouvelles options
* Réorganisation des options
* Gestion des utilisateurs
* Améliorations partage vers Shaarli, Poche, Diaspora*, Facebook, Twitter, Google+, courriel
* Permet la suppression de tous les articles dun flux
* Option pour marquer les articles comme lus dès la réception
@@ -30,18 +23,17 @@
* Permet de modifier la description et ladresse dun flux RSS ainsi que le site Web associé
* Nouveau raccourci pour ouvrir/fermer un article (c par défaut)
* Boutons pour effacer les logs et pour purger les vieux articles
* Légère réorganisation des options
* SQL :
* Nouveau moteur de recherche, aussi accessible depuis la vue mobile
* Mots clefs de recherche “intitle:”, “inurl:”, “author:”
* Les articles sont triés selon la date de leur ajout dans FreshRSS plutôt que la date déclarée (souvent erronée)
* Permet de marquer tout comme lu sans affecter les nouveaux articles arrivés en cours de lecture
* Refactorisation
* Les tables sont préfixées avec le nom dutilisateur en prévision du futur support multi-utilisateurs
* Les tables sont préfixées avec le nom dutilisateur afin de permettre le mode multi-utilisateurs
* Amélioration des performances
* Tolère un beaucoup plus grand nombre darticles
* Compression des données côté MySQL plutôt que côté PHP
* Incompatible avec la version 0.6 (nécessite une mise à jour grâce à linstalleur)
* Incompatible avec la version 0.6 (nécessite une mise à jour grâce à linstallateur)
* Affichage de la taille de la base de données dans FreshRSS
* Correction problème de marquage de tous les favoris comme lus
* HTML5 :
@@ -56,10 +48,11 @@
* FreshRSS fonctionne aussi en mode dégradé sans images (alternatives Unicode) et/ou sans CSS
* Diverses améliorations mineures
* PHP :
* Meilleure gestion des caractères spéciaux dans différents cas
* Amélioration des performances
* Encore plus tolérant pour les flux comportant des erreurs
* Mise à jour automatique de lURL du flux (en base de données) lorsque SimplePie découvre quelle a changé
* Meilleure gestion des caractères spéciaux dans différents cas
* Compatibilité PHP 5.5+ avec OPcache
* Amélioration des performances
* Chargement automatique des classes
* Alternative dans le cas dabsence de librairie JSON
* Pour le développement, le cache HTTP peut être désactivé en créant un fichier “./no-cache.txt”

View File

@@ -8,8 +8,8 @@ Il permet de gérer plusieurs utilisateurs, et dispose dun mode de lecture an
* Site officiel : http://freshrss.org
* Démo : http://marienfressinaud.fr/projets/freshrss/
* Développeur : Marien Fressinaud <dev@marienfressinaud.fr>
* Version actuelle : 0.8-dev
* Date de publication 2014-xx-xx
* Version actuelle : 0.7-beta4
* Date de publication 2014-01-xx
* License [GNU AGPL 3](http://www.gnu.org/licenses/agpl-3.0.html)
![Logo de FreshRSS](http://marienfressinaud.fr/data/images/freshrss/freshrss_title.png)
@@ -22,8 +22,10 @@ Privilégiez pour cela des demandes sur GitHub
(https://github.com/marienfressinaud/FreshRSS/issues) ou par mail (dev@marienfressinaud.fr)
# Pré-requis
* Serveur Apache2 ou Nginx (non testé sur les autres)
* PHP 5.2+ (PHP 5.3.3+ recommandé)
* Serveur modeste, par exemple sous Linux ou Windows
* Fonctionne même sur un Raspberry Pi avec des temps de réponse < 1s (testé sur 150 flux, 22k articles, soit 32Mo de données partiellement compressées)
* Serveur Web Apache2 ou Nginx (non testé sur les autres)
* PHP 5.2+ (PHP 5.3.4+ recommandé)
* Requis : [PDO_MySQL](http://php.net/pdo-mysql), [cURL](http://php.net/curl), [LibXML](http://php.net/xml), [PCRE](http://php.net/pcre), [ctype](http://php.net/ctype)
* Recommandés : [JSON](http://php.net/json), [zlib](http://php.net/zlib), [mbstring](http://php.net/mbstring), [iconv](http://php.net/iconv)
* MySQL 5.0.3+ (ou SQLite 3.7.4+ à venir)
@@ -47,10 +49,13 @@ Il est requis pour le mode multi-utilisateur, et recommandé dans tous les cas,
* Créer dans ce cas un fichier `./p/i/.htaccess` avec un fichier `.htpasswd` correspondant.
# Rafraîchissement automatique des flux
* Vous pouvez ajouter une tâche CRON sur le script dactualisation des flux. Par exemple, pour exécuter le script toutes les heures :
* Vous pouvez ajouter une tâche Cron lançant régulièrement le script dactualisation automatique des flux.
Consultez la documentation de Cron de votre système dexploitation ([Debian/Ubuntu](http://doc.ubuntu-fr.org/cron), [Red Hat/Fedora](http://doc.fedora-fr.org/wiki/CRON_:_Configuration_de_t%C3%A2ches_automatis%C3%A9es), [Slackware](http://docs.slackware.com/fr:slackbook:process_control?#cron), [Gentoo](http://wiki.gentoo.org/wiki/Cron/fr), [Arch Linux](http://wiki.archlinux.fr/Cron)…).
Cest une bonne idée dutiliser le même utilisateur que votre serveur Web (souvent “www-data”).
Par exemple, pour exécuter le script toutes les heures :
```
7 * * * * php /chemin/vers/FreshRSS/app/actualize_script.php >/dev/null 2>&1
7 * * * * php /chemin/vers/FreshRSS/app/actualize_script.php > /tmp/FreshRSS.log 2>&1
```
# Conseils

View File

@@ -100,12 +100,14 @@ class FreshRSS_configure_Controller extends Minz_ActionController {
$httpAuth = $user . ':' . $pass;
}
$cat = intval(Minz_Request::param('category', 0));
$values = array (
'name' => Minz_Request::param ('name', ''),
'description' => sanitizeHTML(Minz_Request::param('description', '', true)),
'website' => Minz_Request::param('website', ''),
'url' => Minz_Request::param('url', ''),
'category' => intval(Minz_Request::param ('category', 0)),
'category' => $cat,
'pathEntries' => Minz_Request::param ('path_entries', ''),
'priority' => intval(Minz_Request::param ('priority', 0)),
'httpAuth' => $httpAuth,

View File

@@ -133,7 +133,7 @@ class FreshRSS_index_Controller extends Minz_ActionController {
// Si on a récupéré aucun article "non lus"
// on essaye de récupérer tous les articles
if ($state === 'not_read' && empty($entries)) { //TODO: Remove in v0.8
if ($state === 'not_read' && empty($entries)) {
Minz_Log::record ('Conflicting information about nbNotRead!', Minz_Log::DEBUG);
$this->view->state = 'all';
$entries = $this->entryDAO->listWhere($getType, $getId, 'all', $order, $nb, $first, $filter, $date_min, $keepHistoryDefault);

View File

@@ -6,7 +6,7 @@ class FreshRSS extends Minz_FrontController {
}
$this->accessControl(Minz_Session::param('currentUser', ''));
$this->loadParamsView();
$this->loadStylesAndScripts();
$this->loadStylesAndScripts(); //TODO: Do not load that when not needed, e.g. some Ajax requests
$this->loadNotifications();
}

View File

@@ -1,7 +1,20 @@
<?php
require(dirname(__FILE__) . '/../constants.php');
//TODO: check if already running
//<Mutex>
$lock = DATA_PATH . '/actualize.lock.txt';
if (file_exists($lock) && ((time() - @filemtime($lock)) > 3600)) {
@unlink($lock);
}
if (($handle = @fopen($lock, 'x')) === false) {
syslog(LOG_NOTICE, 'FreshRSS actualize already running?');
fwrite(STDERR, 'FreshRSS actualize already running?' . "\n");
return;
}
register_shutdown_function('unlink', $lock);
//Could use http://php.net/function.pcntl-signal.php to catch interruptions
@fclose($handle);
//</Mutex>
require(LIB_PATH . '/lib_rss.php'); //Includes class autoloader
@@ -10,8 +23,12 @@ ob_implicit_flush(false);
ob_start();
echo 'Results: ', "\n"; //Buffered
Minz_Configuration::init();
$users = listUsers();
shuffle($users);
shuffle($users); //Process users in random order
array_unshift($users, Minz_Configuration::defaultUser()); //But always start with admin
$users = array_unique($users);
foreach ($users as $myUser) {
syslog(LOG_INFO, 'FreshRSS actualize ' . $myUser);

View File

@@ -5,6 +5,7 @@ return array (
'installation_step' => 'Installation - step %d',
'steps' => 'Steps',
'checks' => 'Checks',
'general_configuration' => 'General configuration',
'bdd_configuration' => 'Database configuration',
'bdd_type' => 'Type of database',
'version_update' => 'Update',
@@ -31,6 +32,10 @@ return array (
'pdomysql_is_nok' => 'You lack PDO or its driver for MySQL (php5-mysql package)',
'dom_is_ok' => 'You have the required library to browse the DOM',
'dom_is_nok' => 'You lack a required library to browse the DOM (php-xml package)',
'pcre_is_ok' => 'You have the required library for regular expressions (PCRE)',
'pcre_is_nok' => 'You lack a required library for regular expressions (php-pcre)',
'ctype_is_ok' => 'You have the required library for character type checking (ctype)',
'ctype_is_nok' => 'You lack a required library for character type checking (php-ctype)',
'cache_is_ok' => 'Permissions on cache directory are good',
'log_is_ok' => 'Permissions on logs directory are good',
'favicons_is_ok' => 'Permissions on favicons directory are good',

View File

@@ -5,6 +5,7 @@ return array (
'installation_step' => 'Installation - étape %d',
'steps' => 'Étapes',
'checks' => 'Vérifications',
'general_configuration' => 'Configuration générale',
'bdd_configuration' => 'Base de données',
'bdd_type' => 'Type de base de données',
'version_update' => 'Mise à jour',
@@ -26,11 +27,15 @@ return array (
'minz_is_ok' => 'Vous disposez du framework Minz',
'minz_is_nok' => 'Vous ne disposez pas de la librairie Minz. Vous devriez exécuter le script <em>build.sh</em> ou bien <a href="https://github.com/marienfressinaud/MINZ">la télécharger sur Github</a> et installer dans le répertoire <em>%s</em> le contenu de son répertoire <em>/lib</em>.',
'curl_is_ok' => 'Vous disposez de cURL dans sa version %s',
'curl_is_nok' => 'Vous ne disposez pas de cURL (librairie php5-curl)',
'pdomysql_is_ok' => 'Vous disposez de PDO et de son driver pour MySQL (librairie php5-mysql)',
'curl_is_nok' => 'Vous ne disposez pas de cURL (paquet php5-curl)',
'pdomysql_is_ok' => 'Vous disposez de PDO et de son driver pour MySQL (paquet php5-mysql)',
'pdomysql_is_nok' => 'Vous ne disposez pas de PDO ou de son driver pour MySQL',
'dom_is_ok' => 'Vous disposez du nécessaire pour parcourir le DOM',
'dom_is_nok' => 'Vous ne disposez pas du nécessaire pour parcourir le DOM (librairie php-xml)',
'dom_is_nok' => 'Il manque une librairie pour parcourir le DOM (paquet php-xml)',
'pcre_is_ok' => 'Vous disposez du nécessaire pour les expressions régulières (PCRE)',
'pcre_is_nok' => 'Il manque une librairie pour les expressions régulières (php-pcre)',
'ctype_is_ok' => 'Vous disposez du nécessaire pour la vérification des types de caractères (ctype)',
'ctype_is_nok' => 'Il manque une librairie pour la vérification des types de caractères (php-ctype)',
'cache_is_ok' => 'Les droits sur le répertoire de cache sont bons',
'log_is_ok' => 'Les droits sur le répertoire des logs sont bons',
'favicons_is_ok' => 'Les droits sur le répertoire des favicons sont bons',

View File

@@ -16,7 +16,8 @@
?>
<link id="prefetch" rel="next prefetch" href="<?php echo Minz_Url::display (array ('c' => Minz_Request::controllerName (), 'a' => Minz_Request::actionName (), 'params' => $params)); ?>" />
<?php } ?>
<link rel="icon" href="<?php echo Minz_Url::display ('/favicon.ico'); ?>" />
<link rel="shortcut icon" type="image/x-icon" sizes="16x16 64x64" href="<?php echo Minz_Url::display('/favicon.ico'); ?>" />
<link rel="icon msapplication-TileImage apple-touch-icon" type="image/png" sizes="256x256" href="<?php echo Minz_Url::display('/themes/icons/favicon-256.png'); ?>" />
<?php if (isset ($this->rss_url)) { ?>
<link rel="alternate" type="application/rss+xml" title="<?php echo $this->rss_title; ?>" href="<?php echo Minz_Url::display ($this->rss_url); ?>" />
<?php } ?>
@@ -24,6 +25,7 @@
<link rel="prefetch" href="<?php echo FreshRSS_Themes::icon('non-starred', true); ?>">
<link rel="prefetch" href="<?php echo FreshRSS_Themes::icon('read', true); ?>">
<link rel="prefetch" href="<?php echo FreshRSS_Themes::icon('unread', true); ?>">
<meta name="msapplication-TileColor" content="#FFF" />
<meta name="robots" content="noindex,nofollow" />
</head>
<body>

View File

@@ -25,7 +25,7 @@ if (!empty($this->entries)) {
$bottomline_favorite = $this->conf->bottomline_favorite;
$bottomline_sharing = $this->conf->bottomline_sharing && (
$shaarli || $poche || $diaspora || $twitter ||
$google_plus || $facebook || $email);
$google_plus || $facebook || $email || $print);
$bottomline_tags = $this->conf->bottomline_tags;
$bottomline_date = $this->conf->bottomline_date;
$bottomline_link = $this->conf->bottomline_link;

View File

@@ -1,37 +1,41 @@
var feeds = new Array ();
"use strict";
var feeds = [];
<?php foreach ($this->feeds as $feed) { ?>
feeds.push ("<?php echo Minz_Url::display (array ('c' => 'feed', 'a' => 'actualize', 'params' => array ('id' => $feed->id (), 'ajax' => '1')), 'php'); ?>");
feeds.push("<?php echo Minz_Url::display (array ('c' => 'feed', 'a' => 'actualize', 'params' => array ('id' => $feed->id (), 'ajax' => '1')), 'php'); ?>");
<?php } ?>
function initProgressBar (init) {
function initProgressBar(init) {
if (init) {
$("body").after ("\<div id=\"actualizeProgress\" class=\"actualizeProgress\">\
$("body").after("\<div id=\"actualizeProgress\" class=\"actualizeProgress\">\
<?php echo Minz_Translate::t ('refresh'); ?> <span class=\"progress\">0 / " + feeds.length + "</span><br />\
<progress id=\"actualizeProgressBar\" value=\"0\" max=\"" + feeds.length + "\"></progress>\
</div>");
} else {
window.location.reload ();
window.location.reload();
}
}
function updateProgressBar (i) {
function updateProgressBar(i) {
$("#actualizeProgressBar").val(i);
$("#actualizeProgress .progress").html (i + " / " + feeds.length);
$("#actualizeProgress .progress").html(i + " / " + feeds.length);
}
function updateFeeds () {
initProgressBar (true);
function updateFeeds() {
if (feeds.length === 0) {
return;
}
initProgressBar(true);
var i = 0;
for (var f in feeds) {
$.ajax ({
$.ajax({
type: 'POST',
url: feeds[f],
}).done (function (data) {
}).done(function (data) {
i++;
updateProgressBar (i);
updateProgressBar(i);
if (i == feeds.length) {
initProgressBar (false);
if (i === feeds.length) {
initProgressBar(false);
}
});
}

1
data/.gitignore vendored
View File

@@ -5,3 +5,4 @@ config.php
touch.txt
no-cache.txt
*.bak.php
*.lock.txt

View File

@@ -91,10 +91,17 @@ function timestamptodate ($t, $hour = true) {
function html_only_entity_decode($text) {
static $htmlEntitiesOnly = null;
if ($htmlEntitiesOnly === null) {
$htmlEntitiesOnly = array_flip(array_diff(
get_html_translation_table(HTML_ENTITIES, ENT_NOQUOTES, 'UTF-8'), //Decode HTML entities
get_html_translation_table(HTML_SPECIALCHARS, ENT_NOQUOTES, 'UTF-8') //Preserve XML entities
));
if (version_compare(PHP_VERSION, '5.3.4') >= 0) {
$htmlEntitiesOnly = array_flip(array_diff(
get_html_translation_table(HTML_ENTITIES, ENT_NOQUOTES, 'UTF-8'), //Decode HTML entities
get_html_translation_table(HTML_SPECIALCHARS, ENT_NOQUOTES, 'UTF-8') //Preserve XML entities
));
} else {
$htmlEntitiesOnly = array_map('utf8_encode', array_flip(array_diff(
get_html_translation_table(HTML_ENTITIES, ENT_NOQUOTES), //Decode HTML entities
get_html_translation_table(HTML_SPECIALCHARS, ENT_NOQUOTES) //Preserve XML entities
)));
}
}
return strtr($text, $htmlEntitiesOnly);
}

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 13 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 694 B

View File

@@ -5,8 +5,10 @@
<meta name="viewport" content="initial-scale=1.0" />
<meta http-equiv="Refresh" content="0; url=i/" />
<title>FreshRSS</title>
<link rel="shortcut icon" type="image/x-icon" sizes="16x16 64x64" href="favicon.ico" />
<link rel="icon msapplication-TileImage apple-touch-icon" type="image/png" sizes="256x256" href="themes/icons/favicon-256.png" />
<meta name="msapplication-TileColor" content="#FFF" />
<meta name="robots" content="noindex,nofollow" />
<link rel="icon" href="favicon.ico" />
<style>
body {
font-family: sans-serif;

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 313 B

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 513 B

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 700 B

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 868 B