Browse Source

Merge branch 'dev' into shortcuts

Alexis Degrugillier 12 years ago
parent
commit
f0c2bb74eb

+ 12 - 19
CHANGELOG

@@ -1,6 +1,6 @@
 # Journal des modifications
 
-## 2014-01-xx FreshRSS 0.7.5
+## 2014-01-xx FreshRSS 0.7
 
 * Nouveau mode multi-utilisateur
 	* L’utilisateur par défaut (administrateur) peut créer et supprimer d’autres utilisateurs
@@ -8,21 +8,14 @@
 		* par HTTP (par exemple sous Apache en créant un fichier ./p/i/.htaccess et .htpasswd)
 			* le nom d’utilisateur HTTP doit correspondre au nom d’utilisateur FreshRSS
 		* par Mozilla Persona, en renseignant l’adresse 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 d’un flux
 	* Option pour marquer les articles comme lus dès la réception
@@ -30,18 +23,17 @@
 	* Permet de modifier la description et l’adresse d’un 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 d’utilisateur en prévision du futur support multi-utilisateurs
+		* Les tables sont préfixées avec le nom d’utilisateur afin de permettre le mode multi-utilisateurs
 		* Amélioration des performances
 		* Tolère un beaucoup plus grand nombre d’articles
 		* 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 à l’installeur) 
+		* Incompatible avec la version 0.6 (nécessite une mise à jour grâce à l’installateur) 
 	* 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 l’URL du flux (en base de données) lorsque SimplePie découvre qu’elle 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 d’absence de librairie JSON
 	* Pour le développement, le cache HTTP peut être désactivé en créant un fichier “./no-cache.txt”

+ 11 - 6
README.md

@@ -8,8 +8,8 @@ Il permet de gérer plusieurs utilisateurs, et dispose d’un 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 d’actualisation 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 d’actualisation automatique des flux.
+Consultez la documentation de Cron de votre système d’exploitation ([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)…).
+C’est une bonne idée d’utiliser 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

+ 3 - 1
app/Controllers/configureController.php

@@ -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,

+ 1 - 1
app/Controllers/indexController.php

@@ -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);

+ 1 - 1
app/FreshRSS.php

@@ -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();
 	}
 

+ 19 - 2
app/actualize_script.php

@@ -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);

+ 5 - 0
app/i18n/install.en.php

@@ -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',

+ 8 - 3
app/i18n/install.fr.php

@@ -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',

+ 3 - 1
app/layout/layout.phtml

@@ -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>

+ 1 - 1
app/views/helpers/view/normal_view.phtml

@@ -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;

+ 18 - 14
app/views/javascript/actualize.phtml

@@ -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 - 0
data/.gitignore

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

+ 11 - 4
lib/lib_rss.php

@@ -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);
 }

BIN
p/favicon.ico


BIN
p/favicon.png


+ 3 - 1
p/index.html

@@ -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;

BIN
p/themes/icons/favicon-128.png


BIN
p/themes/icons/favicon-16.png


BIN
p/themes/icons/favicon-256.png


BIN
p/themes/icons/favicon-32.png


BIN
p/themes/icons/favicon-48.png


BIN
p/themes/icons/favicon-512.png


BIN
p/themes/icons/favicon-64.png