NxTIC/manager/module/upload.php

193 lines
6.7 KiB
PHP

<?php
namespace manager\module;
use \manager\Database;
use \manager\ResourceDispatcher;
use \manager\sessionManager;
use \manager\ManagerError;
use \manager\Repo;
class upload{
/* EFFECTUE UN UPLOAD D'UN fichier
*
* @prefix<String> Préfixe (dossier parent) du fichier
* @extension<String> Extension du fichier
* @file<FILE> Pointeur vers $_FILES['']
* @tester<Function> Fonction qui renvoie TRUE si le format est correct (en prenant le contenu du fichier en paramètre)
*
* @return error<ManagerError> Retourne l'erreur attestant de l'état de l'upload
*
*/
private static function simpleFile($prefix, $extension, $file, $tester){
// Si on est pas connecté, on retourne une erreur -> impossible via token
if( !connected() ) return ManagerError::PermissionError;
/* [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 */
$uploadAuth = ResourceDispatcher::getResource('f/json/upload-auth/conf');
/* (2) Si une erreur pour le fichier de conf */
if( $uploadAuth === false )
return ManagerError::UnreachableResource;
/* (3) On récupère la config sous forme de tableau */
$uploadAuth = json_decode( $uploadAuth, true );
/* (4) Si erreur de PARSAGE */
if( !is_array($uploadAuth) )
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] Vérification du format (via la fonction $tester)
=========================================================*/
/* (1) Si la fonction n'est pas une fonction, on considère que le format est bon */
if( !is_callable($tester) ) return ManagerError::Success;
/* (2) Sinon, on vérifie le format */
$file_content = file_get_contents($file['tmp_name']);
/* (3) On retourne 'Success' si format ok, sinon 'FormatError' */
if( $tester($file_content) ) return ManagerError::Success;
else return ManagerError::FormatError;
/* [4] 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'].'.'.$extension;
/* (4) On se place dans le dossier */
chdir( $path );
/* [5] Création du fichier (temporaire->permanent)
=========================================================*/
/* (1) On déplace le fichier avec le nom formel */
if( move_uploaded_file($file['tmp_name'], $path.$fileName) ){
// on modifie les droits du fichier
chmod($path.$fileName, 0774);
return ManagerError::Success;
/* (2) Si une erreur occure -> 'UploadError' */
}else
return ManagerError::UploadError;
}
/* IMPORT D'UN JOURNAL D'APPEL
*
* @file<FILE> Pointeur vers $_FILES['']
*
*/
public static function call_log($params){
extract($params);
return array(
'ModuleError' => self::simpleFile(
'call_log', // nom du dossier d'upload
'xml', // format du fichier
$file, // Fichier lui-même
function($content){ // Vérification du format du fichier
/* (1) Vérification du format XML */
$xml = simplexml_load_string($content);
if( $xml === false ) return false; // Si erreur de parsage, on retourne une erreur
/* (2) Vérification du contenu (balises) */
// Doit avoir des Item(s)
if( !isset($xml->Item) )
return false;
// Vérification de tous les champs
foreach($xml->Item as $log){
$checkAttributes = isset($log['Id']);
$checkAttributes = $checkAttributes && isset($log['Number']);
$checkAttributes = $checkAttributes && isset($log['Name']);
$checkAttributes = $checkAttributes && isset($log['Date']);
$checkAttributes = $checkAttributes && isset($log['Duration']);
$checkAttributes = $checkAttributes && isset($log['Direction']);
$checkAttributes = $checkAttributes && isset($log['Type']);
// Si on a pas tout les champs, on retourne une erreur
if( !$checkAttributes )
return false;
}
/* (3) Si tout s'est bien passé, le format est bon */
return true;
}
)
);
}
/* IMPORT D'UNE SAUVEGARDE DE FORMULAIRE LOCAL
*
* @file<FILE> Pointeur vers $_FILES['']
*
*/
public static function call_log($params){
extract($params);
return array(
'ModuleError' => self::simpleFile(
'local_data', // nom du dossier d'upload
'json', // format du fichier
$file, // Fichier lui-même
function($content){ // Vérification du format du fichier
/* (1) Vérification du format JSON */
$json = json_decode($content, true);
if( $json == null )
return false; // Si erreur de parsage, on retourne une erreur
/* (2) Vérification du contenu de premier niveau */
$checkLevel0 = isset($json['subject']) && is_array($json['subject']);
$checkLevel0 = $checkLevel0 && isset($json['contacts']) && is_array($json['contacts']);
$checkLevel0 = $checkLevel0 && isset($json['mini']) && is_array($json['mini']);
$checkLevel0 = $checkLevel0 && isset($json['fiches']) && is_array($json['fiches']);
/* (3) Si tout s'est bien passé, le format est bon */
return true;
}
)
);
}
}
?>