init
[garradin.git] / www / admin / install.php
1 <?php
2 namespace Garradin;
3
4 /*
5 * Tests : vérification que les conditions pour s'exécuter sont remplies
6 */
7
8 function test_requis($condition, $message)
9 {
10 if ($condition)
11 {
12 return true;
13 }
14
15 if (PHP_SAPI != 'cli')
16 {
17 header('Content-Type: text/html; charset=utf-8');
18 echo "<!DOCTYPE html>\n<html>\n<head>\n<title>Erreur</title>\n<meta charset=\"utf-8\" />\n";
19 echo '<style type="text/css">body { font-family: sans-serif; } ';
20 echo '.error { color: darkred; padding: .5em; margin: 1em; border: 3px double red; background: yellow; }</style>';
21 echo "\n</head>\n<body>\n<h2>Erreur</h2>\n<h3>Le problème suivant empêche Garradin de fonctionner :</h3>\n";
22 echo '<p class="error">' . htmlspecialchars($message, ENT_QUOTES, 'UTF-8') . '</p>';
23 echo '<hr /><p>Pour plus d\'informations consulter ';
24 echo '<a href="http://dev.kd2.org/garradin/Probl%C3%A8mes%20fr%C3%A9quents">l\'aide sur les problèmes à l\'installation</a>.</p>';
25 echo "\n</body>\n</html>";
26 }
27 else
28 {
29 echo "[ERREUR] Le problème suivant empêche Garradin de fonctionner :\n";
30 echo $message . "\n";
31 echo "Pour plus d'informations consulter http://dev.kd2.org/garradin/Probl%C3%A8mes%20fr%C3%A9quents\n";
32 }
33
34 exit;
35 }
36
37 test_requis(
38 version_compare(phpversion(), '5.4', '>='),
39 'PHP 5.4 ou supérieur requis. PHP version ' . phpversion() . ' installée.'
40 );
41
42 test_requis(
43 defined('CRYPT_BLOWFISH') && CRYPT_BLOWFISH,
44 'L\'algorithme de hashage de mot de passe Blowfish n\'est pas présent (pas installé ou pas compilé).'
45 );
46
47 test_requis(
48 class_exists('SQLite3'),
49 'Le module de base de données SQLite3 n\'est pas disponible.'
50 );
51
52 $v = \SQLite3::version();
53
54 test_requis(
55 version_compare($v['versionString'], '3.7.4', '>='),
56 'SQLite3 version 3.7.4 ou supérieur requise. Version installée : ' . $v['versionString']
57 );
58
59 test_requis(
60 file_exists(__DIR__ . '/../../include/libs/template_lite/class.template.php'),
61 'Librairie Template_Lite non disponible.'
62 );
63
64 const INSTALL_PROCESS = true;
65
66 require_once __DIR__ . '/../../include/init.php';
67
68 // Vérifier que les répertoires vides existent, sinon les créer
69 $paths = [DATA_ROOT . '/cache', DATA_ROOT . '/cache/static', DATA_ROOT . '/cache/compiled'];
70
71 foreach ($paths as $path)
72 {
73 if (!file_exists($path))
74 mkdir($path);
75
76 test_requis(
77 file_exists($path) && is_dir($path),
78 'Le répertoire '.$path.' n\'existe pas ou n\'est pas un répertoire.'
79 );
80
81 // On en profite pour vérifier qu'on peut y lire et écrire
82 test_requis(
83 is_writable($path) && is_readable($path),
84 'Le répertoire '.$path.' n\'est pas accessible en lecture/écriture.'
85 );
86 }
87
88 if (!file_exists(DB_FILE))
89 {
90 // Renommage du fichier sqlite à la version 0.5.0
91 $old_file = str_replace('.sqlite', '.db', DB_FILE);
92
93 if (file_exists($old_file))
94 {
95 rename($old_file, DB_FILE);
96 utils::redirect('/admin/upgrade.php');
97 }
98 }
99
100 $tpl = Template::getInstance();
101
102 $tpl->assign('admin_url', WWW_URL . 'admin/');
103
104 if (file_exists(DB_FILE))
105 {
106 $tpl->assign('disabled', true);
107 }
108 else
109 {
110 $tpl->assign('disabled', false);
111 $error = false;
112
113 if (!empty($_POST['save']))
114 {
115 if (!utils::CSRF_check('install'))
116 {
117 $error = 'Une erreur est survenue, merci de renvoyer le formulaire.';
118 }
119 elseif (utils::post('passe_membre') != utils::post('repasse_membre'))
120 {
121 $error = 'La vérification ne correspond pas au mot de passe.';
122 }
123 else
124 {
125 try {
126 $db = DB::getInstance(true);
127
128 // Création de la base de données
129 $db->exec('BEGIN;');
130 $db->exec(file_get_contents(DB_SCHEMA));
131 $db->exec('END;');
132
133 // Configuration de base
134 $config = Config::getInstance();
135 $config->set('nom_asso', utils::post('nom_asso'));
136 $config->set('adresse_asso', utils::post('adresse_asso'));
137 $config->set('email_asso', utils::post('email_asso'));
138 $config->set('site_asso', WWW_URL);
139 $config->set('monnaie', '€');
140 $config->set('pays', 'FR');
141 $config->set('email_envoi_automatique', utils::post('email_asso'));
142 $config->setVersion(garradin_version());
143
144 $champs = Champs_Membres::importInstall();
145 $champs->save(false); // Pas de copie car pas de table membres existante
146
147 $config->set('champ_identifiant', 'email');
148 $config->set('champ_identite', 'nom');
149
150 // Création catégories
151 $cats = new Membres_Categories;
152 $id = $cats->add([
153 'nom' => 'Membres actifs',
154 ]);
155 $config->set('categorie_membres', $id);
156
157 $id = $cats->add([
158 'nom' => 'Anciens membres',
159 'droit_inscription' => Membres::DROIT_AUCUN,
160 'droit_wiki' => Membres::DROIT_AUCUN,
161 'droit_membres' => Membres::DROIT_AUCUN,
162 'droit_compta' => Membres::DROIT_AUCUN,
163 'droit_config' => Membres::DROIT_AUCUN,
164 'droit_connexion' => Membres::DROIT_AUCUN,
165 'cacher' => 1,
166 ]);
167
168 $id = $cats->add([
169 'nom' => ucfirst(utils::post('cat_membre')),
170 'droit_inscription' => Membres::DROIT_AUCUN,
171 'droit_wiki' => Membres::DROIT_ADMIN,
172 'droit_membres' => Membres::DROIT_ADMIN,
173 'droit_compta' => Membres::DROIT_ADMIN,
174 'droit_config' => Membres::DROIT_ADMIN,
175 ]);
176
177 // Création premier membre
178 $membres = new Membres;
179 $id_membre = $membres->add([
180 'id_categorie' => $id,
181 'nom' => utils::post('nom_membre'),
182 'email' => utils::post('email_membre'),
183 'passe' => utils::post('passe_membre'),
184 'pays' => 'FR',
185 ]);
186
187 // Création wiki
188 $page = Wiki::transformTitleToURI(utils::post('nom_asso'));
189 $config->set('accueil_wiki', $page);
190 $wiki = new Wiki;
191 $id_page = $wiki->create([
192 'titre' => utils::post('nom_asso'),
193 'uri' => $page,
194 ]);
195
196 $wiki->editRevision($id_page, 0, [
197 'id_auteur' => $id_membre,
198 'contenu' => "Bienvenue dans le wiki de ".utils::post('nom_asso')." !\n\nCliquez sur le bouton « éditer » pour modifier cette page.",
199 ]);
200
201 // Création page wiki connexion
202 $page = Wiki::transformTitleToURI('Bienvenue');
203 $config->set('accueil_connexion', $page);
204 $id_page = $wiki->create([
205 'titre' => 'Bienvenue',
206 'uri' => $page,
207 ]);
208
209 $wiki->editRevision($id_page, 0, [
210 'id_auteur' => $id_membre,
211 'contenu' => "Bienvenue dans l'administration de ".utils::post('nom_asso')." !\n\n"
212 . "Utilisez le menu à gauche pour accéder aux différentes rubriques.",
213 ]);
214
215 // Mise en place compta
216 $comptes = new Compta_Comptes;
217 $comptes->importPlan();
218
219 $comptes = new Compta_Categories;
220 $comptes->importCategories();
221
222 $ex = new Compta_Exercices;
223 $ex->add([
224 'libelle' => 'Premier exercice',
225 'debut' => date('Y-01-01'),
226 'fin' => date('Y-12-31')
227 ]);
228
229 $config->save();
230
231 utils::redirect('/admin/login.php');
232 }
233 catch (UserException $e)
234 {
235 @unlink(DB_FILE);
236
237 $error = $e->getMessage();
238 }
239 }
240 }
241
242 $tpl->assign('error', $error);
243 }
244
245 $tpl->assign('passphrase', utils::suggestPassword());
246 $tpl->display('admin/install.tpl');