Merge branch 'dev' into feature/SATS/states
This commit is contained in:
commit
2073606a29
|
@ -44,6 +44,27 @@
|
|||
}
|
||||
|
||||
|
||||
/*************************/
|
||||
/* SECURE SHA1 ALGORITHM */
|
||||
/*************************/
|
||||
function secure_hash($data, $salt='">\[..|{@#))', $depth=1){
|
||||
/* (1) On hash @depth fois
|
||||
---------------------------------------------------------*/
|
||||
$hash = $data;
|
||||
$c = 0;
|
||||
|
||||
for( $h = 0 ; $h < $depth ; $h++ ){
|
||||
$hash = hash('sha512', $salt.hash('sha512', $hash.'_)Q@#((%*_$%(@#') );
|
||||
$c++;
|
||||
}
|
||||
|
||||
|
||||
/* (2) On renvoie le résultat
|
||||
---------------------------------------------------------*/
|
||||
return $hash;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -92,7 +92,7 @@
|
|||
|
||||
// Hash sha1/md5
|
||||
case 'hash':
|
||||
return $checker && is_string($value) && preg_match('/^[\da-f]+$/i', $value) && (strlen($value) == 40 || strlen($value) == 64);
|
||||
return $checker && is_string($value) && preg_match('/^[\da-f]+$/i', $value) && (strlen($value) == 64 || strlen($value) == 128);
|
||||
break;
|
||||
|
||||
case 'alphanumeric':
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
|
||||
namespace api\module;
|
||||
use \database\core\DatabaseDriver;
|
||||
use \manager\sessionManager;
|
||||
use \api\core\Authentification;
|
||||
use \database\core\Repo;
|
||||
use \manager\repo\cluster as clusterRepo;
|
||||
|
@ -47,7 +46,7 @@
|
|||
|
||||
/* [2] On vérifie le mot de passe
|
||||
=========================================================*/
|
||||
$hash_password = sessionManager::secure_hash($password);
|
||||
$hash_password = secure_hash($password, $name);
|
||||
|
||||
// Si mot de passe faux, on retourne le status FALSE
|
||||
if( $nameFetched[0]['password'] != $hash_password )
|
||||
|
@ -101,7 +100,7 @@
|
|||
|
||||
/* [2] On vérifie le mot de passe
|
||||
=========================================================*/
|
||||
$hash_password = sessionManager::secure_hash($password);
|
||||
$hash_password = secure_hash($password, $username);
|
||||
|
||||
// Si mot de passe faux, on retourne le status FALSE
|
||||
if( $usernameFetched['password'] != $hash_password )
|
||||
|
|
|
@ -34,7 +34,7 @@
|
|||
|
||||
// Si une erreur est retournee, on retourne une erreur
|
||||
if( $id_machine === false )
|
||||
return ['error' => new Error(Err::error)];
|
||||
return ['error' => new Error(Err::ModuleError)];
|
||||
|
||||
|
||||
|
||||
|
@ -429,19 +429,38 @@
|
|||
|
||||
/* ENVOI DES DONNEES D'INITIALISATION DU SYSTEME DES MACHINES
|
||||
*
|
||||
* @return data<Array> Données d'initialisation du système
|
||||
* @return id_machine<int> UID de la machine
|
||||
* @return token<string> Nouveau token d'identification (hashage cyclique)
|
||||
* @return unlock<string> Code de déblocage de la machine
|
||||
*
|
||||
*/
|
||||
public function init($params){
|
||||
extract($params);
|
||||
|
||||
/* [1] On récupére la liste des actions
|
||||
|
||||
/* [1] On essaie de débloquer la machine
|
||||
=========================================================*/
|
||||
/* (1) On rédige la requête */
|
||||
$unlockReq = new Repo('machine/unlock', [
|
||||
$_SESSION['WAREHOUSE']['id'],
|
||||
$id_machine,
|
||||
$unlock,
|
||||
$token
|
||||
]);
|
||||
|
||||
/* (2) On gère l'erreur */
|
||||
if( $unlockReq->error->get() != Err::Success || !$unlockReq->answer() )
|
||||
return [ 'error' => new Error(Err::TokenError) ];
|
||||
|
||||
|
||||
/* [2] On récupére la liste des actions
|
||||
=========================================================*/
|
||||
$actionsReq = new Repo('action/getAll');
|
||||
$actions = ($actionsReq->error->get()==Err::Success) ? $actionsReq->answer() : [];
|
||||
// var_dump($actionsReq->answer());
|
||||
|
||||
/* [2] On regroupe les actions par TIMEOUT
|
||||
|
||||
/* [3] On regroupe les actions par TIMEOUT
|
||||
=========================================================*/
|
||||
$sorted_actions = [];
|
||||
|
||||
|
@ -459,12 +478,14 @@
|
|||
];
|
||||
}
|
||||
|
||||
/* [3] On récupère la liste des états
|
||||
|
||||
/* [4] On récupère la liste des états
|
||||
=========================================================*/
|
||||
$globalStatesReq = new Repo('global_state/getAll');
|
||||
$globalStates = ($globalStatesReq->error->get()==Err::Success) ? $globalStatesReq->answer() : [];
|
||||
|
||||
/* [4] On récupère la liste des MODULES (puces)
|
||||
|
||||
/* [5] On récupère la liste des MODULES (puces)
|
||||
=========================================================*/
|
||||
$chipsReq = new Repo('chip/getAll', [$_SESSION['WAREHOUSE']['id']]);
|
||||
$chips = ($chipsReq->error->get()==Err::Success) ? $chipsReq->answer() : [];
|
||||
|
@ -499,7 +520,7 @@
|
|||
}
|
||||
|
||||
|
||||
/* [7] On récupère les utilisateurs + accès sur la machine
|
||||
/* [6] On récupère les utilisateurs + accès sur la machine
|
||||
=========================================================*/
|
||||
/* (1) On récupère les utilisateurs et leurs permissions */
|
||||
$permissionsReq = new Repo('action_merge/getAccess', [
|
||||
|
@ -582,7 +603,7 @@
|
|||
$checkToken = new Repo('machine/checkToken', [ $_SESSION['WAREHOUSE']['id'], $token, $renew ]);
|
||||
|
||||
// Si token incorrect, on envoie une erreur
|
||||
if( $checkToken->answer() !== true )
|
||||
if( !$checkToken->answer() )
|
||||
return [ 'error' => new Error(Err::TokenError) ];
|
||||
|
||||
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
|
||||
namespace database\repo;
|
||||
use \database\core\DatabaseDriver;
|
||||
use \manager\sessionManager;
|
||||
use \orm\core\Table;
|
||||
use \orm\core\Rows;
|
||||
use \api\core\Checker;
|
||||
|
@ -28,7 +27,8 @@
|
|||
'id_machine' => Rows::INSERT_DEFAULT,
|
||||
'id_warehouse' => $id_warehouse,
|
||||
'name' => $name,
|
||||
'token' => sessionManager::secure_hash( uniqid() )
|
||||
'token' => Rows::NULL,
|
||||
'unlock_code' => Rows::NULL
|
||||
]);
|
||||
|
||||
// Si erreur (car name doit être unique)
|
||||
|
@ -66,7 +66,8 @@
|
|||
->whereIdWarehouse($id_warehouse)
|
||||
->whereName(["%$keyword%", Rows::COND_LIKE])
|
||||
->select('id_machine')
|
||||
->select('name');
|
||||
->select('name')
|
||||
->orderby('name', Rows::ORDER_ASC);
|
||||
|
||||
return $search->fetch();
|
||||
}
|
||||
|
@ -89,6 +90,7 @@
|
|||
=========================================================*/
|
||||
$cluster = Table::get('machine_cluster')
|
||||
->whereIdWarehouse($id_warehouse)
|
||||
->orderby('name', Rows::ORDER_ASC)
|
||||
->select('*');
|
||||
$cluster_merge = Table::get('machine_cluster_merge')
|
||||
->whereIdMachine($id_machine)
|
||||
|
@ -182,6 +184,7 @@
|
|||
->whereIdWarehouse($id_warehouse)
|
||||
->select('id_machine')
|
||||
->select('name')
|
||||
->orderby('id_machine', Rows::ORDER_ASC)
|
||||
->unique();
|
||||
|
||||
return $machine->fetch();
|
||||
|
@ -211,7 +214,8 @@
|
|||
->whereName($name)
|
||||
->whereIdWarehouse($id_warehouse)
|
||||
->select('id_machine')
|
||||
->selcet('name')
|
||||
->select('name')
|
||||
->orderby('name', Rows::ORDER_ASC)
|
||||
->unique();
|
||||
|
||||
return $machine->fetch();
|
||||
|
@ -242,6 +246,7 @@
|
|||
->whereIdWarehouse($id_warehouse)
|
||||
->select('id_machine')
|
||||
->select('name')
|
||||
->orderby('name', Rows::ORDER_ASC)
|
||||
->unique();
|
||||
|
||||
return $machine->fetch();
|
||||
|
@ -268,6 +273,7 @@
|
|||
$machine = Table::get('machine')
|
||||
->whereIdWarehouse($id_warehouse)
|
||||
->select('id_machine')
|
||||
->orderby('name', Rows::ORDER_ASC)
|
||||
->select('name');
|
||||
|
||||
return $machine->fetch();
|
||||
|
@ -275,13 +281,55 @@
|
|||
|
||||
|
||||
|
||||
/* DEBLOQUE UNE MACHINE (PREMIER TOKEN) AVEC UN CODE DE DEBLOCAGE
|
||||
*
|
||||
* @id_warehouse<int> UID de l'entrepot
|
||||
* @id_machine<int> UID de la machine
|
||||
* @unlock_code<string> Code de déblocage
|
||||
* @first_token<string> Premier token de hashage cyclique
|
||||
*
|
||||
* @return unlocked<bool> TRUE si débloqué, sinon FALSE
|
||||
*
|
||||
*/
|
||||
public static function unlock($id_warehouse, $id_machine, $unlock_code, $first_token){
|
||||
/* [1] On vérifie le code déblocage
|
||||
=========================================================*/
|
||||
/* (1) On effectue la requête */
|
||||
$machine = Table::get('machine')
|
||||
->select('id_machine')
|
||||
->select('name')
|
||||
->whereId($id_machine)
|
||||
->whereIdWarehouse($id_warehouse)
|
||||
->whereUnlockCode($unlock_code)
|
||||
->fetch();
|
||||
|
||||
/* (2) On vérifie si on a bien le bon code */
|
||||
if( count($machine) < 1 )
|
||||
return false;
|
||||
|
||||
|
||||
/* [2] Si le code est bon, on le supprime et on met le token
|
||||
=========================================================*/
|
||||
/* (1) Update (edit) machine */
|
||||
$updated = Table::get('machine')
|
||||
->whereId($id_machine)
|
||||
->whereIdWarehouse($id_warehouse)
|
||||
->edit([
|
||||
'unlock_code' => null,
|
||||
'token' => $first_token
|
||||
]);
|
||||
|
||||
/* (2) Manage edition error */
|
||||
return $updated;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* VERIFIE MET A JOUR LE TOKEN DE SYNCHRONISATION
|
||||
*
|
||||
* @id_warehouse<int> UID de l'entrepot
|
||||
* @token<String> Token de synchronisation
|
||||
* @token<String> Token de synchronisation
|
||||
* @newToken<String> Nouveau token de synchronisation (optionnel, uniquement quand on arrive à la fin du cycle de la hashChain)
|
||||
*
|
||||
* @return status<Boolean> VRAI si le token est correct, sinon FALSE
|
||||
|
@ -290,22 +338,22 @@
|
|||
public static function checkToken($id_warehouse, $token, $newToken=null){
|
||||
/* [1] On vérifie le token
|
||||
=========================================================*/
|
||||
$hash = sessionManager::secure_hash($token);
|
||||
$hash = hash('sha512', $token);
|
||||
|
||||
$byToken = self::getByToken($id_warehouse, $hash);
|
||||
|
||||
// Si aucun résultat, erreur
|
||||
if( count($byToken) < 1 )
|
||||
if( $byToken == false )
|
||||
return false;
|
||||
|
||||
|
||||
/* [2] On met à jour le token
|
||||
=========================================================*/
|
||||
$updated = Table::get('machine')
|
||||
->whereId($id_machine)
|
||||
->whereId($byToken['id_machine'])
|
||||
->edit([
|
||||
'token' => Checker::run('hash', $newToken) ? $newToken : $token,
|
||||
'id_machine' => $byToken[0]['id_machine']
|
||||
'id_machine' => $byToken['id_machine']
|
||||
]);
|
||||
|
||||
|
||||
|
|
|
@ -1,133 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace manager;
|
||||
|
||||
|
||||
class sessionManager{
|
||||
|
||||
private static $prefix;
|
||||
|
||||
|
||||
/*************************/
|
||||
/* SECURE SHA1 ALGORITHM */
|
||||
/*************************/
|
||||
public static function secure_hash($data, $depth=1){
|
||||
/* [1] On hash @depth fois
|
||||
=========================================================*/
|
||||
$hash = $data;
|
||||
$c = 0;
|
||||
|
||||
for( $h = 0 ; $h < $depth ; $h++ ){
|
||||
$hash = hash('sha256', '">\[..|{@#))'.hash('sha256', $hash.'_)Q@#((%*_$%(@#') );
|
||||
$c++;
|
||||
}
|
||||
|
||||
|
||||
/* [2] On renvoie le résultat
|
||||
=========================================================*/
|
||||
return $hash;
|
||||
}
|
||||
|
||||
|
||||
/*****************************/
|
||||
/* INITIALISATION DE SESSION */
|
||||
/*****************************/
|
||||
private static function reset_session($session_id=null){
|
||||
// On ferme la session
|
||||
session_destroy();
|
||||
|
||||
// On definit l'id session si donne en argument
|
||||
if( $session_id != null )
|
||||
session_id( $session_id );
|
||||
|
||||
// Precaution: on met a jour le cookie
|
||||
setcookie('PHPSESSID', session_id(), time()+60*30 );
|
||||
|
||||
// On redemarre la session avec le bon id session
|
||||
\session_start();
|
||||
|
||||
// On met a jour le token
|
||||
self::update_token();
|
||||
|
||||
|
||||
header('Refresh: 0');
|
||||
}
|
||||
|
||||
/*******************/
|
||||
/* GENERE UN TOKEN */
|
||||
/*******************/
|
||||
private static function update_token(){
|
||||
$token = self::$prefix.self::secure_sha1(uniqid());
|
||||
|
||||
// On definit le token en session
|
||||
$_SESSION['session_token'] = $token;
|
||||
|
||||
// On definit le token en cookie
|
||||
$_COOKIE['session_token'] = $_SESSION['session_token'];
|
||||
setcookie('session_token', $_COOKIE['session_token'], time()+60*30 );
|
||||
}
|
||||
|
||||
/************/
|
||||
/* AMORCEUR */
|
||||
/************/
|
||||
public static function session_start(){
|
||||
|
||||
\session_start();
|
||||
return;
|
||||
|
||||
|
||||
|
||||
/* [1] Génération et Gestion des donnees a utiliser
|
||||
==============================================================*/
|
||||
// On genere le hash a partir des donnees personnelles
|
||||
self::$prefix = self::secure_sha1( $_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT'] );
|
||||
|
||||
// On cree un id session associe a ces donnees personnelles
|
||||
$sessid = substr(self::$prefix,0,5) . substr(self::secure_sha1(uniqid()),0,24);
|
||||
|
||||
// On genere un token pour l'execution suivante
|
||||
$token = self::$prefix.self::secure_sha1(uniqid());
|
||||
|
||||
// On definit/recupere le token
|
||||
$session_token = (isset($_COOKIE['session_token'])) ? $_COOKIE['session_token'] : null;
|
||||
|
||||
|
||||
|
||||
/* [2] Verification de l'id session
|
||||
==============================================================*/
|
||||
\session_start();
|
||||
|
||||
// On verifie l'id session (5 premiers chars du hash des donnees perso)
|
||||
$valid_sessid = strpos( session_id(), substr(self::$prefix,0,5) ) === 0;
|
||||
|
||||
// Si id session incorrect ou pas de token
|
||||
if( !$valid_sessid )
|
||||
self::reset_session( $sessid ); // On initialise la session (bon id session)
|
||||
|
||||
|
||||
// si id session invalide
|
||||
|
||||
|
||||
/* [3] Verification du token
|
||||
==============================================================*/
|
||||
// On verifie que le token est valide
|
||||
$valid_token = $session_token != null; // verification de l'existence du cookie
|
||||
$valid_token = $valid_token && strpos($session_token, self::$prefix) === 0; // verification des donnes personnelles
|
||||
$valid_token = $valid_token && isset($_SESSION['session_token']); // verification que la variable session associee existe
|
||||
$valid_token = $valid_token && $_SESSION['session_token'] == $_COOKIE['session_token']; // verification que la session est coherente
|
||||
|
||||
/* [4] Si token inexistant
|
||||
==============================================================*/
|
||||
if( !$valid_token )
|
||||
self::reset_session($sessid); // On initialise la session
|
||||
else
|
||||
self::update_token(); // Dans tous les cas, on cree un nouveau token
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
?>
|
|
@ -37,6 +37,7 @@
|
|||
|
||||
// {3} Constantes d'insertion //
|
||||
const INSERT_DEFAULT = '__DEFAULT__'; // Valeur DEFAULT (pour insertion)
|
||||
const NULL = '__NULL__'; // Valeur DEFAULT (pour insertion)
|
||||
|
||||
/* Attributs */
|
||||
private $driver; // Database driver label
|
||||
|
@ -169,7 +170,7 @@
|
|||
|
||||
/* FILTRAGE DYNAMIQUES
|
||||
*
|
||||
* @method<String> Nom de la méthode
|
||||
* @method<String> Nom de la méthode
|
||||
* @parameter<mixed> Valeur du paramètre
|
||||
* @parameter<Array> Valeur du paramètre + type de vérification (tableau)
|
||||
*
|
||||
|
@ -266,9 +267,13 @@
|
|||
/* (2) On vérifie le type de chaque valeur */
|
||||
$type = $this->schema['columns'][$field]['type'];
|
||||
|
||||
if( $type == 'int' && !is_numeric($args[0][0]) ) return $this;
|
||||
if( $type == 'float' && !is_numeric($args[0][0]) ) return $this;
|
||||
if( in_array($type, ['text', 'varchar']) && !is_string($args[0][0]) ) return $this;
|
||||
if( !is_null($args[0][0]) ){
|
||||
|
||||
if( $type == 'int' && !is_numeric($args[0][0]) ) return $this;
|
||||
if( $type == 'float' && !is_numeric($args[0][0]) ) return $this;
|
||||
if( in_array($type, ['text', 'varchar']) && !is_string($args[0][0]) ) return $this;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
@ -511,6 +516,10 @@
|
|||
/* (3) On vérifie les types des champs */
|
||||
foreach($cleared as $field=>$value){
|
||||
|
||||
// let null values
|
||||
if( is_null($value) )
|
||||
continue;
|
||||
|
||||
$type = $this->schema['columns'][$field]['type'];
|
||||
|
||||
// {1} Si de type INT/FLOAT et pas numérique, on retire le champ //
|
||||
|
|
|
@ -138,6 +138,13 @@
|
|||
$sql .= substr($value[1], 2, -2).' ';
|
||||
|
||||
/* (3) Variable */
|
||||
// {1} Si NULL //
|
||||
if( is_null($value[0]) ){
|
||||
$sql .= 'NULL';
|
||||
return $sql;
|
||||
}
|
||||
|
||||
// {2} Si not NULL //
|
||||
$sql .= ':'.$field[0].'_x_'.$field[1].'_'.$offset;
|
||||
|
||||
$bound[':'.$field[0].'_x_'.$field[1].'_'.$offset] = $value[0];
|
||||
|
@ -166,6 +173,14 @@
|
|||
$sql[$c] = $field.' = ';
|
||||
|
||||
/* (2) Variable */
|
||||
// {1} Si NULL //
|
||||
if( is_null($value) ){
|
||||
$sql[$c] .= 'NULL';
|
||||
$c++;
|
||||
continue;
|
||||
}
|
||||
|
||||
// {2} Si not NULL //
|
||||
$sql[$c] .= ':update_'.$field;
|
||||
|
||||
$bound[':update_'.$field] = $value;
|
||||
|
|
|
@ -238,7 +238,9 @@
|
|||
"description": "Données d'initialisation d'une machine.",
|
||||
"permissions": ["warehouse"],
|
||||
"parameters": {
|
||||
"id_machine": { "description": "UID de la machine.", "type": "id" }
|
||||
"id_machine": { "description": "UID de la machine.", "type": "id" },
|
||||
"token": { "description": "Initialisation du code d'accès évolutif", "type": "hash" },
|
||||
"unlock": { "description": "Code d'initialisation", "type": "hash" }
|
||||
},
|
||||
"output": {
|
||||
"data": { "description": "Données d'initialisation.", "type": "array<mixed>" }
|
||||
|
|
|
@ -41,7 +41,9 @@
|
|||
|
||||
"search",
|
||||
|
||||
"getClusters"
|
||||
"getClusters",
|
||||
|
||||
"unlock"
|
||||
|
||||
],
|
||||
|
||||
|
|
|
@ -9,7 +9,6 @@
|
|||
use \api\core\AuthSystemDefault;
|
||||
|
||||
|
||||
|
||||
/*******************************************/
|
||||
/* DEBUGGER */
|
||||
/*******************************************/
|
||||
|
@ -18,14 +17,13 @@
|
|||
/* DEBUGGER */
|
||||
/*******************************************/
|
||||
|
||||
|
||||
|
||||
/* [1] Gestion des authentifications et des droits
|
||||
=========================================================*/
|
||||
/* (1) On met à jour l'authentification et les permissions */
|
||||
Request::setAuthSystem(new AuthSystemDefault);
|
||||
|
||||
$auth = AuthSystemDefault::auth();
|
||||
|
||||
Request::setAuthSystem(new AuthSystemDefault);
|
||||
|
||||
|
||||
/* (2) On définit la page d'accueil */
|
||||
|
@ -86,7 +84,7 @@
|
|||
// logout from admin
|
||||
$R->get('logout/?', function(){
|
||||
$_SERVER['REQUEST_METHOD'] = 'POST';
|
||||
$req = new Request('authentificationDefault/admin', ['username' => ' ', 'password' => '']);
|
||||
$req = new Request('authentificationDefault/admin', ['username' => '-', 'password' => '']);
|
||||
$res = $req->dispatch();
|
||||
header('Location: /');
|
||||
});
|
||||
|
@ -110,7 +108,7 @@
|
|||
// warehouse logout
|
||||
$R->get('logout/?', function(){
|
||||
$_SERVER['REQUEST_METHOD'] = 'POST';
|
||||
(new Request('authentificationDefault/warehouse', ['name' => ' ', 'password' => '']))->dispatch();
|
||||
(new Request('authentificationDefault/warehouse', ['name' => '---', 'password' => '']))->dispatch();
|
||||
header('Location: /');
|
||||
});
|
||||
|
||||
|
|
Loading…
Reference in New Issue