Ver Fonte

Amélioration de l'installateur + préfixe BDD

Fix issue #96 : on peut désormais choisir un préfixe aux tables de la
BDD lors de l'installation
Fix issue #115 : échappement des guillemets pendant la phase
d'installation
Fix issue #116 : le thème de l'installateur est désormais accessible
FIx issue #117 : rajout du test de la présence DOMDocument lors de
l'installation. Si non présent, on peut pas accéder aux flux RSS.
Normalement fourni sur un système RedHat-like par le paquet php-xml
Marien Fressinaud há 12 anos atrás
pai
commit
7fd7727096

+ 3 - 0
app/i18n/en.php

@@ -266,6 +266,8 @@ return array (
 	'curl_is_nok'			=> 'You haven\'t cURL',
 	'pdomysql_is_ok'		=> 'You have PDO and its driver for MySQL',
 	'pdomysql_is_nok'		=> 'You haven\'t PDO or its driver for MySQL',
+	'dom_is_ok'			=> 'You have the necessary to browse the DOM',
+	'dom_is_nok'			=> 'You haven\'t the necessary to browse the DOM (php-xml package can be useful)',
 	'cache_is_ok'			=> 'Permissions on cache directory are good',
 	'log_is_ok'			=> 'Permissions on logs directory are good',
 	'conf_is_ok'			=> 'Permissions on configuration directory are good',
@@ -285,6 +287,7 @@ return array (
 	'username'			=> 'Username',
 	'password'			=> 'Password',
 	'bdd'				=> 'Database',
+	'prefix'			=> 'Table prefix',
 
 	'installation_is_ok'		=> 'Installation process is finished. You must delete <em>install.php</em> file to access FreshRSS... or simply click on following button :)',
 	'finish_installation'		=> 'Finish installation',

+ 3 - 0
app/i18n/fr.php

@@ -266,6 +266,8 @@ return array (
 	'curl_is_nok'			=> 'Vous ne disposez pas de cURL',
 	'pdomysql_is_ok'		=> 'Vous disposez de PDO et de son driver pour 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 (voir du côté du paquet php-xml ?)',
 	'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',
 	'conf_is_ok'			=> 'Les droits sur le répertoire de configuration sont bons',
@@ -285,6 +287,7 @@ return array (
 	'username'			=> 'Nom utilisateur',
 	'password'			=> 'Mot de passe',
 	'bdd'				=> 'Base de données',
+	'prefix'			=> 'Préfixe des tables',
 
 	'installation_is_ok'		=> 'L\'installation s\'est bien passée. Il faut maintenant supprimer le fichier <em>install.php</em> pour pouvoir accéder à FreshRSS... ou simplement cliquer sur le bouton ci-dessous :)',
 	'finish_installation'		=> 'Terminer l\'installation',

+ 10 - 10
app/models/Category.php

@@ -65,7 +65,7 @@ class Category extends Model {
 
 class CategoryDAO extends Model_pdo {
 	public function addCategory ($valuesTmp) {
-		$sql = 'INSERT INTO category (id, name, color) VALUES(?, ?, ?)';
+		$sql = 'INSERT INTO ' . $this->prefix . 'category (id, name, color) VALUES(?, ?, ?)';
 		$stm = $this->bd->prepare ($sql);
 
 		$values = array (
@@ -84,7 +84,7 @@ class CategoryDAO extends Model_pdo {
 	}
 
 	public function updateCategory ($id, $valuesTmp) {
-		$sql = 'UPDATE category SET name=?, color=? WHERE id=?';
+		$sql = 'UPDATE ' . $this->prefix . 'category SET name=?, color=? WHERE id=?';
 		$stm = $this->bd->prepare ($sql);
 
 		$values = array (
@@ -103,7 +103,7 @@ class CategoryDAO extends Model_pdo {
 	}
 
 	public function deleteCategory ($id) {
-		$sql = 'DELETE FROM category WHERE id=?';
+		$sql = 'DELETE FROM ' . $this->prefix . 'category WHERE id=?';
 		$stm = $this->bd->prepare ($sql);
 
 		$values = array ($id);
@@ -118,7 +118,7 @@ class CategoryDAO extends Model_pdo {
 	}
 
 	public function searchById ($id) {
-		$sql = 'SELECT * FROM category WHERE id=?';
+		$sql = 'SELECT * FROM ' . $this->prefix . 'category WHERE id=?';
 		$stm = $this->bd->prepare ($sql);
 
 		$values = array ($id);
@@ -134,7 +134,7 @@ class CategoryDAO extends Model_pdo {
 		}
 	}
 	public function searchByName ($name) {
-		$sql = 'SELECT * FROM category WHERE name=?';
+		$sql = 'SELECT * FROM ' . $this->prefix . 'category WHERE name=?';
 		$stm = $this->bd->prepare ($sql);
 
 		$values = array ($name);
@@ -151,7 +151,7 @@ class CategoryDAO extends Model_pdo {
 	}
 
 	public function listCategories () {
-		$sql = 'SELECT * FROM category ORDER BY name';
+		$sql = 'SELECT * FROM ' . $this->prefix . 'category ORDER BY name';
 		$stm = $this->bd->prepare ($sql);
 		$stm->execute ();
 
@@ -159,7 +159,7 @@ class CategoryDAO extends Model_pdo {
 	}
 
 	public function getDefault () {
-		$sql = 'SELECT * FROM category WHERE id="000000"';
+		$sql = 'SELECT * FROM ' . $this->prefix . 'category WHERE id="000000"';
 		$stm = $this->bd->prepare ($sql);
 
 		$stm->execute ();
@@ -190,7 +190,7 @@ class CategoryDAO extends Model_pdo {
 	}
 
 	public function count () {
-		$sql = 'SELECT COUNT(*) AS count FROM category';
+		$sql = 'SELECT COUNT(*) AS count FROM ' . $this->prefix . 'category';
 		$stm = $this->bd->prepare ($sql);
 		$stm->execute ();
 		$res = $stm->fetchAll (PDO::FETCH_ASSOC);
@@ -199,7 +199,7 @@ class CategoryDAO extends Model_pdo {
 	}
 
 	public function countFeed ($id) {
-		$sql = 'SELECT COUNT(*) AS count FROM feed WHERE category=?';
+		$sql = 'SELECT COUNT(*) AS count FROM ' . $this->prefix . 'feed WHERE category=?';
 		$stm = $this->bd->prepare ($sql);
 		$values = array ($id);
 		$stm->execute ($values);
@@ -209,7 +209,7 @@ class CategoryDAO extends Model_pdo {
 	}
 
 	public function countNotRead ($id) {
-		$sql = 'SELECT COUNT(*) AS count FROM entry e INNER JOIN feed f ON e.id_feed = f.id WHERE category=? AND e.is_read=0';
+		$sql = 'SELECT COUNT(*) AS count FROM ' . $this->prefix . 'entry e INNER JOIN ' . $this->prefix . 'feed f ON e.id_feed = f.id WHERE category=? AND e.is_read=0';
 		$stm = $this->bd->prepare ($sql);
 		$values = array ($id);
 		$stm->execute ($values);

+ 18 - 18
app/models/Entry.php

@@ -222,7 +222,7 @@ class Entry extends Model {
 
 class EntryDAO extends Model_pdo {
 	public function addEntry ($valuesTmp) {
-		$sql = 'INSERT INTO entry(id, guid, title, author, content, link, date, is_read, is_favorite, is_public, id_feed, lastUpdate, tags) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)';
+		$sql = 'INSERT INTO ' . $this->prefix . 'entry(id, guid, title, author, content, link, date, is_read, is_favorite, is_public, id_feed, lastUpdate, tags) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)';
 		$stm = $this->bd->prepare ($sql);
 
 		$values = array (
@@ -261,7 +261,7 @@ class EntryDAO extends Model_pdo {
 		}
 		$set = substr ($set, 0, -2);
 
-		$sql = 'UPDATE entry SET ' . $set . ' WHERE id=?';
+		$sql = 'UPDATE ' . $this->prefix . 'entry SET ' . $set . ' WHERE id=?';
 		$stm = $this->bd->prepare ($sql);
 
 		foreach ($valuesTmp as $v) {
@@ -279,7 +279,7 @@ class EntryDAO extends Model_pdo {
 	}
 
 	public function markReadEntries ($read, $dateMax) {
-		$sql = 'UPDATE entry e INNER JOIN feed f ON e.id_feed = f.id SET is_read = ? WHERE date < ? AND priority > 0';
+		$sql = 'UPDATE ' . $this->prefix . 'entry e INNER JOIN ' . $this->prefix . 'feed f ON e.id_feed = f.id SET is_read = ? WHERE date < ? AND priority > 0';
 		$stm = $this->bd->prepare ($sql);
 
 		$values = array ($read, $dateMax);
@@ -293,7 +293,7 @@ class EntryDAO extends Model_pdo {
 		}
 	}
 	public function markReadCat ($id, $read, $dateMax) {
-		$sql = 'UPDATE entry e INNER JOIN feed f ON e.id_feed = f.id SET is_read = ? WHERE category = ? AND date < ?';
+		$sql = 'UPDATE ' . $this->prefix . 'entry e INNER JOIN ' . $this->prefix . 'feed f ON e.id_feed = f.id SET is_read = ? WHERE category = ? AND date < ?';
 		$stm = $this->bd->prepare ($sql);
 
 		$values = array ($read, $id, $dateMax);
@@ -307,7 +307,7 @@ class EntryDAO extends Model_pdo {
 		}
 	}
 	public function markReadFeed ($id, $read, $dateMax) {
-		$sql = 'UPDATE entry SET is_read = ? WHERE id_feed = ? AND date < ?';
+		$sql = 'UPDATE ' . $this->prefix . 'entry SET is_read = ? WHERE id_feed = ? AND date < ?';
 		$stm = $this->bd->prepare ($sql);
 
 		$values = array ($read, $id, $dateMax);
@@ -332,7 +332,7 @@ class EntryDAO extends Model_pdo {
 		}
 		$set = substr ($set, 0, -2);
 
-		$sql = 'UPDATE entry SET ' . $set;
+		$sql = 'UPDATE ' . $this->prefix . 'entry SET ' . $set;
 		$stm = $this->bd->prepare ($sql);
 
 		foreach ($valuesTmp as $v) {
@@ -350,7 +350,7 @@ class EntryDAO extends Model_pdo {
 
 	public function cleanOldEntries ($nb_month) {
 		$date = 60 * 60 * 24 * 30 * $nb_month;
-		$sql = 'DELETE FROM entry WHERE date <= ? AND is_favorite = 0 AND annotation = ""';
+		$sql = 'DELETE FROM ' . $this->prefix . 'entry WHERE date <= ? AND is_favorite = 0 AND annotation = ""';
 		$stm = $this->bd->prepare ($sql);
 
 		$values = array (
@@ -368,7 +368,7 @@ class EntryDAO extends Model_pdo {
 
 	public function searchByGuid ($feed_id, $id) {
 		// un guid est unique pour un flux donné
-		$sql = 'SELECT * FROM entry WHERE id_feed=? AND guid=?';
+		$sql = 'SELECT * FROM ' . $this->prefix . 'entry WHERE id_feed=? AND guid=?';
 		$stm = $this->bd->prepare ($sql);
 
 		$values = array (
@@ -388,7 +388,7 @@ class EntryDAO extends Model_pdo {
 	}
 
 	public function searchById ($id) {
-		$sql = 'SELECT * FROM entry WHERE id=?';
+		$sql = 'SELECT * FROM ' . $this->prefix . 'entry WHERE id=?';
 		$stm = $this->bd->prepare ($sql);
 
 		$values = array ($id);
@@ -417,8 +417,8 @@ class EntryDAO extends Model_pdo {
 			$order = '';
 		}
 
-		$sql = 'SELECT e.* FROM entry e'
-		     . ' INNER JOIN feed f ON e.id_feed = f.id' . $where
+		$sql = 'SELECT e.* FROM ' . $this->prefix . 'entry e'
+		     . ' INNER JOIN  ' . $this->prefix . 'feed f ON e.id_feed = f.id' . $where
 		     . ' ORDER BY date' . $order;
 		$stm = $this->bd->prepare ($sql);
 		$stm->execute ($values);
@@ -442,7 +442,7 @@ class EntryDAO extends Model_pdo {
 	}
 
 	public function count () {
-		$sql = 'SELECT COUNT(*) AS count FROM entry e INNER JOIN feed f ON e.id_feed = f.id WHERE priority > 0';
+		$sql = 'SELECT COUNT(*) AS count FROM ' . $this->prefix . 'entry e INNER JOIN  ' . $this->prefix . 'feed f ON e.id_feed = f.id WHERE priority > 0';
 		$stm = $this->bd->prepare ($sql);
 		$stm->execute ();
 		$res = $stm->fetchAll (PDO::FETCH_ASSOC);
@@ -450,7 +450,7 @@ class EntryDAO extends Model_pdo {
 		return $res[0]['count'];
 	}
 	public function countNotRead () {
-		$sql = 'SELECT COUNT(*) AS count FROM entry e INNER JOIN feed f ON e.id_feed = f.id WHERE is_read=0 AND priority > 0';
+		$sql = 'SELECT COUNT(*) AS count FROM ' . $this->prefix . 'entry e INNER JOIN  ' . $this->prefix . 'feed f ON e.id_feed = f.id WHERE is_read=0 AND priority > 0';
 		$stm = $this->bd->prepare ($sql);
 		$stm->execute ();
 		$res = $stm->fetchAll (PDO::FETCH_ASSOC);
@@ -459,7 +459,7 @@ class EntryDAO extends Model_pdo {
 	}
 
 	public function countNotReadByFeed ($id) {
-		$sql = 'SELECT COUNT(*) AS count FROM entry WHERE is_read = 0 AND id_feed = ?';
+		$sql = 'SELECT COUNT(*) AS count FROM ' . $this->prefix . 'entry WHERE is_read = 0 AND id_feed = ?';
 		$stm = $this->bd->prepare ($sql);
 		$stm->execute (array ($id));
 		$res = $stm->fetchAll (PDO::FETCH_ASSOC);
@@ -468,7 +468,7 @@ class EntryDAO extends Model_pdo {
 	}
 
 	public function countNotReadByCat ($id) {
-		$sql = 'SELECT COUNT(*) AS count FROM entry e INNER JOIN feed f ON e.id_feed = f.id WHERE is_read=0 AND category = ?';
+		$sql = 'SELECT COUNT(*) AS count FROM ' . $this->prefix . 'entry e INNER JOIN  ' . $this->prefix . 'feed f ON e.id_feed = f.id WHERE is_read=0 AND category = ?';
 		$stm = $this->bd->prepare ($sql);
 		$stm->execute (array ($id));
 		$res = $stm->fetchAll (PDO::FETCH_ASSOC);
@@ -477,7 +477,7 @@ class EntryDAO extends Model_pdo {
 	}
 
 	public function countNotReadFavorites () {
-		$sql = 'SELECT COUNT(*) AS count FROM entry WHERE is_read=0 AND is_favorite=1';
+		$sql = 'SELECT COUNT(*) AS count FROM ' . $this->prefix . 'entry WHERE is_read=0 AND is_favorite=1';
 		$stm = $this->bd->prepare ($sql);
 		$stm->execute ();
 		$res = $stm->fetchAll (PDO::FETCH_ASSOC);
@@ -485,7 +485,7 @@ class EntryDAO extends Model_pdo {
 		return $res[0]['count'];
 	}
 	public function countFavorites () {
-		$sql = 'SELECT COUNT(*) AS count FROM entry WHERE is_favorite=1';
+		$sql = 'SELECT COUNT(*) AS count FROM ' . $this->prefix . 'entry WHERE is_favorite=1';
 		$stm = $this->bd->prepare ($sql);
 		$stm->execute ();
 		$res = $stm->fetchAll (PDO::FETCH_ASSOC);
@@ -494,7 +494,7 @@ class EntryDAO extends Model_pdo {
 	}
 
 	public function optimizeTable() {
-		$sql = 'OPTIMIZE TABLE entry';
+		$sql = 'OPTIMIZE TABLE ' . $this->prefix . 'entry';
 		$stm = $this->bd->prepare ($sql);
 		$stm->execute ();
 	}

+ 15 - 15
app/models/Feed.php

@@ -240,7 +240,7 @@ class Feed extends Model {
 
 class FeedDAO extends Model_pdo {
 	public function addFeed ($valuesTmp) {
-		$sql = 'INSERT INTO feed (id, url, category, name, website, description, lastUpdate, priority, httpAuth, error) VALUES(?, ?, ?, ?, ?, ?, ?, 10, ?, 0)';
+		$sql = 'INSERT INTO ' . $this->prefix . 'feed (id, url, category, name, website, description, lastUpdate, priority, httpAuth, error) VALUES(?, ?, ?, ?, ?, ?, ?, 10, ?, 0)';
 		$stm = $this->bd->prepare ($sql);
 
 		$values = array (
@@ -274,7 +274,7 @@ class FeedDAO extends Model_pdo {
 		}
 		$set = substr ($set, 0, -2);
 
-		$sql = 'UPDATE feed SET ' . $set . ' WHERE id=?';
+		$sql = 'UPDATE ' . $this->prefix . 'feed SET ' . $set . ' WHERE id=?';
 		$stm = $this->bd->prepare ($sql);
 
 		foreach ($valuesTmp as $v) {
@@ -292,7 +292,7 @@ class FeedDAO extends Model_pdo {
 	}
 
 	public function updateLastUpdate ($id) {
-		$sql = 'UPDATE feed SET lastUpdate=?, error=0 WHERE id=?';
+		$sql = 'UPDATE ' . $this->prefix . 'feed SET lastUpdate=?, error=0 WHERE id=?';
 		$stm = $this->bd->prepare ($sql);
 
 		$values = array (
@@ -310,7 +310,7 @@ class FeedDAO extends Model_pdo {
 	}
 
 	public function isInError ($id) {
-		$sql = 'UPDATE feed SET error=1 WHERE id=?';
+		$sql = 'UPDATE ' . $this->prefix . 'feed SET error=1 WHERE id=?';
 		$stm = $this->bd->prepare ($sql);
 
 		$values = array (
@@ -333,7 +333,7 @@ class FeedDAO extends Model_pdo {
 			$newCat = $catDAO->getDefault ();
 		}
 
-		$sql = 'UPDATE feed SET category=? WHERE category=?';
+		$sql = 'UPDATE ' . $this->prefix . 'feed SET category=? WHERE category=?';
 		$stm = $this->bd->prepare ($sql);
 
 		$values = array (
@@ -351,7 +351,7 @@ class FeedDAO extends Model_pdo {
 	}
 
 	public function deleteFeed ($id) {
-		$sql = 'DELETE FROM feed WHERE id=?';
+		$sql = 'DELETE FROM ' . $this->prefix . 'feed WHERE id=?';
 		$stm = $this->bd->prepare ($sql);
 
 		$values = array ($id);
@@ -365,7 +365,7 @@ class FeedDAO extends Model_pdo {
 		}
 	}
 	public function deleteFeedByCategory ($id) {
-		$sql = 'DELETE FROM feed WHERE category=?';
+		$sql = 'DELETE FROM ' . $this->prefix . 'feed WHERE category=?';
 		$stm = $this->bd->prepare ($sql);
 
 		$values = array ($id);
@@ -380,7 +380,7 @@ class FeedDAO extends Model_pdo {
 	}
 
 	public function searchById ($id) {
-		$sql = 'SELECT * FROM feed WHERE id=?';
+		$sql = 'SELECT * FROM ' . $this->prefix . 'feed WHERE id=?';
 		$stm = $this->bd->prepare ($sql);
 
 		$values = array ($id);
@@ -396,7 +396,7 @@ class FeedDAO extends Model_pdo {
 		}
 	}
 	public function searchByUrl ($url) {
-		$sql = 'SELECT * FROM feed WHERE url=?';
+		$sql = 'SELECT * FROM ' . $this->prefix . 'feed WHERE url=?';
 		$stm = $this->bd->prepare ($sql);
 
 		$values = array ($url);
@@ -413,7 +413,7 @@ class FeedDAO extends Model_pdo {
 	}
 
 	public function listFeeds () {
-		$sql = 'SELECT * FROM feed ORDER BY name';
+		$sql = 'SELECT * FROM ' . $this->prefix . 'feed ORDER BY name';
 		$stm = $this->bd->prepare ($sql);
 		$stm->execute ();
 
@@ -421,7 +421,7 @@ class FeedDAO extends Model_pdo {
 	}
 
 	public function listFeedsOrderUpdate () {
-		$sql = 'SELECT * FROM feed ORDER BY lastUpdate';
+		$sql = 'SELECT * FROM ' . $this->prefix . 'feed ORDER BY lastUpdate';
 		$stm = $this->bd->prepare ($sql);
 		$stm->execute ();
 
@@ -429,7 +429,7 @@ class FeedDAO extends Model_pdo {
 	}
 
 	public function listByCategory ($cat) {
-		$sql = 'SELECT * FROM feed WHERE category=? ORDER BY name';
+		$sql = 'SELECT * FROM ' . $this->prefix . 'feed WHERE category=? ORDER BY name';
 		$stm = $this->bd->prepare ($sql);
 
 		$values = array ($cat);
@@ -440,7 +440,7 @@ class FeedDAO extends Model_pdo {
 	}
 
 	public function count () {
-		$sql = 'SELECT COUNT(*) AS count FROM feed';
+		$sql = 'SELECT COUNT(*) AS count FROM ' . $this->prefix . 'feed';
 		$stm = $this->bd->prepare ($sql);
 		$stm->execute ();
 		$res = $stm->fetchAll (PDO::FETCH_ASSOC);
@@ -449,7 +449,7 @@ class FeedDAO extends Model_pdo {
 	}
 
 	public function countEntries ($id) {
-		$sql = 'SELECT COUNT(*) AS count FROM entry WHERE id_feed=?';
+		$sql = 'SELECT COUNT(*) AS count FROM ' . $this->prefix . 'entry WHERE id_feed=?';
 		$stm = $this->bd->prepare ($sql);
 		$values = array ($id);
 		$stm->execute ($values);
@@ -458,7 +458,7 @@ class FeedDAO extends Model_pdo {
 		return $res[0]['count'];
 	}
 	public function countNotRead ($id) {
-		$sql = 'SELECT COUNT(*) AS count FROM entry WHERE is_read=0 AND id_feed=?';
+		$sql = 'SELECT COUNT(*) AS count FROM ' . $this->prefix . 'entry WHERE is_read=0 AND id_feed=?';
 		$stm = $this->bd->prepare ($sql);
 		$values = array ($id);
 		$stm->execute ($values);

+ 1 - 1
lib/lib_phpQuery.php

@@ -514,7 +514,7 @@ class DOMDocumentWrapper {
 			.($xhtml ? '/' : '')
 			.'>';
 		if (strpos($html, '<head') === false) {
-			if (strpos($hltml, '<html') === false) {
+			if (strpos($html, '<html') === false) {
 				return $meta.$html;
 			} else {
 				return preg_replace(

+ 1 - 0
lib/minz/Configuration.php

@@ -221,6 +221,7 @@ class Configuration {
 			self::$db['user'] = $db['user'];
 			self::$db['password'] = $db['password'];
 			self::$db['base'] = $db['base'];
+			self::$db['prefix'] = isset ($db['prefix']) ? $db['prefix'] : '';
 		}
 	}
 

+ 4 - 0
lib/minz/dao/Model_pdo.php

@@ -13,6 +13,8 @@ class Model_pdo {
 	 * $bd variable représentant la base de données
 	 */
 	protected $bd;
+
+	protected $prefix;
 	
 	/**
 	 * Créé la connexion à la base de données à l'aide des variables
@@ -29,6 +31,8 @@ class Model_pdo {
 				$db['user'],
 				$db['password']
 			);
+
+			$this->prefix = $db['prefix'];
 		} catch (Exception $e) {
 			throw new PDOConnectionException (
 				$string,

+ 45 - 21
public/install.php

@@ -8,14 +8,14 @@ if (isset ($_GET['step'])) {
 	define ('STEP', 1);
 }
 
-define ('SQL_REQ', 'CREATE TABLE IF NOT EXISTS `category` (
+define ('SQL_REQ', 'CREATE TABLE IF NOT EXISTS `%scategory` (
   `id` varchar(6) NOT NULL,
   `name` varchar(255) NOT NULL,
   `color` varchar(7) NOT NULL,
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
-CREATE TABLE IF NOT EXISTS `entry` (
+CREATE TABLE IF NOT EXISTS `%sentry` (
   `id` varchar(6) NOT NULL,
   `guid` text NOT NULL,
   `title` varchar(255) NOT NULL,
@@ -34,7 +34,7 @@ CREATE TABLE IF NOT EXISTS `entry` (
   KEY `id_feed` (`id_feed`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
-CREATE TABLE IF NOT EXISTS `feed` (
+CREATE TABLE IF NOT EXISTS `%sfeed` (
   `id` varchar(6) NOT NULL,
   `url` text NOT NULL,
   `category` varchar(6) DEFAULT \'000000\',
@@ -50,10 +50,10 @@ CREATE TABLE IF NOT EXISTS `feed` (
   KEY `category` (`category`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
-ALTER TABLE `entry`
-  ADD CONSTRAINT `entry_ibfk_1` FOREIGN KEY (`id_feed`) REFERENCES `feed` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
-ALTER TABLE `feed`
-  ADD CONSTRAINT `feed_ibfk_4` FOREIGN KEY (`category`) REFERENCES `category` (`id`) ON DELETE SET NULL ON UPDATE CASCADE;');
+ALTER TABLE `%sentry`
+  ADD CONSTRAINT `entry_ibfk_1` FOREIGN KEY (`id_feed`) REFERENCES `%sfeed` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
+ALTER TABLE `%sfeed`
+  ADD CONSTRAINT `feed_ibfk_4` FOREIGN KEY (`category`) REFERENCES `%scategory` (`id`) ON DELETE SET NULL ON UPDATE CASCADE;');
 
 function writeLine ($f, $line) {
 	fwrite ($f, $line . "\n");
@@ -138,15 +138,15 @@ function saveStep2 () {
 			return false;
 		}
 
-		$_SESSION['sel'] = $_POST['sel'];
-		$_SESSION['base_url'] = $_POST['base_url'];
-		$_SESSION['title'] = $_POST['title'];
+		$_SESSION['sel'] = addslashes ($_POST['sel']);
+		$_SESSION['base_url'] = addslashes ($_POST['base_url']);
+		$_SESSION['title'] = addslashes ($_POST['title']);
 		$_SESSION['old_entries'] = $_POST['old_entries'];
 		if (!is_int (intval ($_SESSION['old_entries'])) ||
 		    $_SESSION['old_entries'] < 1) {
 			$_SESSION['old_entries'] = 3;
 		}
-		$_SESSION['mail_login'] = $_POST['mail_login'];
+		$_SESSION['mail_login'] = addslashes ($_POST['mail_login']);
 
 		$file_data = PUBLIC_PATH . '/data/Configuration.array.php';
 
@@ -172,10 +172,11 @@ function saveStep3 () {
 			$_SESSION['bd_error'] = true;
 		}
 
-		$_SESSION['bd_host'] = $_POST['host'];
-		$_SESSION['bd_user'] = $_POST['user'];
-		$_SESSION['bd_pass'] = $_POST['pass'];
-		$_SESSION['bd_name'] = $_POST['base'];
+		$_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_prefix'] = addslashes ($_POST['prefix']);
 
 		$file_conf = APP_PATH . '/configuration/application.ini';
 		$f = fopen ($file_conf, 'w');
@@ -190,6 +191,7 @@ function saveStep3 () {
 		writeLine ($f, 'user = "' . $_SESSION['bd_user'] . '"');
 		writeLine ($f, 'password = "' . $_SESSION['bd_pass'] . '"');
 		writeLine ($f, 'base = "' . $_SESSION['bd_name'] . '"');
+		writeLine ($f, 'prefix = "' . $_SESSION['bd_prefix'] . '"');
 		fclose ($f);
 
 		$res = checkBD ();
@@ -240,6 +242,7 @@ function checkStep1 () {
 	$minz = file_exists (LIB_PATH . '/minz');
 	$curl = extension_loaded ('curl');
 	$pdo = extension_loaded ('pdo_mysql');
+	$dom = class_exists('DOMDocument');
 	$cache = CACHE_PATH && is_writable (CACHE_PATH);
 	$log = LOG_PATH && is_writable (LOG_PATH);
 	$conf = APP_PATH && is_writable (APP_PATH . '/configuration');
@@ -250,11 +253,12 @@ function checkStep1 () {
 		'minz' => $minz ? 'ok' : 'ko',
 		'curl' => $curl ? 'ok' : 'ko',
 		'pdo-mysql' => $pdo ? 'ok' : 'ko',
+		'dom' => $dom ? 'ok' : 'ko',
 		'cache' => $cache ? 'ok' : 'ko',
 		'log' => $log ? 'ok' : 'ko',
 		'configuration' => $conf ? 'ok' : 'ko',
 		'data' => $data ? 'ok' : 'ko',
-		'all' => $php && $minz && $curl && $pdo && $cache && $log && $conf && $data ? 'ok' : 'ko'
+		'all' => $php && $minz && $curl && $pdo && $dom && $cache && $log && $conf && $data ? 'ok' : 'ko'
 	);
 }
 function checkStep2 () {
@@ -293,8 +297,17 @@ function checkBD () {
 		$c = new PDO ('mysql:host=' . $_SESSION['bd_host'] . ';dbname=' . $_SESSION['bd_name'],
 			      $_SESSION['bd_user'],
 			      $_SESSION['bd_pass']);
-
-		$res = $c->query (SQL_REQ);
+		$sql = sprintf (
+			SQL_REQ,
+			$_SESSION['bd_prefix'],
+                        $_SESSION['bd_prefix'],
+                        $_SESSION['bd_prefix'],
+                        $_SESSION['bd_prefix'],
+                        $_SESSION['bd_prefix'],
+                        $_SESSION['bd_prefix'],
+                        $_SESSION['bd_prefix']
+		);
+		$res = $c->query ($sql);
 
 		if (!$res) {
 			$error = true;
@@ -375,6 +388,12 @@ function printStep1 () {
 	<p class="alert alert-error"><span class="alert-head"><?php echo _t ('damn'); ?></span> <?php echo _t ('pdomysql_is_nok'); ?></p>
 	<?php } ?>
 
+	<?php if ($res['dom'] == 'ok') { ?>
+	<p class="alert alert-success"><span class="alert-head"><?php echo _t ('ok'); ?></span> <?php echo _t ('dom_is_ok'); ?></p>
+	<?php } else { ?>
+	<p class="alert alert-error"><span class="alert-head"><?php echo _t ('damn'); ?></span> <?php echo _t ('dom_is_nok'); ?></p>
+	<?php } ?>
+
 	<?php if ($res['cache'] == 'ok') { ?>
 	<p class="alert alert-success"><span class="alert-head"><?php echo _t ('ok'); ?></span> <?php echo _t ('cache_is_ok'); ?></p>
 	<?php } else { ?>
@@ -505,6 +524,13 @@ function printStep3 () {
 			</div>
 		</div>
 
+		<div class="form-group">
+			<label class="group-name" for="prefix"><?php echo _t ('prefix'); ?></label>
+			<div class="group-controls">
+				<input type="text" id="prefix" name="prefix" value="<?php echo isset ($_SESSION['bd_prefix']) ? $_SESSION['bd_prefix'] : 'freshrss_'; ?>" />
+			</div>
+		</div>
+
 		<div class="form-group form-actions">
 			<div class="group-controls">
 				<button type="submit" class="btn btn-important"><?php echo _t ('save'); ?></button>
@@ -561,9 +587,7 @@ case 5:
 		<meta charset="utf-8">
 		<meta name="viewport" content="initial-scale=1.0">
 		<title><?php echo _t ('freshrss_installation'); ?></title>
-		<link rel="stylesheet" type="text/css" media="all" href="theme/fallback.css" />
-		<link rel="stylesheet" type="text/css" media="all" href="theme/global.css" />
-		<link rel="stylesheet" type="text/css" media="all" href="theme/freshrss.css" />
+		<link rel="stylesheet" type="text/css" media="all" href="themes/default/style.css" />
 	</head>
 	<body>