diff -urN cahier-de-prepa8.1.1/agenda.php cahier-de-prepa9.0.0/agenda.php
--- cahier-de-prepa8.1.1/agenda.php 2018-10-15 17:50:34.840788232 +0200
+++ cahier-de-prepa9.0.0/agenda.php 2019-08-25 01:59:46.442156393 +0200
@@ -71,7 +71,7 @@
DATE_FORMAT(debut,'%d/%m/%Y') AS jd, DATE_FORMAT(fin,'%d/%m/%Y') AS jf,
DATE_FORMAT(debut,'%kh%i') AS hd, DATE_FORMAT(fin,'%kh%i') AS hf,
DATEDIFF(debut,'$deb')+1 AS njd, DATEDIFF(fin,'$deb')+1 AS njf
- FROM agenda AS a JOIN `agenda-types` AS t ON a.type = t.id LEFT JOIN matieres AS m ON a.matiere = m.id
+ FROM agenda AS a LEFT JOIN `agenda-types` AS t ON a.type = t.id LEFT JOIN matieres AS m ON a.matiere = m.id
WHERE debut < '$deb' + INTERVAL ".($j1+7*$nbs)." DAY AND fin >= '$deb' - INTERVAL $j1 DAY
ORDER BY fin,debut");
if ( $resultat->num_rows ) {
@@ -287,7 +287,7 @@
-
+
';
$p = $protection;
diff -urN cahier-de-prepa8.1.1/agenda-types.php cahier-de-prepa9.0.0/agenda-types.php
--- cahier-de-prepa8.1.1/agenda-types.php 2018-11-06 10:19:04.699957078 +0100
+++ cahier-de-prepa9.0.0/agenda-types.php 2019-08-05 01:36:06.765303979 +0200
@@ -12,7 +12,7 @@
// Accès aux professeurs connectés uniquement. Redirection pour les autres.
if ( $autorisation < 5 ) {
- header("Location: https://$site");
+ header("Location: https://$domaine$chemin");
exit();
}
$mysqli = connectsql();
diff -urN cahier-de-prepa8.1.1/ajax.php cahier-de-prepa9.0.0/ajax.php
--- cahier-de-prepa8.1.1/ajax.php 2018-11-10 22:28:33.857051342 +0100
+++ cahier-de-prepa9.0.0/ajax.php 2019-08-28 14:22:21.867100664 +0200
@@ -16,15 +16,7 @@
// Demande de déconnexion
if ( $action == 'deconnexion' ) {
- // Écriture de la déconnexion dans le fichier de log, sauf si la session a
- // été perdue parce qu'effacée du serveur
- if ( isset($_SESSION['login']) )
- logconnect(3,$_SESSION['login']);
- // Suppression du cookie et des données de session
- $_SESSION = array();
- setcookie(session_name(),'',time()-3600);
- setcookie('loginpermanent','',time()-3600);
- session_regenerate_id(true);
+ suppression_session();
// Recharge immédiate, donc besoin de $_SESSION['message']
exit($_SESSION['message'] = '{"etat":"ok","message":"Déconnexion réussie"}');
}
@@ -35,23 +27,27 @@
///////////////////////
// Envoi de courriel //
///////////////////////
-if ( ( $action == 'courriel' ) && connexionlight() && $_SESSION['mailenvoi'] && isset($_REQUEST['id-copie']) && isset($_REQUEST['sujet']) && isset($_REQUEST['texte']) ) {
-
+if ( ( $action == 'courriel' ) && connexionlight() && isset($_REQUEST['id-copie']) && isset($_REQUEST['sujet']) && isset($_REQUEST['texte']) ) {
+ // Envoi possible seulement si autorisé
+ $mysqli = connectsql();
+ $resultat = $mysqli->query('SELECT val FROM prefs WHERE nom = "autorisation_mails"');
+ if ( ( $aut_envoi = $resultat->fetch_row()[0] >> 4*($autorisation-2) & 15 ) == 0 )
+ exit('{"etat":"nok","message":"L\'envoi de courriel n\'est pas autorisé."}');
+ $aut_dest = implode(',',array_keys(str_split('00'.strrev(decbin($aut_envoi))),1));
+ $resultat->free();
// Vérification des données
- if ( !strlen($sujet = $_REQUEST['sujet']) )
+ if ( !($sujet = $_REQUEST['sujet']) )
exit('{"etat":"nok","message":"Pas de sujet : courriel non envoyé"}');
- elseif ( !strlen($texte = $_REQUEST['texte']) )
+ elseif ( !($texte = $_REQUEST['texte']) )
exit('{"etat":"nok","message":"Pas de texte : courriel non envoyé"}');
// Vérification de l'adresse électronique
- $mysqli = connectsql();
$resultat = $mysqli->query("SELECT mailexp, mail FROM utilisateurs WHERE id = ${_SESSION['id']}");
$u = $resultat->fetch_assoc();
$resultat->free();
- if ( !strlen($u['mailexp']) || !filter_var($u['mail'],FILTER_VALIDATE_EMAIL) )
+ if ( !$u['mailexp'] || !filter_var($u['mail'],FILTER_VALIDATE_EMAIL) )
exit('{"etat":"nok","message":"Compte mal réglé : nom ou adresse d\'expédition manquants"}');
// Récupération des destinataires, comptes valides uniquement
- $resultat = $mysqli->query("SELECT id, IF(LENGTH(nom),CONCAT(nom,' ',prenom),login) AS nom, mail
- FROM utilisateurs WHERE mail > '' AND mdp > '0' AND id != ${_SESSION['id']} ORDER BY autorisation DESC, nom");
+ $resultat = $mysqli->query("SELECT id, mail, mailexp FROM utilisateurs WHERE mail > '' AND mdp > '0' AND id != ${_SESSION['id']} AND FIND_IN_SET(autorisation,'$aut_dest') ORDER BY autorisation DESC, nom");
$mysqli->close();
while ( $r = $resultat->fetch_assoc() )
$utilisateurs[$r['id']] = $r;
@@ -60,28 +56,28 @@
$ids = explode(',',$_REQUEST['id-copie']);
foreach ( $ids as $i )
if ( isset($utilisateurs[$i]) ) {
- $dests .= '=?UTF-8?B?'.base64_encode($utilisateurs[$i]['nom']).'?= <'.$utilisateurs[$i]['mail'].'>, ';
+ $dests .= '=?UTF-8?B?'.base64_encode($utilisateurs[$i]['mailexp']).'?= <'.$utilisateurs[$i]['mail'].'>, ';
unset($utilisateurs[$i]);
}
- if ( !strlen($dests) )
+ if ( !$dests )
exit('{"etat":"nok","message":"Pas de destinataire valide : courriel non envoyé"}');
// Fabrication du mail
$dests = substr($dests,0,-2);
$bcc = ( isset($_REQUEST['copie']) ) ? "${u['mailexp']} <${u['mail']}>, " : '';
- if ( strlen($_REQUEST['id-bcc']) )
+ if ( $_REQUEST['id-bcc'] )
$ids = explode(',',$_REQUEST['id-bcc']);
foreach ( $ids as $i )
if ( isset($utilisateurs[$i]) ) {
- $bcc .= '=?UTF-8?B?'.base64_encode($utilisateurs[$i]['nom']).'?= <'.$utilisateurs[$i]['mail'].'>, ';
+ $bcc .= '=?UTF-8?B?'.base64_encode($utilisateurs[$i]['mailexp']).'?= <'.$utilisateurs[$i]['mail'].'>, ';
unset($utilisateurs[$i]);
}
- $bcc = ( strlen($bcc) ) ? 'Bcc: '.substr($bcc,0,-2) : '';
+ $bcc = ( $bcc ) ? 'Bcc: '.substr($bcc,0,-2) : '';
mail($dests,'=?UTF-8?B?'.base64_encode($sujet).'?=',$texte,'From: =?UTF-8?B?'.base64_encode($u['mailexp']).'?= \r\nReply-To: =?UTF-8?B?".base64_encode($u['mailexp'])."?= <${u['mail']}>\r\nContent-type: text/plain; charset=UTF-8\r\n$bcc","-f${u['mail']}");
// Message de confirmation d'envoi
$n1 = substr_count($dests,'<');
$n2 = substr_count($bcc,'<') - isset($_REQUEST['copie']);
if ( $n2 )
- $message = 'La courriel a été envoyé à '.($n1+$n2).' destinataires (dont '.$n2.' en copie cachée).';
+ $message = 'Le courriel a été envoyé à '.($n1+$n2).' destinataires (dont '.$n2.' en copie cachée).';
else
$message = ( $n1 > 1 ) ? "Le courriel a été envoyé à $n1 destinataires." : 'Le courriel a été envoyé à 1 destinataire.';
exit($_SESSION['message'] = "{\"etat\":\"ok\",\"message\":\"$message\"}");
@@ -95,123 +91,194 @@
// Spécifications pour les manipulations de caractères sur 2 octets (accents)
mb_internal_encoding('UTF-8');
- // Vérification obligatoire du mot de passe
+ // Vérification obligatoire du mot de passe et récupération des données de l'utilisateur
if ( !isset($_REQUEST['mdp']) )
exit('{"etat":"nok","message":"Mot de passe incorrect"}');
- // L'adresse électronique sert dans les cas 1 et 4
$mysqli = connectsql(true);
- $resultat = $mysqli->query("SELECT mdp, mail FROM utilisateurs WHERE id = ${_SESSION['id']}");
+ $resultat = $mysqli->query("SELECT * FROM utilisateurs WHERE id = ${_SESSION['id']}");
$r = $resultat->fetch_assoc();
$resultat->free();
- if ( ( sha1($mdp.$_REQUEST['mdp']) != $r['mdp'] ) && ( sha1($_REQUEST['mdp']) != $r['mdp'] ) )
+ if ( sha1($mdp.$_REQUEST['mdp']) != $r['mdp'] )
exit('{"etat":"nok","message":"Mot de passe incorrect"}');
// Passage de la connexion light à normale si besoin
- if ( $_SESSION['light'] ) {
- $_SESSION['light'] = false;
- // Écriture de la connexion dans le fichier de log
- logconnect(5,$_SESSION['login']);
+ if ( $_SESSION['light'] )
+ enregistre_session(false,false,$r['timeout']);
+
+ // Fonction de fabrication de la partie modifiante de la requête
+ function fabriqueupdate($requete,$mysqli) {
+ $chaine = '';
+ foreach ($requete as $champ=>$val)
+ $chaine .= ",$champ = '".$mysqli->real_escape_string($val).'\'';
+ return substr($chaine,1);
}
// Premier cadre de modifications de prefs.php : indentité
- if ( ( $_REQUEST['id'] == 1 ) && isset($_REQUEST['prenom']) && isset($_REQUEST['nom']) && isset($_REQUEST['mail1']) && isset($_REQUEST['mail2']) ) {
- $requete_mail = '';
- if ( !strlen($prenom = trim($_REQUEST['prenom'])) || !strlen($nom = trim($_REQUEST['nom'])) || !strlen($mail = mb_strtolower(trim($_REQUEST['mail1']))) )
- exit('{"etat":"nok","message":"Votre compte n\'a pas été modifié. Le prénom, le nom et l\'adresse électronique doivent rester non vides."}');
- if ( ( $mail != $r['mail'] ) && strlen($_REQUEST['mail2']) ) {
- if ( !filter_var($mail,FILTER_VALIDATE_EMAIL) )
- exit('{"etat":"nok","message":"Adresse électronique non valide"}');
- if ( $mail != mb_strtolower(trim($_REQUEST['mail2'])) )
- exit('{"etat":"nok","message":"Adresses électroniques différentes"}');
- // Vérification que l'adresse n'existe pas déjà
- $resultat = $mysqli->query("SELECT GROUP_CONCAT(mail) FROM utilisateurs WHERE id != ${_SESSION['id']} AND mail > ''");
- $r = $resultat->fetch_row();
- $resultat->free();
- if ( in_array($mail,explode(',',$r[0])) )
- exit('{"etat":"nok","message":"Adresse électronique non disponible"}');
- $requete_mail = ', mail = \''.$mysqli->real_escape_string($mail).'\'';
- }
- // Nettoyage des données envoyées
- $prenom = mb_convert_case(strip_tags($mysqli->real_escape_string($prenom)),MB_CASE_TITLE);
- $nom = mb_convert_case(strip_tags($mysqli->real_escape_string($nom)),MB_CASE_TITLE);
- if ( requete('utilisateurs',"UPDATE utilisateurs SET nom = '$nom', prenom = '$prenom'$requete_mail WHERE id = ${_SESSION['id']}",$mysqli) )
+ if ( ( $_REQUEST['id'] == 1 ) && isset($_REQUEST['prenom']) && isset($_REQUEST['nom']) ) {
+ // Vérification et nettoyage des données
+ if ( !($prenom = mb_convert_case(strip_tags(trim($_REQUEST['prenom'])),MB_CASE_TITLE)) || !($nom = mb_convert_case(strip_tags(trim($_REQUEST['nom'])),MB_CASE_TITLE)) )
+ exit('{"etat":"nok","message":"Votre compte n\'a pas été modifié. Le prénom et le nom doivent rester non vides."}');
+ // Construction de la requête
+ $requete = array();
+ if ( $prenom != $r['prenom'] )
+ $requete['prenom'] = $prenom;
+ if ( $nom != $r['nom'] )
+ $requete['nom'] = $nom;
+ if ( !$requete )
+ exit('{"etat":"nok","message":"Aucune modification à faire"}');
+ if ( requete('utilisateurs','UPDATE utilisateurs SET ' .fabriqueupdate($requete,$mysqli) . " WHERE id = ${_SESSION['id']}",$mysqli) ) {
+ // Si interface globale activée, mise à jour
+ if ( $interfaceglobale ) {
+ include("${interfaceglobale}majutilisateurs.php");
+ majutilisateurs($_SESSION['id'],$requete);
+ }
exit('{"etat":"ok","message":"Vos préférences ont été modifiées."}');
+ }
exit('{"etat":"nok","message":"Votre compte n\'a pas été modifié. Erreur MySQL n°'.$mysqli->errno.', «'.$mysqli->error.'»."}');
}
// Deuxième cadre de modifications de prefs.php : mot de passe
if ( ( $_REQUEST['id'] == 2 ) && isset($_REQUEST['mdp1']) && isset($_REQUEST['mdp2']) ) {
- if ( !strlen($mdp1 = $_REQUEST['mdp1']) || ( $mdp1 != $_REQUEST['mdp2'] ) )
+ if ( !($mdp1 = $_REQUEST['mdp1']) || ( $mdp1 != $_REQUEST['mdp2'] ) )
exit('{"etat":"nok","message":"Nouveau mot de passe et confirmation différents"}');
- // Token de connexion automatique
- if ( strlen($permconn = $_SESSION['permconn']) )
+ $requete = array('mdp'=>sha1($mdp.$mdp1));
+ // Token de connexion automatique à renouveler si existant
+ if ( $_SESSION['permconn'] ) {
+ $permconn = '';
for ( $i = 0; $i < 10; $i++ )
$permconn .= '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'[random_int(0,61)];
- if( requete('utilisateurs','UPDATE utilisateurs SET mdp = \''.sha1($mdp.$mdp1)."', permconn = '$permconn' WHERE id = ${_SESSION['id']}",$mysqli) ) {
- if ( strlen($permconn) )
- setcookie('loginpermanent',$permconn,time()+31536000);
- exit('{"etat":"ok","message":"Votre mot de passe a été modifié."}');
+ $requete['permconn'] = $permconn;
+ }
+ if ( !$requete )
+ exit('{"etat":"nok","message":"Aucune modification à faire"}');
+ # Éxécution
+ if ( requete('utilisateurs','UPDATE utilisateurs SET ' .fabriqueupdate($requete,$mysqli) . " WHERE id = ${_SESSION['id']}",$mysqli) ) {
+ if ( isset($permconn) )
+ setcookie('CDP_SESSION_PERM',$permconn,time()+31536000,$chemin,$domaine,true);
+ // Si interface globale activée, mise à jour
+ if ( $interfaceglobale ) {
+ include("${interfaceglobale}majutilisateurs.php");
+ majutilisateurs($_SESSION['id'],$requete);
+ }
+ exit($_SESSION['message'] = '{"etat":"ok","message":"Votre mot de passe a été modifié."}');
}
exit('{"etat":"nok","message":"Votre mot de passe n\'a pas été modifié. Erreur MySQL n°'.$mysqli->errno.', «'.$mysqli->error.'»."}');
}
- // Troisième cadre de modifications de prefs.php : connexion
- if ( ( $_REQUEST['id'] == 3 ) && isset($_REQUEST['login']) && isset($_REQUEST['timeout']) && ctype_digit($timeout = $_REQUEST['timeout']) ) {
- $requete_login = '';
- if ( !strlen($login = mb_strtolower(str_replace(' ','_',strip_tags(trim($_REQUEST['login']))))) )
+ // Troisième cadre de modifications de prefs.php : adresse électronique
+ if ( ( $_REQUEST['id'] == 3 ) && isset($_REQUEST['mail']) ) {
+ // Vérification et nettoyage des données
+ if ( !($mail = filter_var(mb_strtolower(trim($_REQUEST['mail'])),FILTER_VALIDATE_EMAIL)) )
+ exit('{"etat":"nok","message":"L\'adresse électronique doit être valide et non vide."}');
+ // Vérification que l'adresse n'est pas déjà utilisée
+ $resultat = $mysqli->query('SELECT id FROM utilisateurs WHERE mail = \''.$mysqli->real_escape_string($mail)."' AND id != ${_SESSION['id']}");
+ if ( $resultat->num_rows )
+ exit('{"etat":"nok","message":"Adresse électronique non disponible"}');
+ // Si pas de code de confirmation : envoi de courriel
+ if ( !isset($_REQUEST['confirmation']) ) {
+ // On ajoute 15 minutes au temps utilisé : de xh00 à xh45,
+ // on a jusqu'à (x+1)h, de xh45 à (x+1)h on a jusqu'à (x+2)h
+ $t = time() + 900;
+ $p = substr(sha1($chemin.$mdp.date('Y-m-d-H',$t).$mail),0,8);
+ mail($mail,'=?UTF-8?B?'.base64_encode('[Cahier de Prépa] Changement d\'adresse électronique').'?=',
+"Bonjour
+
+Vous avez demandé à modifier l'adresse électronique liée à votre compte sur le Cahier de Prépa .
+
+Cette demande nécessite la vérification que vous possédez l'adresse à laquelle vous recevez ce courriel.
+
+Pour ce faire, vous devez copier, sur la page qui a généré ce courriel, le code suivant :
+
+ $p
+
+Ce code est valable jusqu'à ".date('G\h00',$t+3600).'.
+
+Si cette demande ne vient pas de vous, merci d\'ignorer ce courriel et éventuellement de le signaler à l\'administrateur en répondant à ce courriel.
+
+Cordialement,
+--
+Cahier de Prépa
+ ','From: =?UTF-8?B?'.base64_encode('Cahier de Prépa')."?= <$mailadmin>\r\nContent-type: text/plain; charset=UTF-8","-f$mailadmin");
+ exit('{"etat":"confirm_mail","message":"Un courriel vient de vous être envoyé à l\'adresse '.$mail.'. Il contient un code, valable jusqu\'à '.date('G\h00',$t+3600).', que vous devez copier-coller ci-dessous pour réaliser l\'opération. Si vous ne voyez rien, pensez à regarder dans les courriels marqués comme spam. Certains serveurs retardent jusqu\'à 10 minutes l\'arrivée des messages, normalement la première fois uniquement."}');
+ }
+ // $_REQUEST['p'] est obligatoirement défini. Il s'agit du sha1 de $chemin.$mdp.date('Y-m-d-H').$mail
+ if ( ( ($p=$_REQUEST['confirmation']) != substr(sha1($chemin.$mdp.date('Y-m-d-H').$mail),0,8) ) && ( $p != substr(sha1($chemin.$mdp.date('Y-m-d-H',time()+900).$mail),0,8) ) )
+ exit('{"etat":"nok","message":"Le code saisi n\'est pas correct. Si vous avez dépassé le délai, vous devez recommencer la procédure."}');
+ // Modification
+ if ( requete('utilisateurs','UPDATE utilisateurs SET mail = \'' .$mysqli->real_escape_string($mail)."' WHERE id = ${_SESSION['id']}",$mysqli) ) {
+ // Si interface globale activée, mise à jour
+ if ( $interfaceglobale ) {
+ include("${interfaceglobale}majutilisateurs.php");
+ majutilisateurs($_SESSION['id'],array('mail'=>$mail));
+ }
+ exit($_SESSION['message'] = '{"etat":"ok","message":"Vos préférences ont été modifiées."}');
+ }
+ exit('{"etat":"nok","message":"Votre compte n\'a pas été modifié. Erreur MySQL n°'.$mysqli->errno.', «'.$mysqli->error.'»."}');
+ }
+
+ // Quatrième cadre de modifications de prefs.php : connexion
+ if ( ( $_REQUEST['id'] == 4 ) && isset($_REQUEST['login']) && isset($_REQUEST['timeout']) && ctype_digit($timeout = $_REQUEST['timeout']) ) {
+ if ( !($login = mb_strtolower(str_replace(' ','_',strip_tags(trim($_REQUEST['login']))))) )
exit('{"etat":"nok","message":"Votre compte n\'a pas été modifié. L\'identifiant doit être non vide."}');
+ $requete = array();
if ( $login != $_SESSION['login'] ) {
// Vérification que le login n'existe pas déjà
- $resultat = $mysqli->query("SELECT GROUP_CONCAT(login) FROM utilisateurs WHERE id != ${_SESSION['id']}");
- $r = $resultat->fetch_row();
- $resultat->free();
- if ( in_array($login,explode(',',$r[0])) )
- exit('{"etat":"nok","message":"Votre compte n\'a pas été modifié. L\'identifiant saisi est déjà utilisé."}');
- $requete_login = ', login = \''.$mysqli->real_escape_string($login).'\'';
+ $resultat = $mysqli->query('SELECT id FROM utilisateurs WHERE login = '.$mysqli->real_escape_string($login)." AND id != ${_SESSION['id']}");
+ if ( $resultat->num_rows )
+ exit('{"etat":"nok","message":"Adresse électronique non disponible"}');
+ $requete['login'] = $login;
}
- // Token de connexion automatique
- if ( !strlen($permconn = $_SESSION['permconn']) && isset($_REQUEST['permconn']) )
+ // Token de connexion automatique à ajouter si non déjà présent et demandé
+ if ( !$_SESSION['permconn'] && isset($_REQUEST['permconn']) ) {
+ $permconn = '';
for ( $i = 0; $i < 10; $i++ )
$permconn .= '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'[random_int(0,61)];
- elseif ( !isset($_REQUEST['permconn']) )
- $permconn = '';
- $timeout = ( $timeout > 15 ) ? $timeout : 900;
- if ( requete('utilisateurs',"UPDATE utilisateurs SET timeout = $timeout$requete_login, permconn = '$permconn' WHERE id = ${_SESSION['id']}",$mysqli) ) {
+ $requete['permconn'] = $permconn;
+ }
+ elseif ( $_SESSION['permconn'] && !isset($_REQUEST['permconn']) )
+ $requete['permconn'] = '';
+ // Timeout
+ if ( ( $timeout = ( $timeout > 15 ) ? $timeout : 900 ) != $_SESSION['timeout'] )
+ $requete['timeout'] = $timeout;
+ if ( !$requete )
+ exit('{"etat":"nok","message":"Aucune modification à faire"}');
+ # Éxécution
+ if ( requete('utilisateurs','UPDATE utilisateurs SET ' .fabriqueupdate($requete,$mysqli) . " WHERE id = ${_SESSION['id']}",$mysqli) ) {
// Mise à jour des données de session et cookies
- $_SESSION['timeout'] = $timeout;
- $_SESSION['time'] = time()+$_SESSION['timeout'];
- $_SESSION['permconn'] = $permconn;
- setcookie('loginpermanent',$permconn,( strlen($permconn) ) ? time()+31536000 : time()-3600);
- if ( strlen($requete_login) )
+ if ( isset($requete['login']) )
$_SESSION['login'] = $login;
+ if ( isset($requete['timeout']) ) {
+ $_SESSION['timeout'] = $timeout;
+ $_SESSION['time'] = time()+$_SESSION['timeout'];
+ }
+ if ( isset($requete['permconn']) ) {
+ $_SESSION['permconn'] = $permconn;
+ setcookie('CDP_SESSION_PERM',$permconn,( $permconn ) ? time()+31536000 : time()-3600,$chemin,$domaine,true);
+ }
+ // Si interface globale activée, mise à jour
+ if ( $interfaceglobale ) {
+ include("${interfaceglobale}majutilisateurs.php");
+ majutilisateurs($_SESSION['id'],$requete);
+ }
exit('{"etat":"ok","message":"Vos préférences de connexion ont été modifiées."}');
}
exit('{"etat":"nok","message":"Votre compte n\'a pas été modifié. Erreur MySQL n°'.$mysqli->errno.', «'.$mysqli->error.'»."}');
}
- // Quatrième cadre de modifications de prefs.php : envoi de courriel
- if ( ( $_REQUEST['id'] == 4 ) && isset($_REQUEST['mailexp']) ) {
- // Compte élève : modification possible seulement si envoi de courriel déjà possible
- if ( $autorisation == 2 ) {
- if ( $_SESSION['mailenvoi'] == 0 )
- exit('{"etat":"nok","message":"Ce réglage n\'est pas autorisé."}');
- if ( !strlen($mailexp = strip_tags(trim($_REQUEST['mailexp']))) )
- exit('{"etat":"nok","message":"Votre compte n\'a pas été modifié. Le nom d\'expéditeur doit être non vide."}');
- if( requete('utilisateurs','UPDATE utilisateurs SET mailexp = \''.$mysqli->real_escape_string($mailexp).'\', mailcopie = '.intval(isset($_REQUEST['mailcopie']))." WHERE id = ${_SESSION['id']}",$mysqli) )
- exit('{"etat":"ok","message":"Vos préférences d\'envoi de mail ont été modifiées."}');
- exit('{"etat":"nok","message":"Votre compte n\'a pas été modifié. Erreur MySQL n°'.$mysqli->errno.', «'.$mysqli->error.'»."}' );
- }
- // Autres types de comptes
- // Interdiction de vider mailexp si on souhaite garder l'envoi possible
- $mailexp = strip_tags(trim($_REQUEST['mailexp']));
- if ( ( $mailenvoi = intval(isset($_REQUEST['mailenvoi'])) ) && !strlen($mailexp) )
+ // Cinquième cadre de modifications de prefs.php : envoi de courriel
+ if ( ( $_REQUEST['id'] == 5 ) && isset($_REQUEST['mailexp']) ) {
+ // Réglages disponibles seulement si autorisé globalement
+ $resultat = $mysqli->query('SELECT val FROM prefs WHERE nom = "autorisation_mails"');
+ if ( !( $resultat->fetch_row()[0] >> 4*($autorisation-2) & 15 ) )
+ exit('{"etat":"nok","message":"Ce réglage n\'est pas autorisé.'.$a.'-'.$autorisation.'"}');
+ $resultat->free();
+ // Pas d'envoi si l'adresse électronique est vide
+ if ( !$r['mail'] )
+ exit('{"etat":"nok","message":"Vous ne pourrez pas envoyer de courriels sans adresse électronique. Vous devez la saisir avant de modifier ces préférences."}');
+ if ( !( $mailexp = $mysqli->real_escape_string(strip_tags(trim($_REQUEST['mailexp']))) ) )
exit('{"etat":"nok","message":"Votre compte n\'a pas été modifié. Le nom d\'expéditeur doit être non vide."}');
- // Interdiction d'envoyer si l'adresse électronique est vide
- if ( $mailenvoi && !strlen($r['mail']) )
- exit('{"etat":"nok","message":"Votre compte n\'a pas été modifié. Il est impossible d\'envoyer des courriels sans adresse électronique."}');
- if ( requete('utilisateurs','UPDATE utilisateurs SET mailexp = \''.$mysqli->real_escape_string($mailexp)."', mailenvoi = $mailenvoi, mailcopie = ".intval(isset($_REQUEST['mailcopie'])).', mailliste = '.intval(isset($_REQUEST['mailliste']))." WHERE id = ${_SESSION['id']}",$mysqli) ) {
- $_SESSION['mailenvoi'] = $mailenvoi;
- exit('{"etat":"ok","message":"Vos préférences d\'envoi de mail ont été modifiées."}');
- }
+ // Éxécution
+ if ( requete('utilisateurs',"UPDATE utilisateurs SET mailexp = '$mailexp', mailcopie = ".intval(isset($_REQUEST['mailcopie']))." WHERE id = ${_SESSION['id']}",$mysqli) )
+ exit('{"etat":"ok","message":"Vos préférences d\'envoi de courriel ont été modifiées."}');
exit('{"etat":"nok","message":"Votre compte n\'a pas été modifié. Erreur MySQL n°'.$mysqli->errno.', «'.$mysqli->error.'»."}');
}
@@ -476,7 +543,7 @@
exit('{"etat":"nok","message":"Il n\'a pas d\'heure de colle à relever aujourd\'hui."}');
if ( requete('heurescolles','UPDATE heurescolles SET releve=CURDATE() WHERE releve=0', $mysqli) )
exit($_SESSION['message'] = '{"etat":"ok","message":"De nouvelles heures de colles ont été relevées et apparaissent dans le tableau général."}');
- exit('{"etat":"nok","message":"L\'information n\'a pas été modifiée. Erreur MySQL n°'.$mysqli->errno.', «'.$mysqli->error.'»."}');
+ exit('{"etat":"nok","message":"La relève n\'a pas été réalisée. Erreur MySQL n°'.$mysqli->errno.', «'.$mysqli->error.'»."}');
}
/////////////////////////////////////////////////
@@ -502,27 +569,30 @@
$r = $resultat->fetch_assoc();
$resultat->free();
- // Traitement d'une modification
- if ( isset($_REQUEST['champ']) && in_array($champ = $_REQUEST['champ'],array('titre','texte')) ) {
+ // Traitement d'une modification : titre, texte, protection
+ if ( isset($_REQUEST['champ']) ) {
$valeur = trim($mysqli->real_escape_string($_REQUEST['val']));
- if ( ( $champ == 'texte' ) && ( !strlen($valeur) ) )
- exit('{"etat":"nok","message":"L\'information n\'a pas été modifiée. Le texte doit être non vide."}');
- elseif ( requete('infos',"UPDATE infos SET $champ = '$valeur' WHERE id = $id",$mysqli) ) {
- recent($mysqli,1,$id,$r['mat'],( $champ == 'titre' ) ? array('titre'=>( $valeur ?: 'Information')) : array('texte'=>$valeur));
- exit('{"etat":"ok","message":"L\'information a été modifiée."}');
- }
- exit('{"etat":"nok","message":"L\'information n\'a pas été modifiée. Erreur MySQL n°'.$mysqli->errno.', «'.$mysqli->error.'»."}');
- }
-
- // Changement de protection
- if ( isset($_REQUEST['champ']) && ( $_REQUEST['champ'] == 'protection' ) && ctype_digit($valeur = $_REQUEST['val']) ) {
- if ( $r['protection'] == $valeur )
- exit('{"etat":"nok","message":"La protection de l\'information n\'a pas été modifiée car elle est inchangée."}');
- if ( requete('infos',"UPDATE infos SET protection = $valeur WHERE id = $id",$mysqli) ) {
- recent($mysqli,1,$id,$r['mat'],array('protection'=>$valeur));
- exit('{"etat":"ok","message":"L\'information a été modifiée."}');
- }
- exit('{"etat":"nok","message":"L\'information n\'a pas été modifiée. Erreur MySQL n°'.$mysqli->errno.', «'.$mysqli->error.'»."}');
+ $champ = $_REQUEST['champ'];
+ if ( isset($r[$champ = $_REQUEST['champ']]) && ( $r[$champ] == $valeur ) )
+ exit('{"etat":"nok","message":"L\'information n\'a pas été modifiée."}');
+ if ( $champ == 'titre' )
+ exit( requete('infos',"UPDATE infos SET titre = '$valeur' WHERE id = $id",$mysqli)
+ && recent($mysqli,1,$id,array('titre'=>$valeur),false)
+ ? '{"etat":"ok","message":"Le titre de l\'information a été modifié."}'
+ : '{"etat":"nok","message":"L\'information n\'a pas été modifiée. Erreur MySQL n°'.$mysqli->errno.', «'.$mysqli->error.'»."}');
+ if ( $champ == 'texte' ) {
+ if ( !$valeur )
+ exit('{"etat":"nok","message":"L\'information n\'a pas été modifiée. Le texte doit être non vide."}');
+ exit( requete('infos',"UPDATE infos SET texte = '$valeur' WHERE id = $id",$mysqli)
+ && recent($mysqli,1,$id,array('texte'=>$valeur),isset($_REQUEST['publi']))
+ ? '{"etat":"ok","message":"Le texte de l\'information a été modifié."}'
+ : '{"etat":"nok","message":"L\'information n\'a pas été modifiée. Erreur MySQL n°'.$mysqli->errno.', «'.$mysqli->error.'»."}');
+ }
+ if ( ( $champ == 'protection' ) && ctype_digit($valeur = $_REQUEST['val']) )
+ exit( requete('infos',"UPDATE infos SET protection = $valeur WHERE id = $id",$mysqli)
+ && recent($mysqli,1,$id,array('protection'=>$valeur),false)
+ ? '{"etat":"ok","message":"La protection de l\'information a été modifiée."}'
+ : '{"etat":"nok","message":"L\'information n\'a pas été modifiée. Erreur MySQL n°'.$mysqli->errno.', «'.$mysqli->error.'»."}');
}
// Déplacement vers le haut
@@ -538,32 +608,24 @@
: '{"etat":"nok","message":"L\'information n\'a pas été déplacée. Erreur MySQL n°'.$mysqli->errno.', «'.$mysqli->error.'»."}');
// Positionnement "montré" (apparaît sur la partie publique)
- if ( isset($_REQUEST['montre']) ) {
- if ( requete('infos',"UPDATE infos SET cache = 0 WHERE id = $id",$mysqli) ) {
- recent($mysqli,1,$id,$r['mat'],array('titre'=>( strlen($r['titre']) ? $mysqli->real_escape_string($r['titre']) : 'Information'), 'lien'=>".?${r['cle']}", 'texte'=>$mysqli->real_escape_string($r['texte']), 'matiere'=>$r['mat'], 'protection'=>$r['protection']));
- exit('{"etat":"ok","message":"L\'information apparaît désormais sur la partie publique."}');
- }
- exit('{"etat":"nok","message":"L\'information n\'a pas été diffusée. Erreur MySQL n°'.$mysqli->errno.', «'.$mysqli->error.'»."}');
- }
+ if ( isset($_REQUEST['montre']) )
+ exit( requete('infos',"UPDATE infos SET cache = 0 WHERE id = $id",$mysqli)
+ && recent($mysqli,1,$id,array('matiere'=>$r['mat'],'titre'=>( strlen($r['titre']) ? $mysqli->real_escape_string($r['titre']) : 'Information'), 'lien'=>".?${r['cle']}", 'texte'=>$mysqli->real_escape_string($r['texte']), 'protection'=>$r['protection']) )
+ ? '{"etat":"ok","message":"L\'information apparaît désormais sur la partie publique."}'
+ : '{"etat":"nok","message":"L\'information n\'a pas été diffusée. Erreur MySQL n°'.$mysqli->errno.', «'.$mysqli->error.'»."}');
// Positionnement "caché" (n'apparaît pas sur la partie publique)
- if ( isset($_REQUEST['cache']) ) {
- if ( requete('infos',"UPDATE infos SET cache = 1 WHERE id = $id",$mysqli) ) {
- recent($mysqli,1,$id,$r['mat']);
- exit('{"etat":"ok","message":"L\'information n\'apparaît plus sur la partie publique mais est toujours disponible ici pour modification ou diffusion."}');
- }
- exit('{"etat":"nok","message":"L\'information n\'a pas été cachée. Erreur MySQL n°'.$mysqli->errno.', «'.$mysqli->error.'»."}');
- }
+ if ( isset($_REQUEST['cache']) )
+ exit( requete('infos',"UPDATE infos SET cache = 1 WHERE id = $id",$mysqli) && recent($mysqli,1,$id)
+ ? '{"etat":"ok","message":"L\'information n\'apparaît plus sur la partie publique mais est toujours disponible ici pour modification ou diffusion."}'
+ : '{"etat":"nok","message":"L\'information n\'a pas été cachée. Erreur MySQL n°'.$mysqli->errno.', «'.$mysqli->error.'»."}');
// Suppression
- if ( isset($_REQUEST['supprime']) ) {
- if ( requete('infos',"DELETE FROM infos WHERE id = $id",$mysqli)
- && requete('infos',"UPDATE infos SET ordre = (ordre-1) WHERE ordre > ${r['ordre']} AND page = ${r['page']}",$mysqli) ) {
- recent($mysqli,1,$id,$r['mat']);
- exit('{"etat":"ok","message":"Suppression réalisée"}');
- }
- exit('{"etat":"nok","message":"L\'information n\'a pas été supprimée. Erreur MySQL n°'.$mysqli->errno.', «'.$mysqli->error.'»."}');
- }
+ if ( isset($_REQUEST['supprime']) )
+ exit( requete('infos',"DELETE FROM infos WHERE id = $id",$mysqli) && recent($mysqli,1,$id)
+ && requete('infos',"UPDATE infos SET ordre = (ordre-1) WHERE ordre > ${r['ordre']} AND page = ${r['page']}",$mysqli)
+ ? '{"etat":"ok","message":"Suppression réalisée"}'
+ : '{"etat":"nok","message":"L\'information n\'a pas été supprimée. Erreur MySQL n°'.$mysqli->errno.', «'.$mysqli->error.'»."}');
}
/////////////////////////////
@@ -577,26 +639,30 @@
$r = $resultat->fetch_assoc();
$resultat->free();
// Génération de la valeur de protection
+ // $val est un tableau contenant soit 0, soit 32, soit 6 puis les valeurs des types de comptes autorisés
if ( !count($val = array_filter($_REQUEST['protection'],function($id) { return ctype_digit($id); })) )
exit('{"etat":"nok","message":"L\'information n\'a pas été ajoutée. La protection d\'accès est incorrecte."}');
- if ( ( $val[0] == 0 ) || ( $val[0] == 32 ) )
- $protection = $val[0];
- else {
- $protection = 32;
- foreach (array_slice($val,1) as $v)
- $protection = $protection-2**($v-1);
- }
+ $protection = ( ( $val[0] == 0 ) || ( $val[0] == 32 ) ) ? $val[0] : array_reduce($val, function($s,$v) { return $s - ( ( $v<6 ) ? 1<<($v-1) : 0 ); }, 32);
// Autres données
$titre = trim($mysqli->real_escape_string($_REQUEST['titre']));
$texte = trim($mysqli->real_escape_string($_REQUEST['texte']));
$cache = intval(isset($_REQUEST['cache']));
- if ( !strlen($texte) )
+ if ( !$texte )
exit('{"etat":"nok","message":"L\'information n\'a pas été ajoutée. Le texte doit être non vide."}');
// Écriture
if ( requete('infos',"UPDATE infos SET ordre = (ordre+1) WHERE page = $page",$mysqli)
&& requete('infos',"INSERT INTO infos SET ordre = 1, page = $page, texte = '$texte', titre = '$titre', cache = $cache, protection = $protection",$mysqli) ) {
- if ( !$cache )
- recent($mysqli,1,$mysqli->insert_id,$r['mat'],array('titre'=>( $titre ?: 'Information'), 'lien'=>".?${r['cle']}", 'texte'=>$texte, 'matiere'=>$r['mat'], 'protection'=>$protection));
+ $id = $mysqli->insert_id;
+ if ( !$cache ) {
+ $titre = ( $titre ?: 'Information');
+ if ( $page > 1 ) {
+ $resultat = $mysqli->query("SELECT CONCAT( ' [', IF(mat=0,'',CONCAT(m.nom,'/')),p.nom,']')
+ FROM pages AS p LEFT JOIN matieres AS m ON mat=m.id WHERE p.id = $page");
+ $titre .= $mysqli->real_escape_string($resultat->fetch_row()[0]);
+ $resultat->free();
+ }
+ recent($mysqli,1,$id,array('matiere'=>$r['mat'], 'titre'=>$titre, 'lien'=>".?${r['cle']}", 'texte'=>$texte, 'protection'=>$protection));
+ }
$mysqli->query('ALTER TABLE infos ORDER BY page,ordre');
exit($_SESSION['message'] = '{"etat":"ok","message":"L\'information a été ajoutée."}');
}
@@ -619,98 +685,98 @@
if ( isset($_REQUEST['champ']) && ( $_REQUEST['champ'] == 'nom' ) ) {
if ( !$r['parent'] )
exit('{"etat":"nok","message":"Le nom des répertoires racine des matières ne sont pas modifiables."}');
- if ( !strlen($valeur = trim($mysqli->real_escape_string($_REQUEST['val'])) ) )
+ if ( !($valeur = trim($mysqli->real_escape_string($_REQUEST['val'])) ) )
exit("{\"etat\":\"nok\",\"message\":\"Le répertoire ${r['nom']} n'a pas été modifié. Le nom doit être non vide.\"}");
- if ( !requete('reps',"UPDATE reps SET nom = '$valeur' WHERE id = $id",$mysqli) )
- exit("{\"etat\":\"nok\",\"message\":\"Le nom du répertoire ${r['nom']} n'a pas été modifié. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'»."}');
- exit("{\"etat\":\"ok\",\"message\":\"Le nom du répertoire ${r['nom']} a été modifié.}");
+ exit( requete('reps',"UPDATE reps SET nom = '$valeur' WHERE id = $id",$mysqli)
+ && requete('recents',"UPDATE recents SET texte = ( SELECT CONCAT(ext,'|',taille,'|',d.parent,'|',GROUP_CONCAT( r.nom ORDER BY FIND_IN_SET(r.id,d.parents) SEPARATOR '/' ))
+ FROM docs AS d LEFT JOIN reps AS r ON FIND_IN_SET(r.id,d.parents) WHERE d.id = recents.id GROUP BY d.id )
+ WHERE type = 3 AND id IN (SELECT docs.id FROM docs WHERE FIND_IN_SET($id,parents))",$mysqli)
+ && rss($mysqli,$r['matiere'],0)
+ ? "{\"etat\":\"ok\",\"message\":\"Le nom du répertoire ${r['nom']} a été modifié.}"
+ : "{\"etat\":\"nok\",\"message\":\"Le nom du répertoire ${r['nom']} n'a pas été modifié. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'»."}');
}
// Traitement d'une modification globale
if ( isset($_REQUEST['protection']) ) {
- $requete = $message = array();
- $etat = 'ok';
- // Modification du nom, de l'affichage dans le menu uniquement si pas à la racine
+ $etat = 'nok';
+ // Modification du nom et de l'affichage dans le menu uniquement si pas à la racine
if ( $r['parent'] && isset($_REQUEST['nom']) ) {
- if ( strlen( $nom = trim($mysqli->real_escape_string($_REQUEST['nom'])) ) && ( $nom != $r['nom'] ) )
- $requete[] = "nom = '$nom'";
- $menu = intval(isset($_REQUEST['menu']));
- if ( $menu != $r['menu'] )
- $requete[] = "menu = $menu";
+ if ( ( $nom = trim($mysqli->real_escape_string($_REQUEST['nom'])) ) && ( $nom != $r['nom'] ) ) {
+ if ( !requete('reps', "UPDATE reps SET nom = '$nom' WHERE id = $id",$mysqli)
+ || !requete('recents',"UPDATE recents SET texte = ( SELECT CONCAT(ext,'|',taille,'|',d.parent,'|',GROUP_CONCAT( r.nom ORDER BY FIND_IN_SET(r.id,d.parents) SEPARATOR '/' ))
+ FROM docs AS d LEFT JOIN reps AS r ON FIND_IN_SET(r.id,d.parents) WHERE d.id = recents.id GROUP BY d.id )
+ WHERE type = 3 AND id IN (SELECT docs.id FROM docs WHERE FIND_IN_SET($id,parents))",$mysqli) )
+ exit("{\"etat\":\"nok\",\"message\":\"Le nom du répertoire ${r['nom']} n'a pas été modifié. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'»."}');
+ rss($mysqli,$r['matiere'],0);
+ // Mise à jour de l'ordre des répertoires
+ $mysqli->query('ALTER TABLE reps ORDER BY parents,nom');
+ $etat = 'ok';
+ }
+ if ( ( $menu = intval(isset($_REQUEST['menu']))) != $r['menu'] ) {
+ requete('reps', "UPDATE reps SET menu = 1-menu WHERE id = $id",$mysqli);
+ $etat = 'ok';
+ }
}
+
// Génération de la valeur de protection
- if ( count($val = array_filter($_REQUEST['protection'],function($id) { return ctype_digit($id); })) ) {
- if ( ( $val[0] == 0 ) || ( $val[0] == 32 ) )
- $protection = $val[0];
- else {
- $protection = 32;
- foreach (array_slice($val,1) as $v)
- $protection = $protection-2**($v-1);
- }
- if ( $protection != $r['protection'] )
- $requete[] = "protection = $protection";
- }
- if ( $requete ) {
- if ( requete('reps','UPDATE reps SET '.implode(', ',$requete)." WHERE id = $id",$mysqli) )
- $message[] = "Le répertoire ${r['nom']} a été modifié.";
- else {
- $message[] = "Le répertoire ${r['nom']} n'a pas été modifié. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'».';
- $etat = 'nok';
- }
+ // $val est un tableau contenant soit 0, soit 32, soit 6 puis les valeurs des types de comptes autorisés
+ // Pas de modification de la table recents ici : seule la protection du répertoire change
+ if ( count($val = array_filter($_REQUEST['protection'],function($id) { return ctype_digit($id); }))
+ && ( $r['protection'] != ( $protection = ( ( $val[0] == 0 ) || ( $val[0] == 32 ) ) ? $val[0] : array_reduce($val, function($s,$v) { return $s - ( ( $v<6 ) ? 1<<($v-1) : 0 ); }, 32) ) ) ) {
+ if ( !requete('reps', "UPDATE reps SET protection = $protection WHERE id = $id",$mysqli) )
+ exit("{\"etat\":\"nok\",\"message\":\"La protection du répertoire ${r['nom']} n'a pas été modifiée. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'»."}');
+ // Modification de la matière si protection du répertoire racine modifié
+ if ( !$r['parent'] && $r['matiere'] )
+ requete('matieres',"UPDATE matieres SET docs_protection = $protection WHERE id = ${r['matiere']}",$mysqli);
+ $etat = 'ok';
+ // Pour une éventuelle propagation
+ $r['protection'] = $protection;
}
+
// Déplacement du répertoire si $_REQUEST['parent'] non nul et si pas à la racine
- if ( $r['parent'] && isset($_REQUEST['parent']) && !in_array($parent = intval($_REQUEST['parent']),array(0,$id,$r['parent'])) ) {
- // Vérification du répertoire parent
+ if ( $r['parent'] && isset($_REQUEST['parent']) && ctype_digit($parent = $_REQUEST['parent']) && !in_array($parent,array(0,$id,$r['parent'])) ) {
+ // Vérification du nouveau répertoire parent
$resultat = $mysqli->query("SELECT parents, matiere FROM reps WHERE id = $parent AND FIND_IN_SET(matiere,'${_SESSION['matieres']}') AND NOT FIND_IN_SET($id,parents)");
- if ( $resultat->num_rows) {
- $s = $resultat->fetch_assoc();
- $resultat->free();
- $mat = $s['matiere'];
- $parents = "${s['parents']},$parent";
- if ( requete('reps',"UPDATE reps SET matiere = $mat, parent = $parent, parents = '$parents' WHERE id = $id",$mysqli)
- && requete('reps',"UPDATE reps SET matiere = $mat, parents = '$parents,$id' WHERE parent = $id",$mysqli)
- && requete('docs',"UPDATE docs SET matiere = $mat, parents = '$parents,$id' WHERE parent = $id",$mysqli)
- && $mysqli->query('UPDATE matieres SET docs = (SELECT IF(COUNT(*),1,0) FROM docs WHERE matiere = matieres.id AND protection < 32)') )
- $message[] = "Le répertoire ${r['nom']} a été déplacé.";
- else {
- $message[] = "Le répertoire ${r['nom']} n'a pas été déplacé. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'».';
- $etat = 'nok';
- }
- }
- else {
- $message[] = "Le répertoire ${r['nom']} n'a pas été déplacé. Identifiant de répertoire parent non valide.";
- $etat = 'nok';
- }
- }
- // Reconstruction du message
- if ( $message ) {
- // Mise à jour de l'ordre des répertoires
+ if ( !$resultat->num_rows)
+ exit("{\"etat\":\"nok\",\"message\":\"Le répertoire ${r['nom']} n'a pas été déplacé. Identifiant de répertoire parent non valide.\"}");
+ $s = $resultat->fetch_assoc();
+ $resultat->free();
+ $mat = $s['matiere'];
+ $parents = "${s['parents']},$parent";
+ if ( !requete('reps',"UPDATE reps SET matiere = $mat, parent = $parent, parents = '$parents' WHERE id = $id",$mysqli)
+ || !requete('reps',"UPDATE reps SET matiere = $mat, parents = '$parents,$id' WHERE parent = $id",$mysqli)
+ || !requete('docs',"UPDATE docs SET matiere = $mat, parents = '$parents,$id' WHERE parent = $id",$mysqli)
+ || !requete('recents',"UPDATE recents SET matiere = $mat,
+ texte = ( SELECT CONCAT(ext,'|',taille,'|',d.parent,'|',GROUP_CONCAT( r.nom ORDER BY FIND_IN_SET(r.id,d.parents) SEPARATOR '/' ))
+ FROM docs AS d LEFT JOIN reps AS r ON FIND_IN_SET(r.id,d.parents) WHERE d.id = recents.id GROUP BY d.id )
+ WHERE type = 3 AND id IN (SELECT docs.id FROM docs WHERE FIND_IN_SET($id,parents))",$mysqli)
+ || !rss($mysqli, ( $r['matiere'] != $mat ) ? array($r['matiere'],$mat) : $mat, 0) )
+ exit("{\"etat\":\"nok\",\"message\":\"Le répertoire ${r['nom']} n'a pas été déplacé. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'»."}');
+ // Mise à jour du menu et de l'ordre des répertoires
+ $mysqli->query("UPDATE matieres SET docs = (SELECT IF(COUNT(*),1,0) FROM docs WHERE matiere = matieres.id AND protection < 32) WHERE id = ${r['matiere']} OR id = $mat");
$mysqli->query('ALTER TABLE reps ORDER BY parents,nom');
- if ( $etat == 'nok')
- exit('{"etat":"nok","message":"'.implode(', ',$message).'"}');
- // Modification de la matière si protection du répertoire racine modifié
- if ( !$r['parent'] && $r['matiere'] && $protection != $r['protection'] )
- requete('matieres',"UPDATE matieres SET docs_protection = $protection WHERE id = ${r['matiere']}",$mysqli);
- exit($_SESSION['message'] = '{"etat":"ok","message":"'.implode(', ',$message).'"}');
+ $etat = 'ok';
}
- exit("{\"etat\":\"nok\",\"message\":\"Le répertoire ${r['nom']} n'a pas été modifié. Aucune modification demandée.\"}");
+
+ // Propagation des droits d'accès aux sous-répertoires et documents
+ if ( isset($_REQUEST['propage']) ) {
+ if ( requete('reps',"UPDATE reps SET protection = ${r['protection']} WHERE FIND_IN_SET($id,parents)",$mysqli)
+ && requete('docs',"UPDATE docs SET protection = ${r['protection']} WHERE FIND_IN_SET($id,parents)",$mysqli)
+ && requete('recents',"UPDATE recents SET protection = ${r['protection']} WHERE type = 3 AND id IN (SELECT docs.id FROM docs WHERE FIND_IN_SET($id,parents))",$mysqli)
+ && rss($mysqli,$r['matiere'],0) ) {
+ // Mise à jour de la matière (menu)
+ $mysqli->query("UPDATE matieres SET docs = (SELECT IF(COUNT(*),1,0) FROM docs WHERE matiere = ${r['matiere']} AND protection < 32) WHERE id = ${r['matiere']}");
+ exit($_SESSION['message'] = "{\"etat\":\"ok\",\"message\":\"Le réglage d'accès du répertoire ${r['nom']} a été propagé à tous les documents et sous-répertoires qu'il contient.\"}");
+ }
+ exit("{\"etat\":\"nok\",\"message\":\"Le réglage d'accès du répertoire ${r['nom']} n'a pas été propagé. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'»."}');
+ }
+
+ // Si pas de modification
+ if ( $etat == 'nok' )
+ exit("{\"etat\":\"nok\",\"message\":\"Le répertoire ${r['nom']} n'a pas été modifié. Aucune modification demandée.\"}");
+ exit($_SESSION['message'] = "{\"etat\":\"ok\",\"message\":\"Le répertoire ${r['nom']} a été modifié.\"}");
}
- // Propagation des droits d'accès aux sous-répertoires et documents
- // Les infos récentes sont modifiées dans la base, mais les flux RSS
- // ne seront affectés qu'à la prochaine exécution de recents() et donc rss()
- if ( isset($_REQUEST['propage']) ) {
- if ( requete('reps',"UPDATE reps SET protection = ${r['protection']} WHERE FIND_IN_SET($id,parents)",$mysqli) && requete('docs',"UPDATE docs SET protection = ${r['protection']} WHERE FIND_IN_SET($id,parents)",$mysqli) ) {
- // Mise à jour des informations récentes
- requete('recents',"UPDATE recents SET protection = ${r['protection']} WHERE id IN (SELECT 3000+docs.id FROM docs WHERE FIND_IN_SET($id,parents))",$mysqli);
- rss($mysqli, ( $r['matiere'] == 0 ) ? array(0) : array(0,$r['matiere']) );
- // Mise à jour de la matière (menu)
- $mysqli->query('UPDATE matieres SET docs = (SELECT IF(COUNT(*),1,0) FROM docs WHERE matiere = matieres.id AND protection < 32)');
- exit($_SESSION['message'] = "{\"etat\":\"ok\",\"message\":\"Le réglage d'accès du répertoire ${r['nom']} a été propagé à tous les documents et sous-répertoires qu'il contient.\"}");
- }
- exit("{\"etat\":\"nok\",\"message\":\"Le réglage d'accès du répertoire ${r['nom']} n'a pas été propagé. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'»."}');
- }
-
// Suppression du répertoire ou de son contenu
if ( isset($_REQUEST['supprime']) || isset($_REQUEST['vide']) ) {
if ( isset($_REQUEST['supprime']) ) {
@@ -724,22 +790,24 @@
$requete = '';
}
if ( requete('reps',"DELETE FROM reps WHERE $requete FIND_IN_SET($id,parents)",$mysqli) ) {
- // Suppression physique
+ // Suppression physique des documents
$resultat = $mysqli->query("SELECT lien FROM docs WHERE FIND_IN_SET($id,parents)");
if ( $resultat->num_rows ) {
while ( $s = $resultat->fetch_row() )
exec("rm -rf documents/${s[0]}");
$resultat->free();
- if ( !requete('docs',"DELETE FROM docs WHERE FIND_IN_SET($id,parents)",$mysqli) )
+ if ( !requete('recents',"DELETE FROM recents WHERE type = 3 AND id IN (SELECT docs.id FROM docs WHERE FIND_IN_SET($id,parents))",$mysqli)
+ || !requete('docs',"DELETE FROM docs WHERE FIND_IN_SET($id,parents)",$mysqli)
+ || !rss($mysqli,$r['matiere'],0) )
exit("{\"etat\":\"nok\",\"message\":\"Le répertoire ${r['nom']} n'a pas été correctement $action. Certains documents sont encore dans la base de données. Vous devriez en informer l'administrateur. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'»."}');
}
- $mysqli->query('UPDATE matieres SET docs = (SELECT IF(COUNT(*),1,0) FROM docs WHERE matiere = matieres.id AND protection < 32)');
+ // Mise à jour de la matière (menu)
+ $mysqli->query("UPDATE matieres SET docs = (SELECT IF(COUNT(*),1,0) FROM docs WHERE matiere = ${r['matiere']} AND protection < 32) WHERE id = ${r['matiere']}");
if ( $action == 'vidé' )
exit($_SESSION['message'] = "{\"etat\":\"ok\",\"message\":\"Le répertoire ${r['nom']} a été vidé de son contenu, ainsi que tous ses sous-répertoires.\"}");
exit("{\"etat\":\"ok\",\"message\":\"Le répertoire ${r['nom']} a été supprimé, ainsi que tous ses sous-répertoires et ses documents.\"}");
}
- else
- exit("{\"etat\":\"nok\",\"message\":\"Le répertoire ${r['nom']} n'a pas été $action. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'»."}');
+ exit("{\"etat\":\"nok\",\"message\":\"Le répertoire ${r['nom']} n'a pas été $action. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'»."}');
}
}
@@ -755,20 +823,12 @@
$resultat->free();
$menu = intval(isset($_REQUEST['menu']));
// Génération de la valeur de protection
- if ( count($val = array_filter($_REQUEST['protection'],function($id) { return ctype_digit($id); })) ) {
- if ( ( $val[0] == 0 ) || ( $val[0] == 32 ) )
- $protection = $val[0];
- else {
- $protection = 32;
- foreach (array_slice($val,1) as $v)
- $protection = $protection-2**($v-1);
- }
- }
- else
- $protection = $r['protection'];
+ $protection = ( count($val = array_filter($_REQUEST['protection'],function($id) { return ctype_digit($id); })) )
+ ? ( ( ( $val[0] == 0 ) || ( $val[0] == 32 ) ) ? $val[0] : array_reduce($val, function($s,$v) { return $s - ( ( $v<6 ) ? 1<<($v-1) : 0 ); }, 32) )
+ : $r['protection'];
if ( !requete('reps',"INSERT INTO reps SET parent = $parent, parents = '${r['parents']},$parent', nom = '$nom', matiere = ${r['matiere']}, protection = $protection, menu = $menu",$mysqli) )
exit('{"etat":"nok","message":"Le répertoire n\'a pas été ajouté. Erreur MySQL n°'.$mysqli->errno.', «'.$mysqli->error.'»."}');
- // Mise à jour
+ // Mise à jour de l'ordre des répertoires
$mysqli->query('ALTER TABLE reps ORDER BY parents,nom');
exit($_SESSION['message'] = "{\"etat\":\"ok\",\"message\":\"Le répertoire $nom a été ajouté.\"}");
}
@@ -786,152 +846,106 @@
// Traitement d'une modification unique (nom)
if ( isset($_REQUEST['champ']) && ( $_REQUEST['champ'] == 'nom' ) ) {
- if ( !strlen( $valeur = trim($_REQUEST['val']) ) )
+ if ( !( $valeur = trim($_REQUEST['val']) ) )
exit("{\"etat\":\"nok\",\"message\":\"Le nom du document ${r['nom']} n'a pas été modifié. Le nom doit être non vide.\"}");
- if ( $valeur != $r['nom'] ) {
- setlocale(LC_CTYPE, "fr_FR.UTF-8");
- $nom = substr((str_replace(array($r['ext'],'\\','/'),array('','-','-'),$valeur)),0,100);
- // real_escape_string seulement pour la requête SQL
- $nouveau_nom = $mysqli->real_escape_string($nom);
- if ( !requete('docs',"UPDATE docs SET nom = '$nouveau_nom', nom_nat = '".zpad($nouveau_nom)."' WHERE id = $id",$mysqli) )
- exit("{\"etat\":\"nok\",\"message\":\"Le nom du document ${r['nom']} n'a pas été modifié. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'»."}');
- exec('mv documents/'.escapeshellarg("${r['lien']}/${r['nom']}${r['ext']}").' documents/'.escapeshellarg("${r['lien']}/$nom${r['ext']}"));
- $mysqli->query('ALTER TABLE docs ORDER BY parents,nom_nat');
- // Modification de l'éventuelle information récente
- if ( $r['protection'] < 32 )
- recent($mysqli,3,$id,$r['matiere'],array('nom'=>$nouveau_nom,'ancien_nom'=>$r['nom']));
- exit("{\"etat\":\"ok\",\"message\":\"Le nom du document ${r['nom']} a été modifié.\"}");
- }
- exit("{\"etat\":\"nok\",\"message\":\"Le nom du document ${r['nom']} n'a pas été modifié. Aucune modification demandée.\"}");
+ if ( $valeur == $r['nom'] )
+ exit("{\"etat\":\"nok\",\"message\":\"Le nom du document ${r['nom']} n'a pas été modifié. Aucune modification demandée.\"}");
+ setlocale(LC_CTYPE, "fr_FR.UTF-8");
+ $nom = substr((str_replace(array($r['ext'],'\\','/'),array('','-','-'),$valeur)),0,100);
+ // real_escape_string seulement pour la requête SQL
+ $nouveau_nom = $mysqli->real_escape_string($nom);
+ if ( !requete('docs',"UPDATE docs SET nom = '$nouveau_nom', nom_nat = '".zpad($nouveau_nom)."' WHERE id = $id",$mysqli) )
+ exit("{\"etat\":\"nok\",\"message\":\"Le nom du document ${r['nom']} n'a pas été modifié. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'»."}');
+ exec('mv documents/'.escapeshellarg("${r['lien']}/${r['nom']}${r['ext']}").' documents/'.escapeshellarg("${r['lien']}/$nom${r['ext']}"));
+ $mysqli->query('ALTER TABLE docs ORDER BY parents,nom_nat');
+ recent($mysqli,3,$id,array('titre'=>$nouveau_nom),false);
+ exit("{\"etat\":\"ok\",\"message\":\"Le nom du document ${r['nom']} a été modifié.\"}");
}
// Traitement d'une modification globale
- if ( isset($_REQUEST['nom']) && isset($_REQUEST['parent']) && isset($_REQUEST['protection']) && strlen($nom = trim($_REQUEST['nom'])) ) {
- $requete = $message = array();
- $etat = 'ok';
+ if ( isset($_REQUEST['nom']) && isset($_REQUEST['parent']) && isset($_REQUEST['protection']) && ($nom = trim($_REQUEST['nom'])) ) {
+ $etat = 'nok';
+ $message = '';
+
// Modification du nom
setlocale(LC_CTYPE, "fr_FR.UTF-8");
$nom = substr(basename(str_replace(array($r['ext'],'\\'),array('','/'),$nom)),0,100);
if ( $nom != $r['nom'] ) {
// real_escape_string seulement pour la requête SQL
$nouveau_nom = $mysqli->real_escape_string($nom);
- if ( requete('docs',"UPDATE docs SET nom = '$nouveau_nom', nom_nat = '".zpad($nouveau_nom)."' WHERE id = $id",$mysqli) ) {
- exec('mv documents/'.escapeshellarg("${r['lien']}/${r['nom']}${r['ext']}").' documents/'.escapeshellarg("${r['lien']}/$nom${r['ext']}"));
- $message[] = "Le nom du document ${r['nom']} a été modifié.";
- // Modification de l'éventuelle information récente
- if ( $r['protection'] < 32 )
- recent($mysqli,3,$id,$r['matiere'],array('nom'=>$nouveau_nom,'ancien_nom'=>$r['nom']));
- }
- else {
- $message[] = "Le nom du document ${r['nom']} n'a pas été modifié. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'».';
- $etat = 'nok';
- }
+ if ( !requete('docs',"UPDATE docs SET nom = '$nouveau_nom', nom_nat = '".zpad($nouveau_nom)."' WHERE id = $id",$mysqli) )
+ exit("{\"etat\":\"nok\",\"message\":\"Le nom du document ${r['nom']} n'a pas été modifié. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'»."}');
+ exec('mv documents/'.escapeshellarg("${r['lien']}/${r['nom']}${r['ext']}").' documents/'.escapeshellarg("${r['lien']}/$nom${r['ext']}"));
+ $mysqli->query('ALTER TABLE docs ORDER BY parents,nom_nat');
+ recent($mysqli,3,$id,array('titre'=>$nouveau_nom),false);
+ $etat = 'ok';
+ $message = "Le nom du document ${r['nom']} a été modifié. ";
+ // Modification du nom (nécessaire pour les éventuels affichages suivants et la mise à jour éventuelle du fichier)
+ $r['nom'] = $nom;
}
+
// Modification de la protection
if ( count($val = array_filter($_REQUEST['protection'],function($id) { return ctype_digit($id); })) ) {
- if ( ( $val[0] == 0 ) || ( $val[0] == 32 ) )
- $protection = $val[0];
- else {
- $protection = 32;
- foreach (array_slice($val,1) as $v)
- $protection = $protection-2**($v-1);
- }
- if ( $protection != $r['protection'] ) {
- if ( requete('docs',"UPDATE docs SET protection = $protection WHERE id = $id",$mysqli) ) {
- $message[] = "L'accès au document ${r['nom']} a été modifié.";
- // Si $protection = 32, on cherche à supprimer l'info récente
- if ( $protection == 32 )
- recent($mysqli,3,$id,$r['matiere']);
- // Si doc avant protégé, on crée une info récente de nouveau doc
- elseif ( $r['protection'] == 32 ) {
- $resultat = $mysqli->query("SELECT GROUP_CONCAT( reps.nom ORDER BY FIND_IN_SET(reps.id,docs.parents) SEPARATOR '/' ) AS path, docs.nom
- FROM docs LEFT JOIN reps ON FIND_IN_SET(reps.id,docs.parents) WHERE docs.id = $id");
- $s = $resultat->fetch_assoc();
- $resultat->free();
- $path = $mysqli->real_escape_string("${s['path']}/${s['nom']}");
- recent($mysqli,3,$id,$r['matiere'],array('titre'=>$path, 'lien'=>"download?id=$id", 'texte'=>"
", 'matiere'=>$r['matiere'], 'protection'=>$protection),$r['ext']);
- }
- // Sinon, mise à jour de la protection dans les informations récentes
- else
- recent($mysqli,3,$id,$r['matiere'],array('protection'=>$protection));
- }
- else {
- $message[] = "L'accès au document ${r['nom']} n'a pas été modifié. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'».';
- $etat = 'nok';
- $protection = $r['protection'];
- }
+ if ( $r['protection'] != ( $protection = ( ( ( $val[0] == 0 ) || ( $val[0] == 32 ) ) ? $val[0] : array_reduce($val, function($s,$v) { return $s - ( ( $v<6 ) ? 1<<($v-1) : 0 ); }, 32) ) ) ) {
+ if ( !requete('docs',"UPDATE docs SET protection = $protection WHERE id = $id",$mysqli)
+ || !recent($mysqli,3,$id,array('protection'=>$protection),false) )
+ exit("{\"etat\":\"nok\",\"message\":\"$message L'accès au document ${r['nom']} n'a pas été modifié. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'»."}');
+ // Mise à jour du menu
+ $mysqli->query("UPDATE matieres SET docs = (SELECT IF(COUNT(*),1,0) FROM docs WHERE matiere = ${r['matiere']} AND protection < 32) WHERE id = ${r['matiere']}");
+ $etat = 'ok';
+ $message .= "L'accès au document ${r['nom']} a été modifié. ";
+ // Modification de la protection (nécessaire pour les éventuels prochains appel à rss())
+ $r['protection'] = $protection;
}
}
// Déplacement dans un autre répertoire
if ( ctype_digit($parent = $_REQUEST['parent']) && $parent && ( $parent != $r['parent'] ) ) {
- // Vérification du répertoire parent
+ // Vérification du nouveau répertoire parent
$resultat = $mysqli->query("SELECT parents, matiere FROM reps WHERE id = $parent AND FIND_IN_SET(matiere,'${_SESSION['matieres']}')");
- if ( $resultat->num_rows ) {
- $s = $resultat->fetch_assoc();
- $resultat->free();
- if ( requete('docs',"UPDATE docs SET parent = '$parent', parents = '${s['parents']},$parent', matiere = ${s['matiere']} WHERE id = $id",$mysqli) ) {
- $message[] = "Le document ${r['nom']} a été déplacé.";
- // Modification de l'information récente si document visible
- if ( $protection < 32 ) {
- $resultat = $mysqli->query("SELECT GROUP_CONCAT( reps.nom ORDER BY FIND_IN_SET(reps.id,docs.parents) SEPARATOR '/' ) AS path, docs.nom, docs.matiere
- FROM docs LEFT JOIN reps ON FIND_IN_SET(reps.id,docs.parents) WHERE docs.id = $id");
- $s = $resultat->fetch_assoc();
- $resultat->free();
- recent($mysqli,3,$id,$r['matiere'],array('chemin'=>$mysqli->real_escape_string("${s['path']}/${s['nom']}"), 'matiere'=>$s['matiere']));
- }
- }
- else {
- $message[] = "Le document ${r['nom']} n'a pas été déplacé. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'».';
- $etat = 'nok';
- }
- }
- else {
- $message[] = "Le document ${r['nom']} n'a pas été déplacé. Identifiant de répertoire parent non valide.";
- $etat = 'nok';
- }
+ if ( !$resultat->num_rows )
+ exit("{\"etat\":\"nok\",\"message\":\"$message Le document ${r['nom']} n'a pas été déplacé. Identifiant de répertoire parent non valide.\"}");
+ $s = $resultat->fetch_assoc();
+ $resultat->free();
+ $mat = $s['matiere'];
+ if ( !requete('docs',"UPDATE docs SET parent = '$parent', parents = '${s['parents']},$parent', matiere = $mat WHERE id = $id",$mysqli)
+ || !requete('recents',"UPDATE recents SET matiere = $mat,
+ texte = ( SELECT CONCAT(ext,'|',taille,'|',d.parent,'|',GROUP_CONCAT( r.nom ORDER BY FIND_IN_SET(r.id,d.parents) SEPARATOR '/' ))
+ FROM docs AS d LEFT JOIN reps AS r ON FIND_IN_SET(r.id,d.parents) WHERE d.id = $id )
+ WHERE type = 3 AND id = $id",$mysqli)
+ || !rss($mysqli, ( $r['matiere'] != $mat ) ? array($r['matiere'],$mat) : $mat, $r['protection']) )
+ exit("{\"etat\":\"nok\",\"message\":\"$message Le document ${r['nom']} n'a pas été déplacé. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'»."}');
+ // Mise à jour du menu et de l'ordre des documents
+ $mysqli->query("UPDATE matieres SET docs = (SELECT IF(COUNT(*),1,0) FROM docs WHERE matiere = matieres.id AND protection < 32) WHERE id = ${r['matiere']} OR id = $mat");
+ $mysqli->query('ALTER TABLE reps ORDER BY parents,nom');
+ $etat = 'ok';
+ $message .= "Le document ${r['nom']} a été déplacé. ";
+ // Modification de la matière (nécessaire pour les éventuels prochains appel à rss())
+ $r['matiere'] = $mat;
}
+
// Mise à jour d'un document
if ( isset($_FILES['fichier']['tmp_name']) && is_uploaded_file($_FILES['fichier']['tmp_name']) ) {
// Changement d'extension interdit
- $ext = ( strpos($_FILES['fichier']['name'],'.') ) ? strrchr($_FILES['fichier']['name'],'.') : '';
- if ( $ext != $r['ext'] ) {
- $message[] = "Le document ${r['nom']} n'a pas été mis à jour. Le fichier envoyé est d'une extension différente.";
- $etat = 'nok';
- }
+ if ( $r['ext'] != ( $ext = ( strrchr($_FILES['fichier']['name'],'.') ?: '' ) ) )
+ exit("{\"etat\":\"nok\",\"message\":\"$message Le document ${r['nom']} n'a pas été mis à jour. Le fichier envoyé est d'une extension différente.\"}");
+ // Gestion de la taille
+ $taille = ( ( $taille = intval($_FILES['fichier']['size']/1024) ) < 1024 ) ? "$taille ko" : intval($taille/1024).' Mo';
// Déplacement du document uploadé au bon endroit
- elseif ( move_uploaded_file($_FILES['fichier']['tmp_name'],"documents/${r['lien']}/${r['nom']}${r['ext']}") ) {
- // Gestion de la taille
- $taille = intval($_FILES['fichier']['size']/1024);
- $taille = ( $taille < 1024 ) ? "$taille ko" : intval($taille/1024).' Mo';
- // Modifications dans la base de données
- requete('docs',"UPDATE docs SET upload = CURDATE(), taille = '$taille' WHERE id = $id",$mysqli);
- // Info récente si document visible (éventuellement nouvelle)
- if ( $protection < 32 ) {
- // Besoin du chemin si pas d'info récente liée au document
- $resultat = $mysqli->query("SELECT GROUP_CONCAT( reps.nom ORDER BY FIND_IN_SET(reps.id,docs.parents) SEPARATOR '/' ) AS path, docs.nom
- FROM docs LEFT JOIN reps ON FIND_IN_SET(reps.id,docs.parents) WHERE docs.id = $id");
- $s = $resultat->fetch_assoc();
- $resultat->free();
- recent($mysqli,3,$id,$r['matiere'],array('maj'=>$mysqli->real_escape_string("${s['path']}/${s['nom']}")));
- }
- $message[] = "Le document ${r['nom']} a été mis à jour.";
- }
- else {
- $message[] = "Le document $nom n'a pas été mis à jour : problème d'écriture du fichier. Vous devriez en informer l'administrateur.";
- $etat = 'nok';
- }
- }
- // Reconstruction du message
- if ( $message ) {
- // Mise à jour de l'ordre des répertoires et de l'affichage des matières
- $mysqli->query('ALTER TABLE docs ORDER BY parents,nom_nat');
- $mysqli->query('UPDATE matieres SET docs = (SELECT IF(COUNT(*),1,0) FROM docs WHERE matiere = matieres.id AND protection < 32)');
- if ( $etat == 'nok')
- exit('{"etat":"nok","message":"'.implode(', ',$message).'"}');
- exit($_SESSION['message'] = '{"etat":"ok","message":"'.implode(', ',$message).'"}');
+ if ( !move_uploaded_file($_FILES['fichier']['tmp_name'],"documents/${r['lien']}/${r['nom']}${r['ext']}") )
+ exit("{\"etat\":\"nok\",\"message\":\"$message Le document ${r['nom']} n'a pas été mis à jour : problème d'écriture du fichier. Vous devriez en informer l'administrateur.\"}");
+ // Modifications dans la base de données
+ if ( requete('docs','UPDATE docs SET '.( isset($_REQUEST['publi']) ? 'upload = CURDATE(), ' : '' )."taille = '$taille' WHERE id = $id",$mysqli)
+ && requete('recents','UPDATE recents SET '.( isset($_REQUEST['publi']) ? 'maj = NOW(), ' : '' )."texte = CONCAT(SUBSTRING_INDEX(texte,'|',1),'|$taille|',SUBSTRING_INDEX(texte,'|',-2))
+ WHERE type = 3 AND id = $id",$mysqli)
+ && rss($mysqli,$r['matiere'],$r['protection']) )
+ exit($_SESSION['message'] = "{\"etat\":\"ok\",\"message\":\"$message Le document ${r['nom']} a été mis à jour.\"}");
}
- exit("{\"etat\":\"nok\",\"message\":\"Le document ${r['nom']} n'a pas été modifié. Aucune modification demandée.\"}");
+
+ // Message
+ if ( $etat == 'nok' )
+ exit("{\"etat\":\"nok\",\"message\":\"Le document ${r['nom']} n'a pas été modifié. Aucune modification demandée.\"}");
+ exit($_SESSION['message'] = '{"etat":"ok","message":"'.substr($message,0,-4).'"}');
}
// Suppression d'un document
@@ -940,8 +954,8 @@
exit("{\"etat\":\"nok\",\"message\":\"Le document ${r['nom']} n'a pas été supprimé. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'».');
// Suppression physique
exec("rm -rf documents/${r['lien']}");
- recent($mysqli,3,$id,$r['matiere']);
- $mysqli->query('UPDATE matieres SET docs = (SELECT IF(COUNT(*),1,0) FROM docs WHERE matiere = matieres.id AND protection < 32)');
+ recent($mysqli,3,$id);
+ $mysqli->query("UPDATE matieres SET docs = (SELECT IF(COUNT(*),1,0) FROM docs WHERE matiere = ${r['matiere']} AND protection < 32) WHERE id = ${r['matiere']}");
exit("{\"etat\":\"ok\",\"message\":\"Le document ${r['nom']} a été supprimé.\"}");
}
}
@@ -963,52 +977,39 @@
setlocale(LC_CTYPE, "fr_FR.UTF-8");
$nom = trim(substr(basename(str_replace(array($ext,'\\'),array('','/'), $_REQUEST['nom'] ?: $nom )),0,100));
// Génération de la valeur de protection
- if ( count($val = array_filter($_REQUEST['protection'],function($id) { return ctype_digit($id); })) ) {
- if ( ( $val[0] == 0 ) || ( $val[0] == 32 ) )
- $protection = $val[0];
- else {
- $protection = 32;
- foreach (array_slice($val,1) as $v)
- $protection = $protection-2**($v-1);
- }
- }
- else
- $protection = $r['protection'];
+ $protection = ( count($val = array_filter($_REQUEST['protection'],function($id) { return ctype_digit($id); })) )
+ ? ( ( ( $val[0] == 0 ) || ( $val[0] == 32 ) ) ? $val[0] : array_reduce($val, function($s,$v) { return $s - ( ( $v<6 ) ? 1<<($v-1) : 0 ); }, 32) )
+ : $r['protection'];
// Création du répertoire particulier
$lien = substr(sha1(mt_rand()),0,15);
while ( is_dir("documents/$lien") )
$lien = substr(sha1(mt_rand()),0,15);
mkdir("documents/$lien");
// Gestion de la taille
- $taille = intval($_FILES['fichier']['size']/1024);
- $taille = ( $taille < 1024 ) ? "$taille ko" : intval($taille/1024).' Mo';
+ $taille = ( ( $taille = intval($_FILES['fichier']['size']/1024) ) < 1024 ) ? "$taille ko" : intval($taille/1024).' Mo';
// Déplacement du document uploadé au bon endroit
if ( !move_uploaded_file($_FILES['fichier']['tmp_name'],"documents/$lien/$nom$ext") )
exit("{\"etat\":\"nok\",\"message\":\"Le document $nom n'a pas été ajouté : problème d'écriture du fichier. Vous devriez en informer l'administrateur.\"}");
+
// Écriture MySQL
+ // On doit garder $nom pour l'affichage
+ $nom_sql = $mysqli->real_escape_string($nom);
if ( requete('docs',"INSERT INTO docs SET parent = $parent, parents = '${r['parents']},$parent',
- matiere = ${r['matiere']}, nom = '".$mysqli->real_escape_string($nom).'\', nom_nat = \''.zpad($mysqli->real_escape_string($nom))."', upload = CURDATE(),
+ matiere = ${r['matiere']}, nom = '$nom_sql', nom_nat = '".zpad($nom_sql)."', upload = CURDATE(),
taille = '$taille', lien = '$lien', ext='".$mysqli->real_escape_string($ext)."', protection = $protection",$mysqli) ) {
$id = $mysqli->insert_id;
- // Mise à jour des informations récentes
- if ( $protection < 32 ) {
- $resultat = $mysqli->query("SELECT GROUP_CONCAT( reps.nom ORDER BY FIND_IN_SET(reps.id,docs.parents) SEPARATOR '/' ) AS path
- FROM docs LEFT JOIN reps ON FIND_IN_SET(reps.id,docs.parents) WHERE docs.id = $id");
- $s = $resultat->fetch_assoc();
- $resultat->free();
- $path = $mysqli->real_escape_string("${s['path']}/$nom");
- recent($mysqli,3,$id,$r['matiere'],array('titre'=>$path, 'lien'=>"download?id=$id", 'texte'=>"
", 'matiere'=>$r['matiere'], 'protection'=>$protection),$ext);
- // Mise à jour de l'affichage de la matière dans le menu)
- $mysqli->query("UPDATE matieres SET docs = 1 WHERE id = ${r['matiere']}");
- }
+ $resultat = $mysqli->query("SELECT GROUP_CONCAT(nom ORDER BY FIND_IN_SET(id,'${r['parents']},$parent') SEPARATOR '/' )
+ FROM reps WHERE FIND_IN_SET(id,'${r['parents']},$parent')");
+ recent($mysqli,3,$id,array('matiere'=>$r['matiere'], 'titre'=>$nom_sql, 'lien'=>".?${r['cle']}", 'texte'=>$mysqli->real_escape_string("$ext|$taille|$parent|".$resultat->fetch_row()[0]), 'protection'=>$protection));
+ $resultat->free();
+ // Mise à jour de l'affichage de la matière dans le menu et de l'ordre des documents
+ $mysqli->query("UPDATE matieres SET docs = 1 WHERE id = ${r['matiere']}");
$mysqli->query('ALTER TABLE docs ORDER BY parents,nom_nat');
exit($_SESSION['message'] = "{\"etat\":\"ok\",\"message\":\"Le document $nom a été ajouté.\"}");
}
- else {
- // Retour en arrière
- exec("rm -rf documents/$lien");
- exit("{\"etat\":\"nok\",\"message\":\"Le document $nom n'a pas été ajouté. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'»."}');
- }
+ // Retour en arrière
+ exec("rm -rf documents/$lien");
+ exit("{\"etat\":\"nok\",\"message\":\"Le document $nom n'a pas été ajouté. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'»."}');
}
///////////////////////////////////////////
@@ -1029,49 +1030,44 @@
// Traitement d'une modification unique (texte)
if ( isset($_REQUEST['champ']) && ( $_REQUEST['champ'] == 'texte' ) ) {
- $valeur = $mysqli->real_escape_string($_REQUEST['val']);
- if ( !strlen($valeur) )
+ if ( !( $valeur = $mysqli->real_escape_string($_REQUEST['val']) ) )
exit("{\"etat\":\"nok\",\"message\":\"Le programme de colle de la semaine du ${r['debut']} n'a pas été modifié. Le texte doit être non vide.\"}");
- if ( requete('colles',"UPDATE colles SET texte = '$valeur' WHERE id = ${r['id']}",$mysqli) ) {
- if ( !$r['cache'] )
- recent($mysqli,2,$r['id'],$mid,array('texte'=>$valeur));
- exit("{\"etat\":\"ok\",\"message\":\"Le programme de colle de la semaine du ${r['debut']} a été modifié.\"}");
- }
- exit("{\"etat\":\"nok\",\"message\":\"Le programme de colle de la semaine du ${r['debut']} n'a pas été modifié. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'»."}');
+ if ( !requete('colles',"UPDATE colles SET texte = '$valeur' WHERE id = ${r['id']}",$mysqli) )
+ exit("{\"etat\":\"nok\",\"message\":\"Le programme de colle de la semaine du ${r['debut']} n'a pas été modifié. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'»."}');
+ if ( !$r['cache'] )
+ recent($mysqli,2,$r['id'],array('texte'=>$valeur),isset($_REQUEST['publi']));
+ exit("{\"etat\":\"ok\",\"message\":\"Le programme de colle de la semaine du ${r['debut']} a été modifié.\"}");
}
// Positionnement "montré" (apparaît sur la partie publique)
if ( isset($_REQUEST['montre']) ) {
- if ( requete('colles',"UPDATE colles SET cache = 0 WHERE id = ${r['id']}",$mysqli) ) {
- // Fabrication des données pour les informations récentes
- $resultat = $mysqli->query("SELECT nom, cle, colles_protection FROM matieres WHERE id = $mid");
- $s = $resultat->fetch_assoc();
- $resultat->free();
- recent($mysqli,2,$r['id'],$mid,array('titre'=>"Colles du ${r['debut']} en ".$mysqli->real_escape_string($s['nom']), 'lien'=>"colles?${s['cle']}&n=$sid", 'texte'=>$mysqli->real_escape_string($r['texte']), 'matiere'=>$mid, 'protection'=>$s['colles_protection']));
- $mysqli->query($requete_maj);
- exit("{\"etat\":\"ok\",\"message\":\"Le programme de colle de la semaine du ${r['debut']} apparaît désormais sur la partie publique.\"}");
- }
- exit("{\"etat\":\"nok\",\"message\":\"Le programme de colle de la semaine du ${r['debut']} n'a pas été diffusé. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'»."}');
+ if ( !requete('colles',"UPDATE colles SET cache = 0 WHERE id = ${r['id']}",$mysqli) )
+ exit("{\"etat\":\"nok\",\"message\":\"Le programme de colle de la semaine du ${r['debut']} n'a pas été diffusé. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'»."}');
+ // Fabrication des données pour les informations récentes
+ $resultat = $mysqli->query("SELECT nom, cle, colles_protection FROM matieres WHERE id = $mid");
+ $s = $resultat->fetch_assoc();
+ $resultat->free();
+ recent($mysqli,2,$r['id'],array('matiere'=>$mid, 'titre'=>"Colles du ${r['debut']} en ".$mysqli->real_escape_string($s['nom']), 'lien'=>"colles?${s['cle']}&n=$sid", 'texte'=>$mysqli->real_escape_string($r['texte']), 'protection'=>$s['colles_protection']));
+ $mysqli->query($requete_maj);
+ exit("{\"etat\":\"ok\",\"message\":\"Le programme de colle de la semaine du ${r['debut']} apparaît désormais sur la partie publique.\"}");
}
// Positionnement "caché" (n'apparaît pas sur la partie publique)
if ( isset($_REQUEST['cache']) ) {
- if ( requete('colles',"UPDATE colles SET cache = 1 WHERE id = ${r['id']}",$mysqli) ) {
- recent($mysqli,2,$r['id'],$mid);
- $mysqli->query($requete_maj);
- exit("{\"etat\":\"ok\",\"message\":\"Le programme de colle de la semaine du ${r['debut']} n'apparaît plus sur la partie publique mais est toujours disponible ici pour modification ou diffusion.\"}");
- }
- exit("{\"etat\":\"nok\",\"message\":\"Le programme de colle de la semaine du ${r['debut']} n'a pas été caché. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'»."}');
+ if ( !requete('colles',"UPDATE colles SET cache = 1 WHERE id = ${r['id']}",$mysqli) )
+ exit("{\"etat\":\"nok\",\"message\":\"Le programme de colle de la semaine du ${r['debut']} n'a pas été caché. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'»."}');
+ recent($mysqli,2,$r['id']);
+ $mysqli->query($requete_maj);
+ exit("{\"etat\":\"ok\",\"message\":\"Le programme de colle de la semaine du ${r['debut']} n'apparaît plus sur la partie publique mais est toujours disponible ici pour modification ou diffusion.\"}");
}
// Suppression
if ( isset($_REQUEST['supprime']) ) {
- if ( requete('colles',"DELETE FROM colles WHERE id = ${r['id']}",$mysqli) ) {
- recent($mysqli,2,$r['id'],$mid);
- $mysqli->query($requete_maj);
- exit("{\"etat\":\"ok\",\"message\":\"Le programme de colle de la semaine du ${r['debut']} a été supprimé.\"}");
- }
- exit("{\"etat\":\"nok\",\"message\":\"Le programme de colle de la semaine du ${r['debut']} n'a pas été supprimé. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'»."}');
+ if ( !requete('colles',"DELETE FROM colles WHERE id = ${r['id']}",$mysqli) )
+ exit("{\"etat\":\"nok\",\"message\":\"Le programme de colle de la semaine du ${r['debut']} n'a pas été supprimé. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'»."}');
+ recent($mysqli,2,$r['id']);
+ $mysqli->query($requete_maj);
+ exit("{\"etat\":\"ok\",\"message\":\"Le programme de colle de la semaine du ${r['debut']} a été supprimé.\"}");
}
}
@@ -1087,25 +1083,23 @@
$r = $resultat->fetch_assoc();
$resultat->free();
// Validation des données
- $texte = $mysqli->real_escape_string($_REQUEST['texte']);
$cache = intval(isset($_REQUEST['cache']));
- if ( !strlen($texte) )
+ if ( !( $texte = $mysqli->real_escape_string($_REQUEST['texte']) ) )
exit("{\"etat\":\"nok\",\"message\":\"Le programme de colle de la semaine du ${r['debut']} n'a pas été ajouté. Le texte doit être non vide.\"}");
- if ( requete('colles',"INSERT INTO colles SET texte = '$texte', semaine = $sid, matiere = $mid, cache = $cache",$mysqli) ) {
- $id = $mysqli->insert_id;
- $mysqli->query('ALTER TABLE colles ORDER BY matiere,semaine');
- if ( !$cache ) {
- // Fabrication des données pour les informations récentes
- $resultat = $mysqli->query("SELECT nom, cle, colles_protection FROM matieres WHERE id = $mid");
- $s = $resultat->fetch_assoc();
- $resultat->free();
- recent($mysqli,2,$id,$mid,array('titre'=>"Colles du ${r['debut']} en ".$mysqli->real_escape_string($s['nom']), 'lien'=>"colles?${s['cle']}&n=$sid", 'texte'=>$texte, 'matiere'=>$mid, 'protection'=>$s['colles_protection']));
- // Mise à jour de la matière
- $mysqli->query("UPDATE matieres SET colles = IF((SELECT id FROM colles WHERE matiere = $mid AND cache = 0 LIMIT 1),1,0) WHERE id = $mid AND colles_protection < 32");
- }
- exit("{\"etat\":\"ok\",\"message\":\"Le programme de colle de la semaine du ${r['debut']} a été ajouté.\"}");
+ if ( !requete('colles',"INSERT INTO colles SET texte = '$texte', semaine = $sid, matiere = $mid, cache = $cache",$mysqli) )
+ exit("{\"etat\":\"nok\",\"message\":\"Le programme de colle de la semaine du ${r['debut']} n'a pas été ajouté. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'»."}');
+ $id = $mysqli->insert_id;
+ $mysqli->query('ALTER TABLE colles ORDER BY matiere,semaine');
+ if ( !$cache ) {
+ // Fabrication des données pour les informations récentes
+ $resultat = $mysqli->query("SELECT nom, cle, colles_protection FROM matieres WHERE id = $mid");
+ $s = $resultat->fetch_assoc();
+ $resultat->free();
+ recent($mysqli,2,$id,array('titre'=>"Colles du ${r['debut']} en ".$mysqli->real_escape_string($s['nom']), 'lien'=>"colles?${s['cle']}&n=$sid", 'texte'=>$texte, 'matiere'=>$mid, 'protection'=>$s['colles_protection']));
+ // Mise à jour de la matière
+ $mysqli->query("UPDATE matieres SET colles = IF((SELECT id FROM colles WHERE matiere = $mid AND cache = 0 LIMIT 1),1,0) WHERE id = $mid AND colles_protection < 32");
}
- exit("{\"etat\":\"nok\",\"message\":\"Le programme de colle de la semaine du ${r['debut']} n'a pas été ajouté. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'»."}');
+ exit("{\"etat\":\"ok\",\"message\":\"Le programme de colle de la semaine du ${r['debut']} a été ajouté.\"}");
}
/////////////////////////////////////////////////////////
@@ -1419,57 +1413,64 @@
// Traitement d'une modification globale (depuis index.php ou pages.php)
if ( isset($_REQUEST['titre']) && isset($_REQUEST['nom']) && isset($_REQUEST['cle']) && isset($_REQUEST['bandeau']) && isset($_REQUEST['protection']) ) {
- $titre = strip_tags(trim($mysqli->real_escape_string($_REQUEST['titre'])));
- $nom = strip_tags(trim($mysqli->real_escape_string($_REQUEST['nom'])));
- $titre = mb_strtoupper(mb_substr($titre,0,1)).mb_substr($titre,1);
- $nom = mb_strtoupper(mb_substr($nom,0,1)).mb_substr($nom,1);
+ $titre = mb_strtoupper(mb_substr($titre = trim(strip_tags($mysqli->real_escape_string($_REQUEST['titre']))) ,0,1)).mb_substr($titre,1);
+ $nom = mb_strtoupper(mb_substr($nom = trim(strip_tags($mysqli->real_escape_string($_REQUEST['nom']))),0,1)).mb_substr($nom,1);
$cle = str_replace(' ','_',strip_tags(trim($mysqli->real_escape_string($_REQUEST['cle']))));
- if ( !strlen($_REQUEST['titre']) || !strlen($_REQUEST['nom']) || !strlen($_REQUEST['cle']) )
+ if ( !$titre || !$nom || !$cle )
exit("{\"etat\":\"nok\",\"message\":\"La page ${r['nom']} n'a pas été modifiée. Le titre, le nom et la clé doivent être non vides.\"}");
- // Partie de requête si modification de matière
+ // Partie de requête si modification de matière (impossible si première page)
// N'existe qu'en provenance de pages.php (et non d'index.php)
$requete_matiere = ( isset($_REQUEST['matiere']) && in_array($matiere = intval($_REQUEST['matiere']),explode(',',$_SESSION['matieres'])) && ( $matiere != $r['mat'] ) && ( $id > 1 ) ) ? ", mat = $matiere" : '';
// Vérification que la clé n'existe pas déjà
- $requete_cle = '';
if ( $cle != $r['cle'] ) {
- $resultat = $mysqli->query('SELECT cle FROM pages WHERE mat = '.( strlen($requete_matiere) ? $matiere : $r['mat'] ));
+ $resultat = $mysqli->query('SELECT cle FROM pages WHERE mat = '.( $requete_matiere ? $matiere : $r['mat'] ));
if ( $resultat->num_rows ) {
while ( $s = $resultat->fetch_row() )
if ( $s[0] == $cle )
exit("{\"etat\":\"nok\",\"message\":\"La page ${r['nom']} n'a pas été modifiée. La clé donnée existe déjà. Elle doit être différente de celles des autres pages.\"}");
$resultat->free();
- $requete_cle = "cle = '$cle',";
}
}
$bandeau = trim($mysqli->real_escape_string($_REQUEST['bandeau']));
// Génération de la valeur de protection
- $val = array_filter($_REQUEST['protection'],function($id) { return ctype_digit($id); });
- if ( !count($val) )
+ if ( !count($val = array_filter($_REQUEST['protection'],function($id) { return ctype_digit($id); })) )
exit("{\"etat\":\"nok\",\"message\":\"La page ${r['nom']} n'a pas été modifiée. La protection d'accès est incorrecte.\"}");
- if ( ( $val[0] == 0 ) || ( $val[0] == 32 ) )
- $protection = $val[0];
- else {
- $protection = 32;
- foreach (array_slice($val,1) as $v)
- $protection = $protection-2**($v-1);
- }
+ $protection = ( ( $val[0] == 0 ) || ( $val[0] == 32 ) ) ? $val[0] : array_reduce($val, function($s,$v) { return $s - ( ( $v<6 ) ? 1<<($v-1) : 0 ); }, 32);
// Écriture
- if ( requete('pages',"UPDATE pages SET titre = '$titre', nom = '$nom', $requete_cle bandeau = '$bandeau', protection = $protection $requete_matiere WHERE id = $id",$mysqli) ) {
- if ( strlen($requete_matiere) ) {
- requete('pages',"UPDATE pages SET ordre = (SELECT COUNT(*) FROM (SELECT id FROM pages AS p WHERE p.mat = $matiere) AS p1) WHERE id = $id",$mysqli);
- requete('pages',"UPDATE pages SET ordre = (ordre-1) WHERE mat = ${r['mat']} AND ordre > ${r['ordre']}",$mysqli);
- $mysqli->query('ALTER TABLE pages ORDER BY mat,ordre');
- }
- if ( isset($_REQUEST['propagation']) ) {
- requete('infos',"UPDATE infos SET protection = $protection WHERE page = $id",$mysqli);
- // Mise à jour des informations récentes
- requete('recents',"UPDATE recents SET protection = $protection WHERE id IN (SELECT 1000+infos.id FROM infos WHERE page = $id)",$mysqli);
- rss($mysqli, ( $r['mat'] == 0 ) ? array(0) : array(0,$r['mat']) );
- }
- exit($_SESSION['message'] = "{\"etat\":\"ok\",\"message\":\"La page ${r['nom']} a été modifiée.\"}");
- }
- else
+ if ( !requete('pages',"UPDATE pages SET titre = '$titre', nom = '$nom', cle = '$cle', bandeau = '$bandeau', protection = $protection $requete_matiere WHERE id = $id",$mysqli) )
exit("{\"etat\":\"nok\",\"message\":\"La page ${r['nom']} n'a pas été modifiée. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'»."}');
+ // Changement de matière : déplacement des pages sur les matières concernées
+ if ( $requete_matiere ) {
+ requete('pages',"UPDATE pages SET ordre = (SELECT COUNT(*) FROM (SELECT id FROM pages AS p WHERE p.mat = $matiere) AS p1) WHERE id = $id",$mysqli);
+ requete('pages',"UPDATE pages SET ordre = (ordre-1) WHERE mat = ${r['mat']} AND ordre > ${r['ordre']}",$mysqli);
+ // Mise à jour de la table recents, des flux RSS et de l'ordre des pages
+ requete('recents',"UPDATE recents SET matiere = $matiere,
+ titre = CONCAT(SUBSTRING_INDEX(titre,'[',1), ( SELECT CONCAT('[',IF(mat=0,'',CONCAT(m.nom,'/')),p.nom,']')
+ FROM pages AS p LEFT JOIN matieres AS m ON mat=m.id WHERE p.id = $id ) )
+ WHERE type = 1 AND id IN (SELECT id FROM infos WHERE page = $id)",$mysqli);
+ rss($mysqli,array($r['mat'],$matiere),0);
+ $mysqli->query('ALTER TABLE pages ORDER BY mat,ordre');
+ }
+ // Changement de nom : modification de la table recents et des flux RSS (inutile si matière modifiée, impossible si première page)
+ elseif ( ( $nom != $r['nom'] ) && ( $id > 1 ) ) {
+ requete('recents',"UPDATE recents SET titre = CONCAT(SUBSTRING_INDEX(titre,'[',1), ( SELECT CONCAT('[',IF(mat=0,'',CONCAT(m.nom,'/')),p.nom,']')
+ FROM pages AS p LEFT JOIN matieres AS m ON mat=m.id WHERE p.id = $id ) )
+ WHERE type = 1 AND id IN (SELECT id FROM infos WHERE page = $id)",$mysqli);
+ rss($mysqli,$r['mat'],0);
+ }
+ // Changement de clé donc de lien dans la table recents
+ if ( $cle != $r['cle'] ) {
+ requete('recents',"UPDATE recents SET lien = '?$cle' WHERE type = 1 AND id IN (SELECT id FROM infos WHERE page = $id)",$mysqli);
+ rss($mysqli,$r['mat'],0);
+ }
+ // Propagation de la protection : modification des infos
+ if ( isset($_REQUEST['propagation']) ) {
+ requete('infos',"UPDATE infos SET protection = $protection WHERE page = $id",$mysqli);
+ // Mise à jour de la table recents et des flux RSS
+ requete('recents',"UPDATE recents SET protection = $protection WHERE type = 1 AND id IN (SELECT id FROM infos WHERE page = $id)",$mysqli);
+ rss($mysqli,$r['mat'],0);
+ }
+ exit($_SESSION['message'] = "{\"etat\":\"ok\",\"message\":\"La page ${r['nom']} a été modifiée.\"}");
}
// Déplacement vers le haut
@@ -1491,8 +1492,10 @@
if ( $id == 1 )
exit("{\"etat\":\"nok\",\"message\":\"La page ${r['nom']} ne peut pas être supprimée.\"}");
if ( requete('pages',"DELETE FROM pages WHERE id = $id",$mysqli)
+ && requete('recents',"DELETE FROM recents WHERE type = 1 AND id IN (SELECT id FROM infos WHERE page = $id)",$mysqli)
&& requete('infos',"DELETE FROM infos WHERE page = $id",$mysqli)
- && requete('pages',"UPDATE pages SET ordre = (ordre-1) WHERE mat = ${r['mat']} AND ordre > ${r['ordre']}",$mysqli)
+ && requete('pages',"UPDATE pages SET ordre = (ordre-1) WHERE mat = ${r['mat']} AND ordre > ${r['ordre']}",$mysqli)
+ && rss($mysqli,$r['mat'],0)
&& $mysqli->query('ALTER TABLE pages ORDER BY mat,ordre') )
exit("{\"etat\":\"ok\",\"message\":\"La page ${r['nom']} a été supprimée. Les informations contenues ont été supprimées.'\"}");
exit("{\"etat\":\"nok\",\"message\":\"La page ${r['nom']} n'a pas été supprimée. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'»."}');
@@ -1500,7 +1503,9 @@
// Suppression des informations
if ( isset($_REQUEST['supprime_infos']) )
- exit( ( requete('infos',"DELETE FROM infos WHERE pages = $id",$mysqli) )
+ exit( requete('recents',"DELETE FROM recents WHERE type = 1 AND id IN (SELECT id FROM infos WHERE page = $id)",$mysqli)
+ && requete('infos',"DELETE FROM infos WHERE page = $id",$mysqli)
+ && rss($mysqli,$r['mat'],0)
? "{\"etat\":\"ok\",\"message\":\"Les informations de la page ${r['nom']} ont été supprimées.\"}"
: "{\"etat\":\"nok\",\"message\":\"Les informations de la page ${r['nom']} n'ont pas été supprimées. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'»."}');
}
@@ -1578,10 +1583,9 @@
// Traitement d'une modification
if ( isset($_REQUEST['nom']) && isset($_REQUEST['cle']) && isset($_REQUEST['colles_protection']) && isset($_REQUEST['cdt_protection']) && isset($_REQUEST['docs_protection']) && isset($_REQUEST['notes']) && isset($_REQUEST['dureecolle']) ) {
- $nom = strip_tags(trim($mysqli->real_escape_string($_REQUEST['nom'])));
- $nom = mb_strtoupper(mb_substr($nom,0,1)).mb_substr($nom,1);
+ $nom = mb_strtoupper(mb_substr($nom = trim(strip_tags($mysqli->real_escape_string($_REQUEST['nom']))),0,1)).mb_substr($nom,1);
$cle = str_replace(' ','_',strip_tags(trim($mysqli->real_escape_string($_REQUEST['cle']))));
- if ( !strlen($nom) || !strlen($cle) )
+ if ( !$nom || !$cle )
exit("{\"etat\":\"nok\",\"message\":\"La matière ${r['nom']} n'a pas été modifiée. Le nom et la clé doivent être non vides.\"}");
// Vérification que la clé n'existe pas déjà
if ( $cle != $r['cle'] ) {
@@ -1593,28 +1597,32 @@
$resultat->free();
}
}
- // Génération des valeurs de protection
+ // Génération de la valeur de protection
$protection = array();
foreach ( array('colles','cdt','docs') as $fonction ) {
- $val = array_filter($_REQUEST[$fonction.'_protection'],function($id) { return ctype_digit($id); });
- if ( !count($val) )
+ if ( !count($val = array_filter($_REQUEST[$fonction.'_protection'],function($id) { return ctype_digit($id); })) )
exit("{\"etat\":\"nok\",\"message\":\"La matière ${r['nom']} n'a pas été modifiée. Une des protections d'accès est incorrecte.\"}");
- if ( ( $val[0] == 0 ) || ( $val[0] == 32 ) )
- $protection[$fonction] = $val[0];
- else {
- $p = 32;
- foreach (array_slice($val,1) as $v)
- $p = $p-2**($v-1);
- $protection[$fonction] = $p;
- }
+ $protection[$fonction] = ( ( $val[0] == 0 ) || ( $val[0] == 32 ) ) ? $val[0] : array_reduce($val, function($s,$v) { return $s - ( ( $v<6 ) ? 1<<($v-1) : 0 ); }, 32);
}
// Affichage des notes : 2-> désactivée ; 1-> possible (0 ou 1 dans la base)
$notes = ( $_REQUEST['notes'] == 2 ) ? '2' : "IF( notes=2, IF((SELECT id FROM notes WHERE matiere = $id LIMIT 1),1,0), notes)";
$dureecolle = intval($_REQUEST['dureecolle']) ?: 20;
// Écriture
if ( requete('matieres',"UPDATE matieres SET nom = '$nom', cle = '$cle', notes = $notes, colles_protection = ${protection['colles']}, cdt_protection = ${protection['cdt']}, docs_protection = ${protection['docs']}, dureecolle = $dureecolle WHERE id = $id",$mysqli) ) {
- if ( $nom != $r['nom'] )
+ if ( $nom != $r['nom'] ) {
requete('reps',"UPDATE reps SET nom = '$nom' WHERE matiere = $id AND parent = 0",$mysqli);
+ // Modification de la table recents
+ requete('recents',"UPDATE recents SET titre = ( SELECT CONCAT( IF(LENGTH(i.titre),i.titre,'Information'),' [',m.nom,'/',p.nom,']' )
+ FROM infos AS i LEFT JOIN pages AS p ON page=p.id LEFT JOIN matieres AS m ON mat=m.id WHERE i.id = recents.id )
+ WHERE type = 1 AND matiere = $id",$mysqli);
+ requete('recents',"UPDATE recents SET protection = ${protection['colles']}, ".( ( $cle != $r['cle'] ) ? "lien = CONCAT('colles?$cle&n=',SUBSTRING_INDEX(lien,'&',-1))," : '')."
+ titre = CONCAT( SUBSTRING_INDEX(titre,' ',4), ' en $nom' )
+ WHERE type = 2 AND matiere = $id",$mysqli);
+ requete('recents',"UPDATE recents SET texte = ( SELECT CONCAT(ext,'|',taille,'|',d.parent,'|',GROUP_CONCAT( r.nom ORDER BY FIND_IN_SET(r.id,d.parents) SEPARATOR '/' ))
+ FROM docs AS d LEFT JOIN reps AS r ON FIND_IN_SET(r.id,d.parents) WHERE d.id = recents.id GROUP BY d.id )
+ WHERE type = 3 AND matiere = $id",$mysqli);
+ rss($mysqli,$r['mat'],0);
+ }
if ( $protection['docs'] != $r['docs_protection'] )
requete('reps',"UPDATE reps SET protection = ${protection['docs']} WHERE matiere = $id AND parent = 0",$mysqli);
exit($_SESSION['message'] = "{\"etat\":\"ok\",\"message\":\"La matière ${r['nom']} a été modifiée.\"}");
@@ -1627,52 +1635,68 @@
if ( isset($_REQUEST['supprime']) ) {
if ( $r['max'] == 1 )
exit("{\"etat\":\"nok\",\"message\":\"La matière ${r['nom']} n'a pas été supprimée. Il faut obligatoirement en garder au moins une.\"}");
+ $resultat->$mysql_query("SELECT id FROM reps WHERE parent = 0 AND matiere = $id");
+ $rid = $resultat->fetch_row()[0];
+ $resultat->free();
if ( requete('matieres',"DELETE FROM matieres WHERE id = $id",$mysqli)
&& requete('matieres',"UPDATE matieres SET ordre = (ordre-1) WHERE ordre > ${r['ordre']}",$mysqli)
&& requete('colles',"DELETE FROM colles WHERE matiere = $id",$mysqli)
+ && requete('recents',"DELETE FROM recents WHERE type = 2 AND matiere = $id",$mysqli)
&& requete('cdt',"DELETE FROM cdt WHERE matiere = $id",$mysqli)
&& requete('cdt-types',"DELETE FROM `cdt-types` WHERE matiere = $id",$mysqli)
&& requete('cdt-seances',"DELETE FROM `cdt-seances` WHERE matiere = $id",$mysqli)
&& requete('notes',"DELETE FROM notes WHERE matiere = $id",$mysqli)
- && requete('reps',"UPDATE reps SET matiere = 0 WHERE matiere = $id",$mysqli)
- && requete('docs',"UPDATE docs SET matiere = 0 WHERE matiere = $id",$mysqli)
+ && requete('reps',"UPDATE reps SET matiere = 0, parent = 1, parents = '0,1' WHERE id = $rid",$mysqli)
+ && requete('reps',"UPDATE reps SET matiere = 0, parents = CONCAT('0,1',SUBSTRING(parents,2)) WHERE matiere = $id AND id != $rid",$mysqli)
+ && requete('docs',"UPDATE docs SET matiere = 0, parents = CONCAT('0,1',SUBSTRING(parents,2)) WHERE matiere = $id",$mysqli)
+ && requete('recents',"UPDATE recents SET matiere = 0 WHERE type = 3 AND matiere = $id",$mysqli)
&& requete('pages',"UPDATE pages SET mat = 0 WHERE mat = $id",$mysqli)
+ && requete('recents',"UPDATE recents SET matiere = 0, titre = ( SELECT CONCAT(IF(LENGTH(i.titre),i.titre,'Information'),' [',p.nom,']')
+ FROM infos AS i LEFT JOIN pages AS p ON page=p.id WHERE i.id = recents.id )
+ WHERE type = 1 AND matiere = $id",$mysqli)
&& requete('agenda',"UPDATE agenda SET matiere = 0 WHERE matiere = $id",$mysqli)
- && requete('utilisateurs',"UPDATE utilisateurs SET matieres = TRIM(TRAILING ',' FROM REPLACE(CONCAT(matieres,','),',$id,',',')) ",$mysqli) )
+ && requete('recents',"UPDATE recents SET matiere = 0 WHERE type = 4 AND matiere = $id",$mysqli)
+ && requete('utilisateurs',"UPDATE utilisateurs SET matieres = TRIM(TRAILING ',' FROM REPLACE(CONCAT(matieres,','),',$id,',',')) ",$mysqli)
+ && rss($mysqli,0,0) )
exit("{\"etat\":\"ok\",\"message\":\"La matière ${r['nom']} a été supprimée. Les répertoires, documents, pages d'informations et éléments d'agenda associés à la matières n'ont pas été supprimés mais déplacés dans le contexte « général »'\"}");
exit("{\"etat\":\"nok\",\"message\":\"La matière ${r['nom']} n'a pas été supprimée. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'»."}');
}
// Suppression des programmes de colles d'une matière
if ( isset($_REQUEST['supprime_colles']) )
- exit( ( requete('colles',"DELETE FROM colles WHERE matiere = $id",$mysqli) && requete('matieres',"UPDATE matieres SET colles = 0 WHERE id = $id",$mysqli) )
+ exit( requete('colles',"DELETE FROM colles WHERE matiere = $id",$mysqli)
+ && requete('matieres',"UPDATE matieres SET colles = 0 WHERE id = $id",$mysqli)
+ && requete('recents',"DELETE FROM recents WHERE type = 2 AND matiere = $id",$mysqli)
+ && rss($mysqli,$id,0)
? "{\"etat\":\"ok\",\"message\":\"Les programmes de colle de la matière ${r['nom']} ont été supprimés.\"}"
: "{\"etat\":\"nok\",\"message\":\"Les programmes de colle de la matière ${r['nom']} n'ont pas été supprimés. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'»."}');
// Suppression du cahier de texte d'une matière
if ( isset($_REQUEST['supprime_cdt']) )
- exit( ( requete('cdt',"DELETE FROM cdt WHERE matiere = $id",$mysqli) && requete('matieres',"UPDATE matieres SET cdt = 0 WHERE id = $id",$mysqli) )
+ exit( requete('cdt',"DELETE FROM cdt WHERE matiere = $id",$mysqli) && requete('matieres',"UPDATE matieres SET cdt = 0 WHERE id = $id",$mysqli)
? "{\"etat\":\"ok\",\"message\":\"Le cahier de texte de la matière ${r['nom']} a été supprimé.\"}"
: "{\"etat\":\"nok\",\"message\":\"Le cahier de texte de la matière ${r['nom']} n'a pas été supprimé. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'»."}');
// Suppression des notes d'une matière
if ( isset($_REQUEST['supprime_notes']) )
- exit( ( requete('notes',"DELETE FROM notes WHERE matiere = $id",$mysqli) && requete('matieres',"UPDATE matieres SET notes = 0 WHERE id = $id",$mysqli) )
+ exit( requete('notes',"DELETE FROM notes WHERE matiere = $id",$mysqli) && requete('matieres',"UPDATE matieres SET notes = 0 WHERE id = $id",$mysqli)
? "{\"etat\":\"ok\",\"message\":\"Les notes de la matière ${r['nom']} ont été supprimées.\"}"
: "{\"etat\":\"nok\",\"message\":\"Les notes de la matière ${r['nom']} n'ont pas été supprimées. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'»."}');
// Suppression des documents d'une matière
if ( isset($_REQUEST['supprime_docs']) ) {
- if ( requete('reps',"DELETE FROM reps WHERE matiere = $id AND parent > 0",$mysqli) ) {
+ if ( requete('reps',"DELETE FROM reps WHERE matiere = $id AND parent > 0",$mysqli)
+ && requete('docs',"DELETE FROM docs WHERE matiere = $id",$mysqli)
+ && requete('matieres',"UPDATE matieres SET docs = 0 WHERE id = $id",$mysqli)
+ && requete('recents',"DELETE FROM recents WHERE type = 3 AND matiere = $id",$mysqli)
+ && rss($mysqli,$id,0) ) {
// Suppression physique
$resultat = $mysqli->query("SELECT lien FROM docs WHERE matiere = $id");
if ( $resultat->num_rows ) {
while ( $r = $resultat->fetch_row() )
exec("rm -rf documents/${r[0]}");
$resultat->free();
- requete('docs',"DELETE FROM docs WHERE matiere = $id",$mysqli);
}
- requete('matieres',"UPDATE matieres SET docs = 0 WHERE id = $id",$mysqli);
exit("{\"etat\":\"ok\",\"message\":\"Les répertoires et documents de la matière ${r['nom']} ont été supprimés.\"}");
}
exit("{\"etat\":\"nok\",\"message\":\"Les documents de la matière ${r['nom']} n'ont pas été supprimés. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'»."}');
@@ -1732,76 +1756,71 @@
//////////////////////////////////////////
// Modification d'un utilisateur unique //
//////////////////////////////////////////
-elseif ( ( $action == 'utilisateur' ) && isset($_REQUEST['modif']) && in_array($modif = $_REQUEST['modif'],array('mailenvoi','prefs','desactive','active','supprutilisateur','validutilisateur')) && isset($_REQUEST['id']) && ctype_digit($id = $_REQUEST['id']) ) {
+elseif ( ( $action == 'utilisateur' ) && isset($_REQUEST['modif']) && in_array($modif = $_REQUEST['modif'],array('prefs','desactive','active','supprutilisateur','validutilisateur')) && isset($_REQUEST['id']) && ctype_digit($id = $_REQUEST['id']) ) {
// Vérification que l'identifiant est valide
// Attention, les valeurs "valide", "demande" et "invitation" sont des chaines de caractères égales à '0' ou '1'.
- $resultat = $mysqli->query("SELECT nom, prenom, login, matieres, mail, (LENGTH(mdp)=40) AS valide, (LEFT(mdp,1)='*') AS demande, (LENGTH(mdp)=1) AS invitation, autorisation, mailenvoi, mailexp, mailliste, mailcopie FROM utilisateurs WHERE id = $id");
+ $resultat = $mysqli->query("SELECT nom, prenom, login, matieres, mail, (LENGTH(mdp)=40) AS valide, (LEFT(mdp,1)='*') AS demande, (LENGTH(mdp)=1) AS invitation, autorisation, mailexp, mailcopie FROM utilisateurs WHERE id = $id");
if ( !$resultat->num_rows )
exit('{"etat":"nok","message":"Identifiant non valide"}');
$r = $resultat->fetch_assoc();
$resultat->free();
- $compte = ( strlen($r['nom'].$r['prenom']) ) ? "de ${r['prenom']} ${r['nom']}" : "${r['login']}";
+ $compte = ( $r['nom'].$r['prenom'] ) ? "de ${r['prenom']} ${r['nom']}" : "${r['login']}";
switch ( $modif ) {
- // Modification de la possibilité d'envoyer des mails seulement
- case 'mailenvoi': {
- $val = intval( isset($_REQUEST['val']) && $_REQUEST['val'] );
- if ( $r['autorisation'] == 1 )
- exit('{"etat":"nok","message":"Un compte de type invité ne peut pas envoyer des courriels."}');
- if ( $val == $r['mailenvoi'] )
- exit('{"etat":"ok","message":"Ce réglage était déjà celui en place. Aucune modification n\'a été effectuée."}');
- if ( $val && !strlen($r['mail']) )
- exit('{"etat":"nok","message":"Un compte ne peut envoyer de courriel sans adresse électronique valide."}');
- if ( requete('utilisateurs',"UPDATE utilisateurs SET mailenvoi = $val, mailexp = IF($val AND mailexp = '',CONCAT(prenom,' ',nom),mailexp) WHERE id = $id",$mysqli) )
- exit('{"etat":"ok","message":"Les préférences d\'envoi de mail '.$compte.' ont été modifiées."}');
- exit('{"etat":"nok","message":"Les préférences d\'envoi de mail '.$compte.' n\'ont pas été modifiées. Erreur MySQL n°'.$mysqli->errno.', «'.$mysqli->error.'»."}');
- }
-
// Modification des données du compte (venant du formulaire de utilisateurs.php)
case 'prefs': {
- $modifications = array_diff_assoc( array( 'nom'=>trim($_REQUEST['nom']), 'prenom'=>trim($_REQUEST['prenom']), 'login'=>trim($_REQUEST['login']), 'mail'=>mb_strtolower(trim($_REQUEST['mail1'])), 'mailexp'=>trim(isset($_REQUEST['mailexp']) ? isset($_REQUEST['mailexp']) : ''), 'mailenvoi'=>intval(isset($_REQUEST['mailenvoi'])), 'mailcopie'=>intval(isset($_REQUEST['mailcopie'])), 'mailliste'=>intval(isset($_REQUEST['mailliste'])) ), $r);
- if ( !$modifications )
- exit('{"etat":"ok","message":"Les valeurs fournies étaient celles déjà enregistrées. Aucune modification n\'a été effectuée."}');
- $requete = '';
- if ( isset($modifications['nom']) && strlen($nom = mb_convert_case(strip_tags($mysqli->real_escape_string($modifications['nom'])),MB_CASE_TITLE)) )
- $requete .= ", nom = '$nom'";
- if ( isset($modifications['prenom']) && strlen($prenom = mb_convert_case(strip_tags($mysqli->real_escape_string($modifications['prenom'])),MB_CASE_TITLE)) )
- $requete .= ", prenom = '$prenom'";
- if ( isset($modifications['login']) && strlen($login = mb_strtolower(str_replace(' ','_',$modifications['login']))) ) {
- // Vérification que le login n'existe pas déjà
- $resultat = $mysqli->query("SELECT GROUP_CONCAT(login) FROM utilisateurs WHERE id != $id");
- $s = $resultat->fetch_row();
- $resultat->free();
- if ( !in_array($login,explode(',',$s[0])) )
- $requete .= ', login = \''.$mysqli->real_escape_string($login).'\'';
+ // Fonction de fabrication de la partie modifiante de la requête
+ function fabriqueupdate($requete,$mysqli) {
+ $chaine = '';
+ foreach ($requete as $champ=>$val)
+ $chaine .= ",$champ = '".$mysqli->real_escape_string($val).'\'';
+ return substr($chaine,1);
+ }
+ // Valeurs à modifier
+ $requete = array_diff_assoc( array( 'nom'=>trim($_REQUEST['nom']), 'prenom'=>trim($_REQUEST['prenom']), 'login'=>trim($_REQUEST['login']), 'mail'=>mb_strtolower(trim($_REQUEST['mail1'])), 'mailexp'=>(trim($_REQUEST['mailexp']) ?? ''), 'mailcopie'=>intval(isset($_REQUEST['mailcopie'])) ), $r);
+ if ( isset($requete['nom']) && !($nom = mb_convert_case(strip_tags($requete['nom']),MB_CASE_TITLE)) )
+ unset($requete['nom']);
+ if ( isset($requete['prenom']) && !($prenom = mb_convert_case(strip_tags($requete['prenom']),MB_CASE_TITLE)) )
+ unset($requete['prenom']);
+ if ( isset($requete['login']) ) {
+ if ( !($login = mb_strtolower(str_replace(' ','_',$requete['login']))) )
+ unset($requete['login']);
+ else {
+ // Vérification que le login n'existe pas déjà
+ $resultat = $mysqli->query("SELECT GROUP_CONCAT(login) FROM utilisateurs WHERE id != $id");
+ $s = $resultat->fetch_row();
+ $resultat->free();
+ if ( in_array($login,explode(',',$s[0])) )
+ unset($requete['login']);
+ }
}
- if ( isset($modifications['mail']) && filter_var($mail = $modifications['mail'],FILTER_VALIDATE_EMAIL) && isset($_REQUEST['mail2']) ) {
- if ( $mail != mb_strtolower(trim($_REQUEST['mail2'])) )
+ if ( isset($requete['mail']) ) {
+ if ( !filter_var($mail = $requete['mail'],FILTER_VALIDATE_EMAIL) || !isset($_REQUEST['mail2']) )
+ unset($requete['mail']);
+ elseif ( $mail != mb_strtolower(trim($_REQUEST['mail2'])) )
exit('{"etat":"nok","message":"Les préférences '.$compte.' n\'ont pas été modifiées, les deux adresses électroniques saisies ne sont pas identiques."}');
- // Vérification que l'adresse n'existe pas déjà
- $resultat = $mysqli->query("SELECT GROUP_CONCAT(mail) FROM utilisateurs WHERE id != $id AND mail > ''");
- $s = $resultat->fetch_row();
- $resultat->free();
- if ( !in_array($mail,explode(',',$s[0])) )
- $requete .= ', mail = \''.$mysqli->real_escape_string($r['mail'] = $mail).'\'';
+ else {
+ // Vérification que l'adresse n'existe pas déjà
+ $resultat = $mysqli->query("SELECT GROUP_CONCAT(mail) FROM utilisateurs WHERE id != $id AND mail > ''");
+ $s = $resultat->fetch_row();
+ $resultat->free();
+ if ( in_array($mail,explode(',',$s[0])) )
+ unset($requete['mail']);
+ }
}
- if ( isset($modifications['mailenvoi']) && ( $r['autorisation'] > 1 ) && ( !$modifications['mailenvoi'] || strlen($r['mail']) ) )
- $requete .= ', mailenvoi = \''.( $r['mailenvoi'] = $modifications['mailenvoi'] ).'\'';
- if ( $r['mailenvoi'] ) {
- if ( isset($modifications['mailexp']) && strlen($mailexp = strip_tags($mysqli->real_escape_string($modifications['mailexp']))) )
- $requete .= ", mailexp = '$mailexp'";
- elseif ( !strlen($r['mailexp']) )
- $requete .= ', mailexp = CONCAT(prenom,\' \',nom)';
- if ( isset($modifications['mailcopie']) )
- $requete .= ", mailcopie = ${modifications['mailcopie']}";
- if ( isset($modifications['mailliste']) && ( $r['autorisation'] > 2 ) )
- $requete .= ", mailliste = ${modifications['mailliste']}";
- }
- if ( !strlen($requete) )
- exit('{"etat":"nok","message":"Les préférences '.$compte.' n\'ont pas été modifiées, les valeurs saisies sont identiques à celles existantes."}');
- if( requete('utilisateurs','UPDATE utilisateurs SET '.substr($requete,2)." WHERE id = $id",$mysqli) )
+ if ( isset($requete['mailexp']) && !($mailexp = strip_tags($requete['mailexp'])) )
+ unset($requete['mailexp']);
+ if ( !$requete )
+ exit('{"etat":"ok","message":"Les valeurs fournies étaient celles déjà enregistrées. Aucune modification n\'a été effectuée."}');
+ if( requete('utilisateurs','UPDATE utilisateurs SET '.fabriqueupdate($requete)." WHERE id = $id",$mysqli) ) {
+ // Si interface globale activée, mise à jour
+ if ( ( $r['autorisation'] > 1 ) && $interfaceglobale ) {
+ include("${interfaceglobale}majutilisateurs.php");
+ majutilisateurs($id,$requete);
+ }
exit($_SESSION['message'] = '{"etat":"ok","message":"Les préférences '.$compte.' ont été modifiées."}');
+ }
exit('{"etat":"nok","message":"Les préférences '.$compte.' n\'ont pas été modifiées. Erreur MySQL n°'.$mysqli->errno.', «'.$mysqli->error.'»."}');
}
@@ -1811,8 +1830,14 @@
exit($_SESSION['message'] = "{\"etat\":\"ok\",\"message\":\"Le compte $compte est déjà actuellement désactivé.\"}");
if ( ( $r['demande'] == 1 ) || ( $r['invitation'] == 1 ) )
exit($_SESSION['message'] = "{\"etat\":\"ok\",\"message\":\"Le compte $compte n'est pas actuellement désactivable.\"}");
- if ( requete('utilisateurs',"UPDATE utilisateurs SET mdp = CONCAT('!',mdp) WHERE id = $id",$mysqli) )
+ if ( requete('utilisateurs',"UPDATE utilisateurs SET mdp = CONCAT('!',mdp) WHERE id = $id",$mysqli) ) {
+ // Si interface globale activée, mise à jour
+ if ( ( $r['autorisation'] > 1 ) && $interfaceglobale ) {
+ include("${interfaceglobale}majutilisateurs.php");
+ majutilisateurs($id,'désactivation');
+ }
exit($_SESSION['message'] = "{\"etat\":\"ok\",\"message\":\"Compte $compte désactivé\"}");
+ }
exit("{\"etat\":\"nok\",\"message\":\"La désactivation du compte $compte n'a pas été réalisée. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'»."}');
}
@@ -1822,8 +1847,14 @@
exit($_SESSION['message'] = "{\"etat\":\"ok\",\"message\":\"Le compte $compte est déjà actuellement activé.\"}");
if ( ( $r['demande'] == 1 ) || ( $r['invitation'] == 1 ) )
exit($_SESSION['message'] = "{\"etat\":\"ok\",\"message\":\"Le compte $compte n'est pas actuellement activable.\"}");
- if ( requete('utilisateurs',"UPDATE utilisateurs SET mdp = SUBSTR(mdp,2) WHERE id = $id",$mysqli) )
+ if ( requete('utilisateurs',"UPDATE utilisateurs SET mdp = SUBSTR(mdp,2) WHERE id = $id",$mysqli) ) {
+ // Si interface globale activée, mise à jour
+ if ( ( $r['autorisation'] > 1 ) && $interfaceglobale ) {
+ include("${interfaceglobale}majutilisateurs.php");
+ majutilisateurs($id,'activation');
+ }
exit($_SESSION['message'] = "{\"etat\":\"ok\",\"message\":\"Compte $compte réactivé\"}");
+ }
exit("{\"etat\":\"nok\",\"message\":\"La réactivation du compte $compte n'a pas été réalisée. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'»."}');
}
@@ -1843,12 +1874,17 @@
$resultat->free();
if ( !is_null($s[0]) ) {
requete('notes',"DELETE FROM notes WHERE eleve = $id",$mysqli);
- requete('heurescolles',"DELETE heurescolles FROM heurescolles LEFT JOIN notes ON heurescolles.id=notes.heure
+ requete('heurescolles',"DELETE FROM heurescolles LEFT JOIN notes ON heurescolles.id=notes.heure
WHERE FIND_IN_SET(heurescolles.id,'${s[0]}') AND notes.id IS NULL",$mysqli);
requete('heurescolles',"UPDATE heurescolles SET duree = duree-(SELECT dureecolle FROM matieres WHERE matieres.id = heurescolles.matiere)
WHERE FIND_IN_SET(heurescolles.id,'${s[0]}') AND releve = 0",$mysqli);
}
}
+ // Si interface globale activée, mise à jour
+ if ( ( $r['autorisation'] > 1 ) && $interfaceglobale ) {
+ include("${interfaceglobale}majutilisateurs.php");
+ majutilisateurs($id,'suppression');
+ }
exit($_SESSION['message'] = "{\"etat\":\"ok\",\"message\":\"Compte $compte supprimé\"}");
}
exit("{\"etat\":\"nok\",\"message\":\"La suppression du compte $compte n'a pas été réalisée. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'»."}');
@@ -1862,7 +1898,7 @@
mail($r['mail'],'=?UTF-8?B?'.base64_encode('[Cahier de Prépa] Compte validé').'?=',
"Bonjour
-Vous avez rempli une demande de création de compte sur le Cahier de Prépa , correspondant à l'identifiant ${r['login']}.
+Vous avez rempli une demande de création de compte sur le Cahier de Prépa , correspondant à l'identifiant ${r['login']}.
Cette demande vient de recevoir une réponse favorable de la part de l'équipe pédagogique en charge du site. Vous pouvez donc désormais vous connecter avec votre identifiant et votre mot de passe.
@@ -1872,6 +1908,11 @@
--
Cahier de Prépa
",'From: =?UTF-8?B?'.base64_encode('Cahier de Prépa')."?= <$mailadmin>\r\nContent-type: text/plain; charset=UTF-8","-f$mailadmin");
+ // Si interface globale activée, mise à jour
+ if ( ( $r['autorisation'] > 1 ) && $interfaceglobale ) {
+ include("${interfaceglobale}majutilisateurs.php");
+ majutilisateurs($id,'activation');
+ }
exit($_SESSION['message'] = "{\"etat\":\"ok\",\"message\":\"Demande de compte $compte accordée. L'élève a été prévenu par courriel.\"}");
}
exit("{\"etat\":\"nok\",\"message\":\"La validation du compte $compte n'a pas été réalisée. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'»."}');
@@ -1882,54 +1923,54 @@
//////////////////////////////////////////
// Modification multiple d'utilisateurs //
//////////////////////////////////////////
-elseif ( ( $action == 'utilisateurs' ) && isset($_REQUEST['modif']) && in_array($modif = $_REQUEST['modif'],array('mailenvoi','desactive','active','supprutilisateur','validutilisateur')) && isset($_REQUEST['ids']) && strlen($ids = implode(',',array_filter(explode(',',$_REQUEST['ids']),function($id) { return ctype_digit($id); }))) ) {
+elseif ( ( $action == 'utilisateurs' ) && isset($_REQUEST['modif']) && in_array($modif = $_REQUEST['modif'],array('desactive','active','supprutilisateur','validutilisateur')) && isset($_REQUEST['ids']) && strlen($ids = implode(',',array_filter(explode(',',$_REQUEST['ids']),function($id) { return ctype_digit($id); }))) ) {
// Vérification que les identifiants sont valides
// Attention, les valeurs "valide", "demande" et "invitation" sont des chaines de caractères égales à '0' ou '1'.
- $resultat = $mysqli->query("SELECT id, nom, prenom, login, mail, (LENGTH(mdp)=40) AS valide, (LEFT(mdp,1)='*') AS demande, (LENGTH(mdp)=1) AS invitation, autorisation, mailenvoi, mailexp, mailliste, mailcopie FROM utilisateurs WHERE FIND_IN_SET(id,'$ids')");
+ $resultat = $mysqli->query("SELECT id, nom, prenom, login, mail, (LENGTH(mdp)=40) AS valide, (LEFT(mdp,1)='*') AS demande, (LENGTH(mdp)=1) AS invitation, autorisation, mailexp, mailcopie FROM utilisateurs WHERE FIND_IN_SET(id,'$ids')");
if ( !$resultat->num_rows )
exit('{"etat":"nok","message":"Identifiants non valides"}');
$message = array('ok'=>'','nok'=>'');
switch ( $modif ) {
- // Modification de la possibilité d'envoyer des mails seulement
- case 'mailenvoi': {
- $val = intval( isset($_REQUEST['val']) && ( $_REQUEST['val'] == 1 ) );
- while ( $r = $resultat->fetch_assoc() ) {
- $compte = ( strlen($r['nom'].$r['prenom']) ) ? "de ${r['prenom']} ${r['nom']}" : "${r['login']}";
- if ( ( $r['autorisation'] == 1 ) || ( $val == $r['mailenvoi'] ) || ( $val && !strlen($r['mail']) ) )
- $message['nok'] .= "Les préférences d'envoi de mail $compte n'ont pas été modifiées, car le compte ne peut envoyer de mail ou en envoie déjà. ";
- elseif ( requete('utilisateurs',"UPDATE utilisateurs SET mailenvoi = $val, mailexp = IF($val AND mailexp = '',CONCAT(prenom,' ',nom),mailexp) WHERE id = ${r['id']}",$mysqli) )
- $message['ok'] .= "Les préférences d'envoi de mail $compte ont été modifiées. ";
- else
- $message['nok'] .= "Les préférences d'envoi de mail $compte n'ont pas été modifiées. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'» ';
- }
- }
-
// Désactivation
case 'desactive': {
while ( $r = $resultat->fetch_assoc() ) {
$compte = ( strlen($r['nom'].$r['prenom']) ) ? "de ${r['prenom']} ${r['nom']}" : "${r['login']}";
if ( ( $r['demande'] == 1 ) || ( $r['invitation'] == 1 ) || ( $r['valide'] == 0 ) )
$message['nok'] .= "Le compte $compte n'a pas été désactivé, car il l'est déjà ou ne peut pas l'être. ";
- elseif ( requete('utilisateurs',"UPDATE utilisateurs SET mdp = CONCAT('!',mdp) WHERE id = ${r['id']}",$mysqli) )
+ elseif ( requete('utilisateurs',"UPDATE utilisateurs SET mdp = CONCAT('!',mdp) WHERE id = ${r['id']}",$mysqli) ) {
+ // Si interface globale activée, mise à jour
+ if ( ( $r['autorisation'] > 1 ) && $interfaceglobale ) {
+ include_once("${interfaceglobale}majutilisateurs.php");
+ majutilisateurs($r['id'],'désactivation');
+ }
$message['ok'] .= "Le compte $compte a été désactivé. ";
+ }
else
$message['nok'] .= "Le compte $compte n'a pas été désactivé. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'» ';
}
+ break;
}
// Réactivation
case 'active': {
while ( $r = $resultat->fetch_assoc() ) {
- $compte = ( strlen($r['nom'].$r['prenom']) ) ? "de ${r['prenom']} ${r['nom']}" : "${r['login']}";
+ $compte = ( $r['nom'].$r['prenom'] ) ? "de ${r['prenom']} ${r['nom']}" : "${r['login']}";
if ( ( $r['demande'] == 1 ) || ( $r['invitation'] == 1 ) || ( $r['valide'] == 1 ) )
$message['nok'] .= "Le compte $compte n'a pas été activé, car il l'est déjà ou ne peut pas l'être. ";
- elseif ( requete('utilisateurs',"UPDATE utilisateurs SET mdp = SUBSTR(mdp,2) WHERE id = ${r['id']}",$mysqli) )
+ elseif ( requete('utilisateurs',"UPDATE utilisateurs SET mdp = SUBSTR(mdp,2) WHERE id = ${r['id']}",$mysqli) ) {
+ // Si interface globale activée, mise à jour
+ if ( ( $r['autorisation'] > 1 ) && $interfaceglobale ) {
+ include_once("${interfaceglobale}majutilisateurs.php");
+ majutilisateurs($r['id'],'activation');
+ }
$message['ok'] .= "Le compte $compte a été réactivé. ";
+ }
else
$message['nok'] .= "Le compte $compte n'a pas été réactivé. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'» ';
}
+ break;
}
// Suppression
@@ -1938,20 +1979,23 @@
$compte = ( strlen($r['nom'].$r['prenom']) ) ? "de ${r['prenom']} ${r['nom']}" : "${r['login']}";
if ( requete('utilisateurs',"DELETE FROM utilisateurs WHERE id = ${r['id']}",$mysqli)
&& requete('groupes',"UPDATE groupes SET utilisateurs = TRIM(BOTH ',' FROM REPLACE(CONCAT(',',utilisateurs,','),',${r['id']},',',')) WHERE FIND_IN_SET(${r['id']},utilisateurs)",$mysqli) ) {
+ // Si interface globale activée, mise à jour
+ if ( ( $r['autorisation'] > 1 ) && $interfaceglobale ) {
+ include_once("${interfaceglobale}majutilisateurs.php");
+ majutilisateurs($r['id'],'suppression');
+ }
// Recherche des notes : cas des colleurs/profs
if ( $r['autorisation'] > 2 ) {
- requete('notes',"DELETE FROM notes WHERE colleur = $id",$mysqli);
- requete('heurescolles',"DELETE FROM heurescolles WHERE colleur = $id",$mysqli);
+ requete('notes',"DELETE FROM notes WHERE colleur = ${r['id']}",$mysqli);
+ requete('heurescolles',"DELETE FROM heurescolles WHERE colleur = ${r['id']}",$mysqli);
}
// Recherche des notes : cas des élèves
elseif ( $r['autorisation'] == 2 ) {
- $resultat = $mysqli->query("SELECT GROUP_CONCAT(heure) FROM notes WHERE eleve = $id");
- $s = $resultat->fetch_row();
- $resultat->free();
+ $resultat2 = $mysqli->query("SELECT GROUP_CONCAT(heure) FROM notes WHERE eleve = ${r['id']}");
+ $s = $resultat2->fetch_row();
+ $resultat2->free();
if ( !is_null($s[0]) ) {
- requete('notes',"DELETE FROM notes WHERE eleve = $id",$mysqli);
- requete('heurescolles',"DELETE heurescolles FROM heurescolles LEFT JOIN notes ON heurescolles.id=notes.heure
- WHERE FIND_IN_SET(heurescolles.id,'${s[0]}') AND notes.id IS NULL",$mysqli);
+ requete('notes',"DELETE FROM notes WHERE eleve = ${r['id']}",$mysqli);
requete('heurescolles',"UPDATE heurescolles SET duree = duree-(SELECT dureecolle FROM matieres WHERE matieres.id = heurescolles.matiere)
WHERE FIND_IN_SET(heurescolles.id,'${s[0]}') AND releve = 0",$mysqli);
}
@@ -1961,6 +2005,10 @@
else
$message['nok'] .= "Le compte $compte n'a pas été supprimé. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'» ';
}
+ // Nettoyage des groupes et des heures de colles
+ requete('heurescolles',"DELETE FROM heurescolles LEFT JOIN notes ON heurescolles.id=notes.heure WHERE notes.id IS NULL",$mysqli);
+ requete('groupes',"DELETE FROM groupes WHERE utilisateurs = ''",$mysqli);
+ break;
}
// Validation d'une demande
@@ -1970,10 +2018,16 @@
if ( $r['demande'] == 0 )
$message['nok'] .= "La demande $compte a déjà été validée. ";
elseif ( requete('utilisateurs',"UPDATE utilisateurs SET mdp = SUBSTR(mdp,2) WHERE id = ${r['id']}",$mysqli) ) {
+ // Si interface globale activée, mise à jour
+ if ( ( $r['autorisation'] > 1 ) && $interfaceglobale ) {
+ include_once("${interfaceglobale}majutilisateurs.php");
+ majutilisateurs($r['id'],'activation');
+ }
+ // Envoi de courriel de confirmation
mail($r['mail'],'=?UTF-8?B?'.base64_encode('[Cahier de Prépa] Compte validé').'?=',
"Bonjour
-Vous avez rempli une demande de création de compte sur le Cahier de Prépa , correspondant à l'identifiant ${r['login']}.
+Vous avez rempli une demande de création de compte sur le Cahier de Prépa , correspondant à l'identifiant ${r['login']}.
Cette demande vient de recevoir une réponse favorable de la part de l'équipe pédagogique en charge du site. Vous pouvez donc désormais vous connecter avec votre identifiant et votre mot de passe.
@@ -2060,6 +2114,11 @@
if ( requete('utilisateurs',"INSERT INTO utilisateurs SET login = '$login', prenom = '$prenom', nom = '$nom', mdp = '".sha1($mdp.$u[2])."', autorisation = $autorisation, matieres = '$matieres', timeout = 900",$mysqli) ) {
$message .= " Ligne $i : ok ($prenom $nom, identifiant $login)";
$n = $n+1;
+ // Si interface globale activée, mise à jour
+ if ( $interfaceglobale ) {
+ include_once("${interfaceglobale}majutilisateurs.php");
+ majutilisateurs($mysqli->insert_id,"INSERT INTO utilisateurs SET login = '$login', prenom = '$prenom', nom = '$nom', mail = '', mdp = '".sha1($mdp.$u[2])."', autorisation = $autorisation");
+ }
}
else
$message .= " Ligne $i : erreur MySQL n°".$mysqli->errno.' «'.$mysqli->error.'»';
@@ -2075,22 +2134,24 @@
elseif ( !filter_var($mail,FILTER_VALIDATE_EMAIL) )
$message .= " Ligne $i : adresse électronique non valide ($prenom $nom)";
else {
- $mailenvoi = intval(isset($_REQUEST['mailenvoi']));
- $mailexp = $mailenvoi ? "$prenom $nom" : '';
- $mailliste = ( $mailenvoi && ( $autorisation > 2 ) ) ? intval(isset($_REQUEST['mailliste'])) : 0;
- if ( requete('utilisateurs',"INSERT INTO utilisateurs SET login = '$login', prenom = '$prenom', nom = '$nom', mail = '$mail', mdp = '?', autorisation = $autorisation, matieres = '$matieres', timeout = 900, mailenvoi = $mailenvoi, mailcopie = $mailenvoi, mailexp = '$mailexp', mailliste = $mailliste",$mysqli) ) {
+ if ( requete('utilisateurs',"INSERT INTO utilisateurs SET login = '$login', prenom = '$prenom', nom = '$nom', mail = '$mail', mdp = '?', autorisation = $autorisation, matieres = '$matieres', timeout = 900, mailexp = '$prenom $nom'",$mysqli) ) {
$message .= " Ligne $i : ok ($prenom $nom, identifiant $login)";
$n = $n+1;
- $lien = 'https://'.$site.'/gestioncompte?invitation&mail='.str_replace('@','__',$mail).'&p='.sha1($site.$mdp.$mail);
+ // Si interface globale activée, mise à jour
+ if ( $interfaceglobale ) {
+ include_once("${interfaceglobale}majutilisateurs.php");
+ majutilisateurs($mysqli->insert_id,"INSERT INTO utilisateurs SET login = '$login', prenom = '$prenom', nom = '$nom', mail = '$mail', mdp = '?', autorisation = $autorisation");
+ }
// Récupération de l'adresse électronique du professeur connecté
$resultat = $mysqli->query("SELECT mail FROM utilisateurs WHERE id = ${_SESSION['id']}");
$s = $resultat->fetch_row();
$resultat->free();
$returnpath = $s[0] ?: $mailadmin;
+ $lien = "https://$domaine${chemin}gestioncompte?invitation&mail=".str_replace('@','__',$mail).'&p='.sha1($chemin.$mdp.$mail);
mail($mail,'=?UTF-8?B?'.base64_encode('[Cahier de Prépa] Invitation').'?=',
"Bonjour
-L'équipe pédagogique en charge du Cahier de Prépa vous invite à les rejoindre.
+L'équipe pédagogique en charge du Cahier de Prépa vous invite à les rejoindre.
S'il s'agit d'une erreur, merci d'ignorer simplement ce courriel.
@@ -2300,17 +2361,22 @@
// Récupérations des donnees envoyées
$colles = ( isset($_REQUEST['colles']) ) ? $_REQUEST['colles'] : array();
$vacances = ( isset($_REQUEST['vacances']) ) ? $_REQUEST['vacances'] : array();
+ // Valeur maximale du code vacances
+ $resultat = $mysqli->query('SELECT MAX(id) FROM vacances');
+ $vmax = $resultat->fetch_row()[0];
+ $resultat->free();
// Comparaison et modification
$modif = array();
$resultat = $mysqli->query('SELECT id, colle, vacances, DATE_FORMAT(debut,\'%d/%m/%Y\') AS debut FROM semaines');
while ( $r = $resultat->fetch_assoc() ) {
- $v = intval( ( ctype_digit($v = $vacances[$r['id']]) && ( $v < 5 ) ) ? $v : 0 );
+ $v = intval( ( ctype_digit($v = $vacances[$r['id']]) && ( $v <= $vmax ) ) ? $v : 0 );
$c = intval( isset($colles[$r['id']]) && !$v );
if ( ( $c != $r['colle'] ) || ( $v != $r['vacances'] ) ) {
requete('semaines',"UPDATE semaines SET colle = $c, vacances = $v WHERE id = ${r['id']}",$mysqli);
$modif[] = "semaine du ${r['debut']}";
}
}
+ $resultat->free();
// Message à afficher
exit( $modif ? '{"etat":"ok","message":"Les modifications ont été réalisées ('.implode(', ',$modif).')."}' : '{"etat":"ok","message":"Aucune modification n\'a été réalisée."}');
}
@@ -2327,10 +2393,8 @@
exit('{"etat":"nok","message":"Identifiant non valide"}');
$r = $resultat->fetch_row();
$resultat->free();
- if ( requete('agenda',"DELETE FROM agenda WHERE id = $id",$mysqli) ) {
- recent($mysqli,5,$id,$r[0]);
+ if ( requete('agenda',"DELETE FROM agenda WHERE id = $id",$mysqli) && recent($mysqli,4,$id) )
exit($_SESSION['message'] = '{"etat":"ok","message":"La suppression a été réalisée."}');
- }
exit('{"etat":"nok","message":"L\'événement n\'a pas été supprimé. Erreur MySQL n°'.$mysqli->errno.', «'.$mysqli->error.'»."}');
}
@@ -2369,7 +2433,7 @@
// Besoin du nom pour les informations récentes
$r = $resultat->fetch_row();
$resultat->free();
- $type = $r[0];
+ $type = $mysqli->real_escape_string($r[0]);
if ( $mid ) {
// Validation de la matière si non nulle
$resultat = $mysqli->query("SELECT nom FROM matieres WHERE id = $mid");
@@ -2392,7 +2456,7 @@
$resultat->free();
// Écriture dans la base de données
if ( requete('agenda',"UPDATE agenda SET matiere = $mid, type = $tid, debut = '$debut', fin = '$fin', texte = '$texte' WHERE id = $id", $mysqli) ) {
- recent($mysqli,5,$id,$mid,array('titre'=>"$jour/$mois - $type ".( strlen($matiere) ? $mysqli->real_escape_string("en $matiere ") : '').'(mise à jour)', 'lien'=>"agenda?mois=$annee$mois", 'texte'=>$texte, 'matiere'=>$mid, 'protection'=>0));
+ recent($mysqli,5,$id,array('titre'=>"$jour/$mois - $type ".( strlen($matiere) ? $mysqli->real_escape_string("en $matiere ") : ''), 'lien'=>"agenda?mois=$annee$mois", 'texte'=>$texte, 'matiere'=>$mid));
$mysqli->query('ALTER TABLE agenda ORDER BY fin, debut');
exit($_SESSION['message'] = '{"etat":"ok","message":"L\'événement a été modifié."}');
}
@@ -2401,7 +2465,7 @@
// Nouvel événement
if ( requete('agenda',"INSERT INTO agenda SET matiere = $mid, type = $tid, debut = '$debut', fin = '$fin', texte = '$texte'", $mysqli) ) {
- recent($mysqli,5,$mysqli->insert_id,$mid,array('titre'=>"$jour/$mois - $type ".( strlen($matiere) ? $mysqli->real_escape_string("en $matiere ") : ''), 'lien'=>"agenda?mois=$annee$mois", 'texte'=>$texte, 'matiere'=>$mid, 'protection'=>0));
+ recent($mysqli,5,$mysqli->insert_id,array('titre'=>"$jour/$mois - $type ".( strlen($matiere) ? $mysqli->real_escape_string("en $matiere ") : ''), 'lien'=>"agenda?mois=$annee$mois", 'texte'=>$texte, 'matiere'=>$mid, 'protection'=>0));
$mysqli->query('ALTER TABLE agenda ORDER BY fin, debut');
exit($_SESSION['message'] = '{"etat":"ok","message":"L\'événement a été ajouté."}');
}
@@ -2490,7 +2554,7 @@
if ( requete('agenda',"INSERT INTO agenda (matiere,type,debut,fin,texte) VALUES $insertion", $mysqli) ) {
$mysqli->query('ALTER TABLE agenda ORDER BY fin, debut');
$debut = ( strlen($ancien_sql) ) ? $ancien_sql : $nouveau_sql;
- recent($mysqli,5,$mysqli->insert_id,$matiere,array('titre'=>substr($debut,8,2).'/'.substr($debut,5,2)." - Déplacement de colle en ".$mysqli->real_escape_string("${r[0]}, groupe $groupe"), 'lien'=>'agenda?mois='.substr($debut,2,2).substr($debut,5,2), 'texte'=>$texte, 'matiere'=>$matiere, 'protection'=>0));
+ recent($mysqli,5,$mysqli->insert_id,array('titre'=>substr($debut,8,2).'/'.substr($debut,5,2)." - Déplacement de colle en ".$mysqli->real_escape_string("${r[0]}, groupe $groupe"), 'lien'=>'agenda?mois='.substr($debut,2,2).substr($debut,5,2), 'texte'=>$texte, 'matiere'=>$matiere, 'protection'=>0));
exit($_SESSION['message'] = '{"etat":"ok","message":"Déplacement de colle ajouté"}');
}
else
@@ -2593,24 +2657,25 @@
// Génération des valeurs de protection
foreach ( array('colles','cdt','docs') as $fonction ) {
if ( isset($_REQUEST[$fonction.'_protection']) ) {
- $val = array_filter($_REQUEST[$fonction.'_protection'],function($id) { return ctype_digit($id); });
- if ( !count($val) )
+ // Génération de la valeur de protection
+ if ( !count($val = array_filter($_REQUEST[$fonction.'_protection'],function($id) { return ctype_digit($id); })) )
exit("{\"etat\":\"nok\",\"message\":\"La matière ${r['nom']} n'a pas été modifiée. La protection d'accès est incorrecte.\"}");
- if ( ( $val[0] == 0 ) || ( $val[0] == 32 ) )
- $protection = $val[0];
- else {
- $protection = 32;
- foreach (array_slice($val,1) as $v)
- $protection = $protection-2**($v-1);
- }
+ $protection = ( ( $val[0] == 0 ) || ( $val[0] == 32 ) ) ? $val[0] : array_reduce($val, function($s,$v) { return $s - ( ( $v<6 ) ? 1<<($v-1) : 0 ); }, 32);
if ( $protection == $r[$fonction.'_protection'] )
exit('{"etat":"nok","message":"Aucune action effectuée : la protection saisie est la même que celle déjà en place."}');
- if ( requete('matieres',"UPDATE matieres SET ${fonction}_protection = $protection WHERE id = $id",$mysqli) ) {
- if ( $fonction == 'docs' )
- requete('reps',"UPDATE reps SET protection = $protection WHERE matiere = $id AND parent = 0",$mysqli);
- exit($_SESSION['message'] = "{\"etat\":\"ok\",\"message\":\"La matière ${r['nom']} a été modifiée.\"}");
+ if ( !requete('matieres',"UPDATE matieres SET ${fonction}_protection = $protection WHERE id = $id",$mysqli) )
+ exit("{\"etat\":\"nok\",\"message\":\"La matière ${r['nom']} n'a pas été modifiée. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'»."}');
+ // Mises à jour supplémentaires : répertoire racine, table recents, flux rss
+ if ( $fonction == 'colles' ) {
+ requete('recents',"UPDATE recents SET protection = $protection WHERE type = 2 AND matiere = $id",$mysqli);
+ rss($mysqli, $id, ( $r['colles_protection'] && $protection ) ? $r['colles_protection']^$protection : 0);
+ }
+ elseif ( $fonction == 'docs' ) {
+ requete('reps',"UPDATE reps SET protection = $protection WHERE matiere = $id AND parent = 0",$mysqli);
+ requete('recents',"UPDATE recents SET protection = $protection WHERE type = 3 AND matiere = $id",$mysqli);
+ rss($mysqli, $id, ( $r['docs_protection'] && $protection ) ? $r['docs_protection']^$protection : 0);
}
- exit("{\"etat\":\"nok\",\"message\":\"La matière ${r['nom']} n'a pas été modifiée. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'»."}');
+ exit($_SESSION['message'] = "{\"etat\":\"ok\",\"message\":\"La matière ${r['nom']} a été modifiée.\"}");
}
}
}
@@ -2620,26 +2685,43 @@
///////////////////////////////////////////
elseif ( $action == 'prefsglobales' ) {
- // Préférences de l'agenda : protection globale et nombre d'événements sur
- // la page d'accueil
- if ( isset($_REQUEST['protection_agenda']) && isset($_REQUEST['nb_agenda_index']) && count( $val = array_filter($_REQUEST['protection_agenda'],function($id) { return ctype_digit($id); }) ) && ctype_digit($nb_agenda_index = $_REQUEST['nb_agenda_index']) ) {
- if ( ( $val[0] == 0 ) || ( $val[0] == 32 ) )
- $protection = $val[0];
- else {
- $protection = 32;
- foreach (array_slice($val,1) as $v)
- $protection = $protection-2**($v-1);
- }
- if ( requete('prefs',"UPDATE prefs SET val = $protection WHERE nom='protection_agenda'",$mysqli) && requete('prefs',"UPDATE prefs SET val = $nb_agenda_index WHERE nom='nb_agenda_index'",$mysqli) )
+ // Préférences de l'agenda : protection globale et nombre d'événements sur la page d'accueil
+ if ( isset($_REQUEST['protection_agenda']) && isset($_REQUEST['nb_agenda_index']) && ctype_digit($nb_agenda_index = $_REQUEST['nb_agenda_index']) ) {
+ // Génération de la valeur de protection
+ if ( !count($val = array_filter($_REQUEST['protection_agenda'],function($id) { return ctype_digit($id); })) )
+ exit($_SESSION['message'] = '{"etat":"nok","message":"Les préférences d\'accès à l\'agenda n\'ont pas été modifiées."}');
+ $protection = ( ( $val[0] == 0 ) || ( $val[0] == 32 ) ) ? $val[0] : array_reduce($val, function($s,$v) { return $s - ( ( $v<6 ) ? 1<<($v-1) : 0 ); }, 32);
+ if ( requete('prefs',"UPDATE prefs SET val = $protection WHERE nom='protection_agenda'",$mysqli)
+ && requete('prefs',"UPDATE prefs SET val = $nb_agenda_index WHERE nom='nb_agenda_index'",$mysqli) )
exit($_SESSION['message'] = '{"etat":"ok","message":"Les préférences de l\'agenda ont été modifiées."}');
exit('{"etat":"nok","message":"Les préférences globales de l\'agenda n\'ont pas été modifiées. Erreur MySQL n°'.$mysqli->errno.', «'.$mysqli->error.'»."}');
}
+ // Préférence d'envoi de mail, venant de utilisateurs-mails.php
+ // $depuis : numéro du groupe expéditeur traité
+ // $vers : numéro du groupe destinataire traité ou 0 pour les traiter tous
+ // $ok : 1 pour autoriser, 0 pour interdire
+ elseif ( isset($_REQUEST['mails']) && isset($_REQUEST['depuis']) && isset($_REQUEST['vers']) && isset($_REQUEST['val']) && in_array($depuis = $_REQUEST['depuis'], array(2,3,4,5)) && in_array($vers = $_REQUEST['vers'], array(0,2,3,4,5)) && ctype_digit($ok = $_REQUEST['val']) ) {
+ // Masque : bits à modifier
+ $masque = ( $vers ) ? 1 << 4*($depuis-2)+$vers-2 : 15 << 4*($depuis-2);
+ // Récupération de la valeur originale
+ $resultat = $mysqli->query('SELECT val FROM prefs WHERE nom = "autorisation_mails"');
+ $val_orig = $resultat->fetch_row()[0];
+ // Modification
+ $val = ( $ok ) ? $val_orig | $masque : $val_orig & ( 65535 - $masque );
+ if ( $val == $val_orig )
+ exit('{"etat":"nok","message":"Aucune action effectuée : les autorisations d\'envoi demandées sont déjà celles en place."}');
+ if ( requete('prefs',"UPDATE prefs SET val = $val WHERE nom='autorisation_mails'",$mysqli) )
+ exit($_SESSION['message'] = '{"etat":"ok","message":"Les autorisations d\'envoi de courriels ont été modifiées."}');
+ exit('{"etat":"nok","message":"Les autorisations d\'envoi de courriels n\'ont pas été modifiées. Erreur MySQL n°'.$mysqli->errno.', «'.$mysqli->error.'»."}');
+ }
+
// Préférence de création de compte, venant de utilisateurs.php
- if ( isset($_REQUEST['creation_compte']) ) {
- if ( requete('prefs','UPDATE prefs SET val = '.intval(isset($_REQUEST['autoriser'])).' WHERE nom="creation_compte"',$mysqli) )
- exit($_SESSION['message'] = '{"etat":"ok","message":"Les créations de compte ont été '.( intval(isset($_REQUEST['autoriser'])) ? 'autorisées' : 'interdites' ).'."}');
- exit('{"etat":"nok","message":"Les préférences globales de l\'agenda n\'ont pas été modifiées. Erreur MySQL n°'.$mysqli->errno.', «'.$mysqli->error.'»."}');
+ elseif ( isset($_REQUEST['creation_compte']) ) {
+ $val = intval(isset($_REQUEST['autoriser']));
+ if ( requete('prefs',"UPDATE prefs SET val = $val WHERE nom='creation_compte'",$mysqli) )
+ exit($_SESSION['message'] = '{"etat":"ok","message":"Les créations de compte ont été '.( $val ? 'autorisées' : 'interdites' ).'."}');
+ exit('{"etat":"nok","message":"La possibilité de création de comptes n\'a pas été modifiée. Erreur MySQL n°'.$mysqli->errno.', «'.$mysqli->error.'»."}');
}
}
diff -urN cahier-de-prepa8.1.1/cdt.php cahier-de-prepa9.0.0/cdt.php
--- cahier-de-prepa8.1.1/cdt.php 2018-10-19 00:21:49.070458665 +0200
+++ cahier-de-prepa9.0.0/cdt.php 2019-08-28 01:48:23.005059192 +0200
@@ -64,28 +64,14 @@
//////////////////////////////////////////////////////
// Récupération des semaines et du nombre de semaines
-$resultat = $mysqli->query("SELECT id, DATE_FORMAT(debut,'%w%Y%m%e') AS debut, DATE_FORMAT(debut,'%y%v') AS semaine, vacances FROM semaines");
+$resultat = $mysqli->query("SELECT semaines.id, DATE_FORMAT(debut,'%w%Y%m%e') AS debut, DATE_FORMAT(debut,'%y%v') AS semaine, nom AS vacances
+ FROM semaines LEFT JOIN vacances ON semaines.vacances = vacances.id ORDER BY semaines.id");
$select_semaines = "\n ";
$semaines = $semaines_id = array(0=>'');
while ( $r = $resultat->fetch_assoc() ) {
$semaines[] = $r;
$semaines_id[] = $r['semaine'];
- switch ( $r['vacances'] ) {
- case 0:
- $select_semaines .= "\n ';
- break;
- case 1:
- $select_semaines .= "\n ";
- break;
- case 2:
- $select_semaines .= "\n ";
- break;
- case 3:
- $select_semaines .= "\n ";
- break;
- case 4:
- $select_semaines .= "\n ";
- }
+ $select_semaines .= "\n ';
}
$resultat->free();
$nmax = count($semaines);
@@ -161,27 +147,11 @@
-
+
";
-// Affichage du titre de chaque semaine
-function generetitre($date,$vacances) {
- switch ( $vacances ) {
- case 0:
- return'Semaine du '.format_date($date);
- case 1:
- return ucfirst(format_date($date))." : Vacances de Toussaint";
- case 2:
- return ucfirst(format_date($date))." : Vacances de Noël";
- case 3:
- return ucfirst(format_date($date))." : Vacances d'hiver";
- case 4:
- return ucfirst(format_date($date))." : Vacances de Pâques";
- }
-}
-
// Affichage public sans édition
if ( !$edition ) {
echo $boutons;
@@ -206,8 +176,8 @@
$semaine = $semaine+1;
if ( $semaine == $r['semaine'] )
$compteur = $compteur+1;
- if ( !strlen($recherche) || ( $semaine == $r['semaine'] ) )
- echo "\n
';
}
// Élément du cahier de texte
$mathjax = $mathjax ?: boolval(strpos($r['texte'],'$')+strpos($r['texte'],'\\'));
@@ -343,7 +313,7 @@
-
+
';
$p = $matiere['protection'];
diff -urN cahier-de-prepa8.1.1/CHANGELOG.php cahier-de-prepa9.0.0/CHANGELOG.php
--- cahier-de-prepa8.1.1/CHANGELOG.php 2018-11-11 00:57:39.075674052 +0100
+++ cahier-de-prepa9.0.0/CHANGELOG.php 2019-08-29 04:09:15.893212925 +0200
@@ -1,4 +1,4 @@
-Version actuelle : 8.1.1 (11/11/18)
+Version actuelle : 9.0.0 (29/08/19)
===================
Changements :
1.0 31/08/11 Première version
@@ -204,7 +204,7 @@
des mails, réglage particulier à chaque compte
* Gestion des accès entièrement revue, possibilité de réglage beaucoup plus fin
pour la protection de l'accès de chaque ressource
- * Création d'un nouveau type d'utilisateur : administration
+ * Création d'un nouveau type d'utilisateur : administration du lycée
* Gestion des utilisateurs améliorée
* Validations/suppressions/modifications multiples d'utilisateurs
* Possibilité de "désactiver" un compte sans le supprimer, par exemple pour
@@ -224,27 +224,41 @@
* Possibilité d'impression du relevé de colles pour le compte administratif
* Possibilité de déclaration de séances de cours ou TD sans note
8.1.1 11/11/18 Correction de bugs
+9.0.0 29/08/19 Nouvelles fonctionnalités :
+ * Interface globale de connexion permettant une meilleure expérience des
+ utilisateurs de plusieurs Cahiers, et changement de Cahier en direct
+ * Connexion possible à l'aide de son adresse électronique ou de l'identifiant
+ * Nouvelle interface sur écran mobile et correction de bugs d'affichage
+ * Nouvelle gestion de l'autorisation de l'envoi de courriel, plus lisible,
+ par groupe d'utilisateurs.
+ * Mise en avant des nouveaux contenus sur une page spéciale
+ * Deux dates enregistrables pour les informations, programmes de colle,
+ documents : date de première publication, date de mise à jour
+ * Correction de bugs pouvant amener des incohérences après des modifications
+ ou suppressions massives.
+ * Demande de confirmation si un texte a été saisi sans être enregistré (mais
+ dépend du réglage du navigateur)
+ * Planning dépendant de la zone scolaire
===================
Todo :
-[8.2] Janvier 2019
- * Mode lecture
- * Page de préférences globales : création de compte, protection globale, titre
- * Page de statistiques des colles toutes matières confondues ?
- * Correction des mises à jour multiples vers les informations récentes
- * FAQ
+[ 9.1 ] Septembre 2019
+ * Comptes administrateurs non nécessairement professeurs et inversement
+ * Possibilité pour les administrateurs de laisser un message sur une page ?
+ * Amélioration de la gestion des notes : page unique d'accès pour les élèves
+ et les colleurs, vue simplifiée pour les élèves, ajout de commentaires
+ * Amélioration de l'agenda
+
+[ 9.2 ] Janvier 2019
+ * Système de récupération des données et des documents
+
+[ 10.0 ] Août 2020
* Affichage en ligne des vidéos et fichiers sonores
* Pièce jointe sur les mails : téléchargement, enregistrement dans un répertoire
hors d'atteinte, lien spécial à insérer dans le corps du mail.
- * À côté de Cahier de Prépa : une interface spéciale pour l'administration des
- lycées qui voudraient récupérer les notes de colles sur plusieurs classes.
-
-[ 9.0 ] Septembre 2019
- * Commentaires sur les notes de colles
- * Harmonisation des matières : listes de matières pour les filières classiques.
- * Notes de colles : pouvoir préremplir de façon toujours identique
+ * Mode lecture, mode « vision en tant que » pour les administrateurs
* Meilleure visiblité des protections dans le menu
* Réglages des fichiers xls téléchargés (notes & utilisateurs)
* Mise en place d'un système de forum ?
@@ -256,28 +270,27 @@
* Vue de l'agenda sous forme de liste d'événements
* Recherche dans les événements
* Raccourcis cdt : texte pré-défini
- * Système de récupération des données/documents
* Paramétrage des styles pour les titres, des couleurs
- * Renvoi d'invitation
-
=======
Autres remarques / propositions :
+ * Renvoi d'invitation
+ * Notes de colles : pouvoir préremplir de façon toujours identique
+ * Page de statistiques des colles toutes matières confondues ?
+ * FAQ
+ * Page de préférences globales : création de compte, protection globale, titre
+ * Harmonisation des matières : listes de matières pour les filières classiques.
* Envoi multiple de documents
- * Modifications multiples sur des éléments (informations, pages, types ou
- séances de cahier de texte, documents...)
+ * Interface : glisser-déplacer pour changer les ordres d'affichage
* Tags dans les cahiers de texte
* Programme de colles par quinzaine
* ajouter la durée des séances dans le cahier de texte
* bug : interdire les "." dans les clés
* matière éditable depuis le menu -> modification de la matière seule (matieres.php accessible avec une clé)
* notes : savoir combien de notes sont attribuées à un compte avant suppression (gestion des doublons)
- * news : date de création, date de mise à jour ?
* modification de docs par les élèves
* modification d'items de l'agenda par les élèves
- * ajout de la possibilité d'envoi de notification à chaque saisie de document/information/programme de colle
- * prévention javascript de changement de page/fermeture de sous-fenêtre, en cours d'édition
- * mise en évidence (surlignage) des champs modifiés, envoi sélectif ?
* correction : détection de la touche entrée sur les input/select plus globale (supprimer les copies multiples)
* correction : utiliser le data-matiere associé à body dans les actions ajax
+ * interne : séparer ajax.php/ajaxadmin.php, séparer
diff -urN cahier-de-prepa8.1.1/colles.php cahier-de-prepa9.0.0/colles.php
--- cahier-de-prepa8.1.1/colles.php 2018-10-15 17:50:45.624901382 +0200
+++ cahier-de-prepa9.0.0/colles.php 2019-08-28 03:35:18.257231642 +0200
@@ -54,27 +54,13 @@
//////////////////////////////////////////////////////////////////
// Récupération des semaines et du nombre de semaines
-$resultat = $mysqli->query("SELECT id, DATE_FORMAT(debut,'%w%Y%m%e') AS debut, DATE_FORMAT(debut,'%y%v') AS semaine, vacances FROM semaines");
+$resultat = $mysqli->query("SELECT semaines.id, DATE_FORMAT(debut,'%w%Y%m%e') AS debut, DATE_FORMAT(debut,'%y%v') AS semaine, nom AS vacances
+ FROM semaines LEFT JOIN vacances ON semaines.vacances = vacances.id ORDER BY semaines.id");
$select_semaines = "\n ";
$semaines = array(0=>'');
while ( $r = $resultat->fetch_assoc() ) {
$semaines[] = $r['semaine'];
- switch ( $r['vacances'] ) {
- case 0:
- $select_semaines .= "\n ';
- break;
- case 1:
- $select_semaines .= "\n ";
- break;
- case 2:
- $select_semaines .= "\n ";
- break;
- case 3:
- $select_semaines .= "\n ";
- break;
- case 4:
- $select_semaines .= "\n ";
- }
+ $select_semaines .= "\n ';
}
$resultat->free();
$nmax = count($semaines);
@@ -124,8 +110,8 @@
-
+
";
@@ -150,21 +136,21 @@
echo $boutons;
if ( $n !== false ) {
// Affichage des programmes de colles diffusés
- if ( strlen($recherche) > 0 )
- $resultat = $mysqli->query("SELECT DATE_FORMAT(s.debut,'%w%Y%m%e') AS debut, s.colle, s.vacances, c.texte
- FROM colles AS c LEFT JOIN semaines AS s ON c.semaine=s.id
+ if ( $recherche )
+ $resultat = $mysqli->query("SELECT DATE_FORMAT(s.debut,'%w%Y%m%e') AS debut, s.colle, nom AS vacances, c.texte
+ FROM colles AS c LEFT JOIN semaines AS s ON c.semaine=s.id LEFT JOIN vacances ON s.vacances = vacances.id
WHERE c.matiere = $mid AND c.cache = 0 AND c.texte LIKE '%".$mysqli->real_escape_string($_REQUEST['recherche']).'%\' ORDER BY c.semaine');
else
- $resultat = $mysqli->query("SELECT DATE_FORMAT(s.debut,'%w%Y%m%e') AS debut, s.colle, s.vacances, c.texte
- FROM semaines AS s
+ $resultat = $mysqli->query("SELECT DATE_FORMAT(s.debut,'%w%Y%m%e') AS debut, s.colle, nom AS vacances, c.texte
+ FROM semaines AS s LEFT JOIN vacances ON s.vacances = vacances.id
LEFT JOIN (SELECT texte, semaine FROM colles WHERE matiere = $mid AND cache = 0) AS c ON c.semaine=s.id
- $requete" );
+ $requete ORDER BY s.id" );
$mysqli->close();
if ( $resultat->num_rows > 0 ) {
$compteur = 0;
while ( ( $compteur < $nb ) && ( $r = $resultat->fetch_assoc() ) ) {
$mathjax = $mathjax ?: boolval(strpos($r['texte'],'$')+strpos($r['texte'],'\\'));
- $titre = generetitre($r['debut'],$r['vacances']);
+ $titre = ( $r['vacances'] ) ? ucfirst(format_date($r['debut']))." : ${r['vacances']}" : 'Semaine du '.format_date($r['debut']);
if ( $r['colle'] ) {
$compteur = $compteur+1;
$texte = $r['texte'] ?: '
Le programme de colles de cette semaine n\'est pas défini.
';
@@ -205,12 +191,12 @@
// identifiant propre pour assurer une cohérence entre les programmes saisis
// et ceux non saisis/supprimés.
if ( strlen($recherche) )
- $resultat = $mysqli->query("SELECT DATE_FORMAT(s.debut,'%w%Y%m%e') AS debut, s.colle, s.vacances, c.texte, s.id, c.cache
- FROM colles AS c LEFT JOIN semaines AS s ON c.semaine=s.id
+ $resultat = $mysqli->query("SELECT DATE_FORMAT(s.debut,'%w%Y%m%e') AS debut, s.colle, nom AS vacances, c.texte, s.id, c.cache
+ FROM colles AS c LEFT JOIN semaines AS s ON c.semaine=s.id LEFT JOIN vacances ON s.vacances = vacances.id
WHERE c.matiere = $mid AND c.texte LIKE '%$recherche%' ORDER BY c.semaine");
else
- $resultat = $mysqli->query("SELECT DATE_FORMAT(s.debut,'%w%Y%m%e') AS debut, s.colle, s.vacances, c.texte, s.id, c.cache
- FROM semaines AS s
+ $resultat = $mysqli->query("SELECT DATE_FORMAT(s.debut,'%w%Y%m%e') AS debut, s.colle, nom AS vacances, c.texte, s.id, c.cache
+ FROM semaines AS s LEFT JOIN vacances ON s.vacances = vacances.id
LEFT JOIN (SELECT texte, semaine, cache FROM colles WHERE matiere = $mid) AS c ON c.semaine=s.id
$requete");
$mysqli->close();
@@ -218,7 +204,7 @@
$compteur = 0;
while ( ( $compteur < $nb ) && ( $r = $resultat->fetch_assoc() ) ) {
$mathjax = $mathjax ?: boolval(strpos($r['texte'],'$')+strpos($r['texte'],'\\'));
- $titre = generetitre($r['debut'],$r['vacances']);
+ $titre = ( $r['vacances'] ) ? ucfirst(format_date($r['debut']))." : ${r['vacances']}" : 'Semaine du '.format_date($r['debut']);
if ( $r['colle'] ) {
$compteur = $compteur+1;
if ( is_null($r['texte']) )
@@ -242,7 +228,7 @@
$bouton_cache
-
');
+INSERT INTO semaines (id,debut) VALUES
+ (1,'2019-09-02'), (2,'2019-09-09'), (3,'2019-09-16'), (4,'2019-09-23'), (5,'2019-09-30'),
+ (6,'2019-10-07'), (7,'2019-10-14'), (8,'2019-10-21'), (9,'2019-10-28'),(10,'2019-11-04'),
+ (11,'2019-11-11'),(12,'2019-11-18'),(13,'2019-11-25'),(14,'2019-12-02'),(15,'2019-12-09'),
+ (16,'2019-12-16'),(17,'2019-12-23'),(18,'2019-12-30'),(19,'2020-01-06'),(20,'2020-01-13'),
+ (21,'2020-01-20'),(22,'2020-01-27'),(23,'2020-02-03'),(24,'2020-02-10'),(25,'2020-02-17'),
+ (26,'2020-02-24'),(27,'2020-03-02'),(28,'2020-03-09'),(29,'2020-03-16'),(30,'2020-03-23'),
+ (31,'2020-03-30'),(32,'2020-04-06'),(33,'2020-04-13'),(34,'2020-04-20'),(35,'2020-04-27'),
+ (36,'2020-05-04'),(37,'2020-05-11'),(38,'2020-05-18'),(39,'2020-05-25'),(40,'2020-06-01'),
+ (41,'2020-06-08'),(42,'2020-06-15'),(43,'2020-06-22'),(44,'2020-06-29');
+
+INSERT INTO vacances (id, nom) VALUES
+ (0, ''),
+ (1, 'Vacances de la Toussaint'),
+ (2, 'Vacances de Noël'),
+ (3, "Vacances d'hiver"),
+ (4, 'Vacances de printemps');
+
+-- Planning de la zone C
+UPDATE semaines SET vacances = 1 WHERE id = 8 OR id = 9;
+UPDATE semaines SET vacances = 2 WHERE id = 17 OR id = 18;
+UPDATE semaines SET vacances = 3 WHERE id = 24 OR id = 25;
+UPDATE semaines SET vacances = 4 WHERE id = 32 OR id = 33;
+UPDATE semaines SET colle = 1 WHERE vacances = 0;
+
+INSERT INTO agenda (id,matiere,debut,fin,type,texte) VALUES
+ ( 1, 0, '2019-09-02 00:00:00', '2019-09-02 00:00:00', 3, '
C''est la rentrée ! Bon courage pour cette nouvelle année !
+ // Menu final
+ $menu = <<
+$icones
+$menu
+
FIN;
- }
}
else
- $menu = $recent = '';
- if ( strlen($menu.$recent) )
- $recent .= '';
-
- // RSS
- $rss = ( $autorisation ) ? sha1("?!${GLOBALS['base']}$autorisation|${_SESSION['matieres']}") : sha1("?!${GLOBALS['base']}0|toutes");
+ $menu = '';
+
+ //////////
+ // HTML //
+ //////////
+
// Message si non vide
if ( strlen($message) )
$message = "
$message
\n";
@@ -701,6 +742,8 @@
$message = '
Il y a actuellement '.(( $n > 1 ) ? "$n comptes" : "1 compte").' en attente de validation de votre part. C\'est assez urgent... Il faut aller sur la page de gestion des utilisateurs pour les valider.
$menu
-$recent
$message
@@ -741,7 +783,7 @@
' : '';
// Édition possible si $edition est true
- $js = ( $edition ) ? '' : '';
+ $js = ( $edition ) ? '' : '';
// Affichage de message si $_SESSION['message']
if ( isset($_SESSION['message']) ) {
$m = json_decode($_SESSION['message'],true);
Binary files cahier-de-prepa8.1.1/fonts/icomoon.eot and cahier-de-prepa9.0.0/fonts/icomoon.eot differ
diff -urN cahier-de-prepa8.1.1/fonts/icomoon.svg cahier-de-prepa9.0.0/fonts/icomoon.svg
--- cahier-de-prepa8.1.1/fonts/icomoon.svg 2018-10-09 01:19:20.059315070 +0200
+++ cahier-de-prepa9.0.0/fonts/icomoon.svg 1970-01-01 01:00:00.000000000 +0100
@@ -1,99 +0,0 @@
-
-
-
\ No newline at end of file
Binary files cahier-de-prepa8.1.1/fonts/icomoon.ttf and cahier-de-prepa9.0.0/fonts/icomoon.ttf differ
Binary files cahier-de-prepa8.1.1/fonts/icomoon.woff and cahier-de-prepa9.0.0/fonts/icomoon.woff differ
diff -urN cahier-de-prepa8.1.1/gestioncompte.php cahier-de-prepa9.0.0/gestioncompte.php
--- cahier-de-prepa8.1.1/gestioncompte.php 2018-11-08 00:16:10.612404999 +0100
+++ cahier-de-prepa9.0.0/gestioncompte.php 2019-08-27 00:06:35.887802962 +0200
@@ -25,7 +25,7 @@
// oublimdp&mail (ajax) -> envoi du mail de vérification
// oublimdp&mail&p (retour mail, get) -> affichage du formulaire des mdp
// oublimdp&mail&p&mdp1&mdp2 (ajax) -> ok
- // p est le sha1 de $site.$mdp.date('Y-m-d-H').$mail
+ // p est le sha1 de $chemin.$mdp.date('Y-m-d-H').$mail
$action = 'oublimdp';
elseif ( isset($_REQUEST['creation']) ) {
// 4 étapes :
@@ -34,7 +34,7 @@
// creation&mail&p (retour mail, get) -> affichage du formulaire des mdp
// creation&mail&p&prenom&nom&mdp1&mdp2&autorisation (ajax) -> ok
// $creation_compte réglée dans config.php : true si création autorisée
- // p est le sha1 de $site.$mdp.date('Y-m-d-H').$mail
+ // p est le sha1 de $chemin.$mdp.date('Y-m-d-H').$mail
$action = 'creation';
// Vérification de l'ouverture des créations de compte
$mysqli = connectsql();
@@ -53,7 +53,7 @@
// 2 étapes :
// invitation&mail&p (retour mail généré dans ajax.php) -> formulaire
// invitation&mail&p&mdp1&mdp2 (ajax) -> ok
- // p est le sha1 de $site.$mdp.$mail (validité permanente)
+ // p est le sha1 de $chemin.$mdp.$mail (validité permanente)
$action = 'invitation';
else {
// Aucune action
@@ -82,9 +82,10 @@
}
if ( isset($_REQUEST['p']) ) {
$p = $_REQUEST['p'];
- // Pour invitation, $p est le hash de $site.$mdp.$mail
- // Pour oublimdp et creation, $site.$mdp.date('Y-m-d-H').$mail
- if ( !( ( $action == 'invitation' ) && ( $p == sha1($site.$mdp.$mail) ) || ( $p == sha1($site.$mdp.date('Y-m-d-H').$mail) ) || ( $p == sha1($site.$mdp.date('Y-m-d-H',time()+900).$mail) ) ) ) {
+ // Pour invitation, $p est le sha1 de $chemin.$mdp.$mail
+ // (précédemment avec $domaine.$chemin sans le slash, condition transitoire)
+ // Pour oublimdp et creation, $chemin.$mdp.date('Y-m-d-H').$mail
+ if ( !( ( $action == 'invitation' ) && ( ( $p == sha1($chemin.$mdp.$mail) ) || ( $p == sha1($domaine.substr($chemin,0,-1).$mdp.$mail) ) ) || ( $p == sha1($chemin.$mdp.date('Y-m-d-H').$mail) ) || ( $p == sha1($chemin.$mdp.date('Y-m-d-H',time()+900).$mail) ) ) ) {
if ( $_SERVER['REQUEST_METHOD'] == 'GET' ) {
$mysqli = connectsql();
debut($mysqli,$titre,'',false);
@@ -122,11 +123,11 @@
// On ajoute 15 minutes au temps utilisé : de xh00 à xh45,
// on a jusqu'à (x+1)h, de xh45 à (x+1)h on a jusqu'à (x+2)h
$t = time() + 900;
- $lien = 'https://'.$site.'/gestioncompte?oublimdp&mail='.str_replace('@','__',$mail).'&p='.sha1($site.$mdp.date('Y-m-d-H',$t).$mail);
+ $lien = "https://$domaine${chemin}gestioncompte?oublimdp&mail=".str_replace('@','__',$mail).'&p='.sha1($chemin.$mdp.date('Y-m-d-H',$t).$mail);
mail($mail,'=?UTF-8?B?'.base64_encode('[Cahier de Prépa] Changement de mot de passe').'?=',
"Bonjour
-Vous avez rempli une demande de modification de votre mot de passe sur le Cahier de Prépa , correspondant à l'identifiant ${utilisateur['login']}.
+Vous avez rempli une demande de modification de votre mot de passe sur le Cahier de Prépa , correspondant à l'identifiant ${utilisateur['login']}.
Si cette demande ne vient pas de vous ou si vous avez retrouvé votre mot de passe, merci d'ignorer simplement ce courriel.
@@ -151,8 +152,14 @@
$permconn .= '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'[random_int(0,61)];
// Écriture du nouveau mot de passe
$mysqli = connectsql(true);
- if( requete('utilisateurs',"UPDATE utilisateurs SET mdp = '".sha1($mdp.$newmdp)."', permconn = IF(permconn > '','$permconn','') WHERE id = ${utilisateur['id']}",$mysqli) )
+ if( requete('utilisateurs',"UPDATE utilisateurs SET mdp = '".sha1($mdp.$newmdp)."', permconn = IF(permconn > '','$permconn','') WHERE id = ${utilisateur['id']}",$mysqli) ) {
+ // Si interface globale activée, mise à jour
+ if ( $interfaceglobale ) {
+ include("${interfaceglobale}majutilisateurs.php");
+ majutilisateurs($utilisateur['id'],array('mdp'=>sha1($mdp.$newmdp)));
+ }
exit('{"etat":"ok_","message":"Votre mot de passe a bien été modifié.
"}');
+ }
exit('{"etat":"nok_","message":"Votre mot de passe n\'a pas pu être modifié suite à une erreur technique."}' );
}
break;
@@ -161,8 +168,8 @@
case 'creation': {
// Impossibilités classiques
- if ( in_array($domaine = strstr($mail,'@'),array('@gmail.fr','@laposte.fr')) )
- exit('{"etat":"nok_","message":"L\'adresse saisie ne pourra pas fonctionner : le domaine '.$domaine.' ne reçoit pas de courriels."}');
+ if ( in_array($dom = strstr($mail,'@'),array('@gmail.fr','@laposte.fr')) )
+ exit('{"etat":"nok_","message":"L\'adresse saisie ne pourra pas fonctionner : le domaine '.$dom.' ne reçoit pas de courriels."}');
// Recherche du mail dans la base de données
$mysqli = connectsql();
$resultat = $mysqli->query('SELECT id, login, mail FROM utilisateurs');
@@ -179,11 +186,11 @@
// On ajoute 15 minutes au temps utilisé : de xh00 à xh45,
// on a jusqu'à (x+1)h, de xh45 à (x+1)h on a jusqu'à (x+2)h
$t = time() + 900;
- $lien = 'https://'.$site.'/gestioncompte?creation&mail='.str_replace('@','__',$mail).'&p='.sha1($site.$mdp.date('Y-m-d-H',$t).$mail);
+ $lien = "https://$domaine${chemin}gestioncompte?creation&mail=".str_replace('@','__',$mail).'&p='.sha1($chemin.$mdp.date('Y-m-d-H',$t).$mail);
mail($mail,'=?UTF-8?B?'.base64_encode('[Cahier de Prépa] Création de compte').'?=',
"Bonjour
-Vous venez de donner cette adresse pour une demande de création de compte sur le Cahier de Prépa .
+Vous venez de donner cette adresse pour une demande de création de compte sur le Cahier de Prépa .
Si cette demande ne vient pas de vous, merci d'ignorer simplement ce courriel.
@@ -226,8 +233,14 @@
exit('{"etat":"nok_","message":"Un compte avec le même identifiant existe déjà. Merci de vous connecter avec l\'adresse électronique correspondante."}');
// Écriture du nouveau compte
$mysqli = connectsql(true);
- if( requete('utilisateurs',"INSERT INTO utilisateurs SET login = '$login', prenom = '$prenom', nom = '$nom', mail = '$mail', mdp = '*$newmdp', autorisation = 2, matieres = CONCAT('0,',(SELECT GROUP_CONCAT(id) AS matieres FROM matieres)), timeout = 3600, mailexp = '$prenom $nom', mailcopie = 1, mailenvoi = 0, permconn = ''",$mysqli) )
+ if( requete('utilisateurs',"INSERT INTO utilisateurs SET login = '$login', prenom = '$prenom', nom = '$nom', mail = '$mail', mdp = '*$newmdp', autorisation = 2, matieres = CONCAT('0,',(SELECT GROUP_CONCAT(id) AS matieres FROM matieres)), timeout = 3600, mailexp = '$prenom $nom', mailcopie = 1, mailenvoi = 0, permconn = ''",$mysqli) ) {
+ // Si interface globale activée, mise à jour
+ if ( $interfaceglobale ) {
+ include("${interfaceglobale}majutilisateurs.php");
+ majutilisateurs($mysqli->insert_id,"INSERT INTO utilisateurs SET login = '$login', prenom = '$prenom', nom = '$nom', mail = '$mail', mdp = '*$newmdp', autorisation = 2");
+ }
exit('{"etat":"ok_","message":"Votre demande d\'inscription est terminée. Elle est maintenant en attente de validation par les professeurs de la classe. Vous recevrez un courriel lorsque votre inscription sera validée.
"}');
+ }
exit('{"etat":"nok_","message":"Votre demande d\'inscription n\'a pas pu être enregistrée suite à une erreur technique."}');
}
break;
@@ -257,14 +270,16 @@
if ( isset($_REQUEST['mdp1']) && strlen($newmdp = $_REQUEST['mdp1']) ) {
if ( $newmdp != $_REQUEST['mdp2'] )
exit('{"etat":"nok_","message":"Les deux mots de passe donnés ne sont pas identiques."}');
- // Token de connexion automatique
- $permconn = '';
- for ( $i = 0; $i < 10; $i++ )
- $permconn .= '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'[random_int(0,61)];
// Écriture du nouveau mot de passe
$mysqli = connectsql(true);
- if( requete('utilisateurs',"UPDATE utilisateurs SET mdp = '".sha1($mdp.$newmdp)."', permconn = '$permconn' WHERE id = ${utilisateur['id']}",$mysqli) )
+ if( requete('utilisateurs',"UPDATE utilisateurs SET mdp = '".sha1($mdp.$newmdp)."' WHERE id = ${utilisateur['id']}",$mysqli) ) {
+ // Si interface globale activée, mise à jour
+ if ( $interfaceglobale ) {
+ include("${interfaceglobale}majutilisateurs.php");
+ majutilisateurs($utilisateur['id'],array('mdp'=>sha1($mdp.$newmdp)));
+ }
exit('{"etat":"ok_","message":"Votre mot de passe a bien été modifié. Votre compte est opérationnel.