170 lines
4.2 KiB
PHP
Executable File
170 lines
4.2 KiB
PHP
Executable File
<?php
|
|
|
|
/**************************
|
|
* API Checker *
|
|
* 08-12-2016 *
|
|
***************************
|
|
* Designed & Developed by *
|
|
* xdrm-brackets *
|
|
***************************
|
|
* https://xdrm.io/ *
|
|
**************************/
|
|
|
|
namespace api\core;
|
|
|
|
|
|
class Checker{
|
|
|
|
|
|
/** VERIFICATIONS DES TYPES UTILES GENERIQUES
|
|
*
|
|
* @param String $type Type que l'on veut verifier
|
|
* @param mixed $value Valeur a verifier
|
|
*
|
|
* @return Boolean Retourne si oui ou non la valeur @value est du bon type @type
|
|
*
|
|
*/
|
|
public static function run(String $type, $value) : bool {
|
|
$checker = true;
|
|
|
|
/* [0] On verifie que $value n'est pas nul
|
|
=========================================================*/
|
|
if( is_null($value) ) return false;
|
|
|
|
|
|
|
|
/* [1] Si de type VARCHAR(min, max, flags)
|
|
=========================================================*/
|
|
if( preg_match('/^varchar\((\d+), ?(\d+)((?:, ?\w+)+)?\)$/', $type, $match) ){
|
|
// On recupere la taille min
|
|
$min = (int) $match[1];
|
|
// On recupere la taille max
|
|
$max = (int) $match[2];
|
|
|
|
// On recupere le sous-type si défini
|
|
$flags = isset($match[3]) ? explode(',', substr($match[3], 1)) : null;
|
|
|
|
// Si numeric -> to String
|
|
if( is_numeric($value) )
|
|
$value = (string) $value;
|
|
|
|
// On effectue la verification de taille
|
|
$lenCheck = $checker && is_string($value) && strlen($value) <= $max && strlen($value) >= $min;
|
|
|
|
// On vérifie les FLAGS s'il est donné
|
|
if( is_array($flags) )
|
|
foreach( $flags as $flag )
|
|
$lenCheck = $lenCheck && self::run($flag, $value);
|
|
|
|
return $lenCheck;
|
|
}
|
|
|
|
|
|
/* [2] Si de type ARRAY(type_elements)
|
|
=========================================================*/
|
|
if( preg_match('/^array<(.+)>$/', $type, $match) ){
|
|
|
|
// Si c'est pas un tableau on retourne une erreur
|
|
if( !is_array($value) )
|
|
return false;
|
|
|
|
|
|
$elements_type = $match[1];
|
|
|
|
// On verifie le type pour chaque element
|
|
foreach($value as $element)
|
|
// Si erreur dans au moins 1 element, on retourne que c'est incorrect
|
|
if( !self::run($elements_type, trim($element) ) )
|
|
return false;
|
|
|
|
// Si aucune erreur, on retourne que tout est bon
|
|
return true;
|
|
}
|
|
|
|
|
|
/* [n] Sinon, tous les autres types definis
|
|
=========================================================*/
|
|
switch($type){
|
|
// Quoi que ce soit
|
|
case 'mixed':
|
|
return $checker && !is_null($value);
|
|
break;
|
|
|
|
// Entier positif (id dans BDD)
|
|
case 'id':
|
|
return $checker && is_numeric($value) && $value <= 2147483647 && $value >= 0;
|
|
break;
|
|
|
|
// Entier relatif (neg ou pos)
|
|
case 'int':
|
|
return $checker && is_int($value);
|
|
break;
|
|
|
|
// String quelconque (peut etre vide)
|
|
case 'text':
|
|
return $checker && is_string($value);
|
|
|
|
// Adresse mail (255 caracteres max)
|
|
case 'mail':
|
|
return $checker && is_string($value) && strlen($value) <= 50 && preg_match('/^[\w\.-]+@[\w\.-]+\.[a-z]{2,4}$/i', $value);
|
|
break;
|
|
|
|
// Hash sha1/md5
|
|
case 'hash':
|
|
return $checker && is_string($value) && preg_match('/^[\da-f]{128}$/', $value);
|
|
break;
|
|
|
|
case 'alphanumeric':
|
|
return $checker && is_string($value) && preg_match('/^[\w\. -]+$/ui', $value);
|
|
break;
|
|
|
|
case 'letters':
|
|
return $checker && is_string($value) && preg_match('/^[a-z -]+$/i', $value);
|
|
break;
|
|
|
|
case 'status':
|
|
return $checker && is_numeric($value) && floor($value) == $value && $value >= 0 && $value <= 100;
|
|
break;
|
|
|
|
// Tableau non vide
|
|
case 'array':
|
|
return $checker && is_array($value) && count($value) > 0;
|
|
break;
|
|
|
|
// Boolean
|
|
case 'boolean':
|
|
case 'bool':
|
|
return $checker && is_bool($value);
|
|
break;
|
|
|
|
// Objet non vide
|
|
case 'object':
|
|
return $checker && is_object($value) && count((array) $value) > 0;
|
|
break;
|
|
|
|
// Chaine JSON (on vérifie via le parser)
|
|
case 'json':
|
|
return $checker && is_string($value) && json_decode($value, true) !== NULL;
|
|
break;
|
|
|
|
case 'numeric':
|
|
return $checker && (is_numeric($value) || $value == null);
|
|
break;
|
|
|
|
case "float":
|
|
return $checker && ( is_int($value) || is_float($value) );
|
|
break;
|
|
|
|
default:
|
|
return false;
|
|
break;
|
|
}
|
|
|
|
return $checker;
|
|
|
|
}
|
|
|
|
|
|
}
|
|
?>
|