Index: src/include/lib/Garradin/Sauvegarde.php ================================================================== --- src/include/lib/Garradin/Sauvegarde.php +++ src/include/lib/Garradin/Sauvegarde.php @@ -225,11 +225,11 @@ { throw new UserException('Le fichier fourni a été modifié par un programme externe.', self::INTEGRITY_FAIL); } } - $r = $this->restoreDB($file['tmp_name'], $user_id); + $r = $this->restoreDB($file['tmp_name'], $user_id, true); if ($r) { Utils::safe_unlink($file['tmp_name']); } @@ -287,17 +287,17 @@ * Restauration de base de données, la fonction qui le fait vraiment * @param string $file Chemin absolu vers la base de données à utiliser * @return mixed true si rien ne va plus, ou self::NEED_UPGRADE si la version de la DB * ne correspond pas à la version de Garradin (mise à jour nécessaire). */ - protected function restoreDB($file, $user_id = false) + protected function restoreDB($file, $user_id = false, $check_foreign_keys = false) { $return = 1; // Essayons déjà d'ouvrir la base de données à restaurer en lecture try { - $db = new \SQLite3($file, SQLITE3_OPEN_READONLY); + $db = new \SQLite3($file, \SQLITE3_OPEN_READONLY); } catch (\Exception $e) { throw new UserException('Le fichier fourni n\'est pas une base de données valide. ' . 'Message d\'erreur de SQLite : ' . $e->getMessage(), self::NOT_A_DB); @@ -316,10 +316,20 @@ if (strtolower(trim($check)) != 'ok') { throw new UserException('Le fichier fourni est corrompu. SQLite a trouvé ' . $check . ' erreurs.'); } + + if ($check_foreign_keys) + { + $check = $db->querySingle('PRAGMA foreign_key_check;'); + + if ($check) + { + throw new UserException('Le fichier fourni est corrompu. Certaines clés étrangères référencent des lignes qui n\'existent pas.'); + } + } // On ne peut pas faire de vérifications très poussées sur la structure de la base de données, // celle-ci pouvant changer d'une version à l'autre et on peut vouloir importer une base // un peu vieille, mais on vérifie quand même que ça ressemble un minimum à une base garradin $table = $db->querySingle('SELECT 1 FROM sqlite_master WHERE type=\'table\' AND tbl_name=\'config\';');