NxTIC/manager/module/upload.php

305 lines
12 KiB
PHP
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace manager\module;
use \manager\Database;
use \manager\ResourceDispatcher;
use \manager\sessionManager;
use \manager\ModuleRequest;
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 'FormatError' si erreur de format */
if( !$tester($file_content) ) 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);
/* [1] Gestion de l'upload du fichier et de la vžérification du format
=========================================================*/
$uploadError = 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;
}
);
/* [2] Gestion du retour (unserialize)
=========================================================*/
/* (1) Si erreur d'upload, on la renvoie */
if( $uploadError != ManagerError::Success )
return array( 'ModuleError' => $uploadError );
/* (2) Gestion du parsage (unserialize) du journal d'appel */
$request = new ModuleRequest('call_log/unserialize', array( 'phone_number' => $phone_number ) );
$response = $request->dispatch();
/* (3) Restitution du retour de `unserialize` */
return array_merge(
array( 'ModuleError' => $response->error ),
$response->getAll()
);
}
/* IMPORT D'UNE SAUVEGARDE DE FORMULAIRE LOCAL
*
* @file<FILE> Pointeur vers $_FILES['']
*
*/
public static function local_data($params){
extract($params);
/* [1] Upload et vérifiaction du format du fichier
=========================================================*/
$uploadError = 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']);
// Erreur si level 0 incorrect
if( !$checkLevel0 )
return false;
/* (3) Vérification du sujet */
$checkSubject = isset($json['subject']['username']) && is_string($json['subject']['username']);
$checkSubject = $checkSubject && isset($json['subject']['firstname']) && is_string($json['subject']['firstname']);
$checkSubject = $checkSubject && isset($json['subject']['lastname']) && is_string($json['subject']['lastname']);
$checkSubject = $checkSubject && isset($json['subject']['number']) && is_string($json['subject']['number']);
// Erreur des attributs du sujet incorrects ou manquants
if( !$checkSubject )
return false;
/* (4) Vérification des contacts */
foreach($json['contacts'] as $contact){
$checkContact = isset($contact['username']) && is_string($contact['username']);
$checkContact = $checkContact && isset($contact['firstname']) && is_string($contact['firstname']);
$checkContact = $checkContact && isset($contact['lastname']) && is_string($contact['lastname']);
$checkContact = $checkContact && isset($contact['number']) && ( is_numeric($contact['number']) || is_string($contact['number']) );
// Si erreur des attributs du contact incorrects ou manquants
if( !$checkContact )
return false;
}
/* (5) Vérification des mini-fiches */
foreach($json['mini'] as $mini){
$checkMini = isset($mini['uid']) && is_numeric($mini['uid']);
$checkMini = $checkMini && isset($mini['username']) && is_string($mini['username']);
$checkMini = $checkMini && isset($mini['firstname']) && is_string($mini['firstname']);
$checkMini = $checkMini && isset($mini['lastname']) && is_string($mini['lastname']);
$checkMini = $checkMini && isset($mini['sexe']) && is_array($mini['sexe']);
$checkMini = $checkMini && isset($mini['age']) && is_string($mini['age']);
$checkMini = $checkMini && isset($mini['job']) && is_string($mini['job']);
$checkMini = $checkMini && isset($mini['loc']) && is_array($mini['loc']);
// Si erreur des attributs des mini-fiches incorrects ou manquants
if( !$checkMini )
return false;
}
/* (6) Vérification des fiches */
foreach($json['fiches'] as $fiches){
$checkFiche = isset($fiches['uid']) && is_numeric($fiches['uid']);
$checkFiche = $checkFiche && isset($fiches['username']) && is_string($fiches['username']);
$checkFiche = $checkFiche && isset($fiches['firstname']) && is_string($fiches['firstname']);
$checkFiche = $checkFiche && isset($fiches['lastname']) && is_string($fiches['lastname']);
$checkFiche = $checkFiche && isset($fiches['sexe']) && is_array($fiches['sexe']);
$checkFiche = $checkFiche && isset($fiches['age']) && is_string($fiches['age']);
$checkFiche = $checkFiche && isset($fiches['job']) && is_string($fiches['job']);
$checkFiche = $checkFiche && isset($fiches['loc']) && is_array($fiches['loc']);
$checkFiche = $checkFiche && isset($fiches['loc2']) && is_array($fiches['loc2']);
$checkFiche = $checkFiche && isset($fiches['studies']) && is_string($fiches['studies']);
$checkFiche = $checkFiche && isset($fiches['famsit']) && is_array($fiches['famsit']);
$checkFiche = $checkFiche && isset($fiches['reltype']) && is_array($fiches['reltype']);
$checkFiche = $checkFiche && isset($fiches['reltypeSpecial']) && is_string($fiches['reltypeSpecial']);
$checkFiche = $checkFiche && isset($fiches['city']) && is_string($fiches['city']);
$checkFiche = $checkFiche && isset($fiches['duration']) && is_array($fiches['duration']);
$checkFiche = $checkFiche && isset($fiches['context']) && is_array($fiches['context']);
$checkFiche = $checkFiche && isset($fiches['contextSpecial']) && is_array($fiches['contextSpecial']);
$checkFiche = $checkFiche && isset($fiches['freq']) && is_array($fiches['freq']);
$checkFiche = $checkFiche && isset($fiches['connect']) && is_array($fiches['connect']);
$checkFiche = $checkFiche && isset($fiches['connectSpecial']) && is_array($fiches['connectSpecial']);
// Si erreur des attributs des fiches incorrects ou manquants
if( !$checkFiche )
return false;
}
return true;
}
);
/* [2] Renvoi du contenu du fichier
=========================================================*/
return array(
);
}
}
?>