Merge branch 'dev' into feature/SATS/states

This commit is contained in:
xdrm-brackets 2017-02-19 18:09:27 +01:00
commit e208dade95
11 changed files with 148 additions and 166 deletions

View File

@ -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;
}

View File

@ -92,7 +92,7 @@
// Hash sha1/md5 // Hash sha1/md5
case 'hash': 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; break;
case 'alphanumeric': case 'alphanumeric':

View File

@ -2,7 +2,6 @@
namespace api\module; namespace api\module;
use \database\core\DatabaseDriver; use \database\core\DatabaseDriver;
use \manager\sessionManager;
use \api\core\Authentification; use \api\core\Authentification;
use \database\core\Repo; use \database\core\Repo;
use \manager\repo\cluster as clusterRepo; use \manager\repo\cluster as clusterRepo;
@ -47,7 +46,7 @@
/* [2] On vérifie le mot de passe /* [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 // Si mot de passe faux, on retourne le status FALSE
if( $nameFetched[0]['password'] != $hash_password ) if( $nameFetched[0]['password'] != $hash_password )
@ -101,7 +100,7 @@
/* [2] On vérifie le mot de passe /* [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 // Si mot de passe faux, on retourne le status FALSE
if( $usernameFetched['password'] != $hash_password ) if( $usernameFetched['password'] != $hash_password )

View File

@ -34,7 +34,7 @@
// Si une erreur est retournee, on retourne une erreur // Si une erreur est retournee, on retourne une erreur
if( $id_machine === false ) 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 /* 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){ public function init($params){
extract($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'); $actionsReq = new Repo('action/getAll');
$actions = ($actionsReq->error->get()==Err::Success) ? $actionsReq->answer() : []; $actions = ($actionsReq->error->get()==Err::Success) ? $actionsReq->answer() : [];
// var_dump($actionsReq->answer()); // var_dump($actionsReq->answer());
/* [2] On regroupe les actions par TIMEOUT
/* [3] On regroupe les actions par TIMEOUT
=========================================================*/ =========================================================*/
$sorted_actions = []; $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'); $globalStatesReq = new Repo('global_state/getAll');
$globalStates = ($globalStatesReq->error->get()==Err::Success) ? $globalStatesReq->answer() : []; $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']]); $chipsReq = new Repo('chip/getAll', [$_SESSION['WAREHOUSE']['id']]);
$chips = ($chipsReq->error->get()==Err::Success) ? $chipsReq->answer() : []; $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 */ /* (1) On récupère les utilisateurs et leurs permissions */
$permissionsReq = new Repo('action_merge/getAccess', [ $permissionsReq = new Repo('action_merge/getAccess', [
@ -582,7 +603,7 @@
$checkToken = new Repo('machine/checkToken', [ $_SESSION['WAREHOUSE']['id'], $token, $renew ]); $checkToken = new Repo('machine/checkToken', [ $_SESSION['WAREHOUSE']['id'], $token, $renew ]);
// Si token incorrect, on envoie une erreur // Si token incorrect, on envoie une erreur
if( $checkToken->answer() !== true ) if( !$checkToken->answer() )
return [ 'error' => new Error(Err::TokenError) ]; return [ 'error' => new Error(Err::TokenError) ];

View File

@ -2,7 +2,6 @@
namespace database\repo; namespace database\repo;
use \database\core\DatabaseDriver; use \database\core\DatabaseDriver;
use \manager\sessionManager;
use \orm\core\Table; use \orm\core\Table;
use \orm\core\Rows; use \orm\core\Rows;
use \api\core\Checker; use \api\core\Checker;
@ -28,7 +27,8 @@
'id_machine' => Rows::INSERT_DEFAULT, 'id_machine' => Rows::INSERT_DEFAULT,
'id_warehouse' => $id_warehouse, 'id_warehouse' => $id_warehouse,
'name' => $name, 'name' => $name,
'token' => sessionManager::secure_hash( uniqid() ) 'token' => Rows::NULL,
'unlock_code' => Rows::NULL
]); ]);
// Si erreur (car name doit être unique) // Si erreur (car name doit être unique)
@ -66,7 +66,8 @@
->whereIdWarehouse($id_warehouse) ->whereIdWarehouse($id_warehouse)
->whereName(["%$keyword%", Rows::COND_LIKE]) ->whereName(["%$keyword%", Rows::COND_LIKE])
->select('id_machine') ->select('id_machine')
->select('name'); ->select('name')
->orderby('name', Rows::ORDER_ASC);
return $search->fetch(); return $search->fetch();
} }
@ -89,6 +90,7 @@
=========================================================*/ =========================================================*/
$cluster = Table::get('machine_cluster') $cluster = Table::get('machine_cluster')
->whereIdWarehouse($id_warehouse) ->whereIdWarehouse($id_warehouse)
->orderby('name', Rows::ORDER_ASC)
->select('*'); ->select('*');
$cluster_merge = Table::get('machine_cluster_merge') $cluster_merge = Table::get('machine_cluster_merge')
->whereIdMachine($id_machine) ->whereIdMachine($id_machine)
@ -182,6 +184,7 @@
->whereIdWarehouse($id_warehouse) ->whereIdWarehouse($id_warehouse)
->select('id_machine') ->select('id_machine')
->select('name') ->select('name')
->orderby('id_machine', Rows::ORDER_ASC)
->unique(); ->unique();
return $machine->fetch(); return $machine->fetch();
@ -211,7 +214,8 @@
->whereName($name) ->whereName($name)
->whereIdWarehouse($id_warehouse) ->whereIdWarehouse($id_warehouse)
->select('id_machine') ->select('id_machine')
->selcet('name') ->select('name')
->orderby('name', Rows::ORDER_ASC)
->unique(); ->unique();
return $machine->fetch(); return $machine->fetch();
@ -242,6 +246,7 @@
->whereIdWarehouse($id_warehouse) ->whereIdWarehouse($id_warehouse)
->select('id_machine') ->select('id_machine')
->select('name') ->select('name')
->orderby('name', Rows::ORDER_ASC)
->unique(); ->unique();
return $machine->fetch(); return $machine->fetch();
@ -268,6 +273,7 @@
$machine = Table::get('machine') $machine = Table::get('machine')
->whereIdWarehouse($id_warehouse) ->whereIdWarehouse($id_warehouse)
->select('id_machine') ->select('id_machine')
->orderby('name', Rows::ORDER_ASC)
->select('name'); ->select('name');
return $machine->fetch(); 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 /* VERIFIE MET A JOUR LE TOKEN DE SYNCHRONISATION
* *
* @id_warehouse<int> UID de l'entrepot * @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) * @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 * @return status<Boolean> VRAI si le token est correct, sinon FALSE
@ -290,22 +338,22 @@
public static function checkToken($id_warehouse, $token, $newToken=null){ public static function checkToken($id_warehouse, $token, $newToken=null){
/* [1] On vérifie le token /* [1] On vérifie le token
=========================================================*/ =========================================================*/
$hash = sessionManager::secure_hash($token); $hash = hash('sha512', $token);
$byToken = self::getByToken($id_warehouse, $hash); $byToken = self::getByToken($id_warehouse, $hash);
// Si aucun résultat, erreur // Si aucun résultat, erreur
if( count($byToken) < 1 ) if( $byToken == false )
return false; return false;
/* [2] On met à jour le token /* [2] On met à jour le token
=========================================================*/ =========================================================*/
$updated = Table::get('machine') $updated = Table::get('machine')
->whereId($id_machine) ->whereId($byToken['id_machine'])
->edit([ ->edit([
'token' => Checker::run('hash', $newToken) ? $newToken : $token, 'token' => Checker::run('hash', $newToken) ? $newToken : $token,
'id_machine' => $byToken[0]['id_machine'] 'id_machine' => $byToken['id_machine']
]); ]);

