Overview
Comment: | Fix database reset |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk | stable |
Files: | files | file ages | folders |
SHA3-256: |
6844b8190ef8c74c9d8812d04007a364 |
User & Date: | bohwaz on 2022-01-28 01:13:43 |
Other Links: | manifest | tags |
Context
2022-01-28
| ||
12:09 | Try to fix undefined constant in install reset check-in: 9b05a3c422 user: bohwaz tags: trunk | |
01:13 | Fix database reset check-in: 6844b8190e user: bohwaz tags: trunk, stable | |
2022-01-27
| ||
19:16 | Fix list of mandatory CSV columns in CSV help check-in: e866ced787 user: bohwaz tags: trunk, stable | |
Changes
Modified src/include/lib/Garradin/DB.php from [9f8f9d6d3b] to [4e240a6ef3].
︙ | ︙ | |||
14 15 16 17 18 19 20 | static protected $_instance = null; protected $_version = -1; static protected $unicode_patterns_cache = []; | | > > > > > | 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | static protected $_instance = null; protected $_version = -1; static protected $unicode_patterns_cache = []; static public function getInstance() { if (null === self::$_instance) { self::$_instance = new DB('sqlite', ['file' => DB_FILE]); } return self::$_instance; } static public function deleteInstance() { self::$_instance = null; } private function __clone() { // Désactiver le clonage, car on ne veut qu'une seule instance } public function connect(): void |
︙ | ︙ |
Modified src/include/lib/Garradin/Install.php from [a878545951] to [baa9cd6767].
︙ | ︙ | |||
11 12 13 14 15 16 17 | /** * Pour procéder à l'installation de l'instance Garradin * Utile pour automatiser l'installation sans passer par la page d'installation */ class Install { | > > > | > | > > > > > > | > > > > > > > > > > > > > > > > > > > > | | > | | | > > > | 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 | /** * Pour procéder à l'installation de l'instance Garradin * Utile pour automatiser l'installation sans passer par la page d'installation */ class Install { /** * Reset the database to empty and create a new user with the same password */ static public function reset(Session $session, string $password, array $options = []) { $config = (object) Config::getInstance()->asArray(); $user = $session->getUser(); if (!$session->checkPassword($password, $user->passe)) { throw new UserException('Le mot de passe ne correspond pas.'); } (new Sauvegarde)->create(date('Y-m-d-His-') . 'avant-remise-a-zero'); Config::deleteInstance(); DB::getInstance()->close(); DB::deleteInstance(); file_put_contents(CACHE_ROOT . '/reset', json_encode([ 'password' => $session::hashPassword($password), 'name' => $user->identite, 'email' => $user->email, 'organization' => $config->nom_asso, ])); rename(DB_FILE, sprintf(DATA_ROOT . '/association.%s.sqlite', date('Y-m-d-His-') . 'avant-remise-a-zero')); self::showProgressSpinner('!install.php', 'Remise à zéro en cours…'); exit; } /** * Continues reset after page reload */ static public function checkReset() { if (!file_exists(CACHE_ROOT . '/reset')) { return; } $data = json_decode(file_get_contents(CACHE_ROOT . '/reset')); if (!$data) { throw new \LogicException('Invalid reset data'); } // We can't use the real password, as it might not be valid (too short or compromised) $ok = self::install($data->organization, $data->name, $data->email, md5($data->password)); // Restore password DB::getInstance()->preparedQuery('UPDATE membres SET passe = ? WHERE id = 1;', [$data->password]); if ($ok) { // Force l'installation de plugin système Plugin::checkAndInstallSystemPlugins(); } if (!LOCAL_LOGIN) { Session::getInstance()->refresh(); } @unlink(CACHE_ROOT . '/reset'); Utils::redirect('!config/advanced/?msg=RESET'); } static protected function assert(bool $assertion, string $message) { if (!$assertion) { throw new ValidationException($message); } |
︙ | ︙ | |||
77 78 79 80 81 82 83 | } catch (\Exception $e) { @unlink(DB_FILE); throw $e; } } | | > > > > | | 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 | } catch (\Exception $e) { @unlink(DB_FILE); throw $e; } } static public function install(string $name, string $user_name, string $user_email, string $user_password, ?string $welcome_text = null): void { if (file_exists(DB_FILE)) { throw new UserException('La base de données existe déjà.'); } self::checkAndCreateDirectories(); $db = DB::getInstance(); // Création de la base de données $db->begin(); $db->exec('PRAGMA application_id = ' . DB::APPID . ';'); $db->setVersion(garradin_version()); $db->exec(file_get_contents(DB_SCHEMA)); $db->commit(); |
︙ | ︙ | |||
226 227 228 229 230 231 232 | // Install welcome plugin if available $has_welcome_plugin = Plugin::getPath('welcome', false); if ($has_welcome_plugin) { Plugin::install('welcome', true); } | | | 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 | // Install welcome plugin if available $has_welcome_plugin = Plugin::getPath('welcome', false); if ($has_welcome_plugin) { Plugin::install('welcome', true); } $config->save(); } static public function checkAndCreateDirectories() { // Vérifier que les répertoires vides existent, sinon les créer $paths = [ DATA_ROOT, |
︙ | ︙ | |||
293 294 295 296 297 298 299 | $config = '<?php' . PHP_EOL . 'namespace Garradin;' . PHP_EOL . PHP_EOL . $new_line . PHP_EOL; } return file_put_contents($path, $config); } | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 | $config = '<?php' . PHP_EOL . 'namespace Garradin;' . PHP_EOL . PHP_EOL . $new_line . PHP_EOL; } return file_put_contents($path, $config); } static public function showProgressSpinner(?string $next = null, string $message = '') { $next = $next ? sprintf('<meta http-equiv="refresh" content="0;url=%s" />', Utils::getLocalURL($next)) : ''; printf('<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <style type="text/css"> body { font-family: sans-serif; } h2, p { margin: 0; margin-bottom: 1rem; } div { position: relative; border: 1px solid #999; max-width: 500px; padding: 1em; border-radius: .5em; } .spinner h2::after { display: block; content: " "; margin: 1rem auto; width: 50px; height: 50px; border: 5px solid #000; border-radius: 50%%; border-top-color: #999; animation: spin 1s ease-in-out infinite; } @keyframes spin { to { transform: rotate(360deg); } } </style> %s </head> <body> <div class="spinner"> <h2>%s</h2> </div>', $next, htmlspecialchars($message)); } } |
Modified src/www/admin/config/advanced/index.php from [391415153c] to [a26a70916a].
1 2 3 4 5 6 7 8 9 10 11 12 | <?php namespace Garradin; use Garradin\Accounting\Years; use Garradin\Files\Files; require_once __DIR__ . '/../_inc.php'; $quota_used = Files::getUsedQuota(true); $form->runIf('reset_ok', function () use ($session) { Install::reset($session, f('passe_verif')); | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <?php namespace Garradin; use Garradin\Accounting\Years; use Garradin\Files\Files; require_once __DIR__ . '/../_inc.php'; $quota_used = Files::getUsedQuota(true); $form->runIf('reset_ok', function () use ($session) { Install::reset($session, f('passe_verif')); }, 'reset'); $form->runIf('reopen_ok', function () use ($session) { $year = Years::get((int) f('year')); $year->reopen($session->getUser()->id); }, 'reopen_year', Utils::getSelfURI(['msg' => 'REOPEN'])); if (FILE_STORAGE_BACKEND !== 'SQLite' && ENABLE_TECH_DETAILS) { |
︙ | ︙ |
Modified src/www/admin/install.php from [f605686443] to [76f9b18d41].
︙ | ︙ | |||
11 12 13 14 15 16 17 18 19 20 21 22 23 24 | if (file_exists(DB_FILE)) { throw new UserException('Garradin est déjà installé'); } try { Install::checkAndCreateDirectories(); } catch (UserException $e) { echo $e->getMessage(); exit; } function f($key) | > | 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | if (file_exists(DB_FILE)) { throw new UserException('Garradin est déjà installé'); } try { Install::checkAndCreateDirectories(); Install::checkReset(); } catch (UserException $e) { echo $e->getMessage(); exit; } function f($key) |
︙ | ︙ |