Projet

Général

Profil

Paste
Statistiques
| Branche: | Révision:

serveur / tools.php @ 481b2efd

Historique | Voir | Annoter | Télécharger (27,4 ko)

1
<?php
2

    
3
/** **********************************************************************************
4
 *
5
 *  Projet ClicAlbum  - Licence: GNU/Affero GPL v3 ou +
6
 *
7
 *  (c) 2020 Éric Seigne <eric.seigne@cap-rel.fr>
8
 *
9
 *   This file is part of ClicAlbum.
10
 *
11
 *   ClicAlbum is free software: you can redistribute it and/or modify
12
 *   it under the terms of the GNU General Public License as published by
13
 *   the Free Software Foundation, either version 3 of the License, or
14
 *   (at your option) any later version.
15
 *
16
 *   ClicAlbum is distributed in the hope that it will be useful,
17
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
18
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19
 *   GNU General Public License for more details.
20
 *
21
 *   You should have received a copy of the GNU General Public License
22
 *   along with ClicAlbum. If not, see <https://www.gnu.org/licenses/>.
23
 *
24
 * ***********************************************************************************/
25

    
26
require_once "config.php";
27

    
28
function myDebug($message)
29
{
30
  global $config_log;
31
  fwrite($config_log, $message . "\n");
32
}
33

    
34
function write_txt($destinationTXT, $tab)
35
{
36
  myDebug("write_txt $destinationTXT ...");
37
  if ($f = fopen($destinationTXT, 'w')) {
38
    fwrite($f, json_encode($tab));
39
    fclose($f);
40
  } else {
41
    myDebug("  Erreur write_txt impossible ...");
42
  }
43
}
44

    
45
//Lecture du fichier texte qui accompagne le jpeg, retourne un tableau
46
function read_txt($fic)
47
{
48
  $tab = array();
49
  if (file_exists($fic)) {
50
    $tab = json_decode(file_get_contents($fic), true);
51
    if (json_last_error() === JSON_ERROR_NONE) {
52
      // JSON is valid -> on est sur la structure "moderne"
53
    } else {
54
      //Au debut le fichier texte ne contenait que le label ...
55
      $tab['label'] = file_get_contents($fic);
56
      $tab['commentaire'] = "";
57
    }
58
  }
59
  return $tab;
60
}
61

    
62
function update_comment($fic, $comment)
63
{
64
  $t = read_txt($fic);
65
  $t['commentaire'] = $comment;
66
  write_txt($fic, $t);
67
}
68

    
69
function filter_post_field($f)
70
{
71
  global $_POST;
72
  //en v2 on base64encode au départ
73
  if (isset($_POST['version']) && $_POST['version'] == "2") {
74
    $t = base64_decode($f);
75
    // myDebug("on essaye de faire un translit sur $t");
76
    $r = iconv("UTF-8", "ASCII//TRANSLIT", $t);
77
    // myDebug(" ce qui donne $r...");
78
  } else {
79
    $r = $f;
80
  }
81
  return slugify(trim($r));
82
}
83

    
84
function ext($filename)
85
{
86
  return substr(strrchr($filename, '.'), 1);
87
}
88

    
89
//input : 20200323-clavier-c7187-ClicAlbum.pdf
90
//output : clavier.pdf
91
function cleanupFileName($name)
92
{
93
  $txt = preg_replace("/(\d+)-(\w+)-(\w+)-(ClicAlbum)/i", "$2", $name);
94
  return $txt;
95
}
96

    
97
function slugify($text)
98
{
99
  // replace non letter or digits by -
100
  $text = preg_replace('~[^\pL\d]+~u', '_', $text);
101

    
102
  // transliterate
103
  $text = iconv('utf-8', 'us-ascii//TRANSLIT', $text);
104

    
105
  // remove unwanted characters
106
  $text = preg_replace('~[^-\w]+~', '', $text);
107

    
108
  // trim
109
  $text = trim($text, '_');
110

    
111
  // remove duplicate -
112
  $text = preg_replace('~-+~', '_', $text);
113

    
114
  // lowercase
115
  $text = strtolower($text);
116

    
117
  if (empty($text)) {
118
    return '';
119
  }
120

    
121
  return $text;
122
}
123

    
124
function set_albumInfo($name, $adminMail, $albumPassAdmin, $albumPass = "")
125
{
126
  global $config_data;
127
  myDebug("set albumInfo $name");
128

    
129
  $tab['adminMail'] = $adminMail;
130
  if ($albumPass != "") {
131
    $tab['albumPass'] = password_hash($albumPass, PASSWORD_DEFAULT);
132
  } else {
133
    $tab['albumPass'] = "";
134
  }
135
  if ($albumPassAdmin != "") {
136
    $tab['albumPassAdmin'] = password_hash($albumPassAdmin, PASSWORD_DEFAULT);
137
  } else {
138
    $tab['albumPassAdmin'] = "";
139
  }
140

    
141
  $dir = $config_data . "/" . $name;
142
  //Si le rep n'existe pas on le créé
143
  if (!is_dir($dir)) {
144
    myDebug("  creation de $dir");
145
    mkdir($dir, 0700);
146
  }
147
  if (is_dir($dir) && $dir != $config_data) {
148
    myDebug("  creation du fichier $dir/albuminfo");
149
    file_put_contents($dir . "/albuminfo", serialize($tab));
150
    return true;
151
  }
152
  return false;
153
}
154

    
155
function set_albumConf($name, $moderation, $notification, $notificationTo)
156
{
157
  global $config_data;
158
  myDebug("set albumConf $name");
159

    
160
  $tab['moderation']     = $moderation;
161
  $tab['notification']   = $notification;
162
  $tab['notificationTo'] = $notificationTo;
163

    
164
  $dir = $config_data . "/" . $name;
165
  //Si le rep n'existe pas on le créé
166
  if (!is_dir($dir)) {
167
    myDebug("  creation de $dir");
168
    mkdir($dir, 0700);
169
  }
170
  if (is_dir($dir) && $dir != $config_data) {
171
    myDebug("  creation du fichier $dir/albumconf");
172
    file_put_contents($dir . "/albumconf", serialize($tab));
173
    return true;
174
  }
175
  return false;
176
}
177

    
178
function get_albumInfo($name)
179
{
180
  global $config_data;
181

    
182
  $dir = $config_data . "/" . $name;
183
  if (is_dir($dir) && $dir != $config_data && is_file($dir . "/albuminfo")) {
184
    return unserialize(file_get_contents($dir . "/albuminfo"));
185
  } else {
186
    return false;
187
  }
188
}
189

    
190
function get_albumConf($name)
191
{
192
  global $config_data;
193

    
194
  $dir = $config_data . "/" . $name;
195
  myDebug("  get_albumConf $dir...");
196
  if (is_dir($dir) && $dir != $config_data && is_file($dir . "/albumconf")) {
197
    return unserialize(file_get_contents($dir . "/albumconf"));
198
  } else {
199
    return false;
200
  }
201
}
202

    
203
function set_userInfo($name, $userArray)
204
{
205
  global $config_data;
206
  $dir = $config_data . "/users/" . $name;
207
  //Si le rep n'existe pas on le créé
208
  if (!is_dir($dir)) {
209
    mkdir($dir, 0700);
210
  }
211
  if (is_dir($dir) && $dir != $config_data) {
212
    file_put_contents($dir . "/userinfo", serialize($userArray));
213
  }
214
}
215

    
216
function get_userInfo($name)
217
{
218
  global $config_data;
219
  $dir = $config_data . "/users/" . $name;
220
  if (is_dir($dir) && $dir != $config_data) {
221
    return unserialize(file_get_contents($dir . "/userinfo"));
222
  } else {
223
    return false;
224
  }
225
}
226

    
227
function html_head()
228
{
229
  global $title;
230
  return "<!doctype html>
231
  <html lang=\"fr\">
232
  <head>
233
    <meta charset=\"utf-8\">
234
    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">
235
    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">
236
    <link href=\"/bootstrap/css/bootstrap.min.css\" rel=\"stylesheet\">
237
    <link href=\"/bootstrap/css/print.css\" rel=\"stylesheet\">
238
    <script src=\"/bootstrap/js/jquery.slim.min.js\"></script>
239
    <script src=\"/bootstrap/js/bootstrap.bundle.min.js\"></script>
240
    <title>$title</title>
241
    <link rel=\"stylesheet\" type=\"text/css\" href=\"/ouistiti.css\">
242
  </head>
243
  <body class=\"d-flex flex-column\">
244
    <nav class=\"navbar fixed-top navbar-expand-md\">
245
      <div class=\"container\">
246
        <a class=\"navbar-brand\" href=\"https://clicalbum.abuledu.net/\"></a>
247
        <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\">
248
        <span class=\"navbar-toggler-icon\">Menu</span>
249
        </button>
250
        <div class=\"collapse navbar-collapse\" id=\"navbarCollapse\">
251
          <ul class=\"navbar-nav mr-auto\">
252
            <!-- <li class=\"nav-item\"><a class=\"nav-link\" href=\"/\" class=\"nav-link\">Consulter un album</a></li> -->
253
            <li class=\"nav-item\"><a class=\"nav-link\" href=\"/admin.php\">Gérer votre album</a></li>
254
            <li class=\"nav-item\"><a class=\"nav-link\" href=\"/download.php\">Téléchargement</a></li>
255
            <li class=\"nav-item\"><a class=\"nav-link\" href=\"/about.php\">À propos</a></li>
256
          </ul>
257
          <div class=\"nav-item dropdown\">
258
            <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>
259
            <div class=\"dropdown-menu\" aria-labelledby=\"navbarDropdownMenuLink\">
260
              <ul>
261
                <li><a class=\"dropdown-item\" href=\"https://abuledu-fr.org/\">Retourner sur le site de l'association</a></li>
262
              </ul>
263
             </div>
264
          </div>
265
        </div>
266
      </div>
267
    </nav>
268
    <main role=\"main\" class=\"flex-shrink-0\">
269
     <div class=\"container\">
270
      ";
271
}
272

    
273
function html_tail()
274
{
275
  return "     </div>
276
    </main>
277
    <footer class=\"footer mt-auto\">
278
        <p class=\"text-muted\" style=\"text-align: center\">
279
          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 />
280
          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 />
281
          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 />
282
          <a href=\"/cgu.md\">Conditions Générales d'Utilisations</a> | <a href=\"https://abuledu-fr.org/mentions-legales/\">Mentions Légales</a>
283
        </p>
284
    </footer>
285
  </body>
286
</html>
287
";
288
}
289

    
290
function extractAuteur($str)
291
{
292
  $t = explode("-", $str);
293
  return trim($t[1]);
294
}
295

    
296
function extractLabel($fic)
297
{
298
  //Normalement on a un fichier txt qui accompagne le jpeg avec l'étiquette
299
  //en htmlentities
300
  $label = "";
301
  $t = read_txt($fic);
302
  if ($t['label'] != "") {
303
    $label = $t['label'];
304
  } else {
305
    //Si le fichier txt n'existe pas on extrait le label du nom du fichier
306
    //(ancienne méthode version < 1.0.6)
307
    $t = explode("-", $fic);
308
    $label = str_replace("_", " ", $t[2]);
309
  }
310
  return trim($label);
311
}
312

    
313
function extractCommentaire($fic)
314
{
315
  $t = read_txt($fic);
316
  return trim($t['commentaire']);
317
}
318

    
319
function extractLegende($fic)
320
{
321
  $t = read_txt($fic);
322
  return trim($t['legende']);
323
}
324

    
325
//Creation du code HTML de base pour l'export PDF
326
function export_pdf_build_html($post, $dir, $fichiers, $pageLargeur, $pageHauteur)
327
{
328
  myDebug("export_pdf_build_html");
329
  global $title;
330
  global $config_data;
331
  global $config_fileTypeOK;
332

    
333
  if (!is_array($fichiers)) {
334
    return;
335
  }
336

    
337
  $r = "<!doctype html>
338
  <html lang=\"fr\">
339
  <head>
340
    <meta charset=\"utf-8\">
341
    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">
342
    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">
343
    <link href=\"" . __DIR__ . "/bootstrap/css/bootstrap.min.css\" rel=\"stylesheet\">
344
    <link href=\"" . __DIR__ . "/bootstrap/css/print.css\" rel=\"stylesheet\">
345
    <script src=\"" . __DIR__ . "/bootstrap/js/jquery.slim.min.js\"></script>
346
    <script src=\"" . __DIR__ . "/bootstrap/js/bootstrap.bundle.min.js\"></script>
347
    <title>$title</title>
348
    <link rel=\"stylesheet\" type=\"text/css\" href=\"" . __DIR__ . "/ouistiti.css\">
349
    <style>
350
    @page { margin-top: 2cm;margin-bottom: 1cm; }
351
    #header {
352
        position: fixed;
353
        top: 0cm;
354
        left: 0cm;
355
        right: 0cm;
356
        height: 2cm;
357
        vertical-align: top;
358
    }
