diff --git a/README.md b/README.md index d2ef8d92f..2eb9ca03a 100644 --- a/README.md +++ b/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 à 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. * 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 s’adapter à 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, n’hé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 ``` diff --git a/lib/Minz/FrontController.php b/lib/Minz/FrontController.php index eb9835fe5..8e9c511a6 100644 --- a/lib/Minz/FrontController.php +++ b/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 doesn’t exist : LOG_PATH'); } try { diff --git a/public/install.php b/public/install.php index 026e9098c..8d8613e38 100644 --- a/public/install.php +++ b/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 () { -
@@ -643,14 +668,14 @@ function printStep3 () {
- +
- +
@@ -687,10 +712,10 @@ function printStep5 () { -