* @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] = '
'
.(count($arrAlertMsg) === 1 ?
array_shift($arrAlertMsg) : ('
- '.implode('
- ', $arrAlertMsg).'
'))
.'
';
} elseif ($strAlertType == 'warning') {
$arrAlertHTML[$strAlertType] = ''
.(count($arrAlertMsg) === 1 ?
array_shift($arrAlertMsg) : ('
- '.implode('
- ', $arrAlertMsg).'
'))
.'
';
} elseif ($strAlertType == 'success') {
$arrAlertHTML[$strAlertType] = ''
.(count($arrAlertMsg) === 1 ?
array_shift($arrAlertMsg) : ('
- '.implode('
- ', $arrAlertMsg).'
'))
.'
';
} elseif ($strAlertType == 'error') {
$arrAlertHTML[$strAlertType] = ''
.(count($arrAlertMsg) === 1 ?
array_shift($arrAlertMsg) : ('
- '.implode('
- ', $arrAlertMsg).'
'))
.'
';
}
}
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 = <<
* @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',
'/[ℚQ]/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' => '@',
'/[0]/u' => '0',
'/[1]/u' => '1',
'/[2]/u' => '2',
'/[3]/u' => '3',
'/[4]/u' => '4',
'/[5]/u' => '5',
'/[6]/u' => '6',
'/[7]/u' => '7',
'/[8]/u' => '8',
'/[9]/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;
}
}