359
    #footer {
360
        position: fixed;
361
        bottom: 0cm;
362
        left: 0cm;
363
        right: 0cm;
364
        height: 2cm;
365
        margin-left: 2cm;
366
        margin-right: 2cm;
367
    }
368
    body {
369
      color: #333;
370
      background-color: #fff;
371
      padding: 0pt;
372
      margin: 0;
373
    }
374
    main {
375
      margin: 0;
376
      margin-top: 0.5cm;
377
      padding: 0pt;
378
    }
379
    .container {
380
      padding: 0pt;
381
      margin: 0pt;
382
    }
383
    .card-columns .card {
384
      padding: 0pt;
385
      margin: 0pt;
386
    }
387
    .card-body {
388
      padding: .25rem;
389
    }
390
    .card-header {
391
      padding: .5rem;
392
    }
393
    footer {
394
      page-break-after: always;
395
    }
396

397
    table {
398
      font-family:Arial, Helvetica, sans-serif;
399
      color:#666;
400
      font-size:10pt;
401
      text-shadow: 1px 1px 0px #fff;
402
      background:#eaebec;
403
      margin:2pt;
404
      border:#ccc 1px solid;
405

406
      -moz-border-radius:3px;
407
      -webkit-border-radius:3px;
408
      border-radius:3px;
409

410
      -moz-box-shadow: 0 1px 2px #d1d1d1;
411
      -webkit-box-shadow: 0 1px 2px #d1d1d1;
412
      box-shadow: 0 1px 2px #d1d1d1;
413
    }
