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.
pull/326/head
Alexandre Alapetite 11 years ago
parent 3e64c3689e
commit 385b5b1b40
  1. 28
      README.md
  2. 2
      lib/Minz/FrontController.php
  3. 194
      public/install.php

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

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

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

Loading…
Cancel
Save