浏览代码

Install.php : permet d'être relancé sur une installation existante en chargeant les paramètres existants

Contribue à https://github.com/marienfressinaud/FreshRSS/issues/255
Vérifier base_url et token, que je n'ai pas re-testés.
Alexandre Alapetite 12 年之前
父节点
当前提交
385b5b1b40
共有 3 个文件被更改,包括 124 次插入100 次删除
  1. 14 14
      README.md
  2. 1 1
      lib/Minz/FrontController.php
  3. 109 85
      public/install.php

+ 14 - 14
README.md

@@ -1,5 +1,5 @@
 # FreshRSS
-FreshRSS est un agrégateur de flux RSS à auto-héberger à l'image de [Leed](http://projet.idleman.fr/leed/) ou de [Kriss Feed](http://tontof.net/kriss/feed/). Il se veut léger et facile à prendre en main tout en étant un outil puissant et paramétrable.
+FreshRSS est un agrégateur de flux RSS à auto-héberger à limage de [Leed](http://projet.idleman.fr/leed/) ou de [Kriss Feed](http://tontof.net/kriss/feed/). Il se veut léger et facile à prendre en main tout en étant un outil puissant et paramétrable.
 
 * Site officiel : http://marienfressinaud.github.io/FreshRSS/
 * Démo : http://marienfressinaud.fr/projets/freshrss/
@@ -11,9 +11,9 @@ FreshRSS est un agrégateur de flux RSS à auto-héberger à l'image de [Leed](h
 ![Logo de FreshRSS](http://marienfressinaud.fr/data/images/freshrss/freshrss_title.png)
 
 # Disclaimer
-Cette application a été développée pour s'adapter à des besoins personnels et non professionels.
+Cette application a été développée pour sadapter à des besoins personnels et non professionels.
 Je ne garantis en aucun cas la sécurité de celle-ci, ni son bon fonctionnement.
-Je m'engage néanmoins à répondre dans la mesure du possible aux demandes d'évolution si celles-ci me semblent justifiées.
+Je m’engage néanmoins à répondre dans la mesure du possible aux demandes d’évolution si celles-ci me semblent justifiées.
 Privilégiez pour cela des demandes sur GitHub
 (https://github.com/marienfressinaud/FreshRSS/issues) ou par mail (dev@marienfressinaud.fr)
 
@@ -26,20 +26,20 @@ Privilégiez pour cela des demandes sur GitHub
 * Un navigateur Web récent tel Firefox, Chrome, Opera, Safari, Internet Explorer 9+
  * Fonctionne aussi sur mobile
 
-![Capture d'écran de FreshRSS](http://marienfressinaud.fr/data/images/freshrss/freshrss_default-design.png)
+![Capture décran de FreshRSS](http://marienfressinaud.fr/data/images/freshrss/freshrss_default-design.png)
 
 # 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. Déplacez l'application où vous voulez sur votre serveur (attention, la partie accessible se trouve dans le répertoire `./public`)
-3. Accédez à FreshRSS à travers votre navigateur web et suivez les instructions d'installation
-4. Tout devrait fonctionner :) En cas de problème, n'hésitez pas à me contacter.
+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`)
+3. Accédez à FreshRSS à travers votre navigateur Web et suivez les instructions d’installation
+4. Tout devrait fonctionner :) En cas de problème, nhésitez pas à me contacter.
 
-# Sécurité et conseils
-1. Pour une meilleure sécurité, faites en sorte que seul le répertoire `./public` soit accessible par le navigateur. Faites pointer un sous-domaine sur le répertoire `./public` par exemple
-2. Dans tous les cas, assurez-vous que `./data/application.ini` ne puisse pas être téléchargé !
-3. Le fichier de log peut être utile à lire si vous avez des soucis
-4. Le fichier `./public/index.php` défini les chemins d'accès aux répertoires clés de l'application. Si vous les bougez, tout se passe ici.
-5. Vous pouvez ajouter une tâche CRON sur le script d'actualisation des flux. Il s'agit d'un script PHP à exécuter avec la commande `php`. Par exemple, pour exécuter le script toutes les heures :
+# Conseils
+1. 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`.
+2. Les données sensibles 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).
+3. En cas de problème, les logs peuvent être utile à lire, soit depuis l’interface de FreshRSS, soit manuellement depuis `./data/log/*.log`.
+4. 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.
+5. Vous pouvez ajouter une tâche CRON sur le script d’actualisation des flux. Il s’agit d’un script PHP à exécuter avec la commande `php`. Par exemple, pour exécuter le script toutes les heures :
 ```
 7 * * * * php /chemin/vers/freshrss/actualize_script.php >/dev/null 2>&1
 ```

+ 1 - 1
lib/Minz/FrontController.php

@@ -32,7 +32,7 @@ class Minz_FrontController {
 	 */
 	public function __construct () {
 		if (LOG_PATH === false) {
-			$this->killApp ('Path doesn\'t exist : LOG_PATH');
+			$this->killApp ('Path doesnt exist : LOG_PATH');
 		}
 
 		try {

+ 109 - 85
public/install.php

@@ -88,11 +88,7 @@ function initTranslate () {
 	global $translates;
 	global $actual;
 
-	$l = getBetterLanguage ('en');
-	if (isset ($_SESSION['language'])) {
-		$l = $_SESSION['language'];
-	}
-	$actual = $l;
+	$actual = isset($_SESSION['language']) ? $_SESSION['language'] : getBetterLanguage('en');
 
 	$file = APP_PATH . '/i18n/' . $actual . '.php';
 	if (file_exists ($file)) {
@@ -148,10 +144,7 @@ function saveStep2 () {
 			return false;
 		}
 
-		$_SESSION['sel'] = md5 (
-			uniqid (mt_rand (), true).implode ('', stat (__FILE__))
-		);
-		$_SESSION['base_url'] = addslashes ($_POST['base_url']);
+		$_SESSION['sel_application'] = sha1(uniqid(mt_rand(), true).implode('', stat(__FILE__)));
 		$_SESSION['title'] = addslashes ($_POST['title']);
 		$_SESSION['old_entries'] = $_POST['old_entries'];
 		if (!is_int (intval ($_SESSION['old_entries'])) ||
@@ -163,8 +156,7 @@ function saveStep2 () {
 
 		$token = '';
 		if ($_SESSION['mail_login']) {
-			$token = small_hash (time () . $_SESSION['sel'])
-			       . small_hash ($_SESSION['base_url'] . $_SESSION['sel']);
+			$token = sha1($_SESSION['sel_application'] . $_SESSION['mail_login']);
 		}
 
 		$file_data = DATA_PATH . '/' . $_SESSION['default_user'] . '_user.php';
@@ -196,25 +188,25 @@ function saveStep3 () {
 		$_SESSION['bd_type'] = isset ($_POST['type']) ? $_POST['type'] : 'mysql';
 		$_SESSION['bd_host'] = addslashes ($_POST['host']);
 		$_SESSION['bd_user'] = addslashes ($_POST['user']);
-		$_SESSION['bd_pass'] = addslashes ($_POST['pass']);
-		$_SESSION['bd_name'] = addslashes ($_POST['base']);
+		$_SESSION['bd_password'] = addslashes ($_POST['pass']);
+		$_SESSION['bd_base'] = addslashes ($_POST['base']);
 		$_SESSION['bd_prefix'] = addslashes ($_POST['prefix']);
 
 		$file_conf = DATA_PATH . '/application.ini';
 		$f = fopen ($file_conf, 'w');
 		writeLine ($f, '[general]');
-		writeLine ($f, 'environment = "production"');
+		writeLine ($f, 'environment = "' . empty($_SESSION['environment']) ? 'production' : $_SESSION['environment'] . '"');
 		writeLine ($f, 'use_url_rewriting = false');
-		writeLine ($f, 'sel_application = "' . $_SESSION['sel'] . '"');
-		writeLine ($f, 'base_url = "' . $_SESSION['base_url'] . '"');
+		writeLine ($f, 'sel_application = "' . $_SESSION['sel_application'] . '"');
+		writeLine ($f, 'base_url = ""');
 		writeLine ($f, 'title = "' . $_SESSION['title'] . '"');
 		writeLine ($f, 'default_user = "' . $_SESSION['default_user'] . '"');
 		writeLine ($f, '[db]');
 		writeLine ($f, 'type = "' . $_SESSION['bd_type'] . '"');
 		writeLine ($f, 'host = "' . $_SESSION['bd_host'] . '"');
 		writeLine ($f, 'user = "' . $_SESSION['bd_user'] . '"');
-		writeLine ($f, 'password = "' . $_SESSION['bd_pass'] . '"');
-		writeLine ($f, 'base = "' . $_SESSION['bd_name'] . '"');
+		writeLine ($f, 'password = "' . $_SESSION['bd_password'] . '"');
+		writeLine ($f, 'base = "' . $_SESSION['bd_base'] . '"');
 		writeLine ($f, 'prefix = "' . $_SESSION['bd_prefix'] . '"');
 		fclose ($f);
 
@@ -237,6 +229,50 @@ function deleteInstall () {
 	}
 }
 
+function moveOldFiles() {
+	$mvs = array(
+		'/app/configuration/application.ini' => '/data/application.ini',	//v0.6
+		'/public/data/Configuration.array.php' => '/data/Configuration.array.php',	//v0.6
+	);
+	$ok = true;
+	foreach ($mvs as $fFrom => $fTo) {
+		if (file_exists(FRESHRSS_PATH . $fFrom)) {
+			if (copy(FRESHRSS_PATH . $fFrom, FRESHRSS_PATH . $fTo)) {
+				@unlink(FRESHRSS_PATH . $fFrom);
+			} else {
+				$ok = false;
+			}
+		}
+	}
+	return $ok;
+}
+
+function delTree($dir) {	//http://php.net/rmdir#110489
+	if (!is_dir($dir)) {
+		return true;
+	}
+	$files = array_diff(scandir($dir), array('.', '..'));
+	foreach ($files as $file) {
+		$f = $dir . '/' . $file;
+		if (is_dir($f)) {
+			@chmod($f, 0777);
+			delTree($f);
+		}
+		else unlink($f);
+	}
+	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 ();
@@ -254,6 +290,47 @@ function checkStep () {
 	}
 }
 function checkStep0 () {
+	moveOldFiles() && removeOldFiles();
+
+	if (file_exists(DATA_PATH . '/application.ini')) {
+		$ini_array = parse_ini_file(DATA_PATH . '/application.ini', true);
+		if ($ini_array) {
+			$ini_general = isset($ini_array['general']) ? $ini_array['general'] : null;
+			if ($ini_general) {
+				$keys = array('environment', 'sel_application', 'title', 'default_user');
+				foreach ($keys as $key) {
+					if ((empty($_SESSION[$key])) && isset($ini_general[$key])) {
+						$_SESSION[$key] = $ini_general[$key];
+					}
+				}
+			}
+			$ini_db = isset($ini_array['db']) ? $ini_array['db'] : null;
+			if ($ini_db) {
+				$keys = array('type', 'host', 'user', 'password', 'base', 'prefix');
+				foreach ($keys as $key) {
+					if ((!isset($_SESSION['bd_' . $key])) && isset($ini_db[$key])) {
+						$_SESSION['bd_' . $key] = $ini_db[$key];
+					}
+				}
+			}
+		}
+	}
+
+	if (isset($_SESSION['default_user']) && file_exists(DATA_PATH . '/' . $_SESSION['default_user'] . '_user.php')) {
+		$userConfig = include(DATA_PATH . '/' . $_SESSION['default_user'] . '_user.php');
+	} elseif (file_exists(DATA_PATH . '/Configuration.array.php')) {
+		$userConfig = include(DATA_PATH . '/Configuration.array.php');	//v0.6
+	} else {
+		$userConfig = array();
+	}
+
+	$keys = array('language', 'old_entries', 'mail_login');
+	foreach ($keys as $key) {
+		if ((!isset($_SESSION[$key])) && isset($userConfig[$key])) {
+			$_SESSION[$key] = $userConfig[$key];
+		}
+	}
+
 	$languages = availableLanguages ();
 	$language = isset ($_SESSION['language']) &&
 	            isset ($languages[$_SESSION['language']]);
@@ -288,55 +365,8 @@ function checkStep1 () {
 	);
 }
 
-function moveOldFiles() {
-	$mvs = array(
-		'/app/configuration/application.ini' => '/data/application.ini',
-		'/public/data/Configuration.array.php' => '/data/Configuration.array.php',
-	);
-	$ok = true;
-	foreach ($mvs as $fFrom => $fTo) {
-		if (file_exists(FRESHRSS_PATH . $fFrom)) {
-			if (copy(FRESHRSS_PATH . $fFrom, FRESHRSS_PATH . $fTo)) {
-				@unlink(FRESHRSS_PATH . $fFrom);
-			} else {
-				$ok = false;
-			}
-		}
-	}
-	return $ok;
-}
-
-function delTree($dir) {	//http://php.net/rmdir#110489
-	if (!is_dir($dir)) {
-		return true;
-	}
-	$files = array_diff(scandir($dir), array('.', '..'));
-	foreach ($files as $file) {
-		$f = $dir . '/' . $file;
-		if (is_dir($f)) {
-			@chmod($f, 0777);
-			delTree($f);
-		}
-		else unlink($f);
-	}
-	return rmdir($dir);
-}
-
-function removeOldFiles() {
-	$oldDirs = array('/app/configuration/', '/cache/', '/log/', '/public/data/', '/public/themes/printer/');
-
-	$ok = true;
-	foreach ($oldDirs as $oldDir) {
-		$ok &= delTree(FRESHRSS_PATH . $oldDir);
-	}
-	return $ok;
-}
-
 function checkStep2 () {
-	moveOldFiles() && removeOldFiles();
-
-	$conf = isset ($_SESSION['sel']) &&
-	        isset ($_SESSION['base_url']) &&
+	$conf = isset ($_SESSION['sel_application']) &&
 	        isset ($_SESSION['title']) &&
 	        isset ($_SESSION['old_entries']) &&
 	        isset ($_SESSION['mail_login']) &&
@@ -358,11 +388,13 @@ function checkStep2 () {
 }
 function checkStep3 () {
 	$conf = file_exists (DATA_PATH . '/application.ini');
+
 	$bd = isset ($_SESSION['bd_type']) &&
 	      isset ($_SESSION['bd_host']) &&
 	      isset ($_SESSION['bd_user']) &&
-	      isset ($_SESSION['bd_pass']) &&
-	      isset ($_SESSION['bd_name']);
+	      isset ($_SESSION['bd_password']) &&
+	      isset ($_SESSION['bd_base']) &&
+	      isset ($_SESSION['bd_prefix']);
 	$conn = !isset ($_SESSION['bd_error']) || !$_SESSION['bd_error'];
 
 	return array (
@@ -387,21 +419,21 @@ function checkBD () {
 			$str = 'mysql:host=' . $_SESSION['bd_host'] . ';';
 			$c = new PDO ($str,
 				      $_SESSION['bd_user'],
-				      $_SESSION['bd_pass'],
+				      $_SESSION['bd_password'],
 				      $driver_options);
 
-			$sql = sprintf (SQL_REQ_CREATE_DB, $_SESSION['bd_name']);
+			$sql = sprintf (SQL_REQ_CREATE_DB, $_SESSION['bd_base']);
 			$res = $c->query ($sql);
 
 			// on écrase la précédente connexion en sélectionnant la nouvelle BDD
-			$str = 'mysql:host=' . $_SESSION['bd_host'] . ';dbname=' . $_SESSION['bd_name'];
+			$str = 'mysql:host=' . $_SESSION['bd_host'] . ';dbname=' . $_SESSION['bd_base'];
 		} elseif($_SESSION['bd_type'] == 'sqlite') {
-			$str = 'sqlite:' . DATA_PATH . $_SESSION['bd_name'] . '.sqlite';
+			$str = 'sqlite:' . DATA_PATH . $_SESSION['bd_base'] . '.sqlite';
 		}
 
 		$c = new PDO ($str,
 			      $_SESSION['bd_user'],
-			      $_SESSION['bd_pass'],
+			      $_SESSION['bd_password'],
 			      $driver_options);
 
 		$sql = sprintf (SQL_REQ_CAT, $_SESSION['bd_prefix_user']);
@@ -549,13 +581,6 @@ function printStep2 () {
 		<?php
 			$url = substr ($_SERVER['PHP_SELF'], 0, -10);
 		?>
-		<div class="form-group" style="display:none">
-			<!-- TODO: if no problem during version 0.6, remove for version 0.7 -->
-			<label class="group-name" for="base_url"><?php echo _t ('base_url'); ?></label>
-			<div class="group-controls">
-				<input type="text" id="base_url" name="base_url" value="<?php echo isset ($_SESSION['base_url']) ? $_SESSION['base_url'] : $url; ?>" /> <?php echo _t ('do_not_change_if_doubt'); ?>
-			</div>
-		</div>
 
 		<div class="form-group">
 			<label class="group-name" for="title"><?php echo _t ('title'); ?></label>
@@ -643,14 +668,14 @@ function printStep3 () {
 		<div class="form-group">
 			<label class="group-name" for="pass"><?php echo _t ('password'); ?></label>
 			<div class="group-controls">
-				<input type="password" id="pass" name="pass" value="<?php echo isset ($_SESSION['bd_pass']) ? $_SESSION['bd_pass'] : ''; ?>" />
+				<input type="password" id="pass" name="pass" value="<?php echo isset ($_SESSION['bd_password']) ? $_SESSION['bd_password'] : ''; ?>" />
 			</div>
 		</div>
 
 		<div class="form-group">
 			<label class="group-name" for="base"><?php echo _t ('bdd'); ?></label>
 			<div class="group-controls">
-				<input type="text" id="base" name="base" maxlength="64" value="<?php echo isset ($_SESSION['bd_name']) ? $_SESSION['bd_name'] : ''; ?>" placeholder="freshrss" />
+				<input type="text" id="base" name="base" maxlength="64" value="<?php echo isset ($_SESSION['bd_base']) ? $_SESSION['bd_base'] : ''; ?>" placeholder="freshrss" />
 			</div>
 		</div>
 
@@ -687,10 +712,10 @@ function printStep5 () {
 <?php
 }
 
-initTranslate ();
-
 checkStep ();
 
+initTranslate ();
+
 switch (STEP) {
 case 0:
 default:
@@ -767,4 +792,3 @@ case 5:
 </div>
 	</body>
 </html>
-