View File

@ -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
}
}
?>

View File

@ -37,6 +37,7 @@
// {3} Constantes d'insertion // // {3} Constantes d'insertion //
const INSERT_DEFAULT = '__DEFAULT__'; // Valeur DEFAULT (pour insertion) const INSERT_DEFAULT = '__DEFAULT__'; // Valeur DEFAULT (pour insertion)
const NULL = '__NULL__'; // Valeur DEFAULT (pour insertion)
/* Attributs */ /* Attributs */
private $driver; // Database driver label private $driver; // Database driver label
@ -169,7 +170,7 @@
/* FILTRAGE DYNAMIQUES /* FILTRAGE DYNAMIQUES
* *
* @method<String> Nom de la méthode * @method<String> Nom de la méthode
* @parameter<mixed> Valeur du paramètre * @parameter<mixed> Valeur du paramètre
* @parameter<Array> Valeur du paramètre + type de vérification (tableau) * @parameter<Array> Valeur du paramètre + type de vérification (tableau)
* *
@ -266,9 +267,13 @@
/* (2) On vérifie le type de chaque valeur */ /* (2) On vérifie le type de chaque valeur */
$type = $this->schema['columns'][$field]['type']; $type = $this->schema['columns'][$field]['type'];
if( $type == 'int' && !is_numeric($args[0][0]) ) return $this; if( !is_null($args[0][0]) ){
if( $type == 'float' && !is_numeric($args[0][0]) ) return $this;
if( in_array($type, ['text', 'varchar']) && !is_string($args[0][0]) ) return $this; 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 */ /* (3) On vérifie les types des champs */
foreach($cleared as $field=>$value){ foreach($cleared as $field=>$value){
// let null values
if( is_null($value) )
continue;
$type = $this->schema['columns'][$field]['type']; $type = $this->schema['columns'][$field]['type'];
// {1} Si de type INT/FLOAT et pas numérique, on retire le champ // // {1} Si de type INT/FLOAT et pas numérique, on retire le champ //

View File

@ -138,6 +138,13 @@
$sql .= substr($value[1], 2, -2).' '; $sql .= substr($value[1], 2, -2).' ';
/* (3) Variable */ /* (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; $sql .= ':'.$field[0].'_x_'.$field[1].'_'.$offset;
$bound[':'.$field[0].'_x_'.$field[1].'_'.$offset] = $value[0]; $bound[':'.$field[0].'_x_'.$field[1].'_'.$offset] = $value[0];
@ -166,6 +173,14 @@
$sql[$c] = $field.' = '; $sql[$c] = $field.' = ';
/* (2) Variable */ /* (2) Variable */
// {1} Si NULL //
if( is_null($value) ){
$sql[$c] .= 'NULL';
$c++;
continue;
}
// {2} Si not NULL //
$sql[$c] .= ':update_'.$field; $sql[$c] .= ':update_'.$field;
$bound[':update_'.$field] = $value; $bound[':update_'.$field] = $value;

View File

@ -238,7 +238,9 @@
"description": "Données d'initialisation d'une machine.", "description": "Données d'initialisation d'une machine.",
"permissions": ["warehouse"], "permissions": ["warehouse"],
"parameters": { "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": { "output": {
"data": { "description": "Données d'initialisation.", "type": "array<mixed>" } "data": { "description": "Données d'initialisation.", "type": "array<mixed>" }

View File

@ -41,7 +41,9 @@
"search", "search",
"getClusters" "getClusters",
"unlock"
], ],

View File

@ -9,7 +9,6 @@
use \api\core\AuthSystemDefault; use \api\core\AuthSystemDefault;
/*******************************************/ /*******************************************/
/* DEBUGGER */ /* DEBUGGER */
/*******************************************/ /*******************************************/
@ -18,14 +17,13 @@
/* DEBUGGER */ /* DEBUGGER */
/*******************************************/ /*******************************************/
/* [1] Gestion des authentifications et des droits /* [1] Gestion des authentifications et des droits
=========================================================*/ =========================================================*/
/* (1) On met à jour l'authentification et les permissions */ /* (1) On met à jour l'authentification et les permissions */
Request::setAuthSystem(new AuthSystemDefault);
$auth = AuthSystemDefault::auth(); $auth = AuthSystemDefault::auth();
Request::setAuthSystem(new AuthSystemDefault);
/* (2) On définit la page d'accueil */ /* (2) On définit la page d'accueil */
@ -86,7 +84,7 @@
// logout from admin // logout from admin
$R->get('logout/?', function(){ $R->get('logout/?', function(){
$_SERVER['REQUEST_METHOD'] = 'POST'; $_SERVER['REQUEST_METHOD'] = 'POST';
$req = new Request('authentificationDefault/admin', ['username' => ' ', 'password' => '']); $req = new Request('authentificationDefault/admin', ['username' => '-', 'password' => '']);
$res = $req->dispatch(); $res = $req->dispatch();
header('Location: /'); header('Location: /');
}); });
@ -110,7 +108,7 @@
// warehouse logout // warehouse logout
$R->get('logout/?', function(){ $R->get('logout/?', function(){
$_SERVER['REQUEST_METHOD'] = 'POST'; $_SERVER['REQUEST_METHOD'] = 'POST';
(new Request('authentificationDefault/warehouse', ['name' => ' ', 'password' => '']))->dispatch(); (new Request('authentificationDefault/warehouse', ['name' => '---', 'password' => '']))->dispatch();
header('Location: /'); header('Location: /');
}); });