414
    table tr:first-child th:first-child {
415
      -moz-border-radius-topleft:3px;
416
      -webkit-border-top-left-radius:3px;
417
      border-top-left-radius:3px;
418
    }
419
    table tr:first-child th:last-child {
420
      -moz-border-radius-topright:3px;
421
      -webkit-border-top-right-radius:3px;
422
      border-top-right-radius:3px;
423
    }
424
    table tr {
425
      text-align: center;
426
      padding-left:5px;
427
    }
428
    table td:first-child {
429
      text-align: left;
430
      padding-left:5pt;
431
      border-left: 0;
432
    }
433
    table td {
434
      padding:2pt;
435
      border-top: 1px solid #ffffff;
436
      border-bottom:1px solid #e0e0e0;
437
      border-left: 1px solid #e0e0e0;
438

439
      background: #fafafa;
440
      background: -webkit-gradient(linear, left top, left bottom, from(#fbfbfb), to(#fafafa));
441
      background: -moz-linear-gradient(top,  #fbfbfb,  #fafafa);
442
      vertical-align: top;
443
    }
444
    table tr.even td {
445
      background: #f6f6f6;
446
      background: -webkit-gradient(linear, left top, left bottom, from(#f8f8f8), to(#f6f6f6));
447
      background: -moz-linear-gradient(top,  #f8f8f8,  #f6f6f6);
448
      vertical-align: top;
449
    }
450
    table tr:last-child td {
451
      border-bottom:0;
452
    }
453
    table tr:last-child td:first-child {
454
      -moz-border-radius-bottomleft:3px;
455
      -webkit-border-bottom-left-radius:3px;
456
      border-bottom-left-radius:3px;
457
    }
458
    table tr:last-child td:last-child {
459
      -moz-border-radius-bottomright:3px;
460
      -webkit-border-bottom-right-radius:3px;
461
      border-bottom-right-radius:3px;
462
    }
463
    </style>
464
  </head>
465
  <body>
466
    <div id=\"header\"><h1 style=\"text-align: center; padding-top: -1cm;\">" . $post['titre'] . "</h1></div>
467
    <div id=\"footer\"><p style=\"text-align:right; font-size:8pt;\"><i>AbulÉdu ClicAlbum</i></p></div>
468
    <main>
469
    <table>\n";
470

    
471
  //espaces avant tableau apres tableau etc.
472
  $largeurTabObjets = 2 + 5 + 2 + (2 * $post['nbParLigne']);
473
  //Correctifs perso apres moultes tests
474
  if ($_POST['pageSize'] == 'a4') {
475
    if ($_POST['pageOrientation'] == 'portrait') {
476
      $largeurTabObjets += 100;
477
    } else {
478
      $largeurTabObjets -= 150;
479
    }
480
  }
481
  if ($_POST['pageSize'] == 'a3') {
482
    if ($_POST['pageOrientation'] == 'portrait') {
483
      $largeurTabObjets += 100;
484
    } else {
485
      $largeurTabObjets -= 250;
486
    }
487
  }
488

    
489
  $largeur = round(($pageLargeur - $largeurTabObjets) / $post['nbParLigne']) - 2 . "pt";
490
  $ImgLargeur = round(($pageLargeur - $largeurTabObjets) / $post['nbParLigne']) - 2 . "pt";
491

    
492
  for ($num = 0; $num < count($fichiers);) {
493
    $r .= "    <tr>\n";
494
    // $r .= "  <div class=\"card-lign\" style=\"z-index: -1000; margin: 0pt;\" >\n";
495
    // $r .= "  <div class=\"card-columns\" style=\"margin: 0pt;\">\n";
496
    for ($col = 0; $col < $post['nbParLigne'] && $num < count($fichiers);) {
497
      $fichier = $fichiers[$num];
498
      $num++;
499
      $fullFileName = $config_data . "/" . $dir . "/" . $fichier;
500
      myDebug("  on essaye $fullFileName");
501
      if (is_file($fullFileName) && in_array(ext($fichier), $config_fileTypeOK)) {
502
        $r .= "     <td style=\"width: $largeur;\">";
503
        $col++;
504
        $fichierTXT = str_replace(".jpeg", ".txt", $fullFileName);
505
        $ficAuteur = extractAuteur($fichier);
506
        $ficLabel = extractLabel($fichierTXT);
507
        $legende = extractLegende($fichierTXT);
508
        //debug pour voir en html
509
        //  $fullFileName = "/$dir/$fichier";
510
        myDebug("  -> ok pour /$dir/$fichier");
511

    
512
        $a2 = "<blockquote id=\"commentaireProf\">" . extractCommentaire($fichierTXT) . "</blockquote>";
513
        $r .= "            <img src=\"$fullFileName\" alt=\"\" style=\"width: $ImgLargeur;\"><br />
514
            <h5 class=\"card-title\">Auteur: $ficAuteur</h5>\n";
515
        if ($post['optionTitre']) {
516
          $r .= "            <p class=\"card-text\">$ficLabel</p>\n";
517
        }
518
        if ($post['optionDesc']) {
519
          $r .= "            <p class=\"card-text\">$legende</p>\n";
520
        }
521
        if ($post['optionComm']) {
522
          $r .= "            $a2\n";
523
        }
524
        // $r .= "      </div>\n";
525
        $r .= "     </td>\n";
526
      }
527
    }
528
    // $r .= "  </div>\n";
529
    $r .= "    </tr>\n";
530
  }
531
  /*  </div>
532
    </div>*/
533
  $r .= "  </table>
534
  </main>
535
  </body>
536
  </html>";
537

    
538
  return $r;
539
}
540

    
541
//Affiche un formulaire pour choisir les options d'export PDF ...
542
function export_pdf_choose_options($album)
543
{
544
  $r = "<form class=\"form-pdfOptions\" method=\"POST\" name=\"pdfOptionsForm\">
545

546
  <input type=\"hidden\" name=\"op\" value=\"export\">
547
  <input type=\"hidden\" name=\"album\" value=\"" . base64_encode(xor_this($album)) . "\">
548

549
  <h2 class=\"form-signin-heading\">Options d'export PDF</h2>
550
  <p>Choix des options possibles:</p>
551

552
  <p>Format de la page:</p>
553
  <label for=\"pageSize\" class=\"sr-only\">Format de la page:</label>
554
  <div class=\"radio\">
555
    <label>
556
    <input type=\"radio\" name=\"pageSize\" value=\"a4\" checked=\"checked\"> A4
557
    </label>
558
    <label>
559
    <input type=\"radio\" name=\"pageSize\" value=\"a3\"> A3
560
    </label>
561
  </div>
562

563
  <p>Orientation de la page:</p>
564
  <label for=\"pageOrientation\" class=\"sr-only\">Orientation de la page:</label>
565
  <div class=\"radio\">
566
    <label>
567
    <input type=\"radio\" name=\"pageOrientation\" value=\"portrait\"> Portrait
568
    </label>
569
    <label>
570
    <input type=\"radio\" name=\"pageOrientation\" value=\"landscape\" checked=\"checked\"> Paysage
571
    </label>
572
  </div>
573

574
  <p>Nombre de vignettes par ligne:</p>
575
  <label for=\"nbParLigne\" class=\"sr-only\">Nombre de vignettes par ligne</label>
576
  <input type=\"text\" name=\"nbParLigne\" id=\"nbParLigne\" class=\"form-control\" value=\"6\" required>
577

578
  <p>Titre de l'album:</p>
579
  <input type=\"text\" name=\"titre\" id=\"titre\" class=\"form-control\" value=\"Mon super album\" required>
580

581
  <p>Options complémentaires :</p>
582
  <div class=\"checkbox\">
583
    <label>
584
    <input type=\"checkbox\" name=\"optionTitre\" value=\"titres\"> Insérer le titre des photos
585
    </label>
586
    <label>
587
    <input type=\"checkbox\" name=\"optionDesc\" value=\"descriptions\"> Insérer le descriptif des photos
588
    </label>
589
    <label>
590
    <input type=\"checkbox\" name=\"optionComm\" value=\"commentaires\"> Insérer les commentaires des photos
591
    </label>
592
  </div>
593

594
  <p>&nbsp;</p>
595
  <button class=\"btn btn-lg btn-primary btn-block\" type=\"submit\">Valider</button>
596
</form>\n";
597
  return $r;
598
}
599

    
600
//Affiche un formulaire pour choisir les options de l'album ...
601
function album_options($album)
602
{
603

    
604
  $caposteriori = "checked=\"checked\"";
605
  $nonotification = "checked=\"checked\"";
606
  $notificationTo = "adresse.mail@abuledu.org";
607

    
608
  $conf = get_albumConf($album);
609

    
610
  if ($conf) {
611
    myDebug("  la configuration de cet album existe déjà");
612
    $moderation     = $conf['moderation'];
613
    $notification   = $conf['notification'];
614
    $notificationTo = $conf['notificationTo'];
615

    
616
    $capiori = "";
617
    $caposteriori = "";
618
    if ($moderation == "apriori") {
619
      $capiori = "checked=\"checked\"";
620
    } else {
621
      $caposteriori = "checked=\"checked\"";
622
    }
623
    if ($notification == "mail") {
624
      $mnotification = "checked=\"checked\"";
625
    }
626
  }
627

    
628

    
629
  $r = "<form class=\"form-albumOptions\" method=\"POST\" name=\"albumOptionsForm\">
630

631
  <input type=\"hidden\" name=\"op\" value=\"setOptions\">
632
  <input type=\"hidden\" name=\"album\" value=\"" . base64_encode(xor_this($album)) . "\">
633

634
  <h2 class=\"form-signin-heading\">Options de configuration de l'album</h2>
635
  <p>ATTENTION: tout ceci est en cours de développement, merci de participer ici : <a href=\"http://redmine.abuledu.org/projects/abuledu-clicalbum/issues\">http://redmine.abuledu.org/projects/abuledu-clicalbum/issues</a></p>
636

637
  <p>Modération des photos:</p>
638
  <label for=\"moderation\" class=\"sr-only\">Modération:</label>
639
  <div class=\"radio\">
640
    <label>
641
    <input type=\"radio\" name=\"moderation\" value=\"aposteriori\" $caposteriori> À postériori
642
    </label>
643
    <label>
644
    <input type=\"radio\" name=\"moderation\" value=\"apriori\" $capiori> À priori (les photos ne sont pas visibles tant que le responsable ne les a pas validés)
645
    </label>
646
  </div>
647

648
  <p>Notifications:</p>
649
  <label for=\"notification\" class=\"sr-only\">Recevoir des notifications:</label>
650
  <div class=\"radio\">
651
    <label>
652
    <input type=\"radio\" name=\"notification\" value=\"none\" $nonotification> Aucune notification
653
    </label>
654
    <label>
655
    <input type=\"radio\" name=\"notification\" value=\"mail\" $mnotification> Par mail à l'adresse suivante:
656
    </label>
657
    <label>
658
    <input type=\"text\" name=\"notificationTo\" value=\"$notificationTo\">
659
    </label>
660
  </div>
661
  <!-- Sur <a href=\"https://edutwit.abuledu.org\">edutwit</a> -->
662

663
  <p>&nbsp;</p>
664
  <button class=\"btn btn-lg btn-primary btn-block\" type=\"submit\">Valider</button>
665
</form>\n";
666
  return $r;
667
}
668

    
669
//Affiche l'album photo
670
function display_pictures($fichiers, $dir, $is_admin = false)
671
{
672
  global $config_data;
673
  global $config_fileTypeOK;
674

    
675
  if (!is_array($fichiers)) {
676
    return;
677
  }
678

    
679
  myDebug("display_pictures pour $dir");
680

    
681
  //Si on n'est pas admin on ajoute un lien pour basculer admin
682
  if ($is_admin == false) {
683
    $r = "<p id=\"adminLink\"><a href=\"admin.php?album=$dir\">Administrer cet album</a></p>";
684
  } else {
685
    $r = "<p id=\"adminLink\"><a href=\"conf.php?album=$dir\">Configurer l'album</a> -- <a href=\"pdf.php?album=$dir\">Exporter l'album au format PDF</a> -- <a href=\"/$dir\">Retourner à l'album public</a></p>";
686
  }
687

    
688
  $r .= "  <div class=\"card-columns\">\n";
689
  foreach ($fichiers as $fichier) {
690
    $fullFileName = $config_data . "/" . $dir . "/" . $fichier;
691
    myDebug("  on essaye $fullFileName");
692
    if (is_file($fullFileName) && in_array(ext($fichier), $config_fileTypeOK)) {
693
      $fichierTXT = str_replace(".jpeg", ".txt", $fullFileName);
694
      $ficAuteur = extractAuteur($fichier);
695
      $ficLabel = extractLabel($fichierTXT);
696
      $legende = extractLegende($fichierTXT);
697
      myDebug("  -> ok pour /$dir/$fichier");
698
      // print "<img src=\"$fichier\">";
699

    
700
      $a = "";
701
      $a2 = "";
702

    
703
      //L'admin a une option pour supprimer l'image
704
      if ($is_admin) {
705
        $a = "<a href=\"admin.php?op=delete&id=" . base64_encode(xor_this($fichier)) . "\">Supprimer</a>";
706
        $a2 = adminMakeFormMessage($fichier, $fichierTXT);
707
      } else {
708
        $a2 = "<blockquote id=\"commentaireProf\">" . extractCommentaire($fichierTXT) . "</blockquote>";
709
      }
710

    
711
      $r .= "
712
    <div class=\"card\">
713
        <div class=\"card-header\">
714
          <a href=\"/$dir/$fichier\" class=\"d-block mb-4 h-100\"><img class=\"card-img-top img-thumbnail\" src=\"/$dir/$fichier\" alt=\"\"></a>
715
        </div>
716
        <div class=\"card-body text-center\">
717
          <h5 class=\"card-title\">Auteur: $ficAuteur</h5>
718
          <p class=\"card-text\">Nom: $ficLabel - $a</p>
719
          <p class=\"card-text\">$legende</p>
720
        </div>
721
        <div class=\"card-footer\">
722
          $a2
723
        </div>
724
    </div>\n";
725
    }
726
  }
727
  $r .= "  </div>\n";
728
  return $r;
729
}
730

    
731
//Formulaire pour ajouter un message sous une photo (commentaire du prof par ex)
732
function adminMakeFormMessage($fichier, $fichierTXT)
733
{
734
  $commentaire = extractCommentaire($fichierTXT);
735
  $action = "admin.php?op=setComment";
736
  $r = "<form method=\"post\" action=\"$action\">
737
  <input type=\"hidden\" name=\"op\" value=\"setComment\">
738
  <input type=\"hidden\" name=\"id\" value=\"" . base64_encode(xor_this($fichier)) . "\">
739
  <textarea id=\"commentaire\" name=\"commentaire\" placeholder=\"Écrivez votre commentaire ici ...\">$commentaire</textarea><input type=\"submit\" value=\"enregistrer\"></form>";
740
  return $r;
741
}
742

    
743
function apiCreateUser($object)
744
{
745
  $email = $object['email'];
746
  $login = str_replace("_", "", slugify($object['pseudo']));
747

    
748
  //On regarde si ce pseudo est déjà pris par qqn d'autre ...
749
  if ($user = get_userInfo($login)) {
750
    //Si le mail est le même c'est lui-même donc ok
751
    if ($user['email'] == $email) {
752
      $arr['loginOK'] = true;
753
    } else {
754
      //Sinon c'est que ce login est déjà utilisé ...
755
      $arr['loginOK'] = false;
756
    }
757
  } else {
758
    //Si ce compte n'existe pas on le créé
759
    $user = array(
760
      'login' => $login,
761
      'email' => $email,
762
    );
763
    set_userInfo($login, $user);
764
    $arr['loginOK'] = true;
765
  }
766
  return $arr;
767
}
768

    
769
function pass_verif($a, $b)
770
{
771
  myDebug("pass verif : $a et $b");
772

    
773
  //Si mot de passe vide ...
774
  if (trim($b) == "" && trim($a) == "") {
775
    return true;
776
  } else {
777
    return password_verify($a, $b);
778
  }
779
}
780

    
781
function apiCreateAlbum($object)
782
{
783
  $email = $object['email'];
784
  $album = $object['album'];
785
  $albumPass = $object['albumPass'];
786
  $albumPassAdmin = $object['albumPassAdmin'];
787
  $arr = array();
788

    
789
  myDebug("apiCreateAlbum : $album par $email");
790

    
791
  //On regarde si ce pseudo est déjà pris par qqn d'autre ...
792
  if ($albumTest = get_albumInfo($album)) {
793
    myDebug("  cet album existe déjà, on vérifie ..." . $email . " == " . $albumTest['adminMail'] . " et passwd ...");
794
    //Si le mail est le même c'est lui-même donc ok
795
    if ($albumTest['adminMail'] == $email && pass_verif($albumPassAdmin, $albumTest['albumPassAdmin'])) {
796
      if (set_albumInfo($album, $email, $albumPassAdmin, $albumPass)) {
797
        $arr['createAlbumOK'] = true;
798
        $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.";
799
        $arr['messageTitle'] = "Mise à jour";
800
      } else {
801
        //Sinon c'est que ce login est déjà utilisé ...
802
        $arr['createAlbumOK'] = false;
803
        $arr['message'] = "Cet album n'a pas été mis à jour.";
804
        $arr['messageTitle'] = "Erreur de mise à jour";
805
      }
806
    } else {
807
      //Sinon c'est que ce login est déjà utilisé ...
808
      $arr['createAlbumOK'] = false;
809
    }
810
  } else {
811
    //Si cet album n'existe pas on le créé
812
    if (set_albumInfo($album, $email, $albumPassAdmin, $albumPass)) {
813
      $arr['createAlbumOK'] = true;
814
      $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.";
815
      $arr['messageTitle'] = "Création";
816
    } else {
817
      $arr['createAlbumOK'] = false;
818
    }
819
  }
820
  return $arr;
821
}
822

    
823
function display_loginForm($album)
824
{
825
  $r = "<form class=\"form-signin\" method=\"POST\" name=\"authForm\">
826
  <h2 class=\"form-signin-heading\">Authentification</h2>
827
  <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>
828
  <label for=\"inputPassword\" class=\"sr-only\">Mot de passe</label>
829
  <input type=\"password\" name=\"passLectureAlbum\" id=\"inputPassword\" class=\"form-control\" placeholder=\"Mot de passe\" required>
830
  <div class=\"checkbox\">
831
    <label>
832
      <input type=\"checkbox\" value=\"remember-me\"> Mémoriser
833
    </label>
834
  </div>
835
  <button class=\"btn btn-lg btn-primary btn-block\" type=\"submit\">Valider</button>
836
</form>\n";
837
  return $r;
838
}
839

    
840
function display_adminForm()
841
{
842
  $a = $_GET['album'];
843
  $r = "<form class=\"form-signin\" method=\"POST\" name=\"authForm\">
844
  <h2 class=\"form-signin-heading\">Authentification administrateur</h2>
845
  <p>Si vous administrez un album merci de compléter le formulaire ci-dessous.</p>
846
  <label for=\"inputAlbum\" class=\"sr-only\">Nom de l'album</label>
847
  <input type=\"text\" name=\"album\" id=\"inputAlbum\" class=\"form-control\" placeholder=\"Nom de l'album\" value=\"$a\" required>
848
  <label for=\"inputPassword\" class=\"sr-only\">Mot de passe</label>
849
  <input type=\"password\" name=\"albumPassAdmin\" id=\"inputPassword\" class=\"form-control\" placeholder=\"Mot de passe\" required>
850
  <div class=\"checkbox\">
851
    <label>
852
      <input type=\"checkbox\" value=\"remember-me\"> Mémoriser
853
    </label>
854
  </div>
855
  <button class=\"btn btn-lg btn-primary btn-block\" type=\"submit\">Valider</button>
856
</form>\n";
857
  return $r;
858
}
859

    
860
function xor_this($text)
861
{
862
  global $config_crypt_key;
863
  $outText = '';
864
  for ($i = 0; $i < strlen($text);) {
865
    for ($j = 0; $j < strlen($config_crypt_key); $j++, $i++) {
866
      $outText .= ($text[$i] ^ $config_crypt_key[$j]);
867
    }
868
  }
869
  return $outText;
870
}
Redmine Appliance - Powered by TurnKey Linux