From 2556448a9c40f0c5961dd04dc2282e8433217a78 Mon Sep 17 00:00:00 2001 From: xdrm-brackets Date: Wed, 20 Apr 2016 14:40:44 +0200 Subject: [PATCH] =?UTF-8?q?Gestion=20de=20l'upload=20c=C3=B4t=C3=A9=20serv?= =?UTF-8?q?er=20ok.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Création du module 'upload' et modification de 'ModuleRequest' pour transformer un fichier ($_FILES) en paramètre passé au module --- config/modules.json | 13 ++++- config/upload-auth.json | 4 +- js/includes/sociogram-min.js | 2 +- js/includes/sociogram.js | 2 +- js/lib/api-min.js | 7 ++- js/lib/api.js | 49 +++-------------- manager/ModuleRequest.php | 30 ++++++----- manager/module/upload.php | 101 +++++++++++++++++++++++++++++++++++ manager/uploader.php | 42 +++++++++------ view.php | 2 +- 10 files changed, 172 insertions(+), 80 deletions(-) create mode 100644 manager/module/upload.php diff --git a/config/modules.json b/config/modules.json index 3562f0c..775d350 100755 --- a/config/modules.json +++ b/config/modules.json @@ -177,6 +177,17 @@ } } - } + }, + "upload": { + + "call_log": { + "description": "Upload d'un journal d'appel au format .xml.", + "permissions": ["admin"], + "parameters": { + "file": { "description": "Fichier du journal d'appel", "type": "FILE" } + } + } + + } } diff --git a/config/upload-auth.json b/config/upload-auth.json index d5f25eb..5d3514f 100644 --- a/config/upload-auth.json +++ b/config/upload-auth.json @@ -1,6 +1,6 @@ { - "root": "/src/dynamic/", - "auth": [ + "root": "/src/upload/", + "directories": [ "call_log", "spss", "pspp" diff --git a/js/includes/sociogram-min.js b/js/includes/sociogram-min.js index 26dbce9..388647b 100644 --- a/js/includes/sociogram-min.js +++ b/js/includes/sociogram-min.js @@ -7,4 +7,4 @@ sociogramClass.prototype.arrange=function(a,b,d){var c=this.sigma.graph.nodes(a) Math.PI;for(var g=0;gMath.PI/10){e=!0;break}}while(e);a.x=b.x+this.nodeDistance*Math.cos(d);a.y=b.y+this.nodeDistance*Math.sin(d);this.arrange(a.id)}this.sigma.refresh()}};sociogramClass.prototype.overload.nodeNeighbors=function(a){a=this.allNeighborsIndex[a];var b=[],d;for(d in a)b.push(d);for(;0 "+a.responseText),"success"==a.responseText?API.send({level_0:"excel",level_1:"import_inscrits"},function(a){console.log("[2] PARSE=>"+a.request);"success"==a.request? -(requestIntegration={level_0:"groups",level_1:"addUserlist",rang:rang,annee:annee,formationList:a.formationList},API.send(requestIntegration,function(a){console.log("[3] INTEGRATION=>"+a.request);"success"==a.request?(console.log("liste int\u00e9gr\u00e9e"),reload()):(console.log("integration error"),makeBounce(e.target.parentNode))})):(console.log("import error"),makeBounce(e.target.parentNode),console.log(e.target))}):makeBounce(e.target.parentNode))};a.send(c)}; +APIClass.prototype={xhr:[],send:function(b,d,e){b.hasOwnProperty("path")||d({ModuleError:4});for(var a=0;a -1 ){ + if( xhr.readyState == 4 && [0, 200].indexOf(xhr.status) > -1 ) + handler( xhr.responseText ); + }; - console.log('[1] IMPORT=> '+xhr.responseText); - if( xhr.responseText == 'success' ){ - /* [2] LECTURE DU FICHIER - =======================================*/ - var request = { level_0: 'excel', level_1: 'import_inscrits' }; - API.send(request, function(ex){ - console.log('[2] PARSE=>'+ex.request); - if( ex.request == 'success' ){ - - /* [3] INTÉGRATION À LA BDD - =======================================*/ - requestIntegration = { level_0: 'groups', level_1: 'addUserlist', rang: rang, annee: annee, formationList: ex.formationList }; - API.send( requestIntegration, function(f){ - console.log('[3] INTEGRATION=>'+f.request); - if( f.request == 'success' ){ - console.log('liste intégrée'); - reload(); - }else{ - console.log('integration error'); - makeBounce(e.target.parentNode); - } - }); - - }else{ - console.log('import error'); - makeBounce(e.target.parentNode); - console.log( e.target ); - } - }); - }else makeBounce(e.target.parentNode); - - } - - } - - xhr.send(fd); + xhr.send(postdata); } diff --git a/manager/ModuleRequest.php b/manager/ModuleRequest.php index ba89ec8..9dc9dba 100755 --- a/manager/ModuleRequest.php +++ b/manager/ModuleRequest.php @@ -337,10 +337,6 @@ $method = $this->modules[$this->path['module']][$this->path['method']]; - // Si le nombre de parametre en entree est insuffisant - // if( count($method['parameters']) > count($params) ) return false; - - /* [2] Si le type est defini, pour chaque param, on teste =========================================================*/ @@ -348,20 +344,28 @@ /* (1) On récupère si le paramètre est optionnel ou pas */ $optional = isset($paramsdata['optional']) && $paramsdata['optional'] === true; - /* (2) Si le paramètre est obligatoire et qu'il n'est pas donné -> erreur */ - if( !isset($params[$name]) && !$optional ) return false; + /* (2) Récupère si le paramètre est un fichier et définit comme de type 'FILE' */ + $isFile = isset($paramsdata['type']) && $paramsdata['type'] == 'FILE' && isset($_FILES[$name]); - /* (3) Si le type n'est pas defini, on a pas besoin de le vérifier */ + /* (3) Si le paramètre est obligatoire et qu'il n'est pas donné -> erreur */ + if( !isset($params[$name]) && !$optional && !$isFile ) return false; + + /* (4) Si le type n'est pas defini, on a pas besoin de le vérifier */ if( !isset($paramsdata['type']) ) continue; - /* (4) Si le paramètre est optionnel et n'est pas donné */ - if( $optional && (!isset($params[$name]) || is_null($params[$name])) ){ - // On le crée avec la valeur NULL + /* (5) Si le paramètre est optionnel et n'est pas donné */ + if( $isFile || $optional && (!isset($params[$name]) || is_null($params[$name])) ){ + // On le crée le param optionnel avec la valeur NULL $params[$name] = null; - // On passe au paramètre suivant - continue; - /* (5) Si le paramètre est renseigné */ + // On donne une référence vers le fichier, si c'en est un + if( $isFile ) + $params[$name] = &$_FILES[$name]; + + continue; // On passe au paramètre suivant + + + /* (6) Si le paramètre est renseigné */ }else // Si la verification est fausse, on retourne faux if( !Database::check($paramsdata['type'], $params[$name]) ) return false; diff --git a/manager/module/upload.php b/manager/module/upload.php new file mode 100644 index 0000000..2b4adf0 --- /dev/null +++ b/manager/module/upload.php @@ -0,0 +1,101 @@ + Préfixe (dossier parent) du fichier + * @file Pointeur vers $_FILES[''] + * + * @return error Retourne l'erreur attestant de l'état de l'upload + * + */ + private static function simpleFile($prefix, $file){ + /* [0] On formatte les entrées + =========================================================*/ + $prefix = htmlspecialchars($prefix); + + // Si $prefix n'est pas au bon format + if( !preg_match('/^[a-z0-9_-]+$/', $prefix) ) + return ManagerError::UploadError; + + + /* [1] Chargement du fichier de config + =========================================================*/ + /* (1) On récupère le fichier */ + $uploadAuthResource = new ResourceDispatcher('f/json/upload-auth/conf'); + + /* (2) Si une erreur pour le fichier de conf */ + if( $uploadAuthResource->error != ManagerError::Success ) + return $uploadAuthResource->error; + + /* (3) On récupère la config sous forme de tableau */ + $uploadAuth = json_decode( $uploadAuthResource->getContent(), true ); + + /* (4) Si erreur de PARSAGE */ + if( $uploadAuth == null ) + return ManagerError::ParsingFailed; + + /* [2] Vérification du préfixe + =========================================================*/ + // Si le préfixe n'est pas dans la config -> erreur + if( !in_array($prefix, $uploadAuth['directories']) ) + returnManagerError::UploadError; + + + /* [3] Construction du chemin + =========================================================*/ + /* (1) On construit le chemin */ + $path = __ROOT__.$uploadAuth['root'].'/'.$prefix.'/'; + + /* (2) On crée le dossier s'il n'existe pas */ + if ( !file_exists($path) ) mkdir($path, 0775, true); + + /* (3) On construit le nom du fichier */ + $fileName = $_SESSION['username'].'.'; // Nom + $fileName .= pathinfo($file['name'], PATHINFO_EXTENSION); // Extension + + /* (4) On se place dans le dossier */ + chdir( $path ); + + /* [4] Création du fichier (temporaire->permanent) + =========================================================*/ + if( move_uploaded_file($file['tmp_name'], $path.$fileName) ){ + // on modifie les droits du fichier + chmod($path.$fileName, 0774); + + return ManagerError::Success; + + }else + return ManagerError::UploadError; + } + + + + + + + /* IMPORT D'UN JOURNAL D'APPEL + * + * @file Pointeur vers $_FILES[''] + * + */ + public static function call_log($params){ + extract($params); + + return array( + 'ModuleError' => self::simpleFile('call_log', $file) + ); + } + + } + + +?> diff --git a/manager/uploader.php b/manager/uploader.php index 918b0c0..183e154 100644 --- a/manager/uploader.php +++ b/manager/uploader.php @@ -13,39 +13,49 @@ use \manager\ManagerError; exit(); } - $prefix = htmlspecialchars(urlencode($_POST['prefix'])); + $prefix = htmlspecialchars($_POST['prefix']); + + // Si $prefix n'est pas au bon format + if( !preg_match('/^[a-z0-9_-]+$/', $prefix) ){ echo ManagerError::UploadError; exit(); } + /* [1] Chargement du fichier de config =========================================================*/ + /* (1) On récupère le fichier */ $uploadAuthResource = new ResourceDispatcher('f/json/upload-auth/conf'); - // Si une erreur pour le fichier de conf + + /* (2) Si une erreur pour le fichier de conf */ if( $uploadAuthResource->error != ManagerError::Success ){ echo $uploadAuthResource->error; exit(); } - // On récupère la config + /* (3) On récupère la config sous forme de tableau */ $uploadAuth = json_decode( $uploadAuthResource->getContent(), true ); - // Si erreur de PARSAGE + /* (4) Si erreur de PARSAGE */ if( $uploadAuth == null ){ echo ManagerError::ParsingFailed; exit(); } - var_dump( $uploadAuth ); - - - /* [2] Création du fichier (temporaire->permanent) + /* [2] Vérification du préfixe =========================================================*/ + // Si le préfixe n'est pas dans la config -> erreur + if( !in_array($prefix, $uploadAuth['directories']) ){ echo ManagerError::UploadError; exit(); } - /* [3] Gestion de la réponse + /* [3] Construction du chemin =========================================================*/ - $path = __ROOT__.'/src/dynamic/'.$_POST['prefix'].'/'; - $fileName = 'test.'; - // On récupère l'extension - $fileName .= pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION); + /* (1) On construit le chemin */ + $path = __ROOT__.$uploadAuth['root'].'/'.$_POST['prefix'].'/'; - // on se place dans /src/dynamic/XX + /* (2) On crée le dossier s'il n'existe pas */ + if ( !file_exists($path) ) mkdir($path, 0777, true); + + /* (3) On construit le nom du fichier */ + $fileName = $_SESSION['username'].'.'; // Nom + $fileName .= pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION); // Extension + + /* (4) On se place dans le dossier */ chdir( $path ); - // chmod( $path, 0774 ); - + /* [4] Création du fichier (temporaire->permanent) + =========================================================*/ if( move_uploaded_file($_FILES['file']['tmp_name'], $path.$fileName) ){ // on modifie les droits du fichier chmod($path.$fileName, 0774); diff --git a/view.php b/view.php index 748a43e..8633dbb 100755 --- a/view.php +++ b/view.php @@ -105,7 +105,7 @@ - +