serveur / tools.php @ b89cf210
Historique | Voir | Annoter | Télécharger (13 ko)
1 |
<?php
|
---|---|
2 |
/** **********************************************************************************
|
3 |
*
|
4 |
* Projet ClicAlbum - Licence: GNU/Affero GPL v3 ou +
|
5 |
*
|
6 |
* (c) 2020 Éric Seigne <eric.seigne@cap-rel.fr>
|
7 |
*
|
8 |
* This file is part of ClicAlbum.
|
9 |
*
|
10 |
* ClicAlbum is free software: you can redistribute it and/or modify
|
11 |
* it under the terms of the GNU General Public License as published by
|
12 |
* the Free Software Foundation, either version 3 of the License, or
|
13 |
* (at your option) any later version.
|
14 |
*
|
15 |
* ClicAlbum is distributed in the hope that it will be useful,
|
16 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
17 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
18 |
* GNU General Public License for more details.
|
19 |
*
|
20 |
* You should have received a copy of the GNU General Public License
|
21 |
* along with ClicAlbum. If not, see <https://www.gnu.org/licenses/>.
|
22 |
*
|
23 |
* ***********************************************************************************/
|
24 |
|
25 |
require_once("config.php"); |
26 |
|
27 |
function myDebug($message) |
28 |
{ |
29 |
global $config_log; |
30 |
fwrite($config_log, $message . "\n"); |
31 |
} |
32 |
|
33 |
function filter_post_field($f) |
34 |
{ |
35 |
global $_POST; |
36 |
//en v2 on base64encode au départ
|
37 |
if (isset($_POST['version']) && $_POST['version'] == "2") { |
38 |
$t = base64_decode($f); |
39 |
// myDebug("on essaye de faire un translit sur $t");
|
40 |
$r = iconv("UTF-8", "ASCII//TRANSLIT", $t); |
41 |
// myDebug(" ce qui donne $r...");
|
42 |
} else {
|
43 |
$r = $f; |
44 |
} |
45 |
return slugify(trim($r)); |
46 |
} |
47 |
|
48 |
function ext($filename) |
49 |
{ |
50 |
return substr(strrchr($filename, '.'), 1); |
51 |
} |
52 |
|
53 |
//input : 20200323-clavier-c7187-ClicAlbum.pdf
|
54 |
//output : clavier.pdf
|
55 |
function cleanupFileName($name) |
56 |
{ |
57 |
$txt = preg_replace("/(\d+)-(\w+)-(\w+)-(ClicAlbum)/i", "$2", $name); |
58 |
return $txt; |
59 |
} |
60 |
|
61 |
function slugify($text) |
62 |
{ |
63 |
// replace non letter or digits by -
|
64 |
$text = preg_replace('~[^\pL\d]+~u', '_', $text); |
65 |
|
66 |
// transliterate
|
67 |
$text = iconv('utf-8', 'us-ascii//TRANSLIT', $text); |
68 |
|
69 |
// remove unwanted characters
|
70 |
$text = preg_replace('~[^-\w]+~', '', $text); |
71 |
|
72 |
// trim
|
73 |
$text = trim($text, '_'); |
74 |
|
75 |
// remove duplicate -
|
76 |
$text = preg_replace('~-+~', '_', $text); |
77 |
|
78 |
// lowercase
|
79 |
$text = strtolower($text); |
80 |
|
81 |
if (empty($text)) { |
82 |
return ''; |
83 |
} |
84 |
|
85 |
return $text; |
86 |
} |
87 |
|
88 |
function set_albumInfo($name, $adminMail, $albumPassAdmin, $albumPass = "") |
89 |
{ |
90 |
global $config_data; |
91 |
myDebug("set albumInfo $name");
|
92 |
|
93 |
$tab['adminMail'] = $adminMail; |
94 |
if ($albumPass != "") { |
95 |
$tab['albumPass'] = password_hash($albumPass, PASSWORD_DEFAULT); |
96 |
} else {
|
97 |
$tab['albumPass'] = ""; |
98 |
} |
99 |
if ($albumPassAdmin != "") { |
100 |
$tab['albumPassAdmin'] = password_hash($albumPassAdmin, PASSWORD_DEFAULT); |
101 |
} else {
|
102 |
$tab['albumPassAdmin'] = ""; |
103 |
} |
104 |
|
105 |
$dir = $config_data . "/" . $name; |
106 |
//Si le rep n'existe pas on le créé
|
107 |
if (!is_dir($dir)) { |
108 |
myDebug(" creation de $dir");
|
109 |
mkdir($dir, 0700); |
110 |
} |
111 |
if (is_dir($dir) && $dir != $config_data) { |
112 |
myDebug(" creation du fichier $dir/albuminfo");
|
113 |
file_put_contents($dir . "/albuminfo", serialize($tab)); |
114 |
return true; |
115 |
} |
116 |
return false; |
117 |
} |
118 |
|
119 |
function get_albumInfo($name) |
120 |
{ |
121 |
global $config_data; |
122 |
|
123 |
$dir = $config_data . "/" . $name; |
124 |
if (is_dir($dir) && $dir != $config_data && is_file($dir . "/albuminfo")) { |
125 |
return unserialize(file_get_contents($dir . "/albuminfo")); |
126 |
} else {
|
127 |
return false; |
128 |
} |
129 |
} |
130 |
|
131 |
|
132 |
function set_userInfo($name, $userArray) |
133 |
{ |
134 |
global $config_data; |
135 |
$dir = $config_data . "/" . $name; |
136 |
//Si le rep n'existe pas on le créé
|
137 |
if (!is_dir($dir)) { |
138 |
mkdir($dir, 0700); |
139 |
} |
140 |
if (is_dir($dir) && $dir != $config_data) { |
141 |
file_put_contents($dir . "/userinfo", serialize($userArray)); |
142 |
} |
143 |
} |
144 |
|
145 |
function get_userInfo($name) |
146 |
{ |
147 |
global $config_data; |
148 |
$dir = $config_data . "/" . $name; |
149 |
if (is_dir($dir) && $dir != $config_data) { |
150 |
return unserialize(file_get_contents($dir . "/userinfo")); |
151 |
} else {
|
152 |
return false; |
153 |
} |
154 |
} |
155 |
|
156 |
function html_head($title = "AbulÉdu AlbumPhoto") |
157 |
{ |
158 |
return "<!doctype html> |
159 |
<html lang=\"fr\">
|
160 |
<head>
|
161 |
<meta charset=\"utf-8\">
|
162 |
<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">
|
163 |
<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">
|
164 |
<link href=\"/bootstrap/css/bootstrap.min.css\" rel=\"stylesheet\">
|
165 |
<link href=\"/bootstrap/css/print.css\" rel=\"stylesheet\">
|
166 |
<script src=\"/bootstrap/js/jquery.slim.min.js\"></script>
|
167 |
<script src=\"/bootstrap/js/bootstrap.bundle.min.js\"></script>
|
168 |
<title>$title</title>
|
169 |
<link rel=\"stylesheet\" type=\"text/css\" href=\"/ouistiti.css\">
|
170 |
</head>
|
171 |
|
172 |
<body class=\"d-flex flex-column h-100\">
|
173 |
<nav class=\"navbar fixed-top navbar-expand-md\">
|
174 |
<div class=\"container\">
|
175 |
<a class=\"navbar-brand\" href=\"https://clicalbum.abuledu.net/\"></a>
|
176 |
<button class=\"navbar-toggler mt-2 mt-md-0\" type=\"button\" data-toggle=\"collapse\" data-target=\"#navbarCollapse\" aria-controls=\"navbarCollapse\" aria-expanded=\"false\" aria-label=\"Menu\">
|
177 |
<span class=\"navbar-toggler-icon\">Menu</span>
|
178 |
</button>
|
179 |
<div class=\"collapse navbar-collapse\" id=\"navbarCollapse\">
|
180 |
<ul class=\"navbar-nav mr-auto\">
|
181 |
<!-- <li class=\"nav-item\"><a class=\"nav-link\" href=\"/\" class=\"nav-link\">Consulter un album</a></li> -->
|
182 |
<li class=\"nav-item\"><a class=\"nav-link\" href=\"/admin.php\" class=\"nav-link\">Gérer votre album</a></li>
|
183 |
<li class=\"nav-item\"><a class=\"nav-link\" href=\"/download.php\" class=\"nav-link\">Téléchargement</a></li>
|
184 |
<li class=\"nav-item\"><a class=\"nav-link\" href=\"/about.php\" class=\"nav-link\">À propos</a></li>
|
185 |
</ul>
|
186 |
<div class=\"nav-item dropdown\">
|
187 |
<a href=\"#\" id=\"navbarDropdownMenuLink\" class=\"nav-link dropdown-toggle\" data-toggle=\"dropdown\" role=\"button\" aria-haspopup=\"true\" aria-expanded=\"false\">Menu<span class=\"caret\"></span></a>
|
188 |
<div class=\"dropdown-menu\" aria-labelledby=\"navbarDropdownMenuLink\">
|
189 |
<ul>
|
190 |
<li><a class=\"dropdown-item\" href=\"https://abuledu-fr.org/\">Retourner sur le site de l'association</a></li>
|
191 |
</ul>
|
192 |
</div>
|
193 |
</div>
|
194 |
</ul>
|
195 |
</div>
|
196 |
</div>
|
197 |
</nav>
|
198 |
<main role=\"main\" class=\"flex-shrink-0\">
|
199 |
<div class=\"container\">
|
200 |
<div class=\"jumbotron\">
|
201 |
";
|
202 |
} |
203 |
|
204 |
function html_tail() |
205 |
{ |
206 |
return " </div> |
207 |
</div>
|
208 |
</main>
|
209 |
<footer class=\"footer mt-auto py-3\">
|
210 |
<p class=\"text-muted\" style=\"text-align: center\">
|
211 |
Ce site est animé par des logiciels libres, tous les détails techniques sont visibles ici : <a href=\"http://redmine.abuledu.org/projects/abuledu-clicalbum\">ClicAlbum</a> (Application sous GNU/GPL et GNU/Affero GPL pour le service web)<br />
|
212 |
Pas de pubs, pas d'analyse de vos données, simple net et sans bavures ... aux antipodes des GAFAM qui s'abreuvent de vos données ...<br />
|
213 |
Une idée d'amélioration - Une envie de dire bonjour - <a href=\"https://abuledu-fr.org/comment-nous-contacter/\">Envoyez nous un petit message :-)</a><br />
|
214 |
<a href=\"/cgu.md\">Conditions Générales d'Utilisations</a> | <a href=\"https://abuledu-fr.org/mentions-legales/\">Mentions Légales</a>
|
215 |
</p>
|
216 |
</footer>
|
217 |
</body>
|
218 |
</html>
|
219 |
";
|
220 |
} |
221 |
|
222 |
|
223 |
function extractAuteur($str) |
224 |
{ |
225 |
$t = explode("-", $str); |
226 |
return $t[1]; |
227 |
} |
228 |
|
229 |
function extractLabel($str) |
230 |
{ |
231 |
$t = explode("-", $str); |
232 |
return str_replace("_", " ", $t[2]); |
233 |
} |
234 |
|
235 |
//Affiche l'album photo
|
236 |
function display_pictures($fichiers, $dir, $is_admin = false) |
237 |
{ |
238 |
global $config_data; |
239 |
global $config_fileTypeOK; |
240 |
|
241 |
if (!is_array($fichiers)) |
242 |
return;
|
243 |
|
244 |
myDebug("display_pictures pour $dir");
|
245 |
$r = " <div class=\"card-columns\">\n"; |
246 |
foreach ($fichiers as $fichier) { |
247 |
$fileExt =
|
248 |
$fullFileName = $config_data . "/" . $dir . "/" . $fichier; |
249 |
myDebug(" on essaye $fullFileName");
|
250 |
if (is_file($fullFileName) && in_array(ext($fichier), $config_fileTypeOK)) { |
251 |
$ficAuteur = extractAuteur($fichier); |
252 |
$ficLabel = extractLabel($fichier); |
253 |
myDebug(" -> ok pour /$dir/$fichier");
|
254 |
// print "<img src=\"$fichier\">";
|
255 |
|
256 |
//L'admin a une option pour supprimer l'image
|
257 |
if ($is_admin) { |
258 |
$a = "<a href=\"admin.php?op=delete&id=" . base64_encode(xor_this($fichier)) . "\">Supprimer</a>"; |
259 |
} |
260 |
|
261 |
$r .= " |
262 |
<div class=\"card\">
|
263 |
<a href=\"/$dir/$fichier\" class=\"d-block mb-4 h-100\"><img class=\"card-img-top img-thumbnail\" src=\"/$dir/$fichier\" alt=\"\"></a>
|
264 |
<div class=\"card-body text-center\">
|
265 |
<h5 class=\"card-title\">Auteur: $ficAuteur</h5>
|
266 |
<p class=\"card-text\">Nom: $ficLabel - $a</p>
|
267 |
</div>
|
268 |
</div>\n";
|
269 |
} |
270 |
} |
271 |
$r .= " </div>\n"; |
272 |
return $r; |
273 |
} |
274 |
|
275 |
function apiCreateUser($object) |
276 |
{ |
277 |
$email = $object['email']; |
278 |
$login = str_replace("_", "", slugify($object['pseudo'])); |
279 |
|
280 |
//On regarde si ce pseudo est déjà pris par qqn d'autre ...
|
281 |
if ($user = get_userInfo($login)) { |
282 |
//Si le mail est le même c'est lui-même donc ok
|
283 |
if ($user['email'] == $email) { |
284 |
$arr['loginOK'] = true; |
285 |
} else {
|
286 |
//Sinon c'est que ce login est déjà utilisé ...
|
287 |
$arr['loginOK'] = false; |
288 |
} |
289 |
} else {
|
290 |
//Si ce compte n'existe pas on le créé
|
291 |
$user = array( |
292 |
'login' => $login, |
293 |
'email' => $email |
294 |
); |
295 |
set_userInfo($login, $user); |
296 |
$arr['loginOK'] = true; |
297 |
} |
298 |
return $arr; |
299 |
} |
300 |
|
301 |
function pass_verif($a, $b) |
302 |
{ |
303 |
myDebug("pass verif : $a et $b");
|
304 |
|
305 |
//Si mot de passe vide ...
|
306 |
if (trim($b) == "" && trim($a) == "") { |
307 |
return true; |
308 |
} else {
|
309 |
return password_verify($a, $b); |
310 |
} |
311 |
} |
312 |
|
313 |
function apiCreateAlbum($object) |
314 |
{ |
315 |
$email = $object['email']; |
316 |
$album = $object['album']; |
317 |
$albumPass = $object['albumPass']; |
318 |
$albumPassAdmin = $object['albumPassAdmin']; |
319 |
$arr = array(); |
320 |
|
321 |
myDebug("apiCreateAlbum : $album par $email");
|
322 |
|
323 |
//On regarde si ce pseudo est déjà pris par qqn d'autre ...
|
324 |
if ($albumTest = get_albumInfo($album)) { |
325 |
myDebug(" cet album existe déjà, on vérifie ..." . $email . " == " . $albumTest['adminMail'] . " et passwd ..."); |
326 |
//Si le mail est le même c'est lui-même donc ok
|
327 |
if ($albumTest['adminMail'] == $email && pass_verif($albumPassAdmin, $albumTest['albumPassAdmin'])) { |
328 |
if (set_albumInfo($album, $email, $albumPassAdmin, $albumPass)) { |
329 |
$arr['createAlbumOK'] = true; |
330 |
$arr['message'] = "Cet album a été mis à jour. Vous pouvez l'utiliser et communiquer son nom à vos élèves pour qu'ils puissent y publier leurs photos."; |
331 |
$arr['messageTitle'] = "Mise à jour"; |
332 |
} else {
|
333 |
//Sinon c'est que ce login est déjà utilisé ...
|
334 |
$arr['createAlbumOK'] = false; |
335 |
$arr['message'] = "Cet album n'a pas été mis à jour."; |
336 |
$arr['messageTitle'] = "Erreur de mise à jour"; |
337 |
} |
338 |
} else {
|
339 |
//Sinon c'est que ce login est déjà utilisé ...
|
340 |
$arr['createAlbumOK'] = false; |
341 |
} |
342 |
} else {
|
343 |
//Si cet album n'existe pas on le créé
|
344 |
if (set_albumInfo($album, $email, $albumPassAdmin, $albumPass)) { |
345 |
$arr['createAlbumOK'] = true; |
346 |
$arr['message'] = "Cet album a été créé. Vous pouvez l'utiliser et communiquer son nom à vos élèves pour qu'ils puissent y publier leurs photos."; |
347 |
$arr['messageTitle'] = "Création"; |
348 |
} else {
|
349 |
$arr['createAlbumOK'] = false; |
350 |
} |
351 |
} |
352 |
return $arr; |
353 |
} |
354 |
|
355 |
function display_loginForm($album) |
356 |
{ |
357 |
$r = "<form class=\"form-signin\" method=\"POST\" name=\"authForm\"> |
358 |
<h2 class=\"form-signin-heading\">Authentification</h2>
|
359 |
<p>L'accès à l'album <b>$album</b> est protégé par mot de passe ... veuillez indiquer ce mot de passe et validez.</p>
|
360 |
<label for=\"inputPassword\" class=\"sr-only\">Mot de passe</label>
|
361 |
<input type=\"password\" name=\"passLectureAlbum\" id=\"inputPassword\" class=\"form-control\" placeholder=\"Mot de passe\" required>
|
362 |
<div class=\"checkbox\">
|
363 |
<label>
|
364 |
<input type=\"checkbox\" value=\"remember-me\"> Mémoriser
|
365 |
</label>
|
366 |
</div>
|
367 |
<button class=\"btn btn-lg btn-primary btn-block\" type=\"submit\">Valider</button>
|
368 |
</form>\n";
|
369 |
return $r; |
370 |
} |
371 |
|
372 |
function display_adminForm() |
373 |
{ |
374 |
$r = "<form class=\"form-signin\" method=\"POST\" name=\"authForm\"> |
375 |
<h2 class=\"form-signin-heading\">Authentification administrateur</h2>
|
376 |
<p>Vous administer un album vous devez complétez le formulaire ci-dessous.</p>
|
377 |
<label for=\"inputAlbum\" class=\"sr-only\">Nom de l'album</label>
|
378 |
<input type=\"text\" name=\"album\" id=\"inputAlbum\" class=\"form-control\" placeholder=\"Nom de l'album\" required>
|
379 |
<label for=\"inputPassword\" class=\"sr-only\">Mot de passe</label>
|
380 |
<input type=\"password\" name=\"albumPassAdmin\" id=\"inputPassword\" class=\"form-control\" placeholder=\"Mot de passe\" required>
|
381 |
<div class=\"checkbox\">
|
382 |
<label>
|
383 |
<input type=\"checkbox\" value=\"remember-me\"> Mémoriser
|
384 |
</label>
|
385 |
</div>
|
386 |
<button class=\"btn btn-lg btn-primary btn-block\" type=\"submit\">Valider</button>
|
387 |
</form>\n";
|
388 |
return $r; |
389 |
} |
390 |
|
391 |
|
392 |
function xor_this($text) |
393 |
{ |
394 |
global $config_crypt_key; |
395 |
$outText = ''; |
396 |
for ($i = 0; $i < strlen($text);) { |
397 |
for ($j = 0; $j < strlen($config_crypt_key); $j++, $i++) { |
398 |
$outText .= ($text[$i] ^ $config_crypt_key[$j]); |
399 |
} |
400 |
} |
401 |
return $outText; |
402 |
} |