diff --git a/config/modules.json b/config/modules.json index f48a578..3a1d3c5 100755 --- a/config/modules.json +++ b/config/modules.json @@ -32,7 +32,7 @@ "network_data": { "description": "Renvoie un jeu de donnees fictif pour un graphique de type #network.", - "permissions": ["admin"], + "permissions": [], "parameters": {} }, diff --git a/index.php b/index.php index 76ff807..61ab2b3 100755 --- a/index.php +++ b/index.php @@ -33,11 +33,15 @@ // Si les parametres de connection, on essaie de connecter if( $login_vars ){ - $login = new ModuleRequest('users/login', array('login' => $login, 'password' => $password)); + $login = new ModuleRequest('users/login', array( + 'login' => $_POST['login'], + 'password' => $_POST['password'] + )); + $login_ans = $login->dispatch(); // Si aucune erreur, on dit qu'on vient de se connecter - if( $login_ans->ModuleError == ManagerError::Success ) + if( $login_ans->error == ManagerError::Success ) $_SESSION['login_status'] = 'logged'; // Si on n'a pas les bonnes donnees diff --git a/manager/ModuleRequest.php b/manager/ModuleRequest.php index 718d987..43fac03 100755 --- a/manager/ModuleRequest.php +++ b/manager/ModuleRequest.php @@ -29,11 +29,12 @@ * * @path Chemin de delegation ("module/methode") * @param Tableau associatif contenant les parametres utiles au traitement + * @token Token d'acces a l'api (OPTIONNEL) * * @return status Retourne si oui ou non tout s'est bien passe * */ - public function __construct($path=null, $params=null){ + public function __construct($path=null, $params=null, $token=null){ // Si pas parametre manquant, on quitte if( $path == null ){ $this->error = ManagerError::MissingPath; @@ -73,7 +74,7 @@ /* [3] Verification des droits =========================================================*/ - if( !$this->checkPermission() ){ // Si on a pas les droits + if( !$this->checkPermission($token) ){ // Si on a pas les droits $this->error = ManagerError::PermissionError; return false; } @@ -183,15 +184,6 @@ return $tmp; } - /* (2) Si le token n'est pas dans la BDD */ - $checkToken = new Repo('token/check', array($_SERVER['PHP_AUTH_DIGEST']) ); - $valid_token = $checkToken->answer(); - - if( !$valid_token ){ - $tmp = new ModuleRequest(); - $tmp->error = ManagerError::TokenError; - return $tmp; - } /* [1] On verifie que le @path est renseigne =========================================================*/ @@ -205,17 +197,17 @@ // On retire le @path de @params unset($params['path']); + /* [3] On retourne une instance de =========================================================*/ - return new ModuleRequest($post['path'], $params); - + // On cree notre requete avec le token + return new ModuleRequest($post['path'], $params, $_SERVER['PHP_AUTH_DIGEST']); } - /* VERIFICATION DU FORMAT ET DE LA COHERENCE DU CHEMIN SPECIFIE * * @path String correspondant au chemin de delegation ("module/methode") @@ -268,27 +260,58 @@ /* RETOURNE SI ON A LA PERMISSION D'EXECUTER CETTE METHODE * + * @token Token d'acces a l'API (OPTIONNEL) + * * @return permission Retourne si on a les droits ou pas pour executer cette methode * */ - private function checkPermission(){ + private function checkPermission($token=null){ + /* [1] On recupere les informations utiles + =========================================================*/ // On recupere le nom de la methode $method = $this->modules[$this->path['module']][$this->path['method']]; // Si aucune permission n'est definie if( !isset($method['permissions']) ) return true; - // On recupere les permissions + + /* [2] Gestion si un @token est defini + =========================================================*/ + if( Database::check('sha1', $token) ){ + + + /* (1) On verifie que le token est valide */ + $checkToken = new Repo('token/check', array($token) ); + $token_permissions = $checkToken->answer(); + + // Si le token est invalide, on retourne FAUX + if( $token_permissions === false ) return false; + + $local_permissions = $token_permissions; + + + /* [3] Gestion si aucun token, avec utilisateu connecte + =========================================================*/ + }else + $local_permissions = $_SESSION['permission']; + + + + /* [4] Verification des droits parmi les permissions donnees + =========================================================*/ + /* (1) On recupere la liste des permissions possibles */ $permissions = $method['permissions']; - // Si aucune permission n'est definie, on laisse l'acces + /* (2) Si aucune permission n'est definie, on laisse l'acces */ if( count($permissions) == 0 ) return true; - // On verifie qu'il y a au moins une permission ok + /* (3) On verifie qu'il y a au moins une permission ok */ foreach($permissions as $permission) - if( permission($permission) ) return true; + if( in_array($permission, $local_permissions) ) return true; - // On retourne FAUX si aucun droit n'a ete trouve + + /* [5] On retourne FAUX si aucun droit n'a ete trouve + =========================================================*/ return false; } diff --git a/manager/repo/token.php b/manager/repo/token.php index 545e996..b555442 100644 --- a/manager/repo/token.php +++ b/manager/repo/token.php @@ -75,7 +75,7 @@ * * @token Token en question * - * @return valid Retourne si VRAI ou FAUX le token est valid + * @return permissions Retourne les permissions (droits) du token s'il est valide sinon retourne FAUX * */ public static function check($token){ @@ -92,16 +92,21 @@ /* [2] Verification dans la base de donnees =========================================================*/ - $check = Database::getPDO()->prepare("SELECT id_token + $check = Database::getPDO()->prepare("SELECT id_token, permission FROM api_token WHERE CURDATE() <= expires AND token = :token"); $check->execute(array( ':token' => $token )); + $token_info = $check->fetch(); - /* [3] On retourne le resultat + // Si le token est inactif, on retourne FALSE + if( $token_info === false ) return false; + + + /* [3] On retourne le resultat (les permissions du token) =========================================================*/ - return $check->fetch() !== false; + return explode( ',', str_replace(' ', '', $token_info['permission']) ); }