uawdijnntqw1x1x1
IP : 216.73.216.26
Hostname : server.wtmmart.in
Kernel : Linux server.wtmmart.in 4.18.0-553.45.1.el8_10.x86_64 #1 SMP Wed Mar 19 09:44:46 EDT 2025 x86_64
Disable Function : exec,passthru,shell_exec,system
OS : Linux
PATH:
/
home2
/
wtmwscom
/
public_html
/
livezila
/
..
/
livezila
/
_lib
/
objects.global.inc.php
/
/
<?php /**************************************************************************************** * LiveZilla objects.global.inc.php * * Copyright 2018 LiveZilla GmbH * All rights reserved. * LiveZilla is a registered trademark. * * Improper changes to this file may cause critical errors. ***************************************************************************************/ if(!defined("IN_LIVEZILLA")) die(); class IOStruct { static function AppendToFile($_file,$_content) { if($_file != FILE_GENERAL_LOG && $_file != FILE_ERROR_LOG && $_file != FILE_SQL_ERROR_LOG && $_file != FILE_EMAIL_LOG && $_file != FILE_LDAP_LOG) Logging::SecurityLog("IOStruct::AppendToFile",$_file . " (" . $_content. ")",""); $handle = @fopen($_file,"a+"); if($handle) { @fputs($handle,$_content); @fclose($handle); } } static function CreateFile($_filename, $_content, $_recreate, $_excludeFromLog = false) { if(!$_excludeFromLog) Logging::SecurityLog("IOStruct::CreateFile",$_filename . " (" . $_content. ")",""); if(strpos($_filename,"..") === false) { if(file_exists($_filename)) { if($_recreate) { @unlink($_filename); } else return 0; } $handle = @fopen($_filename,"w"); if(strlen($_content)>0) @fputs($handle,$_content); @fclose($handle); return 1; } return 0; } static function GetFile($_file,$data="") { if(@file_exists($_file) && substr_count($_file,"..") <= 1) { $handle = @fopen($_file,"r"); if($handle) { $data = @fread($handle,@filesize($_file)); @fclose($handle); } return $data; } } static function ToBase64($_filename) { if(@filesize($_filename) == 0) return ""; $handle = @fopen($_filename,"rb"); $content = @fread($handle,@filesize($_filename)); @fclose($handle); return base64_encode($content); } static function IsWriteable($_dir) { if(!@is_dir($_dir)) @mkdir($_dir); if(@is_dir($_dir)) { $fileid = md5(uniqid(rand())); $handle = @fopen ($_dir . $fileid ,"a"); @fputs($handle,$fileid."\r\n"); @fclose($handle); if(!file_exists($_dir . $fileid)) return false; @unlink($_dir . $fileid); if(file_exists($_dir . $fileid)) return false; return true; } else return false; } static function HashMD5($_file) { $md5file = @md5_file($_file); if(gettype($md5file) != 'boolean' && $md5file != false) return $md5file; } static function RequireTranslation($_file) { global $_CONFIG, $LZLANG; // ++ IOStruct::RequireDynamic($_file,PATH_LOCALIZATION); IOStruct::RequireDynamic(str_replace(".php",".my.php",$_file),PATH_LOCALIZATION); } static function RequireDynamic($_file,$_trustedFolder) { global $_CONFIG, $LZLANG; // ++ if(strpos($_file, "..") !== false && strpos(LIVEZILLA_PATH, "..") === false) return false; if(strpos(realpath($_file),realpath($_trustedFolder)) !== 0) return false; if(file_exists($_file)) { require($_file); return true; } return false; } static function IsValidUploadFile($_filename) { if(Str::EndsWith($_filename,".lzsc")) return true; if(isset(Server::$Configuration->File["gl_fuwl"]) && !empty(Server::$Configuration->File["gl_fuwl"])) { $extensions = explode(",",str_replace("*.","",Server::$Configuration->File["gl_fuwl"])); foreach($extensions as $ext) if(strlen($_filename) > strlen($ext) && substr($_filename,strlen($_filename)-strlen($ext),strlen($ext)) == $ext) return true; return false; } if(isset(Server::$Configuration->File["gl_fubl"]) && !empty(Server::$Configuration->File["gl_fubl"])) { $extensions = explode(",",str_replace("*.","",Server::$Configuration->File["gl_fubl"])); foreach($extensions as $ext) { if(strlen($_filename) > strlen($ext) && substr($_filename,strlen($_filename)-strlen($ext),strlen($ext)) == $ext) { return false; } } return true; } return true; } static function FilterParameter($_value,$_default,$_filter,$_filteropt,$_maxlen=0) { if($_maxlen>0 && strlen($_value)>$_maxlen) $_value = substr($_value,0,$_maxlen); if($_filter == FILTER_HTML_ENTITIES) if($_filter == FILTER_HTML_ENTITIES) { return htmlentities($_value,ENT_QUOTES,"UTF-8"); } if($_filter == null || !function_exists("filter_var")) return $_value; else if(!empty($_filter)) { $var = ($_filteropt != null) ? filter_var($_value,$_filter,$_filteropt) : filter_var($_value,$_filter); if($var!==false) return $var; } return $_default; } static function ToBytes($_configValue) { $_configValue = strtolower(trim($_configValue)); $last = substr($_configValue,strlen($_configValue)-1,1); $int = intval(str_replace(array("g","m","k"),"",$_configValue)); switch($last) { case 'g': $int *= (1024*1024*1024); break; case 'm': $int *= (1024*1024); break; case 'k': $int *= 1024; break; } return floor($int); } static function ReadDirectory($_dir,$_oddout) { $files = array(); if(!@is_dir($_dir)) return $files; $handle=@opendir($_dir); while ($filename = @readdir ($handle)) if ($filename != "." && $filename != ".." && ($_oddout == false || !stristr($filename,$_oddout))) if($_oddout != "." || ($_oddout == "." && @is_dir($_dir . "/" . $filename))) $files[]=$filename; @closedir($handle); return $files; } static function GetNamebase($_path) { $file = basename($_path); if(strpos($file,'\\') !== false) { $tmp = preg_split("[\\\]",$file); $file = $tmp[count($tmp) - 1]; return $file; } else return $file; } } class Logging { static function SecurityLog($_type,$_value="",$_user="") { if(DBManager::$Connected && defined("DB_PREFIX")) { $_type = Str::Cut($_type,32); $request = @serialize($_REQUEST); if(!DEBUG_MODE) $_value = Str::Cut($_value,512); else $_value = Str::Cut($_value,3000); if(!DEBUG_MODE) $request = Str::Cut($request,1024); else $request = Str::Cut($request,3000); DBManager::Execute(true, "INSERT INTO `" . DB_PREFIX . DATABASE_ADMINISTRATION_LOG . "` (`id`,`type`,`value`,`trace`,`time`,`user`,`ip`) VALUES ('" . DBManager::RealEscape(getId(32)) . "','" . DBManager::RealEscape($_type) . "','" . DBManager::RealEscape($_value) . "','" . DBManager::RealEscape($request) . "','" . DBManager::RealEscape(time()) . "','" . DBManager::RealEscape($_user) . "','" . DBManager::RealEscape(Communication::GetIP(true)) . "');"); DBManager::Execute(true, "DELETE FROM `" . DB_PREFIX . DATABASE_ADMINISTRATION_LOG . "` WHERE `time`<'" . DBManager::RealEscape(time() - 2592000) . "';"); } } static function IsMailFlood() { $result=DBManager::Execute(true, "SELECT `ip` FROM `" . DB_PREFIX . DATABASE_ADMINISTRATION_LOG . "` WHERE `type`='Communication::SendMail' AND `ip`='" . DBManager::RealEscape(Communication::GetIP(false)) . "' AND `time`>" . intval(time() - 600)); if(($rc=DBManager::GetRowCount($result)) >= (MAX_MAIL_PER_MINUTE*10)) { if(class_exists('OperatorRequest') && OperatorRequest::IsValidated()) { Logging::EmailLog("Possible spam (".$rc.") over IP: " . Communication::GetIP(true)); return false; } else { Logging::EmailLog("Email blocked, possible spam (".$rc.") over IP: " . Communication::GetIP(true)); return true; } } return false; } static function IsFileFlood() { $result = DBManager::Execute(true, $q = "SELECT `ip` FROM `" . DB_PREFIX . DATABASE_ADMINISTRATION_LOG . "` WHERE (`type` LIKE '%Upload::%' OR `type` LIKE '%::CreateFile%') AND `ip`='" . DBManager::RealEscape(Communication::GetIP(true)) . "' AND `time`>" . intval(time() - 86400)); $rc = DBManager::GetRowCount($result); if($rc >= MAX_FILE_UPLOADS_PER_DAY) { Logging::GeneralLog("Unusual high amount of file uploads (at least ".$rc." in 24 hours) coming from IP: " . Communication::GetIP(false).". This attempt was blocked."); return true; } return false; } static function DebugLog($_log) { if(Is::Defined("DEBUG_MODE")) Logging::GeneralLog($_log); } static function DatabaseLog($_log) { Logging::GeneralLog(date("d.m.y H:i:s") . " - " . $_log,FILE_SQL_ERROR_LOG); } static function EmailLog($_log) { Logging::GeneralLog(date("d.m.y H:i:s") . " - " . $_log,FILE_EMAIL_LOG); } static function LDAPLog($_log) { Logging::GeneralLog(date("d.m.y H:i:s") . " - " . $_log,FILE_LDAP_LOG); } static function GeneralLog($_log,$_file=null) { if(empty($_file)) $_file = FILE_GENERAL_LOG; if(@file_exists($_file) && @filesize($_file) > 5000000) @unlink($_file); $_log = Str::Cut($_log,100000,true); IOStruct::AppendToFile($_file,$_log."\r\n"); } static function ErrorLog($_message) { $_message = Str::Cut($_message,100000,true); if(defined("FILE_ERROR_LOG")) { if(@file_exists(FILE_ERROR_LOG) && @filesize(FILE_ERROR_LOG) > 5000000) @unlink(FILE_ERROR_LOG); IOStruct::AppendToFile(FILE_ERROR_LOG,$_message . "\r"); if(!empty(Server::$Response)) { if(!isset(Server::$Response->Exceptions)) Server::$Response->Exceptions = ""; Server::$Response->Exceptions .= "<val err=\"".base64_encode(trim($_message))."\" />"; } } else Server::$Response->Exceptions = ""; } static function BackTrace() { //Logging::DebugLog(count(debug_backtrace()) . " . " . debug_backtrace()[1]['function'] . " - " . debug_backtrace()[1]['file'] . " - " . debug_backtrace()[1]['line']); } } class SystemTime { private static $StartTime; static function GetMicroTime() { $time = str_replace(".","",microtime()); $time = explode(" " , $time); return $time; } static function GetMicroTimeFloat($_microtime) { list($usec, $sec) = explode(" ", $_microtime); return ((float)$usec + (float)$sec); } static function GetSystemTimezone() { if(!empty(Server::$Configuration->File["gl_tizo"])) return Server::$Configuration->File["gl_tizo"]; $iTime = time(); $arr = @localtime($iTime); $arr[5] += 1900; $arr[4]++; if(!empty($arr[8])) $arr[2]--; $iTztime = @gmmktime($arr[2], $arr[1], $arr[0], $arr[4], $arr[3], $arr[5]); $offset = doubleval(($iTztime-$iTime)/(60*60)); $zonelist = array ( 'Kwajalein' => -12.00, 'Pacific/Midway' => -11.00, 'Pacific/Honolulu' => -10.00, 'America/Anchorage' => -9.00, 'America/Los_Angeles' => -8.00, 'America/Denver' => -7.00, 'America/Tegucigalpa' => -6.00, 'America/Chicago' => -6.00, 'America/New_York' => -5.00, 'America/Bogota' => -5.00, 'America/Caracas' => -4.30, 'America/Halifax' => -4.00, 'America/St_Johns' => -3.30, 'America/Argentina/Buenos_Aires' => -3.00, 'America/Sao_Paulo' => -3.00, 'Atlantic/South_Georgia' => -2.00, 'Atlantic/Azores' => -1.00, 'Europe/Dublin' => 0, 'Europe/Belgrade' => 1.00, 'Europe/Helsinki' => 2.00, 'Africa/Johannesburg' => 2.00, 'Asia/Kuwait' => 3.00, 'Asia/Tehran' => 3.30, 'Asia/Muscat' => 4.00, 'Asia/Kabul' => 4.30, 'Asia/Yekaterinburg' => 5.00, 'Asia/Kolkata' => 5.30, 'Asia/Katmandu' => 5.45, 'Asia/Dhaka' => 6.00, 'Asia/Rangoon' => 6.30, 'Asia/Krasnoyarsk' => 7.00, 'Asia/Brunei' => 8.00, 'Asia/Seoul' => 9.00, 'Australia/Darwin' => 9.30, 'Australia/Canberra' => 10.00, 'Asia/Magadan' => 11.00, 'Pacific/Fiji' => 12.00, 'Pacific/Tongatapu' => 13.00 ); $index = array_keys($zonelist, $offset); if(sizeof($index)!=1) return false; return $index[0]; } static function SetSystemTimezone() { if(function_exists("date_default_timezone_set")) if(SystemTime::GetSystemTimezone() !== false) @date_default_timezone_set(SystemTime::GetSystemTimezone()); } static function GetTimeDifference($_time) { $_time = (time() - $_time); //if(abs($_time) <= 5) // $_time = 0; return $_time; } static function GetLocalTimezone($_timezone,$ltz=0) { $template = "%s%s%s:%s%s"; if(isset($_timezone) && !empty($_timezone)) { $ltz = $_timezone; if($ltz == ceil($ltz)) { if($ltz >= 0 && $ltz < 10) $ltz = sprintf($template,"+","0",$ltz,"0","0"); else if($ltz < 0 && $ltz > -10) $ltz = sprintf($template,"-","0",$ltz*-1,"0","0"); else if($ltz >= 10) $ltz = sprintf($template,"+",$ltz,"","0","0"); else if($ltz <= -10) $ltz = sprintf($template,"",$ltz,"","0","0"); } else { $split = explode(".",$ltz); $split[1] = (60 * $split[1]) / 100; if($ltz >= 0 && $ltz < 10) $ltz = sprintf($template,"+","0",$split[0],$split[1],"0"); else if($ltz < 0 && $ltz > -10) $ltz = sprintf($template,"","0",$split[0],$split[1],"0"); else if($ltz >= 10) $ltz = sprintf($template,"+",$split[0],"",$split[1],"0"); else if($ltz <= -10) $ltz = sprintf($template,"",$split[0],"",$split[1],"0"); } } return $ltz; } static function GetUniqueMessageTime($_database,$_column) { $time = time(); while(true) { $result=DBManager::Execute(true, "SELECT `" . $_column . "` FROM `" . DB_PREFIX . $_database . "` WHERE `" . $_column . "`=" . intval($time) . ";"); if(DBManager::GetRowCount($result) > 0) $time++; else break; } return $time; } static function GetRuntime($_token=null) { global $RUDB; if($_token==null) { $_token = getId(10); $RUDB[$_token] = microtime(true); return $_token; } else { $time_end = microtime(true); return $execution_time = ($time_end - $RUDB[$_token]); } } static function FormatTimeSpan($_seconds,$_negative=false) { if($_seconds < 0) { $_negative = true; $_seconds *= -1; } $days = floor($_seconds / 86400); $_seconds = $_seconds - ($days * 86400); $hours = floor($_seconds / 3600); $_seconds = $_seconds - ($hours * 3600); $minutes = floor($_seconds / 60); $_seconds = $_seconds - ($minutes * 60); $string = ""; if($days > 0)$string .= $days."."; if($hours >= 10)$string .= $hours.":"; else if($hours < 10)$string .= "0".$hours.":"; if($minutes >= 10)$string .= $minutes.":"; else if($minutes < 10)$string .= "0".$minutes.":"; if($_seconds >= 10)$string .= $_seconds; else if($_seconds < 10)$string .= "0".$_seconds; if($_negative) return "-" . $string; return $string; } static function GetExecutionTime($_start=true) { if($_start) { SystemTime::$StartTime = microtime(true); } else { return microtime(true) - SystemTime::$StartTime; } } } class Encoding { static function Base64UrlDecode($_input) { return base64_decode(str_replace(array('_','-',','),array('=','+','/'),$_input)); } static function Base64UrlEncode($_input) { return str_replace(array('=','+','/'),array('_','-',','),base64_encode($_input)); } static function IsBase64Encoded($_data,$_url=false) { if($_url) $_data = str_replace(array('_','-',','),array('=','+','/'),$_data); if(preg_match('%^[a-zA-Z0-9/+]*={0,2}$%', $_data)) return true; else return false; } static function ToUTF8($_string,$_autoDetect=true) { if($_autoDetect && function_exists("mb_detect_encoding")) { $charset = mb_detect_encoding($_string); if(strtoupper($charset) == "UTF-8" && !Encoding::IsUTF8($_string)) { $charset = ""; } if(!empty($charset)) { if(function_exists("mb_convert_encoding")) { @ini_set('mbstring.substitute_character', "none"); $_string = mb_convert_encoding($_string, "utf-8", strtoupper($charset)); } else $_string = iconv(strtoupper($charset), "utf-8" . '//IGNORE', $_string); return $_string; } } return utf8_encode($_string); } static function IsUTF8($_string) { if(function_exists("iconv")) return @iconv('utf-8', 'utf-8//IGNORE', $_string) == $_string; else return false; } static function EncryptFile($_data) { if(!function_exists("openssl_encrypt") || !function_exists("hash_hmac")) return $_data; $key = Server::$Configuration->File["gl_lzid"]; $ivlen = openssl_cipher_iv_length($cipher="AES-128-CBC"); $iv = openssl_random_pseudo_bytes($ivlen); $ciphertext_raw = openssl_encrypt($_data, $cipher, $key, $options=OPENSSL_RAW_DATA, $iv); $hmac = hash_hmac('sha256', $ciphertext_raw, $key, $as_binary=true); $_data = base64_encode( $iv.$hmac.$ciphertext_raw ); return "AES-128-CBC_" . $_data; } static function DecryptFile($_data) { if(!function_exists("openssl_encrypt") || !function_exists("hash_hmac")) return $_data; if(strpos($_data,"AES-128-CBC_") !== 0) return $_data; $key = Server::$Configuration->File["gl_lzid"]; $_data = str_replace("AES-128-CBC","",$_data); $c = base64_decode($_data); $ivlen = openssl_cipher_iv_length($cipher="AES-128-CBC"); $iv = substr($c, 0, $ivlen); $hmac = substr($c, $ivlen, $sha2len=32); $ciphertext_raw = substr($c, $ivlen+$sha2len); $original_plaintext = openssl_decrypt($ciphertext_raw, $cipher, $key, $options=OPENSSL_RAW_DATA, $iv); $calcmac = hash_hmac('sha256', $ciphertext_raw, $key, $as_binary=true); if(function_exists("hash_equals") && hash_equals($hmac, $calcmac)) return $original_plaintext; else if(!function_exists("hash_equals")) return $original_plaintext; else return null; } } class Configuration { public $File; public $Database; public static $Loaded = false; function __construct() { $this->File = array(); $this->Database = array(); } function LoadFromFile($_default=true) { global $_CONFIG; if($_default) { if(file_exists(FILE_CONFIG)) require_once(FILE_CONFIG); } $isB64 = !isset($_CONFIG["b64"]); if(!empty($_CONFIG) && is_array($_CONFIG)) foreach($_CONFIG as $key => $value) if(is_array($value) && is_int($key)) { foreach($value as $skey => $svalue) if(is_array($svalue)) foreach($svalue as $sskey => $ssvalue) $this->File[$skey][$sskey] = ($isB64) ? base64_decode($ssvalue) : $ssvalue; else $this->File[$skey] = ($isB64) ? base64_decode($svalue) : $svalue; } else if(is_array($value)) { foreach($value as $skey => $svalue) $this->File[$key][$skey] = ($isB64) ? base64_decode($svalue) : $svalue; } else $this->File[$key] = ($isB64) ? base64_decode($value) : $value; //SystemTime::SetSystemTimezone(); } function LoadFromDatabase($_extended,$_prefix,$_retries=0) { global $_CONFIG; if(!$_extended) { $serverKeys = array("gl_licl","gl_pr_nbl","gl_pr_ngl","gl_pr_csp","gl_crc3"); $result = DBManager::Execute(true, "SELECT * FROM `" . $_prefix . DATABASE_CONFIG . "` ORDER BY `key` ASC;"); while($row = DBManager::FetchArray($result)) { if(strpos($row["key"],"gl_input_list_")===0) { $this->File["gl_input_list"][str_replace("gl_input_list_","",$row["key"])] = $row["value"]; $_CONFIG[0]["gl_input_list"][str_replace("gl_input_list_","",$row["key"])] = base64_encode($row["value"]); } else if(strpos($row["key"],"gl_licl_")===0) { $_CONFIG["gl_licl"][str_replace("gl_licl_","",$row["key"])] = base64_encode($row["value"]); } else if(in_array($row["key"],$serverKeys)) { $this->File[$row["key"]] = $row["value"]; $_CONFIG[$row["key"]] = base64_encode($row["value"]); } else { $this->File[$row["key"]] = $row["value"]; $_CONFIG[0][$row["key"]] = base64_encode($row["value"]); } } if(count($this->File) < 100) { if($_retries < 3) { sleep(2); $this->LoadFromDatabase($_extended,$_prefix,++$_retries); return; } //else // Logging::DebugLog("Config read problem, settings count too low: " . count($this->File)); } else self::$Loaded = true; if(!defined("STATS_ACTIVE")) define("STATS_ACTIVE", !empty($this->File["gl_stat"])); if(!isset($this->File["gl_lcut"])) $this->File["gl_lcut"] = 0; if(!isset($_CONFIG[0]["gl_kbtf"])) $_CONFIG[0]["gl_kbtf"] = base64_encode(base64_encode(IOStruct::GetFile(PATH_TEMPLATES . "kb_footer.tpl"))); if(!isset($this->File["gl_kbtf"])) $this->File["gl_kbtf"] = base64_encode(IOStruct::GetFile(PATH_TEMPLATES . "kb_footer.tpl")); if(!isset($this->File["gl_kbth"])) $_CONFIG[0]["gl_kbth"] = base64_encode(base64_encode(IOStruct::GetFile(PATH_TEMPLATES . "kb_header.tpl"))); if(!isset($this->File["gl_kbth"])) $this->File["gl_kbth"] = base64_encode(IOStruct::GetFile(PATH_TEMPLATES . "kb_header.tpl")); SystemTime::SetSystemTimezone(); } else { if(!empty(CacheManager::$ActiveManager) && CacheManager::$ActiveManager->GetData(116,Server::$Configuration->Database,false)) return; if(!DBManager::$Connected) return; if(!empty($this->File["gl_ccac"])) $this->Database["cct"] = array(); $this->Database["gl_email"] = array(); $result = DBManager::Execute(true, "SELECT * FROM `" . $_prefix . DATABASE_MAILBOXES . "`;"); while($row = @DBManager::FetchArray($result)) $this->Database["gl_email"][$row["id"]] = new Mailbox($row); $this->Database["gl_sm"] = array(); /* $result = DBManager::Execute(false, "SELECT * FROM `" . $_prefix . DATABASE_SOCIAL_MEDIA_CHANNELS . "` ORDER BY `last_connect` ASC;"); if($result) while($row = @DBManager::FetchArray($result)) { if($row["type"] == "6") $this->Database["gl_sm"][$row["id"]] = new FacebookChannel($row["group_id"]); else if($row["type"] == "7") $this->Database["gl_sm"][$row["id"]] = new TwitterChannel($row["group_id"]); $this->Database["gl_sm"][$row["id"]]->SetValues($row); } */ $this->Database["gl_fb"] = array(); $result = DBManager::Execute(true, "SELECT * FROM `" . $_prefix . DATABASE_FEEDBACK_CRITERIA_CONFIG . "` ORDER BY `type` ASC,`id` ASC;"); if($result) while($row = @DBManager::FetchArray($result)) $this->Database["gl_fb"][$row["id"]] = new FeedbackCriteria($row); $this->Database["gl_tsd"] = array(); $result = DBManager::Execute(true, "SELECT * FROM `" . $_prefix . DATABASE_TICKET_SUBS . "` ORDER BY `id` ASC;"); if($result) while($row = @DBManager::FetchArray($result)) $this->Database["gl_tsd"][$row["id"].$row["type"].$row["parent_id"]] = new TicketSubDefinition($row); if(Is::Defined("STATS_ACTIVE")) if($result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_GOALS . "` ORDER BY `ind` ASC")) while($row = DBManager::FetchArray($result)) $this->Database["gl_go"][$row["id"]] = new Goal($row); if(!empty(CacheManager::$ActiveManager)) CacheManager::$ActiveManager->SetData(DATA_CACHE_KEY_DBCONFIG,Server::$Configuration->Database); } } static function Replace($_text) { $_text = str_replace(array("%website_name%","%SERVERNAME%"),Server::$Configuration->File["gl_site_name"],$_text); $_text = str_replace("%company_logo_url%",Server::$Configuration->File["gl_cali"],$_text); $_text = str_replace("%localdate%",date("Y-m-d"),$_text); $_text = str_replace("%localtime%",date("H:i:s"),$_text); return Server::Replace($_text,true,false); } static function GetCodeById($_id) { if(strlen($_id)==32) { $result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_CODES . "` WHERE `id`='" . DBManager::RealEscape($_id) . "';"); while($row = @DBManager::FetchArray($result)) return $row["code"]; } return null; } static function ApplyTagsToConfig($_tagList) { if(empty($_tagList)) return; if(!isset(Server::$Configuration->File["gl_tags"])) Server::$Configuration->File["gl_tags"] = ""; $ctList = explode(",",Server::$Configuration->File["gl_tags"]); $etlist = explode(",",$_tagList); $missing = ""; foreach($etlist as $tag) { if(!in_array($tag,$ctList)) { $missing .= "," . $tag; } } if(!empty($missing)) { if(!empty(Server::$Configuration->File["gl_tags"])) Server::$Configuration->File["gl_tags"] .= $missing; else Server::$Configuration->File["gl_tags"] = substr($missing,1,strlen($missing)); Server::SetConfigValue("gl_tags",Server::$Configuration->File["gl_tags"]); Server::SetConfigValue("gl_lcut",time()); CacheManager::FlushKey(DATA_CACHE_KEY_DBCONFIG); } } static function DoNotTrack() { if(!Is::Null(Cookie::Get("no_tracking"))) return true; if(isset($_SERVER['HTTP_DNT']) && !empty($_SERVER['HTTP_DNT']) && Server::$Configuration->File["gl_dnt"]) if($_SERVER['HTTP_DNT'] === "1" || strtolower($_SERVER['HTTP_DNT']) == "on") return true; return false; } } class Server { public static $Statistic; public static $Configuration; public static $Languages; public static $Countries; public static $CountryAliases; public static $Events = null; public static $Inputs; public static $Operators; public static $Groups; public static $Visitors; public static $Response; public static $Filters; public static $Chats; public static $Roles; static function CheckPhpVersion($_ist,$_ond,$_ird) { $array = explode(".",phpversion()); if($array[0] > $_ist) return true; else if($array[0] == $_ist) { if($array[1] > $_ond || ($array[1] == $_ond && $array[2] >= $_ird)) return true; return false; } return false; } static function DefineURL($_file) { $url = ""; $url_pr = ""; if(isset(Server::$Configuration->File["gl_url_detect"]) && !Server::$Configuration->File["gl_url_detect"] && isset(Server::$Configuration->File["gl_url"]) && !empty(Server::$Configuration->File["gl_url"])) { $url = Server::$Configuration->File["gl_url"]; $url_pr = str_replace(array("http:","https:"),"",strtolower(Server::$Configuration->File["gl_url"])); } else if(isset($_SERVER["HTTP_HOST"]) && !empty($_SERVER["HTTP_HOST"])) { $host = $_SERVER["HTTP_HOST"]; $path = $_SERVER["PHP_SELF"]; if(!empty($path) && !Str::EndsWith(strtolower($path),strtolower($_file)) && strpos(strtolower($path),strtolower($_file)) !== false) { if(empty(Server::$Configuration->File["gl_kbmr"])) { Logging::DebugLog(serialize($_SERVER)); exit("err 888383; can't read \$_SERVER[\"HTTP_HOST\"] and \$_SERVER[\"PHP_SELF\"]"); } } define("LIVEZILLA_DOMAIN",Communication::GetScheme() . $host); define("LIVEZILLA_DOMAIN_PR","//" . $host); $url = LIVEZILLA_DOMAIN . str_replace($_file,"",htmlentities($path,ENT_QUOTES,"UTF-8")); $url_pr = LIVEZILLA_DOMAIN_PR . str_replace($_file,"",htmlentities($path,ENT_QUOTES,"UTF-8")); } if(!Str::EndsWith($url,"/")) { $url .= "/"; $url_pr .= "/"; } $url = str_replace("/api/v2","",$url); $url_pr = str_replace("/api/v2","",$url_pr); define("LIVEZILLA_URL",$url); define("LIVEZILLA_URL_PR",$url_pr); } static function DisableMagicQuotes() { if (function_exists("get_magic_quotes_gpc") && get_magic_quotes_gpc()) { $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST); while (list($key, $val) = each($process)) { foreach ($val as $k => $v) { unset($process[$key][$k]); if (is_array($v)) { $process[$key][stripslashes($k)] = $v; $process[] = &$process[$key][stripslashes($k)]; } else { $process[$key][stripslashes($k)] = stripslashes($v); } } } unset($process); } } static function GetIdentification() { if(isset($_POST[POST_INTERN_AUTHENTICATION_CLIENT_SYSTEM_ID])) return Communication::GetParameter(POST_INTERN_AUTHENTICATION_CLIENT_SYSTEM_ID,"",$nu,FILTER_SANITIZE_SPECIAL_CHARS,null,32,false,false); else if(isset($_GET[GET_TRACK_BROWSERID])) return Communication::GetParameter(GET_TRACK_BROWSERID,"",$nu,FILTER_SANITIZE_SPECIAL_CHARS,null,32); else if(isset($_POST[POST_EXTERN_USER_BROWSERID])) return Communication::GetParameter(POST_EXTERN_USER_BROWSERID,"",$nu,FILTER_SANITIZE_SPECIAL_CHARS,null,32); return ""; } static function RunCronJobs($_fromApi,$_forceMaintain=false,$_forceEmailout=false,$_forceEmailin=false,$_forceSMin=false) { if(isset($_POST["p_shout"])) { return true; } Server::InitDataBlock(array("DBCONFIG")); $cj_maintain = (isset(Server::$Configuration->File["gl_cj_maintain"])) ? Server::$Configuration->File["gl_cj_maintain"] : 0; $cj_email_out = (isset(Server::$Configuration->File["gl_cj_email_out"])) ? Server::$Configuration->File["gl_cj_email_out"] : 0; $cj_email_in = (isset(Server::$Configuration->File["gl_cj_email_in"])) ? Server::$Configuration->File["gl_cj_email_in"] : 0; $cj_sm_in = (isset(Server::$Configuration->File["gl_cj_sm_in"])) ? Server::$Configuration->File["gl_cj_sm_in"] : 0; $cj_visitors = (isset(Server::$Configuration->File["gl_cj_visitors"])) ? Server::$Configuration->File["gl_cj_visitors"] : 0; $cj_rep_re_calc = (isset(Server::$Configuration->File["gl_rep_re_calc"])) ? Server::$Configuration->File["gl_rep_re_calc"] : 0; $action = false; if($cj_visitors < (time() - 120) || $_forceMaintain) { $action = true; Server::SetCronjobTime("gl_cj_visitors"); Server::CloseVisitorSessions(); } else if($cj_maintain < (time() - 45000) || $_forceMaintain) { $action = true; Server::SetCronjobTime("gl_cj_maintain"); require_once(LIVEZILLA_PATH . "_lib/functions.internal.optimize.inc.php"); DatabaseMaintenance::Maintain(); if(!$_fromApi) return true; } // API path violates IO security rule ("..") when loading post template; access permitted if($cj_email_out < (time() - 60) && !$_fromApi) { $action = true; Server::SetCronjobTime("gl_cj_email_out"); if(empty(Server::$Configuration->File["gl_rm_chats"]) || !empty(Server::$Configuration->File["gl_rm_chats_time"])) { Chat::CloseChats(); Communication::SendChatTranscripts(); } if(!$_fromApi) return true; } if(count(Server::$Configuration->Database["gl_email"])>0) if($cj_email_in < (time() - (120-(count(Server::$Configuration->Database["gl_email"])*20))) || $_forceEmailin) { $action = true; Server::SetCronjobTime("gl_cj_email_in"); $downloadInitiated = Communication::DownloadEmails($_fromApi); if($downloadInitiated && !$_fromApi) return true; } if(count(Server::$Configuration->Database["gl_sm"])>0) { $callTime = (120-(count(Server::$Configuration->Database["gl_sm"])*20)); $callTimeAPI = 60; if($cj_sm_in < (time() - $callTime) || ($_forceSMin && $cj_sm_in < (time() - $callTimeAPI))) { $action = true; Server::SetCronjobTime("gl_cj_sm_in"); $downloadInitiated = Communication::DownloadSocialMedia($_fromApi); if($downloadInitiated && !$_fromApi) return true; } } if((STATS_ACTIVE && !$action && $cj_rep_re_calc < (time() - StatisticProvider::$UpdateInterval))) { Server::SetCronjobTime("gl_rep_re_calc"); CacheManager::FlushKey(DATA_CACHE_KEY_STATS); Server::$Statistic = new StatisticProvider(); $report = new StatisticYear(date("Y"),0,0,0,0); $report->Update(); } return true; } static function CloseVisitorSessions() { $resultbr = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_VISITOR_BROWSERS . "` WHERE `closed`=0 AND `last_active` < " . intval(time() - Server::$Configuration->File["timeout_track"]) . ";"); if($resultbr) { while($rowbr = DBManager::FetchArray($resultbr)) { DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_VISITOR_BROWSER_URLS . "` SET `closed`=".time()." WHERE `browser_id` = '" . DBManager::RealEscape($rowbr["id"]) . "';"); DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_VISITOR_BROWSERS . "` SET `closed`=".time()." WHERE `id` = '" . DBManager::RealEscape($rowbr["id"]) . "';"); } } $resultv = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_VISITORS . "` WHERE `closed`=0 AND NOT EXISTS (SELECT * FROM `" . DB_PREFIX . DATABASE_VISITOR_BROWSERS . "` WHERE `visitor_id` = `" . DB_PREFIX . DATABASE_VISITORS . "`.`id` AND `visit_id` = `" . DB_PREFIX . DATABASE_VISITORS . "`.`visit_id` AND `closed`=0);"); if($resultv) { while($rowv = DBManager::FetchArray($resultv)) { DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_VISITORS . "` SET `closed`=".time()." WHERE `closed`=0 AND `id` = '" . DBManager::RealEscape($rowv["id"]) . "';"); } } } static function SetCronjobTime() { $key = func_get_arg(0); $time = func_num_args()>1 ? func_get_arg(1) : time(); Server::SetConfigValue($key,intval($time)); CacheManager::FlushKey(DATA_CACHE_KEY_DBCONFIG); } static function SetConfigValue($_key,$_value) { DBManager::Execute(true, "REPLACE INTO `" . DB_PREFIX . DATABASE_CONFIG . "` (`key`,`value`) VALUES ('" . DBManager::RealEscape($_key) . "','" . DBManager::RealEscape($_value) . "');"); } static function InitDataProvider($connection=false) { if(!isset(Server::$Configuration->File["gl_db_prefix"])) return false; if(!defined("DB_PREFIX")) define("DB_PREFIX",Server::$Configuration->File["gl_db_prefix"]); DBManager::$Connector = new DBManager(Server::$Configuration->File["gl_db_user"], Server::$Configuration->File["gl_db_pass"], Server::$Configuration->File["gl_db_host"],Server::$Configuration->File["gl_db_name"],Server::$Configuration->File["gl_db_prefix"]); if(!empty(Server::$Configuration->File["gl_db_ext"])) DBManager::$Extension = Server::$Configuration->File["gl_db_ext"]; if(DBManager::$Extension == "mysqli" && !function_exists("mysqli_connect")) DBManager::$Extension = "mysql"; if(DBManager::$Connector->InitConnection()) $connection = true; if($connection) { Server::$Configuration->LoadFromDatabase(false,Server::$Configuration->File["gl_db_prefix"]); if(!isset(Server::$Configuration->File["gl_caen"])) Server::$Configuration->File["gl_caen"] = 1; if(!Server::IsServerSetup() && !Is::Defined("IN_API")) Server::InitCacheManager(); } else Logging::DatabaseLog("No connection to database"); return $connection; } static function InitCacheManager() { if(CacheManager::CachingAvailable(Server::$Configuration->File["gl_caen"]) !== false) { $gttl = min(Server::$Configuration->File["poll_frequency_clients"],Server::$Configuration->File["poll_frequency_tracking"])*2; $tttl = abs(min(Server::$Configuration->File["timeout_clients"],Server::$Configuration->File["timeout_chats"])-5); $sttl = 3600; $static_ttl = 3600; CacheManager::$ActiveManager = new CacheManager(md5(Server::$Configuration->File["gl_lzid"].Server::$Configuration->File["gl_db_prefix"].Server::$Configuration->File["gl_db_pass"].Server::$Configuration->File["gl_db_user"].Server::$Configuration->File["gl_db_name"]),$gttl,array(DATA_CACHE_KEY_EVENTS=>array("EVENTS",128,$static_ttl),DATA_CACHE_KEY_OPERATORS=>array("INTERNAL",256,$tttl,true),DATA_CACHE_KEY_ROLES=>array("ROLES",128,$tttl,true),DATA_CACHE_KEY_GROUPS=>array("GROUPS",256,$static_ttl,true),DATA_CACHE_KEY_FILTERS=>array("FILTERS",128,$static_ttl,true),DATA_CACHE_KEY_DBCONFIG=>array("DBCNF",128,$static_ttl),DATA_CACHE_KEY_STATS=>array("STATS",1,$sttl,true),DATA_CACHE_KEY_DATA_TIMES=>array("DUT",1,$static_ttl))); CacheManager::$ActiveManager->Read(); } } static function UnloadDataProvider() { if(!empty(CacheManager::$ActiveManager) && !Server::IsServerSetup()) CacheManager::$ActiveManager->Close(); DBManager::Close(); } static function InitStatisticProvider() { require_once(LIVEZILLA_PATH . "_lib/objects.stats.inc.php"); Server::$Statistic = new StatisticProvider(); } static function InitDataBlock($_fields) { if(!DBManager::$Connected) return false; if(in_array("DBCONFIG",$_fields) && empty(Server::$Configuration->Database))Server::$Configuration->LoadFromDatabase(true,Server::$Configuration->File["gl_db_prefix"]); if((in_array("INTERNAL",$_fields) || in_array("GROUPS",$_fields)) && empty(Server::$Operators)) { Server::LoadInternals(); if(Is::Defined("IS_FILTERED") && FILTER_ALLOW_TICKETS && !FILTER_ALLOW_CHATS) foreach(Server::$Operators as $operator) $operator->LastActive = $operator->Status = USER_STATUS_OFFLINE; } if(in_array("LANGUAGES",$_fields) && empty(Server::$Languages))Server::LoadLanguages(); if(in_array("COUNTRIES",$_fields) && empty(Server::$Countries))Server::LoadCountries(); if(in_array("INPUTS",$_fields) && empty(Server::$Inputs))DataInput::Build(); if(in_array("FILTERS",$_fields) && empty(Server::$Filters))Server::LoadFilters(); if(DBManager::$Connected) { if(in_array("EVENTS",$_fields) && empty(Server::$Events))Server::LoadEvents(); } return true; } static function ForceUpdate($_fields) { if(in_array("FILTERS",$_fields)) { CacheManager::FlushKey(DATA_CACHE_KEY_FILTERS); Server::$Filters = array(); Server::InitDataBlock(array("FILTERS")); } if(in_array("INTERNAL",$_fields) || in_array("GROUPS",$_fields)) { CacheManager::FlushKey(DATA_CACHE_KEY_OPERATORS); CacheManager::FlushKey(DATA_CACHE_KEY_ROLES); CacheManager::FlushKey(DATA_CACHE_KEY_GROUPS); Server::$Groups = array(); Server::$Operators = array(); Server::$Roles = array(); Server::InitDataBlock(array("INTERNAL","GROUPS")); } } static function IsServerSetup() { return isset($_POST[POST_INTERN_ADMINISTRATE]) || (isset($_POST[POST_INTERN_SERVER_ACTION]) && ($_POST[POST_INTERN_SERVER_ACTION] == INTERN_ACTION_GET_ICON_LIST || $_POST[POST_INTERN_SERVER_ACTION] == INTERN_ACTION_DOWNLOAD_TRANSLATION)); } static function IsAvailable($_serverOnly=false) { if(!$_serverOnly && !empty(Server::$Configuration->File["gl_deac"])) return false; return (@file_exists(FILE_SERVER_DISABLED)) ? false : true; } static function InitConfiguration() { Server::$Configuration = new Configuration(); Server::$Configuration->LoadFromFile(); } static function LoadLanguages() { global $LANGUAGES; require_once(LIVEZILLA_PATH . "_lib/objects.languages.inc.php"); Server::$Languages = $LANGUAGES; } static function LoadCountries() { global $COUNTRIES,$COUNTRY_ALIASES; require(LIVEZILLA_PATH . "_lib/objects.countries.inc.php"); Server::$Countries = $COUNTRIES; Server::$CountryAliases = $COUNTRY_ALIASES; } static function LoadInternals() { if(DBManager::$Connected) { if(!empty(CacheManager::$ActiveManager) && CacheManager::$ActiveManager->GetData(DATA_CACHE_KEY_OPERATORS,Server::$Operators) && CacheManager::$ActiveManager->GetData(DATA_CACHE_KEY_GROUPS,Server::$Groups) && CacheManager::$ActiveManager->GetData(DATA_CACHE_KEY_ROLES,Server::$Roles)) if(is_array(Server::$Operators) && is_array(Server::$Groups) && !empty(Server::$Operators) && !empty(Server::$Groups)) { return; } $result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_OPERATORS . "` ORDER BY `bot` ASC, `firstname` ASC;"); while($row = @DBManager::FetchArray($result)) { if(!empty($row["system_id"])) { Server::$Operators[$row["system_id"]] = new Operator($row["system_id"],$row["id"]); Server::$Operators[$row["system_id"]]->SetValues($row); } } $result = DBManager::Execute(false, "SELECT * FROM `" . DB_PREFIX . DATABASE_GROUPS . "` ORDER BY `position` ASC;"); if(!$result) $result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_GROUPS . "`;"); if($result) while($row = DBManager::FetchArray($result)) if(empty(Server::$Groups[$row["id"]])) Server::$Groups[$row["id"]] = new UserGroup($row["id"],$row); $result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_PREDEFINED . "`;"); if($result) while($row = DBManager::FetchArray($result)) if(!empty(Server::$Operators[$row["internal_id"]])) Server::$Operators[$row["internal_id"]]->PredefinedMessages[strtolower($row["lang_iso"])] = new PredefinedMessage($row["lang_iso"],$row); else if(!empty(Server::$Groups[$row["group_id"]])) Server::$Groups[$row["group_id"]]->PredefinedMessages[strtolower($row["lang_iso"])] = new PredefinedMessage($row["lang_iso"],$row); if(is_array(Server::$Groups)) foreach(Server::$Groups as $group) $group->SetDefaultPredefinedMessage(); $result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_SIGNATURES . "`;"); if($result) while($row = DBManager::FetchArray($result)) if(!empty(Server::$Operators[$row["operator_id"]])) Server::$Operators[$row["operator_id"]]->Signatures[strtolower($row["id"])] = new Signature($row); else if(!empty(Server::$Groups[$row["group_id"]])) Server::$Groups[$row["group_id"]]->Signatures[strtolower($row["id"])] = new Signature($row); Server::$Roles = array(); $result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_ROLES . "` ORDER BY `name` ASC;"); while($row = @DBManager::FetchArray($result)) Server::$Roles[$row["id"]] = new Role($row); if(!Is::Defined("LOGIN") && !empty(CacheManager::$ActiveManager)) { CacheManager::$ActiveManager->SetData(DATA_CACHE_KEY_OPERATORS,Server::$Operators); CacheManager::$ActiveManager->SetData(DATA_CACHE_KEY_GROUPS,Server::$Groups); CacheManager::$ActiveManager->SetData(DATA_CACHE_KEY_ROLES,Server::$Roles); } } if(!empty($_POST["p_groups_0_id"]) && empty(Server::$Groups) && CALLER_TYPE == CALLER_TYPE_INTERNAL && !empty(Server::$Operators)) Server::$Groups["DEFAULT"] = new UserGroup("DEFAULT"); } static function LoadEvents() { if(!empty(CacheManager::$ActiveManager) && CacheManager::$ActiveManager->GetData(112,Server::$Events) && Server::$Events != null) return; Server::$Events = new EventList(); $result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_EVENTS . "` WHERE `priority`>=0 ORDER BY `priority` DESC;"); while($row = @DBManager::FetchArray($result)) { $Event = new Event($row); $result_urls = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_EVENT_URLS . "` WHERE `eid`='" . DBManager::RealEscape($Event->Id) . "';"); while($row_url = @DBManager::FetchArray($result_urls)) { $EventURL = new EventURL($row_url); $Event->URLs[$EventURL->Id] = $EventURL; } $result_funnel_urls = DBManager::Execute(true, "SELECT `ind`,`uid` FROM `" . DB_PREFIX . DATABASE_EVENT_FUNNELS . "` WHERE `eid`='" . DBManager::RealEscape($Event->Id) . "';"); while($funnel_url = @DBManager::FetchArray($result_funnel_urls)) { $Event->FunnelUrls[$funnel_url["ind"]] = $funnel_url["uid"]; } $result_actions = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_EVENT_ACTIONS . "` WHERE `eid`='" . DBManager::RealEscape($Event->Id) . "';"); while($row_action = @DBManager::FetchArray($result_actions)) { $EventAction = new EventAction($row_action); $Event->Actions[$EventAction->Id] = $EventAction; if($EventAction->Type == 2 || $EventAction->Type == 22) { $EventAction->Invitation = new Invitation(); $result_senders = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_EVENT_ACTION_SENDERS . "` WHERE `pid`='" . DBManager::RealEscape($EventAction->Id) . "' ORDER BY `priority` DESC;"); while($row_sender = @DBManager::FetchArray($result_senders)) { $InvitationSender = new EventActionSender($row_sender); $EventAction->Invitation->Senders[$InvitationSender->Id] = $InvitationSender; } } else if($EventAction->Type < 2) { $result_receivers = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_EVENT_ACTION_RECEIVERS . "` WHERE `action_id`='" . DBManager::RealEscape($EventAction->Id) . "';"); while($row_receiver = @DBManager::FetchArray($result_receivers)) $EventAction->Receivers[$row_receiver["receiver_id"]] = new EventActionReceiver($row_receiver); } } if(STATS_ACTIVE) { $result_goals = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_EVENT_GOALS . "` WHERE `event_id`='" . DBManager::RealEscape($Event->Id) . "';"); while($row_goals = @DBManager::FetchArray($result_goals)) $Event->Goals[$row_goals["goal_id"]] = new EventAction($row_goals["goal_id"],9); } Server::$Events->Events[$Event->Id] = $Event; } if(!empty(CacheManager::$ActiveManager)) CacheManager::$ActiveManager->SetData(112,Server::$Events,true); } static function LoadFilters() { if(!empty(CacheManager::$ActiveManager) && CacheManager::$ActiveManager->GetData(DATA_CACHE_KEY_FILTERS,Server::$Filters) && Server::$Filters != null) return; Server::$Filters = new FilterList(); if(DBManager::$Connected) Server::$Filters->Populate(); if(!empty(CacheManager::$ActiveManager)) CacheManager::$ActiveManager->SetData(DATA_CACHE_KEY_FILTERS,Server::$Filters,true); } static function Replace($_toReplace,$_language=true,$_config=true,$_selectLanguage=true,$_stats=false,$_quotes=false) { if($_selectLanguage) LocalizationManager::AutoLoad(); $to_replace = array(); if($_language) $to_replace["lang"] = LocalizationManager::$TranslationStrings; if($_config) $to_replace["config"] = Server::$Configuration->File; foreach($to_replace as $type => $values) if(is_array($values)) foreach($values as $short => $value) if(!is_array($value)) { if($type == "lang" && !$_stats && strpos($short,"stats_")===0) continue; if($_quotes && strpos($_toReplace,"<!--".$type."_".$short."-->")!==false) { $value = str_replace("\\'","'",$value); $value = str_replace("'","\\'",$value); } $_toReplace = str_replace("<!--".$type."_".$short."-->",$value,$_toReplace); } else foreach($value as $subKey => $subValue) { if(!is_array($subValue)) $_toReplace = str_replace("<!--".$type."_".$subKey."-->",$subValue,$_toReplace); } if($_language) for($i=1;$i<=10;$i++) $_toReplace = str_replace("<!--lang_client_custom_".str_pad($i, 2, "0", STR_PAD_LEFT)."-->","",$_toReplace); $_toReplace = str_replace("<!--website-->","",$_toReplace); $_toReplace = str_replace("%domain%",@Server::$Configuration->File["gl_site_name"],$_toReplace); if(defined("LIVEZILLA_URL")) { $_toReplace = str_replace("<!--server-->",LIVEZILLA_URL,$_toReplace); $_toReplace = str_replace("<!--server_pr-->",LIVEZILLA_URL_PR,$_toReplace); } return str_replace("<!--file_chat-->",FILE_CHAT,$_toReplace); } static function SetTimeLimit($_time) { @set_time_limit($_time); $_time = min(max(@ini_get('max_execution_time'),30),$_time); return $_time; } static function LoadLibrary($_type,$_name) { if($_type == "ZEND") { if(!defined("LIB_ZEND_LOADED")) { define("LIB_ZEND_LOADED",true); $includePath = array(); if(defined("IN_API")) $includePath[] = './../../_lib/trdp/'; else $includePath[] = './_lib/trdp/'; $includePath[] = get_include_path(); $includePath = implode(PATH_SEPARATOR,$includePath); set_include_path($includePath); require_once 'Zend/Loader.php'; } if(!defined($_name)) { define($_name,true); Zend_Loader::loadClass($_name); } } } static function SaveDBStats() { if(false && DBManager::$Connected && !Is::Defined("NO_DB_LOG") && CALLER_TYPE != CALLER_TYPE_INTERNAL) { $fdb = array(); $cqcount = DBManager::$QueryCount; $result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_CONFIG . "` WHERE `key` LIKE 'gl_db_%';"); while($result && $row = DBManager::FetchArray($result)) $fdb[$row["key"]] = $row["value"]; $qmax = (!empty($fdb["gl_db_q_max"])) ? $fdb["gl_db_q_max"] : 0; $ccount = (!empty($fdb["gl_db_c_count"]) && $fdb["gl_db_c_count"] < 1000) ? $fdb["gl_db_c_count"] : 0; $qcount = (!empty($fdb["gl_db_q_count"]) && $fdb["gl_db_c_count"] < 1000) ? $fdb["gl_db_q_count"] : $cqcount; $nqcount = (($ccount*$qcount)+$cqcount)/($ccount+1); $ccount++; DBManager::Execute(true, "REPLACE INTO `" . DB_PREFIX . DATABASE_CONFIG . "` (`key`, `value`) VALUES ('gl_db_c_count','" . intval($ccount) . "');"); DBManager::Execute(true, "REPLACE INTO `" . DB_PREFIX . DATABASE_CONFIG . "` (`key`, `value`) VALUES ('gl_db_q_count','" . $nqcount . "');"); if($cqcount > $qmax) { Logging::DebugLog($cqcount."---------------"); Logging::DebugLog(DBManager::$Queries); DBManager::Execute(true, "REPLACE INTO `" . DB_PREFIX . DATABASE_CONFIG . "` (`key`, `value`) VALUES ('gl_db_q_max','" . $cqcount . "');"); } } } static function IsPasswordAPI() { return function_exists("password_hash") && function_exists("password_verify") && defined("PASSWORD_DEFAULT"); } static function GetVisionData() { SystemTime::GetExecutionTime(); $operators = $visitors = $chats = 0; $result = DBManager::Execute(true, "SELECT count(*) AS `OPCOUNT` FROM `".DB_PREFIX.DATABASE_OPERATORS."` WHERE `last_active` > " . intval(time()-100) . ";"); if($row = DBManager::FetchArray($result)) $operators = $row["OPCOUNT"]; $result = DBManager::Execute(true, "SELECT count(*) AS `VSCOUNT` FROM `".DB_PREFIX.DATABASE_VISITORS."` WHERE `closed`=0;"); if($row = DBManager::FetchArray($result)) $visitors = $row["VSCOUNT"]; $result = DBManager::Execute(true, "SELECT count(*) AS `CHCOUNT` FROM `".DB_PREFIX.DATABASE_VISITOR_CHATS."` WHERE `chat_id`>0 AND `last_active` > " . intval(time()-100) . ";"); if($row = DBManager::FetchArray($result)) $chats = $row["CHCOUNT"]; return json_encode(array(VERSION,$operators,$visitors,$chats,SystemTime::GetExecutionTime(false))); } static function CallURL($_url,$_postData=null) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $_url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //curl_setopt($ch, CURLOPT_PROXY, "127.0.0.1:8888"); if($_postData != null) { curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS,$_postData); } curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); $output = curl_exec($ch); curl_close($ch); return $output; } } class Communication { static function DownloadSocialMedia($_fromAPI=false) { $downloadInitiated = false; if(is_array(Server::$Groups) && !empty(Server::$Configuration->Database["gl_sm"])) { $temporaryPruning = false; foreach(Server::$Groups as $gid => $group) { foreach(Server::$Configuration->Database["gl_sm"] as $channel) if($channel->GroupId == $gid && $channel->LastConnect < (time()-($channel->ConnectFrequency*60))) { $ac = $channel->SetLastConnect(time()); if($ac==0) continue; $downloadInitiated = true; $newTickets = $channel->Download(); $maxUpdateTime = array(); $dcountm = 0; foreach($newTickets as $hash => $ticket) { if(count($ticket->Messages)==0) { Logging::GeneralLog("Missing Ticket Messages: empty ticket"); Logging::GeneralLog(serialize($ticket)); continue; } $newMessageInTicket = false; $dcountm += count($ticket->Messages); $id= $groupid= $language=""; if($exists = Ticket::Exists($hash,$id,$groupid,$language)) { $ticket->Id = $id; $ticket->Group = $groupid; $ticket->Language = strtoupper($language); } else { $ticket->Id = CacheManager::GetObjectId("ticket_id",DATABASE_TICKETS); $ticket->Channel = $channel->Type; $ticket->Language = strtoupper(Server::$Configuration->File["gl_default_language"]); } if(!$exists && isset($ticket->ChannelUniqueId) && !empty($ticket->ChannelUniqueId)) $exists = Ticket::UniqueChannelIdExists($ticket->ChannelUniqueId); $ticket->Group = $gid; $tcreated = 0; $time = time(); foreach($ticket->Messages as $index => $message) { $message->Hash = $hash; $maxUpdateTime[$message->Id] = $message->Created; $tcreated = ($tcreated>0) ? min($tcreated,$message->Created):$message->Created; $message->ChannelId = $message->Id; $message->Id = (($index==0) && !$exists) ? $ticket->Id : md5($message->Id); $message->Edited = $message->Created; $message->TicketId = $ticket->Id; $message->Subject = $channel->Name; $existMessTicketId = 0; if(!TicketMessage::Exists($message->ChannelId,$existMessTicketId)) { $time = $message->Save($ticket->Id,true,null,$ticket); $newMessageInTicket = true; } else { if($existMessTicketId != $message->TicketId) { $temporaryPruning = true; } } if(!TicketMessage::Exists($message->ChannelId)) { Logging::GeneralLog("Missing Ticket Message: " . $message->TicketId . " / " . $message->ChannelId); Logging::GeneralLog(serialize($message)); } } if(!$exists) { $ticket->ChannelId = $channel->Id; $ticket->Save($hash,false); $ticket->Created = $tcreated; } if(!$exists || $newMessageInTicket) { $ticket->Reactivate(); $ticket->SetLastUpdate($time); } } arsort($maxUpdateTime); foreach($maxUpdateTime as $uid => $utime) { if($channel->Type == 6) $channel->SetLastUpdate($utime); else if($channel->Type == 7) $channel->SetLastUpdate($uid); break; } CacheManager::FlushKey(DATA_CACHE_KEY_DBCONFIG); if(!$_fromAPI) break 2; } } if($temporaryPruning) { DBManager::Execute(true, "DELETE FROM `" . DB_PREFIX . DATABASE_TICKETS . "` WHERE NOT EXISTS (SELECT * FROM `" . DB_PREFIX . DATABASE_TICKET_MESSAGES . "` WHERE `ticket_id` = `" . DB_PREFIX . DATABASE_TICKETS . "`.`id`)"); } } return $downloadInitiated; } static function DownloadEmails($_fromAPI=false,$reload=false) { $downloadInitiated = false; if(is_array(Server::$Groups)) foreach(Server::$Groups as $group) { $gmbout = Mailbox::GetById($group->TicketEmailOut); if(is_array($group->TicketEmailIn)) foreach($group->TicketEmailIn as $mid) if(!empty(Server::$Configuration->Database["gl_email"][$mid]) && Server::$Configuration->Database["gl_email"][$mid]->LastConnect < (time()-(Server::$Configuration->Database["gl_email"][$mid]->ConnectFrequency*60))) { $ac = Server::$Configuration->Database["gl_email"][$mid]->SetLastConnect(time()); if($ac==0) continue; $downloadInitiated = true; $newmails = Server::$Configuration->Database["gl_email"][$mid]->Download($reload,Server::$Configuration->Database["gl_email"][$mid]->Delete); if(!empty($newmails) && is_array($newmails)) foreach($newmails as $temail) { $temail->Email = (!empty($temail->ReplyTo)) ? $temail->ReplyTo : $temail->Email; if(TicketEmail::Exists($temail->Id)) continue; $Ticket = null; $temail->MailboxId = $mid; $temail->GroupId = $group->Id; $exists = false; if(preg_match_all("/\[[a-zA-Z\d]{12}\]/", $temail->Subject . $temail->Body . $temail->BodyHTML, $matches)) { if(empty(Server::$Configuration->File["gl_avhe"])) $temail->BodyHTML = ""; foreach($matches[0] as $match) { $id=$groupid=$language=""; if($exists=Ticket::Exists($match,$id,$groupid,$language)) { $Ticket = new Ticket($id,""); $Ticket->Load(false,true); $lastOutgoing = true; if(count($Ticket->Messages) > 0) if($Ticket->Messages[count($Ticket->Messages)-1]->Type != 1) $lastOutgoing = false; $Ticket = new Ticket($id,true); $Ticket->ChannelId = $mid; $Ticket->Group = $groupid; $Ticket->Language = strtoupper($language); $Ticket->Messages[0]->Type = (($gmbout != null && $temail->Email == $gmbout->Email) || $temail->Email == Server::$Configuration->Database["gl_email"][$mid]->Email) ? 1 : 3; $Ticket->Messages[0]->Text = $temail->Body; if(!empty(Server::$Configuration->File["gl_avhe"])) $Ticket->Messages[0]->HTML = $temail->BodyHTML; $Ticket->Messages[0]->Email = (!empty($temail->ReplyTo)) ? $temail->ReplyTo : $temail->Email; $Ticket->Messages[0]->ChannelId = $temail->Id; $Ticket->Messages[0]->Fullname = $temail->Name; $Ticket->Messages[0]->Subject = $temail->Subject; $Ticket->Messages[0]->Hash = strtoupper(str_replace(array("[","]"),"",$match)); $Ticket->Messages[0]->Created = $temail->Created; $Ticket->Messages[0]->EmailCC = $temail->CC; $Ticket->Messages[0]->Save($id,false,null,$Ticket); $Ticket->LoadStatus(); $Ticket->Reactivate(); $isClosed = $Ticket->Editor != null && $Ticket->Editor->Status == 2; $isPending = $Ticket->Editor != null && $Ticket->Editor->Status == 4; $Ticket->SetLastUpdate(time(),$lastOutgoing || $isClosed || $isPending); break; } } } if(!$exists) { if($group->TicketHandleUnknownEmails == 1) { $temail->Save(); } else if($group->TicketHandleUnknownEmails == 0) { $temail->Save(); $temail->Destroy(); $Ticket = new Ticket(CacheManager::GetObjectId("ticket_id",DATABASE_TICKETS),true); $Ticket->ChannelId = $mid; $Ticket->Group = $group->Id; $Ticket->Channel = 1; $Ticket->Language = strtoupper(Server::$Configuration->File["gl_default_language"]); $Ticket->Messages[0]->Id = $Ticket->Id; $Ticket->Messages[0]->Type = 3; $Ticket->Messages[0]->Text = $temail->Body; if(!empty(Server::$Configuration->File["gl_avhe"])) $Ticket->Messages[0]->HTML = $temail->BodyHTML; $Ticket->Messages[0]->Email = (!empty($temail->ReplyTo)) ? $temail->ReplyTo : $temail->Email; $Ticket->Messages[0]->ChannelId = $temail->Id; $Ticket->Messages[0]->Fullname = $temail->Name; $Ticket->Messages[0]->Created = $temail->Created; $Ticket->Messages[0]->Subject = $temail->Subject; $Ticket->Messages[0]->Attachments = $temail->Attachments; $Ticket->Messages[0]->EmailCC = $temail->CC; $Ticket->Messages[0]->SaveAttachments(); $Ticket->Save(); $Ticket->AutoAssignEditor(); $Ticket->SetLastUpdate(time()); LocalizationManager::AutoLoad(strtolower(Server::$Configuration->File["gl_default_language"]),true); $Ticket->SendAutoresponder(new Visitor(""),new VisitorBrowser("",false)); LocalizationManager::AutoLoad("",true); } } foreach($temail->Attachments as $attid => $attdata) { if(strpos($attdata[0],".") === false) { file_put_contents(PATH_UPLOADS . $attdata[0],$attdata[2]); $tags = (count($attdata) > 3) ? $attdata[3] : ""; KnowledgeBase::CreateEntry("SYSTEM", $attid, $attdata[0], 3, $attdata[1], 0, 100, 0,$tags); if(!$exists && $group->TicketHandleUnknownEmails == 1) $temail->SaveAttachment($attid); if(!empty($Ticket)) $Ticket->Messages[0]->ApplyAttachment($attid); } } } if($reload) Server::$Configuration->Database["gl_email"][$mid]->SetLastConnect(0); if(!$_fromAPI) return $downloadInitiated; } } return $downloadInitiated; } static function SendChatTranscripts() { $result = DBManager::Execute(false, "SELECT * FROM `" . DB_PREFIX . DATABASE_CHAT_ARCHIVE . "` WHERE `chat_type`=1 AND `endtime`>0 AND `closed`>0 AND `transcript_sent`=0 LIMIT 1;"); if($result) while($row = DBManager::FetchArray($result)) { DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_CHAT_ARCHIVE . "` SET `transcript_sent`=1 WHERE `chat_id`='" . DBManager::RealEscape($row["chat_id"]) . "' LIMIT 1;"); Communication::SendChatTranscript($row); } if(!empty(Server::$Configuration->File["gl_rm_chats"]) && Server::$Configuration->File["gl_rm_chats_time"] == 0) DBManager::Execute(true, "DELETE FROM `" . DB_PREFIX . DATABASE_CHAT_ARCHIVE . "` WHERE `transcript_sent` = '1';"); } static function SendChatTranscript($row,$_custom=false,$_customReceivers="") { if(empty($row["transcript_html"]) && empty($row["transcript_text"])) return; $receiverList = (!$_custom) ? $row["transcript_receiver"] : $_customReceivers; Server::InitDataBlock(array("INTERNAL","INPUTS")); $defmailbox = Mailbox::GetDefaultOutgoing(); $tData = array($row["transcript_text"],$row["transcript_html"]); for($i=0;$i<count($tData);$i++) { if($i == 1 && empty($tData[$i])) continue; $tData[$i] = str_replace(array("%fullname%","%efullname%"),$row["fullname"],$tData[$i]); $tData[$i] = str_replace(array("%email%","%eemail%"),$row["email"],$tData[$i]); $tData[$i] = str_replace("%rating%",Feedback::GetRatingAVG($row["chat_id"]),$tData[$i]); $subject = $row["subject"]; $customs = @unserialize($row["customs"]); $fakeSender = ""; foreach(Server::$Inputs as $index => $input) if($input->Active && $input->Custom && !isset(Server::$Groups[$row["group_id"]]->TicketInputsHidden[$index])) { $cv=""; if($input->Type == "CheckBox") $cv = ((!empty($customs[$input->Name])) ? "<!--lang_client_yes-->" : "<!--lang_client_no-->"); else if(!empty($customs[$input->Name]) || $input->Type == "ComboBox") $cv = $input->GetClientValue(@$customs[$input->Name]); $tData[$i] = str_replace("%custom".$index."%",$cv,$tData[$i]); } $tData[$i] = Server::Replace($tData[$i]); $tData[$i] = Mailbox::FinalizeDataBlock($tData[$i],$i==1); } $mailbox=null; if(!empty($row["group_id"]) && isset(Server::$Groups[$row["group_id"]]) && !empty(Server::$Groups[$row["group_id"]]->ChatEmailOut)) $mailbox = Mailbox::GetById(Server::$Groups[$row["group_id"]]->ChatEmailOut); $mailbox = (!empty($mailbox)) ? $mailbox : $defmailbox; if($mailbox != null && (!empty(Server::$Configuration->File["gl_soct"]) || $_custom) && !empty($receiverList)) Communication::SendEmail($mailbox, $receiverList, "", "", $mailbox->Email, $tData[0], $tData[1], $subject); if(!$_custom) { if(!empty(Server::$Configuration->File["gl_scto"])) { Server::InitDataBlock(array("INTERNAL")); $receivers = array(); $resulti = DBManager::Execute(true, "SELECT `user_id` FROM `" . DB_PREFIX . DATABASE_VISITOR_CHAT_OPERATORS . "` WHERE `chat_id`='" . DBManager::RealEscape($row["chat_id"]) . "' AND `ltime`=0;"); if($resulti) while($rowi = DBManager::FetchArray($resulti)) { if(!empty(Server::$Operators[$rowi["user_id"]]) && !in_array($rowi["user_id"],$receivers)) $receivers[] = $rowi["user_id"]; else continue; Communication::SendEmail($mailbox, Server::$Operators[$receivers[count($receivers) - 1]]->Email, "", "", $mailbox->Email, $tData[0], $tData[1], $subject); } } if(!empty(Server::$Configuration->File["gl_sctg"])) { Server::InitDataBlock(array("GROUPS")); Communication::SendEmail($mailbox, Server::$Groups[$row["group_id"]]->Email, "", "", $mailbox->Email, $tData[0], $tData[1], $subject); } if(!empty($mailbox) && !empty(Server::$Configuration->File["gl_scct"])) { if(!empty(Server::$Configuration->File["gl_uvec"])) { if(Mailbox::IsValidEmail($row["transcript_receiver"])) $fakeSender = $row["transcript_receiver"]; else if(Mailbox::IsValidEmail($row["email"])) $fakeSender = $row["email"]; } Communication::SendEmail($mailbox, Server::$Configuration->File["gl_scct"], "", "", $mailbox->Email, $tData[0], $tData[1], $subject, false, null, $fakeSender); } } } static function SendPushMessages() { if(!empty(Server::$Configuration->File["gl_mpm"]) && DBManager::$Connected && defined("IS_PUSH_MESSAGE")) { $count=0; $result = DBManager::Execute(false, "SELECT * FROM `" . DB_PREFIX . DATABASE_PUSH_MESSAGES . "` WHERE `sent`=0 ORDER BY `created` ASC LIMIT 10;"); if($result) { $data = array(); while($row = @DBManager::FetchArray($result)) $data = array_merge($data,array('p_app_os_' . $count => $row["device_os"], 'p_device_id_' . $count => $row["device_id"], 'p_message_type_' . $count => $row["push_key"], 'p_message_' . $count => Encoding::Base64UrlEncode($row["push_value"]), 'p_chatpartner_id_' . $count => $row["chat_partner_id"], 'p_chat_id_' . $count++ => $row["chat_id"])); DBManager::Execute(false, "UPDATE `" . DB_PREFIX . DATABASE_PUSH_MESSAGES . "` SET `sent`=1 ORDER BY `created` ASC LIMIT 10;"); if(!empty($data)) { $result = Server::CallURL(CONFIG_LIVEZILLA_PUSH, $data); if($result !== "1") handleError("116", " Push Message Error: " . $result,CONFIG_LIVEZILLA_PUSH,0); } } } } static function GetParameterAlias($_param) { if($_param == "rqst") return isset($_GET["rqst"]) ? $_GET["rqst"] : (isset($_GET["request"]) ? $_GET["request"] : ""); return ""; } static function GetSubHostParameter($_allowPost=true) { $value = ""; if(isset($_GET["ws"])) $value = strtolower(Encoding::Base64UrlDecode($_GET["ws"])); else if($_allowPost && isset($_POST["p_host"])) $value = strtolower($_POST["p_host"]); if(strpos($value,"..")===false) return $value; return ""; } static function GetScheme() { if(!empty(Server::$Configuration->File["gl_auhs"])) return SCHEME_HTTP_SECURE; if(isset(Server::$Configuration->File["gl_rhts"]) && Server::$Configuration->File["gl_rhts"] == "1") return SCHEME_HTTP_SECURE; $scheme = SCHEME_HTTP; if(!empty($_SERVER["HTTPS"]) && $_SERVER["HTTPS"]!="off") $scheme = SCHEME_HTTP_SECURE; else if(!empty($_SERVER["HTTP_X_HTTPS"]) && (strtolower($_SERVER["HTTP_X_HTTPS"])=="on" || $_SERVER["HTTP_X_HTTPS"]=="1")) $scheme = SCHEME_HTTP_SECURE; else if(!empty($_SERVER["HTTP_X_FORWARDED_PROTO"]) && strtolower($_SERVER["HTTP_X_FORWARDED_PROTO"]) == "https") $scheme = SCHEME_HTTP_SECURE; else if(!empty($_SERVER["SERVER_PORT"]) && $_SERVER["SERVER_PORT"] == 443) $scheme = SCHEME_HTTP_SECURE; else if(!empty($_SERVER["HTTP_SSL"]) && ($_SERVER["HTTP_SSL"] === true || $_SERVER["HTTP_SSL"] == "TRUE")) $scheme = SCHEME_HTTP_SECURE; else if(!empty($_SERVER["HTTP_CF_VISITOR"]) && strpos(strtolower($_SERVER["HTTP_CF_VISITOR"]),"https") !== false) $scheme = SCHEME_HTTP_SECURE; return $scheme; } static function GetIP($_dontmask=false,$_forcemask=false,$_hashed=false,$ip="") { $params = array(@Server::$Configuration->File["gl_sipp"]); foreach($params as $param) if(!empty($_SERVER[$param])) { $ipf = $_SERVER[$param]; if(strpos($ipf,",") !== false) { $parts = explode(",",$ipf); foreach($parts as $part) if(substr_count($part,".") == 3 || substr_count($part,":") >= 3) $ip = trim($part); } else if(substr_count($ipf,".") == 3 || substr_count($ipf,":") >= 3) $ip = trim($ipf); } if(empty($ip)) $ip = $_SERVER["REMOTE_ADDR"]; if((empty(Server::$Configuration->File["gl_maskip"]) || $_dontmask) && !$_forcemask) return $ip; else if(substr_count($ip,".")>2 || substr_count($ip,":")>3) { $hash = false; $masktype = !empty(Server::$Configuration->File["gl_miat"]) ? Server::$Configuration->File["gl_miat"] : 0; if($masktype==3) $hash = $masktype = 1; $split = (substr_count($ip,".") > 0) ? "." : ":"; $parts = explode($split,$ip); $val=""; for($i=0;$i<count($parts)-($masktype+1);$i++) $val .= $parts[$i].$split; for($i=0;$i<=$masktype;$i++) $val .= $split . "xxx"; $val = str_replace("..",".",$val); $val = str_replace("::",":",$val); if($hash) $val = strtoupper(substr(md5($val),10,10)); return $val; } if($_hashed) return md5($ip); return $ip; } static function GetHost() { $ip = Communication::GetIP(true); $host = @utf8_encode(@gethostbyaddr($ip)); if(Server::$Configuration->File["gl_maskip"]) $host = str_replace($ip,Communication::GetIP(),$host); return $host; } static function ReadParameter($_key, $_fallBack=null,$_b64encoded=true) { $types["hex"] = array("esc","etc","epc","echc","ovlc","ovlch","ovlct","ovlsc","fbshc","ecsgs","ecsge","ecsc","ecfs","ecfe"); $types["int"] = array("pc","fbt","ovlts","h","po","cid","tc","echsp","echp","ovlsx","ovlsy","ovlsb","deactr","fbshb","fbshx","fbshy","fbml","fbmt","fbmr","fbmb","fbw","fbh","ovlp","ovlw","ovlh","ovlbr","ovlml","ecw","ech","cid","ecslw","ecmb","ecfo"); $types["bool"] = array("ovltwo","hcgs","htgs","rgs","dl","ovlif"); $types["url"] = array("eci","ecio"); $types["isolang"] = array("ptl"); if(in_array($_key,$types["hex"])) { return Communication::GetParameter($_key,$_fallBack,$nu,FILTER_VALIDATE_REGEXP,array("options"=>array("regexp"=>FILTER_VALIDATE_REGEXP_HEXCOLOR))); } else if(in_array($_key,$types["int"])) { return Communication::GetParameter($_key,$_fallBack,$nu,FILTER_VALIDATE_INT,null,0,$_b64encoded,$_b64encoded); } else if(in_array($_key,$types["url"])) { return Communication::GetParameter($_key,$_fallBack,$nu,FILTER_SANITIZE_URL); } else if(in_array($_key,$types["bool"])) { return !empty($_REQUEST[$_key]); } else if(in_array($_key,$types["isolang"])) { if(isset($_REQUEST[$_key]) && strlen($_REQUEST[$_key]) <= 5 && strlen($_REQUEST[$_key]) >= 1) return $_REQUEST[$_key]; return $_fallBack; } else // default san str pass thru { return Communication::GetParameter($_key,$_fallBack,$nu,FILTER_SANITIZE_SPECIAL_CHARS,null,0,$_b64encoded,$_b64encoded); } } static function GetParameter($_key,$_default,&$_changed=false,$_filter=null,$_filteropt=array(),$_maxlen=0,$_dbase64=true,$_dbase64Url=true,$_ebase64=false,$_ebase64Url=false) { if(isset($_REQUEST[$_key])) { if($_dbase64Url) $value = Encoding::Base64UrlDecode($_REQUEST[$_key]); else if($_dbase64) $value = base64_decode($_REQUEST[$_key]); else $value = $_REQUEST[$_key]; if($value != $_default) $_changed = true; } else if(isset($_SERVER[$_key])) { if($_SERVER[$_key] != $_default) $_changed = true; $value = $_SERVER[$_key]; } else return $_default; $value = IOStruct::FilterParameter($value,$_default,$_filter,$_filteropt,$_maxlen); if($_ebase64Url) return Encoding::Base64UrlEncode($value); if($_ebase64) return base64_encode($value); return $value; } static function SendEmail($_account, $_email, $_emailcc, $_emailbcc, $_replyto, $_bodyText, $_bodyHTML, $_subject = "", $_test = false, $_attachments = null, $_fakeSender = "", $_senderName = "") { if($_account == null) $_account=Mailbox::GetDefaultOutgoing(); if($_account == null) return null; $_bodyText = correctLineBreaks($_bodyText); require_once(LIVEZILLA_PATH . "_lib/objects.mail.inc.php"); Logging::SecurityLog("Communication::SendMail",$_subject . " / " . $_bodyText); if(Logging::IsMailFlood()) return null; $mailer = new MailSystem($_account, $_email, $_replyto, trim($_bodyText), trim($_bodyHTML), $_subject, $_test, $_attachments); $mailer->SenderName = $_senderName; $mailer->CC = $_emailcc; $mailer->BCC = $_emailbcc; $mailer->SendEmail($_fakeSender); return $mailer->Result; } static function GetTargetParameters() { $parameters = array("exclude"=>null,"include_group"=>null,"include_user"=>null); if(isset($_GET[GET_EXTERN_HIDDEN_GROUPS])) { $groups = Encoding::Base64UrlDecode($_GET[GET_EXTERN_HIDDEN_GROUPS]); if(strlen($groups) > 1) $parameters["exclude"] = explode("?",$groups); if(isset($_GET["group"])) $parameters["include_group"] = array(urldecode($_GET["group"])); if(isset($_GET["operator"])) $parameters["include_user"] = Operator::ReadParams(); if(strlen($groups) == 1 && is_array(Server::$Groups)) foreach(Server::$Groups as $gid => $group) if(!@in_array($gid,$parameters["include_group"])) $parameters["exclude"][] = $gid; } return $parameters; } static function GetTargetParameterString($_getParams="",$_allowed=null) { foreach($_GET as $key => $value) if($key != "template" && !($_allowed != null && !isset($_allowed[$key]))) { $value = urldecode($value); if($value != "") $_getParams.=((strlen($_getParams) == 0) ? $_getParams : "&") . urlencode($key) ."=" . urlencode($value); } return $_getParams; } static function GetTargetParameterArray($_allowed=null) { $list = array(); foreach($_GET as $key => $value) if(!($_allowed != null && !isset($_allowed[$key]))) { if($value != "") $list[$key] = $value; } return $list; } static function GetTargetParameterForm($_getParams="",$_allowed) { foreach($_GET as $key => $value) if(isset($_allowed[$key])) { $value = urlencode($value); $_getParams.= "<input type=\"hidden\" name=\"".$key."\" value=\"".$value."\">"; } return $_getParams; } static function CallUserAPI($_url,$_data) { $response = Server::CallURL($_url,$_data); if(empty($response)) { handleError("128", "Error connecting USER API: " . $_url . " (" . $response . ")","",0); return null; } if(!empty($response) && is_object(json_decode($response))) return $response; else handleError("129", "Error connecting USER API, invalid response: " . $_url . " (" . $response . ")","",0); return null; } } class Colors { static function CorrectHEX($_hex,$_hash=false){ $_hex = str_replace("#", "", $_hex); if(strlen($_hex)>6) return '#000000'; if(strlen($_hex)==3) $_hex = $_hex.$_hex; if($_hash) return "#".$_hex; return $_hex; } static function TransformHEX($_color,$_change=30,$rgb="") { $_color = Colors::CorrectHEX($_color,false); if(strlen($_color) != 6) return "#000000"; for ($x=0;$x<3;$x++) { $c = hexdec(substr($_color,(2*$x),2)) - $_change; $c = ($c < 0) ? 0 : dechex($c); $rgb .= (strlen($c) < 2) ? "0".$c : $c; } return "#".$rgb; } static function TransformBrightness($_hex, $_perc) { $hslc = Colors::TransformHexToHSL($_hex); $val = ((1-$hslc["L"])*100)*$_perc; if($val) { $hslc['L'] = ($hslc['L'] * 100) + $val; $hslc['L'] = ($hslc['L'] > 100) ? 1 : $hslc['L']/100; } else $hslc['L'] += (1-$hslc['L'])/2; return Colors::TransformHSLToHex($hslc); } static function TransformHexToHSL($_col,$h=0) { $_col = Colors::CorrectHEX($_col,false); $R = hexdec($_col[0].$_col[1]); $G = hexdec($_col[2].$_col[3]); $B = hexdec($_col[4].$_col[5]); $hsl_array = array(); $var_R = ($R/255); $var_G = ($G/255); $var_B = ($B/255); $var_Min = min($var_R, $var_G, $var_B); $var_Max = max($var_R, $var_G, $var_B); $del_Max = $var_Max - $var_Min; $l = ($var_Max + $var_Min)/2; if ($del_Max == 0) { $h = 0; $s = 0; } else { if($l < 0.5) $s = $del_Max /($var_Max + $var_Min); else $s = $del_Max /(2-$var_Max-$var_Min); $del_R = ((($var_Max - $var_R)/6) + ($del_Max/2))/$del_Max; $del_G = ((($var_Max - $var_G)/6) + ($del_Max/2))/$del_Max; $del_B = ((($var_Max - $var_B)/6) + ($del_Max/2))/$del_Max; if($var_R == $var_Max) $h = $del_B - $del_G; else if($var_G == $var_Max) $h = (1/3) + $del_R - $del_B; else if($var_B == $var_Max) $h = (2/3) + $del_G - $del_R; if($h<0) $h++; if($h>1) $h--; } $hsl_array['H'] = ($h*360); $hsl_array['S'] = $s; $hsl_array['L'] = $l; return $hsl_array; } static function TransformHSLToHex($_chsl) { list($H,$S,$L) = array( $_chsl['H']/360,$_chsl['S'],$_chsl['L'] ); if( $S == 0 ) { $r = $L * 255; $g = $L * 255; $b = $L * 255; } else { if($L<0.5) $var_2 = $L*(1+$S); else $var_2 = ($L+$S) - ($S*$L); $var_1 = 2 * $L - $var_2; $r = round(255 * Colors::TransformHueToRGB( $var_1, $var_2, $H + (1/3) )); $g = round(255 * Colors::TransformHueToRGB( $var_1, $var_2, $H )); $b = round(255 * Colors::TransformHueToRGB( $var_1, $var_2, $H - (1/3) )); } $r = dechex($r); $g = dechex($g); $b = dechex($b); $r = (strlen("".$r)===1) ? "0".$r:$r; $g = (strlen("".$g)===1) ? "0".$g:$g; $b = (strlen("".$b)===1) ? "0".$b:$b; return "#".$r.$g.$b; } static function TransformHueToRGB($_1,$_2,$_h) { if($_h<0) $_h += 1; if($_h > 1) $_h -= 1; if((6*$_h) < 1) return ($_1 + ($_2 - $_1) * 6 * $_h); if((2*$_h) < 1) return $_2; if((3*$_h) < 2) return ($_1 + ($_2-$_1) * ((2/3)-$_h) * 6); return $_1; } static function TransformHEXToRGB($_hex) { $_hex = str_replace("#", "", $_hex); if(strlen($_hex) == 3) { $r = hexdec(substr($_hex,0,1).substr($_hex,0,1)); $g = hexdec(substr($_hex,1,1).substr($_hex,1,1)); $b = hexdec(substr($_hex,2,1).substr($_hex,2,1)); } else { $r = hexdec(substr($_hex,0,2)); $g = hexdec(substr($_hex,2,2)); $b = hexdec(substr($_hex,4,2)); } $rgb = array($r, $g, $b); return $rgb; } } class BaseObject { public $Id; public $Created; public $Edited; public $Creator; public $Editor; public $Status; public $Fullname; public $Company; public $Phone; public $Question; public $Email; public $Customs; public $IP; public $MaxChats = 9999; public $MaxChatAmount = 9999; public $MaxChatsStatus = GROUP_STATUS_BUSY; function GetInputData($_inputIndex,$_chat=true) { $data = array(111=>$this->Fullname,112=>$this->Email,113=>$this->Company,114=>$this->Question,116=>$this->Phone); if(isset($data[$_inputIndex])) $value = $data[$_inputIndex]; else if(isset($this->Customs[$_inputIndex])) $value = $this->Customs[$_inputIndex]; else return ""; if(isset(Server::$Operators[CALLER_SYSTEM_ID])) { $lvl = Server::$Operators[CALLER_SYSTEM_ID]->GetInputMaskLevel($_inputIndex,$_chat); if($lvl > 0) return OperatorRequest::MaskData($value,$lvl); } return $value; } function IsMaxChatAmount() { return ($this->MaxChatAmount < 9999 && $this->MaxChatAmount > -1); } } class Action extends BaseObject { public $URL = ""; public $ReceiverUserId; public $ReceiverBrowserId; public $SenderSystemId; public $SenderUserId; public $SenderGroupId; public $Text; public $BrowserId; public $Status; public $TargetFile; public $Extension; public $Created; public $Displayed; public $Accepted; public $Declined; public $Closed; public $Exists; public $EventActionId = ""; } class Post extends BaseObject { public $Receiver; public $ReceiverGroup; public $ReceiverOriginal; public $Sender; public $SenderName; public $Persistent = false; public $Repost = false; public $ChatId; public $Translation = ""; public $TranslationISO = ""; public $HTML; public $Received; public $BrowserId = ""; public $Micro = 0; public $APIObject = null; public $Whisper = false; function __construct() { if(func_num_args() == 1) { $row = func_get_arg(0); $this->Id = $row["id"]; $this->Sender = $row["sender"]; $this->SenderName = $row["sender_name"]; $this->Receiver = $row["receiver"]; $this->ReceiverOriginal = $row["receiver_original"]; $this->ReceiverGroup = $row["receiver_group"]; $this->Received = !empty($row["received"]); $this->Text = $row["text"]; $this->Created = $row["time"]; $this->ChatId = $row["chat_id"]; $this->Repost = !empty($row["repost"]); $this->Translation = $row["translation"]; $this->TranslationISO = $row["translation_iso"]; $this->BrowserId = $row["browser_id"]; $this->Micro = $row["micro"]; $this->Whisper = $row["whisper"]==1; } else if(func_num_args() >= 4) { $this->Id = func_get_arg(0); $this->Sender = func_get_arg(1); $this->Receiver = $this->ReceiverOriginal = func_get_arg(2); $this->Text = func_get_arg(3); $this->Created = func_get_arg(4); $this->ChatId = func_get_arg(5); $this->SenderName = func_get_arg(6); } } function GetXml() { $translation = (!empty($this->Translation)) ? " tr=\"".base64_encode($this->Translation)."\" triso=\"".base64_encode($this->TranslationISO)."\"" : ""; return "<val id=\"".base64_encode($this->Id)."\" w=\"".base64_encode(($this->Whisper) ? 1 : 0)."\" rp=\"".base64_encode(($this->Repost) ? 1 : 0)."\" sen=\"".base64_encode($this->Sender)."\" m=\"".base64_encode($this->Micro)."\" rec=\"".base64_encode($this->ReceiverGroup)."\" reco=\"".base64_encode($this->ReceiverOriginal)."\" date=\"".base64_encode($this->Created)."\"".$translation.">".base64_encode($this->Text)."</val>\r\n"; } function GetStatusXml($_received, $_noticed) { return "<su i=\"".base64_encode($this->Id)."\" re=\"".base64_encode($this->ReceiverOriginal)."\" r=\"".base64_encode($_received ? 1 : 0)."\" n=\"".base64_encode($_noticed ? 1 : 0)."\" />"; } function GetCommand($_name) { if($this->Repost && empty($_name)) $_name = LocalizationManager::$TranslationStrings["client_guest"]; if(!empty($this->Translation)) return "lz_chat_add_internal_text(\"".base64_encode($this->Translation."<div class=\"lz_message_translation\">".$this->Text."</div>")."\" ,\"".base64_encode($this->Id)."\",\"".base64_encode($_name)."\", ".To::BoolString($this->Repost).");"; else return "lz_chat_add_internal_text(\"".base64_encode($this->Text)."\" ,\"".base64_encode($this->Id)."\",\"".base64_encode($_name)."\", ".To::BoolString($this->Repost).");"; } function Save($_mTime=0) { if($_mTime==0) { $_mTime = SystemTime::GetMicroTime(); $this->Created = $_mTime[1]; } if($this->Receiver==$this->ReceiverOriginal && isset(Server::$Operators[$this->Receiver]) && !empty(Server::$Operators[$this->Receiver]->AppDeviceId) && Server::$Operators[$this->Receiver]->AppBackgroundMode) Server::$Operators[$this->Receiver]->AddPushMessage("", $this->Sender, $this->SenderName, 1, strip_tags($this->Text)); DBManager::Execute(true, "INSERT INTO `" . DB_PREFIX . DATABASE_POSTS . "` (`id`,`chat_id`,`time`,`micro`,`sender`,`receiver`,`receiver_group`,`receiver_original`,`text`,`translation`,`translation_iso`,`received`,`persistent`,`repost`,`sender_name`,`browser_id`,`api_obj`,`whisper`) VALUES ('" . DBManager::RealEscape($this->Id) . "','" . DBManager::RealEscape($this->ChatId) . "'," . DBManager::RealEscape($this->Created) . "," . DBManager::RealEscape($_mTime[0]) . ",'" . DBManager::RealEscape($this->Sender) . "','" . DBManager::RealEscape($this->Receiver) . "','" . DBManager::RealEscape($this->ReceiverGroup) . "','" . DBManager::RealEscape($this->ReceiverOriginal) . "','" . DBManager::RealEscape($this->Text) . "','" . DBManager::RealEscape($this->Translation) . "','" . DBManager::RealEscape($this->TranslationISO) . "','" . DBManager::RealEscape($this->Received ? 1 : 0) . "','" . DBManager::RealEscape($this->Persistent ? 1 : 0) . "','" . DBManager::RealEscape($this->Repost ? 1 : 0) . "','" . DBManager::RealEscape($this->SenderName) . "','" . DBManager::RealEscape($this->BrowserId) . "','" . DBManager::RealEscape($this->APIObject != null ? json_encode($this->APIObject) : '') . "','" . DBManager::RealEscape($this->Whisper ? 1 : 0) . "');"); } function SaveHistory($type = 0,$iid="",$gid="") { if(strpos($this->Text,"[__[invite_info:")!==false) return; $id = ""; $baseId = date("Y").date("m").date("d"); if(isset(Server::$Operators[$this->Sender]) && isset(Server::$Operators[$this->Receiver])) { $type = 0; $id = $baseId.strtoupper(min($this->Sender,$this->Receiver).max($this->Sender,$this->Receiver)); $iid = min($this->Sender,$this->Receiver)."-".max($this->Sender,$this->Receiver); } else if(isset(Server::$Groups[$this->Receiver]) || GROUP_EVERYONE_INTERN == $this->Receiver) { $type = 2; $id = $baseId.strtoupper($this->Receiver); $gid = $this->Receiver; } if($type != 1) { $id = strtoupper(substr(md5($id),0,10)); $cf = new Chat(); if(($result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_CHAT_ARCHIVE . "` WHERE `chat_id`='" . DBManager::RealEscape($id) . "';")) && $row = DBManager::FetchArray($result)) DBManager::Execute(true, "REPLACE INTO `" . DB_PREFIX . DATABASE_CHAT_ARCHIVE . "` (`time`, `endtime`, `closed`, `chat_id`, `external_id`, `fullname`, `internal_id`, `group_id`, `area_code`, `html`, `plaintext`, `transcript_text`, `transcript_html`, `email`, `company`, `phone`, `call_me_back`, `iso_language`, `iso_country`, `host`, `ip`, `gzip`, `transcript_sent`, `transcript_receiver`, `question`, `customs`, `subject`, `ticket_id`, `wait`, `duration`, `accepted`, `ended`, `chat_type`, `ref_url`) VALUES (" . $row["time"] . "," . time() . "," . $row["closed"] . ",'" . DBManager::RealEscape($id) . "','','','" . DBManager::RealEscape($iid) . "','" . DBManager::RealEscape($gid) . "','','" . DBManager::RealEscape($row["html"] . $cf->GetHTMLPost($this->Text, "", time(), $this->SenderName, $this->Sender)) . "','" . DBManager::RealEscape($row["plaintext"] . "\n" . $cf->GetPlainPost($this->Text, "", time(), $this->SenderName)) . "','', '', '', '', '', '0', '', '', '', '', '0', '1', '', '', '', '', '', '0', '0', '0', '0', ".intval($type).", '');"); else { $stmt = DBManager::GetStatement("INSERT INTO `" . DB_PREFIX . DATABASE_CHAT_ARCHIVE . "` (`time`, `endtime`, `closed`, `chat_id`, `external_id`, `fullname`, `internal_id`, `group_id`, `area_code`, `html`, `plaintext`, `transcript_text`, `transcript_html`, `email`, `company`, `phone`, `call_me_back`, `iso_language`, `iso_country`, `host`, `ip`, `gzip`, `transcript_sent`, `transcript_receiver`, `question`, `customs`, `subject`, `ticket_id`, `wait`, `duration`, `accepted`, `ended`, `chat_type`, `ref_url`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);"); $bi = 0; $bs = ''; $one = 1; $plain = $cf->GetHTMLPost($this->Text, "", time(), $this->SenderName, $this->Sender); $html = $cf->GetPlainPost($this->Text, "", time(), $this->SenderName); $ti = time(); $stmt->bind_param("iiisssssssssssssissssiisssssiiiiis",$ti,$ti,$bi,$id,$bs,$bs,$iid,$gid,$bs,$plain,$html,$bs,$bs,$bs,$bs,$bs,$bi,$bs,$bs,$bs,$bs,$bi,$one,$bs,$bs,$bs,$bs,$bs,$bi,$bi,$bi,$bi,$type,$bs); DBManager::ExecutePrepared($stmt); if(!empty($stmt->error)) Logging::DatabaseLog($stmt->error); $stmt->close(); } } } function UpdatePostStatus($_systemId,$_noticed=false) { DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_POSTS . "` SET `noticed`=".intval($_noticed ? 1 : 0).",`received`='1',`persistent`='0',`updated`=".time()." WHERE `id`='" . DBManager::RealEscape($this->Id) . "' AND `receiver`='" . DBManager::RealEscape($_systemId) . "';"); } function SetAPIObject($_obj) { DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_POSTS . "` SET `api_obj`='".DBManager::RealEscape(json_encode($_obj))."' WHERE `id`='" . DBManager::RealEscape($this->Id) . "';"); } static function GetLastAPIObject($_chatId,$_type) { $brwsid = $_type == "request" ? "!=''" : "=''"; if($result = DBManager::Execute(true, $d="SELECT `api_obj` FROM `" . DB_PREFIX . DATABASE_POSTS . "` WHERE `api_obj`!='' AND `browser_id`".$brwsid." AND `chat_id`='".DBManager::RealEscape($_chatId)."' ORDER BY `time` DESC, `micro` DESC LIMIT 1;")) if($row = DBManager::FetchArray($result)) if(!empty($row["api_obj"])) return json_decode($row["api_obj"]); return null; } static function ProcessPostForExternal($_operator,$_postId,$rec,$recgroup,$post,$time,$_group,$_translation,$_translationISO,$_whisper=false) { if(STATS_ACTIVE) Server::$Statistic->ProcessAction(ST_ACTION_INTERNAL_POST); $external = false; if(!empty($_operator->ExternalChats[$rec]) && $_group) { $_operator->ExternalChats[$rec]->Load(); $_operator->ExternalChats[$rec]->Members[$rec] = true; $chatId = $_operator->ExternalChats[$rec]->ChatId; $receiverlist = $_operator->ExternalChats[$rec]->Members; $external = true; } else { $chatId = CacheManager::GetValueBySystemId($rec,"chat_id",""); $receiverlist = array($rec=>$rec); } $opname = $_operator->Fullname; if(isset(Server::$Configuration->File["gl_sfnc"]) && Server::$Configuration->File["gl_sfnc"] === "0") $opname = $_operator->Firstname; $npost = new Post($_postId,$_operator->SystemId,"",$post,$time,$chatId,$opname); foreach($receiverlist as $systemid => $member) { if($_whisper && strpos($systemid,"_") !== false) continue; if($systemid==$_operator->SystemId || !empty($member->Declined)) continue; if(!empty(Server::$Operators[$systemid]) && !empty(Server::$Groups[$recgroup]->Members[$systemid])) continue; $npost->Receiver = $systemid; $npost->Persistent = false; $npost->Translation = $_translation; $npost->TranslationISO = $_translationISO; $npost->ReceiverGroup = $recgroup; $npost->ReceiverOriginal = $rec; $npost->Whisper = $_whisper; $npost->Save(); } if(!$_whisper && $external && !empty($_operator->ExternalChats[$rec]->Subject) && strpos($_operator->ExternalChats[$rec]->VisitId,"A_") === 0) { Server::CallURL($_operator->ExternalChats[$rec]->Subject,array("p_chat_id"=>$chatId,"p_text"=>$post)); } } } class Message { public $ChatId; public $Text; function __construct() { } } class Chat extends BaseObject { public $Closed = 0; public $ChatId; public $TimeStart; public $TimeEnd; public $Language; public $OperatorId; public $VisitorId; public $Group; public $PlainText = ""; public $HTML = ""; public $Fullname = ""; public $Email = ""; public $Company = ""; public $Phone = ""; public $IP = ""; public $Question = ""; public $FirstPost; public $Host; public $AreaCode; public $Country; public $ChatType = 1; public $Wait; public $Duration; public $Accepted; public $ElementCount = 0; public $TicketId; public $Ended; public $CallMeBack; public $ReferenceURL = ""; public $Tags = ""; public $Customs; function __construct() { if(func_num_args() == 1) $this->Id = func_get_arg(0); } function Load() { $result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_CHAT_ARCHIVE . "` WHERE `chat_id`='" . DBManager::RealEscape($this->ChatId) . "' AND `closed`>0 LIMIT 1;"); if($result && $row = DBManager::FetchArray($result)) $this->SetValues($row); } function SetValues($_row,$_api=false) { $this->ChatId = $_row["chat_id"]; $this->Tags = $_row["tags"]; $this->TimeStart = $_row["time"]; $this->TimeEnd = max($_row["closed"],$_row["endtime"]); $this->Closed = $_row["closed"]; if($_row["chat_type"]==1 && $_api) $this->OperatorId = Operator::GetUserId($_row["internal_id"]); else $this->OperatorId = $_row["internal_id"]; $this->Language = strtoupper($_row["iso_language"]); $this->VisitorId = $_row["external_id"]; $this->Group = $_row["group_id"]; $this->HTML = $_row["html"]; $this->PlainText = $_row["plaintext"]; $this->IP = $_row["ip"]; $this->Fullname = $_row["fullname"]; $this->Question = $_row["question"]; $this->Email = $_row["email"]; $this->Company = $_row["company"]; $this->Phone = $_row["phone"]; $this->ChatType = $_row["chat_type"]; $this->Country = $_row["iso_country"]; $this->Accepted = $_row["accepted"]; $this->Wait = $_row["wait"]; $this->Duration = $_row["duration"]; $this->Ended = $_row["ended"]; $this->Host = $_row["host"]; $this->TicketId = $_row["ticket_id"]; $this->AreaCode = $_row["area_code"]; $this->CallMeBack = $_row["call_me_back"]; $this->CallMeBack = $_row["call_me_back"]; $this->Customs = (!empty($_row["customs"])) ? @unserialize($_row["customs"]) : array(); $this->ReferenceURL = $_row["ref_url"]; } function GetXML($_permission,$_plain=true,$_showReduced=true,$xml="") { if($_permission || $_showReduced) { $xml = "<c full=\"".base64_encode("true")."\" u=\"".base64_encode($this->ReferenceURL)."\" q=\"".base64_encode($this->Question)."\" t=\"".base64_encode($this->ChatType)."\" ta=\"".base64_encode($this->Tags)."\" cid=\"".base64_encode($this->ChatId)."\" tid=\"".base64_encode($this->TicketId)."\" iid=\"".base64_encode($this->OperatorId)."\" gid=\"".base64_encode($this->Group)."\" cmb=\"".base64_encode($this->CallMeBack)."\" eid=\"".base64_encode($this->VisitorId)."\" en=\"".base64_encode($this->Fullname)."\" ts=\"".base64_encode($this->TimeStart)."\" cl=\"".base64_encode($this->Closed)."\" te=\"".base64_encode($this->TimeEnd)."\" em=\"".base64_encode($this->Email)."\" cp=\"".base64_encode($this->Phone)."\" ac=\"".base64_encode($this->AreaCode)."\" co=\"".base64_encode($this->Company)."\" il=\"".base64_encode($this->Language)."\" ic=\"".base64_encode($this->Country)."\" ho=\"".base64_encode($this->Host)."\" ip=\"".base64_encode($this->IP)."\" wt=\"".base64_encode($this->Wait)."\" dt=\"".base64_encode($this->Duration)."\" sr=\"".base64_encode($this->Accepted)."\" er=\"".base64_encode($this->Ended)."\">\r\n"; if($_permission) { $html = "<div>" .$this->HTML. "</div>"; $xml .= "<chtml>".base64_encode($html)."</chtml>\r\n"; if($_plain) $xml .= "<cplain>".base64_encode($this->PlainText)."</cplain>\r\n"; if(!empty($this->Customs)) foreach($this->Customs as $custname => $value) foreach(Server::$Inputs as $input) if($input->Name == $custname && $input->Active && $input->Custom) $xml .= "<cc cuid=\"".base64_encode($custname)."\">".base64_encode($input->GetClientValue($value))."</cc>\r\n"; } $xml .= "</c>\r\n"; } return $xml; } function Permission($_operatorId) { $permission = false; if(isset(Server::$Operators[$_operatorId])) { if($this->ChatType=="1") $permission = (Server::$Operators[$_operatorId]->GetPermission(2) == PERMISSION_FULL || (Server::$Operators[$_operatorId]->GetPermission(2) == PERMISSION_NONE && $_operatorId == $this->OperatorId) || (Server::$Operators[$_operatorId]->GetPermission(2) == PERMISSION_RELATED && in_array($this->Group,Server::$Operators[$_operatorId]->GetGroupList(true)))); else if($this->ChatType=="2") $permission = (Server::$Operators[$_operatorId]->GetPermission(36) == PERMISSION_FULL || (in_array($this->Group,Server::$Operators[$_operatorId]->GetGroupList(true)) || GROUP_EVERYONE_INTERN == $this->Group)); else if($this->ChatType=="0") $permission = (Server::$Operators[$_operatorId]->GetPermission(36) == PERMISSION_FULL || (strpos($this->OperatorId,$_operatorId)!==false)); } return $permission; } function GetPlainPost($_post,$_translation,$_time,$_senderName) { $post = (empty($_translation)) ? $_post : $_translation." (".$_post.")"; $post = str_replace("<br>","\r\n",trim($post)); preg_match_all("/<a.*href=\"([^\"]*)\".*>(.*)<\/a>/iU", $post, $matches); $count = 0; foreach($matches[0] as $match) { if(strpos($matches[1][$count],"javascript:")===false) $post = str_replace($matches[0][$count],$matches[2][$count] . " (" . $matches[1][$count].") ",$post); $count++; } $post = html_entity_decode(strip_tags($post),ENT_COMPAT,"UTF-8"); return "| " . date("d.m.Y H:i:s",$_time) . " | " . $_senderName . ": " . trim($post); } function GetHTMLPost($_post,$_translation,$_time,$_senderName,$_senderId,$_whisper=false) { $post = (empty($_translation)) ? (($_whisper ? "(<!--lang_whisper-->) " : "") . $_post) : $_translation."<div class=\"lz_message_translation\">".$_post."</div>"; $exPost = !isset(Server::$Operators[$_senderId]); $file = ($exPost) ? IOStruct::GetFile(LIVEZILLA_PATH . "mobile/templates/messageinternal.tpl") : IOStruct::GetFile(LIVEZILLA_PATH . "mobile/templates/messageexternal.tpl"); $html = str_replace("<!--dir-->","ltr",$file); $html = str_replace("<!--t-->",$_whisper ? " WCMT" : "",$html); $html = str_replace("<!--message-->",$post,$html); $html = str_replace("<!--color-->","#3091f2",$html); $html = str_replace("<!--name-->",htmlentities($_senderName,ENT_QUOTES,'UTF-8'),$html); $html = str_replace("<!--time-->","<!--stime_".$_time."-->",$html); $avparams = ($exPost) ? "name=" . Encoding::Base64UrlEncode($_senderName) : "operator=".urlencode($_senderId); $html = str_replace("<!--avatar-->","<div style=\"background-image: url('" . LIVEZILLA_URL . "picture.php?".$avparams."');\"></div>",$html); return $html; } function GetPlainFile($_permission,$_download,$_externalFullname,$_fileCreated,$_fileName,$_fileId) { $result = (($_permission==PERMISSION_VOID)?" (<!--lang_client_rejected-->)":($_permission!=PERMISSION_FULL && empty($_download))?" (<!--lang_client_rejected-->)":" (" . LIVEZILLA_URL . "getfile.php?id=" . $_fileId . ")"); return "| " . date("d.m.Y H:i:s",$_fileCreated) . " | " . $_externalFullname . ": " . html_entity_decode(strip_tags($_fileName),ENT_COMPAT,"UTF-8") . $result; } function GetHTMLFile($_permission,$_download,$_externalFullname,$_fileCreated,$_fileName,$_fileId) { $post = (($_permission==PERMISSION_VOID)?" (<!--lang_client_rejected-->)":($_permission!=PERMISSION_FULL && empty($_download))? $_fileName . " (<!--lang_client_rejected-->)": $this->GetHTMLFileLink($_fileName,$_fileId)); $file = IOStruct::GetFile(TEMPLATE_HTML_MESSAGE_INTERN); $html = str_replace("<!--dir-->","ltr",$file); $html = str_replace("<!--message-->",$post,$html); $html = str_replace("<!--color-->","#3091f2",$html); $html = str_replace("<!--name-->",$_externalFullname,$html); $html = str_replace("<!--time-->",date(DATE_RFC822,$_fileCreated),$html); return $html; } function GetHTMLFileLink($_fileName,$_fileId) { return "<a class=\"lz_chat_file\" href=\"". LIVEZILLA_URL . "getfile.php?id=" . $_fileId ."\" target=_\"blank\">" . $_fileName. "</a>"; } function GetHTMLScreenshotLink($_fileId) { return "<a class=\"lz_chat_file\" href=\"". LIVEZILLA_URL . "getfile.php?file=screenshot.lzsc&id=" . $_fileId ."\" target=_\"blank\">screenshot.lzsc</a>"; } function Generate($_chatId,$_externalFullname,$_plain=false,$_html=false,$_question="",$_startTime=0, $firstpost="") { $this->FirstPost = time(); $entries_html = array(); $entries_plain = array(); $result_posts = DBManager::Execute(true, "SELECT `sender_name`,`text`,`sender`,`time`,`micro`,`translation`,`whisper` FROM `" . DB_PREFIX . DATABASE_POSTS . "` WHERE `repost`=0 AND (`receiver`=`receiver_original` OR `whisper`=1) AND `chat_id` = '" . DBManager::RealEscape($_chatId) . "' GROUP BY `id` ORDER BY `time` ASC, `micro` ASC LIMIT 500;"); while($row_post = DBManager::FetchArray($result_posts)) { $fileLink = false; if(strpos($row_post["text"],"[__[invite_info:")!==false) continue; $parts = explode("[__[",str_replace("]__]","",$row_post["text"])); $row_post["text"] = $parts[0]; if($_html && isset($parts[1]) && strpos($parts[1],"file:") === 0) { $fid = str_replace("file:","",$parts[1]); $row_post["text"] = $this->GetHTMLFileLink($row_post["text"], $fid); $fileLink = true; } if($_html && isset($parts[1]) && strpos($parts[1],"screenshot:") === 0) { $fid = str_replace("screenshot:","",$parts[1]); $row_post["text"] = $this->GetHTMLScreenshotLink($fid); $fileLink = true; } $this->ElementCount++; $this->FirstPost = min($this->FirstPost,$row_post["time"]); $sender_name = (empty($row_post["sender_name"])) ? "<!--lang_client_guest-->" : $row_post["sender_name"]; if(!$fileLink && strpos($row_post["sender"],"~")!==false) { $row_post["text"] = htmlentities($row_post["text"],ENT_NOQUOTES,"UTF-8"); $row_post["translation"] = htmlentities($row_post["translation"],ENT_NOQUOTES,"UTF-8"); } $firstpost = (empty($firstpost)) ? $row_post["text"] : $firstpost; if($_plain) { if($row_post["whisper"] != 1) $entries_plain[$row_post["time"]."apost".str_pad($row_post["micro"],10,"0",STR_PAD_LEFT)] = $this->GetPlainPost($row_post["text"],$row_post["translation"],$row_post["time"],$sender_name); } if($_html) $entries_html[$row_post["time"]."apost".str_pad($row_post["micro"],10,"0",STR_PAD_LEFT)] = $this->GetHTMLPost($row_post["text"],$row_post["translation"],$row_post["time"],$sender_name,$row_post["sender"],$row_post["whisper"]==1); } ksort($entries_plain); foreach($entries_plain as $row) { if(!empty($this->PlainText)) $this->PlainText .= "\r\n"; $this->PlainText .= trim($row); } ksort($entries_html); foreach($entries_html as $row) { if(!empty($this->HTML)) $this->HTML .= ""; $this->HTML .= trim($row); } } static function GetLastPost($_chatId,$_internal) { $result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_POSTS . "` WHERE `chat_id`='" . DBManager::RealEscape($_chatId) . "' ORDER BY `time` DESC;"); while($row = DBManager::FetchArray($result)) { if(($_internal && isset(Server::$Operators[$row["sender"]])) || (!$_internal && !isset(Server::$Operators[$row["sender"]]))) return new Post($row); } return null; } static function GetLastPosts($_chatId,$_internal,$_max,$laterThan) { $posts = array(); $result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_POSTS . "` WHERE `chat_id`='" . DBManager::RealEscape($_chatId) . "' AND `time` > " . intval($laterThan) . " ORDER BY `time` DESC;"); while($row = DBManager::FetchArray($result)) { if(($_internal && isset(Server::$Operators[$row["sender"]])) || (!$_internal && !isset(Server::$Operators[$row["sender"]]))) $posts[] = $row["text"]; if(count($posts) >= $_max) return $posts; } return $posts; } static function GetPermissionSQL($_operatorId) { if(isset(Server::$Operators[$_operatorId])) { $excap = Server::$Operators[$_operatorId]->GetPermission(2); $incap = Server::$Operators[$_operatorId]->GetPermission(36); if($excap == PERMISSION_FULL && $incap == PERMISSION_FULL) return ""; else if($excap == PERMISSION_FULL && $incap == PERMISSION_RELATED) return " AND (`chat_type`=1 OR (`chat_type`=2 AND (`group_id` IN ('".implode("','",Server::$Operators[$_operatorId]->Groups)."') OR `group_id`='".GROUP_EVERYONE_INTERN."')) OR (`chat_type`=0 AND `internal_id` LIKE '%".DBManager::RealEscape($_operatorId,true)."%'))"; else if($excap == PERMISSION_RELATED && $incap == PERMISSION_FULL) return " AND (`chat_type`<>1 OR (`group_id` IN ('".implode("','",Server::$Operators[$_operatorId]->Groups)."')))"; else if($excap == PERMISSION_RELATED && $incap == PERMISSION_RELATED) return " AND ((`chat_type`=1 AND `group_id` IN ('".implode("','",Server::$Operators[$_operatorId]->Groups)."')) OR (`chat_type`=2 AND (`group_id` IN ('".implode("','",Server::$Operators[$_operatorId]->Groups)."') OR `group_id`='".GROUP_EVERYONE_INTERN."')) OR (`chat_type`=0 AND `internal_id` LIKE '%".DBManager::RealEscape($_operatorId,true)."%'))"; else if($excap == PERMISSION_NONE && $incap == PERMISSION_FULL) return " AND (`chat_type`<>1 OR (`internal_id`= '".DBManager::RealEscape($_operatorId)."'))"; else if($excap == PERMISSION_NONE && $incap == PERMISSION_RELATED) return " AND ((`chat_type`=1 AND (`internal_id`= '".DBManager::RealEscape($_operatorId)."')) OR (`chat_type`=2 AND (`group_id` IN ('".implode("','",Server::$Operators[$_operatorId]->Groups)."') OR `group_id`='".GROUP_EVERYONE_INTERN."')) OR (`chat_type`=0 AND `internal_id` LIKE '%".DBManager::RealEscape($_operatorId,true)."%'))"; } return ""; } static function Destroy($_chatId) { DBManager::Execute(true, "DELETE FROM `" . DB_PREFIX . DATABASE_CHAT_ARCHIVE . "` WHERE `chat_id`='" . DBManager::RealEscape($_chatId) . "' LIMIT 1;"); DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_VISITOR_CHATS . "` SET `archive_created`=2 WHERE `chat_id`='" . DBManager::RealEscape($_chatId) . "' LIMIT 1;"); } static function GetPostsOfChat($_chatId) { $posts = array(); if($result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_POSTS . "` WHERE `received`<>-1 AND `chat_id`='".DBManager::RealEscape($_chatId)."' ORDER BY `time` ASC, `micro` ASC;")) while($row = DBManager::FetchArray($result)) $posts[] = new Post($row); return $posts; } static function GetMyPosts($_operatorSystemId,$_onlyNew=true) { $received = ($_onlyNew) ? "`received`=0 AND " : ""; $messageFileCount = 0; $rows = array(); if($result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_POSTS . "` WHERE ".$received."`receiver`='".DBManager::RealEscape($_operatorSystemId)."' ORDER BY `time` ASC, `micro` ASC;")) while($row = DBManager::FetchArray($result)) $rows[] = $row; $posts = array(); foreach($rows as $row) { array_push($posts,new Post($row)); if(++$messageFileCount >= DATA_ITEM_LOADS && $posts[count($posts)-1]->Receiver == $posts[count($posts)-1]->ReceiverOriginal) break; } return $posts; } static function SaveToArchive($_chatId,$_userData,$_externalId,$_internalId,$_groupId,$_host,$_ip,$_transcriptSent=false,$_waitingtime,$_duration,$_startResult,$_endResult) { $udFullname = $_userData->Fullname; $udEmail = $_userData->Email; $udCompany = $_userData->Company; $udPhone = $_userData->Phone; $udQuestion = $_userData->Text; $result = DBManager::Execute(true, "SELECT `endtime`,`transcript_text`,`transcript_html`,`iso_language`,`time` FROM `" . DB_PREFIX . DATABASE_CHAT_ARCHIVE . "` WHERE `chat_type`=1 AND `chat_id`='" . DBManager::RealEscape($_chatId) . "' LIMIT 1;"); $row = DBManager::FetchArray($result); Server::InitDataBlock(array("INTERNAL","GROUPS")); LocalizationManager::AutoLoad($row["iso_language"],true); CacheManager::SetDataUpdateTime(DATA_UPDATE_KEY_CHAT_ARCH); $udFullname = (empty($udFullname)) ? (LocalizationManager::$TranslationStrings["client_guest"] . " " . Visitor::GetNoName($_externalId.$_ip)) : $udFullname; $filter = new Chat(); $filter->Generate($_chatId,$udFullname,true,true,$udQuestion,$row["time"]); $filter->PlainText = Server::Replace($filter->PlainText,true,false,false); $filter->HTML = Server::Replace($filter->HTML,true,false,false); $tsData = array($row["transcript_text"],$row["transcript_html"]); for($i=0;$i<count($tsData);$i++) { if($i==1 && empty($tsData[$i])) continue; $tsData[$i] = Server::Replace($tsData[$i],true,false,false); if(!empty($filter->PlainText)) { $tText = (($i==0) ? $filter->PlainText : nl2br(htmlentities($filter->PlainText,ENT_QUOTES,"UTF-8")))."<!--lz_ref_link-->"; $tsData[$i] = str_replace("%localdate%",date("r",$filter->FirstPost),$tsData[$i]); if(strpos($tsData[$i],"%transcript%")===false && strpos($tsData[$i],"%mailtext%")===false) $tsData[$i] .= $tText; else if(strpos($tsData[$i],"%transcript%")!==false) $tsData[$i] = str_replace("%transcript%",$tText,$tsData[$i]); else if(strpos($tsData[$i],"%mailtext%")!==false) $tsData[$i] = str_replace("%mailtext%",$tText,$tsData[$i]); } else $tsData[$i] = ""; $tsData[$i] = str_replace("%company_logo_url%",Server::$Configuration->File["gl_cali"],$tsData[$i]); $tsData[$i] = str_replace(array("%email%","%eemail%"),$udEmail,$tsData[$i]); $tsData[$i] = str_replace(array("%fullname%","%efullname%"),$udFullname,$tsData[$i]); $tsData[$i] = str_replace("%rating%",Feedback::GetRatingAVG($_chatId),$tsData[$i]); if(isset(Server::$Groups[$_groupId])) $tsData[$i] = Server::$Groups[$_groupId]->TextReplace($tsData[$i],$row["iso_language"]); if(!empty($_internalId) && $_internalId != SYSTEM) $tsData[$i] = Server::$Operators[$_internalId]->TextReplace($tsData[$i]); } $name = (!empty($udFullname)) ? ",`fullname`='".DBManager::RealEscape($udFullname)."'" : ""; DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_CHAT_ARCHIVE . "` SET `external_id`='" . DBManager::RealEscape($_externalId) . "',`closed`='" . DBManager::RealEscape(time()) . "'" . $name . ",`internal_id`='" . DBManager::RealEscape($_internalId) . "',`group_id`='" . DBManager::RealEscape($_groupId) . "',`html`='" . DBManager::RealEscape($filter->HTML) . "',`plaintext`='" . DBManager::RealEscape($filter->PlainText) . "',`transcript_text`='" . DBManager::RealEscape($tsData[0]) . "',`transcript_html`='" . DBManager::RealEscape($tsData[1]) . "',`fullname`='" . DBManager::RealEscape($udFullname) . "',`email`='" . DBManager::RealEscape($udEmail) . "',`company`='" . DBManager::RealEscape($udCompany) . "',`phone`='" . DBManager::RealEscape($udPhone) . "',`host`='" . DBManager::RealEscape($_host) . "',`ip`='" . DBManager::RealEscape($_ip) . "',`gzip`=0,`wait`='" . DBManager::RealEscape($_waitingtime) . "',`duration`='" . DBManager::RealEscape($_duration) . "',`accepted`='" . DBManager::RealEscape($_startResult) . "',`ended`='" . DBManager::RealEscape($_endResult) . "',`customs`='" . DBManager::RealEscape(serialize($_userData->FormatChatArchiveArray())) . "',`transcript_sent`='" . DBManager::RealEscape(((((empty(Server::$Configuration->File["gl_soct"]) && empty(Server::$Configuration->File["gl_scct"]) && empty(Server::$Configuration->File["gl_scto"]) && empty(Server::$Configuration->File["gl_sctg"])) || empty($tsData) || $filter->ElementCount < 1 || $_transcriptSent)) ? "1" : "0")) . "',`question`='" . DBManager::RealEscape($udQuestion) . "' WHERE `chat_id`='" . DBManager::RealEscape($_chatId) . "' AND `closed`=0 LIMIT 1;"); $result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_TICKET_MESSAGES . "` WHERE `channel_id`='" . DBManager::RealEscape($_chatId) . "';"); if($result && $rowc = DBManager::FetchArray($result)) { $Ticket = new Ticket($rowc["ticket_id"],true); $Ticket->LinkChat($rowc["channel_id"],$rowc["id"]); } } static function CloseChats() { Server::InitDataBlock(array("EVENTS")); $result = DBManager::Execute(false, "SELECT * FROM `" . DB_PREFIX . DATABASE_CHAT_ARCHIVE . "` WHERE `chat_type`=1 AND `closed`=0 AND `transcript_sent`=0;"); while($row = DBManager::FetchArray($result)) { $results = DBManager::Execute(false, "SELECT * FROM `" . DB_PREFIX . DATABASE_VISITOR_CHATS . "` WHERE `chat_id`='" . DBManager::RealEscape($row["chat_id"]) . "' AND (`exit`>0 OR `last_active`<" . (time() - Server::$Configuration->File["timeout_track"]) . ");"); if($results && $rows = DBManager::FetchArray($results)) { $botchat = !empty($row["internal_id"]) && Server::$Operators[$row["internal_id"]]->IsBot; $chat = new VisitorChat($rows); $chat->LoadMembers(); $startResult = 0; $endResult = 0; if(empty($rows["exit"])) $chat->CloseChat(); $lastOp = $chat->GetHostOperator(); if($botchat) { $waitingtime = 1; $startResult = 1; } else { $waitingtime = $chat->GetTotalWaitingTime($startResult,$endResult); } $duration = $chat->GetTotalDuration(); $visitor = new Visitor($chat->UserId); $visitor->Load(); $visitor->LoadVisitorData(); foreach(Server::$Events->Events as $event) { if($event->TriggerChatClosed) { foreach($event->Actions as $action) { if($action->Type == 7) { $chatObj = new Chat(); $chatObj->ChatId = $row["chat_id"]; $chatObj->Load(); $action->Execute("closechat",$visitor,$chatObj); } } } } Chat::SaveToArchive($row["chat_id"],$visitor->VisitorData,$rows["visitor_id"],$lastOp,$rows["request_group"],$visitor->Host,$visitor->IP,(empty(Server::$Configuration->File["gl_sctb"]) && $botchat),$waitingtime,$duration,$startResult,$endResult); if(!empty(Server::$Configuration->File["gl_actt"]) && !empty($visitor->VisitorData->Email) && $rows["internal_active"] == 0 && !$botchat) { Ticket::CreateFromChatArchive($row["chat_id"]); } } } } static function SetTicketId($_chatId,$_visitorId,$_ticketId) { if($_chatId != "") { DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_CHAT_ARCHIVE . "` SET `ticket_id`='" . intval($_ticketId) . "' WHERE `chat_id`='" . intval($_chatId) . "' LIMIT 1;"); DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_VISITOR_CHATS . "` SET `chat_ticket_id`='" . intval($_ticketId) . "' WHERE `chat_id`='" . intval($_chatId) . "' LIMIT 1;"); } else if($_visitorId != "") { DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_CHAT_ARCHIVE . "` SET `ticket_id`='" . intval($_ticketId) . "' WHERE `external_id`='" . DBManager::RealEscape($_visitorId) . "' AND `time` > ".(time()-7200)." AND `ticket_id`='';"); DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_VISITOR_CHATS . "` SET `chat_ticket_id`='" . intval($_ticketId) . "' WHERE `visitor_id`='" . DBManager::RealEscape($_visitorId) . "' AND `first_active` > ".(time()-7200)." AND `chat_ticket_id`='';"); } CacheManager::SetDataUpdateTime(DATA_UPDATE_KEY_CHAT_ARCH); } static function KeepAliveAPIChats() { // check necessity $result = DBManager::Execute(false, "SELECT `last_active` FROM `".DB_PREFIX.DATABASE_VISITOR_CHATS."` WHERE `external_close`=0 AND `internal_closed`=0 AND `internal_declined`=0 AND `visit_id` LIKE 'A_%' LIMIT 1;"); if($row = DBManager::FetchArray($result)) if(!empty($row["last_active"])) if($row["last_active"] == time()) return; // keep alive api chats DBManager::Execute(true, "UPDATE `".DB_PREFIX.DATABASE_VISITOR_CHATS."` SET `last_active` = " . intval(time()) . " WHERE `external_close`=0 AND `internal_closed`=0 AND `internal_declined`=0 AND `visit_id` LIKE 'A_%';"); if(DBManager::GetAffectedRowCount() > 0) { DBManager::Execute(true, "UPDATE `".DB_PREFIX.DATABASE_VISITOR_BROWSERS."` SET `last_active` = " . intval(time()) . " WHERE `closed`=0 AND `visit_id` LIKE 'A_%';"); } } } class Filter extends BaseObject { public $Type = 0; public $IP; public $Expiredate; public $Userid = ""; public $Reason = ""; public $Filtername = ""; public $Activestate; public $Exertion; public $Languages; public $Countries; public $AllowChats; public $AllowTickets; public $AllowTracking; public $Subject = ""; public $Email = ""; function __construct($_id) { $this->Id = $_id; $this->Edited = time(); } function GetXML() { return "<val t=\"".base64_encode($this->Type)."\" e=\"".base64_encode($this->Email)."\" s=\"".base64_encode($this->Subject)."\" active=\"".base64_encode($this->Activestate)."\" atr=\"".base64_encode(($this->AllowTracking) ? "1" : "0")."\" at=\"".base64_encode(($this->AllowTickets) ? "1" : "0")."\" ac=\"".base64_encode(($this->AllowChats) ? "1" : "0")."\" edited=\"".base64_encode($this->Edited)."\" editor=\"".base64_encode($this->Editor)."\" c=\"".base64_encode($this->Countries)."\" expires=\"".base64_encode($this->Expiredate)."\" creator=\"".base64_encode($this->Creator)."\" created=\"".base64_encode($this->Created)."\" userid=\"".base64_encode($this->Userid)."\" ip=\"".base64_encode($this->IP)."\" filtername=\"".base64_encode($this->Filtername)."\" filterid=\"".base64_encode($this->Id)."\" reason=\"".base64_encode($this->Reason)."\" exertion=\"".base64_encode($this->Exertion)."\" languages=\"".base64_encode($this->Languages)."\" />\r\n"; } function Load() { $result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_FILTERS . "` WHERE `id`='" . DBManager::RealEscape($this->Id) . "' LIMIT 1;"); if($result && $row = DBManager::FetchArray($result)) $this->SetValues($row); } function SetValues($_row) { $this->Type = (isset($_row["type"])) ? $_row["type"] : 0; $this->Creator = $_row["creator"]; $this->Created = $_row["created"]; $this->Editor = $_row["editor"]; $this->Edited = $_row["edited"]; $this->IP = $_row["ip"]; $this->Expiredate = $_row["expiredate"]; $this->Userid = $_row["visitor_id"]; $this->Reason = $_row["reason"]; $this->Filtername = $_row["name"]; $this->Id = $_row["id"]; $this->Activestate = $_row["active"]; $this->Exertion = $_row["exertion"]; $this->Languages = $_row["languages"]; $this->Countries = $_row["countries"]; $this->AllowChats = !empty($_row["allow_chats"]); $this->AllowTickets = !empty($_row["allow_tickets"]); $this->AllowTracking = !empty($_row["allow_tracking"]); $this->Email = (isset($_row["email"])) ? $_row["email"] : ""; $this->Subject = (isset($_row["subject"])) ? $_row["subject"] : ""; } function Save() { $this->Destroy(); DBManager::Execute(true, "INSERT IGNORE INTO `" . DB_PREFIX . DATABASE_FILTERS . "` (`creator`, `created`, `type`, `editor`, `edited`, `ip`, `expiredate`, `visitor_id`, `reason`, `name`, `id`, `active`, `exertion`, `languages`, `countries`, `allow_chats`, `allow_tickets`, `allow_tracking`, `email`, `subject`) VALUES ('" . DBManager::RealEscape($this->Creator) . "', '" . DBManager::RealEscape($this->Created) . "'," . intval($this->Type) . ",'" . DBManager::RealEscape($this->Editor) . "', '" . DBManager::RealEscape($this->Edited) . "','" . DBManager::RealEscape($this->IP) . "', '" . DBManager::RealEscape($this->Expiredate) . "','" . DBManager::RealEscape($this->Userid) . "', '" . DBManager::RealEscape($this->Reason) . "','" . DBManager::RealEscape($this->Filtername) . "', '" . DBManager::RealEscape($this->Id) . "','" . DBManager::RealEscape($this->Activestate) . "', '" . DBManager::RealEscape($this->Exertion) . "','" . DBManager::RealEscape($this->Languages) . "', '" . DBManager::RealEscape($this->Countries) . "', " . intval(($this->AllowChats) ? 1 : 0) . ", " . intval(($this->AllowTickets) ? 1 : 0) . ", " . intval(($this->AllowTracking) ? 1 : 0) . ", '" . DBManager::RealEscape($this->Email) . "','" . DBManager::RealEscape($this->Subject) . "');"); } function Destroy() { DBManager::Execute(true, "DELETE FROM `" . DB_PREFIX . DATABASE_FILTERS . "` WHERE `id`='" . DBManager::RealEscape($this->Id) . "' LIMIT 1;"); if(!empty(CacheManager::$ActiveManager)) CacheManager::$ActiveManager->SetDataUpdateTime(DATA_UPDATE_KEY_FILTERS); } static function IsFlood($_ip,$_userId) { return false; } static function CreateFloodFilter($_ip,$_userId) { } static function Create($_ip,$_userId,$_reason,$_expireDays=2,$_cookie=false,$_chats=false) { $filter = new Filter(md5(uniqid(rand()))); $filter->Creator = "SYSTEM"; $filter->Created = time(); $filter->Editor = "SYSTEM"; $filter->Edited = time(); $filter->IP = $_ip; $filter->Expiredate = $_expireDays * 86400; $filter->Userid = $_userId; $filter->Reason = ""; $filter->Filtername = $_reason; $filter->Activestate = 1; $filter->Exertion = 0; $filter->Languages = ""; $filter->Countries = ""; $filter->AllowChats = $_chats; $filter->Save(); CacheManager::FlushKey(DATA_CACHE_KEY_FILTERS); CacheManager::SetDataUpdateTime(DATA_UPDATE_KEY_FILTERS); } } class FilterList { public $Filters; public $Message; public $IsUserFilter; public $IsEmailFilter; function __construct() { $this->Filters = Array(); } function Populate() { if($result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_FILTERS . "`;")) while($row = DBManager::FetchArray($result)) { $filter = new Filter($row["id"]); $filter->SetValues($row); $this->Filters[$filter->Id] = $filter; if($filter->Type == 0) $this->IsUserFilter = true; else $this->IsEmailFilter = true; } } function MatchEmail($_email,$_subject) { if(!$this->IsEmailFilter) return false; foreach($this->Filters as $filter) { if($filter->Type != 1 || $filter->Activestate == FILTER_TYPE_INACTIVE) continue; $compare["match_email"] = Is::WildcardMatch($filter->Email,$_email); $compare["match_subject"] = Is::WildcardMatch($filter->Subject,$_subject); $match = false; if($compare["match_email"] && $filter->Exertion == FILTER_EXERTION_BLACK && !empty($filter->Email)) $match = true; else if(!$compare["match_email"] && $filter->Exertion == FILTER_EXERTION_WHITE && !empty($filter->Email)) $match = true; else if($compare["match_subject"] && $filter->Exertion == FILTER_EXERTION_BLACK && !empty($filter->Subject)) $match = true; else if(!$compare["match_subject"] && $filter->Exertion == FILTER_EXERTION_WHITE && !empty($filter->Subject)) $match = true; if($match) Logging::EmailLog("Blocked Email/Ticket by filter '". $filter->Filtername . "' - " . (($compare["match_email"]) ? "Email match " : "Subject match ") . $_email . " - " . $_subject); if($match) return true; } return false; } function MatchUser($_languages, $_userid, $_country = "") { if(!$this->IsUserFilter) return false; foreach($this->Filters as $filter) { if($filter->Type != 0 || $filter->Activestate == FILTER_TYPE_INACTIVE) continue; $this->Message = $filter->Reason; $compare["match_ip"] = Is::WildcardMatch($filter->IP,Communication::GetIP(true,false)) || Is::WildcardMatch($filter->IP,Communication::GetIP(false,true)); if(empty(Visitor::$BrowserLanguage)) $compare["match_lang"] = $this->IsoListCompare($_languages,$filter->Languages); else $compare["match_lang"] = $this->IsoListCompare(Visitor::$BrowserLanguage,$filter->Languages); $compare["match_country"] = $this->IsoListCompare($_country,$filter->Countries); $compare["match_id"] = ($filter->Userid == $_userid); if($compare["match_ip"] && $filter->Exertion == FILTER_EXERTION_BLACK && !empty($filter->IP)) define("ACTIVE_FILTER_ID",$filter->Id); else if(!$compare["match_ip"] && $filter->Exertion == FILTER_EXERTION_WHITE && !empty($filter->IP)) define("ACTIVE_FILTER_ID",$filter->Id); else if($compare["match_lang"] && $filter->Exertion == FILTER_EXERTION_BLACK && !empty($filter->Languages)) define("ACTIVE_FILTER_ID",$filter->Id); else if(!$compare["match_lang"] && $filter->Exertion == FILTER_EXERTION_WHITE && !empty($filter->Languages)) define("ACTIVE_FILTER_ID",$filter->Id); else if($compare["match_country"] && $filter->Exertion == FILTER_EXERTION_BLACK && !empty($filter->Countries)) define("ACTIVE_FILTER_ID",$filter->Id); else if(!$compare["match_country"] && $filter->Exertion == FILTER_EXERTION_WHITE && !empty($filter->Countries)) define("ACTIVE_FILTER_ID",$filter->Id); else if($compare["match_id"] && $filter->Exertion == FILTER_EXERTION_BLACK && !empty($filter->Userid)) define("ACTIVE_FILTER_ID",$filter->Id); else if(!$compare["match_id"] && $filter->Exertion == FILTER_EXERTION_WHITE && !empty($filter->Userid)) define("ACTIVE_FILTER_ID",$filter->Id); if(defined("ACTIVE_FILTER_ID")) { define("FILTER_ALLOW_TICKETS",$filter->AllowTickets); define("FILTER_ALLOW_TRACKING",$filter->AllowTracking); define("FILTER_ALLOW_CHATS",$filter->AllowChats); return true; } } return false; } function IpCompare($_ip, $_comparer) { $array_ip = explode(".",$_ip); $array_comparer = explode(".",$_comparer); if(count($array_ip) == 4 && count($array_comparer) == 4) { foreach($array_ip as $key => $octet) { if($array_ip[$key] != $array_comparer[$key]) { if($array_comparer[$key] == -1) return true; return false; } } return true; } else return false; } function IsoListCompare($_lang, $_comparer) { $array_lang = explode(",",$_lang); $array_comparer = explode(",",$_comparer); foreach($array_lang as $key => $lang) foreach($array_comparer as $langc) if(strtoupper($array_lang[$key]) == strtoupper($langc)) return true; return false; } } class EventList { public $Events; function __construct() { $this->Events = array(); } function GetActionById($_id) { foreach($this->Events as $event) { foreach($event->Actions as $action) if($action->Id == $_id) return $action; } return null; } function IsInternalAction() { foreach($this->Events as $event) { if($event->IsInternalAction()) return true; } return false; } } class HistoryUrl { public $Url; public $Referrer; public $Entrance; public static $SearchEngines = array("s"=>array("*nigma*"),"blocked"=>array("*doubleclick.net*"),"q"=>array("*search.*","*searchatlas*","*suche.*","*google.*","*bing.*","*ask*","*alltheweb*","*altavista*","*gigablast*"),"p"=>array("*search.yahoo*"),"query"=>array("*hotbot*","*lycos*"),"key"=>array("*looksmart*"),"text"=>array("*yandex*"),"wd"=>array("*baidu.*"),"searchTerm"=>array("*search.*"),"debug"=>array("*127.0.0.1*")); public static $SearchEngineEncodings = array("gb2312"=>array("*baidu.*")); public static $ExternalCallers = array("*.google.*","*.googleusercontent.*","*.translate.ru*","*.youdao.com*","*.bing.*","*.yahoo.*"); function __construct() { if(func_num_args() == 1) { $_row = func_get_arg(0); $this->Url = new BaseURL($_row["url_dom"],$_row["url_path"],"",$_row["url_title"]); $this->Url->Params = $_row["params"]; $this->Url->Untouched = $_row["untouched"]; $this->Url->MarkInternal(); $this->Referrer = new BaseURL($_row["ref_dom"],$_row["ref_path"],"",$_row["ref_title"]); $this->Referrer->Untouched = $_row["ref_untouched"]; $this->Entrance = $_row["entrance"]; } else if(func_num_args() == 2) { $_row = func_get_arg(0); $this->Url = new BaseURL(); $this->Url->AreaCode = $_row["area_code"]; $this->Url->Params = $_row["params"]; $this->Url->Untouched = $_row["untouched"]; $this->Referrer = new BaseURL(); $this->Referrer->Untouched = $_row["ref_untouched"]; $this->Entrance = $_row["entrance"]; $this->Url->PageTitle = $_row["title"]; } else if(func_num_args() == 5) { $this->Url = new BaseURL(func_get_arg(0)); $this->Url->AreaCode = func_get_arg(1); $this->Url->PageTitle = Str::Cut(func_get_arg(2),255); $this->Url->MarkInternal(); $this->Referrer = new BaseURL(func_get_arg(3)); $this->Entrance = func_get_arg(4); } } function Destroy($_browserId) { DBManager::Execute(true, "DELETE FROM `" . DB_PREFIX . DATABASE_VISITOR_BROWSER_URLS . "` WHERE `browser_id`='" . DBManager::RealEscape($_browserId) . "' AND `entrance`='" . DBManager::RealEscape($this->Entrance) . "' LIMIT 1;"); } function Save($_browserId,$_entrance) { if(strpos($_browserId,'_OVL') !== false) return; if(empty($this->Url->Untouched)) { return; } if(!$_entrance) DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_VISITOR_BROWSER_URLS . "` SET `is_exit`=0 WHERE `browser_id`='" . DBManager::RealEscape($_browserId) . "';"); DBManager::Execute(true, $d="INSERT IGNORE INTO `" . DB_PREFIX . DATABASE_VISITOR_BROWSER_URLS . "` (`browser_id`, `entrance`, `referrer`, `url`, `params`, `untouched`, `title`, `ref_untouched`, `is_entrance`, `is_exit`, `area_code`) VALUES ('" . DBManager::RealEscape($_browserId) . "', '" . DBManager::RealEscape($this->Entrance) . "', '" . DBManager::RealEscape($this->Referrer->Save()) . "', '" . DBManager::RealEscape($this->Url->Save()) . "', '" . DBManager::RealEscape($this->Url->Params) . "', '" . DBManager::RealEscape($this->Url->Untouched) . "', '" . DBManager::RealEscape($this->Url->PageTitle) . "', '" . DBManager::RealEscape($this->Referrer->Untouched) . "', " . DBManager::RealEscape($_entrance ? 1 : 0) . ", 1, '" . DBManager::RealEscape($this->Url->AreaCode) . "');"); } function GetXML($_browserId) { $xml = "<h b=\"".base64_encode($_browserId)."\" e=\"".base64_encode($this->Entrance)."\" url=\"".base64_encode($this->Url->GetAbsoluteUrl())."\" title=\"".base64_encode($this->Url->PageTitle)."\" code=\"".base64_encode($this->Url->AreaCode)."\">"; if($this->Referrer != null && $this->Referrer->Untouched != "") $xml.= "<ref u=\"".base64_encode($this->Referrer->Untouched)."\" />"; return $xml . "</h>"; } } class BaseURL { public $Path = ""; public $Params = ""; public $Domain = ""; public $AreaCode = ""; public $PageTitle = ""; public $IsExternal = true; public $IsSearchEngine = false; public $Excluded; public $Untouched = ""; function __construct() { if(func_num_args() == 1) { if(!Is::Null(func_get_arg(0))) { $this->Untouched = func_get_arg(0); $parts = $this->ParseURL($this->Untouched); $this->Domain = $parts[0]; $this->Path = substr($parts[1],0,255); $this->Params = $parts[2]; } else $this->MarkInternal(); } else if(func_num_args() == 0) { return; } else if(func_num_args() == 4) { $this->Domain = func_get_arg(0); $this->Path = func_get_arg(1); $this->AreaCode = func_get_arg(2); $this->PageTitle = Str::Cut(func_get_arg(3),255); } /* $domains = explode(",",Server::$Configuration->File["gl_doma"]); if(!empty(Server::$Configuration->File["gl_doma"]) && !empty($this->Domain) && is_array($domains)) { foreach($domains as $bldom) { $match = Is::WildcardMatch($bldom,$this->Domain); if((!empty(Server::$Configuration->File["gl_bldo"]) && $match) || (empty(Server::$Configuration->File["gl_bldo"]) && !$match)) { $this->Excluded = true; break; } } } */ } function GetAbsoluteUrl() { if(!empty($this->Untouched)) return $this->Untouched; else return $this->Domain . $this->Path; } function Save() { if($this->IsExternal) $pid = CacheManager::GetDataTableIdFromValue(DATABASE_VISITOR_DATA_PATHS,"path",$this->Path.$this->Params,false,255); else $pid = CacheManager::GetDataTableIdFromValue(DATABASE_VISITOR_DATA_PATHS,"path",$this->Path,false,255); $did = $this->GetDomainId(); $tid = $this->GetTitleId($did,$pid,0); DBManager::Execute(true, "INSERT IGNORE INTO `" . DB_PREFIX . DATABASE_VISITOR_DATA_PAGES . "` (`id`,`path`,`domain`,`title`) VALUES (NULL, '" . DBManager::RealEscape($pid) . "', '" . DBManager::RealEscape($did) . "', '" . DBManager::RealEscape($tid) . "') ON DUPLICATE KEY UPDATE `id`=LAST_INSERT_ID(`id`);"); return DBManager::GetLastInsertedId(); } function MarkInternal() { foreach(HistoryUrl::$ExternalCallers as $value) if(Is::WildcardMatch($value,$this->Domain)) return; $this->IsExternal = false; } function MarkSearchEngine() { $this->IsSearchEngine = true; $this->Params = $this->Path = ""; } function GetTitleId() { return CacheManager::GetDataTableIdFromValue(DATABASE_VISITOR_DATA_TITLES,"title",$this->PageTitle); } function GetDomainId() { return CacheManager::GetDataTableIdFromValue(DATABASE_VISITOR_DATA_DOMAINS,array("domain", "search", "external"),array($this->Domain, $this->IsSearchEngine?1:0, $this->IsExternal?1:0)); } function IsInternalDomain() { $row = DBManager::FetchArray($result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_VISITOR_DATA_DOMAINS . "` WHERE `domain`='" . DBManager::RealEscape($this->Domain) . "';")); if(DBManager::GetRowCount($result) == 1 && empty($row["external"])) return true; return false; } function ParseURL($_url,$allowedParams="",$cutParams="",$domain="",$path="") { $allowed = (STATS_ACTIVE && class_exists("StatisticProvider")) ? StatisticProvider::$AllowedParameters : array(); $igfilenames = (STATS_ACTIVE && class_exists("StatisticProvider")) ? StatisticProvider::$HiddenFilenames : array(); $parts = parse_url(str_replace("///","//",$_url)); $uparts = explode("?",$_url); if(count($allowed)>0 && count($uparts)>1) { $pparts = explode("&",$uparts[1]); foreach($pparts as $part) { $paramparts = explode("=",$part); if(in_array(strtolower($paramparts[0]),$allowed)) { if(empty($allowedParams)) $allowedParams .= "?"; else $allowedParams .= "&"; $allowedParams .= $paramparts[0]; if(count($paramparts)>1) $allowedParams .= "=".$paramparts[1]; } else { if(!empty($cutParams)) $cutParams .= "&"; $cutParams .= $paramparts[0]; if(count($paramparts)>1) $cutParams .= "=".$paramparts[1]; } } } if(!empty($cutParams) && empty($allowedParams)) $cutParams = "?" . $cutParams; else if(!empty($cutParams) && !empty($allowedParams)) $cutParams = "&" . $cutParams; else if(empty($cutParams) && empty($allowedParams) && count($uparts) > 1) $cutParams = "?" . $uparts[1]; $partsb = @explode($parts["host"],$_url); if(!isset($parts["host"])) $parts["host"] = "localhost"; $domain = $partsb[0].$parts["host"]; $path = substr($uparts[0],strlen($domain),strlen($uparts[0])-strlen($domain)); $path = str_replace($igfilenames,"",$path); return array($domain,$path.$allowedParams,$cutParams); } static function IsInputURL() { return !empty($_GET[GET_TRACK_URL]) || !empty($_GET["u"]); } static function GetInputURL() { if(!empty($_GET[GET_TRACK_URL])) return Encoding::Base64UrlDecode(Communication::GetParameter(GET_TRACK_URL,"",$nu,FILTER_SANITIZE_URL,null,2056)); // comp < 5.3.x else if(!empty($_GET["u"])) return Communication::GetParameter("u","",$nu,FILTER_SANITIZE_URL,null,2056); return ""; } } class TicketEditor extends BaseObject { public $TicketId = ""; public $SubStatus = ""; public $Status = 0; function __construct() { if(func_num_args()>0) { $this->Id = func_get_arg(0); if(func_num_args() == 2) { $row = func_get_arg(1); $this->Editor = $row["editor_id"]; $this->Status = $row["status"]; $this->SubStatus = $row["sub_status"]; $this->Edited = $row["time"]; } } } function ApplyAttributesFromPost($_index) { if(isset($_POST[POST_INTERN_PROCESS_TICKET_ACTIONS . "_" . $_index . "_vs"])) { $this->SubStatus = $_POST[POST_INTERN_PROCESS_TICKET_ACTIONS . "_" . $_index . "_vs"]; } } function GetXML($_waitBegin=0,$_lastUpdate=0) { return "<cl id=\"".base64_encode($this->Id)."\" w=\"".base64_encode($_waitBegin)."\" u=\"".base64_encode($_lastUpdate)."\" st=\"".base64_encode($this->Status)."\" ss=\"".base64_encode($this->SubStatus)."\" ed=\"".base64_encode($this->Editor)."\" ti=\"".base64_encode($this->Edited)."\"/>\r\n"; } function Save() { DBManager::Execute(false, "UPDATE `" . DB_PREFIX . DATABASE_TICKET_EDITORS . "` SET `editor_id`='" . DBManager::RealEscape($this->Editor) . "',`status`='" . DBManager::RealEscape($this->Status) . "',`sub_status`='" . DBManager::RealEscape($this->SubStatus) . "',`time`='" . DBManager::RealEscape(time()) . "' WHERE `ticket_id`='" . DBManager::RealEscape($this->Id) . "';"); if(DBManager::GetAffectedRowCount() <= 0) DBManager::Execute(false, "INSERT IGNORE INTO `" . DB_PREFIX . DATABASE_TICKET_EDITORS . "` (`ticket_id` ,`editor_id` ,`status`, `sub_status`, `time`) VALUES ('" . DBManager::RealEscape($this->Id) . "', '" . DBManager::RealEscape($this->Editor) . "', '" . DBManager::RealEscape($this->Status) . "','" . DBManager::RealEscape($this->SubStatus) . "','" . DBManager::RealEscape(time()) . "');"); } function Destroy() { DBManager::Execute(false, "DELETE FROM `" . DB_PREFIX . DATABASE_TICKET_EDITORS . "` WHERE `ticket_id`='" . DBManager::RealEscape($this->Id) . "' LIMIT 1;"); } static function GetTicketCountByEditor($_systemId) { $result = DBManager::Execute(true, "SELECT COUNT(*) AS `open_tickets` FROM `" . DB_PREFIX . DATABASE_TICKET_EDITORS . "` WHERE `editor_id`='" . DBManager::RealEscape($_systemId) . "' AND `status` < 2;"); if($result && $row = DBManager::FetchArray($result)) return $row["open_tickets"]; return 0; } } class TicketChat extends TicketMessage { function __construct() { $this->Id = func_get_arg(1); if(func_num_args() == 3) { $this->ChannelId = func_get_arg(0); $this->Type = "2"; } else { $row = func_get_arg(0); $this->Text = str_replace(array("%eemail%","%efullname%"),array($row["email"],$row["fullname"]),$row["plaintext"]); $this->Type = "2"; $this->Fullname = $row["fullname"]; $this->Email = $row["email"]; $this->Company = $row["company"]; $this->ChannelId = $row["chat_id"]; $this->IP = $row["ip"]; $this->SenderUserId = $row["external_id"]; $this->Edited = time(); $this->Created = $row["time"]; $this->Country = $row["iso_country"]; $this->Phone = $row["phone"]; $this->Subject = $row["question"]; } } } class TicketMessage extends Action { public $Type = 0; public $Customs = array(); public $Country = ""; public $CallMeBack = false; public $ChannelId = ""; public $Attachments = array(); public $Edited = 0; public $Hash = ""; public $Subject = ""; public $Comments = array(); public $TicketId; public $HTML = ""; public $EmailCC = ""; public $EmailBCC = ""; function __construct() { if(func_num_args() == 2) { $this->Id = func_get_arg(0); } else if(func_num_args() > 0) { $row = func_get_arg(0); $this->SetValues($row); } } function SetValues($_row) { if(!isset($_row["id"])) Logging::ErrorLog(serialize(debug_backtrace())); $this->Id = $_row["id"]; $this->Text = DBManager::DecodeField($_row["text"]); $this->HTML = DBManager::DecodeField($_row["html"]); $this->Type = $_row["type"]; $this->Fullname = DBManager::DecodeField($_row["fullname"]); $this->Email = $_row["email"]; $this->EmailCC = $_row["email_cc"]; $this->EmailBCC = $_row["email_bcc"]; $this->Company = DBManager::DecodeField($_row["company"]); $this->ChannelId = $_row["channel_id"]; $this->TicketId = $_row["ticket_id"]; $this->IP = $_row["ip"]; $this->Edited = $_row["time"]; $this->Created = $_row["created"]; $this->Country = $_row["country"]; $this->Phone = $_row["phone"]; $this->Hash = $_row["hash"]; $this->SenderUserId = $_row["sender_id"]; $this->CallMeBack = !empty($_row["call_me_back"]); $this->Subject = DBManager::DecodeField($_row["subject"]); } function AddComment($_operatorId, $_ticketId, $_text) { $time=SystemTime::GetUniqueMessageTime(DATABASE_TICKET_COMMENTS,"created"); DBManager::Execute(true, "INSERT IGNORE INTO `" . DB_PREFIX . DATABASE_TICKET_COMMENTS . "` (`id`, `created`, `time`, `ticket_id`, `message_id`, `operator_id`, `comment`) VALUES ('" . DBManager::RealEscape(getId(32)) . "', '" . DBManager::RealEscape($time) . "','" . DBManager::RealEscape($time) . "', '" . DBManager::RealEscape($_ticketId) . "', '" . DBManager::RealEscape($this->Id) . "', '" . DBManager::RealEscape($_operatorId) . "', '" . DBManager::RealEscape($_text) . "');"); } function Save($_ticketId,$_overwrite=false,$_time=null,$_ticket=null) { $time=($_time==null)?SystemTime::GetUniqueMessageTime(DATABASE_TICKET_MESSAGES,"time"):$_time; if(empty($this->Created)) $this->Created = $time; $do = ($_overwrite) ? "REPLACE" : "INSERT"; $errorCode = -1; $this->Text = Str::Cut($this->Text,MAX_TICKET_MSG_LENGTH,true); $result = DBManager::Execute(false, $x = $do . " INTO `" . DB_PREFIX . DATABASE_TICKET_MESSAGES . "` (`id` ,`time` ,`created` ,`ticket_id` ,`text`, `html`,`fullname`,`email`,`email_cc`,`email_bcc`,`company` ,`ip`, `phone` ,`call_me_back`,`country`,`type`,`sender_id`,`channel_id`,`hash`,`subject`) VALUES ('" . DBManager::RealEscape($this->Id) . "', " . DBManager::RealEscape($time) . "," . DBManager::RealEscape($this->Created) . ", '" . DBManager::RealEscape($_ticketId) . "', '" . DBManager::RealEscape($this->Text) . "', '" . DBManager::RealEscape($this->HTML) . "','" . DBManager::RealEscape($this->Fullname) . "', '" . DBManager::RealEscape($this->Email) . "', '" . DBManager::RealEscape($this->EmailCC) . "', '" . DBManager::RealEscape($this->EmailBCC) . "', '" . DBManager::RealEscape($this->Company) . "', '" . DBManager::RealEscape($this->IP) . "', '" . DBManager::RealEscape($this->Phone) . "', " . (($this->CallMeBack) ? 1 : 0) . ", '" . DBManager::RealEscape($this->Country) . "', '" . DBManager::RealEscape($this->Type) . "', '" . DBManager::RealEscape($this->SenderUserId) . "', '" . DBManager::RealEscape($this->ChannelId) . "', '" . DBManager::RealEscape($this->Hash) . "', '" . DBManager::RealEscape(Str::Cut($this->Subject,506,true)) . "');", $errorCode); if(!$result && $errorCode == 1366) $result = DBManager::Execute(true, $x = $do . " INTO `" . DB_PREFIX . DATABASE_TICKET_MESSAGES . "` (`id` ,`time` ,`created` ,`ticket_id` ,`text`, `html`,`fullname`,`email`,`email_cc`,`email_bcc`,`company` ,`ip`, `phone` ,`call_me_back`,`country`,`type`,`sender_id`,`channel_id`,`hash`,`subject`) VALUES ('" . DBManager::RealEscape($this->Id) . "', " . DBManager::RealEscape($time) . "," . DBManager::RealEscape($this->Created) . ", '" . DBManager::RealEscape($_ticketId) . "', '" . DBManager::RealEscape(DBManager::EncodeField($this->Text)) . "', '" . DBManager::RealEscape(DBManager::EncodeField($this->HTML)) . "','" . DBManager::RealEscape(DBManager::EncodeField($this->Fullname)) . "', '" . DBManager::RealEscape($this->Email) . "', '" . DBManager::RealEscape($this->EmailCC) . "', '" . DBManager::RealEscape($this->EmailBCC) . "', '" . DBManager::RealEscape(DBManager::EncodeField($this->Company)) . "', '" . DBManager::RealEscape($this->IP) . "', '" . DBManager::RealEscape($this->Phone) . "', " . (($this->CallMeBack) ? 1 : 0) . ", '" . DBManager::RealEscape($this->Country) . "', '" . DBManager::RealEscape($this->Type) . "', '" . DBManager::RealEscape($this->SenderUserId) . "', '" . DBManager::RealEscape($this->ChannelId) . "', '" . DBManager::RealEscape($this->Hash) . "', '" . DBManager::RealEscape(DBManager::EncodeField(Str::Cut($this->Subject,256,true))) . "');", $errorCode); else if(!$result && $errorCode == 1062) { return false; } if(!$result) { Logging::DebugLog("Save ticket message: can't save message to ticket " . $_ticketId . " (" . $errorCode . ")"); return false; } if($result) { if(is_array($this->Customs)) foreach($this->Customs as $i => $value) if(isset(Server::$Inputs[$i])) DBManager::Execute(true, "REPLACE INTO `" . DB_PREFIX . DATABASE_TICKET_CUSTOMS . "` (`ticket_id` ,`message_id`, `custom_id` ,`value`) VALUES ('" . DBManager::RealEscape($_ticketId) . "','" . DBManager::RealEscape($this->Id) . "', '" . DBManager::RealEscape(Server::$Inputs[$i]->Name) . "', '" . DBManager::RealEscape($value) . "');"); if($_ticket != null && !empty(Server::$Configuration->File["gl_mpm"])) foreach(Server::$Operators as $operator) if($operator->IsInPushMessageState()) if($operator->HasAccessToTicket($_ticket)) $operator->AddPushMessage($_ticketId, "", (!empty($this->Fullname) ? $this->Fullname : $this->Email), 3, $this->Text); } else Logging::DebugLog("Save ticket message: can't save message to ticket " . $_ticketId . " (" . $errorCode . ")"); CacheManager::SetDataUpdateTime(DATA_UPDATE_KEY_TICKETS); return $time; } function ApplyCustomFromPost($_count,$_change=false,$_ticket=null,$_operatorId="") { foreach(Server::$Inputs as $index => $input) { $cid = 0; while($cid < 30) { if(isset($_POST[POST_INTERN_PROCESS_TICKET_ACTIONS . "_" . $_count . "_vd_" . $cid])) { $value = $_POST[POST_INTERN_PROCESS_TICKET_ACTIONS . "_" . $_count . "_vd_" . $cid]; if(strpos($value,"[cf".$index."]") === 0) { $value = base64_decode(str_replace("[cf".$index."]","",$value)); if($input->Custom && $input->Active) { $compare = (isset($this->Customs[$index])) ? $input->GetClientIndex($this->Customs[$index]) : ""; if($_change && $compare != $value) $this->ChangeValue($_ticket,$index+16,$_operatorId,$compare,$value); $this->Customs[$index] = $value; } } } $cid++; } } } function LoadAttachments() { $this->Attachments = array(); $result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_TICKET_ATTACHMENTS . "` INNER JOIN `" . DB_PREFIX . DATABASE_RESOURCES . "` ON `" . DB_PREFIX . DATABASE_RESOURCES . "`.`id`=`" . DB_PREFIX . DATABASE_TICKET_ATTACHMENTS . "`.`res_id` WHERE `" . DB_PREFIX . DATABASE_TICKET_ATTACHMENTS . "`.`parent_id`='" . DBManager::RealEscape($this->Id) . "';"); if($result) while($rowc = DBManager::FetchArray($result)) $this->Attachments[$rowc["res_id"]] = $rowc["title"]; } function SaveAttachments() { foreach($this->Attachments as $rid => $title) $this->ApplyAttachment($rid); } function ApplyAttachment($_id) { DBManager::Execute(true, "REPLACE INTO `" . DB_PREFIX . DATABASE_TICKET_ATTACHMENTS . "` (`parent_id`,`res_id`) VALUES ('" . DBManager::RealEscape($this->Id) . "','" . DBManager::RealEscape($_id) . "');"); } function AttachTemporaryFiles($_visitorId) { foreach(SERVER::$Inputs as $input) if($input->Active && $input->Type == "File") { $files = KnowledgeBase::GetTemporaryTicketFiles($_visitorId,$input->Index); foreach($files as $file) { $this->ApplyAttachment($file["id"]); if(!isset($this->Customs[$input->Index])) $this->Customs[$input->Index] = ""; $this->Customs[$input->Index] .= "[" . $file["title"] . "]"; } } } function LoadComments($_parent=null) { $result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_TICKET_COMMENTS . "` WHERE `" . DB_PREFIX . DATABASE_TICKET_COMMENTS . "`.`message_id`='" . DBManager::RealEscape($this->Id) . "' ORDER BY `time` DESC;"); if($result) while($rowc = DBManager::FetchArray($result)) $this->Comments[$rowc["id"]] = array("time"=>$rowc["time"],"operator_id"=>$rowc["operator_id"],"comment"=>$rowc["comment"]); if($_parent != null) $_parent->LastUpdated = max($_parent->LastUpdated,$rowc["time"],$rowc["created"]); } function SaveComments($_ticketId) { if(is_array($this->Comments)) foreach($this->Comments as $com) $this->AddComment($com["operator_id"],$_ticketId,$com["comment"]); } function LoadCustoms($_nameBased=false) { Server::InitDataBlock(array("INPUTS")); $result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_TICKET_CUSTOMS . "` WHERE `message_id`='" . DBManager::RealEscape($this->TicketId) . "';"); if($result) while($rowc = DBManager::FetchArray($result)) foreach(Server::$Inputs as $input) if($input->Name == $rowc["custom_id"] && $input->Active) { if($_nameBased) $this->Customs[$input->Name] = $input->GetClientValue($rowc["value"]); else $this->Customs[$input->Index] = ($rowc["value"]); } } function Load($_indexBased=false) { $result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_TICKET_MESSAGES . "` WHERE `id`='" . DBManager::RealEscape($this->Id) . "';"); if($result && $row = DBManager::FetchArray($result)) { $this->SetValues($row); $this->LoadCustoms($_indexBased); $this->LoadAttachments(); $this->LoadComments(); } } function GetQuoteFormat($_html) { if(empty($this->Text)) return ""; $array = preg_split("/\r\n|\n|\r/", $this->Text); $qText = ""; foreach($array as $line) if(!empty($line) && strpos(trim($line),">")!==0) $qText .= "\r\n> " . trim($line); $qText = $_html ? trim($qText) : nl2br(trim($qText)); return $qText; } function ChangeValue($_ticket,$_logId,$_operatorId,&$_member,$_newValue) { if($_member != $_newValue) $_ticket->Log($_logId,$_operatorId,$_newValue,$_member,$this->Id); $_member = $_newValue; } function Forward($_groupId,$_toEmail,$_subject="",$_text="") { $att = array(); $mailbox = Mailbox::GetById(Server::$Groups[$_groupId]->TicketEmailOut,true); foreach($this->Attachments as $resid => $title) $att[$resid] = $resid; if(empty($_text) && !empty($this->Text)) $_text = $this->Text; if($mailbox != null) Communication::SendEmail($mailbox, str_replace(";", ",", $_toEmail), "", "", $mailbox->Email, $_text, "", $_subject, false, $att); } function GetXML($_demand=false) { $isHTML = strlen($this->HTML) > 0 ? " ishtml=\"MQ_\"" : ""; $xml = "<m id=\"".base64_encode($this->Id)."\"".$isHTML." s=\"".base64_encode($this->Subject)."\" sid=\"".base64_encode($this->SenderUserId)."\" t=\"".base64_encode($this->Type)."\" c=\"".base64_encode($this->Country)."\" ci=\"".base64_encode($this->ChannelId)."\" ct=\"".base64_encode($this->Created)."\" e=\"".base64_encode($this->Edited)."\" p=\"".base64_encode($this->GetInputData(116,false))."\" cmb=\"".base64_encode(($this->CallMeBack) ? 1 : 0)."\" mt=\"".base64_encode(Str::Cut($this->Text,MAX_TICKET_MSG_LENGTH,true))."\" fn=\"".base64_encode($this->GetInputData(111,false))."\" em=\"".base64_encode($this->GetInputData(112,false))."\" ecc=\"".base64_encode($this->EmailCC)."\" ebcc=\"".base64_encode($this->EmailBCC)."\" co=\"".base64_encode($this->GetInputData(113,false))."\" ui=\"".base64_encode($this->SenderUserId)."\" ip=\"".base64_encode($this->IP)."\">\r\n"; if(is_array($this->Customs)) foreach($this->Customs as $i => $value) $xml .= "<c id=\"".base64_encode(Server::$Inputs[$i]->Name)."\">".base64_encode($this->GetInputData($i,false))."</c>\r\n"; if(is_array($this->Attachments)) foreach($this->Attachments as $i => $value) $xml .= "<a id=\"".base64_encode($i)."\">".base64_encode($value)."</a>\r\n"; if($_demand && is_array($this->Comments)) foreach($this->Comments as $id => $value) $xml .= "<co i=\"".base64_encode($id)."\" t=\"".base64_encode($value["time"])."\" o=\"".base64_encode($value["operator_id"])."\">".base64_encode($value["comment"])."</co>\r\n"; return $xml . "</m>"; } function TextReplace($_text,$_group) { $details=$cv=""; if(Server::$Inputs[111]->Active && !empty($this->Fullname)) $details .= strip_tags(Server::$Inputs[111]->Caption) ." " . $this->Fullname . "\r\n"; if(Server::$Inputs[112]->Active && !empty($this->Email)) $details .= strip_tags(Server::$Inputs[112]->Caption) ." " . $this->Email . "\r\n"; if(Server::$Inputs[113]->Active && !empty($this->Company)) $details .= strip_tags(Server::$Inputs[113]->Caption) ." " . $this->Company . "\r\n"; if((Server::$Inputs[116]->Active || $this->CallMeBack) && !empty($this->Phone)) $details .= strip_tags(Server::$Inputs[116]->Caption) ." " . $this->Phone . "\r\n"; $_text = str_replace("%external_phone%",$this->Phone,$_text); $_text = str_replace("%external_name%",$this->Fullname,$_text); $_text = str_replace("%external_email%",$this->Email,$_text); $_text = str_replace("%external_company%",$this->Company,$_text); $_text = str_replace("%external_phone%",$this->Phone,$_text); $_text = str_replace("%external_ip%",$this->IP,$_text); //$_text = str_replace("%ticket_id%",$this->TicketId,$_text); $_text = str_replace("%subject%",$this->Subject,$_text); $_text = str_replace("%domain%",Server::$Configuration->File["gl_site_name"],$_text); foreach(Server::$Inputs as $index => $input) if($input->Active && $input->Custom) { $cv = ""; if($input->Type == "CheckBox") $details .= strip_tags($input->Caption). " " . ($cv = ((!empty($this->Customs[$index])) ? "<!--lang_client_yes-->" : "<!--lang_client_no-->")) . "\r\n"; else if(!empty($this->Customs[$index])) $details .= strip_tags($input->Caption). " " . ($cv = $input->GetClientValue($this->Customs[$index])) . "\r\n"; $_text = str_replace("%custom".$index."%",$cv,$_text); } $_text = str_replace("%details%",$details,$_text); return $_text; } function SetChannelId($_cId) { DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_TICKET_MESSAGES . "` SET `channel_id`='" . DBManager::RealEscape($_cId) . "' WHERE `id`='" . DBManager::RealEscape($this->Id) . "' LIMIT 1;"); } function Destroy() { DBManager::Execute(false, "DELETE FROM `" . DB_PREFIX . DATABASE_TICKET_MESSAGES . "` WHERE `id`='" . DBManager::RealEscape($this->Id) . "' LIMIT 1;"); } static function Exists($_id, &$_ticketId="") { $result = DBManager::Execute(true, "SELECT `channel_id`,`ticket_id` FROM `" . DB_PREFIX . DATABASE_TICKET_MESSAGES . "` WHERE `channel_id`='" . DBManager::RealEscape($_id) . "';"); if($result && DBManager::GetRowCount($result) > 0) { $row = DBManager::FetchArray($result); $_ticketId = $row["ticket_id"]; return true; } return false; } static function GetHTML($_id) { $result = DBManager::Execute(true, "SELECT `html` FROM `" . DB_PREFIX . DATABASE_TICKET_MESSAGES . "` WHERE `channel_id`='" . DBManager::RealEscape($_id) . "' LIMIT 1;"); if($result) if($row = DBManager::FetchArray($result)) return DBManager::DecodeField($row["html"]); } } class TicketAttachment { static function ResourceExists($_id) { $result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_TICKET_ATTACHMENTS . "` WHERE `res_id`='" . DBManager::RealEscape($_id) . "' LIMIT 1;"); if($result && DBManager::GetRowCount($result) > 0) return true; else return false; } } class TicketEmail { public $Id = ""; public $Name = ""; public $Email = ""; public $Subject = ""; public $Body = ""; public $BodyHTML = ""; public $Created = 0; public $Deleted = false; public $MailboxId = ""; public $Edited = ""; public $GroupId = ""; public $ReplyTo = ""; public $ReceiverEmail = ""; public $Attachments = array(); public $EditorId = ""; public $CC = ""; function __construct() { if(func_num_args() == 3) { $this->Id = func_get_arg(0); $this->Deleted = func_get_arg(1); $this->EditorId = func_get_arg(2); } else if(func_num_args() == 1) { $row = func_get_arg(0); $this->Id = $row["email_id"]; $this->Name = DBManager::DecodeField($row["sender_name"]); $this->Email = $row["sender_email"]; $this->Subject = DBManager::DecodeField($row["subject"]); $this->Body = DBManager::DecodeField($row["body"]); $this->BodyHTML = DBManager::DecodeField($row["body_html"]); $this->Created = $row["created"]; $this->Deleted = !empty($row["deleted"]); $this->MailboxId = $row["mailbox_id"]; $this->Edited = $row["edited"]; $this->GroupId = $row["group_id"]; $this->ReplyTo = $row["sender_replyto"]; $this->CC = $row["sender_cc"]; $this->ReceiverEmail = $row["receiver_email"]; $this->EditorId = $row["editor_id"]; } } function LoadAttachments() { $this->Attachments = array(); $result = DBManager::Execute(true, "SELECT `res_id` FROM `" . DB_PREFIX . DATABASE_TICKET_ATTACHMENTS . "` WHERE `parent_id`='" . DBManager::RealEscape($this->Id) . "';"); if($result) while($row = DBManager::FetchArray($result)) $this->Attachments[$row["res_id"]] = KnowledgeBaseEntry::GetById($row["res_id"]); } function SaveAttachment($_id) { DBManager::Execute(true, "REPLACE INTO `" . DB_PREFIX . DATABASE_TICKET_ATTACHMENTS . "` (`res_id`, `parent_id`) VALUES ('" . DBManager::RealEscape($_id) . "','" . DBManager::RealEscape($this->Id) . "');"); } function SetStatus() { $ownership = (!empty($this->EditorId)) ? "(editor_id='".DBManager::RealEscape($this->EditorId)."' OR editor_id='') AND " : ""; if($this->Deleted) $this->EditorId = CALLER_SYSTEM_ID; $time=SystemTime::GetUniqueMessageTime(DATABASE_TICKET_EMAILS,"edited"); DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_TICKET_EMAILS . "` SET `deleted`=" . ($this->Deleted ? 1 : 0) . ",`edited`=" . ($time) . ",`editor_id`='" . DBManager::RealEscape($this->EditorId) . "' WHERE " . $ownership . "`email_id`='" . DBManager::RealEscape($this->Id) . "' LIMIT 1;"); } function GetXML($_full=true) { if($_full) { $ishtml = !empty($this->BodyHTML) ? 1 : 0; $xml = "<e id=\"".base64_encode($this->Id)."\" ishtml=\"".base64_encode($ishtml)."\" ei=\"".base64_encode($this->EditorId)."\" r=\"".base64_encode($this->ReceiverEmail)."\" g=\"".base64_encode($this->GroupId)."\" e=\"".base64_encode($this->Email)."\" rt=\"".base64_encode($this->ReplyTo)."\" ed=\"".base64_encode($this->Edited)."\" s=\"".base64_encode($this->Subject)."\" n=\"".base64_encode($this->Name)."\" c=\"".base64_encode($this->Created)."\" d=\"".base64_encode($this->Deleted)."\" m=\"".base64_encode($this->MailboxId)."\"><c>".base64_encode($this->Body)."</c>"; foreach($this->Attachments as $res) $xml .= "<a n=\"".base64_encode($res["title"])."\">".base64_encode($res["id"])."</a>"; $xml .= "</e>"; } else { $xml = "<e id=\"".base64_encode($this->Id)."\" ei=\"".base64_encode($this->EditorId)."\" r=\"".base64_encode($this->ReceiverEmail)."\" g=\"".base64_encode($this->GroupId)."\" e=\"".base64_encode($this->Email)."\" s=\"".base64_encode($this->Subject)."\" n=\"".base64_encode($this->Name)."\" c=\"".base64_encode($this->Created)."\" m=\"".base64_encode($this->MailboxId)."\" />"; } return $xml; } function Load() { $result = DBManager::Execute(true, "SELECT `created`,`sender_cc`,`body_html` FROM `" . DB_PREFIX . DATABASE_TICKET_EMAILS . "` WHERE `email_id`='" . DBManager::RealEscape($this->Id) . "';"); if($result && $row = DBManager::FetchArray($result)) { $this->Created = $row["created"]; $this->CC = $row["sender_cc"]; $this->BodyHTML = $row["body_html"]; } } function Save() { if ($this->Deleted) $this->Destroy(); else { $errorCode = -1; $time=SystemTime::GetUniqueMessageTime(DATABASE_TICKET_EMAILS,"edited"); $result = DBManager::Execute(false, "REPLACE INTO `" . DB_PREFIX . DATABASE_TICKET_EMAILS . "` (`email_id`, `mailbox_id`, `sender_email`, `sender_name`,`sender_replyto`,`sender_cc`,`receiver_email`, `created`, `edited`, `deleted`, `subject`, `body`, `body_html`, `group_id`) VALUES ('" . DBManager::RealEscape($this->Id) . "', '" . DBManager::RealEscape($this->MailboxId) . "', '" . DBManager::RealEscape($this->Email) . "', '" . DBManager::RealEscape(($this->Name)) . "','" . DBManager::RealEscape($this->ReplyTo) . "','" . DBManager::RealEscape(Str::Cut($this->CC,254)) . "','" . DBManager::RealEscape(Str::Cut($this->ReceiverEmail,255)) . "', '" . DBManager::RealEscape($this->Created) . "', '" . DBManager::RealEscape($time) . "', '" . DBManager::RealEscape($this->Deleted ? 1 : 0) . "', '" . DBManager::RealEscape(($this->Subject)) . "', '" . DBManager::RealEscape(($this->Body)) . "','" . DBManager::RealEscape(($this->BodyHTML)) . "', '" . DBManager::RealEscape($this->GroupId) . "');", $errorCode); if(!$result && $errorCode == 1366) DBManager::Execute(true, "REPLACE INTO `" . DB_PREFIX . DATABASE_TICKET_EMAILS . "` (`email_id`, `mailbox_id`, `sender_email`, `sender_name`,`sender_replyto`,`sender_cc`,`receiver_email`, `created`, `edited`, `deleted`, `subject`, `body`, `body_html`, `group_id`) VALUES ('" . DBManager::RealEscape($this->Id) . "', '" . DBManager::RealEscape($this->MailboxId) . "', '" . DBManager::RealEscape($this->Email) . "', '" . DBManager::RealEscape(DBManager::EncodeField($this->Name)) . "','" . DBManager::RealEscape($this->ReplyTo) . "','" . DBManager::RealEscape(Str::Cut($this->CC,254)) . "','" . DBManager::RealEscape(Str::Cut($this->ReceiverEmail,255)) . "', '" . DBManager::RealEscape($this->Created) . "', '" . DBManager::RealEscape($time) . "', '" . DBManager::RealEscape($this->Deleted ? 1 : 0) . "', '" . DBManager::RealEscape(DBManager::EncodeField($this->Subject)) . "', '" . DBManager::RealEscape(DBManager::EncodeField($this->Body)) . "','" . DBManager::RealEscape(DBManager::EncodeField($this->BodyHTML)) . "', '" . DBManager::RealEscape($this->GroupId) . "');", $errorCode); } if(DEBUG_MODE && strpos($this->Subject,"LZTMX") === 0) Logging::EmailLog($this->Subject); CacheManager::SetDataUpdateTime(DATA_UPDATE_KEY_EMAILS); } function Destroy($_converted=false) { if(!$_converted) DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_TICKET_EMAILS . "` SET `deleted`=1,`edited`='" . time() . "' WHERE `email_id`='" . DBManager::RealEscape($this->Id) . "' LIMIT 1;"); else DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_TICKET_EMAILS . "` SET `deleted`=2,`edited`='" . time() . "' WHERE `email_id`='" . DBManager::RealEscape($this->Id) . "' LIMIT 1;"); DBManager::Execute(true, "DELETE FROM `" . DB_PREFIX . DATABASE_TICKET_ATTACHMENTS . "` WHERE `parent_id`='" . DBManager::RealEscape($this->Id) . "';"); } static function Exists($_id,$_inEmails=true,$_inMessages=true) { if($_inEmails) { $result = DBManager::Execute(true, "SELECT COUNT(*) AS `ecount` FROM `" . DB_PREFIX . DATABASE_TICKET_EMAILS . "` WHERE `email_id`='" . DBManager::RealEscape($_id) . "';"); if($result && ($row=DBManager::FetchArray($result)) && $row["ecount"] > 0) return true; } if($_inMessages) { $result = DBManager::Execute(true, "SELECT COUNT(*) AS `mcount` FROM `" . DB_PREFIX . DATABASE_TICKET_MESSAGES . "` WHERE `channel_id`='" . DBManager::RealEscape($_id) . "';"); if($result && ($row=DBManager::FetchArray($result)) && $row["mcount"] > 0) return true; } return false; } static function GetHTML($_id) { $result = DBManager::Execute(true, "SELECT `body_html` FROM `" . DB_PREFIX . DATABASE_TICKET_EMAILS . "` WHERE `email_id`='" . DBManager::RealEscape($_id) . "' LIMIT 1;"); if($result) if($row = DBManager::FetchArray($result)) return DBManager::DecodeField($row["body_html"]); } } class Ticket extends Action { public $Messages = array(); public $Group = ""; public $Channel = 0; public $SubChannel = ""; public $Language = ""; public $Deleted = false; public $LastUpdated = 0; public $WaitBegin = 0; public $Editor = null; public $ChannelId = ""; public $ChannelConversationId = ""; public $ChannelUniqueId = ""; public $Logs = array(); public $AutoStatusUpdateTime; public $AutoStatusUpdateStatus; public $WatchList = false; public $Priority = 2; public $Salt = ""; public $Tags = ""; public $Hash = ""; public $PublicLink = ""; function __construct() { $this->Salt = getId(32); if(func_num_args() == 1) { $row = func_get_arg(0); $this->Id = $row["ticket_id"]; $this->SetValues($row); $this->Messages[0] = new TicketMessage($row); } else if(func_num_args() == 2) { $this->Id = func_get_arg(0); $this->Messages[0] = new TicketMessage(getId(32),true); $this->Language = strtoupper(func_get_arg(1)); } else if(func_num_args() == 3) { $row = func_get_arg(0); if(!empty($row["ticket_id"])) $this->Id = $row["ticket_id"]; else $this->Id = $row["id"]; $this->SetValues($row); $this->LoadMessages(func_get_arg(1)!=null); $this->LoadStatus(func_get_arg(1)!=null); } if(!empty($row) && $row["last_update"] == 0 && $row["wait_begin"] == TICKET_NO_WT) { $uticket = new Ticket($this->Id,true); $uticket->LoadMessages(); $uticket->LoadStatus(); $uticket->SetLastUpdate(); $this->LastUpdated = $uticket->LastUpdated; $this->WaitBegin = $uticket->WaitBegin; } } function SetValues($_row) { if(!isset($_row["user_id"])) Logging::ErrorLog(serialize(debug_backtrace())); $this->SenderUserId = $_row["user_id"]; $this->Group = $_row["target_group_id"]; $this->Channel = $_row["channel_type"]; $this->SubChannel = $_row["sub_channel"]; $this->LastUpdated = $_row["last_update"]; $this->Language = $_row["iso_language"]; $this->Deleted = !empty($_row["deleted"]); $this->WaitBegin = $_row["wait_begin"]; $this->Tags = @$_row["tags"]; $this->ChannelId = $_row["channel_id"]; $this->Salt = $_row["salt"]; $this->ChannelConversationId = $_row["channel_conversation_id"]; $this->ChannelUniqueId = @$_row["channel_unique_id"]; $this->AutoStatusUpdateTime = $_row["auto_status_time"]; $this->AutoStatusUpdateStatus = $_row["auto_status_status"]; $this->Priority = $_row["priority"]; $this->Hash = $this->GetHash(); if(defined("LIVEZILLA_URL")) $this->PublicLink = LIVEZILLA_URL . "ticket.php?id=" . $this->Id . "&hash=" . $this->Hash . "&salt=" . $this->Salt; if(IS::Defined("CALLER_SYSTEM_ID") && isset($_row["operator_id"])) $this->WatchList = $_row["operator_id"] == CALLER_SYSTEM_ID; } function Load($_loadStatus=true,$_loadMessages=true) { $result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_TICKETS . "` WHERE `id`='" . DBManager::RealEscape($this->Id) . "';"); if($result && $row = DBManager::FetchArray($result)) { $this->SetValues($row); if($_loadStatus) $this->LoadStatus(); if($_loadMessages) $this->LoadMessages(); return true; } return false; } function GetMessageIndex($_messageId) { $index = 1; foreach($this->Messages as $message) { if($message->Id == $_messageId) return $index; $index++; } return -1; } function LoadStatus($_json=false) { $result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_TICKET_EDITORS . "` WHERE `ticket_id`='" . DBManager::RealEscape($this->Id) . "' LIMIT " . DBManager::RealEscape(DATA_ITEM_LOADS) . ";"); if($result) while($row = DBManager::FetchArray($result)) { $this->Editor = new TicketEditor($this->Id,$row); $this->LastUpdated = max($this->LastUpdated,$this->Editor->Edited); } if($_json) { if($this->Editor!=null) $this->Editor->Editor = Operator::GetUserId($this->Editor->Editor); $this->Editor = array("TicketEditor"=>$this->Editor); } } function LoadMessages($_json=false) { $this->Messages = array(); $result = DBManager::Execute(true,$k="SELECT * FROM `" . DB_PREFIX . DATABASE_TICKET_MESSAGES . "` WHERE `ticket_id`='" . DBManager::RealEscape($this->Id) . "' ORDER BY `time` ASC;"); if($result) while($row = DBManager::FetchArray($result)) { $message = new TicketMessage($row); $this->LastUpdated = max($this->LastUpdated,$message->Created,$message->Edited); $message->LoadAttachments(); $message->LoadCustoms($_json); $message->LoadComments($this); if($_json) $this->Messages[count($this->Messages)] = array("TicketMessage"=>$message); else $this->Messages[count($this->Messages)] = $message; } } function LoadLogs() { $this->Logs = array(); $result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_TICKET_LOGS . "` WHERE `ticket_id`='" . DBManager::RealEscape($this->Id) . "' ORDER BY `created` ASC;"); if($result) while($row = DBManager::FetchArray($result)) $this->Logs[] = $row; } function SetLastUpdate($_set=0,$_wt=true) { if(!empty($_set)) $this->LastUpdated = $_set; if($this->LastUpdated == 0) $this->LastUpdated = 1; DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_TICKETS . "` SET `last_update`='" . DBManager::RealEscape($this->LastUpdated) . "' WHERE `id`='" . DBManager::RealEscape($this->Id) . "' LIMIT 1;"); if($_wt) $this->SetWaitBegin(); } function SetWaitBegin($lastm = null) { $this->LoadStatus(); if($this->Editor != null && $this->Editor->Status > 1) { $this->WaitBegin = TICKET_NO_WT; } else foreach($this->Messages as $message) { if($message->Type < 1 || $message->Type > 2) $this->WaitBegin = ($message->Edited > 0 && $message->Created > 0) ? max($this->WaitBegin,min($message->Edited,$message->Created)) : max($this->WaitBegin,$message->Created); $lastm = $message; } if($lastm != null && ($lastm->Type == 1 || $lastm->Type == 2)) { $this->WaitBegin = TICKET_NO_WT; } if($this->WaitBegin == 0) $this->WaitBegin = TICKET_NO_WT; DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_TICKETS . "` SET `wait_begin`='" . DBManager::RealEscape($this->WaitBegin) . "' WHERE `id`='" . DBManager::RealEscape($this->Id) . "' LIMIT 1;"); } function SetPriority($_priority) { DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_TICKETS . "` SET `priority`=" . intval($_priority) . " WHERE `id`='" . DBManager::RealEscape($this->Id) . "' LIMIT 1;"); } function SetTags($_tags) { Configuration::ApplyTagsToConfig($_tags,1); DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_TICKETS . "` SET `tags`='" . DBManager::RealEscape($_tags) . "' WHERE `id`='" . DBManager::RealEscape($this->Id) . "' LIMIT 1;"); } function AddToWatchList($_operatorId) { DBManager::Execute(true, "INSERT IGNORE INTO `" . DB_PREFIX . DATABASE_TICKET_WATCHER . "` (`ticket_id`,`operator_id`,`created`) VALUES ('" . DBManager::RealEscape($this->Id) . "', '" . DBManager::RealEscape($_operatorId) . "', " . intval(time()) . ");"); } function RemoveFromWatchList($_operatorId) { DBManager::Execute(true, "DELETE FROM `" . DB_PREFIX . DATABASE_TICKET_WATCHER . "` WHERE `ticket_id`='" . DBManager::RealEscape($this->Id) . "' AND `operator_id`='" . DBManager::RealEscape($_operatorId) . "' LIMIT 1;"); } function GetHash($_brackets=false,$_html=false) { if(is_numeric($this->Id)) $hash = substr(strtoupper(md5($this->Id.Server::$Configuration->File["gl_lzid"])),0,12); else return $this->Id; if($_html) return "<!--[" . $hash . "]-->"; return ($_brackets) ? "[" . $hash . "]" : $hash; } function GetLastOutgoingMessageId() { $id = ""; foreach($this->Messages as $message) if($message->Type == 1) $id = $message->Id; return $id; } function GetXML($_full,$_demand=false) { if($_full) { $wb = (!($this->Editor != null && $this->Editor->Status > 1)) ? $this->WaitBegin : TICKET_NO_WT; $xml = "<val id=\"".base64_encode($this->Id)."\" u=\"".base64_encode($this->LastUpdated)."\" w=\"".base64_encode($wb)."\" sa=\"".base64_encode($this->Salt)."\" ta=\"".base64_encode($this->Tags)."\" del=\"".base64_encode($this->Deleted ? "1" : "0")."\" wl=\"".base64_encode($this->WatchList ? "1" : "0")."\" gr=\"".base64_encode($this->Group)."\" uid=\"".base64_encode($this->SenderUserId)."\" l=\"".base64_encode($this->Language)."\" h=\"".base64_encode($this->GetHash())."\" p=\"".base64_encode($this->Priority)."\" t=\"".base64_encode($this->Channel)."\" s=\"".base64_encode($this->SubChannel)."\">\r\n"; if($_demand && $this->Editor != null) $xml .= $this->Editor->GetXml($wb,$this->LastUpdated); foreach($this->Messages as $message) $xml .= $message->GetXML($_demand); if(!empty($this->AutoStatusUpdateTime)) $xml .= "<au t=\"".base64_encode($this->AutoStatusUpdateTime)."\">".base64_encode($this->AutoStatusUpdateStatus)."</au>\r\n"; foreach($this->Logs as $row) $xml .= "<lo c=\"".base64_encode($row["created"])."\" ti=\"".base64_encode($row["time"])."\" t=\"".base64_encode($row["ticket_id"])."\" a=\"".base64_encode($row["action"])."\" o=\"".base64_encode($row["operator_id"])."\" v=\"".base64_encode($row["value_old"])."\" m=\"".base64_encode($row["message_id"])."\">".base64_encode($row["value_new"])."</lo>\r\n"; $xml .= "</val>\r\n"; } else { foreach($this->Messages as $message) { $xml = "<val id=\"".base64_encode($this->Id)."\" e=\"".base64_encode($message->Edited)."\" />\r\n"; break; } } return $xml; } function LinkChat($_chatId, $messageId) { $result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_CHAT_ARCHIVE . "` WHERE `chat_id`='" . DBManager::RealEscape(trim($_chatId)) . "' AND `closed`>0 LIMIT 1;"); if($row = DBManager::FetchArray($result)) $chatref = new TicketChat($row, $messageId); else $chatref = new TicketChat($_chatId, $messageId, true); $chatref->Save($this->Id,true); if(!empty($row["external_id"])) { $this->SetVisitor($row["external_id"]); } } function SetVisitor($_visitorId) { DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_TICKETS . "` SET `user_id`='" . DBManager::RealEscape($_visitorId) . "' WHERE `user_id`='' AND `id`='" . DBManager::RealEscape($this->Id) . "' LIMIT 1;"); DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_TICKET_MESSAGES . "` SET `sender_id`='" . DBManager::RealEscape($_visitorId) . "' WHERE `sender_id`='' AND `id`='" . DBManager::RealEscape($this->Id) . "' LIMIT 1;"); } function LinkTicket($_subTicketId) { $result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_TICKETS . "` INNER JOIN `" . DB_PREFIX . DATABASE_TICKET_MESSAGES . "` ON `" . DB_PREFIX . DATABASE_TICKETS . "`.`id`=`" . DB_PREFIX . DATABASE_TICKET_MESSAGES . "`.`ticket_id` WHERE `ticket_id` = '" . DBManager::RealEscape($_subTicketId) . "'"); while($result && $row = DBManager::FetchArray($result)) { $subTicket = new Ticket($row); if(!$subTicket->Deleted) { $tm = $subTicket->Messages[0]; $nid = getId(32); DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_TICKET_CUSTOMS . "` SET `message_id`='" . DBManager::RealEscape($nid) . "' WHERE `message_id` = '" . DBManager::RealEscape($tm->Id) . "';"); DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_TICKET_ATTACHMENTS . "` SET `parent_id`='" . DBManager::RealEscape($nid) . "' WHERE `parent_id` = '" . DBManager::RealEscape($tm->Id) . "';"); DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_TICKET_COMMENTS . "` SET `message_id`='" . DBManager::RealEscape($nid) . "' WHERE `message_id` = '" . DBManager::RealEscape($tm->Id) . "';"); $tm->Id = $nid; if($tm->Type == 2) $tm->ChannelId = $tm->ChannelId . "_" . getId(1); else $tm->ChannelId = getId(32); $tm->Save($this->Id); DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_TICKET_LOGS . "` SET `time`='" . DBManager::RealEscape(time()) . "',`ticket_id`='" . DBManager::RealEscape($this->Id) . "' WHERE `ticket_id` = '" . DBManager::RealEscape($_subTicketId) . "';"); DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_TICKET_CUSTOMS . "` SET `ticket_id`='" . DBManager::RealEscape($this->Id) . "' WHERE `ticket_id` = '" . DBManager::RealEscape($_subTicketId) . "';"); DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_TICKET_COMMENTS . "` SET `time`='" . DBManager::RealEscape(time()) . "',`ticket_id`='" . DBManager::RealEscape($this->Id) . "' WHERE `ticket_id` = '" . DBManager::RealEscape($_subTicketId) . "';"); $subTicket->Destroy(); } } $this->Log(4,CALLER_SYSTEM_ID,$this->Id,$_subTicketId); } function LinkFeedback($_linkFeedbackId) { $mid = getId(32); $result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_FEEDBACKS . "` WHERE `id`='" . DBManager::RealEscape(trim($_linkFeedbackId)) . "' LIMIT 1;"); if($row = DBManager::FetchArray($result)) $feed = new TicketFeedback($row, $mid); $feed->Save($this->Id,true); } function SendOperatorReply($_messageId, $_email, $_qMessageId = "", $_ecc = "", $_ebcc = "") { $tsData = array("",""); $reply = new TicketMessage($_messageId,false); $reply->Load(); $pdm = PredefinedMessage::GetByLanguage(Server::$Groups[$this->Group]->PredefinedMessages,$this->Language); if($pdm != null && $this->Channel < 6) { if(!empty($pdm->EmailTicketReplyBodyPlaintext)) $tsData[0] = $pdm->EmailTicketReplyBodyPlaintext; if(!empty($pdm->EmailTicketReplyBodyHTML)) $tsData[1] = $pdm->EmailTicketReplyBodyHTML; } // load last message id for quote from API calls where no message is referenced if(empty($_qMessageId) && !empty($reply->TicketId)) { $ticket = new Ticket(); $ticket->Id = $reply->TicketId; $ticket->LoadMessages(); if(count($ticket->Messages) > 1) $_qMessageId = $ticket->Messages[count($ticket->Messages)-2]->Id; } $remoteHashes = ""; if(!empty($_qMessageId)) { $quote = new TicketMessage($_qMessageId,false); $quote->Load(); $tsData[0] = $quote->TextReplace($tsData[0],$this->Group); $tsData[1] = $quote->TextReplace($tsData[1],$this->Group); if(preg_match_all("/\[[a-zA-Z\d]{12}\]/", $quote->Text . $quote->HTML, $matches)) { if(count($matches[0]) > 1) $matches[0] = array_unique($matches[0]); $remoteHashes = implode(",",$matches[0]); } } else $quote = null; $isMaskedReceiver = $_email == "[__[MASKED]__]"; if($isMaskedReceiver) { $ticket = new Ticket(); $ticket->Id = $reply->TicketId; $ticket->LoadMessages(); $_email = $ticket->Messages[0]->Email; } $tsData[0] = Server::$Groups[$this->Group]->TextReplace($tsData[0],$this->Language); $tsData[1] = Server::$Groups[$this->Group]->TextReplace($tsData[1],$this->Language); $tsData[0] = Server::$Operators[CALLER_SYSTEM_ID]->TextReplace($tsData[0]); $tsData[1] = Server::$Operators[CALLER_SYSTEM_ID]->TextReplace($tsData[1]); $tsData[0] = $this->TextReplace($tsData[0]); $tsData[1] = $this->TextReplace($tsData[1]); for($i=0;$i<count($tsData);$i++) { // 0 = plain if($i==1 && empty($tsData[1])) continue; $lb = ($i==0) ? "\r\n\r\n" : "<br><br>"; if(empty($tsData[$i]) || strpos($tsData[$i],"%mailtext%")===false) $tsData[$i] .= $lb . "%mailtext%"; if($this->Channel < 6) { if(empty($tsData[$i]) || strpos($tsData[$i],"%ticket_hash%")===false) $tsData[$i] .= $lb . "%ticket_hash%"; } $qText = (!empty($quote)) ? "\r\n\r\n" . $quote->GetQuoteFormat($i==0) : ""; $htmlBody = !empty($reply->HTML) ? $reply->HTML : htmlentities($reply->Text,ENT_QUOTES,"UTF-8"); $tText = (($i==0) ? $reply->Text : $htmlBody); $tText = (($i==0) ? $tText : nl2br($tText))."<!--lz_ref_link-->"; if(isset(Server::$Operators[$reply->SenderUserId])) $tsData[$i] = Server::$Operators[$reply->SenderUserId]->TextReplace($tsData[$i]); $tsData[$i] = Server::$Groups[$this->Group]->TextReplace($tsData[$i],$this->Language); $tsData[$i] = Configuration::Replace($tsData[$i]); if(!empty($remoteHashes) && strpos($tsData[$i],"%quote%") === false && strpos($tText,$remoteHashes) === false) $tText .= $lb . $remoteHashes; else $tsData[$i] = str_replace("%quote%",trim($qText),$tsData[$i]); $tsData[$i] = str_replace("%mailtext%",$tText,$tsData[$i]); $tsData[$i] = str_replace("%ticket_hash%",$this->GetHash(true,$i==1),$tsData[$i]); $tsData[$i] = str_replace("%ticket_hash_nb%",$this->GetHash(false),$tsData[$i]); $tsData[$i] = str_replace("%domain%",Server::$Configuration->File["gl_site_name"],$tsData[$i]); $tsData[$i] = Mailbox::FinalizeDataBlock($tsData[$i],$i==1,$this->Channel >= 6); $tsData[$i] = $this->TextReplace($tsData[$i]); } if(empty($reply->Subject)) { $reply->Subject = ($pdm != null) ? $pdm->SubjectTicketReply : ""; $reply->Subject = str_replace("%ticket_hash%",$this->GetHash(true),$reply->Subject); } if($this->Channel >= 6 && !empty($this->ChannelId)) { $channel = SocialMediaChannel::GetChannelById($this->ChannelId); if($channel != null) $channel->SendReply($this,$reply,str_replace($this->GetHash(true),"",trim($tsData[0])),$quote); } $mailbox = Mailbox::GetById(Server::$Groups[$this->Group]->TicketEmailOut,true); if($mailbox != null) { if(!empty(Server::$Configuration->File["gl_scoo"])) { if(!empty($_ebcc)) $_ebcc .= "," . trim(Server::$Configuration->File["gl_scoo"]); else $_ebcc = trim(Server::$Configuration->File["gl_scoo"]); } $senderName = Server::$Groups[$this->Group]->GetTicketSenderName($this); Communication::SendEmail($mailbox, str_replace(array(",,", ";"), ",", $_email), $_ecc, $_ebcc, $mailbox->Email, $tsData[0], $tsData[1], Mailbox::GetSubject($reply->Subject, $_email, $this->Messages[0]->Fullname, $this->Group, "", $this->Messages[0]->Company, $this->Messages[0]->Phone, $this->Messages[0]->IP, $this->Messages[0]->Text, Server::$Groups[$this->Group]->GetDescription($this->Language), $this->Messages[0]->Customs), false, $reply->Attachments, "", $senderName); } } function SendAutoresponder($_visitor=null, $_browser=null, $_message=null) { if(empty($_message)) $_message = $this->Messages[0]; $tsData = array("","",""); if(!empty(Server::$Groups[$this->Group]->PredefinedMessages)) { $pdm = PredefinedMessage::GetByLanguage(Server::$Groups[$this->Group]->PredefinedMessages,$this->Language); if($pdm != null) { if(!empty($pdm->EmailTicketResponderBodyPlaintext)) $tsData[0] = $pdm->EmailTicketResponderBodyPlaintext; if(!empty($pdm->EmailTicketResponderBodyHTML)) $tsData[1] = $pdm->EmailTicketResponderBodyHTML; $tsData[2] = $pdm->SubjectTicketResponder; } } if(empty($tsData[0])) { return; } for($i=0;$i<count($tsData);$i++) { $lb = ($i==0) ? "\r\n\r\n" : "<br><br>"; $tText = (($i!=1) ? $_message->Text : nl2br(htmlentities($_message->Text,ENT_QUOTES,"UTF-8")))."<!--lz_ref_link-->"; $tsData[$i] = str_replace("%mailtext%",$tText,$tsData[$i]); $cr = $_message->Created; if(empty($cr)) $cr = time(); $tsData[$i] = str_replace("%localdate%",date("Y-m-d",$cr),$tsData[$i]); $tsData[$i] = $_message->TextReplace($tsData[$i],$this->Group); if(strpos($tsData[$i],"%ticket_hash%")===false) { if(!empty($tsData[$i]) && $i < 2) $tsData[$i] .= $lb . "%ticket_hash%"; } $tsData[$i] = $this->TextReplace($tsData[$i]); $tsData[$i] = Server::$Groups[$this->Group]->TextReplace($tsData[$i],$this->Language); if(!empty($_visitor)) $tsData[$i] = $_visitor->TextReplace($tsData[$i]); if(!empty($_browser)) $tsData[$i] = $_browser->TextReplace($tsData[$i]); $tsData[$i] = Configuration::Replace($tsData[$i]); $tsData[$i] = Mailbox::FinalizeDataBlock($tsData[$i],$i==1); $tsData[$i] = Server::Replace($tsData[$i]); } $mailbox = Mailbox::GetById(Server::$Groups[$this->Group]->TicketEmailOut,true); if($mailbox != null) { $mb = clone $mailbox; $replytoint = (Mailbox::IsValidEmail($_message->Email)) ? $_message->Email : $mb->Email; $replytoex = $mb->Email; $fakeSender = ""; $senderName = ""; if(!empty(Server::$Configuration->File["gl_usmasend"]) && Mailbox::IsValidEmail($_message->Email)) $fakeSender = $_message->Email; if(!empty(Server::$Configuration->File["gl_scom"])) Communication::SendEmail($mb, Server::$Configuration->File["gl_scom"], "", "", $replytoint, $tsData[0], $tsData[1], $tsData[2], false, null, $fakeSender, $senderName); if(!empty(Server::$Configuration->File["gl_sgom"])) Communication::SendEmail($mb, Server::$Groups[$this->Group]->Email, "", "", $replytoint, $tsData[0], $tsData[1], $tsData[2], false, null, $fakeSender, $senderName); if(!empty(Server::$Configuration->File["gl_ssom"]) && Mailbox::IsValidEmail($_message->Email)) Communication::SendEmail($mb, str_replace(";", ",", $_message->Email), "", "", $replytoex, $tsData[0], $tsData[1], $tsData[2], false, null, $fakeSender, $senderName); } } function SendNotifier($_oldGroup="",$_newGroup="") { global $LZLANG; if($_oldGroup != $_newGroup) { $group = Server::$Groups[$_newGroup]; if($group->SendTicketNotifier) { $mailbox = null; $defmailbox = Mailbox::GetDefaultOutgoing(); if(!empty($group->ChatEmailOut)) $mailbox = Mailbox::GetById($group->ChatEmailOut); $mailbox = (!empty($mailbox)) ? $mailbox : $defmailbox; if(!empty($mailbox)) foreach($group->GetOperators() as $operator) { $bodyHTML = $LZLANG["client_group_new_ticket_notify"]; $bodyHTML = str_replace("<!--ticket_id-->",$this->Id,$bodyHTML); $bodyHTML = str_replace("<!--operator_name-->",$operator->Fullname,$bodyHTML); $bodyHTML = str_replace("<!--group_name-->",$group->Id,$bodyHTML); $bodyPlain = str_replace("<br>","\r\n",$bodyHTML); $bodyPlain = str_replace("<!--client_url-->",LIVEZILLA_URL . "mobile/",$bodyPlain); $bodyPlain = str_replace("<!--ticket_url-->",LIVEZILLA_URL . "ticket.php?id=".$this->Id."&hash=".$this->GetHash()."&salt=".$this->Salt,$bodyPlain); $bodyHTML = str_replace("<!--client_url-->","<a href=\"".LIVEZILLA_URL . "mobile/" ."\">" . LIVEZILLA_URL . "mobile/" . "</a>",$bodyHTML); $bodyHTML = str_replace("<!--ticket_url-->","<a href=\"".LIVEZILLA_URL . "ticket.php?id=".$this->Id."&hash=".$this->GetHash()."&salt=".$this->Salt ."\">" . LIVEZILLA_URL . "ticket.php?id=".$this->Id."&hash=".$this->GetHash()."&salt=".$this->Salt . "</a>",$bodyHTML); $subject = $LZLANG["client_group_new_ticket_notify_subject"]; $subject = str_replace("<!--ticket_id-->",$this->Id,$subject); $subject = str_replace("<!--group_name-->",$group->Id,$subject); Communication::SendEmail($mailbox, str_replace(array(",,", ";"), ",", $operator->Email), "", "", $mailbox->Email, $bodyPlain, $bodyHTML, $subject, false, null, "", ""); } } } } function Save($_hash="",$_saveMessages=true) { if(empty($_hash)) $_hash = $this->GetHash(); if(empty($this->Salt)) $this->Salt = getId(32); if(DBManager::Execute(true, "INSERT IGNORE INTO `" . DB_PREFIX . DATABASE_TICKETS . "` (`id`,`user_id`,`target_group_id`,`hash`,`channel_type`,`sub_channel`,`iso_language`,`channel_id`,`channel_conversation_id`,`channel_unique_id`,`priority`,`salt`,`tags`) VALUES ('" . DBManager::RealEscape($this->Id) . "', '" . DBManager::RealEscape($this->SenderUserId) . "', '" . DBManager::RealEscape($this->Group) . "', '" . DBManager::RealEscape($_hash) . "', '" . DBManager::RealEscape($this->Channel) . "', '" . DBManager::RealEscape($this->SubChannel) . "', '" . DBManager::RealEscape($this->Language) . "', '" . DBManager::RealEscape($this->ChannelId) . "', '" . DBManager::RealEscape($this->ChannelConversationId) . "', '" . DBManager::RealEscape($this->ChannelUniqueId) . "', " . intval($this->Priority) . ", '" . DBManager::RealEscape($this->Salt) . "', '" . DBManager::RealEscape($this->Tags) . "');")) { Configuration::ApplyTagsToConfig($this->Tags,2); if($_saveMessages && count($this->Messages) > 0) { $this->Messages[0]->Hash = $_hash; $saved = $this->Messages[0]->Save($this->Id,false,null,$this); if($saved === false) { //Logging::DebugLog("Save ticket: " . $this->Id . ": Double ticket creating, aborting ..."); DBManager::Execute(true, "DELETE FROM `" . DB_PREFIX . DATABASE_TICKETS . "` WHERE `id` = '" . DBManager::RealEscape($this->Id) . "' LIMIT 1;"); } else $this->SendNotifier("",$this->Group); } else Logging::DebugLog("Save ticket: ticket created but no message to store"); } else Logging::DebugLog("Save ticket: can't save ticket " . $this->Id); CacheManager::SetDataUpdateTime(DATA_UPDATE_KEY_TICKETS); } function AutoAssignEditor($editor="") { $teditor = new TicketEditor($this->Id); $teditor->Editor = ""; if(isset(Server::$Groups[$this->Group]) && !empty(Server::$Groups[$this->Group]->TicketAssignment)) { $load = array(); $sumtickets = 0; $sumpriorities = 0; foreach(Server::$Groups[$this->Group]->TicketAssignment as $sysid => $priority) { if(isset(Server::$Operators[$sysid]) && !Server::$Operators[$sysid]->IsBot) { $load[$sysid] = TicketEditor::GetTicketCountByEditor($sysid); $sumtickets += $load[$sysid]; $sumpriorities += ($priority*10); } } foreach(Server::$Groups[$this->Group]->TicketAssignment as $sysid => $priority) { if(isset(Server::$Operators[$sysid]) && !Server::$Operators[$sysid]->IsBot) $load[$sysid] = $load[$sysid] - ($sumtickets*($priority*10/$sumpriorities)); } if(!empty($load)) { asort($load); if(min($load) == max($load)) for($i=0;$i<rand(0,(count($load)-1));$i++) next($load); $editor = key($load); } if(!empty($editor)) { $teditor = new TicketEditor($this->Id); $teditor->Editor = $editor; $teditor->Status = 0; } } $teditor->Save(); } function Reactivate() { if($this->Editor != null) $this->Log(0,"",1,$this->Editor->Status); DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_TICKET_EDITORS . "` SET `status`=1,`time`=" . SystemTime::GetUniqueMessageTime(DATABASE_TICKET_EDITORS, "time") . " WHERE `status`>=2 AND `ticket_id`='" . DBManager::RealEscape($this->Id) . "' LIMIT 1;"); CacheManager::SetDataUpdateTime(DATA_UPDATE_KEY_TICKETS); } function UpdateMessageTime() { if($result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_TICKET_MESSAGES . "` WHERE `ticket_id`='" . DBManager::RealEscape($this->Id) . "';")) while($row = DBManager::FetchArray($result)) DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_TICKET_MESSAGES . "` SET `time`=" . SystemTime::GetUniqueMessageTime(DATABASE_TICKET_MESSAGES, "time") . " WHERE `id` = '" . DBManager::RealEscape($row["id"]) . "' LIMIT 1;"); } function SetLanguage($_language) { DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_TICKETS . "` SET `iso_language` = '" . DBManager::RealEscape($_language) . "' WHERE `id`= '" . DBManager::RealEscape($this->Id) . "';"); $this->UpdateMessageTime(); } function SetGroup($_group) { $this->SendNotifier($this->Group,$_group); DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_TICKETS . "` SET `target_group_id` = '" . DBManager::RealEscape($_group) . "' WHERE `id`= '" . DBManager::RealEscape($this->Id) . "' LIMIT 1;"); $this->UpdateMessageTime(); } function SetChannel($_channel) { DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_TICKETS . "` SET `channel_type` = " . intval($_channel) . " WHERE `id`= '" . DBManager::RealEscape($this->Id) . "' LIMIT 1;"); } function SetSubChannel($_subChannel) { DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_TICKETS . "` SET `sub_channel` = '" . DBManager::RealEscape($_subChannel) . "' WHERE `id`= '" . DBManager::RealEscape($this->Id) . "' LIMIT 1;"); } function SetAutoStatusUpdate($_time,$_status) { DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_TICKETS . "` SET `auto_status_time` = " . intval($_time) . ",`auto_status_status` = " . intval($_status) . " WHERE `id`= '" . DBManager::RealEscape($this->Id) . "' LIMIT 1;"); } function Destroy() { DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_TICKETS . "` SET `deleted`=1 WHERE `id` = '" . DBManager::RealEscape($this->Id) . "' LIMIT 1;"); $this->UpdateMessageTime(); } function TextReplace($_text) { if(!empty($this->Messages)) $_text = $this->Messages[0]->TextReplace($_text,$this->Group); $_text = str_replace("%ticket_hash%",$this->GetHash(true),$_text); $_text = str_replace("%domain%",Server::$Configuration->File["gl_site_name"],$_text); $_text = str_replace("%feedback_link%",Feedback::GetLink("tid=" . Encoding::Base64UrlEncode($this->Id)),$_text); $_text = str_replace("%ticket_history_link%",(LIVEZILLA_URL . "ticket.php?id=" . $this->Id . "&hash=".$this->GetHash(false)."&salt=" . $this->Salt),$_text); $_text = str_replace("%ticket_hash_nb%",$this->GetHash(false),$_text); $_text = str_replace("%ticket_id%",$this->Id,$_text); return $_text; } function Log($_action,$_operatorId,$_newValue,$_oldValue="",$_messageId="") { // 32 = resend message // 31 = last ticket view if($_action == 31) DBManager::Execute(true, "DELETE FROM `" . DB_PREFIX . DATABASE_TICKET_LOGS . "` WHERE `ticket_id`='" . DBManager::RealEscape($this->Id) . "' AND `action` = 31 AND `operator_id`='" . DBManager::RealEscape($_operatorId) . "';"); // 30 = draft if($_action == 30) DBManager::Execute(true, "DELETE FROM `" . DB_PREFIX . DATABASE_TICKET_LOGS . "` WHERE `ticket_id`='" . DBManager::RealEscape($this->Id) . "' AND `action` = 30;"); if($_newValue!=$_oldValue) DBManager::Execute(true, "INSERT IGNORE INTO `" . DB_PREFIX . DATABASE_TICKET_LOGS . "` (`created`,`time`,`ticket_id`,`operator_id`,`action`,`value_old`,`value_new`,`message_id`) VALUES ('" . DBManager::RealEscape($time = SystemTime::GetUniqueMessageTime(DATABASE_TICKET_LOGS, "time")) . "','" . $time . "','" . DBManager::RealEscape($this->Id) . "', '" . DBManager::RealEscape($_operatorId) . "', '" . DBManager::RealEscape($_action) . "', '" . DBManager::RealEscape($_oldValue) . "', '" . DBManager::RealEscape($_newValue) . "', '" . DBManager::RealEscape($_messageId) . "');"); } function ApplyAttributesFromPost($_index) { if(isset($_POST[POST_INTERN_PROCESS_TICKET_ACTIONS . "_" . $_index . "_vt"])) $this->SetChannel($_POST[POST_INTERN_PROCESS_TICKET_ACTIONS . "_" . $_index . "_vt"]); if(isset($_POST[POST_INTERN_PROCESS_TICKET_ACTIONS . "_" . $_index . "_vu"])) $this->SetSubChannel($_POST[POST_INTERN_PROCESS_TICKET_ACTIONS . "_" . $_index . "_vu"]); else $this->SetSubChannel(""); if(isset($_POST[POST_INTERN_PROCESS_TICKET_ACTIONS . "_" . $_index . "_vyx"])) $this->SetTags($_POST[POST_INTERN_PROCESS_TICKET_ACTIONS . "_" . $_index . "_vyx"]); if(isset($_POST[POST_INTERN_PROCESS_TICKET_ACTIONS . "_" . $_index . "_vv"])) $this->SetAutoStatusUpdate($_POST[POST_INTERN_PROCESS_TICKET_ACTIONS . "_" . $_index . "_vv"],$_POST[POST_INTERN_PROCESS_TICKET_ACTIONS . "_" . $_index . "_vw"]); } static function GetMessageCount($_ticketId) { $result = DBManager::Execute(true, "SELECT COUNT(*) AS `mcount` FROM `" . DB_PREFIX . DATABASE_TICKET_MESSAGES . "` WHERE `ticket_id` = '" . DBManager::RealEscape($_ticketId) . "'"); while($result && $row = DBManager::FetchArray($result)) return $row["mcount"]; return 0; } static function Exists($_hash, &$id, &$group, &$language) { $_hash = strtoupper(str_replace(array("[","]"),"",$_hash)); $result = DBManager::Execute(true, "SELECT `dbt`.`id`,`dbt`.`target_group_id`,`dbt`.`iso_language` FROM `" . DB_PREFIX . DATABASE_TICKETS . "` AS `dbt` WHERE `dbt`.`deleted`=0 AND `dbt`.`hash`='" . DBManager::RealEscape($_hash) . "' LIMIT 1;"); if($result && $row = DBManager::FetchArray($result)) { $id=$row["id"]; $group=$row["target_group_id"]; $language=$row["iso_language"]; } return (DBManager::GetRowCount($result) == 1); } static function UniqueChannelIdExists($_uniqueId) { $result = DBManager::Execute(true, "SELECT `channel_unique_id` FROM `" . DB_PREFIX . DATABASE_TICKETS . "` WHERE `channel_unique_id`='" . DBManager::RealEscape($_uniqueId) . "' LIMIT 1;"); if($result && $row = DBManager::FetchArray($result)) { } return (DBManager::GetRowCount($result) == 1); } static function GetById($_id) { $result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_TICKETS . "` WHERE `id`='" . DBManager::RealEscape($_id) . "';"); if($result) if($row = DBManager::FetchArray($result)) return new Ticket($row["id"],true); return null; } static function GetOpenByUserId($_id,$_newerThan=0) { $result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_TICKETS . "` WHERE `user_id`='" . DBManager::RealEscape($_id) . "' AND `last_update` > ".intval($_newerThan)." AND `deleted`=0 ORDER BY `last_update` DESC LIMIT 1;"); if($result) if($row = DBManager::FetchArray($result)) { $ticket = new Ticket($row["id"],true); $ticket->Load(true,true); if(!($ticket->Editor != null && $ticket->Editor->Status >= 2)) { return $ticket; } } return null; } static function GetSearchQuery($_sFor,$_tags) { $query = ""; if(!empty($_sFor)) { $ss = "11111111111110"; if(isset($_POST["p_dt_q_ss"]) && is_numeric($_POST["p_dt_q_ss"])) $ss = $_POST["p_dt_q_ss"]; $ss = str_split($ss); $query .= "LOWER(`".DB_PREFIX.DATABASE_TICKETS."`.`sub_channel`) LIKE '%".$_sFor."%'"; $query .= " OR LOWER(`".DB_PREFIX.DATABASE_TICKETS."`.`hash`) LIKE '%".$_sFor."%'"; if($ss[1]=="1")$query .= " OR LOWER(`te`.`sub_status`) LIKE '%".$_sFor."%'"; if($ss[12]=="1")$query .= " OR LOWER(`do`.`firstname`) LIKE '%".$_sFor."%'"; if($ss[12]=="1")$query .= " OR LOWER(`do`.`lastname`) LIKE '%".$_sFor."%'"; if($ss[4]=="1")$query .= " OR `tm`.`sender_id` LIKE '%".$_sFor."%'"; if($ss[5]=="1")$query .= " OR `tm`.`ticket_id` LIKE '%".$_sFor."%'"; if($ss[6]=="1")$query .= " OR LOWER(`tc`.`value`) LIKE '%".$_sFor."%'"; if($ss[7]=="1")$query .= " OR LOWER(`tm`.`text`) LIKE '%".$_sFor."%'"; if($ss[3]=="1")$query .= " OR LOWER(`tm`.`fullname`) LIKE '%".$_sFor."%'"; if($ss[8]=="1")$query .= " OR LOWER(`tm`.`email`) LIKE '%".$_sFor."%'"; if($ss[9]=="1")$query .= " OR LOWER(`tm`.`company`) LIKE '%".$_sFor."%'"; if($ss[10]=="1")$query .= " OR LOWER(`tm`.`phone`) LIKE '%".$_sFor."%'"; if($ss[11]=="1")$query .= " OR LOWER(`tm`.`subject`) LIKE '%".$_sFor."%'"; if(isset($ss[13]) && $ss[13]=="1")$query .= " OR LOWER(`tcom`.`comment`) LIKE '%".$_sFor."%'"; } if(!empty($_POST["p_dt_q_e"])) { $q_e = DBManager::RealEscape(strtolower($_POST["p_dt_q_e"])); $emails = explode(",",$q_e); foreach($emails as $email) $query .= " OR LOWER(`tm`.`email`) LIKE '%".DBManager::RealEscape(trim($email),true)."%'"; } if(!empty($query)) $query = " AND (" . $query . ")"; if(!empty($_tags)) { $query .= " AND ("; $count = 0; foreach(explode(",",$_tags) as $tag) { if($count > 0) $query .= " OR "; $query .= "FIND_IN_SET('".DBManager::RealEscape($tag)."',tags) > 0"; $count++; } $query .= ")"; } return $query; } static function CreateFromChatArchive($_chatId) { $achat = new Chat(); $achat->ChatId = $_chatId; $achat->Load(); $ticket = Ticket::GetOpenByUserId($achat->VisitorId,time()-(86400*3)); if($ticket != null) { $message = new TicketMessage(); $message->Id = getId(32); $message->ChannelId = $_chatId; $message->Fullname = $achat->Fullname; $message->Email = $achat->Email; $message->Text = $achat->PlainText; $message->HTML = $achat->HTML; if(empty($message->Text)) $message->Text = $achat->Question; $message->Company = $achat->Company; $message->Phone = $achat->Phone; $message->Type = 4; $message->Subject = $achat->Question; $message->Customs = DataInput::ToIndexBased($achat->Customs); $message->Save($ticket->Id); } else { $ticket = new Ticket(CacheManager::GetObjectId("ticket_id",DATABASE_TICKETS),""); $ticket->SenderUserId = $achat->VisitorId; $ticket->Channel = 4; $ticket->Group = $achat->Group; $ticket->Language = $achat->Language; $ticket->Messages[0]->Id = $ticket->Id; $ticket->Messages[0]->ChannelId = $_chatId; $ticket->Messages[0]->Fullname = $achat->Fullname; $ticket->Messages[0]->Email = $achat->Email; $ticket->Messages[0]->Text = $achat->PlainText; $ticket->Messages[0]->HTML = $achat->HTML; if(empty($ticket->Messages[0]->Text)) $ticket->Messages[0]->Text = $achat->Question; $ticket->Messages[0]->Company = $achat->Company; $ticket->Messages[0]->Phone = $achat->Phone; $ticket->Messages[0]->Type = 4; $ticket->Messages[0]->Subject = $achat->Question; $ticket->Messages[0]->Customs = DataInput::ToIndexBased($achat->Customs); $ticket->Save(); } $ticket->SetLastUpdate(time()); } } class TicketSubDefinition { public $Id; public $Type; public $ParentId; function __construct() { if(func_num_args() == 1) { $this->SetDetails(func_get_arg(0)); } else if(func_num_args() == 2) { $this->Id = $_POST["p_cfg_tsd_i_" . func_get_arg(0)]; $this->Type = $_POST["p_cfg_tsd_t_" . func_get_arg(0)]; $this->ParentId = $_POST["p_cfg_tsd_p_" . func_get_arg(0)]; } } function SetDetails($_row) { $this->Id = $_row["id"]; $this->Type = $_row["type"]; $this->ParentId = $_row["parent_id"]; } function GetShortId() { return substr(md5($this->Id.$this->Type.$this->ParentId),0,5); } function Save() { DBManager::Execute(true, "INSERT INTO `" . DB_PREFIX . DATABASE_TICKET_SUBS . "` (`id` ,`type` ,`parent_id`) VALUES ('" . DBManager::RealEscape($this->Id) . "'," . intval($this->Type) . ",'" . DBManager::RealEscape($this->ParentId) . "');"); } function GetXML() { return "<tsd i=\"".base64_encode($this->Id)."\" t=\"".base64_encode($this->Type)."\" p=\"".base64_encode($this->ParentId)."\" />\r\n"; } } class Response { public $XML = ""; public $Internals=""; public $Groups=""; public $InternalProfilePictures=""; public $InternalWebcamPictures=""; public $Typing=""; public $Exceptions=""; public $Filters=""; public $Events=""; public $EventTriggers=""; public $Authentications=""; public $Posts=""; public $Login; public $Feedbacks=""; public $Messages=""; public $Reports=null; public $Archive=""; public $Resources=""; public $ChatVouchers=""; public $GlobalHash; public $Actions=""; public $Goals=""; public $Forwards=""; public $Chats; public $Visitors=""; public $VisitorBrowsers=""; public $VisitorBrowserURLs=""; function SetStandardResponse($_code,$_sub) { $this->XML = "<response><value id=\"".base64_encode($_code)."\" />" . $_sub . "</response>"; } function SetValidationError($_code,$_addition="") { if(!empty($_addition)) $this->XML = "<validation_error value=\"".base64_encode($_code)."\" error=\"".base64_encode($_addition)."\" />"; else $this->XML = "<validation_error value=\"".base64_encode($_code)."\" />"; } function GetXML($_operator=false) { if($_operator) { $this->GlobalHash = substr(md5($this->XML),0,5); if($_POST[POST_INTERN_SERVER_ACTION] != INTERN_ACTION_LISTEN || (isset($_POST[POST_GLOBAL_XMLCLIP_HASH_ALL]) && $_POST[POST_GLOBAL_XMLCLIP_HASH_ALL] != $this->GlobalHash)) { $this->XML = str_replace("<!--gl_all-->",base64_encode(substr(md5($this->XML),0,5)),$this->XML); if(isset($_POST["p_clienttime"])) { $td = SystemTime::GetTimeDifference($_POST["p_clienttime"]); $this->XML .= "<timesync timediff=\"".base64_encode($td)."\" time=\"".base64_encode(time())."\" />"; } } else { return ""; } return str_replace("<!--execution_time-->",base64_encode(floor(SystemTime::GetRuntime(ACCESSTIME))),$this->GetXML()); } return "<?xml version=\"1.0\" encoding=\"UTF-8\" ?><livezilla_xml><livezilla_version>".base64_encode(VERSION)."</livezilla_version>" . $this->XML . "</livezilla_xml>"; } } class FileEditor { public $Result; public $TargetFile; function __construct($_file) { $this->TargetFile = $_file; } function Load() { if(file_exists($this->TargetFile)) { $handle = @fopen ($this->TargetFile, "r"); while (!@feof($handle)) $this->Result .= @fgets($handle, 4096); $length = strlen($this->Result); $this->Result = @unserialize($this->Result); @fclose($handle); } } function Save($_data) { if(strpos($this->TargetFile,"..") === false) { $handle = @fopen($this->TargetFile, "w"); if(!empty($_data)) @fputs($handle,serialize($_data)); @fclose($handle); } } } class Forward extends Action { public $InitiatorSystemId; public $TargetSessId; public $TargetGroupId; public $Processed = false; public $Invite = false; public $ChatId; public $Auto; function __construct() { $this->Id = getId(32); if(func_num_args() == 2) { $this->ChatId = func_get_arg(0); $this->SenderSystemId = func_get_arg(1); $this->Load(); } else if(func_num_args() == 1) { $this->SetValues(func_get_arg(0)); } } function Save($_processed=false,$_received=false) { if(!$_processed) DBManager::Execute(true, "INSERT INTO `" . DB_PREFIX . DATABASE_CHAT_FORWARDS . "` (`id`, `created`, `initiator_operator_id`,`sender_operator_id`, `target_operator_id`, `target_group_id`, `chat_id`,`visitor_id`,`browser_id`, `info_text`, `invite`, `auto`) VALUES ('" . DBManager::RealEscape($this->Id) . "','" . DBManager::RealEscape(time()) . "','" . DBManager::RealEscape($this->InitiatorSystemId) . "','" . DBManager::RealEscape($this->SenderSystemId) . "', '" . DBManager::RealEscape($this->TargetSessId) . "', '" . DBManager::RealEscape($this->TargetGroupId) . "', '" . DBManager::RealEscape($this->ChatId) . "', '" . DBManager::RealEscape($this->ReceiverUserId) . "', '" . DBManager::RealEscape($this->ReceiverBrowserId) . "', '" . DBManager::RealEscape($this->Text) . "', '" . DBManager::RealEscape(($this->Invite) ? "1" : "0") . "', '" . DBManager::RealEscape(($this->Auto) ? "1" : "0") . "');"); else DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_CHAT_FORWARDS . "` SET `processed`='1' WHERE `id`='" . DBManager::RealEscape($this->Id) . "' LIMIT 1; "); if($_received) DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_CHAT_FORWARDS . "` SET `received`='1' WHERE `id`='" . DBManager::RealEscape($this->Id) . "' LIMIT 1; "); } function Load() { $result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_CHAT_FORWARDS . "` WHERE `closed`=0 AND `id`='" . DBManager::RealEscape($this->Id) . "' AND `received`=0 LIMIT 1;"); if($result && $row = DBManager::FetchArray($result)) $this->SetValues($row); } function SetValues($_row) { $this->Id = $_row["id"]; $this->InitiatorSystemId = $_row["initiator_operator_id"]; $this->SenderSystemId = $_row["sender_operator_id"]; $this->TargetSessId = $_row["target_operator_id"]; $this->TargetGroupId = $_row["target_group_id"]; $this->ReceiverUserId = $_row["visitor_id"]; $this->ReceiverBrowserId = $_row["browser_id"]; $this->ChatId = $_row["chat_id"]; $this->Created = $_row["created"]; $this->Received = $_row["received"]; $this->Text = $_row["info_text"]; $this->Processed = !empty($_row["processed"]); $this->Invite = !empty($_row["invite"]); $this->Auto = !empty($_row["auto"]); $this->Closed = !empty($_row["closed"]); } function GetXml() { return "<fw id=\"".base64_encode($this->Id)."\" pr=\"".base64_encode(($this->Processed) ? "1" : "0")."\" cr=\"".base64_encode($this->Created)."\" u=\"".base64_encode($this->ReceiverUserId."~".$this->ReceiverBrowserId)."\" c=\"".base64_encode($this->ChatId)."\" i=\"".base64_encode($this->InitiatorSystemId)."\" s=\"".base64_encode($this->SenderSystemId)."\" t=\"".base64_encode($this->Text)."\" r=\"".base64_encode($this->TargetSessId)."\" g=\"".base64_encode($this->TargetGroupId)."\" inv=\"".base64_encode(($this->Invite) ? "1" : "0")."\" />\r\n"; } function Destroy() { DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_CHAT_FORWARDS . "` SET `closed`=1 WHERE `id`='" . DBManager::RealEscape($this->Id) . "' LIMIT 1;"); } } class EventActionInternal extends Action { public $TriggerId; function __construct() { if(func_num_args() == 2) { $this->Id = getId(32); $this->ReceiverUserId = func_get_arg(0); $this->TriggerId = func_get_arg(1); } else { $_row = func_get_arg(0); $this->TriggerId = $_row["trigger_id"]; $this->EventActionId = $_row["action_id"]; } } function Save() { DBManager::Execute(true, "INSERT INTO `" . DB_PREFIX . DATABASE_EVENT_ACTION_INTERNALS . "` (`id`, `created`, `trigger_id`, `receiver_user_id`) VALUES ('" . DBManager::RealEscape($this->Id) . "', '" . DBManager::RealEscape(time()) . "', '" . DBManager::RealEscape($this->TriggerId) . "', '" . DBManager::RealEscape($this->ReceiverUserId) . "');"); } function GetXml($_visitorId="",$_browserId="") { return "<ia time=\"".base64_encode(time())."\" aid=\"".base64_encode($this->EventActionId)."\" vid=\"".base64_encode($_visitorId)."\" bid=\"".base64_encode($_browserId)."\" />\r\n"; } } class ChatRequest extends Action { public $Invitation; public $Canceled; public $Type; function __construct() { if(func_num_args() == 5) { $this->Id = getId(32); $this->SenderSystemId = func_get_arg(0); $this->SenderGroupId = func_get_arg(1); $this->ReceiverUserId = func_get_arg(2); $this->BrowserId = func_get_arg(3); $this->Text = func_get_arg(4); } else if(func_num_args() == 2) { $this->Id = func_get_arg(0); $this->Load(); } else { $row = func_get_arg(0); $this->SetValues($row); } if(!empty(Server::$Configuration->File["gl_itim"]) && !empty($this->Created) && $this->Created < (time()-Server::$Configuration->File["gl_itim"])) if(empty($this->Canceled) && !$this->Closed) $this->Cancel("Timeout"); } function SetStatus($_displayed,$_accepted,$_declined,$_closed=false) { if($_displayed) DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_CHAT_REQUESTS . "` SET `displayed`='1',`accepted`='0',`declined`='0' WHERE `id`='" . DBManager::RealEscape($this->Id) . "' LIMIT 1;"); if($_accepted) DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_CHAT_REQUESTS . "` SET `displayed`='1',`accepted`='1' WHERE `declined`=0 AND `id`='" . DBManager::RealEscape($this->Id) . "' LIMIT 1;"); else if($_declined) DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_CHAT_REQUESTS . "` SET `displayed`='1',`declined`='1' WHERE `accepted`=0 AND `id`='" . DBManager::RealEscape($this->Id) . "' LIMIT 1;"); if($_closed) DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_CHAT_REQUESTS . "` SET `closed`='1' WHERE `id`='" . DBManager::RealEscape($this->Id) . "' LIMIT 1;"); $visitor = new Visitor($this->ReceiverUserId); $visitor->ForceUpdate(); } function Cancel($_user) { if(!$this->Closed && empty($this->Canceled) && !$this->Accepted && !$this->Declined) { DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_CHAT_REQUESTS . "` SET `closed`=1,`canceled`='" . DBManager::RealEscape($_user) . "' WHERE `canceled`='' AND `closed`=0 AND `accepted`=0 AND `declined`=0 AND `id`='" . DBManager::RealEscape($this->Id) . "';"); if(DBManager::GetAffectedRowCount() > 0) { $this->Canceled = $_user; $visitor = new Visitor($this->ReceiverUserId); $visitor->ForceUpdate(); } } } function SetValues($_row) { $this->Id = $_row["id"]; $this->SenderSystemId = $_row["sender_system_id"]; $this->SenderUserId = $_row["sender_system_id"]; $this->SenderGroupId = $_row["sender_group_id"]; $this->ReceiverUserId = $_row["receiver_user_id"]; $this->BrowserId = $_row["receiver_browser_id"]; $this->EventActionId = $_row["event_action_id"]; $this->Created = $_row["created"]; $this->Text = $_row["text"]; $this->Displayed = !empty($_row["displayed"]); $this->Accepted = !empty($_row["accepted"]); $this->Declined = !empty($_row["declined"]); $this->Closed = !empty($_row["closed"]); $this->Canceled = $_row["canceled"]; $this->Type = $_row["type"]; } function Load() { if($result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_CHAT_REQUESTS . "` WHERE `id`='" . DBManager::RealEscape($this->Id) . "';")) if($row = DBManager::FetchArray($result)) $this->SetValues($row); } function Save($_onlineOnly=true) { if(Server::$Operators[$this->SenderSystemId]->IsExternal(Server::$Groups) || !$_onlineOnly) DBManager::Execute(true, "INSERT INTO `" . DB_PREFIX . DATABASE_CHAT_REQUESTS . "` (`id`, `created`, `sender_system_id`, `sender_group_id`,`receiver_user_id`, `receiver_browser_id`,`event_action_id`, `text`, `type`) VALUES ('" . DBManager::RealEscape($this->Id) . "', '" . DBManager::RealEscape(time()) . "','" . DBManager::RealEscape($this->SenderSystemId) . "','" . DBManager::RealEscape($this->SenderGroupId) . "','" . DBManager::RealEscape($this->ReceiverUserId) . "', '" . DBManager::RealEscape($this->BrowserId) . "','" . DBManager::RealEscape($this->EventActionId) . "','" . DBManager::RealEscape($this->Text) . "'," . intval($_onlineOnly ? 2 : 22) . ");"); $visitor = new Visitor($this->ReceiverUserId); $visitor->ForceUpdate(); } function Destroy() { DBManager::Execute(true, "DELETE FROM `" . DB_PREFIX . DATABASE_CHAT_REQUESTS . "` WHERE `id`='" . DBManager::RealEscape($this->Id) . "' LIMIT 1;"); } function GetXML() { return "<r i=\"".base64_encode($this->Id)."\" c=\"".base64_encode($this->Created)."\" ca=\"".base64_encode($this->Canceled)."\" s=\"".base64_encode($this->SenderSystemId)."\" b=\"".base64_encode($this->BrowserId)."\" e=\"".base64_encode($this->EventActionId)."\" d=\"".base64_encode($this->Displayed ? 1 : 0)."\" a=\"".base64_encode($this->Accepted ? 1 : 0)."\" de=\"".base64_encode($this->Declined ? 1 : 0)."\" g=\"".base64_encode($this->SenderGroupId)."\" cl=\"".base64_encode($this->Closed ? 1 : 0)."\">".base64_encode($this->Text)."</r>\r\n"; } function IsAnswered($_ignoreAccepted=false) { return ($this->Accepted && !$_ignoreAccepted) || $this->Declined || $this->Closed || $this->Canceled; } function CreateInvitationTemplate($_style,$_siteName,$_cwWidth,$_cwHeight,$_serverURL,$_sender,$_closeOnClick) { $template = ((!empty(Server::$Configuration->File["gl_caii"])) && @file_exists(TEMPLATE_SCRIPT_INVITATION . $_style . "/invitation_header.tpl")) ? IOStruct::GetFile(TEMPLATE_SCRIPT_INVITATION . $_style . "/invitation_header.tpl") : IOStruct::GetFile(TEMPLATE_SCRIPT_INVITATION . $_style . "/invitation.tpl"); $template = str_replace("<!--logo-->","<img src=\"". Server::$Configuration->File["gl_caii"]."\" border=\"0\">",$template); $template = str_replace("<!--site_name-->",$_siteName,$template); $template = str_replace("<!--intern_name-->",$_sender->Fullname,$template); $template = str_replace("<!--template-->",$_style,$template); $template = str_replace("<!--group_id-->",Encoding::Base64UrlEncode($this->SenderGroupId),$template); $template = str_replace("<!--user_id-->",Encoding::Base64UrlEncode($_sender->UserId),$template); $template = str_replace("<!--width-->",$_cwWidth,$template); $template = str_replace("<!--height-->",$_cwHeight,$template); $template = str_replace("<!--server-->",$_serverURL,$template); $template = str_replace("<!--intern_image-->",$_sender->GetOperatorPictureFile(),$template); $template = str_replace("<!--close_on_click-->",$_closeOnClick,$template); return $template; } public static function AcceptAll($_userId) { ChatRequest::AnswerAll(true,$_userId); } public static function DeclineAll($_userId) { ChatRequest::AnswerAll(false,$_userId); } public static function AnswerAll($_accept,$_userId) { if($result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_CHAT_REQUESTS . "` WHERE `receiver_user_id`='" . DBManager::RealEscape($_userId) . "';")) while($row = DBManager::FetchArray($result)) { $request = new ChatRequest($row); if(!$request->IsAnswered()) { $request->SetStatus(false,$_accept,!$_accept); } } } } class OverlayElement extends BaseObject { public $Position = "11"; public $Speed = 8; public $Effect = 0; public $Width = 600; public $Height = 550; public $Margin; public $CloseOnClick; public $HTML; public $Style = "classic"; public $Shadow = false; public $ShadowPositionX = 5; public $ShadowPositionY = 5; public $ShadowBlur = 5; public $ShadowColor = "000000"; public $Background = true; public $BackgroundColor = "000000"; public $BackgroundOpacity = 0.5; function __construct() { if(func_num_args() == 1) { $_row = func_get_arg(0); $this->Style = $_row["style"]; $this->Id = $_row["id"]; $this->Position = $_row["position"]; $this->Margin = array($_row["margin_left"],$_row["margin_top"],$_row["margin_right"],$_row["margin_bottom"]); $this->Speed = $_row["speed"]; $this->Effect = $_row["slide"]; $this->CloseOnClick = $_row["close_on_click"]; $this->Shadow = !empty($_row["shadow"]); $this->ShadowPositionX = $_row["shadow_x"]; $this->ShadowPositionY = $_row["shadow_x"]; $this->ShadowBlur = $_row["shadow_blur"]; $this->ShadowColor = @$_row["shadow_color"]; $this->Width = $_row["width"]; $this->Height = $_row["height"]; $this->Background = !empty($_row["background"]); $this->BackgroundColor = $_row["background_color"]; $this->BackgroundOpacity = $_row["background_opacity"]; } else if(func_num_args() == 20) { $this->Id = getId(32); $this->ActionId = func_get_arg(0); $this->Position = func_get_arg(1); $this->Margin = array(func_get_arg(2),func_get_arg(3),func_get_arg(4),func_get_arg(5)); $this->Speed = func_get_arg(6); $this->Style = func_get_arg(7); $this->Effect = func_get_arg(8); $this->CloseOnClick = func_get_arg(9); $this->Shadow = func_get_arg(10); $this->ShadowPositionX = func_get_arg(11); $this->ShadowPositionY = func_get_arg(12); $this->ShadowBlur = func_get_arg(13); $this->ShadowColor = func_get_arg(14); $this->Width = func_get_arg(15); $this->Height = func_get_arg(16); $this->Background = !Is::Null(func_get_arg(17)); $this->BackgroundColor = func_get_arg(18); $this->BackgroundOpacity = func_get_arg(19); } else $this->Margin = array(0,0,0,0); } function GetXML() { return "<evolb id=\"".base64_encode($this->Id)."\" bgo=\"".base64_encode($this->BackgroundOpacity)."\" bgc=\"".base64_encode($this->BackgroundColor)."\" bg=\"".base64_encode($this->Background)."\" h=\"".base64_encode($this->Height)."\" w=\"".base64_encode($this->Width)."\" ml=\"".base64_encode($this->Margin[0])."\" mt=\"".base64_encode($this->Margin[1])."\" mr=\"".base64_encode($this->Margin[2])."\" mb=\"".base64_encode($this->Margin[3])."\" pos=\"".base64_encode($this->Position)."\" speed=\"".base64_encode($this->Speed)."\" eff=\"".base64_encode($this->Effect)."\" style=\"".base64_encode($this->Style)."\" coc=\"".base64_encode($this->CloseOnClick)."\" sh=\"".base64_encode($this->Shadow)."\" shpx=\"".base64_encode($this->ShadowPositionX)."\" shpy=\"".base64_encode($this->ShadowPositionY)."\" shb=\"".base64_encode($this->ShadowBlur)."\" shc=\"".base64_encode($this->ShadowColor)."\" />\r\n"; } function GetCommand() { return "lz_tracking_add_overlay_box('".base64_encode($this->Id)."','".base64_encode($this->HTML)."',".$this->Position.",".$this->Speed."," . $this->Effect . ",".To::BoolString($this->Shadow)."," . $this->ShadowBlur . "," . $this->ShadowPositionX . "," . $this->ShadowPositionY . ",'" . $this->ShadowColor . "',".$this->Margin[0].",".$this->Margin[1].",".$this->Margin[2].",".$this->Margin[3].",".$this->Width.",".$this->Height.",".To::BoolString($this->Background).",'".$this->BackgroundColor."',".$this->BackgroundOpacity.",".intval(($this->Style == "rounded")? 5 : 0).");"; } } class Invitation extends OverlayElement { public $ActionId; public $Senders; public $Text; function __construct() { if(func_num_args() == 1) { $_row = func_get_arg(0); $this->Style = $_row["style"]; $this->Id = $_row["id"]; $this->Position = $_row["position"]; $this->Margin = array($_row["margin_left"],$_row["margin_top"],$_row["margin_right"],$_row["margin_bottom"]); $this->Speed = $_row["speed"]; $this->Effect = $_row["slide"]; $this->CloseOnClick = $_row["close_on_click"]; $this->Shadow = $_row["shadow"]; $this->ShadowPositionX = @$_row["shadow_x"]; $this->ShadowPositionY = @$_row["shadow_x"]; $this->ShadowBlur = @$_row["shadow_blur"]; $this->ShadowColor = $_row["shadow_color"]; $this->Background = !empty($_row["background"]); $this->BackgroundColor = @$_row["background_color"]; $this->BackgroundOpacity = @$_row["background_opacity"]; } else if(func_num_args() == 2) { $this->Id = getId(32); $this->ActionId = func_get_arg(0); $values = func_get_arg(1); $this->CloseOnClick = $values[0]; $this->Position = $values[1]; $this->Margin = array($values[2],$values[3],$values[4],$values[5]); $this->Effect = $values[6]; $this->Shadow = $values[7]; $this->ShadowBlur = $values[8]; $this->ShadowColor = $values[9]; $this->ShadowPositionX = $values[10]; $this->ShadowPositionY = $values[11]; $this->Speed = $values[12]; $this->Style = $values[13]; $this->Background = $values[14]; $this->BackgroundColor = $values[15]; $this->BackgroundOpacity = str_replace(",",".",$values[16]); } else if(func_num_args() > 2) { $this->HTML = func_get_arg(0); $this->Text = func_get_arg(1); $values = func_get_arg(2); $this->CloseOnClick = $values[0]; $this->Position = $values[1]; $this->Margin = Array($values[2],$values[3],$values[4],$values[5]); $this->Effect = $values[6]; $this->Shadow = $values[7]; $this->ShadowBlur = $values[8]; $this->ShadowColor = $values[9]; $this->ShadowPositionX = $values[10]; $this->ShadowPositionY = $values[11]; $this->Speed = $values[12]; $this->Style = $values[13]; $this->Background = $values[14]; $this->BackgroundColor = $values[15]; $this->BackgroundOpacity = str_replace(",",".",$values[16]); } if(!empty($this->Style)) { $dimensions = (!empty(Server::$Configuration->File["gl_caii"]) && @file_exists(TEMPLATE_SCRIPT_INVITATION . $this->Style . "/dimensions_header.txt")) ? explode(",",IOStruct::GetFile(TEMPLATE_SCRIPT_INVITATION . $this->Style . "/dimensions_header.txt")) : explode(",",IOStruct::GetFile(TEMPLATE_SCRIPT_INVITATION . $this->Style . "/dimensions.txt")); $this->Width = @$dimensions[0]; $this->Height = @$dimensions[1]; $settings_string = (@file_exists(TEMPLATE_SCRIPT_INVITATION . $this->Style . "/settings.txt")) ? IOStruct::GetFile(TEMPLATE_SCRIPT_INVITATION . $this->Style . "/settings.txt") : ""; if(strpos($settings_string,"noshadow") !== false) $this->Shadow = false; } $this->Senders = array(); } function GetSenders($_onlineOnly=true) { Server::InitDataBlock(array("INTERNAL","GROUPS")); foreach($this->Senders as $sender) if(empty($sender->UserSystemId) && !empty($sender->GroupId)) { $senderList = array(); foreach(Server::$Operators as $sysid => $operator) if($operator->IsInGroup($sender->GroupId) && $operator->IsExternal(Server::$Groups,null,array($sender->GroupId),false,false,!$_onlineOnly)) $senderList[$sysid] = new EventActionSender($this->ActionId,$sysid,$sender->GroupId,5); return $senderList; } return $this->Senders; } function GetGroupSender() { foreach($this->Senders as $sender) if(empty($sender->UserSystemId) && !empty($sender->GroupId)) return $sender->GroupId; return ""; } function GetXML() { $xml = "<evinv id=\"".base64_encode($this->Id)."\" bgo=\"".base64_encode($this->BackgroundOpacity)."\" bgc=\"".base64_encode($this->BackgroundColor)."\" bg=\"".base64_encode($this->Background)."\" ml=\"".base64_encode($this->Margin[0])."\" mt=\"".base64_encode($this->Margin[1])."\" mr=\"".base64_encode($this->Margin[2])."\" mb=\"".base64_encode($this->Margin[3])."\" pos=\"".base64_encode($this->Position)."\" speed=\"".base64_encode($this->Speed)."\" eff=\"".base64_encode($this->Effect)."\" style=\"".base64_encode($this->Style)."\" coc=\"".base64_encode($this->CloseOnClick)."\" sh=\"".base64_encode($this->Shadow)."\" shpx=\"".base64_encode($this->ShadowPositionX)."\" shpy=\"".base64_encode($this->ShadowPositionY)."\" shb=\"".base64_encode($this->ShadowBlur)."\" shc=\"".base64_encode($this->ShadowColor)."\">\r\n"; foreach($this->Senders as $sender) $xml .= $sender->GetXML(); return $xml . "</evinv>\r\n"; } } class EventTrigger { public $Id; public $ActionId; public $EventId = ""; public $ReceiverUserId; public $ReceiverBrowserId; public $Triggered; public $TriggerTime; public $Exists = false; function __construct() { if(func_num_args() == 6) { $this->Id = getId(32); $this->ReceiverUserId = func_get_arg(0); $this->ReceiverBrowserId = func_get_arg(1); $this->ActionId = func_get_arg(2); $this->TriggerTime = func_get_arg(3); $this->Triggered = func_get_arg(4); $this->EventId = func_get_arg(5); } else { $_row = func_get_arg(0); $this->Id = $_row["id"]; $this->ReceiverUserId = $_row["receiver_user_id"]; $this->ReceiverBrowserId = $_row["receiver_browser_id"]; $this->ActionId = $_row["action_id"]; $this->EventId = $_row["event_id"]; $this->Triggered = $_row["triggered"]; $this->TriggerTime = $_row["time"]; } } function Load() { $this->Exists = false; if($result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_EVENT_TRIGGERS . "` WHERE `receiver_user_id`='" . DBManager::RealEscape($this->ReceiverUserId) . "' AND `receiver_browser_id`='" . DBManager::RealEscape($this->ReceiverBrowserId) . "' AND `action_id`='" . DBManager::RealEscape($this->ActionId) . "' ORDER BY `time` ASC;")) if($row = DBManager::FetchArray($result)) { $this->Id = $row["id"]; $this->TriggerTime = $row["time"]; $this->Triggered = $row["triggered"]; $this->Exists = true; } } function Update() { DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_EVENT_TRIGGERS . "` SET `time`='" . DBManager::RealEscape(time()) . "' WHERE `id`='" . DBManager::RealEscape($this->Id) . "' LIMIT 1;"); } function Save() { if(!$this->Exists) DBManager::Execute(true, "INSERT INTO `" . DB_PREFIX . DATABASE_EVENT_TRIGGERS . "` (`id`, `receiver_user_id`, `receiver_browser_id`, `action_id`, `event_id`, `time`, `triggered`) VALUES ('" . DBManager::RealEscape($this->Id) . "','" . DBManager::RealEscape($this->ReceiverUserId) . "', '" . DBManager::RealEscape($this->ReceiverBrowserId) . "','" . DBManager::RealEscape($this->ActionId) . "', '" . DBManager::RealEscape($this->EventId) . "','" . DBManager::RealEscape($this->TriggerTime) . "','" . DBManager::RealEscape($this->Triggered) . "');"); else DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_EVENT_TRIGGERS . "` SET `triggered`=`triggered`+1, `time`='" . DBManager::RealEscape(time()) . "' WHERE `id`='" . DBManager::RealEscape($this->Id) . "' LIMIT 1;"); } } class EventAction { public $Id = ""; public $EventId = ""; public $Type = ""; public $Value = ""; public $Invitation; public $Receivers; function __construct() { if(func_num_args() == 1) { $_row = func_get_arg(0); $this->Id = $_row["id"]; $this->EventId = $_row["eid"]; $this->Type = $_row["type"]; $this->Value = $_row["value"]; } else if(func_num_args() == 2) { $this->Id = func_get_arg(0); $this->Type = func_get_arg(1); } else { $this->EventId = func_get_arg(0); $this->Id = func_get_arg(1); $this->Type = func_get_arg(2); $this->Value = func_get_arg(3); } $this->Receivers = array(); } function GetSQL() { return "INSERT INTO `".DB_PREFIX.DATABASE_EVENT_ACTIONS."` (`id`, `eid`, `type`, `value`) VALUES ('".DBManager::RealEscape($this->Id)."', '".DBManager::RealEscape($this->EventId)."','".DBManager::RealEscape($this->Type)."', '".DBManager::RealEscape($this->Value)."');"; } function GetXML() { $xml = "<evac id=\"".base64_encode($this->Id)."\" type=\"".base64_encode($this->Type)."\" val=\"".base64_encode($this->Value)."\">\r\n"; if(!empty($this->Invitation)) $xml .= $this->Invitation->GetXML(); foreach($this->Receivers as $receiver) $xml .= $receiver->GetXML(); return $xml . "</evac>\r\n"; } function Exists($_receiverUserId,$_receiverBrowserId) { if($this->Type == 2 || $this->Type == 22) { if($result = DBManager::Execute(true, "SELECT `id` FROM `" . DB_PREFIX . DATABASE_CHAT_REQUESTS . "` WHERE `receiver_user_id`='" . DBManager::RealEscape($_receiverUserId) . "' AND `receiver_browser_id`='" . DBManager::RealEscape($_receiverBrowserId) . "' AND `event_action_id`='" . DBManager::RealEscape($this->Id) . "' AND `accepted`='0' AND `declined`='0' LIMIT 1;")) if($row = DBManager::FetchArray($result)) return true; } return false; } function Execute($_param,$_visitor,$_chat=null) { if($this->Type == 7) { $object = json_decode($this->Value); $postData = array("json_visitor"=>json_encode($_visitor)); if($_chat != null) $postData["json_chat"]=json_encode($_chat); $response = Server::CallURL($object->Url,$postData); if(!empty($response)) { $_visitor->VisitorData->LoadFromEvent($object->ToField,$response); $_visitor->ApplyVisitorData(); } } } function GetInternalReceivers() { $receivers = array(); if($result = DBManager::Execute(true, "SELECT `receiver_id` FROM `" . DB_PREFIX . DATABASE_EVENT_ACTION_RECEIVERS . "` WHERE `action_id`='" . DBManager::RealEscape($this->Id) . "';")) while($row = DBManager::FetchArray($result)) $receivers[]=$row["receiver_id"]; return $receivers; } } class EventActionSender { public $Id = ""; public $ParentId = ""; public $UserSystemId = ""; public $GroupId = ""; public $Priority = 1; function __construct() { if(func_num_args() == 1) { $_row = func_get_arg(0); $this->Id = $_row["id"]; $this->ParentId = $_row["pid"]; $this->UserSystemId = $_row["user_id"]; $this->GroupId = $_row["group_id"]; $this->Priority = $_row["priority"]; } else if(func_num_args() == 2) { $this->Id = getId(32); $this->ParentId = func_get_arg(0); $this->GroupId = func_get_arg(1); } else if(func_num_args() == 4) { $this->Id = getId(32); $this->ParentId = func_get_arg(0); $this->UserSystemId = func_get_arg(1); $this->GroupId = func_get_arg(2); $this->Priority = func_get_arg(3); } } function SaveSender() { return DBManager::Execute(true, "INSERT INTO `" . DB_PREFIX . DATABASE_EVENT_ACTION_SENDERS . "` (`id`, `pid`, `user_id`, `group_id`, `priority`) VALUES ('" . DBManager::RealEscape($this->Id) . "', '" . DBManager::RealEscape($this->ParentId) . "','" . DBManager::RealEscape($this->UserSystemId) . "','" . DBManager::RealEscape($this->GroupId) . "', " . intval($this->Priority) . ");"); } function GetXML() { return "<evinvs id=\"".base64_encode($this->Id)."\" userid=\"".base64_encode($this->UserSystemId)."\" groupid=\"".base64_encode($this->GroupId)."\" priority=\"".base64_encode($this->Priority)."\" />\r\n"; } } class EventActionReceiver { public $Id = ""; public $ReceiverId = ""; function __construct() { if(func_num_args() == 1) { $_row = func_get_arg(0); $this->Id = $_row["id"]; $this->ActionId = $_row["action_id"]; $this->ReceiverId = $_row["receiver_id"]; } else { $this->Id = getId(32); $this->ActionId = func_get_arg(0); $this->ReceiverId = func_get_arg(1); } } function GetSQL() { return "INSERT INTO `".DB_PREFIX.DATABASE_EVENT_ACTION_RECEIVERS."` (`id`, `action_id`, `receiver_id`) VALUES ('".DBManager::RealEscape($this->Id)."', '".DBManager::RealEscape($this->ActionId)."', '".DBManager::RealEscape($this->ReceiverId)."');"; } function GetXML() { return "<evr id=\"".base64_encode($this->Id)."\" rec=\"".base64_encode($this->ReceiverId)."\" />\r\n"; } } class EventURL { public $Id = ""; public $EventId = ""; public $URL = ""; public $Referrer = ""; public $TimeOnSite = ""; public $Blacklist; function __construct() { if(func_num_args() == 1) { $_row = func_get_arg(0); $this->Id = $_row["id"]; $this->URL = $_row["url"]; $this->Referrer = $_row["referrer"]; $this->TimeOnSite = $_row["time_on_site"]; $this->Blacklist = !empty($_row["blacklist"]); } else { $this->Id = func_get_arg(0); $this->EventId = func_get_arg(1); $this->URL = strtolower(func_get_arg(2)); $this->Referrer = strtolower(func_get_arg(3)); $this->TimeOnSite = func_get_arg(4); $this->Blacklist = func_get_arg(5); } } function GetSQL() { return "INSERT IGNORE INTO `".DB_PREFIX.DATABASE_EVENT_URLS."` (`id`, `eid`, `url`, `referrer`, `time_on_site`, `blacklist`) VALUES ('".DBManager::RealEscape($this->Id)."', '".DBManager::RealEscape($this->EventId)."','".DBManager::RealEscape($this->URL)."', '".DBManager::RealEscape($this->Referrer)."', '".DBManager::RealEscape($this->TimeOnSite)."', '".DBManager::RealEscape($this->Blacklist)."');"; } function GetXML() { return "<evur id=\"".base64_encode($this->Id)."\" url=\"".base64_encode($this->URL)."\" ref=\"".base64_encode($this->Referrer)."\" tos=\"".base64_encode($this->TimeOnSite)."\" bl=\"".base64_encode($this->Blacklist)."\" />\r\n"; } } class Event extends BaseObject { public $Name = ""; public $PagesVisited = ""; public $TimeOnSite = ""; public $Receivers; public $URLs; public $Actions; public $NotAccepted; public $NotDeclined; public $TriggerTime; public $TriggerPage; public $SearchPhrase = ""; public $TriggerAmount; public $NotInChat; public $Priority; public $IsActive; public $SaveInCookie; public $Goals; public $FunnelUrls; public $ExcludeMobile; public $ExcludeCountries; public $IncludeCountries; public $DataConditions; public $TriggerChatCreated; public $TriggerChatClosed; public $TriggerTriggerCreated; public static $RetryIn = 0; function __construct() { $this->FunnelUrls = array(); $this->Goals = array(); if(func_num_args() == 1) { $_row = func_get_arg(0); $this->Id = $_row["id"]; $this->Name = $_row["name"]; $this->Edited = $_row["edited"]; $this->Editor = $_row["editor"]; $this->Created = $_row["created"]; $this->Creator = $_row["creator"]; $this->TimeOnSite = $_row["time_on_site"]; $this->PagesVisited = $_row["pages_visited"]; $this->NotAccepted = $_row["not_accepted"]; $this->NotDeclined = $_row["not_declined"]; $this->NotInChat = $_row["not_in_chat"]; $this->TriggerChatCreated = $_row["is_in_chat"]; $this->TriggerAmount = $_row["max_trigger_amount"]; $this->TriggerTime = $_row["trigger_again_after"]; $this->TriggerPage = !empty($_row["trigger_again_page"]); $this->SearchPhrase = $_row["search_phrase"]; $this->Priority = $_row["priority"]; $this->IsActive = !empty($_row["is_active"]); $this->SaveInCookie = !empty($_row["save_cookie"]); $this->ExcludeMobile = !empty($_row["exclude_mobile"]); $this->ExcludeCountries = $_row["exclude_countries"]; $this->IncludeCountries = $_row["include_countries"]; $this->TriggerChatClosed = $_row["chat_ends"]; $this->URLs = array(); $this->Actions = array(); $this->Receivers = array(); $this->DataConditions = (isset($_row["data_conditions"]) && !empty($_row["data_conditions"])) ? @unserialize($_row["data_conditions"]) : array(); for($i=0;$i<count($this->DataConditions);$i++) { $arr = $this->DataConditions[$i]; array_walk($arr,"b64dcode"); $this->DataConditions[$i] = $arr; } } else { $this->Id = func_get_arg(0); $this->Name = func_get_arg(1); $this->Edited = func_get_arg(2); $this->Created = func_get_arg(3); if($this->Created==0) $this->Created = time(); $this->Edited = time(); $this->Editor = func_get_arg(4); $this->Creator = func_get_arg(5); if($this->Creator=='') $this->Creator = CALLER_SYSTEM_ID; $this->TimeOnSite = func_get_arg(6); $this->PagesVisited = func_get_arg(7); $this->NotAccepted = func_get_arg(8); $this->NotDeclined = func_get_arg(9); $this->TriggerTime = func_get_arg(10); $this->TriggerAmount = func_get_arg(11); $this->NotInChat = func_get_arg(12); $this->Priority = func_get_arg(13); $this->IsActive = func_get_arg(14); $this->SearchPhrase = func_get_arg(15); $this->SaveInCookie = func_get_arg(16); $this->ExcludeMobile = func_get_arg(17); $this->ExcludeCountries = func_get_arg(18); $this->TriggerChatCreated = func_get_arg(19); $this->TriggerPage = func_get_arg(20); $this->IncludeCountries = func_get_arg(21); $this->TriggerChatClosed = func_get_arg(22); } } function MatchesTriggerCriterias($_trigger,$_initial) { $match = true; if($this->TriggerTime > 0 && $_trigger->TriggerTime >= (time()-$this->TriggerTime)) $match = false; else if($this->TriggerAmount == 0 || ($this->TriggerAmount > 0 && $_trigger->Triggered > $this->TriggerAmount)) $match = false; else if($this->TriggerPage && !$_initial) $match = false; return $match; } function MatchDataConditions($_visitor) { if(empty($this->DataConditions)) return true; foreach($this->DataConditions as $dcarr) { $inputIndex = $dcarr[0]; $value = $dcarr[1]; foreach(Server::$Inputs as $input) { if($input->Index == $inputIndex) { if(Is::WildcardMatch(base64_decode($value),$input->GetValue($_visitor))) return true; } } } return false; } function MatchVisitorConditions($_pageCount,$_timeOnSite,$_invAccepted,$_invDeclined,$_wasInChat,$_searchPhrase="",$_isMobile=false,$_country="",$_isInChat=false) { $match = true; if($_timeOnSite < 0) $_timeOnSite = 0; if(empty(Server::$Configuration->File["gl_vmac"])) $_timeOnSite = (Visitor::$PollCount-1) * Server::$Configuration->File["poll_frequency_tracking"]; if($this->PagesVisited > 0 && $_pageCount < $this->PagesVisited) $match = false; else if($this->TimeOnSite > 0 && $_timeOnSite < ($this->TimeOnSite-3)) { Event::SetRetryIn($this->TimeOnSite-$_timeOnSite); $match = false; } else if(!empty($this->NotAccepted) && $_invAccepted) $match = false; else if(!empty($this->NotDeclined) && $_invDeclined) $match = false; else if(!empty($this->NotInChat) && $_wasInChat) $match = false; else if(!empty($this->TriggerChatCreated) && !$_wasInChat) $match = false; else if(!empty($this->TriggerChatClosed) && !($_wasInChat && !$_isInChat)) $match = false; if($_isMobile && $this->ExcludeMobile) $match = false; if(!empty($this->ExcludeCountries) && !empty($_country)) { $countries = explode(",",strtolower($this->ExcludeCountries)); if(!empty($countries) && in_array(strtolower($_country),$countries)) $match = false; } if(!empty($this->IncludeCountries) && !empty($_country)) { $countries = explode(",",strtolower($this->IncludeCountries)); if(!empty($countries) && !in_array(strtolower($_country),$countries)) $match = false; } if(!empty($this->SearchPhrase)) { if(empty($_searchPhrase)) $match = false; else { $spmatch=false; $phrases = explode(",",$this->SearchPhrase); foreach($phrases as $phrase) if(Is::WildcardMatch($phrase,$_searchPhrase)) { $spmatch = true; break; } if(!$spmatch) $match = false; } } return $match; } function MatchesURLFunnelCriterias($_history) { $startpos = -1; $count = 0; $pos = 0; foreach($_history as $hurl) { $fuid = $this->FunnelUrls[$count]; if($this->MatchUrls($this->URLs[$fuid],$hurl->Url->GetAbsoluteUrl(),$hurl->Referrer->GetAbsoluteUrl(),time()-($hurl->Entrance)) === true) { if($startpos==-1) $startpos = $pos; if($startpos+$count==$pos) $count++; else { $count = 0; $startpos=-1; } if($count==count($this->FunnelUrls)) break; } else { $count = 0; $startpos=-1; } $pos++; } return $count==count($this->FunnelUrls); } function MatchesURLCriterias($_url,$_referrer,$_previous,$_timeOnUrl) { if(count($this->URLs) == 0) return true; $_url = @strtolower($_url); $_referrer = @strtolower($_referrer); $_previous = @strtolower($_previous); $match = false; foreach($this->URLs as $url) { $umatch = $this->MatchUrls($url,$_url,$_referrer,$_timeOnUrl); $rmatch = $this->MatchUrls($url,$_url,$_previous,$_timeOnUrl); if($umatch === false || $rmatch === false) return false; if($umatch === true || $rmatch === true) $match = true; } return $match; } function MatchUrls($_eurl,$_url,$_referrer,$_timeOnUrl) { $valid = true; if(!empty($_eurl->URL)) $valid = Is::WildcardMatch($_eurl->URL,$_url); if((!empty($_eurl->URL) && $valid || empty($_eurl->URL)) && !empty($_eurl->Referrer)) $valid = Is::WildcardMatch($_eurl->Referrer,$_referrer); if($valid) { if(!empty(Server::$Configuration->File["gl_vmac"])) if($_eurl->TimeOnSite > 0 && $_eurl->TimeOnSite > $_timeOnUrl) { Event::SetRetryIn($_eurl->TimeOnSite-$_timeOnUrl); return -1; } return !$_eurl->Blacklist; } else return -1; } function GetSQL() { return "INSERT INTO `".DB_PREFIX.DATABASE_EVENTS."` (`id`, `name`, `created`, `creator`, `edited`, `editor`, `pages_visited`, `time_on_site`, `max_trigger_amount`, `trigger_again_after`, `trigger_again_page`, `not_declined`, `not_accepted`, `not_in_chat`, `is_in_chat`, `chat_ends`, `priority`, `is_active`, `search_phrase`, `save_cookie`, `exclude_mobile`, `exclude_countries`, `include_countries`, `data_conditions`) VALUES ('".DBManager::RealEscape($this->Id)."','".DBManager::RealEscape($this->Name)."','".DBManager::RealEscape($this->Created)."','".DBManager::RealEscape($this->Creator)."','".DBManager::RealEscape($this->Edited)."', '".DBManager::RealEscape($this->Editor)."', '".DBManager::RealEscape($this->PagesVisited)."','".DBManager::RealEscape($this->TimeOnSite)."','".DBManager::RealEscape($this->TriggerAmount)."','".DBManager::RealEscape($this->TriggerTime)."',".intval($this->TriggerPage?1:0).",'".DBManager::RealEscape($this->NotDeclined)."', '".DBManager::RealEscape($this->NotAccepted)."',".intval($this->NotInChat ? 1 : 0).",".intval($this->TriggerChatCreated ? 1 : 0).",".intval($this->TriggerChatClosed ? 1 : 0).",'".DBManager::RealEscape($this->Priority)."', '".DBManager::RealEscape($this->IsActive)."', '".DBManager::RealEscape($this->SearchPhrase)."', '".DBManager::RealEscape(($this->SaveInCookie) ? 1 : 0)."', '".DBManager::RealEscape(($this->ExcludeMobile) ? 1 : 0)."', '".DBManager::RealEscape($this->ExcludeCountries)."', '".DBManager::RealEscape($this->IncludeCountries)."', '".DBManager::RealEscape(serialize($this->DataConditions))."');"; } function GetXML() { $xml = "<ev id=\"".base64_encode($this->Id)."\" sc=\"".base64_encode($this->SaveInCookie)."\" nacc=\"".base64_encode($this->NotAccepted)."\" ndec=\"".base64_encode($this->NotDeclined)."\" name=\"".base64_encode($this->Name)."\" prio=\"".base64_encode($this->Priority)."\" created=\"".base64_encode($this->Created)."\" nic=\"".base64_encode($this->NotInChat)."\" iic=\"".base64_encode($this->TriggerChatCreated)."\" creator=\"".base64_encode($this->Creator)."\" editor=\"".base64_encode($this->Editor)."\" edited=\"".base64_encode($this->Edited)."\" tos=\"".base64_encode($this->TimeOnSite)."\" ta=\"".base64_encode($this->TriggerAmount)."\" tt=\"".base64_encode($this->TriggerTime)."\" tp=\"".base64_encode($this->TriggerPage?1:0)."\" pv=\"".base64_encode($this->PagesVisited)."\" ia=\"".base64_encode($this->IsActive)."\" sp=\"".base64_encode($this->SearchPhrase)."\" em=\"".base64_encode($this->ExcludeMobile ? 1 : 0)."\" cse=\"".base64_encode($this->TriggerChatClosed ? 1 : 0)."\" ec=\"".base64_encode($this->ExcludeCountries)."\" ic=\"".base64_encode($this->IncludeCountries)."\">\r\n"; foreach($this->Actions as $action) $xml .= $action->GetXML(); foreach($this->URLs as $url) $xml .= $url->GetXML(); foreach($this->Goals as $act) $xml .= "<evg id=\"".base64_encode($act->Id)."\" />"; foreach($this->FunnelUrls as $ind => $uid) $xml .= "<efu id=\"".base64_encode($uid)."\">".base64_encode($ind)."</efu>"; foreach($this->DataConditions as $arr) $xml .= "<dc ind=\"".base64_encode($arr[0])."\">".base64_encode($arr[1])."</dc>"; return $xml . "</ev>\r\n"; } function IsInternalAction() { foreach($this->Actions as $action) if($action->Type == 0 || $action->Type == 1) return true; return false; } static function SetRetryIn($_seconds) { if(is_int($_seconds) && $_seconds > 0) { Event::$RetryIn = max(Event::$RetryIn,$_seconds+1); } } } class Goal { public $Id; public $Title; public $Description; public $Conversion; function __construct() { if(func_num_args() == 1) { $_row = func_get_arg(0); $this->Id = $_row["id"]; $this->Title = $_row["title"]; $this->Description = $_row["description"]; $this->Conversion = !empty($_row["conversion"]); } else { $this->Id = func_get_arg(0); $this->Title = func_get_arg(1); $this->Description = func_get_arg(2); $this->Conversion = func_get_arg(3); } } function Save() { return "INSERT INTO `".DB_PREFIX.DATABASE_GOALS."` (`id`, `title`, `description`, `conversion`) VALUES ('".DBManager::RealEscape($this->Id)."', '".DBManager::RealEscape($this->Title)."','".DBManager::RealEscape($this->Description)."', '".DBManager::RealEscape($this->Conversion)."');"; } function GetXML() { return "<tgt id=\"".base64_encode($this->Id)."\" title=\"".base64_encode($this->Title)."\" desc=\"".base64_encode($this->Description)."\" conv=\"".base64_encode($this->Conversion)."\" />\r\n"; } } class Signature { public $Id; public $Name; public $Signature; public $Default; public $Deleted; public $OperatorId; public $GroupId; function __construct() { if(func_num_args() == 1) { $_row = func_get_arg(0); $this->Id = $_row["id"]; $this->Name = $_row["name"]; $this->Signature = $_row["signature"]; $this->OperatorId = $_row["operator_id"]; $this->GroupId = $_row["group_id"]; $this->Default = $_row["default"]; } } function Save($_prefix) { DBManager::Execute(true, "DELETE FROM `" . $_prefix . DATABASE_SIGNATURES . "` WHERE `operator_id`='" . DBManager::RealEscape($this->OperatorId) . "' AND `group_id`='" . DBManager::RealEscape($this->GroupId) . "' AND `id`='" . DBManager::RealEscape($this->Id) . "' LIMIT 1;"); if(!$this->Deleted) DBManager::Execute(true, "INSERT INTO `" . $_prefix . DATABASE_SIGNATURES . "` (`id` ,`name` ,`signature` ,`operator_id`,`group_id`,`default`) VALUES ('" . DBManager::RealEscape($this->Id) . "', '" . DBManager::RealEscape($this->Name) . "','" . DBManager::RealEscape($this->Signature) . "', '" . DBManager::RealEscape($this->OperatorId) . "', '" . DBManager::RealEscape($this->GroupId) . "', '" . DBManager::RealEscape($this->Default) . "');"); } function XMLParamAlloc($_param,$_value) { if($_param =="a") $this->Id = $_value; else if($_param =="b") $this->Default = $_value; else if($_param =="c") $this->Deleted = $_value; else if($_param =="d") $this->Name = $_value; else if($_param =="e") $this->Signature = $_value; else if($_param =="f") $this->OperatorId = $_value; else if($_param =="g") $this->GroupId = $_value; } function GetXML() { return "<sig i=\"".base64_encode($this->Id)."\" n=\"".base64_encode($this->Name)."\" o=\"".base64_encode($this->OperatorId)."\" g=\"".base64_encode($this->GroupId)."\" d=\"".base64_encode($this->Default ? 1 : 0)."\">".base64_encode($this->Signature)."</sig>\r\n"; } static function DeleteByGroup($_prefix,$_groupId) { DBManager::Execute(true, "DELETE FROM `" . $_prefix . DATABASE_SIGNATURES . "` WHERE `group_id`='" . DBManager::RealEscape($_groupId) . "';"); } } class ChatArchive { static function GetSearchQuery($_sFor,$_tags) { $query = ""; if(!empty($_sFor)) $query = "(LOWER(`fullname`) LIKE '%".$_sFor."%' OR LOWER(`area_code`) LIKE '%".$_sFor."%' OR LOWER(`plaintext`) LIKE '%".$_sFor."%' OR LOWER(`email`) LIKE '%".$_sFor."%' OR LOWER(`company`) LIKE '%".$_sFor."%' OR LOWER(`phone`) LIKE '%".$_sFor."%' OR LOWER(`chat_id`) LIKE '%".$_sFor."%' OR LOWER(`external_id`) LIKE '%".$_sFor."%' OR LOWER(`customs`) LIKE '%".$_sFor."%' OR LOWER(`question`) LIKE '%".$_sFor."%')"; if(!empty($_tags)) { if(!empty($_sFor)) $query .= " AND ("; $count = 0; foreach(explode(",",$_tags) as $tag) { if($count > 0) $query .= " OR "; $query .= "FIND_IN_SET('".DBManager::RealEscape($tag)."',tags) > 0"; $count++; } if(!empty($_sFor)) $query .= ")"; } return $query; } static function Remove($_chatId) { DBManager::Execute(true, "DELETE FROM `" . DB_PREFIX . DATABASE_CHAT_ARCHIVE . "` WHERE `chat_id` = '".DBManager::RealEscape($_chatId)."' LIMIT 1;"); KnowledgeBaseEntry::RemoveByChatId($_chatId); } static function SetTags($_chatId,$_tags) { Configuration::ApplyTagsToConfig($_tags,3); DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_CHAT_ARCHIVE . "` SET `tags` = '".DBManager::RealEscape($_tags)."' WHERE `chat_id` = '".DBManager::RealEscape($_chatId)."' LIMIT 1;"); CacheManager::SetDataUpdateTime(DATA_UPDATE_KEY_CHAT_ARCH); } } class Mailbox { public $Type = "IMAP"; public $Id = ""; public $Username = ""; public $Password = ""; public $Port = 110; public $Host = ""; public $ExecOperatorId = ""; public $Delete = 2; public $Email = ""; public $SSL = false; public $Authentication = ""; public $SenderName = ""; public $Default = false; public $ConnectFrequency = 15; public $LastConnect = 0; public $Framework = "ZEND"; function __construct() { if(func_num_args() == 2) { $this->Id = $_POST["p_cfg_es_i_" . func_get_arg(0)]; $this->Email = $_POST["p_cfg_es_e_" . func_get_arg(0)]; $this->Host = $_POST["p_cfg_es_h_" . func_get_arg(0)]; $this->Username = $_POST["p_cfg_es_u_" . func_get_arg(0)]; $this->Password = $_POST["p_cfg_es_p_" . func_get_arg(0)]; $this->Port = $_POST["p_cfg_es_po_" . func_get_arg(0)]; $this->SSL = $_POST["p_cfg_es_s_" . func_get_arg(0)]; $this->Authentication = $_POST["p_cfg_es_a_" . func_get_arg(0)]; $this->Delete = !empty($_POST["p_cfg_es_d_" . func_get_arg(0)]); $this->Type = $_POST["p_cfg_es_t_" . func_get_arg(0)]; $this->SenderName = $_POST["p_cfg_es_sn_" . func_get_arg(0)]; $this->Default = !empty($_POST["p_cfg_es_de_" . func_get_arg(0)]); $this->ConnectFrequency = $_POST["p_cfg_es_c_" . func_get_arg(0)]; $this->Framework = $_POST["p_cfg_es_fw_" . func_get_arg(0)]; } else { $row = func_get_arg(0); $this->Id = $row["id"]; $this->Type = $row["type"]; $this->Email = $row["email"]; $this->Username = $row["username"]; $this->Password = $row["password"]; $this->Port = $row["port"]; $this->Host = $row["host"]; $this->ExecOperatorId = $row["exec_operator_id"]; $this->Delete = !empty($row["delete"]); $this->SenderName = $row["sender_name"]; $this->Authentication = $row["authentication"]; $this->SSL = $row["ssl"]; $this->Default = !empty($row["default"]); $this->ConnectFrequency = $row["connect_frequency"]; $this->LastConnect = $row["last_connect"]; if(isset($row["framework"])) $this->Framework = $row["framework"]; } } function GetXML($_groupId="") { return "<tes g=\"".base64_encode($_groupId)."\" f=\"".base64_encode($this->Framework)."\" e=\"".base64_encode($this->Email)."\" c=\"".base64_encode($this->ConnectFrequency)."\" i=\"".base64_encode($this->Id)."\" a=\"".base64_encode($this->Authentication)."\" s=\"".base64_encode($this->SSL)."\" de=\"".base64_encode($this->Default ? "1" : "0")."\" sn=\"".base64_encode($this->SenderName)."\" t=\"".base64_encode($this->Type)."\" u=\"".base64_encode($this->Username)."\" p=\"".base64_encode($this->Password)."\" po=\"".base64_encode($this->Port)."\" d=\"".base64_encode(1)."\" h=\"".base64_encode($this->Host)."\" />\r\n"; } function Save() { DBManager::Execute(true, "REPLACE INTO `" . DB_PREFIX . DATABASE_MAILBOXES . "` (`id`,`email`,`exec_operator_id`,`username`,`password`,`type`,`host`,`port`,`delete`,`authentication`,`sender_name`,`ssl`,`default`,`last_connect`,`connect_frequency`,`framework`) VALUES ('" . DBManager::RealEscape($this->Id) . "','" . DBManager::RealEscape($this->Email) . "', '" . DBManager::RealEscape($this->ExecOperatorId) . "', '" . DBManager::RealEscape($this->Username) . "', '" . DBManager::RealEscape($this->Password) . "', '" . DBManager::RealEscape($this->Type) . "', '" . DBManager::RealEscape($this->Host) . "', '" . DBManager::RealEscape($this->Port) . "',1, '" . DBManager::RealEscape($this->Authentication) . "', '" . DBManager::RealEscape($this->SenderName) . "'," . abs(intval($this->SSL)) . "," . intval($this->Default ? 1 : 0) . "," . intval($this->LastConnect) . "," . intval($this->ConnectFrequency) . ",'" . DBManager::RealEscape($this->Framework) . "');"); } function SetLastConnect($_time) { $min = ($_time>0) ? $_time-10 : time()+1; DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_MAILBOXES . "` SET `last_connect`=" . $_time . " WHERE `last_connect` < ". intval(abs($min)) ." AND `id`='" . DBManager::RealEscape($this->Id) . "'"); return DBManager::GetAffectedRowCount(); } function GetLastConnect() { $result = DBManager::Execute(true, "SELECT `last_connect` FROM `" . DB_PREFIX . DATABASE_MAILBOXES . "` WHERE `id`='" . DBManager::RealEscape($this->Id) . "'"); if($result) while($row = DBManager::FetchArray($result)) if($row["last_connect"] > 0) return $row["last_connect"]; return null; } function Download(&$_reload, $_delete, $_test=false) { Server::InitDataBlock(array("DBCONFIG","FILTERS")); require_once(LIVEZILLA_PATH . "_lib/objects.mail.inc.php"); $ms = new MailSystem($this); $mails = $list = array(); try { $mails = $ms->ReceiveEmails($_reload, $_delete, $_test); if($_test) return $mails; } catch (Exception $e) { if($_test) throw $e; else Logging::EmailLog("Email Error #110: " . $this->Host . " " . $this->Type . " mailbox connection error: " . $e->getMessage()); return $mails; } if(is_array($mails)) foreach($mails as $index => $mail) { if(!Server::$Filters->MatchEmail($mail->Email,$mail->Subject)) $list[$index] = $mail; } return $list; } static function ResetDownloadTime(){ foreach(Server::$Configuration->Database["gl_email"] as $mb) if($mb->Type != "SMTP") $mb->SetLastConnect(0); } static function GetDefaultOutgoing() { Server::InitDataBlock(array("DBCONFIG")); if(!empty(Server::$Configuration->Database["gl_email"])) foreach(Server::$Configuration->Database["gl_email"] as $box) if($box->Default && $box->Type != 'POP' && $box->Type != 'IMAP') return $box; return null; } static function GetById($_id,$_defaultOutgoing=false) { Server::InitDataBlock(array("DBCONFIG")); if(!empty(Server::$Configuration->Database["gl_email"])) foreach(Server::$Configuration->Database["gl_email"] as $box) if($box->Id == $_id) return $box; if($_defaultOutgoing) return Mailbox::GetDefaultOutgoing(); return null; } static function IsValidEmail($_email) { return preg_match('/^([*+!.&#$?\'\\%\/0-9a-z^_`{}=?~:-]+)@(([0-9a-z-]+\.)+[0-9a-z]{2,4})$/i', $_email); } static function FinalizeDataBlock($_text,$_html,$_remove=false) { if($_remove) $_text = str_replace("<!--lz_ref_link-->","",$_text); else if($_html) $_text = str_replace("<!--lz_ref_link-->","<br><br>".parseURL(@Server::$Configuration->File["gl_cpae"]),$_text); else $_text = str_replace("<!--lz_ref_link-->","\r\n\r\n".@Server::$Configuration->File["gl_cpae"],$_text); return $_text; } static function GetSubject($_subject,$_email,$_username,$_group,$_chatid,$_company,$_phone,$_ip,$_question,$_language,$_customs=null) { $_subject = Configuration::Replace($_subject); $_subject = str_replace(array("%external_name%","%USERNAME%"),$_username,$_subject); $_subject = str_replace(array("%external_email%","%USEREMAIL%"),$_email,$_subject); $_subject = str_replace(array("%external_company%","%USERCOMPANY%"),$_company,$_subject); $_subject = str_replace("%external_phone%",$_phone,$_subject); $_subject = str_replace("%external_ip%",$_ip,$_subject); $_subject = str_replace(array("%question%","%USERQUESTION%","%mailtext%"),$_question,$_subject); $_subject = str_replace(array("%group_name%","%group_id%","%TARGETGROUP%"),$_group,$_subject); $_subject = str_replace("%group_description%",((isset(Server::$Groups[$_group])) ? Server::$Groups[$_group]->GetDescription($_language) : $_group),$_subject); $_subject = str_replace(array("%chat_id%","%CHATID%"),$_chatid,$_subject); foreach(Server::$Inputs as $index => $input) if($input->Active && $input->Custom) { if($input->Type == "CheckBox") $_subject = str_replace("%custom".($index)."%",((!empty($_customs[$index])) ? LocalizationManager::$TranslationStrings["client_yes"] : LocalizationManager::$TranslationStrings["client_no"]),$_subject); else if(!empty($_customs[$index])) $_subject = str_replace("%custom".($index)."%",$input->GetClientValue($_customs[$index]),$_subject); else $_subject = str_replace("%custom".($index)."%","",$_subject); } else $_subject = str_replace("%custom".($index)."%","",$_subject); return Server::Replace(str_replace("\n","",$_subject),true,false); } } class PredefinedMessage { public $LangISO = ""; public $InvitationChatAuto = ""; public $InvitationTicketAuto = ""; public $InvitationChatManual = ""; public $Welcome = ""; public $IsDefault; public $AutoWelcome = true; public $GroupId = ""; public $UserId = ""; public $Editable = true; public $TicketInformation = ""; public $ChatInformation = ""; public $CallMeBackInformation = ""; public $ChatInformationOffline = ""; public $SubjectChatTranscript = ""; public $SubjectTicketResponder = ""; public $SubjectTicketReply = ""; public $EmailChatTranscriptBodyPlaintext = ""; public $EmailTicketResponderBodyPlaintext = ""; public $EmailTicketReplyBodyPlaintext = ""; public $Id = 0; public $EmailChatTranscriptBodyHTML = false; public $EmailTicketResponderBodyHTML = false; public $EmailTicketReplyBodyHTML = false; public $Deleted = false; public $TOSChat = ""; public $TOSTicket = ""; public $TOSCallback = ""; public $AutoCloseOperator = ""; public $AutoCloseCustomer = ""; function __construct() { if(func_num_args() == 2) { $_row = func_get_arg(1); $this->LangISO = $_row["lang_iso"]; $this->InvitationChatAuto = @$_row["invitation_auto"]; $this->InvitationChatManual = @$_row["invitation_manual"]; $this->Welcome = $_row["welcome"]; if(!empty($_row["chat_info_offline"])) $this->ChatInformationOffline = $_row["chat_info_offline"]; $this->IsDefault = !empty($_row["is_default"]); $this->AutoWelcome = !empty($_row["auto_welcome"]); $this->Editable = !empty($_row["editable"]); $this->TicketInformation = @$_row["ticket_info"]; $this->ChatInformation = @$_row["chat_info"]; $this->CallMeBackInformation = @$_row["call_me_back_info"]; $this->EmailChatTranscriptBodyPlaintext = @$_row["email_chat_transcript"]; $this->EmailTicketResponderBodyPlaintext = @$_row["email_ticket_responder"]; $this->EmailTicketReplyBodyPlaintext = @$_row["email_ticket_reply"]; $this->SubjectChatTranscript = @$_row["subject_chat_transcript"]; $this->SubjectTicketResponder = @$_row["subject_ticket_responder"]; $this->SubjectTicketReply = @$_row["subject_ticket_reply"]; $this->EmailChatTranscriptBodyHTML = @$_row["email_chat_transcript_html"]; $this->EmailTicketResponderBodyHTML = @$_row["email_ticket_responder_html"]; $this->EmailTicketReplyBodyHTML = @$_row["email_ticket_reply_html"]; $this->TOSChat = $_row["tos_chat"]; $this->TOSTicket = $_row["tos_ticket"]; $this->TOSCallback = @$_row["tos_callback"]; $this->AutoCloseCustomer = @$_row["auto_close_customer"]; $this->AutoCloseOperator = @$_row["auto_close_operator"]; $this->InvitationTicketAuto = @$_row["ticket_invite_auto"]; } } function XMLParamAlloc($_param,$_value) { if($_param =="inva") $this->InvitationChatAuto = base64_decode($_value); else if($_param =="invm") $this->InvitationChatManual = base64_decode($_value); else if($_param =="tina") $this->InvitationTicketAuto = base64_decode($_value); else if($_param =="wel") $this->Welcome = base64_decode($_value); else if($_param =="cioff") $this->ChatInformationOffline = base64_decode($_value); else if($_param =="def") $this->IsDefault = $_value; else if($_param =="aw") $this->AutoWelcome = $_value; else if($_param =="edit") $this->Editable = $_value; else if($_param =="ci") $this->ChatInformation = base64_decode($_value); else if($_param =="ccmbi") $this->CallMeBackInformation = base64_decode($_value); else if($_param =="ti") $this->TicketInformation = base64_decode($_value); else if($_param =="del") $this->Deleted = !empty($_value); else if($_param =="sct") $this->SubjectChatTranscript = base64_decode($_value); else if($_param =="st") $this->SubjectTicketResponder = base64_decode($_value); else if($_param =="str") $this->SubjectTicketReply = base64_decode($_value); else if($_param =="hct") $this->EmailChatTranscriptBodyHTML = base64_decode($_value); else if($_param =="ht") $this->EmailTicketResponderBodyHTML = base64_decode($_value); else if($_param =="htr") $this->EmailTicketReplyBodyHTML = base64_decode($_value); else if($_param =="ect") $this->EmailChatTranscriptBodyPlaintext = base64_decode($_value); else if($_param =="et") $this->EmailTicketResponderBodyPlaintext = base64_decode($_value); else if($_param =="etr") $this->EmailTicketReplyBodyPlaintext = base64_decode($_value); else if($_param =="tosc") $this->TOSChat = base64_decode($_value); else if($_param =="toscb") $this->TOSCallback = base64_decode($_value); else if($_param =="tost") $this->TOSTicket = base64_decode($_value); else if($_param =="aco") $this->AutoCloseOperator = base64_decode($_value); else if($_param =="acc") $this->AutoCloseCustomer = base64_decode($_value); } function Save($_prefix) { if($this->Deleted) DBManager::Execute(true, "DELETE FROM `" . $_prefix . DATABASE_PREDEFINED . "` WHERE `internal_id`='" . DBManager::RealEscape($this->UserId) . "' AND `group_id`='" . DBManager::RealEscape($this->GroupId) . "' AND `lang_iso`='" . DBManager::RealEscape($this->LangISO) . "' LIMIT 1;"); else DBManager::Execute(true, "REPLACE INTO `" . $_prefix . DATABASE_PREDEFINED . "` (`id` ,`internal_id` ,`group_id` ,`lang_iso` ,`invitation_manual`,`invitation_auto` ,`welcome` ,`chat_info_offline`,`website_push_manual` ,`website_push_auto`,`chat_info`,`call_me_back_info`,`ticket_info` ,`browser_ident` ,`is_default` ,`auto_welcome`,`editable`,`email_chat_transcript`,`email_ticket_responder`,`email_ticket_reply`,`subject_chat_transcript`,`subject_ticket_responder`,`subject_ticket_reply`,`email_chat_transcript_html`,`email_ticket_responder_html`,`email_ticket_reply_html`,`tos_chat`,`tos_ticket`,`tos_callback`,`auto_close_operator`,`auto_close_customer`,`ticket_invite_auto`) VALUES ('" . DBManager::RealEscape($this->Id) . "', '" . DBManager::RealEscape($this->UserId) . "','" . DBManager::RealEscape($this->GroupId) . "', '" . DBManager::RealEscape($this->LangISO) . "', '" . DBManager::RealEscape($this->InvitationChatManual) . "', '" . DBManager::RealEscape($this->InvitationChatAuto) . "','" . DBManager::RealEscape($this->Welcome) . "','" . DBManager::RealEscape($this->ChatInformationOffline) . "', '" . DBManager::RealEscape('') . "', '" . DBManager::RealEscape('') . "', '" . DBManager::RealEscape($this->ChatInformation) . "', '" . DBManager::RealEscape($this->CallMeBackInformation) . "', '" . DBManager::RealEscape($this->TicketInformation) . "','" . DBManager::RealEscape('1') . "', '" . DBManager::RealEscape($this->IsDefault ? '1' : '0') . "', '" . DBManager::RealEscape($this->AutoWelcome ? '1' : '0') . "', '" . DBManager::RealEscape($this->Editable ? '1' : '0') . "', '" . DBManager::RealEscape($this->EmailChatTranscriptBodyPlaintext) . "', '" . DBManager::RealEscape($this->EmailTicketResponderBodyPlaintext) . "','" . DBManager::RealEscape($this->EmailTicketReplyBodyPlaintext) . "', '" . DBManager::RealEscape($this->SubjectChatTranscript) . "', '" . DBManager::RealEscape($this->SubjectTicketResponder) . "', '" . DBManager::RealEscape($this->SubjectTicketReply) . "', '" . DBManager::RealEscape($this->EmailChatTranscriptBodyHTML) . "', '" . DBManager::RealEscape($this->EmailTicketResponderBodyHTML) . "', '" . DBManager::RealEscape($this->EmailTicketReplyBodyHTML) . "', '" . DBManager::RealEscape($this->TOSChat) . "', '" . DBManager::RealEscape($this->TOSTicket) . "','" . DBManager::RealEscape($this->TOSCallback) . "', '" . DBManager::RealEscape($this->AutoCloseOperator) . "', '" . DBManager::RealEscape($this->AutoCloseCustomer) . "', '" . DBManager::RealEscape($this->InvitationTicketAuto) . "');"); } function GetXML($_serversetup=true) { if($_serversetup) return "<pm et=\"".base64_encode($this->EmailTicketResponderBodyPlaintext)."\" etr=\"".base64_encode($this->EmailTicketReplyBodyPlaintext)."\" ect=\"".base64_encode($this->EmailChatTranscriptBodyPlaintext)."\" ti=\"".base64_encode($this->TicketInformation)."\" ci=\"".base64_encode($this->ChatInformation)."\" st=\"".base64_encode($this->SubjectTicketResponder)."\" str=\"".base64_encode($this->SubjectTicketReply)."\" sct=\"".base64_encode($this->SubjectChatTranscript)."\" ccmbi=\"".base64_encode($this->CallMeBackInformation)."\" lang=\"".base64_encode($this->LangISO)."\" invm=\"".base64_encode($this->InvitationChatManual)."\" inva=\"".base64_encode($this->InvitationChatAuto)."\" tina=\"".base64_encode($this->InvitationTicketAuto)."\" wel=\"".base64_encode($this->Welcome)."\" cioff=\"".base64_encode($this->ChatInformationOffline)."\" wpa=\"".base64_encode('')."\" wpm=\"".base64_encode('')."\" bi=\"".base64_encode(1)."\" def=\"".base64_encode($this->IsDefault)."\" aw=\"".base64_encode($this->AutoWelcome)."\" edit=\"".base64_encode($this->Editable)."\" hct=\"".base64_encode($this->EmailChatTranscriptBodyHTML)."\" ht=\"".base64_encode($this->EmailTicketResponderBodyHTML)."\" htr=\"".base64_encode($this->EmailTicketReplyBodyHTML)."\" tosc=\"".base64_encode($this->TOSChat)."\" toscb=\"".base64_encode($this->TOSCallback)."\" tost=\"".base64_encode($this->TOSTicket)."\" aco=\"".base64_encode($this->AutoCloseOperator)."\" acc=\"".base64_encode($this->AutoCloseCustomer)."\" />\r\n"; else return "<pm lang=\"".base64_encode($this->LangISO)."\" invm=\"".base64_encode($this->InvitationChatManual)."\" wel=\"".base64_encode($this->Welcome)."\" cioff=\"".base64_encode($this->ChatInformationOffline)."\" wpa=\"".base64_encode('')."\" bi=\"".base64_encode(1)."\" def=\"".base64_encode($this->IsDefault)."\" aw=\"".base64_encode($this->AutoWelcome)."\" edit=\"".base64_encode($this->Editable)."\" />\r\n"; } static function GetByLanguage($_list, $_language) { $sel_message = null; foreach($_list as $message) { if(($message->IsDefault && (empty($_language))) || (!empty($_language) && $_language == $message->LangISO)) { $sel_message = $message; break; } else if($message->IsDefault) $sel_message = $message; } return $sel_message; } static function DeleteByGroup($_prefix,$_groupId) { DBManager::Execute(true, "DELETE FROM `" . $_prefix . DATABASE_PREDEFINED . "` WHERE `group_id`='" . DBManager::RealEscape($_groupId) . "';"); } } class ChatAutoReply { public $Id; public $ResourceId = ""; public $Tags = ""; public $SearchType = 0; public $Answer; public $Languages = ""; public $NewWindow = false; public $Waiting = false; public $Send = true; public $SendInactivityTimeInternal = -1; public $SendInactivityTimeExternal = -1; public $CloseChat = false; public $Title = ""; public $SourceType; public $ContentType = "string"; function __construct() { if(func_num_args() == 1) { $row = func_get_arg(0); $this->Id = $row["id"]; $this->ResourceId = $row["resource_id"]; $this->Tags = $row["tags"]; $this->Languages = $row["language"]; $this->SearchType = $row["search_type"]; $this->Answer = $row["answer"]; $this->NewWindow = !empty($row["new_window"]); $this->Waiting = !empty($row["waiting"]); $this->Send = !empty($row["send"]); $this->SendInactivityTimeInternal = $row["inactivity_internal"]; $this->SendInactivityTimeExternal = $row["inactivity_external"]; $this->CloseChat = !empty($row["inactivity_close"]); $this->Title = $row["title"]; $this->SourceType = "auto_reply"; } else if(func_num_args() == 2) { $kbEntry = func_get_arg(1); $this->Id = getId(32); $this->ResourceId = $kbEntry->Id; $this->Tags = $kbEntry->Tags; $this->Languages = $kbEntry->Languages; $this->SearchType = 1; $this->Title = $kbEntry->Title; $this->NewWindow = true; $this->SourceType = "knowledge_base"; } else if(func_num_args() == 3) { $this->Id = func_get_arg(0); $this->ContentType = func_get_arg(1); $this->Answer = func_get_arg(2); $this->SourceType = "user_api"; } } function GetXML() { return "<bf i=\"".base64_encode($this->Id)."\" t=\"".base64_encode($this->Title)."\" ti=\"".base64_encode($this->SendInactivityTimeInternal)."\" te=\"".base64_encode($this->SendInactivityTimeExternal)."\" c=\"".base64_encode($this->CloseChat ? 1 : 0)."\" l=\"".base64_encode($this->Languages)."\" n=\"".base64_encode($this->NewWindow ? 1 : 0)."\" ds=\"".base64_encode($this->Send ? 1 : 0)."\" w=\"".base64_encode($this->Waiting ? 1 : 0)."\" r=\"".base64_encode($this->ResourceId)."\" s=\"".base64_encode($this->SearchType)."\" a=\"".base64_encode($this->Answer)."\">".base64_encode($this->Tags)."</bf>\r\n"; } function Save($_botId) { DBManager::Execute(true, "INSERT INTO `" . DB_PREFIX . DATABASE_AUTO_REPLIES . "` (`id` ,`resource_id` ,`owner_id` ,`tags` ,`search_type`,`answer`,`new_window`,`language`,`send`,`waiting`,`inactivity_internal`,`inactivity_external`,`inactivity_close`,`title`) VALUES ('" . DBManager::RealEscape($this->Id) . "','" . DBManager::RealEscape($this->ResourceId) . "','" . DBManager::RealEscape($_botId) . "','" . DBManager::RealEscape($this->Tags) . "','" . DBManager::RealEscape($this->SearchType) . "','" . DBManager::RealEscape($this->Answer) . "','" . DBManager::RealEscape($this->NewWindow ? 1 : 0) . "','" . DBManager::RealEscape($this->Languages) . "','" . DBManager::RealEscape($this->Send ? 1 : 0) . "','" . DBManager::RealEscape($this->Waiting ? 1 : 0) . "','" . DBManager::RealEscape($this->SendInactivityTimeInternal) . "','" . DBManager::RealEscape($this->SendInactivityTimeExternal) . "','" . DBManager::RealEscape($this->CloseChat ? 1 : 0) . "','" . DBManager::RealEscape($this->Title) . "');"); } function MatchesLanguage($_language) { if(empty($_language)) return (empty($this->Languages)); return !(strpos(strtolower($this->Languages),strtolower($_language))===false && !empty($this->Languages)); } static function GetMatches($_list, $_question, $_language, $_chat, $_internal, $lmsi=false, $lmse=false, $lpi=null, $lpe=null) { $answers = array(); foreach($_list as $reply) { if(!isset($reply->SearchType)) continue; if($_chat != null) { $reply->Answer = $_chat->TextReplace($reply->Answer); //Server::InitDataBlock(array("VISITOR")); //if(isset(Server::$Visitors[$_chat->UserId])) //$reply->Answer = Server::$Visitors[$_chat->UserId]->TextReplace($reply->Answer); } if($_internal != null) $reply->Answer = $_internal->TextReplace($reply->Answer); if($reply->SearchType != 5) $reply->Tags = str_replace(array("!",".","?","=",")","(","-","_",":","#","~","?"),"",strtolower($reply->Tags)); if(!$reply->MatchesLanguage($_language)) continue; if(empty($_chat->AllocatedTime) && !$reply->Waiting) { if(!($_internal != null && $_internal->IsBot)) continue; } $answers[] = $reply; /* $waitsum = 0; $usedResIds = array(); $tags = explode(",", $reply->Tags); $count=0; if(!$_internal->IsBot) { if(!empty($_chat)) { if($lmsi === false && ($reply->SendInactivityTimeInternal > -1 || $reply->SendInactivityTimeExternal > -1)) { $lpi = Chat::GetLastPost($_chat->ChatId,true); $lpe = Chat::GetLastPost($_chat->ChatId,false); $lmsi = ($lpi != null) ? $lpi->Created : 0; $lmse = ($lpe != null) ? $lpe->Created : $_chat->AllocatedTime; } $lm = max($lmsi,$lmse); $lastMessageExternal = ($lmse > $lmsi && !empty($lm)); $lastMessageInternal = ($lmsi >= $lmse || $lpe == null); if(empty($lm)) $lm = $_chat->AllocatedTime; if(!empty($lm)) { $wasAutoPost = ChatAutoReply::WasAutoReplyMessage($lpi,$_list); if(!$wasAutoPost) { if($reply->SendInactivityTimeInternal > -1 && $lastMessageExternal && $lmsi > 0) if((time()-$lm) > $reply->SendInactivityTimeInternal) $answers[$count."-".count($answers)] = $reply; if($reply->SendInactivityTimeExternal > -1 && $lastMessageInternal) { $lipa = Chat::GetLastPosts($_chat->ChatId,true,count($_list),$lmse); if(count($lipa)>1) $waitsum = (time() - $lm); if((time()-$lm) > ($reply->SendInactivityTimeExternal - $waitsum)) if(!in_array($reply->Answer,$lipa)) $answers[$count."-".count($answers)] = $reply; } if($reply->CloseChat && !empty($_chat) && !empty($_internal)) if(count($answers)>0 && isset($answers["0-0"]) && $answers["0-0"] == $reply) $_chat->InternalClose($_internal->SystemId); } } } } if($reply->SendInactivityTimeInternal == -1 && $reply->SendInactivityTimeExternal == -1) { foreach($tags as $tag) { if($reply->SearchType == 5) { if(@preg_match($reply->Tags, $_question) === 1) $count++; } else if(!empty($tag) && ($reply->SearchType < 4 && strpos($_question,$tag)!==false) || Is::WildcardMatch($tag,$_question)) $count++; if(($reply->SearchType==0 && $count==(substr_count($reply->Tags,",")+1)) || ($reply->SearchType>0 && $count >=$reply->SearchType) || ($reply->SearchType>=4 && $count>0)) { if(empty($reply->Answer)) { if(KnowledgeBaseEntry::GetById($reply->ResourceId) !== null && !isset($usedResIds[$reply->ResourceId])) { $answers[$count."-".count($answers)] = $reply; $usedResIds[$reply->ResourceId] = true; } } else { $answers = array(); $answers[$count."-".count($answers)] = $reply; break; } } } } */ } return $answers; } static function SendAutoReply($_reply,$_user,$_sender) { $arpost = new Post($id = getId(32),Server::$Operators[$_user->Browsers[0]->OperatorId]->SystemId,$_user->Browsers[0]->SystemId,$_reply,time(),$_user->Browsers[0]->ChatId,Server::$Operators[$_user->Browsers[0]->OperatorId]->Fullname); $arpost->ReceiverOriginal = $arpost->ReceiverGroup = $_user->Browsers[0]->SystemId; $arpost->Save(); foreach($_user->Browsers[0]->Members as $opsysid => $member) { $sname = (!empty($_sender) && isset($_sender->Fullname)) ? $_sender->Fullname : ""; $rpost = new Post($id,Server::$Operators[$_user->Browsers[0]->OperatorId]->SystemId,$opsysid,$_reply,time(),$_user->Browsers[0]->ChatId,$sname); $rpost->ReceiverOriginal = $rpost->ReceiverGroup = $_user->Browsers[0]->SystemId; $rpost->Save(); } } static function WasAutoReplyMessage($_post,$_list) { if($_post==null) return false; foreach($_list as $reply) { if($reply->Answer==$_post->Text) return true; else if(empty($reply->Answer)) { $res = KnowledgeBaseEntry::GetById($reply->ResourceId); if($res !== null && $_post->Text == $res["value"]) return true; } } return false; } } class DataInput { public $Id = ""; public $Index; public $Caption = ""; public $InfoText = ""; public $Type; public $Active; public $InputValue = ""; public $Cookie; public $Custom; public $Name; public $Position; public $Validate; public $ValidationURL; public $ValidationTimeout = 15; public $ValidationContinueOnTimeout; public $AutoCapitalize = false; public $ScreenCapture = false; function __construct($_values) { $this->Id = getId(15); if($_values != null) { $_values = @unserialize(base64_decode($_values)); array_walk($_values,"b64dcode"); $this->Index = $_values[0]; $this->Caption = (strpos($_values[1],"<!--lang") !== false) ? Server::Replace($_values[1],true,false) : $_values[1]; $this->Name = $_values[2]; $this->Type = $_values[3]; $this->Active = (empty($_GET["ofc"]) || $this->Index!=116) ? !empty($_values[4]) : true; $this->Cookie = !empty($_values[5]); $this->Position = $_values[6]; $this->InputValue = (strpos($_values[7],"<!--lang") !== false) ? Server::Replace($_values[7],true,false) : $_values[7]; $this->Custom = ($this->Index<100); $this->Validate = !empty($_values[8]); $this->ValidationURL = $_values[9]; $this->ValidationTimeout = $_values[10]; $this->ValidationContinueOnTimeout = !empty($_values[11]); if(count($_values) > 12) $this->InfoText = $_values[12]; if(count($_values) > 13) $this->ScreenCapture = !empty($_values[13]); } else { $this->Index = 115; $this->Custom = false; $this->Position = 10000; $this->Cookie = false; $this->Active = true; $this->Validate = false; $this->Type = "Text"; } } function GetHTML($_maxlength,$_active,$_overlay=false) { $cpPlain = strip_tags($this->Caption); if(Str::EndsWith($cpPlain,":") && strlen($cpPlain)>1) $cpPlain = substr($cpPlain,0,strlen($cpPlain)-1); $fileTemplate = (!$_overlay) ? "login_file.tpl" : "login_file_link.tpl"; if($this->Type == "CheckBox") $template = ($_overlay) ? IOStruct::GetFile(TEMPLATE_SCRIPT_OVERLAY_CHAT . "login_check.tpl") : IOStruct::GetFile(PATH_TEMPLATES . "login_check.tpl"); else $template = (($this->Type == "Text") ? IOStruct::GetFile(PATH_TEMPLATES . "login_input.tpl") : (($this->Type == "TextArea") ? IOStruct::GetFile(PATH_TEMPLATES . "login_area.tpl") : (($this->Type == "ComboBox") ? IOStruct::GetFile(PATH_TEMPLATES . "login_combo.tpl") : IOStruct::GetFile(PATH_TEMPLATES . $fileTemplate)))); $template = str_replace("<!--maxlength-->",$_maxlength,$template); $template = str_replace("<!--caption-->",$this->Caption,$template); $template = str_replace("<!--caption_plain-->",$cpPlain,$template); $template = str_replace("<!--info_text-->",$this->InfoText,$template); $template = str_replace("<!--id-->",$this->Id,$template); $template = str_replace("<!--name-->",$this->Index,$template); $template = str_replace("<!--active-->",To::BoolString($_active),$template); $template = str_replace("<!--kb_match_info-->",($this->Index == 114) ? ($_overlay) ? IOStruct::GetFile(TEMPLATE_SCRIPT_OVERLAY_CHAT . "kb_match_info.tpl") : IOStruct::GetFile(PATH_TEMPLATES . "kb_match_info.tpl") : "",$template); if($this->Type == "ComboBox") { $options = ""; $parts = explode(";",$this->InputValue); foreach($parts as $ind => $part) $options .= "<option value=\"".$ind."\">".$part."</option>"; $template = str_replace("<!--options-->",$options,$template); } return $template; } function GetValue($_visitor) { if($this->Custom && !empty($_visitor->VisitorData->Customs[$this->Index])) return $_visitor->VisitorData->Customs[$this->Index]; else if($this->Index == 111) return $_visitor->VisitorData->Fullname; else if($this->Index == 112) return $_visitor->VisitorData->Email; else if($this->Index == 113) return $_visitor->VisitorData->Company; else if($this->Index == 114) { if(isset($_visitor->Browsers[0]->Subject)) { return $_visitor->Browsers[0]->Subject; } return $_visitor->VisitorData->Text; } else if($this->Index == 116) return $_visitor->VisitorData->Phone; else return ""; } function GetServerInput($_default="",&$_changed=false,$_capitalize=false) { $rValue = ""; if($this->PostIndexName() != null && isset($_POST[$this->PostIndexName()]) && Encoding::Base64UrlDecode($_POST[$this->PostIndexName()]) != "") $rValue = Encoding::Base64UrlDecode($_POST[$this->PostIndexName()]); else if($this->GetIndexName() != null && isset($_GET[$this->GetIndexName()]) && ($_GET[$this->GetIndexName()]) != "") { // deprecated; compatibility if($this->GetIndexEncoding($this->GetIndexName())=="b64u") $rValue = Encoding::Base64UrlDecode($_GET[$this->GetIndexName()]); else $rValue = urldecode($_GET[$this->GetIndexName()]); } else if($this->GetExternalIndexName() != null && isset($_GET[$this->GetExternalIndexName()]) && ($_GET[$this->GetExternalIndexName()]) != "") $rValue = urldecode($_GET[$this->GetExternalIndexName()]); else if(isset($_GET["f" . $this->Index]) && Encoding::Base64UrlDecode($_GET["f" . $this->Index]) != "") $rValue = Encoding::Base64UrlDecode($_GET["f" . $this->Index]); else if(isset($_POST["p_cf" . $this->Index]) && Encoding::Base64UrlDecode($_POST["p_cf" . $this->Index]) != "") $rValue = Encoding::Base64UrlDecode($_POST["p_cf" . $this->Index]); else if(isset($_POST["p_f" . $this->Index]) && Encoding::Base64UrlDecode($_POST["p_f" . $this->Index]) != "") $rValue = Encoding::Base64UrlDecode($_POST["p_f" . $this->Index]); else if(isset($_GET["cf" . $this->Index]) && Encoding::Base64UrlDecode($_GET["cf" . $this->Index]) != "") $rValue = Encoding::Base64UrlDecode($_GET["cf" . $this->Index]); else if(isset($_GET["ptcf" . $this->Index]) && Encoding::Base64UrlDecode($_GET["ptcf" . $this->Index]) != "") $rValue = urldecode($_GET["ptcf" . $this->Index]); if($_capitalize) $rValue = Str::ToEnglishStyle($rValue); if($rValue!=$_default && !empty($rValue)) $_changed = true; return $rValue; } function GetAPIInput($_apiResponse) { $value = ""; // object type if(isset($_apiResponse->Data->{$this->Index}) && !empty($_apiResponse->Data->{$this->Index})) $value = $_apiResponse->Data->{$this->Index}; // array type else if(is_array($_apiResponse->Data) && isset($_apiResponse->Data[$this->Index]) && !empty($_apiResponse->Data[$this->Index])) $value = $_apiResponse->Data[$this->Index]; if(!empty($value)) { $value = $this->GetClientIndex($value); return $value; } return false; } function IsServerInput() { $params = array(isset($_POST[$this->PostIndexName()]),isset($_GET[$this->GetIndexName()]),isset($_GET["f" . $this->Index]),isset($_POST["p_cf" . $this->Index]),isset($_POST["p_f" . $this->Index]),isset($_GET["cf" . $this->Index])); foreach($params as $param) if($param) return true; return false; } function GetClientValue($_userInput) { // index -> value if($this->Type == "ComboBox" && !empty($this->InputValue) && is_numeric($_userInput)) { $parts = explode(";",$this->InputValue); if(isset($parts[$_userInput])) return $parts[$_userInput]; } return $_userInput; } function GetClientIndex($_userInput) { // value -> index if($this->Type == "ComboBox" && !empty($this->InputValue) && !is_numeric($_userInput)) { $parts = explode(";",$this->InputValue); foreach($parts as $index => $part) if($part == $_userInput) return $index; return 0; } return $_userInput; } function GetJavascript($_value) { return "new lz_chat_input(".$this->Index.",".To::BoolString($this->Active).",'".base64_encode($this->Caption)."','".base64_encode($this->InfoText)."','".base64_encode($this->Name)."','".$this->Type."','".base64_encode($this->GetPreselectionValue($_value))."',".To::BoolString($this->Validate).",'".base64_encode($this->ValidationURL)."',".$this->ValidationTimeout.",".To::BoolString($this->ValidationContinueOnTimeout).",".To::BoolString($this->ScreenCapture).")"; } function GetIndexName() { $getIndex = array(111=>"en",112=>"ee",113=>"ec",114=>"eq",115=>"vc",116=>"ep"); if(isset($getIndex[$this->Index])) return $getIndex[$this->Index]; return null; } function GetExternalIndexName() { $getIndex = array(111=>"ptn",112=>"pte",113=>"ptc",114=>"ptq",116=>"ptp",0=>"ptcf0",1=>"ptcf1",2=>"ptcf2",3=>"ptcf3",4=>"ptcf4",5=>"ptcf5",6=>"ptcf6",7=>"ptcf7",8=>"ptcf8",9=>"ptcf9"); if(isset($getIndex[$this->Index])) return $getIndex[$this->Index]; return null; } function GetIndexEncoding($_key) { $getIndex = array("en","ee","ec","eq","ep","code"); if(in_array($_key,$getIndex)) return "b64u"; return "urle"; } function PostIndexName() { $postIndex = array(111=>POST_EXTERN_USER_NAME,112=>POST_EXTERN_USER_EMAIL,113=>POST_EXTERN_USER_COMPANY,114=>"p_question",115=>"p_vc",116=>"p_phone"); if(isset($postIndex[$this->Index])) return $postIndex[$this->Index]; else return null; } function GetHeight() { return ($this->Type == "TextArea") ? 120 : (($this->Type == "File") ? 70 : 34); } function GetPreselectionValue($_value) { if($this->Type == "CheckBox" || $this->Type == "ComboBox") { return (!empty($_value)) ? $_value : "0"; } else { if(empty($_value) && !empty($this->InputValue)) return $this->InputValue; return $_value; } } static function ToIndexBased($_nameBased) { $indexBased = array(); foreach(Server::$Inputs as $index => $input) if(isset($_nameBased[$input->Name])) $indexBased[$index] = $_nameBased[$input->Name]; return $indexBased; } static function GetMaxHeight() { $max = 0; foreach(Server::$Inputs as $input) if($input->Active) $max += $input->GetHeight(); return $max+400; } static function Build($count=0) { if(!empty(Server::$Configuration->File["gl_input_list"])) { foreach(Server::$Configuration->File["gl_input_list"] as $values) { $input = new DataInput($values); if($input->Index == 111 && true) $input->AutoCapitalize = true; $sorter[($input->Position+10)."-".$count++] = $input; } $sorter[($input->Position+10)."-".$count++] = new DataInput(null); //+ DNC ksort($sorter); foreach($sorter as $input) Server::$Inputs[$input->Index] = $input; } } static function GetChatLoginInputs($_html,$_maxlength,$_overlay=false,$inputshtml="") { Server::InitDataBlock(array("INPUTS")); foreach(Server::$Inputs as $index => $dinput) { $inputshtml .= $dinput->GetHTML($_maxlength,($index == 115 || ($index == 116 && !empty($_GET["cmb"]))) ? true : $dinput->Active,$_overlay); } if($_overlay) { if(!empty($_GET["grot"])) $_html = str_replace("<!--chat_login_group_top-->",IOStruct::GetFile(TEMPLATE_SCRIPT_OVERLAY_CHAT . "login_group.tpl"),$_html); else $_html = str_replace("<!--chat_login_group_bottom-->",IOStruct::GetFile(TEMPLATE_SCRIPT_OVERLAY_CHAT . "login_group.tpl"),$_html); } else { if(!empty($_GET["grot"])) $inputshtml = IOStruct::GetFile(PATH_TEMPLATES . "login_group.tpl") . $inputshtml; else $inputshtml = $inputshtml . IOStruct::GetFile(PATH_TEMPLATES . "login_group.tpl"); } return str_replace("<!--chat_login_inputs-->",$inputshtml,$_html); } } class CacheManager { public $BaseId = null; public $BaseMemId = null; public $Data = array(); public $Encryption = false; public $Compression = true; public $TTL = 4; public $PerformWrite = false; public $Fields; public $Provider; public static $Engine; public static $DataUpdateTimesMemory; public static $DataUpdateTimes; public static $ActiveManager; public static $DataTableResolved = array(); function __construct($_baseId,$_TTL,$_fields,$_configEncryption=true) { $this->Fields = $_fields; $this->TTL = $_TTL; $this->BaseId = $_baseId; $this->BaseMemId = substr(base_convert($_baseId,16,10),0,4); //if(function_exists("mcrypt_encrypt") && defined("MCRYPT_RIJNDAEL_256") && defined("MCRYPT_MODE_ECB")) // $this->Encryption = $_configEncryption; if(CacheManager::$Engine=="MEMCACHED") { $this->Provider = new Memcached(); $this->Provider->addServer('127.0.0.1', 11211); } else if(CacheManager::$Engine=="MEMCACHE") { $this->Provider = new Memcache(); $this->Provider->connect('127.0.0.1', 11211); } $this->Encryption = false; } function UnsetData($_key) { unset($this->Data[$_key]); if(CacheManager::$Engine=="PSHM") { $shmid = @shmop_open($this->BaseMemId . $_key, "w", 0666, 0); if($shmid) { @shmop_delete($shmid); @shmop_close($shmid); } } else if(CacheManager::$Engine=="MEMCACHED" || CacheManager::$Engine=="MEMCACHE") { $this->Provider->flush(); } else if(CacheManager::$Engine=="APC") { apc_delete($this->BaseMemId . $_key); } else if(CacheManager::$Engine=="MYSQL") { DBManager::Execute(true, "DELETE FROM `" . DB_PREFIX . DATABASE_DATA_CACHE . "` WHERE `key`='" . DBManager::RealEscape($_key) . "';"); } } function SetData($_key,$_value,$_allowEmpty=false) { if($_value!=null || $_allowEmpty) { $this->Data[$_key] = array(); $this->Data[$_key][0] = time(); $this->Data[$_key][1] = @serialize($_value); $this->Data[$_key][2] = true; $this->Data[$_key][3] = Server::GetIdentification(); } } function GetData($_key,&$_storage,$_mustBeNull=true) { if((empty($_storage)||!$_mustBeNull) && isset($this->Data[$_key]) && is_array($this->Data[$_key]) && count($this->Data[$_key])==4) { $_storage = @unserialize($this->Data[$_key][1]); return true; } return false; } function Close() { $this->Write(); } function Write() { if(Is::Defined("IS_FILTERED")) return; foreach($this->Data as $key => $value) { if($value[2]) { $data = @serialize($value); /* if($this->Encryption) { $data = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $this->BaseId, $data, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)); $data = base64_encode($data); $data = strlen($data)."_".$data; } */ if($this->Compression && function_exists("gzcompress")) $data = base64_encode(gzcompress($data,5)); if(CacheManager::$Engine=="MEMCACHED" || CacheManager::$Engine=="MEMCACHE") { $this->Provider->delete($this->BaseMemId . $key); $this->Provider->set($this->BaseMemId . $key, $data); } else if(CacheManager::$Engine=="PSHM") { if(function_exists("mb_strlen")) $flength = mb_strlen($data, 'UTF-8'); else $flength = strlen($data); $shmid = @shmop_open($this->BaseMemId . $key, "w", 0666, 0); if($shmid) { @shmop_delete($shmid); @shmop_close($shmid); } $Shmid = @shmop_open($this->BaseMemId . $key, "c", 0666, $flength); @shmop_write($Shmid, $data, 0); @shmop_close($Shmid); } else if(CacheManager::$Engine=="APC") { apc_delete($this->BaseMemId . $key); apc_store($this->BaseMemId . $key, $data); } else if(CacheManager::$Engine=="MYSQL") { DBManager::Execute(true, "REPLACE INTO `" . DB_PREFIX . DATABASE_DATA_CACHE . "` (`key`, `data`, `time`) VALUES ('" . DBManager::RealEscape($key) . "','" . DBManager::RealEscape($data) . "'," . time() . ");"); } } } } function Read() { $loadedKeys = array(); foreach($this->Fields as $key => $name) { $data=""; if(CacheManager::$Engine=="PSHM") { $Shmid = @shmop_open($this->BaseMemId . $key, "a", 0666, 0); if($Shmid) { $shm_size = @shmop_size($Shmid); $data = @shmop_read($Shmid, 0, $shm_size); } @shmop_close($Shmid); } else if(CacheManager::$Engine=="APC") { $data = apc_fetch($this->BaseMemId . $key); } else if(CacheManager::$Engine=="MEMCACHED" || CacheManager::$Engine=="MEMCACHE") { $data = $this->Provider->get($this->BaseMemId . $key); } else if(CacheManager::$Engine=="MYSQL") { if(empty($loadedKeys) && $result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_DATA_CACHE . "`;")) while($row = DBManager::FetchArray($result)) $loadedKeys[$row["key"]] = $row["data"]; if(isset($loadedKeys[$key])) $data = $loadedKeys[$key]; } if(!empty($data)) { if($this->Compression && function_exists("gzuncompress")) $data = @gzuncompress(base64_decode($data)); /* if($this->Encryption) { $upos = strpos($data,"_"); if($upos !== false) { $data = base64_decode(substr($data,$upos+1,strlen($data)-($upos+1))); $data = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $this->BaseId, $data, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)); } else continue; } */ $arra = @unserialize($data); if(!empty($arra) && is_array($arra)) { if((!isset($this->Fields[$key][2]) && $arra[0] > (time()-$this->TTL)) || (isset($this->Fields[$key][2]) && ($arra[0] > (time()-$this->Fields[$key][2])))) { $this->Data[$key] = $arra; $this->Data[$key][2] = false; } } } } } static function GetDataTableIdFromValue($_database,$_column_s,$_value_s,$_canBeNumeric=true,$_maxlength=null) { if(!is_array($_value_s)) { if(!$_canBeNumeric && is_numeric($_value_s)) return $_value_s; if(!is_array($_value_s) && $_maxlength != null && strlen($_value_s) > $_maxlength) $_value_s = substr($_value_s,0,$_maxlength); $_value_s = array(0=>$_value_s); } if(!is_array($_column_s)) { $_column_s = array(0=>$_column_s); } $ckey = "IFV".md5($_database.serialize($_column_s).serialize($_value_s)); if(isset(CacheManager::$DataTableResolved[$ckey])) { return CacheManager::$DataTableResolved[$ckey]; } $columns = $values = $onupdatefields = ""; for($i=0;$i<count($_column_s);$i++) { $columns .= ",`".$_column_s[$i]."`"; $values .= ", '".DBManager::RealEscape($_value_s[$i])."'"; if($i > 0) $onupdatefields .= ",`".$_column_s[$i]."`='".DBManager::RealEscape($_value_s[$i])."'"; } DBManager::Execute(true, "INSERT IGNORE INTO `" . DB_PREFIX . $_database . "` (`id`" . $columns . ") VALUES (NULL" . $values . ") ON DUPLICATE KEY UPDATE `id`=LAST_INSERT_ID(`id`)" . $onupdatefields . ";"); $resid = DBManager::GetLastInsertedId(); if(is_numeric($resid) || $_value_s == "INVALID_DATA") { return CacheManager::$DataTableResolved[$ckey] = $resid; } else return CacheManager::GetDataTableIdFromValue($_database,$_column_s,"INVALID_DATA",$_canBeNumeric,$_maxlength); } static function GetDataTableValueFromId($_database,$_column,$_id,$_unknown=false,$_returnIdOnFailure=false) { if(isset(CacheManager::$DataTableResolved["VFI".md5($_database.$_column.$_id)])) return CacheManager::$DataTableResolved["VFI".md5($_database.$_column.$_id)]; $row = DBManager::FetchArray(DBManager::Execute(true, "SELECT `" . $_column . "` FROM `" . DB_PREFIX . $_database . "` WHERE `id`='" . DBManager::RealEscape($_id) . "' LIMIT 1;")); if($_unknown && empty($row[$_column])) $value = "<!--lang_stats_unknown-->"; else if($_returnIdOnFailure && empty($row[$_column])) $value = $_id; else $value = $row[$_column]; return CacheManager::$DataTableResolved["VFI".md5($_database.$_column.$_id)] = $value; } static function GetValueBySystemId($_systemid,$_value,$_default) { $value = $_default; $parts = explode("~",$_systemid); $result = DBManager::Execute(true, "SELECT `" . DBManager::RealEscape($_value) . "` FROM `" . DB_PREFIX . DATABASE_VISITOR_CHATS . "` WHERE `visitor_id`='" . DBManager::RealEscape($parts[0]) . "' AND `browser_id`='" . DBManager::RealEscape($parts[1]) . "' ORDER BY `last_active` DESC LIMIT 1;"); if($result) { $row = DBManager::FetchArray($result); $value = $row[$_value]; } return $value; } static function GetObjectId($_field,$_database) { $result = DBManager::Execute(true, "SELECT `" . $_field . "`,(SELECT MAX(`id`) FROM `" . DB_PREFIX . $_database . "`) as `used_" . $_field . "` FROM `" . DB_PREFIX . DATABASE_INFO . "`"); $row = DBManager::FetchArray($result); $max = max($row[$_field],$row["used_" . $_field]); $tid = $max+1; DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_INFO . "` SET `" . $_field . "`='" . DBManager::RealEscape($tid) . "';"); return $tid; } static function FlushKey($_key) { if(!empty(CacheManager::$ActiveManager)) CacheManager::$ActiveManager->UnsetData($_key); } static function CachingAvailable($_config) { if(!empty($_config)) { $avail = array("APC"=>false,"PSHM"=>false,"MEMCACHED"=>false,"MEMCACHE"=>false); if(function_exists("apc_store") && !(Is::Defined("PHP_SAPI") && strpos(strtoupper(PHP_SAPI),"CGI")!==false && strpos(strtoupper(PHP_SAPI),"FAST")===false)) $avail["APC"]=true; if(function_exists("shmop_open") && !(Is::Defined("PHP_OS") && strtoupper(substr(PHP_OS, 0, 3)) === "WIN")) $avail["PSHM"]=true; if(class_exists("Memcached")) $avail["MEMCACHED"]=true; if(class_exists("Memcache")) $avail["MEMCACHE"]=true; if($_config==2 && $avail["PSHM"]) return CacheManager::$Engine = "PSHM"; else if($_config==1) return CacheManager::$Engine = "MYSQL"; else if($_config==3 && $avail["MEMCACHED"]) return CacheManager::$Engine = "MEMCACHED"; else if($_config==4 && $avail["MEMCACHE"]) return CacheManager::$Engine = "MEMCACHE"; else if($_config==5 && $avail["APC"]) return CacheManager::$Engine = "APC"; } return false; } static function Flush() { if(CacheManager::$Engine=="APC" && function_exists("apc_clear_cache")) { @apc_clear_cache(); @apc_clear_cache('user'); @apc_clear_cache('opcode'); } if(DBManager::$Connected) { DBManager::Execute(true, "DELETE FROM `" . DB_PREFIX . DATABASE_DATA_CACHE . "`;"); } } static function SetDataUpdateTime($_areaIndex,$_micro=true) { CacheManager::WriteDataUpdateTime($_areaIndex,false,DBManager::$Connector,DB_PREFIX,($_micro) ? (round(microtime(true) * 100)."0") : time()); } static function WriteDataUpdateTime($_areaIndex,$_reload=false,$_connector=null,$_prefix="",$_mtime=0) { if(!(isset(CacheManager::$DataUpdateTimesMemory[$_areaIndex]) && CacheManager::$DataUpdateTimesMemory[$_areaIndex]==$_mtime)) { CacheManager::$DataUpdateTimes[$_areaIndex]= CacheManager::$DataUpdateTimesMemory[$_areaIndex]=$_mtime; $result = $_connector->Query(true,"SELECT * FROM `".$_prefix.DATABASE_DATA_UPDATES."`;"); if(DBManager::GetRowCount($result) == 0 && !$_reload) { $_connector->Query(true,"TRUNCATE `".$_prefix.DATABASE_DATA_UPDATES."`;"); $_connector->Query(true,"INSERT IGNORE INTO `".$_prefix.DATABASE_DATA_UPDATES."` (`update_tickets`, `update_archive`, `update_feedbacks`, `update_emails`, `update_events`, `update_vouchers`, `update_filters`, `update_reports`) VALUES ('0', '0', '0', '0', '0', '0', '0', '0');"); CacheManager::WriteDataUpdateTime($_areaIndex,true,$_connector,$_prefix,$_mtime); } else { $_connector->Query(true,"UPDATE `".$_prefix.DATABASE_DATA_UPDATES."` SET `".DBManager::RealEscape($_areaIndex)."`=".$_mtime.";"); CacheManager::FlushKey(DATA_CACHE_KEY_DATA_TIMES); } } } static function GetDataUpdateTimes() { if(!empty(CacheManager::$ActiveManager) && CacheManager::$ActiveManager->GetData(DATA_CACHE_KEY_DATA_TIMES,CacheManager::$DataUpdateTimes)) return; CacheManager::$DataUpdateTimes = array(DATA_UPDATE_KEY_TICKETS=>0,DATA_UPDATE_KEY_EMAILS=>0,DATA_UPDATE_KEY_EVENTS=>0,DATA_UPDATE_KEY_CHAT_ARCH=>0,DATA_UPDATE_KEY_REPORTS=>0,DATA_UPDATE_KEY_FEEDBACKS=>0,DATA_UPDATE_KEY_FILTERS=>0); if(DBManager::$Connected) { $result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_DATA_UPDATES . "`;"); if($result && $row = DBManager::FetchArray($result)) CacheManager::$DataUpdateTimes = array(DATA_UPDATE_KEY_TICKETS=>$row[DATA_UPDATE_KEY_TICKETS],DATA_UPDATE_KEY_EMAILS=>$row[DATA_UPDATE_KEY_EMAILS],DATA_UPDATE_KEY_EVENTS=>$row[DATA_UPDATE_KEY_EVENTS],DATA_UPDATE_KEY_CHAT_ARCH=>$row[DATA_UPDATE_KEY_CHAT_ARCH],DATA_UPDATE_KEY_REPORTS=>$row[DATA_UPDATE_KEY_REPORTS],DATA_UPDATE_KEY_FEEDBACKS=>(isset($row[DATA_UPDATE_KEY_FEEDBACKS])) ? $row[DATA_UPDATE_KEY_FEEDBACKS] : 0,DATA_UPDATE_KEY_FILTERS=>$row[DATA_UPDATE_KEY_FILTERS]); } if(!empty(CacheManager::$ActiveManager)) CacheManager::$ActiveManager->SetData(DATA_CACHE_KEY_DATA_TIMES,CacheManager::$DataUpdateTimes); } static function IsDataUpdate($_postkey,$_dbkey,$_minLast=0) { if(CacheManager::$DataUpdateTimes[$_dbkey]==0) return false; if(!empty($_POST[$_postkey]) && !empty($_minLast) && floor($_POST[$_postkey]/1000) > time()-$_minLast) return false; return !(!empty($_POST[$_postkey]) && $_POST[$_postkey]>=CacheManager::$DataUpdateTimes[$_dbkey]); } } class DBManager { public static $Extension = "mysql"; public static $Connected = false; public static $Prefix; public static $Provider; public static $Connector; public static $QueryCount = 0; public static $Queries = ""; public $Username; public $Password; public $Database; public $Host; function __construct($_username,$_password,$_host,$_database,$_prefix="") { $this->Username = $_username; $this->Password = $_password; $this->Host = $_host; $this->Database = $_database; DBManager::$Prefix = $_prefix; } function InitConnection() { if(DBManager::$Extension=="mysql") DBManager::$Provider = mysql_connect($this->Host, $this->Username, $this->Password); else if(DBManager::$Extension=="mysqli") DBManager::$Provider = mysqli_connect($this->Host, $this->Username, $this->Password); if(DBManager::$Provider) { $this->SetEncoding(); $this->SetMode(); if(!empty($this->Database)) { if($this->SelectDatabase(DBManager::RealEscape($this->Database))) DBManager::$Connected = true; } } else DBManager::LogError("connect"); return DBManager::$Connected; } function Query($_log,$_sql,&$_errorCode=-1,$result=null) { if(DBManager::$Extension=="mysql") $result = @mysql_query($_sql, DBManager::$Provider); else if(DBManager::$Extension=="mysqli") $result = @mysqli_query(DBManager::$Provider , $_sql); $ignore = array("1146","1045","2003","1213",""); $_errorCode = DBManager::GetErrorCode(); if(!$result && !in_array($_errorCode,$ignore)) { if($_log) DBManager::LogError($_sql); } return $result; } function SelectDatabase($_dbName) { if(DBManager::$Extension=="mysql") return @mysql_select_db($_dbName, DBManager::$Provider); else if(DBManager::$Extension=="mysqli") return @mysqli_select_db(DBManager::$Provider, $_dbName); return null; } function SetEncoding() { $this->Query(false, "SET character_set_results = 'utf8mb4', character_set_client = 'utf8mb4', character_set_connection = 'utf8mb4', character_set_database = 'utf8mb4', character_set_server = 'utf8mb4'"); if(DBManager::$Extension=="mysql") mysql_set_charset("utf8mb4",DBManager::$Provider); else if(DBManager::$Extension=="mysqli") mysqli_set_charset(DBManager::$Provider,"utf8mb4"); } function SetMode() { $this->Query(false,"SET SESSION sql_mode = 'TRADITIONAL'"); } static function LogError($_sql) { Logging::DatabaseLog(DBManager::GetErrorCode() . ": " . DBManager::GetError() . "\r\n\r\nSQL: " . $_sql . "\r\n"); } static function Close() { if(DEBUG_MODE) Server::SaveDBStats(); if(DBManager::$Extension=="mysql" && DBManager::$Provider) @mysql_close(DBManager::$Provider); else if(DBManager::$Extension=="mysqli" && DBManager::$Provider) @mysqli_close(DBManager::$Provider); } static function RealEscape($_toEscape,$_filterWildCard=false) { if($_filterWildCard) $_toEscape = str_replace("%","",$_toEscape); if(DBManager::$Extension=="mysql" && DBManager::$Provider) return @mysql_real_escape_string($_toEscape); else if(DBManager::$Extension=="mysqli" && DBManager::$Provider) return @mysqli_real_escape_string(DBManager::$Provider,$_toEscape); return $_toEscape; } static function FetchArray($_result,$_type=null) { if(DBManager::$Extension=="mysql") { if($_type == null) $_type = MYSQL_BOTH; else if($_type == "ASSOC") $_type = MYSQL_ASSOC; return @mysql_fetch_array($_result, $_type); } else if(DBManager::$Extension=="mysqli") { if($_type == null) $_type = MYSQLI_BOTH; else if($_type == "ASSOC") $_type = MYSQLI_ASSOC; return @mysqli_fetch_array($_result, $_type); } return null; } static function GetRowCount($_result) { if(DBManager::$Extension=="mysql") return @mysql_num_rows($_result); else if(DBManager::$Extension=="mysqli") { @mysqli_store_result(DBManager::$Provider); return @mysqli_num_rows($_result); } return 0; } static function GetAffectedRowCount() { if(DBManager::$Extension=="mysql") return mysql_affected_rows(); else if(DBManager::$Extension=="mysqli") return mysqli_affected_rows(DBManager::$Provider); return 0; } static function GetErrorCode() { if(DBManager::$Extension=="mysql") return mysql_errno(); else if(DBManager::$Extension=="mysqli") { if(DBManager::$Provider) return mysqli_errno(DBManager::$Provider); else return mysqli_connect_errno(); } return ""; } static function GetError() { if(DBManager::$Extension=="mysql") return mysql_error(); else if(DBManager::$Extension=="mysqli") { if(DBManager::$Provider) return mysqli_error(DBManager::$Provider); else return mysqli_connect_error(); } return ""; } static function GetLastInsertedId() { if(DBManager::$Extension=="mysql") return mysql_insert_id(DBManager::$Provider); else if(DBManager::$Extension=="mysqli" && DBManager::$Provider) { return mysqli_insert_id(DBManager::$Provider); } return ""; } static function Execute($_log, $_sql, &$_errorCode = -1) { if(!DBManager::$Connected) { Logging::DatabaseLog("Query without connection: " . $_sql . " " . serialize(debug_backtrace())); return false; } $result = DBManager::$Connector->Query($_log,$_sql,$_errorCode); return $result; } static function GetStatement($_sql) { if(!DBManager::$Connected) { Logging::DatabaseLog("Prepare without connection: " . $_sql . " " . serialize(debug_backtrace())); return false; } $stmt = DBManager::$Provider->prepare($_sql); return $stmt; } static function ExecutePrepared($_stmt) { $_stmt->execute(); return $_stmt; } static function ConditionAdd($_condition,$_toAdd) { if(empty($_condition)) $_condition = $_toAdd; else $_condition = "(" . $_condition . ") AND " . $_toAdd; return $_condition; } static function EncodeField($_data) { return "BASE64;" . base64_encode($_data); } static function DecodeField($_data) { if(strpos($_data,"BASE64;") === 0) return base64_decode(str_replace("BASE64;","",$_data)); return $_data; } } class SocialMediaChannel { public $GroupId; public $Deleted; public $LastConnect = 0; public $DataSince = ""; public $ConnectFrequency = 0; public $Id; public $Type; public $PageId; public $TokenId; public $TokenExpires; public $Name; public $StreamType; public $Track; function __construct($_groupId) { $this->GroupId = $_groupId; } function SetValues($_row) { $this->LastConnect = $_row["last_connect"]; $this->DataSince = $_row["data_since"]; $this->ConnectFrequency = $_row["connect_frequency"]; $this->GroupId = $_row["group_id"]; $this->Id = $_row["id"]; $this->PageId = $_row["page_id"]; $this->TokenId = $_row["token"]; $this->Name = $_row["name"]; $this->StreamType = $_row["stream_type"]; $this->Track = $_row["track"]; } function Connect($_data, $_action) { if(function_exists("gzuncompress")) $_data["p_zip"] = "1"; $_data["p_tz"] = SystemTime::GetSystemTimezone(); $response = Server::CallURL(CONFIG_LIVEZILLA_SOCIAL . strtolower(SocialMediaChannel::GetChannelTypeName($this->Type)) . "/?a=" . $_action,$_data); if(!empty($response)) { if(!empty($_data["p_zip"])) { $result = @gzuncompress(base64_decode($response)); if($result === false && !empty($response)) { handleError("122", "Error connecting social channel: " . $this->Name . " (" . $response . ")","",0); return ""; } } else $result = $response; } else return ""; if(!empty($result) && is_string(json_decode($result)) && strpos(json_decode($result),"ERR")===0) handleError("123", "Error connecting social channel: " . $this->Name . " (" . json_decode($result) . ")","",0); else return $result; return ""; } function Download($_data=null) { return $this->Connect($_data,"cd"); } function Reply($_data) { return $this->Connect($_data,"sr"); } function SetLastConnect($_time) { /* $min = ($_time>0) ? $_time-10 : time()+1; DBManager::Execute(true, $g="UPDATE `" . DB_PREFIX . DATABASE_SOCIAL_MEDIA_CHANNELS . "` SET `last_connect`=" . intval($_time) . " WHERE `last_connect` < ". intval(abs($min)) ." AND `id`='" . DBManager::RealEscape($this->Id) . "'"); return DBManager::GetAffectedRowCount(); */ } function GetXML() { return "<value i=\"".base64_encode($this->Id)."\" s=\"".base64_encode($this->StreamType)."\" n=\"".base64_encode($this->Name)."\" tr=\"".base64_encode($this->Track)."\" t=\"".base64_encode($this->Type)."\" d=\"".base64_encode($this->DataSince)."\" c=\"".base64_encode($this->ConnectFrequency)."\" p=\"".base64_encode($this->PageId)."\">".base64_encode($this->TokenId)."</value>\r\n"; } function XMLParamAlloc($_param,$_value) { if($_param == "a") $this->PageId = $_value; else if($_param == "b") $this->TokenId = $_value; else if($_param == "c") $this->TokenExpires = $_value; else if($_param == "d") $this->Name = $_value; else if($_param == "e") $this->ConnectFrequency = $_value; else if($_param == "f") $this->DataSince = $_value; else if($_param == "g") $this->Id = $_value; else if($_param == "h") $this->StreamType = $_value; else if($_param == "i") $this->Type = $_value; else if($_param == "j") $this->Track = base64_decode($_value); } function Save($_prefix) { //DBManager::Execute(true, "INSERT INTO `" . $_prefix . DATABASE_SOCIAL_MEDIA_CHANNELS . "` (`id` ,`name`, `page_id`,`group_id` ,`type` ,`stream_type` ,`token`,`token_expire`,`last_connect`,`data_since`,`connect_frequency`,`track`) VALUES ('" . DBManager::RealEscape($this->Id) . "','" . DBManager::RealEscape($this->Name) . "','" . DBManager::RealEscape($this->PageId) . "', '" . DBManager::RealEscape($this->GroupId) . "'," . intval($this->Type) . "," . intval($this->StreamType) . ", '" . DBManager::RealEscape($this->TokenId) . "', '" . DBManager::RealEscape($this->TokenExpires) . "', " . intval($this->LastConnect) . ",'" . DBManager::RealEscape($this->DataSince) . "'," . intval($this->ConnectFrequency) . ",'" . DBManager::RealEscape($this->Track) . "');"); } function IsSince() { return !($this->Type == 6 && $this->StreamType == 1); } static function DeleteByGroup($_prefix,$_groupId) { //DBManager::Execute(true, "DELETE FROM `" . $_prefix . DATABASE_SOCIAL_MEDIA_CHANNELS . "` WHERE `group_id`='" . DBManager::RealEscape($_groupId) . "';"); } static function GetChannelById($_id) { Server::InitDataBlock(array("DBCONFIG")); foreach(Server::$Configuration->Database["gl_sm"] as $channel) if($channel->Id == $_id) return $channel; return null; } static function GetChannelTypeName($_typeId) { $types = array("6"=>"Facebook","7"=>"Twitter"); return $types[$_typeId]; } static function ResetDownloadTime(){ foreach(Server::$Configuration->Database["gl_sm"] as $sm) $sm->SetLastConnect(0); } } class FacebookChannel extends SocialMediaChannel { function __construct($_groupId) { $this->Type = 6; $this->GroupId = $_groupId; } function Download($_data=null) { $data["p_llt"] = $this->TokenId; $data["p_pid"] = $this->PageId; $data["p_dut"] = $this->DataSince; $data["p_st"] = $this->StreamType; $result = parent::Download($data); $messages = array(); if(!empty($result) && $result=json_decode($result,true)) { if(is_array($result)) { foreach($result as $hash => $msgdata) $messages[$hash] = @unserialize(base64_decode($msgdata)); } } return $messages; } function SetLastUpdate($_time) { /* if($this->StreamType == 1) $_time = max($this->DataSince,(time()-(7*86400))); if($_time > $this->DataSince) DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_SOCIAL_MEDIA_CHANNELS . "` SET `data_since`='" . DBManager::RealEscape($_time) . "' WHERE `id`='" . DBManager::RealEscape($this->Id) . "' LIMIT 1;"); */ } function SendReply($_ticket,$_message,$_text,$_quote) { $data["p_llt"] = $this->TokenId; $data["p_pid"] = $this->PageId; $data["p_text"] = $_text; $data["p_ci"] = $_ticket->ChannelConversationId; $data["p_st"] = $this->StreamType; $data["p_cci"] = $_quote->ChannelId; $channelId = json_decode(parent::Reply($data)); $_message->SetChannelId($channelId); } } class TwitterChannel extends SocialMediaChannel { function __construct($_groupId) { $this->Type = 7; $this->GroupId = $_groupId; } function Download($_data=null) { $data["p_llt"] = $this->TokenId; $data["p_pid"] = $this->PageId; $data["p_dut"] = $this->DataSince; $data["p_st"] = $this->StreamType; $data["p_tr"] = $this->Track; $result = parent::Download($data); $messages = array(); if(!empty($result) && $result=json_decode($result,true)) { if(is_array($result)) { foreach($result as $hash => $msgdata) $messages[$hash] = @unserialize(base64_decode($msgdata)); } } return $messages; } function SendReply($_ticket,$_message,$_text,$_quote) { $data["p_llt"] = $this->TokenId; $data["p_pid"] = $this->PageId; $data["p_text"] = $_text; $data["p_cci"] = $_quote->ChannelId; $data["p_st"] = $this->StreamType; $data["p_rid"] = $_quote->Email; $channelId = json_decode(parent::Reply($data)); $_message->SetChannelId($channelId); } function SetLastUpdate($_sinceId) { //DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_SOCIAL_MEDIA_CHANNELS . "` SET `data_since`='" . DBManager::RealEscape($_sinceId) . "' WHERE `id`='" . DBManager::RealEscape($this->Id) . "' LIMIT 1;"); } function AddScreenName($_text,$_screenName) { if(strpos(strtolower($_text),strtolower($_screenName . " ")) !== 0) return $_screenName . " " . $_text; return $_text; } } class KnowledgeBase { public $Entries; function __construct() { $this->Entries = KnowledgeBase::GetEntries(); } static function ReadTextColor() { $default = "#2e8ae5"; if(isset(Server::$Configuration->File["gl_kbdc"])) $default = Server::$Configuration->File["gl_kbdc"]; return Communication::ReadParameter("etc",$default); } static function GetMatches($root,$_question,$_language="",$_botOnly=false,$_includeFolders=false) { $dblist = $rlist = $list = array(); $criteria = (($_botOnly) ? "`kb_bot`=1" : "`kb_public`=1"); if(!$_includeFolders) $criteria = "`type` > 0 AND " . $criteria; if($result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_RESOURCES . "` WHERE `discarded`=0 AND " . $criteria . ";")) { while($row = DBManager::FetchArray($result)) { $entry = new KnowledgeBaseEntry($row); if($entry->MatchesLanguage($_language)) { if($entry->IsChildOf($root)) $dblist[] = $entry; } } } foreach($dblist as $entry) { $entry->CalculateMatchrate($_question,$_language); if($entry->Matchrate > 0) $list[$entry->Id] = $entry; } if(count($list)>0) { $sorted = array(); foreach($list as $id => $entry) $sorted[$id] = $entry->Matchrate; arsort($sorted); foreach($sorted as $id => $matchrate) $rlist[] = $list[$id]; } if($_botOnly) { $caritems = array(); foreach($rlist as $id => $item) { $caritems[] = new ChatAutoReply($id,$item); $caritems[count($caritems)-1]->Tags .= "," . str_replace(array(" ",";",".","?","!"),",",$item->Title); if(Server::$Configuration->File["gl_kbsb"] == 0/* || $this->FulltextSearch*/) $caritems[count($caritems)-1]->Tags .= "," . str_replace(array(" ",";",".","?","!"),",",$item->Value); } return $caritems; } return $rlist; } static function GetEntriesByList($topList,$_language,$_root,$_blacklist=false) { if($result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_RESOURCES . "` WHERE `kb_public`=1 AND `type`!=0 AND `discarded`=0 ORDER BY `order_key` ASC,`title` ASC")) { while($row = DBManager::FetchArray($result)) { $entry = new KnowledgeBaseEntry($row); if((!$_blacklist && isset($topList[$entry->Id])) || ($_blacklist && !isset($topList[$entry->Id]))) { if($entry->MatchesLanguage($_language)) { //$entry->ValidateParents(1); if($entry->IsChildOf($_root)) { $topList[$entry->Id] = $entry; } } } } } return $topList; } static function GetTOPEntries($_root="",$_language="",$_onlyTops=true) { $topList = array(); if($_onlyTops) if($result = DBManager::Execute(true, "SELECT `res_id`,SUM(`views`) as `count` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_KNOWLEDGEBASE . "` GROUP BY `res_id` ORDER BY `count` DESC")) { while($row = DBManager::FetchArray($result)) { $topList[$row["res_id"]] = 1; } } $rlist = array(); $topList = KnowledgeBase::GetEntriesByList($topList,$_language,$_root); //if(count($topList) < 5) // $topList = KnowledgeBase::GetEntriesByList($topList,$_language,$_root,true); $tcount = 0; foreach($topList as $rid => $ar) if($ar !== 1 && $tcount < 5) { $rlist[$rid] = $ar; $tcount++; } $tlist = array(); if(count($rlist)>0) { $tlist[0] = new KnowledgeBaseEntry(); $tlist[0]->Id = 1; $tlist[0]->ChildNodes = $rlist; $tlist[0]->Title = LocalizationManager::$TranslationStrings["client_most_popular"]; } return $tlist; } static function GetEntries($_root="",$_language="",$_noPublicParent=true) { $rlist = array(); if($result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_RESOURCES . "` WHERE `kb_public`=1 AND `type`=0 AND `discarded`=0 ORDER BY `order_key` ASC,`title` ASC")) { while($row = DBManager::FetchArray($result)) { if($_noPublicParent) { $parent = new KnowledgeBaseEntry(); $parent->Load($row["parentid"]); if($parent->Type == 0 && $parent->IsPublic) continue; } $entry = new KnowledgeBaseEntry($row); if($entry->MatchesLanguage($_language)) { if($entry->IsChildOf($_root)) { $entry->LoadChildNodes($_root,true,$_language); $rlist[$entry->Id] = $entry; } } } } if(empty($_root)) { $rlist[1] = new KnowledgeBaseEntry(); $rlist[1]->Id = 1; $rlist[1]->LoadChildNodes($_root,true,$_language,true); $rlist[1]->Title = LocalizationManager::$TranslationStrings["client_tab_knowledgebase"]; } return $rlist; } static function CreateEntry($_userId, $_resId, $_value, $_type, $_title, $_disc, $_parentId, $_size=0, $_tags = "", $_chatId = 0, $_editor="") { if($_size == 0) $_size = strlen($_title); if(empty($_editor)) $_editor = $_userId; $result = DBManager::Execute(true, "SELECT `id`,`value` FROM `" . DB_PREFIX . DATABASE_RESOURCES . "` WHERE `id`='" . DBManager::RealEscape($_resId) . "'"); if(DBManager::GetRowCount($result) == 0) { if(!$_disc || $_disc == 2) { if($_disc == 2) self::RemoveFileUploads(); DBManager::Execute(true, "INSERT INTO `" . DB_PREFIX . DATABASE_RESOURCES . "` (`id`,`owner`,`editor`,`value`,`edited`,`title`,`created`,`type`,`discarded`,`parentid`,`size`,`tags`,`chat_id`,`related`) VALUES ('" . DBManager::RealEscape($_resId) . "','" . DBManager::RealEscape($_userId) . "','" . DBManager::RealEscape($_editor) . "','" . DBManager::RealEscape($_value) . "','" . DBManager::RealEscape(time()) . "','" . DBManager::RealEscape(Str::Cut($_title,248,false)) . "','" . DBManager::RealEscape(time()) . "','" . DBManager::RealEscape($_type) . "'," . intval($_disc) . ",'" . DBManager::RealEscape($_parentId) . "','" . DBManager::RealEscape($_size) . "','" . DBManager::RealEscape($_tags) . "'," . intval($_chatId) . ",'')"); } } else if($_type > 0) { $row = DBManager::FetchArray($result); DBManager::Execute(true, $result = "UPDATE `" . DB_PREFIX . DATABASE_RESOURCES . "` SET `value`='" . DBManager::RealEscape($_value) . "',`editor`='" . DBManager::RealEscape($_userId) . "',`tags`='" . DBManager::RealEscape($_tags) . "',`title`='" . DBManager::RealEscape(Str::Cut($_title,254,false)) . "',`edited`=" . intval(time()) . ",`discarded`='" . DBManager::RealEscape(To::BoolString($_disc, false)) . "',`parentid`='" . DBManager::RealEscape($_parentId) . "',`size`='" . DBManager::RealEscape($_size) . "' WHERE id='" . DBManager::RealEscape($_resId) . "' LIMIT 1"); if(!empty($_disc) && ($_type == RESOURCE_TYPE_FILE_INTERNAL || $_type == RESOURCE_TYPE_FILE_EXTERNAL) && @file_exists("./uploads/" . $row["value"]) && strpos($row["value"],"..")===false) @unlink("./uploads/" . $row["value"]); } } static function RemoveFileUploads($_all=false) { if($_all) { // 1 = common deleted files, remove file, keep res entry for sync delay if($result = DBManager::Execute(true, "SELECT `value` FROM `" . DB_PREFIX . DATABASE_RESOURCES . "` WHERE `discarded`=1 AND `type`>2 AND `created` < ".(time()-60))) { while($result && $row = DBManager::FetchArray($result)) if(strpos($row["value"],"..") === false) { @unlink(PATH_UPLOADS . $row["value"]); } } } // 2 = screen capture files, remove both instantly if($result = DBManager::Execute(true, $q="SELECT `value` FROM `" . DB_PREFIX . DATABASE_RESOURCES . "` WHERE `discarded`=2 AND `type`>2 AND `created` < ".(time()-30))) { while($result && $row = DBManager::FetchArray($result)) if(strpos($row["value"],"..") === false) { DBManager::Execute(true, $q="DELETE FROM `" . DB_PREFIX . DATABASE_ADMINISTRATION_LOG . "` WHERE `type`='IOStruct::CreateFile' AND `ip`='" . DBManager::RealEscape(Communication::GetIP(true)) . "' AND `time` < ".(time()-40)); @unlink(PATH_UPLOADS . $row["value"]); } DBManager::Execute(true, "DELETE FROM `" . DB_PREFIX . DATABASE_RESOURCES . "` WHERE `discarded`=2 AND `type`>2 AND `created` < ".(time()-40)); } } static function CreateFolders($_owner,$_internal) { if($_internal) { KnowledgeBase::CreateEntry($_owner, 3, "%%_Files_%%", 0, "%%_Files_%%", 0, 1); KnowledgeBase::CreateEntry($_owner, 4, "%%_Internal_%%", 0, "%%_Internal_%%", 0, 3); } else { KnowledgeBase::CreateEntry($_owner, 3, "%%_Files_%%", 0, "%%_Files_%%", 0, 1); KnowledgeBase::CreateEntry($_owner, 5, "%%_External_%%", 0, "%%_External_%%", 0, 3); } } static function ReqisterQuery($_query,$_browser) { if(strpos($_query,"tags: ") === 0) return false; $qid = $_browser->GetQueryId($_query,"",255,true); if(($result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_KNOWLEDGEBASE_QUERIES . "` WHERE `ip_hash`='" . DBManager::RealEscape(md5(Communication::GetIP())) . "' AND `query`=" . intval($qid) . " AND `time`>" . intval(time() - 3600) . ";")) && $row = DBManager::FetchArray($result)) return; if($result = DBManager::Execute(true, "SELECT `t1`.`id` as `sid`,`t1`.`query` as `qid`,`t2`.`query` AS `qval` FROM `" . DB_PREFIX . DATABASE_KNOWLEDGEBASE_QUERIES . "` AS `t1` INNER JOIN `" . DB_PREFIX . DATABASE_VISITOR_DATA_QUERIES . "` AS `t2` ON `t1`.`query`=`t2`.`id` WHERE `t1`.`time`>" . intval(time() - 3600) . " AND `t1`.`ip_hash`='" . DBManager::RealEscape(md5(Communication::GetIP())) . "' ORDER BY `t1`.`time` DESC")) while($row = DBManager::FetchArray($result)) if(strlen($_query) >= strlen($row["qval"]) && strpos($_query,$row["qval"])!==false) DBManager::Execute(true, "DELETE FROM `" . DB_PREFIX . DATABASE_KNOWLEDGEBASE_QUERIES . "` WHERE `id`='" . DBManager::RealEscape($row["sid"]) . "' LIMIT 1"); DBManager::Execute(true, "INSERT INTO `" . DB_PREFIX . DATABASE_KNOWLEDGEBASE_QUERIES . "` (`id`,`time`,`query`,`ip_hash`) VALUES ('" . DBManager::RealEscape(GetId(32)) . "'," . time() . "," . intval($qid) . ",'" . DBManager::RealEscape(md5(Communication::GetIP())) . "');"); } static function GetURL($_article,$_getParams,$_title,$_exclude=null,$_blank=false,$_absolute=false,$_openExternal=false,$_hash="",$_color=true,$_id="",$_tagSearch=false) { if($_openExternal) $exclude[] = "no-logo"; $params = KnowledgeBase::GetAllowedParameters("get",$_exclude,true); if(empty(Server::$Configuration->File["gl_kbmr"])) { if($_absolute) $url = LIVEZILLA_URL . "knowledgebase.php"; else $url = "knowledgebase.php"; if(!empty($_getParams)) $params = array_merge($params,$_getParams); if(!empty($_article)) $params["article"] = $_article; if(!empty($params)) { ksort($params); $url .= "?" . http_build_query($params); } } else { $url = LIVEZILLA_URL . "knowledge-base/"; if(!empty($_getParams)) $params = array_merge($params,$_getParams); if(!empty($_article)) { $entry = new KnowledgeBaseEntry(); $entry->Load($_article); $parents = $entry->GetParents(); foreach($parents as $id => $parent) { $url .= $id . "/"; } $url .= $_article . "/"; } if(!empty($params)) { ksort($params); $url .= "?" . http_build_query($params); } } $blank = ""; if($_blank) $blank = " target=\"_blank\""; $color = ""; if($_color) $color = " style=\"color:<!--color-->;\""; $id = ""; if($_id) $id = " id=\"".$_id."\""; $class = ""; if($_tagSearch) $class = " class=\"kb_tag\""; $link = "<a" . $id . $blank . $color . $class . " href=\"".$url.$_hash."\">".$_title."</a>"; return $link; } static function GetEmbeddedURL() { $params = VisitorMonitoring::GetAllowedParameters(); $url = Server::$Configuration->File["gl_kurl"]; if(!empty($params)) { if(strpos($url,'?')!==false) $url .= "&" . $params; else $url .= "?" . $params; } return LocalizationManager::Replace($url); } static function GetAllowedParameters($_type="get",$_exclude=null,$_asArray=false) { $allowed = array("tops"=>true,"e"=>true,"el"=>true,"epc"=>true,"etc"=>true,"ckf"=>true,"no-logo"=>true,"search-for"=>true,"ptn"=>true,"pte"=>true,"ptc"=>true,"ptq"=>true,"ptp"=>true,"ptl"=>true,"ptcf0"=>true,"ptcf1"=>true,"ptcf2"=>true,"ptcf3"=>true,"ptcf4"=>true,"ptcf5"=>true,"ptcf6"=>true,"ptcf7"=>true,"ptcf8"=>true,"ptcf9"=>true,"pth"=>true,"pto"=>true,"operator"=>true,"group"=>true); if($_exclude != null) foreach($_exclude as $ep) unset($allowed[$ep]); if($_type=="get") { if($_asArray) return Communication::GetTargetParameterArray($allowed); else return Communication::GetTargetParameterString("",$allowed); } else if($_type=="form") return Communication::GetTargetParameterForm("",$allowed); return ""; } static function GetTemporaryTicketFiles($_visitorId,$_fIndex) { $files = array(); if($result = DBManager::Execute(true, $d = "SELECT * FROM `" . DB_PREFIX . DATABASE_RESOURCES . "` WHERE `created`>(UNIX_TIMESTAMP()-3600) AND `parentid`=100 AND `discarded`=0 AND `type`=3 AND `editor`='". DBManager::RealEscape($_visitorId."_".$_fIndex) . "' LIMIT 10;")) while($row = DBManager::FetchArray($result)) if(!TicketAttachment::ResourceExists($row["id"])) $files[] = $row; return $files; } static function RemoveTicketFile($_id) { DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_RESOURCES . "` SET `discarded`=1 WHERE `created`>(UNIX_TIMESTAMP()-86400) AND `parentid`=100 AND `type`=3 AND MD5(`id`)='". DBManager::RealEscape($_id) . "' LIMIT 1;"); } static function GetAllPublicLanguages() { global $LANGUAGES; $list = array(); if($result = DBManager::Execute(true, "SELECT `languages` FROM `" . DB_PREFIX . DATABASE_RESOURCES . "` WHERE `kb_public`=1 GROUP BY `languages`")) while($row = DBManager::FetchArray($result)) { $parts = explode(",",$row["languages"]); foreach($parts as $iso) { $iso = strtoupper($iso); if(!empty($iso) && isset($LANGUAGES[$iso])) { if(!isset($list[$iso])) $list[$iso] = $LANGUAGES[$iso][0]; } } } return $list; } } class KnowledgeBaseEntry { public $Id; public $Tags; public $Value; public $Title; public $Matchrate=0; public $ParentId; public $ChildNodes; public $Type=0; public $OwnerId; public $GroupId = ""; public $EditorId; public $Created; public $Edited; public $Rank=0; public $Size; public $Languages; public $IsPublic; public $FulltextSearch; public $ShortcutWord; public $IsDiscarded; public $AllowBotAccess; public $OrderKey = 0; public $InWidget = true; public $Related = ""; function __construct() { if(func_num_args() == 1) { $this->SetDetails(func_get_arg(0)); } } function SetDetails($_row) { $this->Id = $_row["id"]; $this->Value = $_row["value"]; $this->Title = $_row["title"]; $this->Tags = $_row["tags"]; $this->ParentId = $_row["parentid"]; $this->Type = $_row["type"]; $this->OwnerId = $_row["owner"]; $this->GroupId = $_row["owner_group"]; $this->EditorId = $_row["editor"]; $this->Created = $_row["created"]; $this->Edited = $_row["edited"]; $this->Size = $_row["size"]; $this->Languages = $_row["languages"]; $this->IsPublic = !empty($_row["kb_public"]); $this->FulltextSearch = !empty($_row["kb_ft_search"]); $this->ShortcutWord = $_row["shortcut_word"]; $this->IsDiscarded = !empty($_row["discarded"]); $this->AllowBotAccess = !empty($_row["kb_bot"]); $this->OrderKey = $_row["order_key"]; $this->InWidget = !empty($_row["in_widget"]); $this->Related = $_row["related"]; } function Load($_id) { if($result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_RESOURCES . "` WHERE `id` = '" . DBManager::RealEscape($_id) . "'")) { if($row = DBManager::FetchArray($result)) { $this->SetDetails($row); return true; } } return false; } function IsChildOf($_root="") { if(empty($_root) || $this->Id == $_root) return true; $stop = false; $pid = $this->ParentId; while(!$stop){ $stop = true; if($result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_RESOURCES . "` WHERE `id` = '" . DBManager::RealEscape($pid) . "' AND `discarded`=0")){ if($row = DBManager::FetchArray($result)) { if($row["id"] == $_root) { return true; } else { $stop = false; $pid = $row["parentid"]; } } } } return false; } function GetParents() { $currentNode = $this; $list = array(); $counter = 0; while($currentNode->ParentId != "" && $currentNode->ParentId != 1) { $parent = new KnowledgeBaseEntry(); $parent->Load($currentNode->ParentId); if($parent->IsPublic && $parent->Type == 0) $list[$parent->Id] = $parent; $currentNode = $parent; if($counter++ > 10) return false; } return $list; } function LoadChildNodes($_root="",$_publicOnly=false,$_language="",$noFolders=false) { if($result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_RESOURCES . "` WHERE `parentid` = '" . DBManager::RealEscape($this->Id) . "' AND `discarded`=0 ORDER BY `order_key` ASC,`title` ASC")) { while($row = DBManager::FetchArray($result)) { if($noFolders && $row["type"]==0) continue; if(!$_publicOnly || !empty($row["kb_public"])) { $child = new KnowledgeBaseEntry($row); if($child->MatchesLanguage($_language)) $this->ChildNodes[$child->Id] = $child; } } } } function RemoveSubs() { $this->LoadChildNodes(); if(is_array($this->ChildNodes)) foreach($this->ChildNodes as $node) { $node->IsDiscarded = true; $node->Save(); $node->RemoveSubs(); } } function Save($edited=null,$_mirrorRelated=true) { if($edited==null) $edited = time(); if(empty($this->Created)) $this->Created = time(); if($this->Size == 0) $this->Size = strlen($this->Title); $result = DBManager::Execute(true, "SELECT `id`,`value` FROM `" . DB_PREFIX . DATABASE_RESOURCES . "` WHERE `id`='" . DBManager::RealEscape($this->Id) . "'"); if(DBManager::GetRowCount($result) == 0) { if(!$this->IsDiscarded) { Configuration::ApplyTagsToConfig($this->Tags,6); DBManager::Execute(true, "INSERT INTO `" . DB_PREFIX . DATABASE_RESOURCES . "` (`id`,`owner`,`owner_group`,`editor`,`value`,`edited`,`title`,`created`,`type`,`discarded`,`parentid`,`size`,`tags`,`languages`,`kb_public`,`kb_bot`,`kb_ft_search`,`shortcut_word`,`order_key`,`in_widget`,`related`) VALUES ('" . DBManager::RealEscape(Str::Cut($this->Id,256,false)) . "','" . DBManager::RealEscape($this->OwnerId) . "','" . DBManager::RealEscape($this->GroupId) . "','" . DBManager::RealEscape($this->EditorId) . "','" . DBManager::RealEscape($this->Value) . "'," . intval($edited) . ",'" . DBManager::RealEscape(Str::Cut($this->Title,254,false)) . "'," . intval($this->Created) . "," . intval($this->Type) . "," . intval($this->IsDiscarded ? 1 : 0) . ",'" . DBManager::RealEscape($this->ParentId) . "','" . DBManager::RealEscape($this->Size) . "','" . DBManager::RealEscape($this->Tags) . "','" . DBManager::RealEscape($this->Languages) . "'," . intval($this->IsPublic ? 1 : 0) . "," . intval($this->AllowBotAccess ? 1 : 0) . "," . intval($this->FulltextSearch ? 1 : 0) . ",'" . DBManager::RealEscape($this->ShortcutWord) . "'," . intval($this->OrderKey) . "," . intval($this->InWidget) . ",'" . DBManager::RealEscape($this->Related) . "')"); } } else { $row = DBManager::FetchArray($result); Configuration::ApplyTagsToConfig($this->Tags,7); DBManager::Execute(true, $result = "UPDATE `" . DB_PREFIX . DATABASE_RESOURCES . "` SET `owner`='" . DBManager::RealEscape($this->OwnerId) . "',`owner_group`='" . DBManager::RealEscape($this->GroupId) . "',`value`='" . DBManager::RealEscape($this->Value) . "',`in_widget`='" . intval($this->InWidget) . "',`related`='" . DBManager::RealEscape($this->Related) . "',`order_key`='" . intval($this->OrderKey) . "',`editor`='" . DBManager::RealEscape($this->EditorId) . "',`tags`='" . DBManager::RealEscape($this->Tags) . "',`title`='" . DBManager::RealEscape(Str::Cut($this->Title,254,false)) . "',`edited`=" . intval($edited) . ",`discarded`='" . intval($this->IsDiscarded ? 1 : 0) . "',`parentid`='" . DBManager::RealEscape($this->ParentId) . "',`size`='" . DBManager::RealEscape($this->Size) . "',`languages`='" . DBManager::RealEscape($this->Languages) . "',`kb_public`=" . intval($this->IsPublic ? 1 : 0) . ",`kb_bot`=" . intval($this->AllowBotAccess ? 1 : 0) . ",`kb_ft_search`=" . intval($this->FulltextSearch ? 1 : 0) . ",`kb_bot`=" . intval($this->AllowBotAccess ? 1 : 0) . ",`shortcut_word`='" . DBManager::RealEscape($this->ShortcutWord) . "' WHERE id='" . DBManager::RealEscape($this->Id) . "' LIMIT 1"); if(!empty($_disc) && ($this->Type == RESOURCE_TYPE_FILE_INTERNAL || $this->Type == RESOURCE_TYPE_FILE_EXTERNAL) && @file_exists("./uploads/" . $row["value"]) && strpos($row["value"],"..")===false) @unlink("./uploads/" . $row["value"]); } if($_mirrorRelated) $this->MirrorRelated(); } function MirrorRelated() { // add mirrors $newrelated = ""; if(!empty($this->Related)) { $ids = explode(",",$this->Related); foreach($ids as $rid) { $entry = new KnowledgeBaseEntry(); if($entry->Load($rid) && !$entry->IsDiscarded) { $newrelated = Str::Append($newrelated,$rid); if(strpos($entry->Related,$this->Id) === false) { $entry->Related = Str::Append($entry->Related,$this->Id); $entry->Save(time(),false); } } } if($this->Related != trim($newrelated)) { $this->Related = trim($newrelated); $this->Save(time(),false); } } // remove outdated mirrors $result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_RESOURCES . "` WHERE `related` LIKE '%" . DBManager::RealEscape($this->Id) . "%';"); if($result) while($row = DBManager::FetchArray($result)) { if(strpos($this->Related,$row["id"]) === false) { $entry = new KnowledgeBaseEntry($row); $entry->RemoveRelated($this->Id); $entry->Save(time(),false); } } } function RemoveRelated($_idToRemove) { $newrelated = ""; $related = explode(",",$this->Related); foreach($related as $id) if($id != $_idToRemove) $newrelated = Str::Append($newrelated,$id); $this->Related = $newrelated; } function RenameRelated($_id) { $result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_RESOURCES . "` WHERE `related` LIKE '%" . DBManager::RealEscape($this->Id) . "%';"); if($result) while($row = DBManager::FetchArray($result)) { $write = false; $ids = explode(",",$row["related"]); foreach($ids as $index => $rrid) { if($rrid == $this->Id) { $ids[$index] = $_id; $write = true; break; } } if($write) { $ids = implode(",",$ids); DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_RESOURCES . "` SET `edited`=".time().",`related` = '" . DBManager::RealEscape($ids) . "' WHERE `id`='" . DBManager::RealEscape($row["id"]) . "' LIMIT 1;"); } } } function ChangeId($_id) { if(!empty($_id) && KnowledgeBaseEntry::GetById($_id) == null && strlen($_id) <= 256) { $base = new KnowledgeBaseEntry(); $exists = $base->Load($this->Id); DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_STATS_AGGS_KNOWLEDGEBASE . "` SET `res_id`='" . DBManager::RealEscape($_id) . "' WHERE `res_id` = '" . DBManager::RealEscape($this->Id) . "';"); DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_TICKET_ATTACHMENTS . "` SET `res_id`='" . DBManager::RealEscape($_id) . "' WHERE `res_id` = '" . DBManager::RealEscape($this->Id) . "';"); DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_KNOWLEDGEBASE_VIEWS . "` SET `res_id`='" . DBManager::RealEscape($_id) . "' WHERE `res_id` = '" . DBManager::RealEscape($this->Id) . "';"); DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_FEEDBACKS . "` SET `resource_id`='" . DBManager::RealEscape($_id) . "' WHERE `resource_id` = '" . DBManager::RealEscape($this->Id) . "';"); DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_AUTO_REPLIES . "` SET `resource_id`='" . DBManager::RealEscape($_id) . "' WHERE `resource_id` = '" . DBManager::RealEscape($this->Id) . "';"); DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_RESOURCES . "` SET `edited`=" . intval(time()) . ",`parentid`='" . DBManager::RealEscape($_id) . "' WHERE `parentid` = '" . DBManager::RealEscape($this->Id) . "';"); $this->IsDiscarded = true; if($exists) $this->Value = ""; $this->Created = $base->Created; $this->Edited = time(); $this->Save(); $this->IsDiscarded = false; if($exists) $this->Value = $base->Value; $this->RenameRelated($_id); $this->Id = $_id; return true; } return false; } function GetXML() { $this->CalculateRank(); return "<r ba=\"".base64_encode($this->AllowBotAccess ? 1 : 0)."\" s=\"".base64_encode($this->ShortcutWord)."\" f=\"".base64_encode($this->FulltextSearch ? 1 : 0)."\" p=\"".base64_encode($this->IsPublic ? 1 : 0)."\" l=\"".base64_encode($this->Languages)."\" g=\"".base64_encode($this->GroupId)."\" ok=\"".base64_encode($this->OrderKey)."\" rlta=\"".base64_encode($this->Related)."\" iw=\"".base64_encode($this->InWidget ? "1" : "0")."\" rid=\"".base64_encode($this->Id)."\" si=\"".base64_encode($this->Size)."\" di=\"".base64_encode($this->IsDiscarded ? 1 : 0)."\" oid=\"".base64_encode($this->OwnerId)."\" eid=\"".base64_encode($this->EditorId)."\" ty=\"".base64_encode($this->Type)."\" ti=\"".base64_encode($this->Title)."\" t=\"".base64_encode($this->Tags)."\" ed=\"".base64_encode($this->Edited)."\" c=\"".base64_encode($this->Created)."\" pid=\"".base64_encode($this->ParentId)."\" ra=\"".base64_encode($this->Rank)."\">".base64_encode($this->Value)."</r>\r\n"; } function GetHTML($_color,$_inChat=true,$_lineBreak=true) { $openExternal = isset($_GET["no-logo"]) && !$this->InWidget; $target = ($openExternal) ? " target=\"_blank\"" : ""; $html = IOStruct::GetFile(PATH_TEMPLATES . (($this->Type == 2 || $this->Type == 3 || $this->Type == 4) ? "kb_result_link_v2.tpl" : "kb_result_text_v2.tpl")); $html = str_replace("<!--classes-->",($this->Type==0) ? " lz_kb_folder" : "",$html); $html = str_replace("<!--preview-->",($this->Type==0 && $this->Value==$this->Title) ? "" : Str::Cut(strip_tags($this->Value),100,true),$html); $html = str_replace("<!--link-->",KnowledgeBase::GetURL($this->Id,"",$this->Title,array(),$openExternal,true,$openExternal),$html); $html = str_replace("<!--target-->",$target,$html); if($_color != null) $html = str_replace("<!--color-->",$_color,$html); $html = str_replace("<!--title-->",htmlentities($this->Title,ENT_QUOTES,"UTF-8"),$html); if($this->Type == 2) $html = str_replace("<!--link-->",$this->Value,$html); else if($this->Type==3 || $this->Type==4) $html = str_replace("<!--link-->",LIVEZILLA_URL . "getfile.php?id=" . $this->Id,$html); else $html = str_replace("<!--id-->",urlencode($this->Id),$html); if(!$_lineBreak) return $html; else return $html."<br>"; } function GetFullHTML($_color) { $html = "<h3>".$this->Title."</h3>"; foreach($this->ChildNodes as $child) $html .= $child->GetHTML($_color,false); return $html; } function MatchesLanguage($_language) { if(empty($this->Languages)) return true; if(empty($_language)) return false; $ll = array(); if(strpos($this->Languages,",")===false) $ll[] = strtolower($this->Languages); else $ll = explode(",",strtolower($this->Languages)); return in_array(strtolower($_language),$ll); } function CalculateMatchrate($_question,$_language) { $count = 0; $content = ""; $tagsOnly = strpos($_question, "tags: ") === 0; $_question = str_replace("tags: ","",$_question); if(Server::$Configuration->File["gl_kbsb"] <= 1) $content .= str_repeat(",". $this->Title,3); if(Server::$Configuration->File["gl_kbsb"] == 0) $content .= "," . $this->Value; $carray = explode(",",str_replace(array(" ",";",".","?","!"),",",strtoupper($content))); $qarray = explode(",",str_replace(array(" ",";",".","?","!"),",",strtoupper($_question))); $tags = explode(",",strtoupper($this->Tags)); foreach($qarray as $qword) { if(!$tagsOnly) if(strlen($qword) >= Server::$Configuration->File["gl_kbml"]) foreach($carray as $cword) { if(strlen($cword) >= Server::$Configuration->File["gl_kbml"]) { if($cword===$qword) $count+=2; else if(strpos($cword,$qword) !== false || strpos($qword,$cword) !== false) $count++; } } foreach($tags as $tag) { if(!empty($tag) && !empty($qword)) { if($tag===$qword) $count+=10; else if(strlen($qword) >= Server::$Configuration->File["gl_kbml"]) if(strpos($qword,$tag) !== false || strpos($tag,$qword) !== false) $count++; } } } if($count > 0 && !empty($this->Languages) && $this->MatchesLanguage($_language)) $count+=1; $this->Matchrate = $count; } function CalculateRank() { if($this->ParentId=="1") { $this->Rank = 1; return; } $this->Rank = -1; $rank = 0; $parent = $this->ParentId; $count=0; while($count<100) { $perow = KnowledgeBaseEntry::GetById($parent,false); if($perow != null) { $parent = $perow["parentid"]; $rank++; } else break; $count++; } if($rank > 0) $this->Rank = $rank+1; else $this->Rank = 1; } function GetRateResult() { $list = array(0,0); $result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_FEEDBACKS . "` AS `t1` INNER JOIN `" . DB_PREFIX . DATABASE_FEEDBACK_CRITERIA . "` AS `t2` ON `t1`.`id`=`t2`.`fid` WHERE `t1`.`resource_id`='" . DBManager::RealEscape($this->Id) . "';"); if($result) while($row = DBManager::FetchArray($result)) { $list[1]++; if(!empty($row["value"])) $list[0]++; } return $list; } function SaveRateResult($_result) { if(Feedback::IsResourceRating($this->Id)) return; $fb = new Feedback(getId(32)); $fb->ResourceId = $this->Id; $fb->CriteriaList["hf"] = intval($_result); $fb->Save(); } function RegisterView() { DBManager::Execute(true, "INSERT INTO `" . DB_PREFIX . DATABASE_KNOWLEDGEBASE_VIEWS . "` (`id`,`time`,`res_id`) VALUES ('" . DBManager::RealEscape(GetId(32)) . "'," . time() . ",'" . DBManager::RealEscape($this->Id) . "');"); } static function GetById($_id,$_publicOnly=false) { $_publicOnly = ($_publicOnly) ? " AND (`kb_public`=1 OR `kb_bot`=1)" : ""; if($result = DBManager::Execute(false, "SELECT * FROM `" . DB_PREFIX . DATABASE_RESOURCES . "` WHERE `discarded`<>1" . $_publicOnly . " AND `id` = '" . DBManager::RealEscape($_id) . "' LIMIT 1;")) { if($row = DBManager::FetchArray($result)) { if(!empty($_publicOnly)) return new KnowledgeBaseEntry($row); else return $row; } } return null; } static function GetIdByUserId($_userId,$_browserId) { if($result = DBManager::Execute(true, $d="SELECT * FROM `" . DB_PREFIX . DATABASE_RESOURCES . "` WHERE `discarded`=2 AND `parentid` = '" . DBManager::RealEscape($_userId) . "' AND `editor` = '" . DBManager::RealEscape($_browserId) . "' ORDER BY `created` DESC LIMIT 1;")) if($row = DBManager::FetchArray($result)) { return $row["id"]; } return null; } static function RemoveByChatId($_chatId) { if(empty($_chatId)) return; if($result = DBManager::Execute(true, "SELECT `id` FROM `" . DB_PREFIX . DATABASE_RESOURCES . "` WHERE `chat_id` = '" . DBManager::RealEscape($_chatId) . "';")) while($row = DBManager::FetchArray($result)) KnowledgeBaseEntry::RemoveById($row["id"]); return null; } static function RemoveById($_id) { $kbe = new KnowledgeBaseEntry(); $kbe->Load($_id); $kbe->IsDiscarded = true; $kbe->Save(); if($kbe->Type > 2) if(strpos($kbe->Value,"..") === false) @unlink(PATH_UPLOADS . $kbe->Value); } } class FeedbackCriteria { public $Id; public $Type; public $Title; public $PostKey; public $Name; public static $MaxCriteriaReports = 9; function __construct() { if(func_num_args() == 1) { $this->SetDetails(func_get_arg(0)); } else if(func_num_args() == 2) { $this->Id = $_POST["p_cfg_fc_i_" . func_get_arg(0)]; $this->Type = $_POST["p_cfg_fc_ty_" . func_get_arg(0)]; $this->Title = $_POST["p_cfg_fc_t_" . func_get_arg(0)]; $this->Name = $_POST["p_cfg_fc_n_" . func_get_arg(0)]; } } function SetDetails($_row) { $this->Id = $_row["id"]; $this->Type = $_row["type"]; $this->Title = $_row["title"]; $this->Name = $_row["name"]; } function GetPostKey() { return "lz_feedback_value_" . $this->Id; } function GetHeight() { return ($this->Type == 1) ? 118 : 55; } function Save() { DBManager::Execute(true, "INSERT INTO `" . DB_PREFIX . DATABASE_FEEDBACK_CRITERIA_CONFIG . "` (`id` ,`type` ,`name` ,`title`) VALUES ('" . DBManager::RealEscape($this->Id) . "','" . DBManager::RealEscape($this->Type) . "','" . DBManager::RealEscape($this->Name) . "','" . DBManager::RealEscape($this->Title) . "');"); CacheManager::SetDataUpdateTime(DATA_UPDATE_KEY_FEEDBACKS); } function GetHTML() { $html = IOStruct::GetFile(PATH_TEMPLATES . "feedback_type_".$this->Type.".tpl"); $html = str_replace("<!--cid-->",$this->Id,$html); $html = str_replace("<!--title-->",$this->Title,$html); return $html; } function GetXML() { return "<fbc i=\"".base64_encode($this->Id)."\" t=\"".base64_encode($this->Type)."\" n=\"".base64_encode($this->Name)."\">".base64_encode($this->Title)."</fbc>\r\n"; } static function GetStatArray($_titles=false) { Server::InitDataBlock(array("DBCONFIG")); $a = array(); if(!empty(Server::$Configuration->Database["gl_fb"]) && is_array(Server::$Configuration->Database["gl_fb"])) foreach(Server::$Configuration->Database["gl_fb"] as $id => $criteria) { if(count($a) < FeedbackCriteria::$MaxCriteriaReports && $criteria->Type == 0) { $a[$id] = ($_titles) ? str_replace("-->","",str_replace("<!--lang_","",$criteria->Title)) : 0; } } if(!$_titles) while(count($a) < FeedbackCriteria::$MaxCriteriaReports) $a[getId(5)] = 0; return $a; } } class Feedback { public $Id; public $VisitorData; public $ChatId; public $TicketId; public $ResourceId; public $UserId; public $GroupId; public $OperatorId; public $CriteriaList; public $Created; function __construct() { $this->CriteriaList = array(); $this->Id = func_get_arg(0); if(func_num_args() == 2) { $row = func_get_arg(1); $this->Id = $row["id"]; $this->ChatId = $row["chat_id"]; $this->TicketId = $row["ticket_id"]; $this->UserId = $row["user_id"]; $this->OperatorId = $row["operator_id"]; $this->GroupId = $row["group_id"]; if(!empty($row["data_id"])) { $this->VisitorData = new UserData(); $this->VisitorData->Id = $row["data_id"]; $this->VisitorData->Load(); } $this->Created = $row["created"]; } } function AddCriteriaDataFromServerInput() { foreach(Server::$Configuration->Database["gl_fb"] as $criteria) $this->CriteriaList[$criteria->Id] = Communication::GetParameter($criteria->GetPostKey(),"",$nu,null,null,512,false,false); } function LoadCriteriaList() { $this->CriteriaList = array(); if($result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_FEEDBACK_CRITERIA . "` WHERE `fid`='" . DBManager::RealEscape($this->Id) . "';")) while($row = DBManager::FetchArray($result)) $this->CriteriaList[$row["cid"]] = $row["value"]; } function Save() { if(!empty($this->CriteriaList)) { foreach($this->CriteriaList as $cid => $value) DBManager::Execute(true, "INSERT IGNORE INTO `" . DB_PREFIX . DATABASE_FEEDBACK_CRITERIA . "` (`fid` ,`cid` ,`value`) VALUES ('" . DBManager::RealEscape($this->Id) . "','" . DBManager::RealEscape($cid) . "','" . DBManager::RealEscape($value) . "');"); $udid = (!empty($this->VisitorData)) ? $this->VisitorData->Id : ""; DBManager::Execute(true, "INSERT IGNORE INTO `" . DB_PREFIX . DATABASE_FEEDBACKS . "` (`id`,`created`,`chat_id`,`ticket_id`,`resource_id`,`user_id`,`operator_id`,`group_id`,`data_id`,`ip_hash`) VALUES ('" . DBManager::RealEscape($this->Id) . "'," . intval(time()) . ",'" . DBManager::RealEscape($this->ChatId) . "','" . DBManager::RealEscape($this->TicketId) . "','" . DBManager::RealEscape($this->ResourceId) . "','" . DBManager::RealEscape($this->UserId) . "','" . DBManager::RealEscape($this->OperatorId) . "','" . DBManager::RealEscape($this->GroupId) . "','" . DBManager::RealEscape($udid) . "','" . DBManager::RealEscape(md5(Communication::GetIP())) . "');"); CacheManager::SetDataUpdateTime(DATA_UPDATE_KEY_FEEDBACKS); } } function SetTicketId($_tId) { DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_FEEDBACKS . "` SET `ticket_id`='" . intval($_tId) . "' WHERE `id`='" . DBManager::RealEscape($this->Id) . "' LIMIT 1"); } function GetXML() { $xml = "<fb i=\"".base64_encode($this->Id)."\" c=\"".base64_encode($this->ChatId)."\" t=\"".base64_encode($this->TicketId)."\" o=\"".base64_encode($this->OperatorId)."\" g=\"".base64_encode($this->GroupId)."\" u=\"".base64_encode($this->UserId)."\" cr=\"".base64_encode($this->Created)."\">\r\n"; foreach($this->CriteriaList as $cid => $value) $xml .= "<v i=\"".base64_encode($cid)."\">".base64_encode($value)."</v>\r\n"; if(!empty($this->VisitorData)) $xml .= $this->VisitorData->GetXML(); return $xml . "</fb>"; } static function IsFlood() { $result = DBManager::Execute(true, "SELECT COUNT(`id`) AS `fb_count` FROM `" . DB_PREFIX . DATABASE_FEEDBACKS . "` WHERE `resource_id`='' AND `created`>" . DBManager::RealEscape(time() - 86400) . " AND `ip_hash`='" . DBManager::RealEscape(md5(Communication::GetIP())) . "';"); if($result) { $row = DBManager::FetchArray($result); return ($row["fb_count"] >= MAX_FEEDBACKS_PER_DAY); } else return true; } static function GetRatingAVG($_chatId,$ratav = "-") { Server::InitDataBlock(array("DBCONFIG")); $fb = Feedback::GetByChatId($_chatId); if(!empty($fb)) { $fb->LoadCriteriaList(); $scount = 0; $svalue = 0; $scomment = ""; foreach(Server::$Configuration->Database["gl_fb"] as $criteria) { if(!isset($fb->CriteriaList[$criteria->Id])) continue; if($criteria->Type == 0) { $scount++; $svalue += $fb->CriteriaList[$criteria->Id]; } else if($criteria->Type == 1) { $scomment .= $fb->CriteriaList[$criteria->Id]; } $ratav = round((($svalue)/$scount),1) . "/5 (" . $scomment . ")"; } } return $ratav; } static function GetByChatId($_chatId) { $result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_FEEDBACKS . "` WHERE `chat_id`='" . DBManager::RealEscape($_chatId) . "' LIMIT 1;"); if($result) if($row = DBManager::FetchArray($result)) return new Feedback($row["id"],$row); return null; } static function GetByVisitorId($_visitorId) { $result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_FEEDBACKS . "` WHERE `user_id`='" . DBManager::RealEscape($_visitorId) . "' LIMIT 1;"); if($result) if($row = DBManager::FetchArray($result)) return new Feedback($row["id"],$row); return null; } static function GetLink($_getParam) { return LIVEZILLA_URL . "feedback.php?" . $_getParam; } static function IsResourceRating($_resourceId) { if($result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_FEEDBACKS . "` WHERE `resource_id`='" . DBManager::RealEscape($_resourceId) . "' AND `ip_hash`='" . DBManager::RealEscape(md5(Communication::GetIP())) . "';")) if($row = DBManager::FetchArray($result)) return true; return false; } static function Remove($_id) { DBManager::Execute(true, "DELETE FROM `" . DB_PREFIX . DATABASE_FEEDBACKS . "` WHERE `id`='" . DBManager::RealEscape($_id) . "' LIMIT 1;"); } } class UserData extends BaseObject { public $Text; public $LoadedId = ""; public $SavedId = ""; function __construct($_fullname="",$_email="",$_company="",$_phone="",$_customs=null,$_text="") { $this->Fullname = $_fullname; $this->Email = $_email; $this->Company = $_company; $this->Phone = $_phone; $this->Customs = $_customs; $this->Text = $_text; } function Hash() { $base = $this->Fullname.$this->Email.$this->Company.$this->Phone.serialize($this->Customs).$this->Text; return md5($base); } function IsEmpty() { $x = empty($this->Fullname)&&empty($this->Email)&&empty($this->Company)&&empty($this->Phone)&&empty($this->Text); if(!$x) return false; if(is_array(empty($this->Customs))) foreach($this->Customs as $c) if(!empty($c)) return false; return true; } function Save() { if($this->Hash() != $this->SavedId) { $this->SavedId = $this->Hash(); DBManager::Execute(true, "INSERT IGNORE INTO `" . DB_PREFIX . DATABASE_USER_DATA . "` (`id`,`create`,`h_fullname`,`h_email`,`h_company`,`h_phone`,`h_customs`,`h_text`) VALUES ('" . DBManager::RealEscape($this->Hash()) . "'," . intval(time()) . ",'" . DBManager::RealEscape($this->Fullname) . "','" . DBManager::RealEscape($this->Email) . "','" . DBManager::RealEscape($this->Company) . "','" . DBManager::RealEscape($this->Phone) . "','" . DBManager::RealEscape(serialize($this->Customs)) . "','" . DBManager::RealEscape($this->Text) . "');"); } return $this->Hash(); } function SetDetails($row,$_indexField="id") { $applyCkSettings = defined("CALLER_TYPE") && CALLER_TYPE == CALLER_TYPE_TRACK && VisitorMonitoring::$Visitor->FirstCall; Server::InitDataBlock(array("INPUTS")); $this->LoadedId = $row[$_indexField]; $this->Id = $row[$_indexField]; if(!($applyCkSettings && !Server::$Inputs[111]->Cookie)) $this->Fullname = $row["h_fullname"]; if(!($applyCkSettings && !Server::$Inputs[112]->Cookie)) $this->Email = $row["h_email"]; if(!($applyCkSettings && !Server::$Inputs[113]->Cookie)) $this->Company = $row["h_company"]; if(!($applyCkSettings && !Server::$Inputs[116]->Cookie)) $this->Phone = $row["h_phone"]; $this->Customs = @unserialize($row["h_customs"]); $this->Text = $row["h_text"]; if($applyCkSettings) { if(is_array($this->Customs)) { foreach(Server::$Inputs as $index => $input) { if($input->Active && empty($input->Cookie)) { if(isset($this->Customs[$index])) unset($this->Customs[$index]); } } } } } function SaveToCookie() { if(!$this->IsEmpty() && Cookie::Get("user_did") != ($this->Hash())) Cookie::Set("user_did",($this->Hash())); } function LoadFromCookie() { if(!Is::Null(Cookie::Get("user_did"))) { $this->Id = IOStruct::FilterParameter(Cookie::Get("user_did"),"",FILTER_SANITIZE_STRING,null,32); if(strlen($this->Id)==32) $this->Load(); else $this->Id = ""; } /* Server::InitDataBlock(array("INPUTS")); if(is_array($this->Customs)) { foreach(Server::$Inputs as $index => $input) { if($input->Active && empty($input->Cookie)) { $this->Customs[$index] = "0"; } } } */ } function LoadFromPassThru($_overwriteExisting=false) { Server::InitDataBlock(array("INPUTS")); $wc = false; if(!$_overwriteExisting && isset($_GET["pto"])) $_overwriteExisting = true; $di = Server::$Inputs[111]->GetServerInput(); if(($_overwriteExisting||empty($this->Fullname)) && !empty($di)) { $this->Fullname = $di; $wc = true; } $di = Server::$Inputs[112]->GetServerInput(); if(($_overwriteExisting||empty($this->Email)) && !empty($di)) { $this->Email = $di; $wc = true; } $di = Server::$Inputs[113]->GetServerInput(); if(($_overwriteExisting||empty($this->Company)) && !empty($di)) { $this->Company = $di; $wc = true; } $di = Server::$Inputs[114]->GetServerInput(); if(($_overwriteExisting||empty($this->Text)) && !empty($di)) { $this->Text = $di; $wc = true; } $di = Server::$Inputs[116]->GetServerInput(); if(($_overwriteExisting||empty($this->Phone)) && !empty($di)) { $this->Phone = $di; $wc = true; } foreach(Server::$Inputs as $index => $input) if($input->Custom && $input->Active) { $di = $input->GetServerInput(); if(($_overwriteExisting||empty($this->Customs[$index])) && (!empty($di) || $di === "0")) { $this->Customs[$index] = $di; $wc = true; } } return $wc; } function LoadFromBotAPI($_apiResponse) { Server::InitDataBlock(array("INPUTS")); $wc = false; $di = Server::$Inputs[111]->GetAPIInput($_apiResponse); if(!empty($di)) { $this->Fullname = $di; $wc = true; } $di = Server::$Inputs[112]->GetAPIInput($_apiResponse); if(!empty($di)) { $this->Email = $di; $wc = true; } $di = Server::$Inputs[113]->GetAPIInput($_apiResponse); if(!empty($di)) { $this->Company = $di; $wc = true; } $di = Server::$Inputs[114]->GetAPIInput($_apiResponse); if(!empty($di)) { $this->Text = $di; $wc = true; } $di = Server::$Inputs[116]->GetAPIInput($_apiResponse); if(empty($this->Phone) && !empty($di)) { $this->Phone = $di; $wc = true; } foreach(Server::$Inputs as $index => $input) if($input->Custom && $input->Active) { $di = $input->GetAPIInput($_apiResponse); if(empty($this->Customs[$index]) && !empty($di)) { $this->Customs[$index] = $di; $wc = true; } } return $wc; } function LoadFromLogin($_group) { if(Server::$Inputs[111]->IsServerInput()) $this->Fullname = Str::Cut($_group->GetServerInput(Server::$Inputs[111]),255); if(Server::$Inputs[112]->IsServerInput()) $this->Email = Str::Cut($_group->GetServerInput(Server::$Inputs[112]),255); if(Server::$Inputs[113]->IsServerInput()) $this->Company = Str::Cut($_group->GetServerInput(Server::$Inputs[113]),255); if(Server::$Inputs[114]->IsServerInput()) $this->Text = Str::Cut($_group->GetServerInput(Server::$Inputs[114]),MAX_INPUT_LENGTH); if(Server::$Inputs[116]->IsServerInput()) $this->Phone = Str::Cut($_group->GetServerInput(Server::$Inputs[116]),255); foreach(Server::$Inputs as $index => $input) { if($input->Active && $input->Custom) { if($input->IsServerInput()) { $this->Customs[$index] = $_group->GetServerInput($input); } } } } function LoadFromEvent($_fieldId,$_serverResponse) { if($_fieldId == 111) $this->Fullname = Str::Cut($_serverResponse,255); if($_fieldId == 112) $this->Email = Str::Cut($_serverResponse,255); if($_fieldId == 113) $this->Company = Str::Cut($_serverResponse,255); if($_fieldId == 114) $this->Text = Str::Cut($_serverResponse,MAX_INPUT_LENGTH); if($_fieldId == 116) $this->Phone = Str::Cut($_serverResponse,255); foreach(Server::$Inputs as $index => $input) if($input->Active && $input->Custom) if($index == $_fieldId) $this->Customs[$index] = $_serverResponse; } function IsDifference($_comparer,$_comparerCanBeNull=false) { $refclass = new ReflectionClass($this); foreach ($refclass->getProperties() as $property) { if(($_comparerCanBeNull || !Is::Null($property->getValue($_comparer))) && $property->getValue($this) != $property->getValue($_comparer)) return true; } return false; } function FormatChatArchiveArray() { $customs = array(); if(is_array($this->Customs)) foreach($this->Customs as $cind => $value) if(Server::$Inputs[$cind]->Active && Server::$Inputs[$cind]->Custom) $customs[Server::$Inputs[$cind]->Name] = $value; return $customs; } function Load() { if(!empty($this->Id) && $this->Id == $this->LoadedId) return false; if($result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_USER_DATA . "` WHERE `id`='" . DBManager::RealEscape($this->Id) . "';")) while($row = DBManager::FetchArray($result)) { $this->SetDetails($row); $this->LoadFromPassThru(); return true; } return false; } function GetXML() { $xml = "<d f111=\"".base64_encode($this->GetInputData(111,true))."\" f112=\"".base64_encode($this->GetInputData(112,true))."\" f113=\"".base64_encode($this->GetInputData(113,true))."\" f116=\"".base64_encode($this->GetInputData(116,true))."\" f114=\"".base64_encode($this->Text)."\""; if(is_array($this->Customs)) foreach($this->Customs as $i => $c) $xml .= " f".$i."=\"" . base64_encode($this->GetInputData($i,true)) . "\""; return $xml . "></d>"; } static function FromTicketMessage($_ticketMessage) { $d = new UserData($_ticketMessage->Fullname,$_ticketMessage->Email,$_ticketMessage->Company,$_ticketMessage->Phone,$_ticketMessage->Customs,""); $d->Id = $d->Hash(); return $d; } static function FromOperatorInput() { $d = new UserData($_POST['p_vi_111'],$_POST['p_vi_112'],$_POST['p_vi_113'],$_POST['p_vi_116']); $d->Id = $d->Hash(); return $d; } static function FromSystemId($_systemId) { $d = new UserData(); $parts = explode("~",$_systemId); $visitorid = $parts[0]; $result = DBManager::Execute(true, $dx = "SELECT * FROM `" . DB_PREFIX . DATABASE_VISITORS . "` AS `tv` INNER JOIN `" . DB_PREFIX . DATABASE_USER_DATA . "` AS `td` ON `tv`.`data_id`=`td`.`id` WHERE `tv`.`id`='" . DBManager::RealEscape($visitorid) . "' LIMIT 1;"); if($result) if($row = DBManager::FetchArray($result)) $d->SetDetails($row); return $d; } } class Cookie { static function GetCookiePrefix() { $prefix = "lz"; if(isset($_GET["cpr"]) && strlen($_GET["cpr"]) == 5) $prefix .= "_" . $_GET["cpr"]; return $prefix . "_"; } static function Set($_key,$_value,$_onlyWhenEmpty=false) { $mustSet = ($_key == "no_cookie" || $_key == "no_tracking"); if(!$mustSet && Configuration::DoNotTrack()) return; if(!$mustSet && !Is::Null(Cookie::Get("no_cookie")) || !Is::Null(Cookie::Get("no_tracking"))) return; if(!$mustSet && !empty(Server::$Configuration->File["gl_cooi"]) && Is::Null(Cookie::Get("userid")) && !isset($_GET["oica"])) return; if($mustSet || (!empty(Server::$Configuration->File["gl_colt"]) && !empty($_value))) { $current = Cookie::Get($_key); if($_onlyWhenEmpty && $current != null) return; if($current == $_value) return; $lifetime = ((empty(Server::$Configuration->File["gl_colt"])) ? 0 : (time()+(Server::$Configuration->File["gl_colt"]*86400))); setcookie(self::GetCookiePrefix() . $_key,($_COOKIE[self::GetCookiePrefix() . $_key] = base64_encode($_value)),$lifetime,null,null,null,true); } } static function Get($_key,$_filter=false,$_maxlen=0) { if(($_key != "no_cookie" && $_key != "no_tracking") && !Is::Null(Cookie::Get("no_cookie"))) return null; if(empty(Server::$Configuration->File["gl_colt"])) return null; if(empty($_COOKIE[self::GetCookiePrefix() . $_key])) return null; if($_filter) return IOStruct::FilterParameter(base64_decode($_COOKIE[self::GetCookiePrefix() . $_key]),"",FILTER_SANITIZE_STRING,null,$_maxlen); $cd = base64_decode($_COOKIE[self::GetCookiePrefix() . $_key]); return $cd; } static function Remove($_key) { setcookie(self::GetCookiePrefix() . $_key, "", time() - 3600); } static function RemoveAll() { $ckeys = array("lz_geo_city","lz_geo_ctryiso","lz_geo_data","lz_geo_isp","lz_geo_lat","lz_geo_long","lz_geo_region","lz_geo_tz","lz_last_visit","lz_userid","lz_visits"); foreach($ckeys as $key) setcookie($key, "", time()-3600); } } class LocalizationManager { public static $TranslationStrings; public static $Direction; static function GetLocalizationFileString($_language, $_mobile = false, $_writeModified = false) { if(strpos($_language,"..") === false && strlen($_language) <= 5) { $inner = (!$_mobile) ? "server" : "client"; $file = PATH_LOCALIZATION . strtolower($_language) .".". $inner . ($_writeModified ? ".my" : "") . ".php"; return $file; } return ""; } static function Detect() { if(defined("CALLER_TYPE") && CALLER_TYPE == CALLER_TYPE_INTERNAL && defined("CALLER_SYSTEM_ID")) { $langs = strtolower(Server::$Operators[CALLER_SYSTEM_ID]->Languages); if(strpos($langs,",") !== false) $langs = explode(",",$langs)[0]; return $langs; } else { $_isoTwoletterCode = LocalizationManager::GetBrowserLocalization(); return strtolower($_isoTwoletterCode[0]); } } static function AutoLoad($_isoTwoletterCode="",$_require=false) { if(DBManager::$Connected) { Server::InitDataBlock(array("LANGUAGES")); if(!$_require && !empty(Visitor::$BrowserLanguage)) return; $isoToRequire = "en"; if(empty($_isoTwoletterCode)) { $_isoTwoletterCode = LocalizationManager::Detect(); } /* if(!empty(Server::$Configuration->File["gl_on_def_lang"]) && file_exists($tfile=LocalizationManager::GetLocalizationFileString(Server::$Configuration->File["gl_default_language"])) && @filesize($tfile)>0) { Visitor::$BrowserLanguage = Server::$Configuration->File["gl_default_language"]; $isoToRequire = Server::$Configuration->File["gl_default_language"]; } else*/if(empty($_isoTwoletterCode) || (!empty($_isoTwoletterCode) && strpos($_isoTwoletterCode,"..") === false)) { // det list if(!empty($_isoTwoletterCode) && strlen($_isoTwoletterCode) >= 5 && substr($_isoTwoletterCode,2,1) == "-" && file_exists($tfile=LocalizationManager::GetLocalizationFileString(substr($_isoTwoletterCode, 0, 5),false,true)) && @filesize($tfile)>0) $isoToRequire = $s_browser_language = strtolower(substr($_isoTwoletterCode,0,5)); else if(!empty($_isoTwoletterCode) && strlen($_isoTwoletterCode) >= 5 && substr($_isoTwoletterCode,2,1) == "-" && file_exists($tfile=LocalizationManager::GetLocalizationFileString(substr($_isoTwoletterCode, 0, 5),false,false)) && @filesize($tfile)>0) $isoToRequire = $s_browser_language = strtolower(substr($_isoTwoletterCode,0,5)); // det single else if(!empty($_isoTwoletterCode) && strlen($_isoTwoletterCode) > 1 && file_exists($tfile=LocalizationManager::GetLocalizationFileString(substr($_isoTwoletterCode, 0, 2),false,true)) && @filesize($tfile)>0) $isoToRequire = $s_browser_language = strtolower(substr($_isoTwoletterCode,0,2)); else if(!empty($_isoTwoletterCode) && strlen($_isoTwoletterCode) > 1 && file_exists($tfile=LocalizationManager::GetLocalizationFileString(substr($_isoTwoletterCode, 0, 2),false,false)) && @filesize($tfile)>0) $isoToRequire = $s_browser_language = strtolower(substr($_isoTwoletterCode,0,2)); // def else if(file_exists($tfile=LocalizationManager::GetLocalizationFileString(Server::$Configuration->File["gl_default_language"],false,true)) && @filesize($tfile)>0) $isoToRequire = $s_browser_language = Server::$Configuration->File["gl_default_language"]; else if(file_exists($tfile=LocalizationManager::GetLocalizationFileString(Server::$Configuration->File["gl_default_language"],false,false)) && @filesize($tfile)>0) $isoToRequire = $s_browser_language = Server::$Configuration->File["gl_default_language"]; if(isset($s_browser_language)) Visitor::$BrowserLanguage = $s_browser_language; } else if(file_exists(LocalizationManager::GetLocalizationFileString(Server::$Configuration->File["gl_default_language"]))) $isoToRequire = Server::$Configuration->File["gl_default_language"]; if(empty(Visitor::$BrowserLanguage) && file_exists(LocalizationManager::GetLocalizationFileString("en"))) Visitor::$BrowserLanguage = "en"; LocalizationManager::$Direction = ((Server::$Languages[strtoupper(Visitor::$BrowserLanguage)][2]) ? "rtl":"ltr"); if($_require) DataInput::Build(); } else { // installation wizard $bl = substr(@$_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2); if(strtolower($bl)=="de") Visitor::$BrowserLanguage = $isoToRequire = "de"; else Visitor::$BrowserLanguage = $isoToRequire = "en"; } if(!empty($isoToRequire)) { if($isoToRequire != "en") { LocalizationManager::LoadFromFile("en"); } LocalizationManager::LoadFromFile($isoToRequire); } } static function LoadFromFile($_isoTwoletterCode) { global $LZLANG; IOStruct::RequireTranslation(LocalizationManager::GetLocalizationFileString($_isoTwoletterCode)); LocalizationManager::$TranslationStrings = $LZLANG; } static function GetBrowserLocalization($country = "",$base="en") { Server::InitDataBlock(array("LANGUAGES","COUNTRIES")); //if(!empty(Server::$Configuration->File["gl_on_def_lang"])) // $base = Server::$Configuration->File["gl_default_language"]; //else if(isset(Server::$Configuration->File["gl_dsbl"]) && !Server::$Configuration->File["gl_dsbl"]) // $base = Server::$Configuration->File["gl_default_language"]; /*else*/if(!empty($_SERVER["HTTP_ACCEPT_LANGUAGE"])) $base = @$_SERVER["HTTP_ACCEPT_LANGUAGE"]; $ptlang = LocalizationManager::ReadParams(); $language = str_replace(array(",","_"," ",")","("),array(";","-","","",""),((!empty($ptlang)) ? strtoupper(($ptlang)) : ((!empty($base)) ? strtoupper($base) : ""))); if(strlen($language) > 5 || strpos($language,";") !== false) { $parts = explode(";",$language); if(count($parts) > 0) $language = $parts[0]; else $language = substr($language,0,5); } if(strlen($language) >= 2) { $parts = explode("-",$language); if(!isset(Server::$Languages[$language])) { $language = $parts[0]; if(!isset(Server::$Languages[$language])) $language = ""; } if(count($parts)>1 && isset(Server::$Countries[$parts[1]])) $country = $parts[1]; } else if(strlen($language) < 2) $language = ""; return array($language,$country); } static function ImplodeLanguages($_lang) { if(strlen($_lang) == 0) return ""; $array_lang = explode(",",$_lang); foreach($array_lang as $key => $lang) if($key == 0) { $_lang = strtoupper(substr(trim($lang),0,2)); break; } return (strlen($_lang) > 0) ? $_lang : ""; } static function Replace($_html) { $_html = str_replace("%iso_lang%",LocalizationManager::Detect(),$_html); return $_html; } static function ReadParams() { if(!empty($_GET["ptl"])) return Communication::GetParameter("ptl","",$c,FILTER_SANITIZE_SPECIAL_CHARS,null,5,false,false); // deprecated, compatibility if(!empty($_GET["el"])) return Communication::GetParameter("el","",$c,FILTER_SANITIZE_SPECIAL_CHARS,null,5); return ""; } static function ReaderHeaderParam() { if(!empty($_GET["pth"])) return Communication::GetParameter("pth","",$c,FILTER_SANITIZE_URL,null,1024,false,false); // deprecated, compatibility if(!empty($_GET["eh"])) return Communication::GetParameter("eh","",$c,FILTER_SANITIZE_SPECIAL_CHARS); // fallback always from config return Server::$Configuration->File["gl_cali"]; } static function ReaderAreaCodeParam() { if(!empty($_GET["ptw"])) return Communication::GetParameter("ptw","",$c,null,null,255,false,false); // deprecated, compatibility if(!empty($_GET["code"])) return Communication::GetParameter("code","",$c,FILTER_SANITIZE_SPECIAL_CHARS,null,255); return ""; } } class GeoTracking { static function SpanRemove($_all) { if($_all || (GeoTracking::SpanGet() < time())) GeoTracking::SpanSet(0); } static function SpanExists() { return !Is::Null(GeoTracking::SpanGet()); } static function SpanGet() { if(!DBManager::$Connected) return time(); if(isset(Server::$Configuration->File["gl_db_gtspan"])) return Server::$Configuration->File["gl_db_gtspan"]; else return 0; } static function SpanSet($_value) { if(DBManager::$Connected && @Server::$Configuration->File["gl_db_gtspan"]!=$_value) DBManager::Execute(true, "REPLACE INTO `" . DB_PREFIX . DATABASE_CONFIG . "` (`key`, `value`) VALUES ('gl_db_gtspan','" . intval(Server::$Configuration->File["gl_db_gtspan"] = $_value) . "');"); } static function SpanCreate($_sspan) { if($_sspan <= CONNECTION_ERROR_SPAN) GeoTracking::SpanSet((time()+$_sspan)); else GeoTracking::SpanSet((time()+600)); } static function Replace($_toReplace, $jsa = "") { if(isset(Server::$Configuration->File["gl_use_ngl"]) && !empty(Server::$Configuration->File["gl_use_ngl"])) { $url = LIVEZILLA_URL . "geo.php"; $_toReplace = str_replace("<!--geo_url-->",base64_encode($url."?a=1"),$_toReplace); } else $_toReplace = str_replace("<!--geo_url-->","",$_toReplace); $_toReplace = str_replace("<!--calcoak-->",$jsa,$_toReplace); $_toReplace = str_replace("<!--mip-->",Communication::GetIP(false,true),$_toReplace); return $_toReplace; } } class Is { static function Defined($_definition) { if(defined($_definition)) return constant($_definition); else return false; } static function Int($_int) { return (preg_match( '/^\d*$/' , $_int) == 1); } static function Null($_var) { return empty($_var); } static function WildcardMatch($_template,$_comparer,$_ignoreStartAndEnd=false) { if($_template=="*") return true; if(!$_ignoreStartAndEnd) { $spacer = md5(rand()); $_template = str_replace("?",$spacer,strtolower($_template)); $_comparer = str_replace("?",$spacer,strtolower($_comparer)); } else $spacer = ""; $_template = str_replace("*","(.*)",$_template); return (preg_match("(".$spacer.$_template.$spacer.")",$spacer.$_comparer.$spacer)>0); } static function ImageFilename($_filename) { $_filename = strtolower($_filename); return Str::EndsWith($_filename,".gif") || Str::EndsWith($_filename,".jpeg") || Str::EndsWith($_filename,".jpg") || Str::EndsWith($_filename,".bmp") || Str::EndsWith($_filename,".png"); } } class To { static function BoolString($_value,$_toString=true) { if($_toString) return ($_value) ? "true" : "false"; else return ($_value) ? "1" : "0"; } static function XMLTag($_name,$_content,$_attrArray) { $xml = "<".$_name; foreach($_attrArray as $attr => $val) { $xml .= " " . $attr . "=\"" . base64_encode($val)."\""; } return $xml . ">" . $_content . "</".$_name.">"; } static function XMLTags($_list) { $xml =""; foreach($_list as $obj) $xml .= $obj->GetXML(); return $xml; } static function MIMEType($_filename) { $idx = explode(".", strtolower($_filename)); $count_explode = count($idx); $idx = strtolower($idx[$count_explode-1]); $mimet = array( 'txt' => 'text/plain', 'htm' => 'text/html', 'html' => 'text/html', 'php' => 'text/html', 'css' => 'text/css', 'js' => 'application/javascript', 'json' => 'application/json', 'xml' => 'application/xml', 'swf' => 'application/x-shockwave-flash', 'flv' => 'video/x-flv', 'png' => 'image/png', 'jpe' => 'image/jpeg', 'jpeg' => 'image/jpeg', 'jpg' => 'image/jpeg', 'gif' => 'image/gif', 'bmp' => 'image/bmp', 'ico' => 'image/vnd.microsoft.icon', 'tiff' => 'image/tiff', 'tif' => 'image/tiff', 'svg' => 'image/svg+xml', 'svgz' => 'image/svg+xml', 'zip' => 'application/zip', 'rar' => 'application/x-rar-compressed', 'exe' => 'application/x-msdownload', 'msi' => 'application/x-msdownload', 'cab' => 'application/vnd.ms-cab-compressed', 'mp3' => 'audio/mpeg', 'qt' => 'video/quicktime', 'mov' => 'video/quicktime', 'pdf' => 'application/pdf', 'psd' => 'image/vnd.adobe.photoshop', 'ai' => 'application/postscript', 'eps' => 'application/postscript', 'ps' => 'application/postscript', 'doc' => 'application/msword', 'rtf' => 'application/rtf', 'xls' => 'application/vnd.ms-excel', 'ppt' => 'application/vnd.ms-powerpoint', 'docx' => 'application/msword', 'xlsx' => 'application/vnd.ms-excel', 'pptx' => 'application/vnd.ms-powerpoint', 'odt' => 'application/vnd.oasis.opendocument.text', 'ods' => 'application/vnd.oasis.opendocument.spreadsheet', ); if(isset($mimet[$idx])) return $mimet[$idx]; else return 'application/octet-stream'; } } class Str { static function Cut($_value ,$_maxlength, $_addDots=false) { if(function_exists("mb_strlen")) { if(mb_strlen($_value,'utf-8')>$_maxlength) { if($_addDots) return mb_substr($_value,0,$_maxlength-3,'utf-8')."..."; else return mb_substr($_value,0,$_maxlength,'utf-8'); } } else { if(strlen($_value)>$_maxlength) { if($_addDots) return substr($_value,0,$_maxlength-3)."..."; else return substr($_value,0,$_maxlength); } } return $_value; } static function EndsWith($haystack, $needle) { $length = strlen($needle); if ($length == 0) { return true; } return (substr($haystack, -$length) === $needle); } static function ToEnglishStyle($_str,$_encoding="UTF-8") { if(function_exists("mb_convert_case")) return mb_convert_case($_str, MB_CASE_TITLE, $_encoding); else return utf8_encode(ucwords(strtolower(utf8_decode($_str)))); } static function ToLower($_str,$_encoding="UTF-8") { if(function_exists("mb_strtolower")) return mb_strtolower($_str, $_encoding); else return utf8_encode(strtolower(utf8_decode($_str))); } static function EscapePushMessage($_post) { if(strpos($_post,'[__[') !== false && strpos($_post,']__]') !== false) { $parts = explode('[__[',str_replace(']__]','',$_post)); $_post = $parts[0]; if(strpos($parts[1],'invite_info:')===0) { return null; } else if(strpos($parts[1],'auto_forward:')===0) { return null; } } return $_post; } static function Append($_string,$_append,$_separator=",") { if(!empty($_string)) $_string .= $_separator . $_append; else $_string = $_append; return $_string; } static function DataURLToBinary($_str) { $_str = substr($_str,strpos($_str,",")+1); $_str = str_replace(' ','+',$_str); $_str = base64_decode($_str); return $_str; } } class Num { static function Divide($_numerator,$_denominator,$_round=false,$_floor=false) { if(empty($_denominator) || $_denominator == 0) return 0; else if($_round) return round($_numerator/$_denominator,$_round); else if($_floor) return floor($_numerator/$_denominator); else return $_numerator/$_denominator; } } ?>
/home2/wtmwscom/public_html/livezila/../livezila/_lib/objects.global.inc.php