SMMP/build/api/core/AuthSystemDefault.php

214 lines
6.5 KiB
PHP
Raw Normal View History

<?php
2016-10-18 14:03:03 +00:00
namespace api\core;
2016-10-18 14:03:03 +00:00
use \database\core\Repo;
use \error\core\Error;
2017-01-30 17:39:21 +00:00
use \error\core\Err;
use \api\core\AuthSystem;
class AuthSystemDefault implements AuthSystem{
2017-01-30 17:39:21 +00:00
public function __construct(){
self::check();
}
/* INITIALISATION DU SYSTEME ET MISE A JOUR CONSTANTES D'AUTHENTIFICATION
*
*
*/
public static function check(){
/* (1) Initialisation
---------------------------------------------------------*/
if( !isset($_SESSION['AUTH']) ) $_SESSION['AUTH'] = [];
if( !isset($_SESSION['PERM']) ) $_SESSION['PERM'] = [];
if( !isset($_SESSION['WAREHOUSE']) ) $_SESSION['WAREHOUSE'] = [];
if( !isset($_SESSION['ADMIN']) ) $_SESSION['ADMIN'] = [];
/* (2) Gestion de AUTH (authentification)
---------------------------------------------------------*/
/* (1) Si Auth dans HEADER, on le récupère */
$AUTH = isset($_SERVER['PHP_AUTH_DIGEST']) ? $_SERVER['PHP_AUTH_DIGEST'] : '';
/* (2) Si Auth dans SESSION, on le récupère */
if( $AUTH == '' && isset($_SESSION['AUTH']) )
$AUTH = implode('', $_SESSION['AUTH']);
/* (3) Gestion de AUTH en fonction des tokens
---------------------------------------------------------*/
/* (1) Double authentification */
if( preg_match('/^([a-f0-9]{64})([a-f0-9]{64})$/', $AUTH, $match) )
2016-07-04 13:45:29 +00:00
$_SESSION['AUTH'] = [ $match[1], $match[2] ];
/* (2) Authentification unique */
else if( preg_match('/^[a-f0-9]{64}$/', $AUTH, $match) )
2016-07-04 13:45:29 +00:00
$_SESSION['AUTH'] = [ $match[0] ];
/* (3) Aucune authentification */
else{
$_SESSION['AUTH'] = [];
$_SESSION['PERM'] = [];
$_SESSION['WAREHOUSE'] = [];
$_SESSION['ADMIN'] = [];
}
/* (4) On vérifie l'authentification par BDD
---------------------------------------------------------*/
if( !self::deepCheck() ){
$_SESSION['AUTH'] = [];
$_SESSION['PERM'] = [];
$_SESSION['WAREHOUSE'] = [];
$_SESSION['ADMIN'] = [];
}
}
/* VERIFICATION DE L'AUTHENTIFICATION
*
*
*/
public static function deepCheck(){
/* [1] Si aucune authentification
=========================================================*/
if( self::auth() == 0 )
2016-07-04 13:45:29 +00:00
return false;
/* [2] Si authentification unique
=========================================================*/
if( self::auth() >= 1 ){
2016-07-04 13:45:29 +00:00
$checkRoot = new Repo('warehouse/getByToken', [ $_SESSION['AUTH'][0] ]);
/* (1) Si le token n'existe pas, on retourne une erreur */
if( $checkRoot->answer() == false )
return false;
/* (2) On met à jour les informations de l'entrepot */
$_SESSION['WAREHOUSE'] = [
2016-07-12 08:53:26 +00:00
'id' => (int) $checkRoot->answer()[0]['id_warehouse'],
'name' => $checkRoot->answer()[0]['name'],
2016-07-12 09:02:46 +00:00
'theme' => '#'.$checkRoot->answer()[0]['theme']
];
/* (3) On récupère les modules de l'entrepot */
$getModules = new Repo('warehouse/getModules', [ $_SESSION['WAREHOUSE']['id'] ]);
$_SESSION['WAREHOUSE']['modules'] = $getModules->answer();
}
/* [3] Si authentification double
=========================================================*/
if( self::auth() >= 2 ){
$checkBranch = new Repo('admin/getByToken', [ $_SESSION['WAREHOUSE']['id'], $_SESSION['AUTH'][1] ]);
/* (1) Si le token n'existe pas, on retourne une erreur */
if( $checkBranch->answer() == false )
return false;
2016-07-14 07:36:18 +00:00
/* (2) On met à jour les informations de l'administrateur */
$_SESSION['ADMIN'] = [
2016-07-14 07:36:18 +00:00
'id' => (int) $checkBranch->answer()['id_admin'],
'username' => $checkBranch->answer()['username'],
'mail' => $checkBranch->answer()['mail']
];
}
/* [4] Si pas d'erreur d'authentification, on retourne TRUE
=========================================================*/
return true;
}
/* VERIFICATION DES ACCES EN FONCTION DE PERMISSIONS ATTENDUES
*
* @module<String> Module concerné
* @expected<array> Liste des permissions attendues
*
2017-01-30 17:39:21 +00:00
* @return error<Error> Si FALSE, pas la permission, sinon si
*
*/
public static function permission($module, $expected){
/* [0] Mise à jour de l'authentification
=========================================================*/
// self::check();
/* [1] Gestion de l'AUTH (authentification)
=========================================================*/
/* (1) Si entrepot requis, mais manquant
---------------------------------------------------------*/
if( in_array('warehouse', $expected) && self::auth() < 1 )
2017-01-30 17:39:21 +00:00
return new Error(Err::PermissionError);
/* (2) Si admin requis, mais manquant
---------------------------------------------------------*/
if( in_array('admin', $expected) && self::auth() < 2 )
2017-01-30 17:39:21 +00:00
return new Error(Err::PermissionError);
/* (3) On retire 'warehouse' et 'admin' de @expected
---------------------------------------------------------*/
$warehouseIndex = array_search('warehouse', $expected);
$adminIndex = array_search('admin', $expected);
if( is_int($warehouseIndex) ) unset($expected[$warehouseIndex]);
if( is_int($adminIndex) ) unset($expected[$adminIndex]);
/* [2] Gestion des permissions
=========================================================*/
/* (1) Vérification de toutes les permissions requises */
foreach($expected as $permission)
// Si il manque au minimum une permission, on retourne FALSE
if( !in_array($permission, $_SESSION['PERM']) )
2017-01-30 17:39:21 +00:00
return new Error(Err::PermissionError);
/* [3] Vérification que le module est actif pour l'entrepot
=========================================================*/
/* (1) On vérifie que le module est actif dans l'entrepot */
$allowedModule = isset($_SESSION['WAREHOUSE']['modules'])
&& is_array($_SESSION['WAREHOUSE']['modules'])
&& in_array($module, $_SESSION['WAREHOUSE']['modules']);
/* (2) On vérifie si le module est un module "Default" */
$defaultModule = preg_match('/^(\w+)Default$/', $module);
/* (3) Si aucune autorisation et pas module "Default" */
if( !$allowedModule && !$defaultModule )
2017-01-30 17:39:21 +00:00
return new Error(Err::DisabledModule);
/* [4] Si on a toutes les permissions requises
=========================================================*/
2017-01-30 17:39:21 +00:00
return new Error(Err::Success);
}
/* RENVOIE LE NIVEAU D'AUTHENTIFICATION
*
* @return auth<int> Niveau d'authentification (0 à 2)
*
*/
public static function auth(){
return !is_array($_SESSION['AUTH']) ? 0 : count($_SESSION['AUTH']);
}
}
?>