317 lines
12 KiB
PHP
Executable File
317 lines
12 KiB
PHP
Executable File
<?php
|
|
require_once __ROOT__.'/manager/security.php';
|
|
require_once __ROOT__.'/manager/database.php';
|
|
|
|
/***********************************************************
|
|
* *
|
|
* MANAGER DES UTILISATEURS *
|
|
* *
|
|
************************************************************
|
|
* *
|
|
* [0] Constantes *
|
|
* [1] ROUTAGE de niveau 1 *
|
|
* [2] Authentification *
|
|
* [a] userlist *
|
|
* [b] Connection *
|
|
* [c] Déconnection *
|
|
* *
|
|
* *
|
|
* *
|
|
* *
|
|
* *
|
|
* *
|
|
* *
|
|
* *
|
|
* *
|
|
* *
|
|
***********************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* [1] ROUTAGE DE NIVEAU 1
|
|
============================================================*/
|
|
function user_switch_level_1($request, $answer){
|
|
|
|
switch( $request->level_1 ){
|
|
|
|
/****************************/
|
|
/* authentification (login) */
|
|
/****************************/
|
|
case 'authentification':
|
|
$areSetParam = isset($request->identifiant) && isset($request->mdp); // les arguments existent
|
|
$typeOkParam = $areSetParam && is_string($request->identifiant) && is_string($request->mdp); // ils sont tous 2 des string
|
|
$nEmptyParam = $typeOkParam && strlen($request->identifiant) > 0 && strlen($request->mdp) > 0; // d'au moins 1 caractère
|
|
$identifiantCheck = $nEmptyParam && preg_match('/^[\w -]{3,50}$/i', $request->identifiant); // identifiant bon format
|
|
$mdpCheck = $identifiantCheck && preg_match('/^[\w -]{4,100}$/i', $request->mdp); // mdp bon format
|
|
|
|
if( $mdpCheck ) // si tout les params sont ok
|
|
$answer->request = user_authentification($request->identifiant, $request->mdp);
|
|
else{
|
|
if ( !$areSetParam ) $answer->request = 'missing_param';
|
|
elseif( !$typeOkParam ) $answer->request = 'wrong_type';
|
|
elseif( !$nEmptyParam ) $answer->request = 'empty_param';
|
|
else $answer->request = 'wrong password';
|
|
}
|
|
break;
|
|
|
|
|
|
/*****************/
|
|
/* déconnection */
|
|
/*****************/
|
|
case 'exit':
|
|
$_SESSION['identifiant'] = null; // on supprime l'identifiant
|
|
if( $_SESSION['identifiant'] == null )
|
|
$answer->request = 'success'; // succès
|
|
else
|
|
$answer->request = 'error';
|
|
break;
|
|
|
|
/**************************/
|
|
/* création d'utilisateur */
|
|
/**************************/
|
|
case 'create': if( false && permission('admin') ){
|
|
|
|
$areSetParam = isset($request->identifiant) && isset($request->prenom) && isset($request->nom) && isset($request->mail) && isset($request->mdp) && isset($request->droits); // les arguments existent
|
|
$typeOkParam = $areSetParam && is_string($request->identifiant) && is_string($request->prenom) && is_string($request->nom) && is_string($request->mail) && is_string($request->mdp) && is_string($request->droits); // ils sont tous 2 des string
|
|
$nEmptyParam = $typeOkParam && strlen($request->identifiant) > 0 && strlen($request->prenom) > 0 && is_string($request->nom) && is_string($request->mail) && is_string($request->mdp) && is_string($request->droits); // d'au moins 1 caractère
|
|
$identifiantCheck = $nEmptyParam && preg_match('/^[\w -]{3,50}$/i', $request->identifiant); // identifiant bon format
|
|
$prenomCheck = $identifiantCheck && preg_match('/^[a-z -]{3,50}$/i', $request->prenom); // prenom bon format
|
|
$nomCheck = $prenomCheck && preg_match('/^[a-z -]{3,50}$/i', $request->nom); // nom bon format
|
|
$mailCheck = $nomCheck && preg_match('/^[\w\.-]+@[\w\.-]+\.[a-z]{2,4}$/i', $request->mail); // mail bon format
|
|
$mdpCheck = $mailCheck && preg_match('/^[\w -]{4,100}$/i', $request->mdp); // mdp bon format
|
|
$droitsCheck = $mdpCheck && is_int(array_search($request->droits, ['student', 'teacher', 'master', 'admin'])); // droits bon format
|
|
|
|
if( $droitsCheck ){ // si tout les paramètres sont bons
|
|
$answer->request = DataBase::getInstance()->creerUtilisateur($request->identifiant, $request->prenom, $request->nom, $request->mail, $request->mdp, $request->droits);
|
|
}else
|
|
$answer->request = 'param_error';
|
|
|
|
}else
|
|
$answer->request = 'permission_error';
|
|
break;
|
|
|
|
/******************************************/
|
|
/* liste des enseignants avec leurs rôles */
|
|
/******************************************/
|
|
case 'getListeEnseignantsModules': if( permission('admin') ){
|
|
$answer->userlist = DataBase::getInstance()->listeUtilisateursRole($_SESSION['annee']);
|
|
$answer->request = 'success';
|
|
}else
|
|
$answer->request = 'permission_error';
|
|
break;
|
|
|
|
|
|
|
|
/******************************************/
|
|
/* change l'année en cours (master/admin) */
|
|
/******************************************/
|
|
case 'changeyear': if( permission('master') || permission('admin') ){
|
|
if( isset($request->year) && is_numeric($request->year) ){
|
|
|
|
$_SESSION['annee'] = (String) $request->year;
|
|
$answer->request = 'success';
|
|
|
|
}else
|
|
$answer->request = 'param_error';
|
|
}else
|
|
$answer->request = 'permission_error';
|
|
break;
|
|
|
|
|
|
/************************************/
|
|
/* modifie le rôle d'un utilisateur */
|
|
/************************************/
|
|
/*
|
|
* identifiant<String> l'UID de l'utilisateur à modifier
|
|
*
|
|
* admin<Boolean> VRAI si admin, FAUX sinon
|
|
* admin<NULL> Si NULL, on ne modifie pas ce champ
|
|
*
|
|
|
|
* master<Boolean> VRAI si référent, FAUX sinon
|
|
* master<NULL> Si NULL, on ne modifie pas ce champ
|
|
*
|
|
* addModule<int> l'UID du mcc_module à lui ajouter en tant que correcteur
|
|
* addModule<NULL> Si NULL, on n'ajoute aucun module
|
|
*
|
|
* delModule<int> l'UID du mcc_module à enlever en tant que correcteur
|
|
* delModule<NULL> Si NULL, on n'enlève aucun module
|
|
*
|
|
*/
|
|
case 'updateRole': if( permission('admin') && $_SESSION['annee'] < getCurrentYear() ){
|
|
|
|
$identifiantCheck = isset($request->identifiant) && is_string($request->identifiant) && preg_match('/^[\w -]{3,50}$/i', $request->identifiant); // identifiant au bon format
|
|
$adminCheck = $identifiantCheck && ( is_null($request->admin) || is_bool($request->admin) ); // admin ok
|
|
$masterCheck = $adminCheck && ( is_null($request->master) || is_bool($request->master) ); // master ok
|
|
$addModuleCheck = $masterCheck && ( is_null($request->addModule) || is_numeric($request->addModule) ); // addModule ok
|
|
$delModuleCheck = $addModuleCheck && ( is_null($request->delModule) || is_numeric($request->delModule) ); // delModule ok
|
|
|
|
|
|
|
|
if( $delModuleCheck ){
|
|
|
|
$response = 'unknown_update';
|
|
|
|
/* [1] On modifie le caractère "administrateur"
|
|
======================================================*/
|
|
if( is_bool($request->admin) )
|
|
$response = DataBase::getInstance()->setAdmin($request->identifiant, $request->admin);
|
|
|
|
/* [2] On modifie le caractère "référent"
|
|
======================================================*/
|
|
if( is_bool($request->master) )
|
|
$response = DataBase::getInstance()->setMaster($request->identifiant, $request->master);
|
|
|
|
/* [3] On ajoute un module en tant que correcteur
|
|
======================================================*/
|
|
if( $request->addModule != null )
|
|
$response = DataBase::getInstance()->correcteurAjouterModule($request->identifiant, $request->addModule);
|
|
|
|
/* [4] On supprime un module en tant que correcteur
|
|
======================================================*/
|
|
if( $request->delModule != null )
|
|
$response = DataBase::getInstance()->correcteurSupprimerModule($request->identifiant, $request->delModule);
|
|
|
|
if( is_bool($response) )
|
|
$answer->request = ($response) ? 'success' : 'error';
|
|
else
|
|
$answer->request = $response;
|
|
|
|
}else
|
|
$answer->request = 'param_error';
|
|
}else
|
|
$answer->request = 'permission_error';
|
|
break;
|
|
|
|
|
|
|
|
|
|
/***********/
|
|
/* DEFAULT */
|
|
/***********/
|
|
default:
|
|
$answer->request = 'unknown_level_1';
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* [2] AUTHENTIFICATION
|
|
============================================================*/
|
|
|
|
/* [a] userlist */
|
|
function user_getUserList(){
|
|
$userlistFile = file_get_contents("src/userlist.json");
|
|
return json_decode( $userlistFile );
|
|
}
|
|
|
|
|
|
/* [b] CONNECTION
|
|
========================================================*/
|
|
/* GESTION DE L'AUTHENTIFICATION D'UN UTILISATEUR
|
|
*
|
|
* @param username<String> Identifiant de l'utilisateur
|
|
* @param password<String> Mot de passe de l'utilisateur
|
|
*
|
|
* si @username est référencé et que le mot de passe associé vaut @password
|
|
* alors @$answer->request = TRUE sinon FALSE
|
|
* + mise ajout à @answer
|
|
*
|
|
* Les variables sessions suivantes sont définies :
|
|
* - $_SESSION['permissions']
|
|
* - $_SESSION['userid']
|
|
* - $_SESSION['username']
|
|
*
|
|
* @$answer->request = Boolean true si l'utilisateur est ok
|
|
*/
|
|
function user_authentification($username, $password){
|
|
// [1] On récupère la liste d'utilisateurs (/src/userlist.json)
|
|
$userList = user_getUserList();
|
|
|
|
// [2] On check l'existence de l'utilisateur
|
|
if( isset($userList->{$username}) ){
|
|
|
|
// [3] On check le mot de passe
|
|
if( $userList->{$username}->password == $password || $userList->{$username}->password == secure_sha1($password) ){
|
|
|
|
// [4] On récupère les informations dans la base de données
|
|
if( $utilInfo = Database::getInstance()->utilisateurInfo($username) ){ // si l'utilisateur est dans le BDD
|
|
|
|
$_SESSION['identifiant'] = $utilInfo['identifiant'];
|
|
$_SESSION['droits'] = explode(',', $utilInfo['droits']);
|
|
$_SESSION['sexe'] = ($utilInfo['sexe']=='1') ? 'M' : 'F';
|
|
|
|
// on récupère l'année courante (1er sept à 1er sept)
|
|
// SI (mois < 8) ALORS (annee - 1) SINON (annee)
|
|
$_SESSION['annee'] = getCurrentYear();
|
|
|
|
// on défini si le semestre est pair ou non
|
|
$_SESSION['semestre_pair'] = semestrePair(time());
|
|
|
|
|
|
// on défini le semestre par défaut à NULL
|
|
$_SESSION['id_formation'] = null;
|
|
$_SESSION['semestre'] = null;
|
|
|
|
/* on récupère le semestre courant si c'est un étudiant */
|
|
if( permission('student') ){
|
|
$semestre = DataBase::studentSemestre( $_SESSION['identifiant'], $_SESSION['semestre_pair'], $_SESSION['annee']);
|
|
if( is_array($semestre) ){ // si on a bien récupéré le semestre
|
|
$_SESSION['formation'] = (String) $semestre['id_formation'];
|
|
$_SESSION['semestre'] = (String) $semestre['id'];
|
|
}
|
|
}
|
|
|
|
return 'success';
|
|
|
|
}else
|
|
return 'not_in_db';
|
|
|
|
}else
|
|
return 'wrong_password';
|
|
|
|
}else
|
|
return 'unknown_user';
|
|
}
|
|
|
|
|
|
|
|
|
|
/* RETOURNE LES SEMESTRES EN COURS
|
|
*
|
|
* détermine si les semestres IMPAIRS ou PAIRS sont en cours
|
|
*
|
|
* @$answer->request = isEven<Boolean> VRAI si pair, sinon FAUX (impair)
|
|
*
|
|
*/
|
|
function semestrePair($timestamp=null){
|
|
// si $datetime n'est pas défini, on prend la date actuelle
|
|
if( $timestamp == null )
|
|
$timestamp = time();
|
|
|
|
return Date('m', $timestamp) < 8;
|
|
}
|
|
|
|
?>
|