lighten-mailbox-new/functions.php

925 lines
30 KiB
PHP

<?php
require_once __DIR__.'/vendor/autoload.php';
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
function cleanTxt($char) {
return preg_replace(
"([^a-zA-Z0-9@-])",
'',
$char
);
}
function folderCleanName($folderName) {
#$folderName = utf8_encode(imap_utf7_decode());
$folderName = preg_replace(
"(\[|\])",
'',
$folderName
);
$folderName = preg_replace(
"([[:space:]])",
'-',
$folderName
);
$folderName = preg_replace(
"([^a-zA-Z0-9@-])",
'_',
$folderName
);
return $folderName;
}
function splitEmailAddress($email){
$split = explode('@', $email);
$arr['user']=$split[0];
$arr['domain']=$split[1];
return $arr;
}
function myCrypt($value) {
global $config;
return openssl_encrypt($value, $config['crypt']['method'], $config['crypt']['key'], $config['crypt']['options'], $config['crypt']['iv']);
}
function myDecrypt($value) {
global $config;
return openssl_decrypt ($value, $config['crypt']['method'], $config['crypt']['key'], $config['crypt']['options'], $config['crypt']['iv']);
}
function portCheck($ip, $portt) {
$fp = @fsockopen($ip, $portt, $errno, $errstr, 0.1);
if (!$fp) {
return false;
} else {
fclose($fp);
return true;
}
}
function mxConca($domain) {
global $config;
// On prépare les données
$r = new Net_DNS2_Resolver(array('nameservers' => $config['nameservers']));
try {
$result = $r->query($domain, 'MX');
} catch(Net_DNS2_Exception $e) {
return false;
}
foreach($result->answer as $mxrr) {
$mxArray[]=$mxrr->exchange;
}
$mxConca='';
sort($mxArray);
foreach($mxArray as $mx) {
if ($mxConca!='') {
$mxConca.=','.$mx;
} else {
$mxConca.=$mx;
}
}
return $mxConca;
}
function imapSecure($secure) {
$return='/notls';
if ($secure == 1) {
$return='/tls';
} else if ($secure == 2) {
$return='/ssl';
}
return $return;
}
function imapAuth($auth) {
$return='';
if ($auth == 1) {
$return='/secure';
}
return $return;
}
function imapCert($cert) {
$return='/novalidate-cert';
if ($cert == true || $cert == 1) {
$return='/validate-cert';
}
return $return;
}
//~ secure :
//~ 0 = None
//~ 1 = STARTTLS
//~ 2 = SSLTLS
//~ auth :
//~ 0 = Normal
//~ 1 = Encrypt
//~ cert :
//~ 0 = no validate
//~ 1 = validate
function serverImapOpenString($server, $port, $secure, $auth, $cert, $inbox = 'INBOX') {
return '{'.$server.':'.$port.'/imap'.imapSecure($secure).imapAuth($auth).imapCert($cert).'}'.$inbox;
}
function imapCon($server, $port, $user, $password, $secure, $auth, $cert) {
$serverImapOpenString = serverImapOpenString($server, $port, $secure, $auth, $cert);
$mailbox = @imap_open($serverImapOpenString , $user, $password, OP_READONLY, 0);
return $mailbox;
}
function imapTestCon($session_id, $domain, $server, $port, $user, $password, $secure, $auth, $cert) {
global $db;
global $config;
$return['result'] = false;
$mailbox = imapCon($server, $port, $user, $password, $secure, $auth, $cert);
if (FALSE === $mailbox) {
$return['result'] = false;
} else {
$return['result'] = true;
// Paramètre
if (preg_match('/@/', $user)) {
$return['param']['user'] = '%e';
} else {
$return['param']['user'] = '%u';
}
$return['param']['server'] = $server;
$return['param']['port'] = $port;
$return['param']['secure'] = $secure;
$return['param']['auth'] = $auth;
$return['param']['cert'] = $cert;
// == Enregistrement en BD
try {
/// D'abord on supprime si ça éxiste déjà
$deletecmd = $db->prepare("DELETE FROM open WHERE session_id = :session_id");
$deletecmd->bindParam('session_id', $session_id, PDO::PARAM_INT);
$deletecmd->execute();
} catch ( PDOException $e ) {
toLog(1, "DELETE in open, error : ".$e->getMessage(), 0);
}
$mxConca = mxConca($domain);
if (preg_match('/@/', $user)) {
$user='%e';
} else {
$user='%u';
}
try {
// Enregistrer paramètre connexion en BD
$req = $db->prepare("INSERT INTO open (session_id, domain, mx, dateCreate, imap_server, imap_port, imap_user, imap_secure, imap_auth, imap_cert)
VALUES (:session_id, :domain, :mx, '".time()."', :imap_server, :imap_port, :imap_user, :imap_secure, :imap_auth, :imap_cert)");
$req->bindParam('session_id', $session_id, PDO::PARAM_INT);
$req->bindParam('domain', $domain, PDO::PARAM_STR);
$req->bindParam('mx', $mxConca, PDO::PARAM_STR);
$req->bindParam('imap_server', $server, PDO::PARAM_STR);
$req->bindParam('imap_port', $port, PDO::PARAM_INT);
$req->bindParam('imap_user', $user, PDO::PARAM_STR);
$req->bindParam('imap_secure', $secure, PDO::PARAM_INT);
$req->bindParam('imap_auth', $auth, PDO::PARAM_INT);
$req->bindParam('imap_cert', $cert, PDO::PARAM_INT);
$req->execute();
} catch ( PDOException $e ) {
toLog(1, "INSET in open, error : ".$e->getMessage(), 0);
}
// Liste dossier
$list = imap_list($mailbox, "{".$server."}", "*");
if (is_array($list)) {
foreach ($list as $val) {
$return['folder'][] = str_replace("{".$server."}", '', $val);
}
}
imap_close($mailbox);
}
return $return;
}
function imapAutoDetect($session_id, $user, $domain, $password) {
global $config;
$testImapServeurs = array(
'imap.'.$domain,
'mail.'.$domain,
$domain,
);
foreach($testImapServeurs as $server) {
// Test résolution DNS
$resolv=true;
$r = new Net_DNS2_Resolver(array('nameservers' => $config['nameservers']));
try {
$result = $r->query($domain, 'A');
} catch(Net_DNS2_Exception $e) {
$resolv=false;
}
if ($resolv) {
if (portCheck($server, 993)) {
// %e
$imapConnexion = imapTestCon($session_id, $domain, $server, 993, $user.'@'.$domain, $password, 2, 0, false);
if($imapConnexion['result'] == true) {
// Connexion trouvé !
$imapConnexion['src'] = 'auto';
return $imapConnexion;
break;
}
// %u
$imapConnexion = imapTestCon($session_id, $domain, $server, 993, $user, $password, 2, 0, false);
if($imapConnexion['result'] == true) {
// Connexion trouvé !
$imapConnexion['src'] = 'auto';
return $imapConnexion;
break;
}
// %e auth
$imapConnexion = imapTestCon($session_id, $domain, $server, 993, $user.'@'.$domain, $password, 2, 1, false);
if($imapConnexion['result'] == true) {
// Connexion trouvé !
$imapConnexion['src'] = 'auto';
return $imapConnexion;
break;
}
// %u auth
$imapConnexion = imapTestCon($session_id, $domain, $server, 993, $user, $password, 2, 1, false);
if($imapConnexion['result'] == true) {
// Connexion trouvé !
$imapConnexion['src'] = 'auto';
return $imapConnexion;
break;
}
}
if (portCheck($server, 143)) {
// %e
$imapConnexion = imapTestCon($session_id, $domain, $server, 143, $user.'@'.$domain, $password, 1, 0, false);
if($imapConnexion['result'] == true) {
// Connexion trouvé !
$imapConnexion['src'] = 'auto';
return $imapConnexion;
break;
}
// %u
$imapConnexion = imapTestCon($session_id, $domain, $server, 143, $user, $password, 1, 0, false);
if($imapConnexion['result'] == true) {
// Connexion trouvé !
$imapConnexion['src'] = 'auto';
return $imapConnexion;
break;
}
// %e auth
$imapConnexion = imapTestCon($session_id, $domain, $server, 143, $user.'@'.$domain, $password, 1, 1, false);
if($imapConnexion['result'] == true) {
// Connexion trouvé !
$imapConnexion['src'] = 'auto';
return $imapConnexion;
break;
}
// %u auth
$imapConnexion = imapTestCon($session_id, $domain, $server, 143, $user, $password, 1, 1, false);
if($imapConnexion['result'] == true) {
// Connexion trouvé !
$imapConnexion['src'] = 'auto';
return $imapConnexion;
break;
}
// %e no tls
$imapConnexion = imapTestCon($session_id, $domain, $server, 143, $user.'@'.$domain, $password, 0, 0, false);
if($imapConnexion['result'] == true) {
// Connexion trouvé !
$imapConnexion['src'] = 'auto';
return $imapConnexion;
break;
}
// %u no tls
$imapConnexion = imapTestCon($session_id, $domain, $server, 143, $user, $password, 0, 0, false);
if($imapConnexion['result'] == true) {
// Connexion trouvé !
$imapConnexion['src'] = 'auto';
return $imapConnexion;
break;
}
}
}
}
$imapConnexion['result'] = false;
return $imapConnexion;
}
function jsonMessage($mod, $idClean, $parser, $header, $messageEML, $folder, $format) {
// Enregistrement du json
$arrayTmp['filename']=$idClean;
$arrayTmp['message_id']='';
if (isset($header->message_id)) {
$arrayTmp['message_id']=$header->message_id;
}
$arrayTmp['date']='';
if (isset($header->date)) {
$arrayTmp['date']=$header->date;
}
$arrayTmp['udate']='';
if (isset($header->udate)) {
$arrayTmp['udate']=$header->udate;
}
$arrayTmp['senderaddress']='';
if (isset($header->senderaddress)) {
$arrayTmp['senderaddress']=imap_utf8($header->senderaddress);
}
$arrayTmp['fromaddress']='';
if (isset($header->fromaddress)) {
$arrayTmp['fromaddress']=imap_utf8($header->fromaddress);
}
$arrayTmp['toaddress']='';
if (isset($header->toaddress)) {
$arrayTmp['toaddress']=imap_utf8($header->toaddress);
}
$arrayTmp['ccaddress']='';
if (isset($header->ccaddress)) {
$arrayTmp['ccaddress']=imap_utf8($header->ccaddress);
}
$arrayTmp['bccaddress']='';
if (isset($header->bccaddress)) {
$arrayTmp['bccaddress']=imap_utf8($header->bccaddress);
}
$arrayTmp['reply_toaddress']='';
if (isset($header->reply_toaddress)) {
$arrayTmp['reply_toaddress']=imap_utf8($header->reply_toaddress);
}
$arrayTmp['return_pathaddress']='';
if (isset($header->return_pathaddress)) {
$arrayTmp['return_pathaddress']=imap_utf8($header->return_pathaddress);
}
$arrayTmp['references']='';
if (isset($header->references)) {
$arrayTmp['references']=$header->references;
}
$arrayTmp['in_reply_to']='';
if (isset($header->in_reply_to)) {
$arrayTmp['in_reply_to']=imap_utf8($header->in_reply_to);
}
$arrayTmp['msgno']='';
if (isset($header->Msgno)) {
$arrayTmp['msgno']=$header->Msgno;
}
$arrayTmp['subject']='';
if (isset($header->subject)) {
$arrayTmp['subject']=imap_utf8($header->subject);
}
$arrayTmp['size']='';
if (isset($header->Size)) {
$arrayTmp['size']=$header->Size;
}
// Suivi
if ($header->Flagged == 'F') {
$arrayTmp['flagged']=true;
} else {
$arrayTmp['flagged']=false;
}
// Répondu
if ($header->Answered == 'A') {
$arrayTmp['answered']=true;
} else {
$arrayTmp['answered']=false;
}
$arrayTmp['imap_folder'] = folderCleanName($folder);
// Gestion des pièces jointes :
$attachments = $parser->getAttachments();
if (count($attachments) != 0) {
$arrayTmp['attachments']=true;
// Le format eml contient les PJ
if ($format != 'eml') {
foreach ($attachments as $attachment) {
$arrayTmp['attachmentsFilename'][]=$attachment->getFilename();
}
}
}else{
$arrayTmp['attachments']=false;
$arrayTmp['attachmentsFilename']=array();
}
if ($format == 'html') {
// Recherche des formats supportés :
$text = $parser->getMessageBody('text');
if ($text) {
$arrayTmp['formatText']=true;
}
$html = $parser->getMessageBody('html');
$htmlEmbedded = $parser->getMessageBody('htmlEmbedded');
if ($htmlEmbedded) {
$arrayTmp['formatHtml']=true;
} else if ($html) {
$arrayTmp['formatHtml']=true;
}
} else {
$arrayTmp['formatEml']=true;
}
return $arrayTmp;
unset($subject);
unset($arrayTmp);
}
function saveMessage($session_id, $idClean, $parser, $header, $messageEML, $folder, $format, $mod) {
global $config;
toLog(5, "idClean : ".$idClean);
// Le nom du dossier :
$folder=folderCleanName($folder);
// Gestion des pièces jointes :
$attachments = $parser->getAttachments();
if ($format != 'eml' && count($attachments) != 0) {
toLog(5, "Gestion des ". count($attachments) ." pièce(s) jointe(s)");
mkdir($config['dir']['absolut'].'/'.$config['dir'][$mod].'/'.$session_id.'/'.$folder.'/'.$idClean);
//var_dump($attachments);
foreach ($attachments as $attachment) {
$attachment->save($config['dir']['absolut'].'/'.$config['dir'][$mod].'/'.$session_id.'/'.$folder.'/'.$idClean);
$arrayTmp['attachmentsFilename'][]=$attachment->getFilename();
}
}
// Export du message :
if ($format == 'html') {
// toLog(5, "Export en HTML");
// Préparation des entêtes
$headerTxt='';
$headerHtml='';
if (isset($header->date)) {
$headerTxt.='Date : '.$header->date.'
';
$headerHtml.='<p class="header">Date : '.$header->date.'</p>';
}
if (isset($header->senderaddress)) {
$headerTxt.='Sender : '.imap_utf8($header->senderaddress).'
';
$headerHtml.='<p class="header">Sender : '.imap_utf8($header->senderaddress).'</p>';
}
if (isset($header->fromaddress)) {
$headerTxt.='From : '.imap_utf8($header->fromaddress).'
';
$headerHtml.='<p class="header">From : '.imap_utf8($header->fromaddress).'</p>';
}
if (isset($header->toaddress)) {
$headerTxt.='To : '.imap_utf8($header->toaddress).'
';
$headerHtml.='<p class="header">To : '.imap_utf8($header->toaddress).'</p>';
}
if (isset($header->ccaddress)) {
$headerTxt.='Cc : '.imap_utf8($header->ccaddress).'
';
$headerHtml.='<p class="header">Cc : '.imap_utf8($header->ccaddress).'</p>';
}
if (isset($header->subject)) {
$headerTxt.='Subject : '.imap_utf8($header->subject).'
';
$headerHtml.='<p class="header">Subject : '.imap_utf8($header->subject).'</p>';
}
if (count($attachments) != 0) {
$headerTxt.='Attachments :';
$headerHtml.='<p class="header">Attachments :';
foreach ($arrayTmp['attachmentsFilename'] as $attachementFilename) {
$headerTxt.=' "'.$attachementFilename.'"';
$headerHtml.=' "'.$attachementFilename.'"';
}
$headerTxt.='
';
$headerHtml.='</p>';
}
$headerTxt.='----------------------
';
$headerHtml.='<hr class="header">';
// Recherche des formats supportés :
$text = $parser->getMessageBody('text');
if ($text) {
file_put_contents($config['dir']['absolut'].'/'.$config['dir'][$mod].'/'.$session_id.'/'.$folder.'/'.$idClean.'.txt', $headerTxt.$text);
}
$html = $parser->getMessageBody('html');
$htmlEmbedded = $parser->getMessageBody('htmlEmbedded');
if ($htmlEmbedded) {
file_put_contents($config['dir']['absolut'].'/'.$config['dir'][$mod].'/'.$session_id.'/'.$folder.'/'.$idClean.'.html', $headerHtml.$htmlEmbedded);
} else if ($html) {
file_put_contents($config['dir']['absolut'].'/'.$config['dir'][$mod].'/'.$session_id.'/'.$folder.'/'.$idClean.'.html', $headerHtml.$html);
}
} else {
// toLog(5, "Export en EML");
file_put_contents($config['dir']['absolut'].'/'.$config['dir'][$mod].'/'.$session_id.'/'.$folder.'/'.$idClean.'.eml', $messageEML);
}
unset($arrayTmp);
}
function imapGetData($mod, $session_id, $server, $port, $user, $password, $secure, $auth, $cert, $imapfolder, $dateSince, $dateBefore, $what, $format) {
global $config;
$parser = new PhpMimeMailParser\Parser();
if (is_dir($config['dir']['absolut'].'/'.$config['dir'][$mod].'/'.$session_id)) {
toLog(5, "Ménage du répertoire ".$config['dir']['absolut'].'/'.$config['dir'][$mod].'/'.$session_id);
rrmdir($config['dir']['absolut'].'/'.$config['dir'][$mod].'/'.$session_id);
}
$return['result'] = true;
// Get folder information
toLog(5, "ImapCon : $server, $port, $user, $secure, $auth, $cert");
$mailbox = imapCon($server, $port, $user, $password, $secure, $auth, $cert) ;
$mails = FALSE;
if (FALSE === $mailbox) {
$return['result'] = false;
$return['resultMsg'] = 'Connexion error';
toLog(2, "Connexion error");
} else {
if ($mod != 'preview') {
toLog(5, "Création du répertoire ".$config['dir']['absolut'].'/'.$config['dir'][$mod].'/'.$session_id);
mkdir($config['dir']['absolut'].'/'.$config['dir'][$mod].'/'.$session_id);
}
//$dataFolderJson = array();
$dataJson = array();
$totalSize=0;
$totalNb=0;
// Liste les fichier
foreach($imapfolder as $folder) {
// Connexion sur le dossier
toLog(5, "Connexion sur le dossier ".$folder);
toLog(5, "Connexion sur le dossier ".folderCleanName($folder));
$serverImapOpenString = serverImapOpenString($server, $port, $secure, $auth, $cert, $folder, $format);
sleep(2);
imap_reopen($mailbox, $serverImapOpenString, null, 0);
$info = imap_check($mailbox);
// Vérification de l'existance du dossier
if (FALSE !== $info) {
if ($mod != 'preview') {
mkdir($config['dir']['absolut'].'/'.$config['dir'][$mod].'/'.$session_id.'/'.folderCleanName($folder));
}
// Avant
$dateBeforeForImap = date ( "d-M-Y", $dateBefore);
// Après
$dateSinceForImap = date ( "d-M-Y", $dateSince);
toLog(5, "IMAP SEARCH SINCE ".$dateSinceForImap." BEFORE ".$dateBeforeForImap);
$mails = imap_search($mailbox,'SINCE "'.$dateSinceForImap.'" BEFORE "'.$dateBeforeForImap.'"');
//~ $mails = imap_search($mailbox,'SINCE "03-Janv-2019" BEFORE "03-Janv-2020"');
$folderSize=0;
$nbEmail=0;
$nbEmailTotal=count($mails);
foreach($mails as $mail){
//toLog(5, "Message : ".$mail."/".$nbEmailTotal);
// On compte les messages et leur taille
$header = imap_headerinfo($mailbox,$mail);
$folderSize=$folderSize+$header->Size;
$nbEmail++;
if ($mod != 'preview') {
// EML format message :
$messageEML = imap_fetchbody($mailbox,$mail, '');
// Evite bug "You must not call MimeMailParser::setText with an empty string parameter..." du parser juste après
if ($messageEML != '') {
// Parse email
$parser->setText($messageEML);
// archive
//createArchive($session_id,$mailbox,$mail);
// export
if ($header->Deleted != 'D') {
//~ if ($mod != 'preview') {
//~ array_push($dataJson, jsonMessage($mod, $parser, $header, $messageEML, $folder, $format));
//~ } else {
// Bug des messages sans id, on en génère un
if (empty($header->message_id)) {
$idClean=rand(1000, mt_getrandmax()).rand(1000, mt_getrandmax()).rand(1000, mt_getrandmax());
} else {
$idClean=cleanTxt(substr(substr($header->message_id, 0, -1), 1));
}
array_push($dataJson, jsonMessage($mod, $idClean, $parser, $header, $messageEML, $folder, $format));
saveMessage($session_id, $idClean, $parser, $header, $messageEML, $folder, $format, $mod);
}
} else {
var_dump($messageEML);
var_dump($header);
toLog(1, "Un message ignoré (".$session_id.")");
$return['result'] = false;
$return['resultMsg'] = '(probablement) Perte de connexion IMAP';
}
}
}
//$dataFolderJson['imap_folder'][]=$folder;
$return['folder'][$folder]['size']=$folderSize;
$totalSize = $totalSize + $folderSize;
$return['folder'][$folder]['nb']=$nbEmail;
$totalNb = $totalNb + $nbEmail;
} else {
toLog(5, "Folder unread : ".$folder);
$return['result'] = false;
$return['resultMsg'] = 'Folder unread '.$folder;
}
if ($mod != 'preview') {
toLog(4, "Enregistrement json/js messages");
if (count($dataJson) > 0) {
file_put_contents($config['dir']['absolut'].'/'.$config['dir'][$mod].'/'.$session_id.'/messages.json', json_encode($dataJson, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_INVALID_UTF8_IGNORE));
file_put_contents($config['dir']['absolut'].'/'.$config['dir'][$mod].'/'.$session_id.'/messages.js', 'var messages_json = '.json_encode($dataJson, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_INVALID_UTF8_IGNORE).';');
if (json_last_error() != 0) {
toLog(1, "Erreur dans le json : ".json_last_error());
}
}
}
}
$return['totalSize']=$totalSize;
$return['totalNb']=$totalNb;
imap_close($mailbox);
}
return $return;
}
function imapDeleteData($session_id, $server, $port, $user, $password, $secure, $auth, $cert, $imapfolder, $dateSince, $dateBefore) {
global $config;
$return['result'] = true;
// Get folder information
toLog(5, "ImapCon : $server, $port, $user, $secure, $auth, $cert");
$mailbox = imapCon($server, $port, $user, $password, $secure, $auth, $cert) ;
$mails = FALSE;
if (FALSE === $mailbox) {
$return['result'] = false;
$return['resultMsg'] = 'Connexion error';
toLog(2, "Connexion error");
} else {
// Liste les fichier
foreach($imapfolder as $folder) {
// Connexion sur le dossier
toLog(5, "Connexion sur le dossier ".$folder);
$serverImapOpenString = serverImapOpenString($server, $port, $secure, $auth, $cert, $folder);
imap_reopen($mailbox, $serverImapOpenString, null, 0);
$info = imap_check($mailbox);
// Vérification de l'existance du dossier
if (FALSE !== $info) {
// Avant
$dateBeforeForImap = date ( "d-M-Y", $dateBefore);
// Après
$dateSinceForImap = date ( "d-M-Y", $dateSince);
toLog(5, "IMAP SEARCH SINCE ".$dateSinceForImap." BEFORE ".$dateBeforeForImap);
$mails = imap_search($mailbox,'SINCE "'.$dateSinceForImap.'" BEFORE "'.$dateBeforeForImap.'"');
foreach($mails as $mail){
imap_delete($mailbox,$mail);
}
} else {
toLog(5, "Folder unread : ".$folder);
$return['result'] = false;
$return['resultMsg'] = 'Folder unread '.$folder;
}
}
imap_expunge($mailbox);
imap_close($mailbox, CL_EXPUNGE);
}
return $return;
}
function rrmdir($dir) {
if (is_dir($dir)) {
$objects = scandir($dir);
foreach ($objects as $object) {
if ($object != "." && $object != "..") {
if (is_dir($dir."/".$object) && !is_link($dir."/".$object))
rrmdir($dir."/".$object);
else
unlink($dir."/".$object);
}
}
rmdir($dir);
}
}
function convertOctect2humain($value) {
if ($value > 1000000000) {
$return=round($value/1024/1024/1024, 1).'Go';
}elseif ($value > 1000000) {
$return=round($value/1024/1024, 1).'Mo';
}elseif ($value > 1000) {
$return=round($value/1024, 1).'Ko';
} else {
$return=$value;
}
return $return;
}
function toLog($niveau, $msg) {
global $config;
if ($config['log']['level'] >= $niveau) {
if (is_file($config['log']['path']) && filesize($config['log']['path']) > 10000000) {
unlink($config['log']['path']);
}
$message = date ( "M j H:i:s" ) . " : " . trim ( $msg ) . "\n";
file_put_contents($config['log']['path'], $message, FILE_APPEND);
}
}
// This works in Windows.
// https://jsnelders.com/Blog/1670/php-recursively-zip-a-folder-directory-structure/
// Source and inspiration: https://gist.github.com/MarvinMenzerath/4185113/72db1670454bd707b9d761a9d5e83c54da2052ac - Marvin Menzerath. (http://menzerath.eu)
// Additional source and inspiration: https://stackoverflow.com/questions/1334613/how-to-recursively-zip-a-directory-in-php
function Zip($source, $destination) {
if (!extension_loaded('zip')) {
toLog(1, "Zip extension not loaded");
return false;
}
if (!file_exists($source)) {
toLog(1, "Source not found:" . $source);
return false;
}
$zip = new ZipArchive();
if (!$zip->open($destination, ZIPARCHIVE::CREATE)) {
toLog(1, "Zip not created or opened");
return false;
}
$raw_source = $source;
$source = str_replace('\\', '/', realpath($source));
toLog(5, "Raw source: " . $raw_source);
toLog(5, "Clean source: " . $source);
if (is_dir($source) === true) {
$files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST);
$sourceWithSeparator = $source . DIRECTORY_SEPARATOR;
foreach ($files as $file) {
$file = str_replace('\\', '/', $file);
// Ignore "." and ".." folders
if( in_array(substr($file, strrpos($file, '/')+1), array('.', '..')) )
continue;
$file = realpath($file);
if (is_dir($file) === true) {
$dir_path = str_replace($sourceWithSeparator, '', $file . DIRECTORY_SEPARATOR);
toLog(5, "Directory: " . $file . " (Path: " . $dir_path . ")\n");
//$zip->addEmptyDir(str_replace($source . '/', '', $file . '/'));
$zip->addEmptyDir($dir_path);
} else if (is_file($file) === true) {
$zip_relative_path = str_replace($sourceWithSeparator, '', $file);
$zip_relative_path = remove_from_start($zip_relative_path, $raw_source);
toLog(5, "File: " . $file . " (Path: " . $zip_relative_path . ")");
//$zip->addFromString(str_replace($source . '/', '', $file), file_get_contents($file));
//$zip->addFile($file, str_replace($source . '/', '', $file));
$zip->addFile($file, $zip_relative_path);
}
}
} else if (is_file($source) === true) {
$zip->addFromString(basename($source), file_get_contents($source));
}
return $zip->close();
}
function remove_from_start($full_string, $prefix) {
if (substr($full_string, 0, strlen($prefix)) == $prefix) {
$full_string = substr($full_string, strlen($prefix));
}
return $full_string;
}
function string2url($chaine) {
$chaine = trim($chaine);
$chaine = strtr($chaine,
"ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ",
"aaaaaaaaaaaaooooooooooooeeeeeeeecciiiiiiiiuuuuuuuuynn");
$chaine = strtr($chaine,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz");
$chaine = preg_replace('#([^.a-z0-9]+)#i', '-', $chaine);
$chaine = preg_replace('#-{2,}#','-',$chaine);
$chaine = preg_replace('#-$#','',$chaine);
$chaine = preg_replace('#^-#','',$chaine);
return $chaine;
}
function status2humain($status) {
switch($status) {
case 0:
return _('Error');
break;
case 1:
return _('Waiting for approval');
break;
case 2:
return _('Waiting');
break;
case 3:
return _('In progress');
break;
case 5:
return _('Finished');
break;
default:
return _('Unknown');
}
}
function spoolerWait() {
global $db;
try {
$spooler = $db->prepare("SELECT count(status) nb_wait
FROM `spooler`
WHERE status = 2");
$spooler->execute();
} catch ( PDOException $e ) {
toLog(1, "SELECT spoolerWait, error : ".$e->getMessage(), 0);
}
$spoolerFetch = $spooler->fetch();
return $spoolerFetch['nb_wait'];
}
function spoolerWaitBefore($session_id) {
global $db;
try {
$spooler = $db->prepare("SELECT count(status) nb_wait
FROM spooler
WHERE date < ( SELECT date FROM spooler WHERE session_id = :session_id )
AND status = 2 OR status = 3
ORDER BY `spooler`.`date` ASC");
$spooler->bindParam('session_id', $session_id, PDO::PARAM_INT);
$spooler->execute();
} catch ( PDOException $e ) {
toLog(1, "SELECT spoolerWaitBefore, error : ".$e->getMessage(), 0);
}
$spoolerFetch = $spooler->fetch();
return $spoolerFetch['nb_wait'];
}
function mailSend($to, $subject, $body) {
toLog(5, 'mailSend to : '.$to);
global $config;
$mail = new PHPMailer(true);
try {
// Préparation
$mail->isSMTP();
$mail->Host = $config['mailer']['host'];
$mail->SMTPAuth = $config['mailer']['auth'];
$mail->Username = $config['mailer']['username'];
$mail->Password = $config['mailer']['password'];
if (isset($config['mailer']['secure'])) { $mail->SMTPSecure = $config['mailer']['secure']; }
$mail->Port = $config['mailer']['port'];
if ($config['mailer']['certverify'] == false) { $mail->SMTPOptions = array( 'ssl' => array( 'verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true ) ); }
$mail->setFrom($config['mailer']['from'], $config['mailer']['from']);
if (isset($config['mailer']['replyto'])) { $mail->addReplyTo($config['mailer']['replyto']); }
if (isset($config['mailer']['bcc'])) { $mail->AddBCC($config['mailer']['bcc']); }
if ($config['maintenance']['active'] == true) {
$mail->addAddress($config['maintenance']['emailForTest']);
} else {
$mail->addAddress($to);
}
// Contenu
$mail->CharSet = 'UTF-8';
$mail->isHTML(true);
$mail->Subject = $config['mailer']['subjectprefix'].' '.$subject;
$mail->Body = $body.'<br /><br />
'.$config['mailer']['msgsignature'];
$mail->AltBody = strip_tags($body.'<br /><br />
'.$config['mailer']['msgsignature']);
$mail->send();
return true;
} catch (Exception $e) {
return $mail->ErrorInfo;
}
}
function username2email($username, $domain) {
if (preg_match('/@/', myDecrypt($username))) {
$email = myDecrypt($username);
} else {
$email = myDecrypt($username).'@'.$domain;
}
return $email;
}
// Copy dir https://stackoverflow.com/questions/2050859/copy-entire-contents-of-a-directory-to-another-using-php
function recurse_copy($src,$dst) {
$dir = opendir($src);
mkdir($dst);
while(false !== ( $file = readdir($dir)) ) {
if (( $file != '.' ) && ( $file != '..' )) {
if ( is_dir($src . '/' . $file) ) {
recurse_copy($src . '/' . $file,$dst . '/' . $file);
}
else {
copy($src . '/' . $file,$dst . '/' . $file);
}
}
}
closedir($dir);
}
function lang2locale($langue) {
global $langueEtLocalDispo;
if ($langueEtLocalDispo[$langue] != '') {
return $langueEtLocalDispo[$langue];
} else {
// par défaut
return 'en_US';
}
}
function locale2lang($localeRecherche) {
global $langueEtLocalDispo;
foreach($langueEtLocalDispo as $code=>$locale) {
if ($locale == $localeRecherche) {
return $code;
break;
}
}
// par défaut
return 'en';
}
?>