%PDF- %PDF-
Direktori : /www/varak.net/mail2.varak.net_old/libraries/afterlogic/common/ |
Current File : /www/varak.net/mail2.varak.net_old/libraries/afterlogic/common/utils.php |
<?php /* * Copyright 2004-2014, AfterLogic Corp. * Licensed under AGPLv3 license or AfterLogic license * if commercial version of the product was purchased. * See the LICENSE file for a full license statement. */ /** * @package Api */ class api_Utils { /** * @var array */ static $aSuppostedCharsets = array( 'iso-8859-1', 'iso-8859-2', 'iso-8859-3', 'iso-8859-4', 'iso-8859-5', 'iso-8859-6', 'iso-8859-7', 'iso-8859-8', 'iso-8859-9', 'iso-8859-10', 'iso-8859-11', 'iso-8859-12', 'iso-8859-13', 'iso-8859-14', 'iso-8859-15', 'iso-8859-16', 'koi8-r', 'koi8-u', 'koi8-ru', 'cp1250', 'cp1251', 'cp1252', 'cp1253', 'cp1254', 'cp1257', 'cp949', 'cp1133', 'cp850', 'cp866', 'cp1255', 'cp1256', 'cp862', 'cp874', 'cp932', 'cp950', 'cp1258', 'windows-1250', 'windows-1251', 'windows-1252', 'windows-1253', 'windows-1254', 'windows-1255', 'windows-1256', 'windows-1257', 'windows-1258', 'windows-874', 'macroman', 'maccentraleurope', 'maciceland', 'maccroatian', 'macromania', 'maccyrillic', 'macukraine', 'macgreek', 'macturkish', 'macintosh', 'machebrew', 'macarabic', 'euc-jp', 'shift_jis', 'iso-2022-jp', 'iso-2022-jp-2', 'iso-2022-jp-1', 'euc-cn', 'gb2312', 'hz', 'gbk', 'gb18030', 'euc-tw', 'big5', 'big5-hkscs', 'iso-2022-cn', 'iso-2022-cn-ext', 'euc-kr', 'iso-2022-kr', 'johab', 'armscii-8', 'georgian-academy', 'georgian-ps', 'koi8-t', 'tis-620', 'macthai', 'mulelao-1', 'viscii', 'tcvn', 'hp-roman8', 'nextstep', 'utf-8', 'ucs-2', 'ucs-2be', 'ucs-2le', 'ucs-4', 'ucs-4be', 'ucs-4le', 'utf-16', 'utf-16be', 'utf-16le', 'utf-32', 'utf-32be', 'utf-32le', 'utf-7', 'c99', 'java', 'ucs-2-internal', 'ucs-4-internal'); /** * @var string */ static $sTimeZone = null; /** * @return float */ public static function Microtime() { return microtime(true); } /** * @param array $aArray * @param string $sKey * @param mixed $mDefault * @return mixed */ public static function ArrayValue($aArray, $sKey, $mDefault) { return (isset($aArray[$sKey])) ? $aArray[$sKey] : $mDefault; } /** * @param string $sValue * @return string */ public static function EncodeSpecialXmlChars($sValue) { return str_replace('>', '>', str_replace('<', '<', str_replace('&', '&', $sValue))); } /** * @param string $sValue * @return string */ public static function DecodeSpecialXmlChars($sValue) { return str_replace('&', '&', str_replace('<', '<', str_replace('>', '>', $sValue))); } /** * @param string $sValue * @return string */ public static function EncodeSimpleSpecialXmlChars($sValue) { return str_replace(']]>',']]>', $sValue); } /** * @param string $sValue * @return string */ public static function DecodeSimpleSpecialXmlChars($sValue) { return str_replace(']]>', ']]>', $sValue); } /** * @param string $sValue * @return string */ public static function ShowCRLF($sValue) { return str_replace(array("\r", "\n", "\t"), array('\r', '\n', '\t'), $sValue); } /** * @param string $sPath * @param string $sPrefix = null * @return string */ public static function GetFullPath($sPath, $sPrefix = null) { if ($sPrefix !== null && !self::IsFullPath($sPath)) { $sPath = rtrim($sPrefix, '\\/').'/'.trim($sPath, '\\/'); } if (@is_dir($sPath)) { $sPath = rtrim(str_replace('\\', '/', realpath($sPath)), '/'); } return $sPath; } /** * @param string $sPpath * @return bool */ public static function IsFullPath($sPpath) { if (strlen($sPpath) > 0) { return (($sPpath{0} == '/' || $sPpath{0} == '\\') || (strlen($sPpath) > 1 && self::IsWin() && $sPpath{1} == ':')); } return false; } /** * @return bool */ public static function IsWin() { return (defined('PHP_OS') && 'WIN' === strtoupper(substr(PHP_OS, 0, 3))); } /** * @param array $aArray * @param string $sType * @return array */ public static function SetTypeArrayValue($aArray, $sType) { $aResult = array(); foreach ($aArray as $mValue) { settype($mValue, $sType); $aResult[] = $mValue; } return $aResult; } /** * @param string $sPrefix * @return string */ public static function ClearPrefix($sPrefix) { $sNewPrefix = preg_replace('/[^a-z0-9_]/i', '_', $sPrefix); if ($sNewPrefix !== $sPrefix) { $sNewPrefix = preg_replace('/[_]+/', '_', $sNewPrefix); } return $sNewPrefix; } /** * @param string $sEncoding * @return string */ protected static function iconvNormalizeCharset($sEncoding) { $sEncoding = strtolower($sEncoding); switch ($sEncoding) { case 'ansi': case 'ansii': case 'us-ansii': $sEncoding = 'iso-8859-1'; break; case 'utf8': case 'utf-8': $sEncoding = 'utf-8'; break; case 'utf7-imap': case 'utf7imap': case 'utf-7imap': case 'utf-7-imap': $sEncoding = 'utf7-imap'; break; case 'ks-c-5601-1987': case 'ks_c_5601-1987': $sEncoding = 'euc-kr'; break; case 'x-gbk': $sEncoding = 'gb2312'; break; case 'iso-8859-i': case 'iso-8859-8-i': $sEncoding = 'iso-8859-8'; break; } return $sEncoding; } /** * @param string $sString * @param string $sFromEncoding * @param string $sToEncoding * @return string */ public static function ConvertEncoding($sString, $sFromEncoding, $sToEncoding) { $sResult = $sString; $sFromEncoding = self::iconvNormalizeCharset($sFromEncoding); $sToEncoding = self::iconvNormalizeCharset($sToEncoding); if ('' === trim($sResult) || $sFromEncoding === $sToEncoding) { return $sResult; } switch (true) { default: break; case ($sFromEncoding === 'iso-8859-1' && $sToEncoding === 'utf-8' && function_exists('utf8_encode')): $sResult = utf8_encode($sResult); break; case ($sFromEncoding === 'utf-8' && $sToEncoding === 'iso-8859-1' && function_exists('utf8_decode')); $sResult = utf8_decode($sResult); break; case ($sFromEncoding === 'utf7-imap' && $sToEncoding === 'utf-8'): $sResult = self::Utf7ModifiedToUtf8($sResult); if (false === $sResult) { $sResult = $sString; } break; case ($sFromEncoding === 'utf-8' && $sToEncoding === 'utf7-imap'): $sResult = self::Utf8ToUtf7Modified($sResult); if (false === $sResult) { $sResult = $sString; } break; case (in_array(strtolower($sFromEncoding), self::$aSuppostedCharsets)): $sResult = @iconv($sFromEncoding, $sToEncoding.'//IGNORE', $sResult); if (false === $sResult) { CApi::Log('iconv FALSE result ["'.$sFromEncoding.'", "'.$sToEncoding.'//IGNORE", "'.substr($sString, 0, 20).' / cut"]', ELogLevel::Error); $sResult = $sString; } break; } return $sResult; } /** * @param string $sValue * @return string */ public static function UrlSafeBase64Encode($sValue) { return str_replace(array('+', '/', '='), array('-', '_', '.'), base64_encode($sValue)); } /** * @param string $sValue * @return string */ public static function UrlSafeBase64Decode($sValue) { $sData = str_replace(array('-', '_', '.'), array('+', '/', '='), $sValue); $sMode = strlen($sData) % 4; if ($sMode) { $sData .= substr('====', $sMode); } return base64_decode($sData); } /** * @param string $sStr * @return bool */ public static function IsUtf7($sStr) { $iAmp = strpos($sStr, '&'); return (false !== $iAmp && false !== strpos($sStr, '-', $iAmp)); } /** * @param string $str * @return string */ public static function Utf7ModifiedToUtf8($str) { $array = array(-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62, 63,-1,-1,-1,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,-1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1); $result = ''; $error = false; $strlen = strlen($str); for ($i = 0; $strlen > 0; $i++, $strlen--) { $char = $str{$i}; if ($char == '&') { $i++; $strlen--; $char = isset($str{$i}) ? $str{$i} : null; if ($char === null) { break; } if ($strlen && $char == '-') { $result .= '&'; continue; } $ch = 0; $k = 10; for (; $strlen > 0; $i++, $strlen--) { $char = $str{$i}; $b = $array[ord($char)]; if ((ord($char) & 0x80) || $b == -1) { break; } if ($k > 0) { $ch |= $b << $k; $k -= 6; } else { $ch |= $b >> (-$k); if ($ch < 0x80) { if (0x20 <= $ch && $ch < 0x7f) { return $error; } $result .= chr($ch); } else if ($ch < 0x800) { $result .= chr(0xc0 | ($ch >> 6)); $result .= chr(0x80 | ($ch & 0x3f)); } else { $result .= chr(0xe0 | ($ch >> 12)); $result .= chr(0x80 | (($ch >> 6) & 0x3f)); $result .= chr(0x80 | ($ch & 0x3f)); } $ch = ($b << (16 + $k)) & 0xffff; $k += 10; } } if (($ch || $k < 6) || (!$strlen || $char != '-') || ($strlen > 2 && '&' === $str{$i+1} && '-' !== $str{$i+2})) { return $error; } } else if (ord($char) < 0x20 || ord($char) >= 0x7f) { return $error; } else { $result .= $char; } } return $result; } /** * @param string $str * @return string */ public static function Utf8ToUtf7Modified($str) { $array = array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9','+',','); $strlen = strlen($str); $isB = false; $i = $n = 0; $return = ''; $error = false; $ch = $b = $k = 0; while ($strlen) { $c = ord($str{$i}); if ($c < 0x80) { $ch = $c; $n = 0; } else if ($c < 0xc2) { return $error; } else if ($c < 0xe0) { $ch = $c & 0x1f; $n = 1; } else if ($c < 0xf0) { $ch = $c & 0x0f; $n = 2; } else if ($c < 0xf8) { $ch = $c & 0x07; $n = 3; } else if ($c < 0xfc) { $ch = $c & 0x03; $n = 4; } else if ($c < 0xfe) { $ch = $c & 0x01; $n = 5; } else { return $error; } $i++; $strlen--; if ($n > $strlen) { return $error; } for ($j=0; $j < $n; $j++) { $o = ord($str{$i+$j}); if (($o & 0xc0) != 0x80) { return $error; } $ch = ($ch << 6) | ($o & 0x3f); } if ($n > 1 && !($ch >> ($n * 5 + 1))) { return $error; } $i += $n; $strlen -= $n; if ($ch < 0x20 || $ch >= 0x7f) { if (!$isB) { $return .= '&'; $isB = true; $b = 0; $k = 10; } if ($ch & ~0xffff) { $ch = 0xfffe; } $return .= $array[($b | $ch >> $k)]; $k -= 6; for (; $k >= 0; $k -= 6) { $return .= $array[(($ch >> $k) & 0x3f)]; } $b = ($ch << (-$k)) & 0x3f; $k += 16; } else { if ($isB) { if ($k > 10) { $return .= $array[$b]; } $return .= '-'; $isB = false; } $return .= chr($ch); if ('&' === chr($ch)) { $return .= '-'; } } } if ($isB) { if ($k > 10) { $return .= $array[$b]; } $return .= '-'; } return $return; } /** * @param string $sPassword * @return string */ public static function EncodePassword($sPassword) { if (empty($sPassword)) { return ''; } $sPlainBytes = $sPassword; $sEncodeByte = $sPlainBytes{0}; $sResult = bin2hex($sEncodeByte); for ($iIndex = 1, $iLen = strlen($sPlainBytes); $iIndex < $iLen; $iIndex++) { $sPlainBytes{$iIndex} = ($sPlainBytes{$iIndex} ^ $sEncodeByte); $sResult .= bin2hex($sPlainBytes{$iIndex}); } return $sResult; } /** * @param string $sPassword * @return string */ public static function DecodePassword($sPassword) { $sResult = ''; $iPasswordLen = strlen($sPassword); if (0 < $iPasswordLen && strlen($sPassword) % 2 == 0) { $sDecodeByte = chr(hexdec(substr($sPassword, 0, 2))); $sPlainBytes = $sDecodeByte; $iStartIndex = 2; $iCurrentByte = 1; do { $sHexByte = substr($sPassword, $iStartIndex, 2); $sPlainBytes .= (chr(hexdec($sHexByte)) ^ $sDecodeByte); $iStartIndex += 2; $iCurrentByte++; } while ($iStartIndex < $iPasswordLen); $sResult = $sPlainBytes; } return $sResult; } /** * @param string $sEmail * @return string */ public static function GetAccountNameFromEmail($sEmail) { $sResult = ''; if (!empty($sEmail)) { $iPos = strpos($sEmail, '@'); $sResult = (false === $iPos) ? $sEmail : substr($sEmail, 0, $iPos); } return $sResult; } /** * @param string $sEmail * @return string */ public static function GetDomainFromEmail($sEmail) { $sResult = ''; if (!empty($sEmail)) { $iPos = strpos($sEmail, '@'); if (false !== $iPos) { $sResult = substr($sEmail, $iPos + 1); } } return $sResult; } /** * @param string $iSizeInBytes * @return string */ public static function GetFriendlySize($iSizeInBytes) { $iSizeInKB = ceil($iSizeInBytes / 1024); $iSizeInMB = $iSizeInKB / 1024; if ($iSizeInMB >= 100) { $iSizeInKB = ceil($iSizeInMB * 10 / 10).'MB'; } else if ($iSizeInMB > 1) { $iSizeInKB = (ceil($iSizeInMB * 10) / 10).'MB'; } else { $iSizeInKB = $iSizeInKB.'KB'; } return $iSizeInKB; } /** * @param string $iSizeInBytes * @return string */ public static function GetFriendlySizeSpec($iSizeInBytes) { $size = ceil($iSizeInBytes / 1024); $mbSize = $size / 1024; return ($mbSize > 1) ? (($mbSize >= 1024) ? (ceil(($mbSize * 10) / 1024) / 10).'GB' : (ceil($mbSize * 10) / 10).'MB') : $size.'KB'; } /** * @staticvar array $aMapping * @param int $iCodePage * @return string */ public static function GetCodePageName($iCodePage) { static $aMapping = array( 0 => 'default', 51936 => 'euc-cn', 936 => 'gb2312', 950 => 'big5', 946 => 'euc-kr', 50225 => 'iso-2022-kr', 50220 => 'iso-2022-jp', 932 => 'shift-jis', 65000 => 'utf-7', 65001 => 'utf-8', 1250 => 'windows-1250', 1251 => 'windows-1251', 1252 => 'windows-1252', 1253 => 'windows-1253', 1254 => 'windows-1254', 1255 => 'windows-1255', 1256 => 'windows-1256', 1257 => 'windows-1257', 1258 => 'windows-1258', 20866 => 'koi8-r', 28591 => 'iso-8859-1', 28592 => 'iso-8859-2', 28593 => 'iso-8859-3', 28594 => 'iso-8859-4', 28595 => 'iso-8859-5', 28596 => 'iso-8859-6', 28597 => 'iso-8859-7', 28598 => 'iso-8859-8' ); return (isset($aMapping[$iCodePage])) ? $aMapping[$iCodePage] : ''; } /** * @staticvar array $aMapping * @param string $sCodePageName * @return int */ public static function GetCodePageNumber($sCodePageName) { static $aMapping = array( 'default' => 0, 'euc-cn' => 51936, 'gb2312' => 936, 'big5' => 950, 'euc-kr' => 949, 'iso-2022-kr' => 50225, 'iso-2022-jp' => 50220, 'shift-jis' => 932, 'utf-7' => 65000, 'utf-8' => 65001, 'windows-1250' => 1250, 'windows-1251' => 1251, 'windows-1252' => 1252, 'windows-1253' => 1253, 'windows-1254' => 1254, 'windows-1255' => 1255, 'windows-1256' => 1256, 'windows-1257' => 1257, 'windows-1258' => 1258, 'koi8-r' => 20866, 'iso-8859-1' => 28591, 'iso-8859-2' => 28592, 'iso-8859-3' => 28593, 'iso-8859-4' => 28594, 'iso-8859-5' => 28595, 'iso-8859-6' => 28596, 'iso-8859-7' => 28597, 'iso-8859-8' => 28598 ); return (isset($aMapping[$sCodePageName])) ? $aMapping[$sCodePageName] : 0; } /** * @param string $sDateTime * @return array | bool */ public static function DateParse($sDateTime) { if (function_exists('date_parse')) { return date_parse($sDateTime); } $mReturn = false; $aDateTime = explode(' ', $sDateTime, 2); if (count($aDateTime) == 2) { $aDate = explode('-', trim($aDateTime[0]), 3); $aTime = explode(':', trim($aDateTime[1]), 3); if (3 === count($aDate) && 3 === count($aTime)) { $mReturn = array( 'year' => $aDate[0], 'day' => $aDate[2], 'month' => $aDate[1], 'hour' => $aTime[0], 'minute' => $aTime[1], 'second' => $aTime[2] ); } } return $mReturn; } /** * @param string $sTimeOffset * @return int */ static public function GetTimeOffsetFromHoursString($sTimeOffset) { $iResult = 0; $sTimeOffset = trim($sTimeOffset); if (0 < strlen($sTimeOffset)) { $sSign = $sTimeOffset{0}; $sTimeOffset = substr($sTimeOffset, 1); $nOffset = (is_numeric($sTimeOffset)) ? (int) $sTimeOffset : 0; $iHours = $nOffset / 100; $iMinutes = $nOffset % 100; $iMultiplier = ('-' === $sSign) ? -1 : 1; $iResult += $iMultiplier * $iHours * 60 * 60; $iResult += $iMultiplier * $iMinutes * 60; } return $iResult; } /** * @param int $iDefaultTimeZone * @param string $sClientTimeZone = '' * @return short */ public static function GetTimeOffset($iDefaultTimeZone, $sClientTimeZone = '') { if ('' !== $sClientTimeZone) { try { $oDateTimeZone = new DateTimeZone($sClientTimeZone); return $oDateTimeZone->getOffset(new DateTime('now')) / 60; } catch (Exception $oE) { CApi::Log($sClientTimeZone); CApi::LogObject($oE, ELogLevel::Warning); } } $iTimeOffset = 0; switch ($iDefaultTimeZone) { default: case 0: break; case 1: $iTimeOffset = -12 * 60; break; case 2: $iTimeOffset = -11 * 60; break; case 3: $iTimeOffset = -10 * 60; break; case 4: $iTimeOffset = -9 * 60; break; case 5: $iTimeOffset = -8*60; break; case 6: case 7: $iTimeOffset = -7 * 60; break; case 8: case 9: case 10: case 11: $iTimeOffset = -6 * 60; break; case 12: case 13: case 14: $iTimeOffset = -5 * 60; break; case 15: case 16: case 17: $iTimeOffset = -4 * 60; break; case 18: $iTimeOffset = -3.5 * 60; break; case 19: case 20: case 21: $iTimeOffset = -3 * 60; break; case 22: $iTimeOffset = -2 * 60; break; case 23: case 24: $iTimeOffset = -60; break; case 25: case 26: $iTimeOffset = 0; break; case 27: case 28: case 29: case 30: case 31: $iTimeOffset = 60; break; case 32: case 33: case 34: case 35: case 36: case 37: $iTimeOffset = 2 * 60; break; case 38: case 39: case 40: $iTimeOffset = 3 * 60; break; case 41: $iTimeOffset = 3.5 * 60; break; case 42: case 43: case 44: $iTimeOffset = 4 * 60; break; case 45: $iTimeOffset = 4.5 * 60; break; case 46: $iTimeOffset = 5 * 60; break; case 47: $iTimeOffset = 5.5 * 60; break; case 48: $iTimeOffset = 5 * 60 + 45; break; case 49: case 50: case 51: case 52: $iTimeOffset = 6 * 60; break; case 53: $iTimeOffset = 6.5 * 60; case 54: $iTimeOffset = 7 * 60; break; case 55: case 56: case 57: case 58: case 59: case 60: $iTimeOffset = 8 * 60; break; case 61: case 62: $iTimeOffset = 9 * 60; break; case 63: case 64: $iTimeOffset = 9.5 * 60; break; case 65: case 66: case 67: case 68: case 69: $iTimeOffset = 10 * 60; break; case 70: case 71: $iTimeOffset = 11 * 60; break; case 72: case 73: $iTimeOffset = 12 * 60; break; case 74: $iTimeOffset = 13 * 60; break; } return $iTimeOffset; } /** * @param int $iDefaultTimeZone * @param string $sClientTimeZone = '' * @return string */ public static function GetStrTimeZone($iDefaultTimeZone, $sClientTimeZone = '') { if ('' !== $sClientTimeZone) { return $sClientTimeZone; } if (null !== self::$sTimeZone) { return self::$sTimeZone; } $sResult = 'Etc/GMT'; $aTimeZones = array( 'Default', #0 'Pacific/Kwajalein', #1 'Pacific/Midway', #2 'US/Hawaii', #3 'US/Alaska', #4 'America/Tijuana', #5 'America/Dawson_Creek', #6 'America/Denver', #7 'America/Belize', #8 'America/Chicago', #9 'America/Cancun', #10 'America/Belize', #11 'America/Havana', #12 'America/New_York', #13 'America/Bogota', #14 'America/Santiago', #15 'America/Caracas', #16 'America/Glace_Bay', #17 'America/St_Johns', #18 'America/Godthab', #19 'America/Argentina/Buenos_Aires', #20 'America/Sao_Paulo', #21 'America/Noronha', #22 'Atlantic/Cape_Verde', #23 'Atlantic/Azores', #24 'Africa/Abidjan', #25 'Europe/Dublin', #26 'Europe/Amsterdam', #27 'Europe/Belgrade', #28 'Europe/Brussels', #29 'Europe/Sarajevo', #30 'Africa/Algiers', #31 'Europe/Minsk', #32 'Europe/Bucharest', #33 'Africa/Cairo', #34 'Africa/Blantyre', #35 'Africa/Harare', #36 'Asia/Jerusalem', #37 'Asia/Baghdad', #38 'Asia/Kuwait', #39 'Africa/Addis_Ababa', #40 'Asia/Tehran', #41 'Europe/Moscow', #42 'Asia/Dubai', #43 'Asia/Yerevan', #44 'Asia/Kabul', #45 'Asia/Tashkent', #46 'Asia/Kolkata', #47 'Asia/Katmandu', #48 'Asia/Yekaterinburg', #49 'Asia/Almaty', #50 'Asia/Dhaka', #51 'Asia/Colombo', #52 'Asia/Rangoon', #53 'Asia/Bangkok', #54 'Asia/Krasnoyarsk', #55 'Asia/Hong_Kong', #56 'Asia/Irkutsk', #57 'Asia/Kuala_Lumpur', #58 'Australia/Perth', #59 'Asia/Taipei', #60 'Asia/Tokyo', #61 'Asia/Seoul', #62 'Australia/Adelaide', #63 'Australia/Darwin', #64 'Asia/Yakutsk', #65 'Australia/Brisbane', #66 'Australia/Canberra', #67 'Pacific/Guam', #68 'Australia/Hobart', #69 'Asia/Vladivostok', #70 'Pacific/Noumea', #71 'Asia/Magadan', #72 'Asia/Anadyr', #73 'Pacific/Tongatapu' #74 ); $iDefaultTimeZone = isset($aTimeZones[$iDefaultTimeZone]) ? $iDefaultTimeZone : 0; if (0 === $iDefaultTimeZone) { $iOffset = self::GetTimeOffset($iDefaultTimeZone, $sClientTimeZone) / 60 * -1; $sSign = ($iOffset < 0) ? '-' : '+'; $sResult = 'Etc/GMT'.$sSign.abs($iOffset); } else { $sResult = $aTimeZones[$iDefaultTimeZone]; } self::$sTimeZone = $sResult; return self::$sTimeZone; } /** * @param string $sDir */ public static function RecRmdir($sDir) { if (is_dir($sDir)) { $aObjects = scandir($sDir); foreach ($aObjects as $sObject) { if ($sObject != '.' && $sObject != '..') { if (filetype($sDir.'/'.$sObject) == 'dir') { self::RecRmdir($sDir.'/'.$sObject); } else { unlink($sDir.'/'.$sObject); } } } reset($aObjects); rmdir($sDir); } } /** * @return bool */ public static function IsPhp53() { return (bool) (version_compare(phpversion(), '5.3.0') > -1); } /** * @return bool */ public static function HasGdSupport() { return (bool) @function_exists('imagecreatefrompng'); } /** * @return bool */ public static function HasSslSupport() { return (bool) @function_exists('openssl_open'); } /** * @return bool */ public static function IsMcryptSupported() { return (bool) @function_exists('mcrypt_encrypt'); } /** * @return bool */ public static function IsIconvSupported() { return (bool) @function_exists('iconv'); } /** * @return bool */ public static function IsGzipSupported() { return (bool) ((false !== strpos(isset($_SERVER['HTTP_ACCEPT_ENCODING']) ? $_SERVER['HTTP_ACCEPT_ENCODING'] : '', 'gzip')) && function_exists('gzencode')); } /** * @param string $sFileName * @return string */ public static function GetFileExtension($sFileName) { $iLast = strrpos($sFileName, '.'); $sExtension = ''; if ($iLast !== false) { $sExtension = substr($sFileName, $iLast + 1); if (strlen($sExtension) > 5) { $sExtension = ''; } } return $sExtension; } /** * @param int $sLen = 6 * @return string */ public static function GenerateShortHashString($sLen = 10) { $sResult = ''; $sChars = 'abcdefghjkmnpqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ23456789'; $iCharLen = strlen($sChars); for (; 0 < $sLen; $sLen--) { $sResult .= substr($sChars, rand(0, $iCharLen), 1); } return $sResult; } public static function GetMimeContentTypes() { return array( 'eml' => 'message/rfc822', 'mime' => 'message/rfc822', 'txt' => 'text/plain', 'text' => 'text/plain', 'def' => 'text/plain', 'list' => 'text/plain', 'in' => 'text/plain', 'ini' => 'text/plain', 'log' => 'text/plain', 'sql' => 'text/plain', 'cfg' => 'text/plain', 'conf' => 'text/plain', 'rtx' => 'text/richtext', 'vcard' => 'text/vcard', 'vcf' => 'text/vcard', 'htm' => 'text/html', 'html' => 'text/html', 'csv' => 'text/csv', 'ics' => 'text/calendar', 'ifb' => 'text/calendar', 'xml' => 'text/xml', 'json' => 'application/json', 'swf' => 'application/x-shockwave-flash', 'hlp' => 'application/winhlp', 'wgt' => 'application/widget', 'chm' => 'application/vnd.ms-htmlhelp', 'p10' => 'application/pkcs10', 'p7c' => 'application/pkcs7-mime', 'p7m' => 'application/pkcs7-mime', 'p7s' => 'application/pkcs7-signature', 'ttf' => 'application/x-ttf', 'torrent' => 'application/x-bittorrent', // scripts 'js' => 'application/javascript', 'pl' => 'text/perl', 'css' => 'text/css', 'asp' => 'text/asp', 'php' => 'application/x-httpd-php', 'php3' => 'application/x-httpd-php', 'php4' => 'application/x-httpd-php', 'php5' => 'application/x-httpd-php', 'phtml' => 'application/x-httpd-php', // images 'png' => 'image/png', 'jpg' => 'image/jpeg', 'jpeg' => 'image/jpeg', 'jpe' => 'image/jpeg', 'jfif' => 'image/jpeg', 'gif' => 'image/gif', 'bmp' => 'image/bmp', 'cgm' => 'image/cgm', 'ief' => 'image/ief', 'ico' => 'image/x-icon', 'tif' => 'image/tiff', 'tiff' => 'image/tiff', 'svg' => 'image/svg+xml', 'svgz' => 'image/svg+xml', 'djv' => 'image/vnd.djvu', 'djvu' => 'image/vnd.djvu', 'webp' => 'image/webp', // archives 'zip' => 'application/zip', '7z' => 'application/x-7z-compressed', 'rar' => 'application/x-rar-compressed', 'exe' => 'application/x-msdownload', 'dll' => 'application/x-msdownload', 'scr' => 'application/x-msdownload', 'com' => 'application/x-msdownload', 'bat' => 'application/x-msdownload', 'msi' => 'application/x-msdownload', 'cab' => 'application/vnd.ms-cab-compressed', 'gz' => 'application/x-gzip', 'tgz' => 'application/x-gzip', 'bz' => 'application/x-bzip', 'bz2' => 'application/x-bzip2', 'deb' => 'application/x-debian-package', // fonts 'psf' => 'application/x-font-linux-psf', 'otf' => 'application/x-font-otf', 'pcf' => 'application/x-font-pcf', 'snf' => 'application/x-font-snf', 'ttf' => 'application/x-font-ttf', 'ttc' => 'application/x-font-ttf', // audio 'mp3' => 'audio/mpeg', 'amr' => 'audio/amr', 'aac' => 'audio/x-aac', 'aif' => 'audio/x-aiff', 'aifc' => 'audio/x-aiff', 'aiff' => 'audio/x-aiff', 'wav' => 'audio/x-wav', 'wma' => 'audio/x-ms-wma', 'wax' => 'audio/x-ms-wax', 'midi' => 'audio/midi', 'mp4a' => 'audio/mp4', 'ogg' => 'audio/ogg', 'weba' => 'audio/webm', 'ra' => 'audio/x-pn-realaudio', 'ram' => 'audio/x-pn-realaudio', 'rmp' => 'audio/x-pn-realaudio-plugin', 'm3u' => 'audio/x-mpegurl', // video 'flv' => 'video/x-flv', 'qt' => 'video/quicktime', 'mov' => 'video/quicktime', 'wmv' => 'video/windows-media', 'avi' => 'video/x-msvideo', 'mpg' => 'video/mpeg', 'mpeg' => 'video/mpeg', 'mpe' => 'video/mpeg', 'm1v' => 'video/mpeg', 'm2v' => 'video/mpeg', '3gp' => 'video/3gpp', '3g2' => 'video/3gpp2', 'h261' => 'video/h261', 'h263' => 'video/h263', 'h264' => 'video/h264', 'jpgv' => 'video/jpgv', 'mp4v' => 'video/mp4', 'mpg4' => 'video/mp4', 'ogv' => 'video/ogg', 'webm' => 'video/webm', 'm4v' => 'video/x-m4v', 'asf' => 'video/x-ms-asf', 'asx' => 'video/x-ms-asf', 'wm' => 'video/x-ms-wm', 'wmv' => 'video/x-ms-wmv', 'wmx' => 'video/x-ms-wmx', 'wvx' => 'video/x-ms-wvx', 'movie' => 'video/x-sgi-movie', // adobe 'pdf' => 'application/pdf', 'psd' => 'image/vnd.adobe.photoshop', 'ai' => 'application/postscript', 'eps' => 'application/postscript', 'ps' => 'application/postscript', // ms office 'doc' => 'application/msword', 'docx' => 'application/msword', 'rtf' => 'application/rtf', 'xls' => 'application/vnd.ms-excel', 'ppt' => 'application/vnd.ms-powerpoint', // open office 'odt' => 'application/vnd.oasis.opendocument.text', 'ods' => 'application/vnd.oasis.opendocument.spreadsheet' ); } /** * @param string $sFileName * @return string */ public static function MimeContentType($sFileName) { $sResult = 'application/octet-stream'; $aMimeTypes = self::GetMimeContentTypes(); $sExt = strtolower(self::GetFileExtension($sFileName)); if (!empty($sExt) && isset($aMimeTypes[$sExt])) { $sResult = $aMimeTypes[$sExt]; } return $sResult; } /** * @param string $sMimeContentType * @return string */ public static function GetFileExtensionFromMimeContentType($sMimeContentType) { $aMimeTypes = self::GetMimeContentTypes(); return array_search($sMimeContentType, $aMimeTypes); } /** * @param string $sLanguage * @return string */ public static function ConvertLanguageNameToShort($sLanguage) { $aList = array( 'english' => 'en', 'polish' => 'pl', 'estonian' => 'et', 'bulgarian' => 'bg', 'ukrainian' => 'uk', 'thai' => 'th', 'swedish' => 'sv', 'spanish' => 'es', 'russian' => 'ru', 'romanian' => 'ro', 'portuguese-portuguese' => 'pt', 'portuguese-brazil' => 'pt-br', // 'persian' => '', // TODO name? Farsi 'latvian' => 'lv', 'korean' => 'ko', 'japanese' => 'ja', 'italian' => 'it', 'hungarian' => 'hu', 'hebrew' => 'he', 'german' => 'de', 'french' => 'fr', 'finnish' => 'fi', 'dutch' => 'nl', 'danish' => 'da', 'chinese-Traditional' => 'zh-tw', 'chinese-Simplified' => 'zh-cn', 'arabic' => 'ar', 'turkish' => 'tr', 'norwegian' => 'nb', // 'lithuanian' => 'lt', // TODO 'greek' => 'el', 'czech' => 'cs' ); $sLanguage = strtolower($sLanguage); return isset($aList[$sLanguage]) ? $aList[$sLanguage] : $sLanguage; } /** * @param int $iBigInt * @return int */ public static function GetGoodBigInt($iBigInt) { if (null === $iBigInt || false == $iBigInt) { return 0; } else if ($iBigInt > API_PHP_INT_MAX) { return API_PHP_INT_MAX; } else if ($iBigInt < API_PHP_INT_MIN) { return API_PHP_INT_MIN; } return (int) $iBigInt; } /** * @param string $sUtf8String * @param int $iLength * @return string */ public static function Utf8Truncate($sUtf8String, $iLength) { if (strlen($sUtf8String) <= $iLength) { return $sUtf8String; } while ($iLength >= 0) { if ((ord($sUtf8String[$iLength]) < 0x80) || (ord($sUtf8String[$iLength]) >= 0xC0)) { return substr($sUtf8String, 0, $iLength); } $iLength--; } return ''; } /** * @param string $sUtf8String * @return string */ public static function Utf8ToLowerCase($sUtf8String) { if (function_exists('mb_strtolower')) { return mb_strtolower($sUtf8String, 'utf-8'); } $aMapping = array( "\xC3\x80" => "\xC3\xA0", "\xC3\x81" => "\xC3\xA1", "\xC3\x82" => "\xC3\xA2", "\xC3\x83" => "\xC3\xA3", "\xC3\x84" => "\xC3\xA4", "\xC3\x85" => "\xC3\xA5", "\xC3\x86" => "\xC3\xA6", "\xC3\x87" => "\xC3\xA7", "\xC3\x88" => "\xC3\xA8", "\xC3\x89" => "\xC3\xA9", "\xC3\x8A" => "\xC3\xAA", "\xC3\x8B" => "\xC3\xAB", "\xC3\x8C" => "\xC3\xAC", "\xC3\x8D" => "\xC3\xAD", "\xC3\x8E" => "\xC3\xAE", "\xC3\x8F" => "\xC3\xAF", "\xC3\x90" => "\xC3\xB0", "\xC3\x91" => "\xC3\xB1", "\xC3\x92" => "\xC3\xB2", "\xC3\x93" => "\xC3\xB3", "\xC3\x94" => "\xC3\xB4", "\xC3\x95" => "\xC3\xB5", "\xC3\x96" => "\xC3\xB6", "\xC3\x98" => "\xC3\xB8", "\xC3\x99" => "\xC3\xB9", "\xC3\x9A" => "\xC3\xBA", "\xC3\x9B" => "\xC3\xBB", "\xC3\x9C" => "\xC3\xBC", "\xC3\x9D" => "\xC3\xBD", "\xC3\x9E" => "\xC3\xBE", "\xC4\x80" => "\xC4\x81", "\xC4\x82" => "\xC4\x83", "\xC4\x84" => "\xC4\x85", "\xC4\x86" => "\xC4\x87", "\xC4\x88" => "\xC4\x89", "\xC4\x8A" => "\xC4\x8B", "\xC4\x8C" => "\xC4\x8D", "\xC4\x8E" => "\xC4\x8F", "\xC4\x90" => "\xC4\x91", "\xC4\x92" => "\xC4\x93", "\xC4\x96" => "\xC4\x97", "\xC4\x98" => "\xC4\x99", "\xC4\x9A" => "\xC4\x9B", "\xC4\x9C" => "\xC4\x9D", "\xC4\x9E" => "\xC4\x9F", "\xC4\xA0" => "\xC4\xA1", "\xC4\xA2" => "\xC4\xA3", "\xC4\xA4" => "\xC4\xA5", "\xC4\xA6" => "\xC4\xA7", "\xC4\xA8" => "\xC4\xA9", "\xC4\xAA" => "\xC4\xAB", "\xC4\xAE" => "\xC4\xAF", "\xC4\xB4" => "\xC4\xB5", "\xC4\xB6" => "\xC4\xB7", "\xC4\xB9" => "\xC4\xBA", "\xC4\xBB" => "\xC4\xBC", "\xC4\xBD" => "\xC4\xBE", "\xC5\x81" => "\xC5\x82", "\xC5\x83" => "\xC5\x84", "\xC5\x85" => "\xC5\x86", "\xC5\x87" => "\xC5\x88", "\xC5\x8A" => "\xC5\x8B", "\xC5\x8C" => "\xC5\x8D", "\xC5\x90" => "\xC5\x91", "\xC5\x94" => "\xC5\x95", "\xC5\x96" => "\xC5\x97", "\xC5\x98" => "\xC5\x99", "\xC5\x9A" => "\xC5\x9B", "\xC5\x9C" => "\xC5\x9D", "\xC5\x9E" => "\xC5\x9F", "\xC5\xA0" => "\xC5\xA1", "\xC5\xA2" => "\xC5\xA3", "\xC5\xA4" => "\xC5\xA5", "\xC5\xA6" => "\xC5\xA7", "\xC5\xA8" => "\xC5\xA9", "\xC5\xAA" => "\xC5\xAB", "\xC5\xAC" => "\xC5\xAD", "\xC5\xAE" => "\xC5\xAF", "\xC5\xB0" => "\xC5\xB1", "\xC5\xB2" => "\xC5\xB3", "\xC5\xB4" => "\xC5\xB5", "\xC5\xB6" => "\xC5\xB7", "\xC5\xB8" => "\xC3\xBF", "\xC5\xB9" => "\xC5\xBA", "\xC5\xBB" => "\xC5\xBC", "\xC5\xBD" => "\xC5\xBE", "\xC6\xA0" => "\xC6\xA1", "\xC6\xAF" => "\xC6\xB0", "\xC8\x98" => "\xC8\x99", "\xC8\x9A" => "\xC8\x9B", "\xCE\x86" => "\xCE\xAC", "\xCE\x88" => "\xCE\xAD", "\xCE\x89" => "\xCE\xAE", "\xCE\x8A" => "\xCE\xAF", "\xCE\x8C" => "\xCF\x8C", "\xCE\x8E" => "\xCF\x8D", "\xCE\x8F" => "\xCF\x8E", "\xCE\x91" => "\xCE\xB1", "\xCE\x92" => "\xCE\xB2", "\xCE\x93" => "\xCE\xB3", "\xCE\x94" => "\xCE\xB4", "\xCE\x95" => "\xCE\xB5", "\xCE\x96" => "\xCE\xB6", "\xCE\x97" => "\xCE\xB7", "\xCE\x98" => "\xCE\xB8", "\xCE\x99" => "\xCE\xB9", "\xCE\x9A" => "\xCE\xBA", "\xCE\x9B" => "\xCE\xBB", "\xCE\x9C" => "\xCE\xBC", "\xCE\x9D" => "\xCE\xBD", "\xCE\x9E" => "\xCE\xBE", "\xCE\x9F" => "\xCE\xBF", "\xCE\xA0" => "\xCF\x80", "\xCE\xA1" => "\xCF\x81", "\xCE\xA3" => "\xCF\x83", "\xCE\xA4" => "\xCF\x84", "\xCE\xA5" => "\xCF\x85", "\xCE\xA6" => "\xCF\x86", "\xCE\xA7" => "\xCF\x87", "\xCE\xA8" => "\xCF\x88", "\xCE\xA9" => "\xCF\x89", "\xCE\xAA" => "\xCF\x8A", "\xCE\xAB" => "\xCF\x8B", "\xD0\x81" => "\xD1\x91", "\xD0\x82" => "\xD1\x92", "\xD0\x83" => "\xD1\x93", "\xD0\x84" => "\xD1\x94", "\xD0\x85" => "\xD1\x95", "\xD0\x86" => "\xD1\x96", "\xD0\x87" => "\xD1\x97", "\xD0\x88" => "\xD1\x98", "\xD0\x89" => "\xD1\x99", "\xD0\x8A" => "\xD1\x9A", "\xD0\x8B" => "\xD1\x9B", "\xD0\x8C" => "\xD1\x9C", "\xD0\x8E" => "\xD1\x9E", "\xD0\x8F" => "\xD1\x9F", "\xD0\x90" => "\xD0\xB0", "\xD0\x91" => "\xD0\xB1", "\xD0\x92" => "\xD0\xB2", "\xD0\x93" => "\xD0\xB3", "\xD0\x94" => "\xD0\xB4", "\xD0\x95" => "\xD0\xB5", "\xD0\x96" => "\xD0\xB6", "\xD0\x97" => "\xD0\xB7", "\xD0\x98" => "\xD0\xB8", "\xD0\x99" => "\xD0\xB9", "\xD0\x9A" => "\xD0\xBA", "\xD0\x9B" => "\xD0\xBB", "\xD0\x9C" => "\xD0\xBC", "\xD0\x9D" => "\xD0\xBD", "\xD0\x9E" => "\xD0\xBE", "\xD0\x9F" => "\xD0\xBF", "\xD0\xA0" => "\xD1\x80", "\xD0\xA1" => "\xD1\x81", "\xD0\xA2" => "\xD1\x82", "\xD0\xA3" => "\xD1\x83", "\xD0\xA4" => "\xD1\x84", "\xD0\xA5" => "\xD1\x85", "\xD0\xA6" => "\xD1\x86", "\xD0\xA7" => "\xD1\x87", "\xD0\xA8" => "\xD1\x88", "\xD0\xA9" => "\xD1\x89", "\xD0\xAA" => "\xD1\x8A", "\xD0\xAB" => "\xD1\x8B", "\xD0\xAC" => "\xD1\x8C", "\xD0\xAD" => "\xD1\x8D", "\xD0\xAE" => "\xD1\x8E", "\xD0\xAF" => "\xD1\x8F", "\xD2\x90" => "\xD2\x91", "\xE1\xB8\x82" => "\xE1\xB8\x83", "\xE1\xB8\x8A" => "\xE1\xB8\x8B", "\xE1\xB8\x9E" => "\xE1\xB8\x9F", "\xE1\xB9\x80" => "\xE1\xB9\x81", "\xE1\xB9\x96" => "\xE1\xB9\x97", "\xE1\xB9\xA0" => "\xE1\xB9\xA1", "\xE1\xB9\xAA" => "\xE1\xB9\xAB", "\xE1\xBA\x80" => "\xE1\xBA\x81", "\xE1\xBA\x82" => "\xE1\xBA\x83", "\xE1\xBA\x84" => "\xE1\xBA\x85", "\xE1\xBB\xB2" => "\xE1\xBB\xB3" ); return strtr(strtolower($sUtf8String), $aMapping); } /** * @param string $sPabUri * @return array */ public static function LdapUriParse($sPabUri) { $aReturn = array( 'host' => '127.0.0.1', 'port' => 389, 'search_dn' => '', ); $sPabUriLower = strtolower($sPabUri); if ('ldap://' === substr($sPabUriLower, 0, 7)) { $sPabUriLower = substr($sPabUriLower, 7); } $aPabUriLowerExplode = explode('/', $sPabUriLower, 2); $aReturn['search_dn'] = isset($aPabUriLowerExplode[1]) ? $aPabUriLowerExplode[1] : ''; if (isset($aPabUriLowerExplode[0])) { $aPabUriLowerHostPortExplode = explode(':', $aPabUriLowerExplode[0], 2); $aReturn['host'] = isset($aPabUriLowerHostPortExplode[0]) ? $aPabUriLowerHostPortExplode[0] : $aReturn['host']; $aReturn['port'] = isset($aPabUriLowerHostPortExplode[1]) ? (int) $aPabUriLowerHostPortExplode[1] : $aReturn['port']; } return $aReturn; } /** * @return string */ public static function RequestUri() { $sUri = ''; if (isset($_SERVER['REQUEST_URI'])) { $sUri = $_SERVER['REQUEST_URI']; } else { if (isset($_SERVER['SCRIPT_NAME'])) { if (isset($_SERVER['argv'], $_SERVER['argv'][0])) { $sUri = $_SERVER['SCRIPT_NAME'].'?'.$_SERVER['argv'][0]; } else if (isset($_SERVER['QUERY_STRING'])) { $sUri = $_SERVER['SCRIPT_NAME'].'?'.$_SERVER['QUERY_STRING']; } else { $sUri = $_SERVER['SCRIPT_NAME']; } } } $sUri = '/'. ltrim($sUri, '/'); return $sUri; } /** * @return string $sFileName * @return string */ public static function CsvToArray($sFileName) { if (!file_exists($sFileName) || !is_readable($sFileName)) { return false; } $aHeaders = null; $aData = array(); @setlocale(LC_CTYPE, 'en_US.UTF-8'); \ini_set('auto_detect_line_endings', true); if (false !== ($rHandle = @fopen($sFileName, 'rb'))) { $sDelimiterSearchString = @fread($rHandle, 2000); rewind($rHandle); $sDelimiter = ( (int) substr_count($sDelimiterSearchString, ',') > (int) substr_count($sDelimiterSearchString, ';')) ? ',' : ';'; while (false !== ($mRow = fgetcsv($rHandle, 5000, $sDelimiter, '"'))) { $mRow = preg_replace('/[\r\n]+/', "\n", $mRow); if (null === $aHeaders) { if (3 >= count($mRow)) { CApi::Log('Invalid csv headers'); CApi::LogObject($mRow); fclose($rHandle); return $aData; } $aHeaders = $mRow; } else { $aNewItem = array(); foreach ($aHeaders as $iIndex => $sHeaderValue) { $aNewItem[@iconv('utf-8', 'utf-8//IGNORE', $sHeaderValue)] = isset($mRow[$iIndex]) ? $mRow[$iIndex] : ''; } $aData[] = $aNewItem; } } fclose($rHandle); } ini_set('auto_detect_line_endings', false); return $aData; } public static function DirMtime($dir) { $last_modified = 0; $files = glob($dir.'/*'); foreach ($files as $file) { if (is_dir($file)) { $modified = self::DirMtime($file); } else { $modified = filemtime($file); } if ($modified > $last_modified) { $last_modified = $modified; } } return $last_modified; } public static function GlobRecursive($pattern, $flags = 0) { $files = glob($pattern, $flags); $aPaternFiles = glob(dirname($pattern).'/*', GLOB_ONLYDIR|GLOB_NOSORT); if (is_array($aPaternFiles) && is_array($files)) { foreach ($aPaternFiles as $dir) { $files = array_merge($files, self::GlobRecursive($dir.'/'.basename($pattern), $flags)); } } return is_array($files) ? $files : array(); } /** * @param string $sPhone * @return string */ public static function ClearPhone($sPhone) { return preg_replace('/^0000000000/', '+', preg_replace('/[^\d]+/', '', preg_replace('/^[+]/', '0000000000', trim($sPhone)))); } /** * @param string $sSearch * @return string */ public static function ClearPhoneSearch($sSearch) { return preg_replace('/[\s\-()]+/', '', preg_replace('/^[+]/', '', trim($sSearch))); } /** * @param string $sSearch * @return bool */ public static function IsPhoneSearch($sSearch) { return (bool) preg_match('/^[\d]{3,}$/', self::ClearPhoneSearch($sSearch)); } /** * @param string $sFolder * @param int $iMessageCount * @param int $iMessageUnseenCount * @param string $sUidNext * @return string */ public static function GenerateFolderHash($sFolder, $iMessageCount, $iMessageUnseenCount, $sUidNext) { $iMessageUnseenCount =0; $sD = "\x0"; return md5($sFolder.$sD.$iMessageCount.$sD.$iMessageUnseenCount.$sD.$sUidNext); } /** * @param string $sMimeType * @param string $sFileName = '' * @return bool */ public static function IsGDImageMimeTypeSuppoted($sMimeType, $sFileName = '') { $bResult = function_exists('gd_info'); if ($bResult) { $bResult = false; switch (strtolower($sMimeType)) { case 'image/jpg': case 'image/jpeg': $bResult = function_exists('imagecreatefromjpeg'); break; case 'image/png': $bResult = function_exists('imagecreatefrompng'); break; case 'image/gif': $bResult = function_exists('imagecreatefromgif'); break; } } return $bResult; } public static function GetDirectorySize($path) { $size = 0; $files = 0; $directories = 0; $handle = is_dir($path) ? opendir($path) : null; if ($handle) { while (false !== ($file = readdir($handle))) { $nextpath = $path . '/' . $file; if ($file != '.' && $file != '..' && !is_link($nextpath)) { if (is_dir($nextpath)) { $directories++; $result = self::GetDirectorySize($nextpath); $size += $result['size']; $files += $result['files']; $directories += $result['directories']; } elseif (is_file($nextpath)) { $size += filesize($nextpath); $files++; } } } if (is_resource($handle)) { closedir($handle); } } return array( 'size' => $size, 'files' => $files, 'directories' => $directories ); } public static function SearchFiles($sPath, $sPattern) { $files = array(); // Create recursive dir iterator which skips dot folders $oDirIterator = new RecursiveDirectoryIterator($sPath, FilesystemIterator::SKIP_DOTS | FilesystemIterator::UNIX_PATHS ); $oIterators = new RecursiveIteratorIterator($oDirIterator, RecursiveIteratorIterator::SELF_FIRST ); foreach($oIterators as $oIterator) { $sName = $oIterator->getFilename(); $aMatches = array(); $iResult = preg_match("/" . preg_quote($sPattern) . "/ui", $sName, $aMatches); if ($sName !== '.sabredav' && $sName !== API_HELPDESK_PUBLIC_NAME && $iResult === 1) { $files[] = $oIterator->getPathname(); } } return $files; } public static function GetRemoteFileInfo($sUrl) { $aResult = array( 'size' => 0, 'content-type' => '' ); $oCurl = \curl_init(); \curl_setopt_array($oCurl, array( CURLOPT_URL => $sUrl, CURLOPT_HEADER => true, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_RETURNTRANSFER => true, CURLOPT_NOBODY => true )); \curl_exec($oCurl); $aInfo = \curl_getinfo($oCurl); if ($aInfo) { $sContentType = ''; $aResult['size'] = isset($aInfo['download_content_length']) ? (int) $aInfo['download_content_length'] : 0; if (isset($aInfo['content_type'])) { $aContentType = explode(';', $aInfo['content_type']); $sContentType = isset($aContentType[0]) ? $aContentType[0] : ''; } $aResult['content-type'] = $sContentType; } if (\is_resource($oCurl)) { \curl_close($oCurl); } return $aResult; } /** * @param string $sUrl * @return bool */ public static function RemoteFileExists($sUrl) { if (0 === strlen(trim($sUrl))) { return false; } $oCurl = curl_init($sUrl); if (is_resource($oCurl)) { curl_setopt($oCurl, CURLOPT_NOBODY, true); curl_exec($oCurl); } $iCode = curl_getinfo($oCurl, CURLINFO_HTTP_CODE); if (is_resource($oCurl)) { curl_close($oCurl); } return ($iCode === 200 || $iCode === 0); } /** * @param string $sLink * @return int */ public static function GetLinkType($sLink) { $iResult = \EFileStorageLinkType::Unknown; if (false !== strpos($sLink, '.google.com')) { $iResult = \EFileStorageLinkType::GoogleDrive; } else if (false !== strpos($sLink, 'dl.dropboxusercontent.com') || false !== strpos($sLink, 'dropbox.com')) { $iResult = \EFileStorageLinkType::DropBox; } return $iResult; } public static function PopulateGoogleDriveFileInfo(&$oFileInfo) { if (!isset($oFileInfo->downloadUrl)) { switch($oFileInfo->mimeType) { case 'application/vnd.google-apps.document': $oFileInfo->downloadUrl = $oFileInfo->exportLinks->{'application/vnd.openxmlformats-officedocument.wordprocessingml.document'}; $oFileInfo->title = $oFileInfo->title . '.docx'; break; case 'application/vnd.google-apps.spreadsheet': $oFileInfo->downloadUrl = $oFileInfo->exportLinks->{'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'}; $oFileInfo->title = $oFileInfo->title . '.xlsx'; break; case 'application/vnd.google-apps.drawing': $oFileInfo->downloadUrl = $oFileInfo->exportLinks->{'image/png'}; $oFileInfo->title = $oFileInfo->title . '.png'; break; case 'application/vnd.google-apps.presentation': $oFileInfo->downloadUrl = $oFileInfo->exportLinks->{'application/vnd.openxmlformats-officedocument.presentationml.presentation'}; $oFileInfo->title = $oFileInfo->title . '.pptx'; break; default: $oFileInfo->downloadUrl = $oFileInfo->exportLinks->{'application/pdf'}; $oFileInfo->title = $oFileInfo->title . '.pdf'; break; } if (!isset($oFileInfo->fileSize)) { $aRemoteFileInfo = \api_Utils::GetRemoteFileInfo($oFileInfo->downloadUrl); $oFileInfo->fileSize = $aRemoteFileInfo['size']; } } } public static function GetGoogleDriveFileInfo($sLink, $sGoogleAPIKey, $sAccessToken = null, $bLinkAsId = false) { $mResult = false; $sGDId = ''; if ($bLinkAsId) { $sGDId = $sLink; } else { $matches = array(); preg_match("%https://\w+\.google\.com/\w+/d/(.*?)/edit*%", $sLink, $matches); $sGDId = isset($matches[1]) ? $matches[1] : ''; } if ($sGDId !== '') { $sUrl = "https://www.googleapis.com/drive/v2/files/".$sGDId.'?key='.$sGoogleAPIKey; $aHeaders = $sAccessToken ? array('Authorization: Bearer '. $sAccessToken) : array(); $sContentType = ''; $iCode = 0; $mResult = \MailSo\Base\Http::SingletonInstance()->GetUrlAsString($sUrl, '', $sContentType, $iCode, null, 10, '', '', $aHeaders); if ($iCode === 200) { $mResult = json_decode($mResult); self::PopulateGoogleDriveFileInfo($mResult); } else { $mResult = false; } } else { $mResult = false; } return $mResult; } public static function GetGoogleUserInfo($sGoogleAPIKey, $sAccessToken = null) { $mResult = false; $sUrl = "https://www.googleapis.com/plus/v1/people/me?key=".$sGoogleAPIKey; $aHeaders = $sAccessToken ? array('Authorization: Bearer '. $sAccessToken) : array(); $sContentType = ''; $iCode = 0; $mResult = \MailSo\Base\Http::SingletonInstance()->GetUrlAsString($sUrl, '', $sContentType, $iCode, null, 10, '', '', $aHeaders); return ($iCode === 200) ? json_decode($mResult) : false; } /** * @return \CAccount | null */ public static function GetDefaultAccount() { $oResult = null; $oApiUsers = /* @var $oApiUsers \CApiUsersManager */ \CApi::Manager('users'); $oApiIntegrator /* @var $oApiIntegrator \CApiIntegratorManager */ = \CApi::Manager('integrator'); $iUserId = $oApiIntegrator->GetLogginedUserId(); if (0 < $iUserId) { $iAccountId = $oApiUsers->GetDefaultAccountId($iUserId); if (0 < $iAccountId) { $oAccount = $oApiUsers->GetAccountById($iAccountId); if ($oAccount instanceof \CAccount && !$oAccount->IsDisabled) { $oResult = $oAccount; } } } return $oResult; } public static function GetAppUrl() { $aUrlParts = parse_url($_SERVER['HTTP_REFERER']); $sProtocol = !empty($aUrlParts['scheme']) ? $aUrlParts['scheme'] : 'http'; $sHost = !empty($aUrlParts['host']) ? $aUrlParts['host'] : 'localhost'; $sPath = !empty($aUrlParts['path']) ? str_replace('index.php', '', $aUrlParts['path']) : ''; $sPort = !empty($aUrlParts['port']) ? ':'.$aUrlParts['port'] : ''; return $sProtocol.'://'.$sHost.$sPath.$sPort; } } /** * @package Api */ class api_Validate { /** * @param string $sFuncName * @return string */ public static function GetError($sFuncName) { switch ($sFuncName) { case 'Port': return 'Required valid port.'; case 'IsEmpty': return 'Required fields cannot be empty.'; } return 'Error'; } /** * @param mixed $mValue * @return bool */ public static function IsValidTenantLogin($mValue) { return preg_match('/^[a-zA-Z0-9@\-_\.]+$/', $mValue); } /** * @param mixed $mValue * @return bool */ public static function IsValidChannelLogin($mValue) { return preg_match('/^[a-zA-Z0-9@\-_\.]+$/', $mValue); } /** * @param mixed $mValue * @return bool */ public static function IsEmpty($mValue) { return !is_string($mValue) || 0 === strlen($mValue); } /** * @param mixed $mValue * @return bool */ public static function Port($mValue) { $bResult = false; if (0 < strlen((string) $mValue) && is_numeric($mValue)) { $iPort = (int) $mValue; if (0 < $iPort && $iPort < 65355) { $bResult = true; } } return $bResult; } } /** * @package Api */ class CApiValidationException extends CApiBaseException {} /** * @package Api */ class api_Ints { /** * @return int */ public static function getIntMax() { $iMax = 0x7fff; $iProbe = 0x7fffffff; while ($iMax == ($iProbe >> 16)) { $iMax = $iProbe; $iProbe = ($iProbe << 16) + 0xffff; } return $iMax; } } function fNullCallback() {} defined('API_PHP_INT_MAX') || define('API_PHP_INT_MAX', (int) api_Ints::getIntMax()); defined('API_PHP_INT_MIN') || define('API_PHP_INT_MIN', (int) (API_PHP_INT_MAX + 1));