Projet

Général

Profil

Paste
Statistiques
| Branche: | Révision:

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
}
Redmine Appliance - Powered by TurnKey Linux