Overview
Comment:Ne pas permettre l'import d'un fichier SQL où l'administrateur n'est plus administrateur pour éviter de se tirer une balle dans le pied
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk | stable
Files: files | file ages | folders
SHA1: 27c9ac2dd05d36e4b3f5765dfa3640eddf48403f
User & Date: bohwaz on 2016-12-04 21:56:25
Other Links: manifest | tags
References
2020-12-08
23:25 Wiki page "Changelog/0.9" artifact: b9c916b4d1 user: bohwaz
Context
2016-12-07
22:08
New release check-in: e683f5cefe user: bohwaz tags: trunk, stable, 0.7.6
2016-12-04
21:56
Ne pas permettre l'import d'un fichier SQL où l'administrateur n'est plus administrateur pour éviter de se tirer une balle dans le pied check-in: 27c9ac2dd0 user: bohwaz tags: trunk, stable
2016-11-29
09:14
Fix typo français check-in: c5d08ca357 user: bohwaz tags: trunk
Changes

Modified src/include/lib/Garradin/Sauvegarde.php from [5f91b166c3] to [4833dc42ef].

175
176
177
178
179
180
181
182

183
184
185
186
187
188
189

190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205

206
207
208
209
210
211
212
175
176
177
178
179
180
181

182
183
184
185
186
187
188

189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204

205
206
207
208
209
210
211
212







-
+






-
+















-
+







	}

	/**
	 * Restaure une copie distante (fichier envoyé)
	 * @param  array  $file Tableau provenant de $_FILES
	 * @return boolean true
	 */
	public function restoreFromUpload($file)
	public function restoreFromUpload($file, $user_id)
	{
		if (empty($file['size']) || empty($file['tmp_name']) || !empty($file['error']))
		{
			throw new UserException('Le fichier n\'a pas été correctement envoyé. Essayer de le renvoyer à nouveau.');
		}

		$r = $this->restoreDB($file['tmp_name']);
		$r = $this->restoreDB($file['tmp_name'], $user_id);

		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)
	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)
		{
227
228
229
230
231
232
233














234
235
236
237
238
239
240
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







+
+
+
+
+
+
+
+
+
+
+
+
+
+







		// 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\';');

		if (!$table)
		{
			throw new UserException('Le fichier fourni ne semble pas contenir de données liées à Garradin.');
		}

		if ($user_id)
		{
			// Empêchons l'admin de se tirer une balle dans le pied
			$is_still_admin = $db->querySingle('SELECT 1 FROM membres_categories 
				WHERE id = (SELECT id_categorie FROM membres WHERE id = ?)
				AND droit_config >= ' . Membres::DROIT_ADMIN . '
				AND droit_connexion >= ' . Membres::DROIT_ACCES);

			if (!$is_still_admin)
			{
				throw new UserException('Vous n\'êtes pas administrateur dans le fichier de sauvegarde fourni.');
			}
		}

		// On récupère la version pour plus tard
		$version = $db->querySingle('SELECT valeur FROM config WHERE cle=\'version\';');

		$db->close();

		$backup = str_replace('.sqlite', date('.Y-m-d-His') . '.avant_restauration.sqlite', DB_FILE);

Modified src/include/lib/Garradin/Utils.php from [8a553d4fe8] to [787abfba04].

576
577
578
579
580
581
582
583

584
585
586
587



588
589
590
591

592





593
594
595
596
597
598
599
576
577
578
579
580
581
582

583
584
585
586

587
588
589
590
591
592

593
594
595
596
597
598
599
600
601
602
603
604
605
606







-
+



-
+
+
+



-
+

+
+
+
+
+







        }

        return $out;
    }

    static public function getMaxUploadSize()
    {
        return min([
        $limits = [
            self::return_bytes(ini_get('upload_max_filesize')),
            self::return_bytes(ini_get('post_max_size')),
            self::return_bytes(ini_get('memory_limit'))
        ]);
        ];

        return min(array_filter($limits));
    }


    static public function return_bytes ($size_str)
    static public function return_bytes($size_str)
    {
        if ($size_str == '-1')
        {
            return false;
        }

        switch (substr($size_str, -1))
        {
            case 'G': case 'g': return (int)$size_str * pow(1024, 3);
            case 'M': case 'm': return (int)$size_str * pow(1024, 2);
            case 'K': case 'k': return (int)$size_str * 1024;
            default: return $size_str;
        }

Modified src/www/admin/config/donnees.php from [a856d32ebf] to [f33ac12b59].

93
94
95
96
97
98
99
100

101
102
103
104
105
106
107
93
94
95
96
97
98
99

100
101
102
103
104
105
106
107







-
+







    if (!Utils::CSRF_check('backup_restore'))
    {
        $error = 'Une erreur est survenue, merci de renvoyer le formulaire.';
    }
    else
    {
        try {
            $s->restoreFromUpload($_FILES['file']);
            $s->restoreFromUpload($_FILES['file'], $user['id']);
            Utils::redirect('/admin/config/donnees.php?ok=restore');
        } catch (UserException $e) {
            $error = $e->getMessage();
        }
    }
}