Files
2019-11-17 19:14:07 +01:00

786 lines
28 KiB
PHP
Raw Permalink 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.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
/**
* TNT OFFICIAL MODULE FOR PRESTASHOP.
*
* @author GFI Informatique <www.gfi.world>
* @copyright 2016-2019 GFI Informatique, 2016-2019 TNT
* @license https://opensource.org/licenses/MIT MIT License
*/
require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_ClassLoader.php';
class TNTOfficiel_Tools
{
/**
* Prevent Construct.
*/
final private function __construct()
{
trigger_error(sprintf('%s() %s is static.', __FUNCTION__, get_class($this)), E_USER_ERROR);
}
/**
* Get Bootstrap HTML alert.
*
* @param type $arrArgAlert
*
* @return string
*/
public static function getAlertHTML($arrArgAlert)
{
TNTOfficiel_Logstack::log();
// Define message sort.
$arrAlertHTML = array(
'info' => null,
'warning' => null,
'success' => null,
'error' => null
);
foreach ($arrArgAlert as $strAlertType => $arrAlertMsg) {
if (count($arrAlertMsg) > 0) {
foreach ($arrAlertMsg as $k => $a) {
if (is_array($a)) {
$arrAlertMsg[$k] = $k.": ".implode("\n ", $a);
}
}
$arrAlertMsg = array_map('htmlentities', $arrAlertMsg);
if ($strAlertType == 'info') {
$arrAlertHTML[$strAlertType] = '<div class="alert alert-info">'
.(count($arrAlertMsg) === 1 ?
array_shift($arrAlertMsg) : ('<ul><li>'.implode('</li><li>', $arrAlertMsg).'</li></ul>'))
.'</div>';
} elseif ($strAlertType == 'warning') {
$arrAlertHTML[$strAlertType] = '<div class="alert alert-warning">'
.(count($arrAlertMsg) === 1 ?
array_shift($arrAlertMsg) : ('<ul><li>'.implode('</li><li>', $arrAlertMsg).'</li></ul>'))
.'</div>';
} elseif ($strAlertType == 'success') {
$arrAlertHTML[$strAlertType] = '<div class="alert alert-success">'
.(count($arrAlertMsg) === 1 ?
array_shift($arrAlertMsg) : ('<ul><li>'.implode('</li><li>', $arrAlertMsg).'</li></ul>'))
.'</div>';
} elseif ($strAlertType == 'error') {
$arrAlertHTML[$strAlertType] = '<div class="alert alert-danger">'
.(count($arrAlertMsg) === 1 ?
array_shift($arrAlertMsg) : ('<ul><li>'.implode('</li><li>', $arrAlertMsg).'</li></ul>'))
.'</div>';
}
}
if (array_key_exists($strAlertType, $arrAlertHTML) && !$arrAlertHTML[$strAlertType]) {
unset($arrAlertHTML[$strAlertType]);
}
}
return $arrAlertHTML;
}
/**
* Validate a Fixed Phone (FR,MC only).
*
* @param string $strArgISOCode The ISO Country Code.
* @param string $strArgPhoneFixed The Fixed Phone Number.
*
* @return bool|string The Formated Fixed Phone String if valid, else false.
*/
public static function validateFixedPhone($strArgISOCode, $strArgPhoneFixed)
{
TNTOfficiel_Logstack::log();
if (!is_string($strArgISOCode)) {
return false;
}
if (!is_string($strArgPhoneFixed)) {
return false;
}
// Format par pays.
$arrPhoneFormatCountry = array(
'FR' => array(
'strCoutryCode' => '33',
'strTrunkp' => '0',
'strFixed' => '([1234589])([0-9]{8})'
),
'MC' => array(
'strCoutryCode' => '377',
'strTrunkp' => '',
'strFixed' => '([89])([0-9]{7})'
)
);
$strISOCode = Tools::strtoupper($strArgISOCode);
if (!array_key_exists($strISOCode, $arrPhoneFormatCountry)) {
return false;
}
// Check allowed character.
if (!Validate::isPhoneNumber($strArgPhoneFixed)) {
return false;
}
// Get Country Data.
$arrPhoneFormat = $arrPhoneFormatCountry[ $strISOCode ];
// Cleaning Phone Input.
$strPhoneFixedClean = preg_replace('/[^+0-9()]/ui', '', $strArgPhoneFixed);
// Root.
$strRoot = '(?:(?:(?:\+|00)'.$arrPhoneFormat['strCoutryCode']
.'(?:\('.$arrPhoneFormat['strTrunkp'].'\))?)|'.$arrPhoneFormat['strTrunkp'].')';
if (preg_match('/^'.$strRoot.'('.$arrPhoneFormat['strFixed'].')$/ui', $strPhoneFixedClean, $matches)) {
$strPhoneFixedID = $arrPhoneFormat['strTrunkp'].$matches[1];
$strPhoneFixedIDLength = Tools::strlen($strPhoneFixedID);
if ($strPhoneFixedIDLength < 1 || $strPhoneFixedIDLength > 63) {
return false;
}
return $strPhoneFixedID;
}
return false;
}
/**
* Validate a Mobile Phone (FR,MC only).
*
* @param string $strArgISOCode The ISO Country Code.
* @param string $strArgPhoneMobile The Mobile Phone Number.
*
* @return bool|string The Formated Mobile Phone String if valid, else false.
*/
public static function validateMobilePhone($strArgISOCode, $strArgPhoneMobile)
{
TNTOfficiel_Logstack::log();
if (!is_string($strArgISOCode)) {
return false;
}
if (!is_string($strArgPhoneMobile)) {
return false;
}
// Format apr pays.
$arrPhoneFormatCountry = array(
'FR' => array(
'strCoutryCode' => '33',
'strTrunkp' => '0',
'strMobile' => '([67])([0-9]{8})'
),
'MC' => array(
'strCoutryCode' => '377',
'strTrunkp' => '',
'strMobile' => '(?:([34])([0-9]{7})|([6])([0-9]{8}))'
)
);
$strISOCode = Tools::strtoupper($strArgISOCode);
if (!array_key_exists($strISOCode, $arrPhoneFormatCountry)) {
return false;
}
// Check allowed character.
if (!Validate::isPhoneNumber($strArgPhoneMobile)) {
return false;
}
// Get Country Data.
$arrPhoneFormat = $arrPhoneFormatCountry[ $strISOCode ];
// Cleaning Phone Input.
$strPhoneMobileClean = preg_replace('/[^+0-9()]/ui', '', $strArgPhoneMobile);
// Root.
$strRoot = '(?:(?:(?:\+|00)'.$arrPhoneFormat['strCoutryCode']
.'(?:\('.$arrPhoneFormat['strTrunkp'].'\))?)|'.$arrPhoneFormat['strTrunkp'].')';
if (preg_match('/^'.$strRoot.'('.$arrPhoneFormat['strMobile'].')$/ui', $strPhoneMobileClean, $matches)) {
$strPhoneMobileID = $arrPhoneFormat['strTrunkp'].$matches[1];
$strPhoneMobileIDLength = Tools::strlen($strPhoneMobileID);
if ($strPhoneMobileIDLength < 1 || $strPhoneMobileIDLength > 63) {
return false;
}
return $strPhoneMobileID;
}
return false;
}
/**
* Create a new directory with default index.php file.
* Don't do log here.
*
* @param array $arrArgDirectoryList an array of directories.
*
* @return bool
*/
public static function makeDirectory($arrArgDirectoryList, $strRoot = '')
{
$strIndexFileContent = <<<PHP
<?php
/**
* TNT OFFICIAL MODULE FOR PRESTASHOP.
*
* @author GFI Informatique <www.gfi.world>
* @copyright 2016-2019 GFI Informatique, 2016-2019 TNT
* @license https://opensource.org/licenses/MIT MIT License
*/
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
header("Location: ../");
exit;
PHP;
$arrDirectoryList = (array)$arrArgDirectoryList;
foreach ($arrDirectoryList as $strDirectory) {
// If directory do not exist, create it.
$boolSuccess = true;
if (!is_string($strDirectory)) {
continue;
}
// If directory do not exist, create it.
if (!is_dir($strRoot.$strDirectory)) {
$intUMask = umask(0);
$boolSuccess = mkdir($strRoot.$strDirectory, 0770, true) && $boolSuccess;
umask($intUMask);
if (!$boolSuccess) {
return false;
}
}
$strFileName = $strRoot.$strDirectory.'index.php';
// If index file does not exist, create it.
if (!file_exists($strFileName)) {
touch($strFileName);
chmod($strFileName, 0660);
$rscFile = fopen($strFileName, 'w');
if ($rscFile === false) {
return false;
}
fwrite($rscFile, $strIndexFileContent);
fclose($rscFile);
}
}
return true;
}
/**
* Remove a list of files or directories.
*
* @param $strModuleDirSrc
* @param array $arrRemoveFileList
* @param array $arrRemoveDirList
*
* @return bool
*/
public static function removeFiles($strModuleDirSrc, $arrRemoveFileList = array(), $arrRemoveDirList = array())
{
foreach ($arrRemoveFileList as $strFile) {
$strFQFile = $strModuleDirSrc.$strFile;
try {
// Delete file if exist.
if (file_exists($strFQFile)) {
Tools::deleteFile($strFQFile);
}
} catch (Exception $objException) {
TNTOfficiel_Logger::logException($objException);
return false;
}
}
foreach ($arrRemoveDirList as $strDir) {
$strFQDir = $strModuleDirSrc.$strDir;
try {
// Delete dir if exist.
if (file_exists($strFQDir)) {
Tools::deleteDirectory($strFQDir);
}
} catch (Exception $objException) {
TNTOfficiel_Logger::logException($objException);
return false;
}
}
return true;
}
/**
* Split a string un array of strings with a maximum of chars.
* @param string $strArgSubject
* @param int $intArgLength
*
* @return array
*/
public static function strSplitter($strArgSubject, $intArgLength = 32)
{
$intLength = (int)$intArgLength;
$strSubject = trim((string)$strArgSubject);
if (!($intLength > 0) || Tools::strlen($strSubject) <= $intLength) {
return array(
$strSubject
);
}
$arrResult = array();
while (Tools::strlen($strSubject) > 0) {
$rxpSplitter = '/^\s*+([^\n]{0,'.$intLength.'})(:?\s+([^\n]*?))?\s*$/ui';
if (preg_match($rxpSplitter, $strSubject, $arrBackRefList) === 1) {
// warp line.
$arrResult[] = $arrBackRefList[1];
if (array_key_exists(3, $arrBackRefList)){
$strSubject = $arrBackRefList[3];
} else {
$strSubject = '';
}
} else {
// cut word.
$arrResult[] = Tools::substr($strSubject, 0, $intLength);
$strSubject = Tools::substr($strSubject, $intLength);
}
}
return $arrResult;
}
/**
* Convert input string for compatibility with webservice.
* Input:
* a-z0-9àâäéèêëîïôöùûüñ²&"#'{}()[]|_\/ç^@°=+-£$¤%µ*<>?,.;:§!
* Â’€ê^²ç#~&まa-z0-9âéïùñ
* `²'|"/°-£¤µ*,.;:§()[]
* Output:
* a-z0-9aaaeeeeiioouuun²&"#'{}()[]|_\/c^@°=+-£$¤%µ*<>?,.;:§! A'Ee^²c#-&maa-z0-9aeiun '²'|"/°-£¤µ*,.;:§()[]
*
* @param $strArgInput
* @return mixed
*/
public static function translitASCII($strArgInput, $intLength = 0)
{
$strRegExp = <<<'SQL'
/[^a-z0-9àâäéèêëîïôöùûüñ£$¤%µ*<>?,.;:§!²&"#'|_\\\/ç^@°=+{}()[\]\-]++/ui
SQL;
$strNoControlChars = preg_replace('/[\p{Cn}]++/u', '?', $strArgInput);
// PHP 7+
$boolExistTransliterator = function_exists('transliterator_transliterate');
if ($boolExistTransliterator) {
$stASCII = transliterator_transliterate('Any-Latin; Latin-ASCII;', $strNoControlChars);
} else {
$arrRegExTranslitMap = array (
'/[ ]/u' => ' ',
'/[©]/u' => '(C)',
'/[«≪]/u' => '<<',
'/[­˗‐‑‒–—―−﹘﹣-]/u' => '-',
'/[®]/u' => '(R)',
'/[»≫]/u' => '>>',
'/[¼]/u' => ' 1/4',
'/[½]/u' => ' 1/2',
'/[¾]/u' => ' 3/4',
'/[ÀÁÂÃÄÅĀĂĄǍǞǠǺȀȂȦȺΆΑḀẠẢẤẦẨẪẬẮẰẲẴẶÅA]/u' => 'A',
'/[ÆǢǼ]/u' => 'AE',
'/[ÇĆĈĊČƇȻḈℂℭⅭC]/u' => 'C',
'/[ÈÉÊËĒĔĖĘĚƐȄȆȨɆΈΉΕΗḔḖḘḚḜẸẺẼẾỀỂỄỆℰE]/u' => 'E',
'/[ÌÍÎÏĨĪĬĮİƖƗǏȈȊɪΊΙΪḬḮỈỊℐℑⅠI]/u' => 'I',
'/[ÐĎĐƉƊƋΔḊḌḎḐḒⅅⅮD]/u' => 'D',
'/[ÑŃŅŇŊƝǸɴΝṄṆṈṊℕN]/u' => 'N',
'/[ÒÓÔÕÖØŌŎŐƠǑǪǬǾȌȎȪȬȮȰΌΏΟΩṌṎṐṒỌỎỐỒỔỖỘỚỜỞỠỢΩO]/u' => 'O',
'/[×⁎﹡*]/u' => '*',
'/[ÙÚÛÜŨŪŬŮŰŲƯǓǕǗǙǛȔȖɄṲṴṶṸṺỤỦỨỪỬỮỰU]/u' => 'U',
'/[ÝŶŸƳȲɎʏΎΥΫϒϓϔẎỲỴỶỸỾY]/u' => 'Y',
'/[ÞΘϴ]/u' => 'TH',
'/[ß]/u' => 'ss',
'/[àáâãäåāăąǎǟǡǻȁȃȧάαḁẚạảấầẩẫậắằẳẵặa]/u' => 'a',
'/[æǣǽ]/u' => 'ae',
'/[çćĉċčƈȼɕḉⅽc]/u' => 'c',
'/[èéêëēĕėęěȅȇȩɇɛέήεηϵḕḗḙḛḝẹẻẽếềểễệℯⅇe]/u' => 'e',
'/[ìíîïĩīĭįıǐȉȋɨͺΐίιϊḭḯỉịℹⅈⅰi]/u' => 'i',
'/[ðďđƌȡɖɗδḋḍḏḑḓⅆⅾd]/u' => 'd',
'/[ñńņňŋƞǹȵɲɳνṅṇṉṋn]/u' => 'n',
'/[òóôõöøōŏőơǒǫǭǿȍȏȫȭȯȱοωόώṍṏṑṓọỏốồổỗộớờởỡợℴo]/u' => 'o',
'/[÷⁄∕/]/u' => '/',
'/[ùúûüũūŭůűųưǔǖǘǚǜȕȗʉṳṵṷṹṻụủứừửữựu]/u' => 'u',
'/[ýÿŷƴȳɏΰυϋύẏẙỳỵỷỹỿy]/u' => 'y',
'/[þθϑ]/u' => 'th',
'/[ĜĞĠĢƓǤǦǴɢʛΓḠG]/u' => 'G',
'/[ĝğġģǥǧǵɠɡγḡℊg]/u' => 'g',
'/[ĤĦȞʜḢḤḦḨḪℋℍH]/u' => 'H',
'/[ĥħȟɦɧḣḥḧḩḫẖℎh]/u' => 'h',
'/[IJ]/u' => 'IJ',
'/[ij]/u' => 'ij',
'/[ĴɈJ]/u' => 'J',
'/[ĵǰȷɉɟʝϳⅉj]/u' => 'j',
'/[ĶƘǨΚḰḲḴKK]/u' => 'K',
'/[ķƙǩκϰḱḳḵk]/u' => 'k',
'/[ĸʠq]/u' => 'q',
'/[ĹĻĽĿŁȽʟΛḶḸḺḼℒⅬL]/u' => 'L',
'/[ĺļľŀłƚȴɫɬɭλḷḹḻḽℓⅼl]/u' => 'l',
'/[ʼn]/u' => '\'n',
'/[Œɶ]/u' => 'OE',
'/[œ]/u' => 'oe',
'/[ŔŖŘȐȒɌʀΡṘṚṜṞℛℜℝR]/u' => 'R',
'/[ŕŗřȑȓɍɼɽɾρϱṙṛṝṟr]/u' => 'r',
'/[ŚŜŞŠȘΣϷϹϺṠṢṤṦṨS]/u' => 'S',
'/[śŝşšſșȿʂςσϲϸϻṡṣṥṧṩẛẜẝs]/u' => 's',
'/[ŢŤŦƬƮȚȾΤṪṬṮṰT]/u' => 'T',
'/[ţťŧƫƭțȶʈτṫṭṯṱẗt]/u' => 't',
'/[ŴẀẂẄẆẈW]/u' => 'W',
'/[ŵẁẃẅẇẉẘw]/u' => 'w',
'/[ŹŻŽƵȤΖẐẒẔℤℨZ]/u' => 'Z',
'/[źżžƶȥɀʐʑζẑẓẕz]/u' => 'z',
'/[ƀƃɓβϐḃḅḇb]/u' => 'b',
'/[ƁƂɃʙΒḂḄḆℬB]/u' => 'B',
'/[ƑḞℱF]/u' => 'F',
'/[ƒḟf]/u' => 'f',
'/[ƕ]/u' => 'hv',
'/[Ƣ]/u' => 'OI',
'/[ƣ]/u' => 'oi',
'/[ƤΠṔṖℙP]/u' => 'P',
'/[ƥπϖṕṗp]/u' => 'p',
'/[ƲṼṾỼⅤV]/u' => 'V',
'/[DŽDZ]/u' => 'DZ',
'/[DžDz]/u' => 'Dz',
'/[dždzʣʥ]/u' => 'dz',
'/[LJ]/u' => 'LJ',
'/[Lj]/u' => 'Lj',
'/[lj]/u' => 'lj',
'/[NJ]/u' => 'NJ',
'/[Nj]/u' => 'Nj',
'/[nj]/u' => 'nj',
'/[Ǯ]/u' => 'Ʒ',
'/[ǯ]/u' => 'ʒ',
'/[ȸ]/u' => 'db',
'/[ȹ]/u' => 'qp',
'/[ɱμḿṁṃⅿm]/u' => 'm',
'/[ʋṽṿỽⅴv]/u' => 'v',
'/[ʦ]/u' => 'ts',
'/[ʪ]/u' => 'ls',
'/[ʫ]/u' => 'lz',
'/[ʹʻʼʽˈʹ]/u' => '\'',
'/[ʺ“”‟″"]/u' => '"',
'/[˂‹﹤<]/u' => '<',
'/[˃›﹥>]/u' => '>',
'/[˄ˆ]/u' => '^',
'/[ˋ]/u' => '`',
'/[ː﹕:]/u' => ':',
'/[˖﹢+]/u' => '+',
'/[˜]/u' => '~',
'/[̀]/u' => '̀',
'/[́]/u' => '́',
'/[̓]/u' => '̓',
'/[̈́]/u' => '̈́',
'/[;﹔;]/u' => ';',
'/[·]/u' => '·',
'/[ΜḾṀṂℳⅯM]/u' => 'M',
'/[ΞẊẌⅩX]/u' => 'X',
'/[Φ]/u' => 'PH',
'/[Χ]/u' => 'CH',
'/[Ψ]/u' => 'PS',
'/[ξẋẍℌⅹx]/u' => 'x',
'/[φϕ]/u' => 'ph',
'/[χ]/u' => 'ch',
'/[ψ]/u' => 'ps',
'/[ẞ]/u' => 'SS',
'/[Ỻ]/u' => 'LL',
'/[ỻ]/u' => 'll',
'/[‖∥]/u' => '||',
'/[‚﹐﹑,]/u' => ',',
'/[„]/u' => ',,',
'/[․﹒.]/u' => '.',
'/[‥]/u' => '..',
'/[…]/u' => '...',
'/[‼]/u' => '!!',
'/[⁅﹝[]/u' => '[',
'/[⁆﹞]]/u' => ']',
'/[⁇]/u' => '??',
'/[⁈]/u' => '?!',
'/[⁉]/u' => '!?',
'/[₠]/u' => 'CE',
'/[₢]/u' => 'Cr',
'/[₣]/u' => 'Fr.',
'/[₤]/u' => 'L.',
'/[₧]/u' => 'Pts',
'/[₹]/u' => 'Rs',
'/[₺]/u' => 'TL',
'/[℀]/u' => 'a/c',
'/[℁]/u' => 'a/s',
'/[℅]/u' => 'c/o',
'/[℆]/u' => 'c/u',
'/[№]/u' => 'No',
'/[]/u' => 'Q',
'/[℞]/u' => 'Rx',
'/[℡]/u' => 'TEL',
'/[℻]/u' => 'FAX',
'/[⅓]/u' => ' 1/3',
'/[⅔]/u' => ' 2/3',
'/[⅕]/u' => ' 1/5',
'/[⅖]/u' => ' 2/5',
'/[⅗]/u' => ' 3/5',
'/[⅘]/u' => ' 4/5',
'/[⅙]/u' => ' 1/6',
'/[⅚]/u' => ' 5/6',
'/[⅛]/u' => ' 1/8',
'/[⅜]/u' => ' 3/8',
'/[⅝]/u' => ' 5/8',
'/[⅞]/u' => ' 7/8',
'/[⅟]/u' => ' 1/',
'/[Ⅱ]/u' => 'II',
'/[Ⅲ]/u' => 'III',
'/[Ⅳ]/u' => 'IV',
'/[Ⅵ]/u' => 'VI',
'/[Ⅶ]/u' => 'VII',
'/[Ⅷ]/u' => 'VIII',
'/[Ⅸ]/u' => 'IX',
'/[Ⅺ]/u' => 'XI',
'/[Ⅻ]/u' => 'XII',
'/[ⅱ]/u' => 'ii',
'/[ⅲ]/u' => 'iii',
'/[ⅳ]/u' => 'iv',
'/[ⅵ]/u' => 'vi',
'/[ⅶ]/u' => 'vii',
'/[ⅷ]/u' => 'viii',
'/[ⅸ]/u' => 'ix',
'/[ⅺ]/u' => 'xi',
'/[ⅻ]/u' => 'xii',
'/[]/u' => '\\',
'/[]/u' => '|',
'/[﹖?]/u' => '?',
'/[﹗!]/u' => '!',
'/[﹙(]/u' => '(',
'/[﹚)]/u' => ')',
'/[﹛{]/u' => '{',
'/[﹜}]/u' => '}',
'/[﹟#]/u' => '#',
'/[﹠&]/u' => '&',
'/[﹦=]/u' => '=',
'/[﹩$]/u' => '$',
'/[﹪%]/u' => '%',
'/[﹫@]/u' => '@',
'/[]/u' => '0',
'/[]/u' => '1',
'/[]/u' => '2',
'/[]/u' => '3',
'/[]/u' => '4',
'/[]/u' => '5',
'/[]/u' => '6',
'/[]/u' => '7',
'/[]/u' => '8',
'/[]/u' => '9',
'/[_]/u' => '_',
'/[⦅]/u' => '((',
'/[⦆]/u' => '))',
);
$stASCII = preg_replace(array_keys($arrRegExTranslitMap), $arrRegExTranslitMap, $strNoControlChars);
}
$arrRegExMap = array(
'/[~]/u' => '-',
'/[`]/u' => '\'',
'/[€]/u' => 'E'
);
$stASCIICompat = preg_replace(array_keys($arrRegExMap), $arrRegExMap, $stASCII);
$stASCIIFilter = preg_replace($strRegExp, ' ', $stASCIICompat);
$stASCIIFilterTrim = trim($stASCIIFilter);
$stASCIIFilterFinal = $stASCIIFilterTrim;
if ($intLength > 0) {
$stASCIIFilterFinal = Tools::substr($stASCIIFilterTrim, 0, $intLength);
}
return $stASCIIFilterFinal;
}
/**
* @param $strArgValue
* @return string
*/
public static function encodeBase64($strArgValue)
{
return (string)base64_encode($strArgValue);
}
/**
* @param $strArgValue
* @return string
*/
public static function decodeBase64($strArgValue)
{
return (string)base64_decode($strArgValue);
}
/**
* @param $strArgInflateValue
* @return string
*/
public static function deflate($strArgInflateValue)
{
return (string)base64_encode(gzdeflate($strArgInflateValue));
}
/**
* @param $strArgDeflateValue
* @return string
*/
public static function inflate($strArgDeflateValue)
{
return (string)gzinflate(base64_decode($strArgDeflateValue));
}
/**
* Donwload an existing file or content.
*
* @param string $strFileLocation
* @param string|null $strContent
* @param string $strContentType
*
* @return bool false if error.
*/
public static function download($strFileLocation, $strContent = null, $strContentType = 'application/octet-stream')
{
// File location must be a string.
if (!is_string($strFileLocation)) {
return false;
}
// If content, must be a string.
if ($strContent !== null && !is_string($strContent)) {
return false;
}
// If no content, file must exist.
if ($strContent === null && !file_exists($strFileLocation)) {
return false;
}
// End output buffer.
if (ob_get_length() > 0) {
ob_end_clean();
}
// Set header.
ob_start();
header('Pragma: public');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Cache-Control: public');
header('Content-Description: File Transfer');
header('Content-type: '.$strContentType);
header('Content-Disposition: attachment; filename="'.basename($strFileLocation).'"');
header('Content-Transfer-Encoding: binary');
ob_end_flush();
// Output content.
if ($strContent !== null) {
echo $strContent;
} else {
readfile($strFileLocation);
}
// We want to be sure that download content is the last thing this controller will do.
exit;
}
/**
* @param $strArgURL
* @param null $arrArgOptions
*
* @return array
*
* @throws Exception
*/
public static function cURLRequest($strArgURL, $arrArgOptions = null)
{
TNTOfficiel_Logstack::log();
// Check extension.
if (!extension_loaded('curl')) {
throw new Exception(sprintf('PHP cURL extension is required'));
}
$strURL = trim($strArgURL);
$arrResult = array(
'options' => array(
// Check server certificate's name against host.
// 0: disable, 2: enable.
CURLOPT_SSL_VERIFYHOST => 0,
// Check server peer's certificate authenticity through certification authority (CA) for SSL/TLS.
CURLOPT_SSL_VERIFYPEER => true,
// Path to Certificate Authority (CA) bundle.
// https://curl.haxx.se/docs/caextract.html
// https://curl.haxx.se/ca/cacert.pem
CURLOPT_CAINFO => _PS_CACHE_CA_CERT_FILE_,
// Start a new cookie session (ignore all previous cookies session)
CURLOPT_COOKIESESSION => true,
// Follow HTTP 3xx redirects.
CURLOPT_FOLLOWLOCATION => true,
// Max redirects allowed.
CURLOPT_MAXREDIRS => 8,
// curl_exec return response string instead of true (no direct output).
CURLOPT_RETURNTRANSFER => true,
// Include response header in output.
//CURLOPT_HEADER => false,
// Include request header ?
//CURLINFO_HEADER_OUT => false,
// HTTP code >= 400 considered as error. Use curl_error (curl_exec return false ?).
//CURLOPT_FAILONERROR => true,
// Proxy.
//CURLOPT_PROXY => $strProxy
//CURLOPT_PROXYUSERPWD => 'user:password',
//CURLOPT_PROXYAUTH => 1,
//CURLOPT_PROXYPORT => 80,
//CURLOPT_PROXYTYPE => CURLPROXY_HTTP,
// Timeout for connection to the server.
CURLOPT_CONNECTTIMEOUT => TNTOfficiel::REQUEST_CONNECTTIMEOUT,
// Timeout global.
CURLOPT_TIMEOUT => TNTOfficiel::REQUEST_TIMEOUT
)
);
if (is_array($arrArgOptions)) {
$arrResult['options'] = $arrArgOptions + $arrResult['options'];
}
$rscCURLHandler = curl_init();
foreach ($arrResult['options'] as $intCURLConst => $mxdValue) {
// May warn if open_basedir or deprecated safe_mode set.
if ((ini_get('safe_mode') || ini_get('open_basedir'))
&& $intCURLConst === CURLOPT_FOLLOWLOCATION
) {
continue;
}
curl_setopt($rscCURLHandler, $intCURLConst, $mxdValue);
}
curl_setopt($rscCURLHandler, CURLOPT_URL, $strURL);
// curl_exec return false on error.
$arrResult['response'] = curl_exec($rscCURLHandler);
$arrResult['info'] = curl_getinfo($rscCURLHandler);
$arrResult['error'] = curl_error($rscCURLHandler);
curl_close($rscCURLHandler);
return $arrResult;
}
}