Overview
Comment:Vérification de signature à l'import de DB
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | dev
Files: files | file ages | folders
SHA1: 4066ce8971be0d559640054c94fd0b44aaef0d50
User & Date: bohwaz on 2017-05-04 07:37:58
Other Links: branch diff | manifest | tags
Context
2017-05-04
07:38
Modernisation/corrections du code check-in: abedb2727c user: bohwaz tags: dev
07:37
Vérification de signature à l'import de DB check-in: 4066ce8971 user: bohwaz tags: dev
2017-05-03
07:24
Modernisation de Plugin.php check-in: 7fb77dba15 user: bohwaz tags: dev
Changes

Modified src/include/lib/Garradin/Sauvegarde.php from [050c3688bc] to [c9ec5ef48e].

1
2
3
4
5
6
7

8
9
10
11
12
13
14
<?php

namespace Garradin;

class Sauvegarde
{
	const NEED_UPGRADE = 'nu';


	/**
	 * Renvoie la liste des fichiers SQLite sauvegardés
	 * @param  boolean $auto Si true ne renvoie que la liste des sauvegardes automatiques
	 * @return array 		 Liste des fichiers
	 */	
	public function getList($auto = false)







>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php

namespace Garradin;

class Sauvegarde
{
	const NEED_UPGRADE = 'nu';
	const INTEGRITY_FAIL = 'if';

	/**
	 * Renvoie la liste des fichiers SQLite sauvegardés
	 * @param  boolean $auto Si true ne renvoie que la liste des sauvegardes automatiques
	 * @return array 		 Liste des fichiers
	 */	
	public function getList($auto = false)
191
192
193
194
195
196
197
198
199



























































200
201
202
203
204
205
206














207
208
209
210
211
212
213
		if ($r)
		{
			unlink($file['tmp_name']);
		}

		return $r;
	}

	/**



























































	 * 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)
	{














		// Essayons déjà d'ouvrir la base de données à restaurer en lecture
		try {
			$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. ' .









>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>





|

>
>
>
>
>
>
>
>
>
>
>
>
>
>







192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
		if ($r)
		{
			unlink($file['tmp_name']);
		}

		return $r;
	}

	/**
	 * Vérifie l'intégrité d'une sauvegarde Garradin
	 * @param  string $file Chemin absolu vers la base de donnée
	 * @return boolean
	 */
	protected function checkIntegrity($file_path, $remove_hash = true)
	{
		$size = filesize($file_path);
		$fp = fopen($file_path, 'r');

		$header = fread($fp, 16);

		// Vérifie que le fichier est bien une base SQLite3
		if ($header !== "SQLite format 3\000")
		{
			fclose($fp);
			return null;
		}

		fseek($fp, -40, SEEK_END);

		$hash = fread($fp, 40);

		// Ne ressemble pas à un hash sha1
		if (!preg_match('/[a-f0-9]{40}/', $hash))
		{
			fclose($fp);
			return false;
		}

		fseek($fp, 0);

		$content = '';
		$max = $size - 40;

		while (!feof($fp) && strlen($file) < $max)
		{
			$content .= fread($fp, 4096);
		}

		fclose($fp);

		$file_hash = sha1($content);

		// Vérification du hash
		if ($file_hash === $hash)
		{
			// Suppression du hash
			if ($remove_hash)
			{
				file_put_contents($file_path, $content);
			}

			return true;
		}

		return false;
	}

	/**
	 * 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, $check_integrity = true)
	{
		if ($check_integrity)
		{
			$integrity = $this->checkIntegrity($file);

			if ($integrity === null)
			{
				throw new UserException('Le fichier fourni n\'est pas une base de donnée SQLite3.');
			}
			elseif ($integrity === false)
			{
				return self::INTEGRITY_FAIL;
			}
		}

		// Essayons déjà d'ouvrir la base de données à restaurer en lecture
		try {
			$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. ' .