Merge branch 'dev' into feature/SATS/states

This commit is contained in:
xdrm-brackets 2017-02-19 18:09:27 +01:00
commit 2073606a29
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
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':

View File

@ -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 )

View File

@ -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) ];

View File

@ -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']
]);

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 //
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 //

View File

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

View File

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

View File

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

View File

@ -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: /');
});