2019-10-29 14:57:13 +01:00
< ? php
2019-10-30 00:30:39 +01:00
/*
2019-11-10 17:48:54 +01:00
* This file is part of RaspiSMS .
2019-10-30 00:30:39 +01:00
*
2019-11-10 17:48:54 +01:00
* ( c ) Pierre - Lin Bonnemaison < plebwebsas @ gmail . com >
2019-10-30 00:30:39 +01:00
*
2019-11-10 17:48:54 +01:00
* This source file is subject to the GPL - 3.0 license that is bundled
2019-10-30 00:30:39 +01:00
* with this source code in the file LICENSE .
*/
namespace controllers\internals ;
2019-10-29 14:57:13 +01:00
2019-11-14 02:02:50 +01:00
/**
* Some tools frequently used .
* Not a standard controller as it ' s not linked to a model in any way
*/
2019-10-29 18:36:25 +01:00
class Tool extends \descartes\InternalController
{
/**
* Cette fonction parse un numéro pour le retourner sans espaces , etc .
2019-10-30 00:30:39 +01:00
*
2019-10-29 18:36:25 +01:00
* @ param string $number : Le numéro de téléphone à parser
2019-10-30 00:30:39 +01:00
*
2019-10-29 18:36:25 +01:00
* @ return mixed : Si le numéro est bien un numéro de téléphone , on retourne le numéro parsé . Sinon , on retourne faux
*/
public static function parse_phone ( $number )
{
2019-11-30 05:31:20 +01:00
try
2019-10-30 00:30:39 +01:00
{
2019-11-30 05:31:20 +01:00
$phone_number_util = \libphonenumber\PhoneNumberUtil :: getInstance ();
$phone_number_o = $phone_number_util -> parse ( $number , null );
$valid = $phone_number_util -> isValidNumber ( $phone_number_o );
if ( ! $valid )
{
return false ;
}
2019-10-30 00:30:39 +01:00
2019-11-30 05:31:20 +01:00
return $phone_number_util -> format ( $phone_number_o , \libphonenumber\PhoneNumberFormat :: E164 );
}
catch ( \Exception $e )
{
return false ;
}
2019-10-29 18:36:25 +01:00
}
2019-10-29 14:57:13 +01:00
2019-10-29 18:36:25 +01:00
/**
* Cette fonction parse un numéro pour le retourner avec des espaces , etc .
2019-10-30 00:30:39 +01:00
*
2019-10-29 18:36:25 +01:00
* @ param string $number : Le numéro de téléphone à parser
2019-10-30 00:30:39 +01:00
*
2019-10-29 18:36:25 +01:00
* @ return mixed : Si le numéro est bien un numéro de téléphone , on retourne le numéro parsé . Sinon , on retourne faux
*/
2019-11-10 01:17:28 +01:00
public static function phone_format ( $number )
2019-10-29 18:36:25 +01:00
{
2019-11-30 05:31:20 +01:00
try
{
$phone_number_util = \libphonenumber\PhoneNumberUtil :: getInstance ();
$phone_number_o = $phone_number_util -> parse ( $number , null );
2019-11-10 17:36:42 +01:00
2019-11-30 05:31:20 +01:00
return $phone_number_util -> format ( $phone_number_o , \libphonenumber\PhoneNumberFormat :: INTERNATIONAL );
}
catch ( \Exception $e )
{
return $number ;
}
2019-10-29 18:36:25 +01:00
}
2019-10-29 14:57:13 +01:00
2019-11-29 05:29:03 +01:00
/**
* Format a number and make a link to a discussion with this number
* @ param string $number : Number to format and make a link for
* @ return string : Link to the number
*/
public static function phone_link ( $number )
{
$number_format = \controllers\internals\Tool :: phone_format ( $number );
$url = \descartes\Router :: url ( 'Discussion' , 'show' , [ 'number' => $number ]);
return '<a href="' . self :: s ( $url , false , true , false ) . '">' . self :: s ( $number_format , false , true , false ) . '</a>' ;
}
2019-10-29 18:36:25 +01:00
/**
* Cette fonction fait la correspondance entre un type d ' evenement et une icone font awesome .
2019-10-30 00:30:39 +01:00
*
2019-10-29 18:36:25 +01:00
* @ param string $type : Le type de l ' évenement à analyser
2019-10-30 00:30:39 +01:00
*
2019-10-29 18:36:25 +01:00
* @ return string : Le nom de l ' icone à afficher ( ex : fa - user )
*/
public static function event_type_to_icon ( $type )
{
switch ( $type ) {
case 'USER_ADD' :
$logo = 'fa-user' ;
2019-10-30 00:30:39 +01:00
2019-10-29 18:36:25 +01:00
break ;
case 'CONTACT_ADD' :
$logo = 'fa-user' ;
2019-10-30 00:30:39 +01:00
2019-10-29 18:36:25 +01:00
break ;
case 'GROUP_ADD' :
$logo = 'fa-group' ;
2019-10-30 00:30:39 +01:00
2019-10-29 18:36:25 +01:00
break ;
case 'SCHEDULED_ADD' :
$logo = 'fa-calendar' ;
2019-10-30 00:30:39 +01:00
2019-10-29 18:36:25 +01:00
break ;
case 'COMMAND_ADD' :
$logo = 'fa-terminal' ;
2019-10-30 00:30:39 +01:00
2019-10-29 18:36:25 +01:00
break ;
default :
$logo = 'fa-question' ;
}
2019-10-29 14:57:13 +01:00
2019-10-29 18:36:25 +01:00
return $logo ;
}
2019-10-29 14:57:13 +01:00
2019-10-29 18:36:25 +01:00
/**
2019-10-30 00:30:39 +01:00
* Cette fonction vérifie une date .
*
* @ param string $date : La date a valider
2019-10-29 18:36:25 +01:00
* @ param string $format : Le format de la date
2019-10-30 00:30:39 +01:00
*
* @ return bool : Vrai si la date et valide , faux sinon
2019-10-29 18:36:25 +01:00
*/
public static function validate_date ( $date , $format )
{
$objectDate = \DateTime :: createFromFormat ( $format , $date );
2019-10-30 00:30:39 +01:00
return $objectDate && $objectDate -> format ( $format ) === $date ;
2019-10-29 18:36:25 +01:00
}
2019-10-29 14:57:13 +01:00
2019-10-29 18:36:25 +01:00
/**
2019-10-30 00:30:39 +01:00
* Cette fonction parse un texte , pour en extraire des données contenu dans des drapeaux au format [ FLAG : contenu du drapeau ] .
*
2019-10-29 18:36:25 +01:00
* @ param string $texte : Le texte à parser
2019-10-30 00:30:39 +01:00
*
2019-10-29 18:36:25 +01:00
* @ return mixed : Tableau de la forme 'FLAG' => 'contenu du drapeau' . si on trouve une forme correcte ( Le contenu de FLAG sera mis en majuscule automatiquement ) . Sinon le tableau vide .
*/
public static function parse_for_flag ( $texte )
{
2019-10-30 00:30:39 +01:00
$returns = [];
$results = [];
while ( preg_match ( '#\[(.*)(?<!\\\):(.*)(?<!\\\)\]#Uui' , $texte , $results ))
{ //Tant qu'on recuèpre un flag
2019-10-29 18:36:25 +01:00
$returns [ mb_strtoupper ( $results [ 1 ])] = $results [ 2 ];
$texte = str_replace ( $results [ 0 ], '' , $texte );
}
2019-10-30 00:30:39 +01:00
2019-10-29 18:36:25 +01:00
return $returns ;
}
2019-10-29 14:57:13 +01:00
2019-10-29 18:36:25 +01:00
/**
2019-10-30 00:30:39 +01:00
* Cette fonction retourne un mot de passe généré aléatoirement .
*
2019-10-29 18:36:25 +01:00
* @ param int $length : Taille du mot de passe à générer
2019-10-30 00:30:39 +01:00
*
2019-10-29 18:36:25 +01:00
* @ return string : Le mot de passe aléatoire
*/
public static function generate_password ( $length )
{
$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-@()?.:!%*$&/' ;
$password = '' ;
$chars_length = mb_strlen ( $chars ) - 1 ;
$i = 0 ;
2019-10-30 00:30:39 +01:00
while ( $i < $length )
{
++ $i ;
2019-10-29 18:36:25 +01:00
$password .= $chars [ rand ( 0 , $chars_length )];
}
2019-10-30 00:30:39 +01:00
2019-10-29 18:36:25 +01:00
return $password ;
}
/**
2019-10-30 00:30:39 +01:00
* Cette fonction vérifie si un utilisateur et connecté , et si il ne l ' est pas , redirige sur la page de connexion .
2019-10-29 18:36:25 +01:00
*/
2019-10-30 00:17:10 +01:00
public static function verifyconnect ()
2019-10-29 18:36:25 +01:00
{
2019-10-30 00:30:39 +01:00
if ( ! isset ( $_SESSION [ 'connect' ]) || ! $_SESSION [ 'connect' ])
{
2019-10-29 18:36:25 +01:00
header ( 'Location: /' );
die ();
}
2019-10-29 14:57:13 +01:00
}
2019-10-30 00:30:39 +01:00
2019-11-11 00:22:40 +01:00
/**
* Check if the user connected .
*
* @ return bool : True if connected , False else
*/
public static function is_connected ()
{
return ( bool ) ( $_SESSION [ 'connect' ] ? ? false );
}
2019-10-29 14:57:13 +01:00
/**
* Check if the user is admin .
2019-10-30 00:30:39 +01:00
*
* @ return bool : True if admin , False else
2019-10-29 18:36:25 +01:00
*/
public static function is_admin ()
{
2019-11-10 00:27:42 +01:00
return ( bool ) ( $_SESSION [ 'user' ][ 'admin' ] ? ? false );
2019-10-29 14:57:13 +01:00
}
/**
2019-10-30 00:30:39 +01:00
* Cette fonction s 'occupe d' envoyer les emails .
*
* @ param string $to : L ' adresse mail à laquelle envoyer le mail
* @ param array $settings : Les settings du mail , type , sujet , template
* @ param array $datas : Les données à fournir au template du mail
2019-10-29 14:57:13 +01:00
*/
2019-10-30 00:17:10 +01:00
public static function send_email ( $to , $settings , $datas = [])
2019-10-29 14:57:13 +01:00
{
2019-10-30 00:17:10 +01:00
$controller = new \descartes\Controller ();
2019-10-30 00:30:39 +01:00
2019-11-10 00:27:42 +01:00
ob_start ();
$controller -> render ( $settings [ 'template' ], $datas );
$content = ob_get_clean ();
2019-11-10 17:36:42 +01:00
return mail ( $to , $settings [ 'subject' ], $content );
2019-10-29 14:57:13 +01:00
}
2019-11-30 05:31:20 +01:00
/**
* Allow to read an uploaded file
* @ param array $file : The array extracted from $_FILES [ 'file' ]
* @ return array : [ 'success' => bool , 'content' => file handler | error message , 'error_code' => $file [ 'error' ]]
*/
public static function read_uploaded_file ( array $file )
{
$result = [
'success' => false ,
'content' => 'Une erreur inconnue est survenue.' ,
'error_code' => $file [ 'error' ] ? ? 99 ,
'mime_type' => false ,
];
if ( $file [ 'error' ] !== UPLOAD_ERR_OK )
{
switch ( $file [ 'error' ])
{
case UPLOAD_ERR_INI_SIZE :
$result [ 'content' ] = 'Impossible de télécharger le fichier car il dépasse les ' . ini_get ( 'upload_max_filesize' ) / ( 1000 * 1000 ) . ' Mégaoctets.' ;
break ;
case UPLOAD_ERR_FORM_SIZE :
$result [ 'content' ] = 'Le fichier dépasse la limite de taille.' ;
break ;
case UPLOAD_ERR_PARTIAL :
$result [ 'content' ] = 'L\'envoi du fichier a été interrompu.' ;
break ;
case UPLOAD_ERR_NO_FILE :
$result [ 'content' ] = 'Aucun fichier n\'a été envoyé.' ;
break ;
case UPLOAD_ERR_NO_TMP_DIR :
$result [ 'content' ] = 'Le serveur ne dispose pas de fichier temporaire permettant l\'envoi de fichiers.' ;
break ;
case UPLOAD_ERR_CANT_WRITE :
$result [ 'content' ] = 'Impossible d\'envoyer le fichier car il n\'y a plus de place sur le serveur.' ;
break ;
case UPLOAD_ERR_EXTENSION :
$result [ 'content' ] = 'Le serveur a interrompu l\'envoi du fichier.' ;
break ;
}
return $result ;
}
$tmp_filename = $file [ 'tmp_name' ] ? ? false ;
if ( ! $tmp_filename || ! is_readable ( $tmp_filename ))
{
return $result ;
}
$result [ 'mime_type' ] = mime_content_type ( $tmp_filename ) == 'text/plain' ? $file [ 'type' ] : mime_content_type ( $tmp_filename );
$file_handler = fopen ( $tmp_filename , 'r' );
$result [ 'success' ] = true ;
$result [ 'content' ] = $file_handler ;
return $result ;
}
2019-12-04 03:04:45 +01:00
/**
* Allow to upload file
* @ param array $file : The array extracted from $_FILES [ 'file' ]
* @ return array : [ 'success' => bool , 'content' => file path | error message , 'error_code' => $file [ 'error' ]]
*/
public static function upload_file ( array $file )
{
$result = [
'success' => false ,
'content' => 'Une erreur inconnue est survenue.' ,
'error_code' => $file [ 'error' ] ? ? 99 ,
];
if ( $file [ 'error' ] !== UPLOAD_ERR_OK )
{
switch ( $file [ 'error' ])
{
case UPLOAD_ERR_INI_SIZE :
$result [ 'content' ] = 'Impossible de télécharger le fichier car il dépasse les ' . ini_get ( 'upload_max_filesize' ) / ( 1000 * 1000 ) . ' Mégaoctets.' ;
break ;
case UPLOAD_ERR_FORM_SIZE :
$result [ 'content' ] = 'Le fichier dépasse la limite de taille.' ;
break ;
case UPLOAD_ERR_PARTIAL :
$result [ 'content' ] = 'L\'envoi du fichier a été interrompu.' ;
break ;
case UPLOAD_ERR_NO_FILE :
$result [ 'content' ] = 'Aucun fichier n\'a été envoyé.' ;
break ;
case UPLOAD_ERR_NO_TMP_DIR :
$result [ 'content' ] = 'Le serveur ne dispose pas de fichier temporaire permettant l\'envoi de fichiers.' ;
break ;
case UPLOAD_ERR_CANT_WRITE :
$result [ 'content' ] = 'Impossible d\'envoyer le fichier car il n\'y a plus de place sur le serveur.' ;
break ;
case UPLOAD_ERR_EXTENSION :
$result [ 'content' ] = 'Le serveur a interrompu l\'envoi du fichier.' ;
break ;
}
return $result ;
}
$tmp_filename = $file [ 'tmp_name' ] ? ? false ;
if ( ! $tmp_filename || ! is_readable ( $tmp_filename ))
{
return $result ;
}
$md5_filename = md5_file ( $tmp_filename );
if ( ! $md5_filename )
{
return $result ;
}
$new_file_path = PWD_DATAS . '/' . $md5_filename ;
if ( file_exists ( $new_file_path ))
{
$result [ 'success' ] = true ;
$result [ 'content' ] = $new_file_path ;
return $result ;
}
$success = move_uploaded_file ( $tmp_filename , $new_file_path );
if ( ! $success )
{
$result [ 'content' ] = 'Impossible d\'écrire le fichier sur le serveur.' ;
return $result ;
}
$result [ 'success' ] = true ;
$result [ 'content' ] = $new_file_path ;
return $result ;
}
2019-10-29 18:36:25 +01:00
}